@cfxdevkit/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/LICENSE +72 -0
- package/README.md +257 -0
- package/dist/clients/index.cjs +2053 -0
- package/dist/clients/index.cjs.map +1 -0
- package/dist/clients/index.d.cts +7 -0
- package/dist/clients/index.d.ts +7 -0
- package/dist/clients/index.js +2043 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/config/index.cjs +423 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +99 -0
- package/dist/config/index.d.ts +99 -0
- package/dist/config/index.js +380 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config-BMtaWM0X.d.cts +165 -0
- package/dist/config-BMtaWM0X.d.ts +165 -0
- package/dist/core-C5qe16RS.d.ts +352 -0
- package/dist/core-RZA4aKwj.d.cts +352 -0
- package/dist/index-BhCpy6Fz.d.cts +165 -0
- package/dist/index-Qz84U9Oq.d.ts +165 -0
- package/dist/index.cjs +3773 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +945 -0
- package/dist/index.d.ts +945 -0
- package/dist/index.js +3730 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.cjs +44 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +5 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.cjs +83 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +11 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.js +56 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/wallet/index.cjs +852 -0
- package/dist/wallet/index.cjs.map +1 -0
- package/dist/wallet/index.d.cts +726 -0
- package/dist/wallet/index.d.ts +726 -0
- package/dist/wallet/index.js +815 -0
- package/dist/wallet/index.js.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/clients/core.ts","../../src/config/chains.ts","../../src/types/config.ts","../../src/clients/evm.ts","../../src/clients/manager.ts"],"sourcesContent":["/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Core Space Client Implementation\n// Based on proven patterns from DevKit CLI, adapted for unified interface\n\nimport {\n type Address,\n type Chain,\n type TestClient as CiveTestClient,\n createPublicClient,\n createTestClient,\n createWalletClient,\n formatCFX,\n http,\n type PublicClient,\n parseCFX,\n type WalletClient,\n} from 'cive';\nimport { type Account, privateKeyToAccount } from 'cive/accounts';\nimport {\n defineChain,\n encodeFunctionData,\n formatUnits,\n hexAddressToBase32,\n isAddress as isCoreAddress,\n} from 'cive/utils';\nimport { isAddress as isEspaceAddress } from 'viem';\n\n// Chain definitions\nconst conflux = defineChain({\n id: 1029,\n name: 'Conflux Core',\n nativeCurrency: { name: 'Conflux', symbol: 'CFX', decimals: 18 },\n rpcUrls: { default: { http: ['https://main.confluxrpc.com'] } },\n});\n\nconst confluxTestnet = defineChain({\n id: 1,\n name: 'Conflux Core Testnet',\n nativeCurrency: { name: 'Conflux', symbol: 'CFX', decimals: 18 },\n rpcUrls: { default: { http: ['https://test.confluxrpc.com'] } },\n});\n\nimport { getChainConfig, type SupportedChainId } from '../config/chains.js';\nimport type {\n BaseTransaction,\n BlockEvent,\n ChainClient,\n ClientConfig,\n CoreClientInstance,\n EventCallback,\n TestClient,\n TestConfig,\n TransactionEvent,\n TransactionReceipt,\n WalletClient as UnifiedWalletClient,\n UnwatchFunction,\n WalletConfig,\n} from '../types/index.js';\nimport { NodeError } from '../types/index.js';\n\n/**\n * Core Space Client Implementation\n * Wraps cive client with unified interface\n */\nexport class CoreClient implements ChainClient {\n public readonly chainType = 'core' as const;\n public readonly chainId: number;\n public readonly address: Address;\n\n private readonly publicClient: PublicClient;\n private readonly chain: Chain;\n\n constructor(config: ClientConfig) {\n this.chainId = config.chainId;\n\n // Create chain definition\n this.chain = defineChain({\n id: this.chainId,\n name: `ConfluxCore-${this.chainId}`,\n nativeCurrency: {\n decimals: 18,\n name: 'Conflux',\n symbol: 'CFX',\n },\n rpcUrls: {\n default: {\n http: [config.rpcUrl],\n webSocket: config.wsUrl ? [config.wsUrl] : undefined,\n },\n },\n });\n\n // Create public client\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n\n // Address will be set by wallet client\n this.address = '' as Address;\n }\n\n async getBlockNumber(): Promise<bigint> {\n try {\n const epochNumber = await this.publicClient.getEpochNumber();\n return BigInt(epochNumber.toString());\n } catch (error) {\n throw new NodeError(\n `Failed to get block number: ${error instanceof Error ? error.message : String(error)}`,\n 'BLOCK_NUMBER_ERROR',\n 'core',\n { originalError: error }\n );\n }\n }\n\n async getBalance(address: Address): Promise<string> {\n if (!isCoreAddress(address)) {\n throw new NodeError(\n 'Invalid Core address format',\n 'INVALID_ADDRESS',\n 'core'\n );\n }\n\n try {\n const balance = await this.publicClient.getBalance({ address });\n return formatCFX(balance);\n } catch (error) {\n throw new NodeError(\n `Failed to get balance: ${error instanceof Error ? error.message : String(error)}`,\n 'BALANCE_ERROR',\n 'core',\n { address, originalError: error }\n );\n }\n }\n\n async getGasPrice(): Promise<bigint> {\n try {\n const gasPrice = await this.publicClient.getGasPrice();\n return gasPrice;\n } catch (error) {\n throw new NodeError(\n `Failed to get gas price: ${error instanceof Error ? error.message : String(error)}`,\n 'GAS_PRICE_ERROR',\n 'core',\n { originalError: error }\n );\n }\n }\n\n async estimateGas(tx: BaseTransaction): Promise<bigint> {\n try {\n const estimate = await this.publicClient.request({\n method: 'cfx_estimateGasAndCollateral',\n params: [\n {\n to: tx.to as Address,\n value: tx.value ? `0x${tx.value.toString(16)}` : undefined,\n data: tx.data as `0x${string}`,\n },\n ],\n });\n return BigInt(estimate.gasLimit);\n } catch (error) {\n throw new NodeError(\n `Failed to estimate gas: ${error instanceof Error ? error.message : String(error)}`,\n 'GAS_ESTIMATE_ERROR',\n 'core',\n { transaction: tx, originalError: error }\n );\n }\n }\n\n async sendTransaction(_tx: BaseTransaction): Promise<string> {\n throw new NodeError(\n 'Cannot send transaction from public client. Use wallet client instead.',\n 'WALLET_REQUIRED',\n 'core'\n );\n }\n\n async waitForTransaction(hash: string): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: hash as `0x${string}`,\n });\n\n return {\n hash: receipt.transactionHash,\n blockNumber: BigInt(receipt.epochNumber?.toString() || '0'),\n blockHash: receipt.blockHash || '',\n transactionIndex: Number(receipt.index || 0),\n status: receipt.outcomeStatus === 'success' ? 'success' : 'reverted',\n gasUsed: receipt.gasUsed || 0n,\n contractAddress: receipt.contractCreated || undefined,\n logs:\n receipt.log?.map((log: Record<string, unknown>) => ({\n address: (log.address as string) || '',\n topics: (log.topics as string[]) || [],\n data: (log.data as string) || '0x',\n blockNumber: BigInt((log.epochNumber as number)?.toString() || '0'),\n transactionHash: (log.transactionHash as string) || '',\n logIndex: Number(log.logIndex || 0),\n })) || [],\n };\n } catch (error) {\n throw new NodeError(\n `Failed to wait for transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'TRANSACTION_WAIT_ERROR',\n 'core',\n { hash, originalError: error }\n );\n }\n }\n\n async getTokenBalance(\n tokenAddress: Address,\n holderAddress?: Address\n ): Promise<string> {\n const holder = holderAddress || this.address;\n\n if (!this.isValidAddress(tokenAddress)) {\n throw new NodeError(\n 'Invalid token address format',\n 'INVALID_ADDRESS',\n 'core',\n { tokenAddress }\n );\n }\n if (!this.isValidAddress(holder)) {\n throw new NodeError(\n 'Invalid holder address format',\n 'INVALID_ADDRESS',\n 'core',\n { holder }\n );\n }\n\n try {\n const [balance, decimals] = await Promise.all([\n this.publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n name: 'balanceOf',\n type: 'function',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'balanceOf',\n args: [holder],\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: [\n {\n name: 'decimals',\n type: 'function',\n inputs: [],\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'decimals',\n }),\n ]);\n\n return this.formatTokenAmount(balance as bigint, Number(decimals));\n } catch (error) {\n throw new NodeError(\n `Failed to get token balance: ${error instanceof Error ? error.message : String(error)}`,\n 'TOKEN_BALANCE_ERROR',\n 'core',\n { tokenAddress, holder, originalError: error }\n );\n }\n }\n\n watchBlocks(callback: EventCallback<BlockEvent>): UnwatchFunction {\n return this.publicClient.watchEpochNumber({\n emitMissed: false,\n epochTag: 'latest_mined',\n onEpochNumber: async (epochNumber: bigint) => {\n try {\n const blockHashes = await this.publicClient.getBlocksByEpoch({\n epochNumber,\n });\n for (const hash of blockHashes) {\n try {\n const block = await this.publicClient.getBlock({\n blockHash: hash as `0x${string}`,\n });\n\n const blockEvent: BlockEvent = {\n chainType: 'core',\n blockNumber: BigInt(block.epochNumber?.toString() || '0'),\n blockHash: block.hash || '',\n timestamp: Number(block.timestamp || 0),\n transactionCount: block.transactions?.length || 0,\n };\n\n callback(blockEvent);\n } catch (error) {\n console.error(`Failed to process block ${hash}:`, error);\n }\n }\n } catch (error) {\n console.error(\n `Failed to get blocks for epoch ${epochNumber}:`,\n error\n );\n }\n },\n });\n }\n\n watchTransactions(\n callback: EventCallback<TransactionEvent>\n ): UnwatchFunction {\n return this.publicClient.watchEpochNumber({\n emitMissed: false,\n epochTag: 'latest_mined',\n onEpochNumber: async (epochNumber: bigint) => {\n try {\n const blockHashes = await this.publicClient.getBlocksByEpoch({\n epochNumber,\n });\n for (const hash of blockHashes) {\n try {\n const block = await this.publicClient.getBlock({\n blockHash: hash as `0x${string}`,\n });\n\n await Promise.all(\n (block.transactions || []).map(\n async (txHash: `0x${string}`) => {\n try {\n const tx = await this.publicClient.getTransaction({\n hash: txHash,\n });\n\n const txEvent: TransactionEvent = {\n chainType: 'core',\n hash: tx.hash,\n from: tx.from,\n to: tx.to || undefined,\n value: tx.value || 0n,\n blockNumber: BigInt(\n block.epochNumber?.toString() || '0'\n ),\n };\n\n callback(txEvent);\n } catch (error) {\n console.error(\n `Failed to get transaction ${txHash}:`,\n error\n );\n }\n }\n )\n );\n } catch (error) {\n console.error(`Failed to process block ${hash}:`, error);\n }\n }\n } catch (error) {\n console.error(\n `Failed to get blocks for epoch ${epochNumber}:`,\n error\n );\n }\n },\n });\n }\n\n isValidAddress(address: string): boolean {\n return isCoreAddress(address);\n }\n\n formatAmount(amount: bigint): string {\n return formatCFX(amount);\n }\n\n parseAmount(amount: string): bigint {\n return parseCFX(amount);\n }\n\n getInternalClient(): PublicClient {\n return this.publicClient;\n }\n\n private formatTokenAmount(amount: bigint, decimals: number): string {\n const formatted = formatUnits(amount, decimals);\n return Number(formatted).toFixed(4);\n }\n}\n\n/**\n * Core Space Wallet Client Implementation\n */\nexport class CoreWalletClient implements UnifiedWalletClient {\n public readonly chainType = 'core' as const;\n public readonly address: Address;\n public readonly chainId: number;\n\n private readonly walletClient: WalletClient;\n private readonly publicClient: PublicClient;\n private readonly account: Account;\n private readonly chain: Chain;\n\n constructor(config: WalletConfig) {\n this.chainId = config.chainId;\n\n // Create chain definition\n this.chain = defineChain({\n id: config.chainId,\n name: `ConfluxCore-${config.chainId}`,\n nativeCurrency: {\n decimals: 18,\n name: 'Conflux',\n symbol: 'CFX',\n },\n rpcUrls: {\n default: {\n http: [config.rpcUrl],\n webSocket: config.wsUrl ? [config.wsUrl] : undefined,\n },\n },\n });\n\n // Create account from private key\n this.account = privateKeyToAccount(config.privateKey as `0x${string}`, {\n networkId: config.chainId,\n });\n this.address = this.account.address;\n\n // Create wallet client\n this.walletClient = createWalletClient({\n account: this.account,\n chain: this.chain,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n\n // Create public client for transaction receipts\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n }\n\n async sendTransaction(tx: BaseTransaction): Promise<string> {\n try {\n return await this.walletClient.sendTransaction({\n to: tx.to as Address,\n value: tx.value,\n data: tx.data as `0x${string}`,\n gas: tx.gasLimit,\n gasPrice: tx.gasPrice,\n nonce: tx.nonce,\n account: this.account,\n chain: this.chain,\n });\n } catch (error) {\n throw new NodeError(\n `Failed to send transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'TRANSACTION_SEND_ERROR',\n 'core',\n { transaction: tx, originalError: error }\n );\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n return await this.walletClient.signMessage({\n account: this.account,\n message,\n });\n } catch (error) {\n throw new NodeError(\n `Failed to sign message: ${error instanceof Error ? error.message : String(error)}`,\n 'MESSAGE_SIGN_ERROR',\n 'core',\n { message, originalError: error }\n );\n }\n }\n\n getInternalClient(): WalletClient {\n return this.walletClient;\n }\n\n async waitForTransaction(hash: string): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: hash as `0x${string}`,\n timeout: 5_000, // 5 second timeout for faster response\n });\n\n return {\n hash: receipt.transactionHash,\n blockNumber: BigInt(receipt.epochNumber?.toString() || '0'),\n blockHash: receipt.blockHash || '',\n transactionIndex: Number(receipt.index || 0),\n status: receipt.outcomeStatus === 'success' ? 'success' : 'reverted',\n gasUsed: receipt.gasUsed || 0n,\n contractAddress: receipt.contractCreated || undefined,\n logs:\n receipt.log?.map((log: Record<string, unknown>) => ({\n address: (log.address as string) || '',\n topics: (log.topics as string[]) || [],\n data: (log.data as string) || '0x',\n blockNumber: BigInt((log.epochNumber as number)?.toString() || '0'),\n transactionHash: (log.transactionHash as string) || '',\n logIndex: Number(log.logIndex || 0),\n })) || [],\n };\n } catch (error) {\n throw new NodeError(\n `Failed to wait for transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'TRANSACTION_WAIT_ERROR',\n 'core',\n { hash, originalError: error }\n );\n }\n }\n\n /**\n * Unified faucet functionality\n * Automatically detects address type and sends CFX accordingly:\n * - Core address: Direct transfer\n * - eSpace address: Cross-chain transfer via internal contract\n */\n async faucet(address: string, amount: string): Promise<string> {\n // Detect address type\n const isCoreAddr = isCoreAddress(address);\n const isEspaceAddr = isEspaceAddress(address);\n\n if (!isCoreAddr && !isEspaceAddr) {\n throw new NodeError(\n 'Invalid address format (must be Core or eSpace address)',\n 'INVALID_ADDRESS',\n 'core',\n { address }\n );\n }\n\n try {\n if (isCoreAddr) {\n // Direct Core space transfer\n return await this.walletClient.sendTransaction({\n chain: this.chain,\n account: this.account,\n to: address as Address,\n value: parseCFX(amount),\n });\n } else {\n // Cross-chain transfer to eSpace via internal contract\n return await this.walletClient.sendTransaction({\n chain: this.chain,\n account: this.account,\n to: hexAddressToBase32({\n hexAddress: '0x0888000000000000000000000000000000000006',\n networkId: this.chain.id,\n }),\n value: parseCFX(amount),\n data: encodeFunctionData({\n abi: [\n {\n type: 'function',\n name: 'transferEVM',\n inputs: [{ name: 'to', type: 'bytes20' }],\n outputs: [{ name: 'output', type: 'bytes' }],\n stateMutability: 'payable',\n },\n ],\n functionName: 'transferEVM',\n args: [address as `0x${string}`],\n }),\n });\n }\n } catch (error) {\n throw new NodeError(\n `Failed to send faucet transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'FAUCET_ERROR',\n 'core',\n { address, amount, originalError: error }\n );\n }\n }\n\n /**\n * Cross-chain faucet functionality (Core → eSpace)\n * Sends CFX from Core space to eSpace address via internal contract\n * @deprecated Use faucet() instead which auto-detects address type\n */\n async faucetToEspace(espaceAddress: string, amount: string): Promise<string> {\n if (!isEspaceAddress(espaceAddress)) {\n throw new NodeError(\n 'Invalid eSpace address format',\n 'INVALID_ADDRESS',\n 'core',\n { espaceAddress }\n );\n }\n\n try {\n return await this.walletClient.sendTransaction({\n chain: this.chain,\n account: this.account,\n to: hexAddressToBase32({\n hexAddress: '0x0888000000000000000000000000000000000006',\n networkId: this.chain.id,\n }),\n value: parseCFX(amount),\n data: encodeFunctionData({\n abi: [\n {\n type: 'function',\n name: 'transferEVM',\n inputs: [{ name: 'to', type: 'bytes20' }],\n outputs: [{ name: 'output', type: 'bytes' }],\n stateMutability: 'payable',\n },\n ],\n functionName: 'transferEVM',\n args: [espaceAddress as `0x${string}`],\n }),\n });\n } catch (error) {\n throw new NodeError(\n `Failed to send faucet transaction to eSpace: ${error instanceof Error ? error.message : String(error)}`,\n 'FAUCET_ERROR',\n 'core',\n { espaceAddress, amount, originalError: error }\n );\n }\n }\n\n /**\n * Deploy a contract to Core Space\n */\n async deployContract(\n abi: unknown[],\n bytecode: string,\n constructorArgs: unknown[] = []\n ): Promise<string> {\n try {\n const hash = await this.walletClient.deployContract({\n account: this.account,\n chain: this.chain,\n abi,\n bytecode: bytecode as `0x${string}`,\n args: constructorArgs,\n });\n\n // Wait for transaction to be mined and get the contract address\n const receipt = await this.waitForTransaction(hash);\n\n if (!receipt.contractAddress) {\n throw new Error('Contract address not found in transaction receipt');\n }\n\n // The contract address is already in Core Space format from Cive\n // No need to convert since cive returns Core Space addresses directly\n return receipt.contractAddress;\n } catch (error) {\n throw new NodeError(\n `Failed to deploy contract: ${error instanceof Error ? error.message : String(error)}`,\n 'DEPLOYMENT_ERROR',\n 'core',\n { abi, bytecode, constructorArgs, originalError: error }\n );\n }\n }\n\n /**\n * Call a contract method (read-only)\n */\n async callContract<T = unknown>(\n address: string,\n abi: unknown[],\n functionName: string,\n args: unknown[] = []\n ): Promise<T> {\n try {\n // Use the public client for read operations instead of wallet client\n const result = await this.publicClient.readContract({\n address: address as Address,\n abi,\n functionName,\n args,\n });\n return result as T;\n } catch (error) {\n throw new NodeError(\n `Failed to call contract: ${error instanceof Error ? error.message : String(error)}`,\n 'CONTRACT_CALL_ERROR',\n 'core',\n { address, functionName, args, originalError: error }\n );\n }\n }\n\n /**\n * Write to a contract (transaction)\n */\n async writeContract(\n address: string,\n abi: unknown[],\n functionName: string,\n args: unknown[] = [],\n value?: bigint\n ): Promise<string> {\n try {\n const hash = await this.walletClient.writeContract({\n account: this.account,\n chain: this.chain,\n address: address as Address,\n abi,\n functionName,\n args,\n value,\n });\n return hash;\n } catch (error) {\n throw new NodeError(\n `Failed to write to contract: ${error instanceof Error ? error.message : String(error)}`,\n 'CONTRACT_WRITE_ERROR',\n 'core',\n { address, functionName, args, value, originalError: error }\n );\n }\n }\n}\n\n/**\n * Core Space Test Client Implementation\n */\nexport class CoreTestClient extends CoreClient implements TestClient {\n private readonly testClient: CiveTestClient;\n\n constructor(config: TestConfig) {\n super(config);\n\n this.testClient = createTestClient({\n chain: this.chainId === 1029 ? conflux : confluxTestnet,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n }\n\n async mine(blocks = 1): Promise<void> {\n try {\n await this.testClient.mine({ blocks });\n } catch (error) {\n throw new NodeError(\n `Failed to mine blocks: ${error instanceof Error ? error.message : String(error)}`,\n 'MINE_ERROR',\n 'core',\n { blocks, originalError: error }\n );\n }\n }\n\n async setNextBlockTimestamp(_timestamp: number): Promise<void> {\n // Implementation would depend on available test client methods\n throw new NodeError(\n 'setNextBlockTimestamp not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async increaseTime(_seconds: number): Promise<void> {\n // Implementation would depend on available test client methods\n throw new NodeError(\n 'increaseTime not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async impersonateAccount(_address: Address): Promise<void> {\n throw new NodeError(\n 'impersonateAccount not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async stopImpersonatingAccount(_address: Address): Promise<void> {\n throw new NodeError(\n 'stopImpersonatingAccount not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async setBalance(_address: Address, _balance: bigint): Promise<void> {\n throw new NodeError(\n 'setBalance not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async getStorageAt(_address: Address, _slot: string): Promise<string> {\n throw new NodeError(\n 'getStorageAt not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n async setStorageAt(\n _address: Address,\n _slot: string,\n _value: string\n ): Promise<void> {\n throw new NodeError(\n 'setStorageAt not implemented for Core client',\n 'NOT_IMPLEMENTED',\n 'core'\n );\n }\n\n getInternalTestClient(): CiveTestClient {\n return this.testClient;\n }\n}\n\n/**\n * Create a Core client instance with all components\n */\nexport async function createCoreClient(\n config: ClientConfig\n): Promise<CoreClientInstance> {\n const chainConfig = getChainConfig(config.chainId as SupportedChainId);\n\n if (chainConfig.type !== 'core') {\n throw new NodeError(\n `Invalid chain type for Core client: ${chainConfig.type}`,\n 'INVALID_CHAIN_TYPE',\n 'core'\n );\n }\n\n // Update config with proper RPC URL if not provided\n const clientConfig: ClientConfig = {\n ...config,\n rpcUrl:\n config.rpcUrl ||\n chainConfig.rpcUrls.default.http[0] ||\n 'http://localhost:12537',\n wsUrl: config.wsUrl || chainConfig.rpcUrls.default.webSocket?.[0],\n };\n\n const publicClient = new CoreClient(clientConfig);\n\n let walletClient: CoreWalletClient | undefined;\n let testClient: CoreTestClient | undefined;\n\n if (config.account) {\n let privateKey: string;\n if (typeof config.account === 'string') {\n privateKey = config.account;\n } else {\n privateKey = config.account.privateKey;\n }\n\n const walletConfig: WalletConfig = {\n ...clientConfig,\n privateKey,\n accountIndex:\n typeof config.account === 'object' ? config.account.accountIndex : 0,\n };\n walletClient = new CoreWalletClient(walletConfig);\n }\n\n if (config.testMode) {\n const testConfig: TestConfig = {\n ...clientConfig,\n enableTestMode: true,\n };\n testClient = new CoreTestClient(testConfig);\n }\n\n return {\n publicClient,\n walletClient,\n testClient,\n };\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Centralized Chain Configuration\n// Matches Hardhat configuration with consistent naming across all clients\n\nimport type { Chain as CiveChain } from 'cive';\nimport { defineChain } from 'cive/utils';\nimport type { Chain as ViemChain } from 'viem';\nimport { defineChain as defineEvmChain } from 'viem';\n\nexport type SupportedChainId = 1029 | 1 | 2029 | 1030 | 71 | 2030;\n\nexport interface ChainConfig {\n id: SupportedChainId;\n name: string;\n type: 'core' | 'evm';\n testnet: boolean;\n nativeCurrency: {\n name: string;\n symbol: string;\n decimals: number;\n };\n rpcUrls: {\n default: {\n http: string[];\n webSocket?: string[];\n };\n };\n blockExplorers?: {\n default: {\n name: string;\n url: string;\n };\n };\n contracts?: {\n multicall3?: {\n address: `0x${string}`;\n blockCreated?: number;\n };\n };\n}\n\n// Core Space Chains (Conflux Protocol)\nexport const CORE_MAINNET: ChainConfig = {\n id: 1029,\n name: 'conflux-core',\n type: 'core',\n testnet: false,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['https://main.confluxrpc.com'],\n webSocket: ['wss://main.confluxrpc.com/ws'],\n },\n },\n blockExplorers: {\n default: {\n name: 'ConfluxScan',\n url: 'https://confluxscan.io',\n },\n },\n};\n\nexport const CORE_TESTNET: ChainConfig = {\n id: 1,\n name: 'conflux-core-testnet',\n type: 'core',\n testnet: true,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['https://test.confluxrpc.com'],\n webSocket: ['wss://test.confluxrpc.com/ws'],\n },\n },\n blockExplorers: {\n default: {\n name: 'ConfluxScan Testnet',\n url: 'https://testnet.confluxscan.io',\n },\n },\n};\n\nexport const CORE_LOCAL: ChainConfig = {\n id: 2029,\n name: 'conflux-core-local',\n type: 'core',\n testnet: true,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['http://localhost:12537'],\n webSocket: ['ws://localhost:12536'],\n },\n },\n};\n\n// EVM Space Chains (Ethereum Compatible)\nexport const EVM_MAINNET: ChainConfig = {\n id: 1030,\n name: 'conflux-espace',\n type: 'evm',\n testnet: false,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['https://evm.confluxrpc.com'],\n },\n },\n blockExplorers: {\n default: {\n name: 'ConfluxScan eSpace',\n url: 'https://evm.confluxscan.net',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 62512243,\n },\n },\n};\n\nexport const EVM_TESTNET: ChainConfig = {\n id: 71,\n name: 'conflux-espace-testnet',\n type: 'evm',\n testnet: true,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['https://evmtestnet.confluxrpc.com'],\n },\n },\n blockExplorers: {\n default: {\n name: 'ConfluxScan eSpace Testnet',\n url: 'https://evmtestnet.confluxscan.net',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 117499050,\n },\n },\n};\n\nexport const EVM_LOCAL: ChainConfig = {\n id: 2030,\n name: 'conflux-espace-local',\n type: 'evm',\n testnet: true,\n nativeCurrency: {\n name: 'Conflux',\n symbol: 'CFX',\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: ['http://localhost:8545'],\n },\n },\n};\n\n// All supported chains\nexport const SUPPORTED_CHAINS: Record<SupportedChainId, ChainConfig> = {\n 1029: CORE_MAINNET,\n 1: CORE_TESTNET,\n 2029: CORE_LOCAL,\n 1030: EVM_MAINNET,\n 71: EVM_TESTNET,\n 2030: EVM_LOCAL,\n};\n\n// Chain utilities\nexport function getChainConfig(chainId: SupportedChainId): ChainConfig {\n const config = SUPPORTED_CHAINS[chainId];\n if (!config) {\n throw new Error(`Unsupported chain ID: ${chainId}`);\n }\n return config;\n}\n\nexport function isValidChainId(chainId: number): chainId is SupportedChainId {\n return chainId in SUPPORTED_CHAINS;\n}\n\nexport function getCoreChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n (chain) => chain.type === 'core'\n );\n}\n\nexport function getEvmChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter(\n (chain) => chain.type === 'evm'\n );\n}\n\nexport function getMainnetChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter((chain) => !chain.testnet);\n}\n\nexport function getTestnetChains(): ChainConfig[] {\n return Object.values(SUPPORTED_CHAINS).filter((chain) => chain.testnet);\n}\n\n// Convert to native chain objects\nexport function toCiveChain(config: ChainConfig): CiveChain {\n if (config.type !== 'core') {\n throw new Error(`Cannot convert ${config.type} chain to Cive chain`);\n }\n\n return defineChain({\n id: config.id,\n name: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: config.rpcUrls,\n blockExplorers: config.blockExplorers,\n });\n}\n\nexport function toViemChain(config: ChainConfig): ViemChain {\n if (config.type !== 'evm') {\n throw new Error(`Cannot convert ${config.type} chain to Viem chain`);\n }\n\n return defineEvmChain({\n id: config.id,\n name: config.name,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: config.rpcUrls,\n blockExplorers: config.blockExplorers,\n contracts: config.contracts,\n });\n}\n\n// Network selector utility with automatic local switching\nexport class NetworkSelector {\n private currentChainId: SupportedChainId;\n private previousChainId: SupportedChainId | null = null;\n private listeners: Set<(chainId: SupportedChainId) => void> = new Set();\n private nodeRunningListeners: Set<(isRunning: boolean) => void> = new Set();\n private isNodeRunning = false;\n private lockedToLocal = false;\n\n constructor(initialChainId: SupportedChainId = 1) {\n this.currentChainId = initialChainId;\n }\n\n getCurrentChain(): ChainConfig {\n return getChainConfig(this.currentChainId);\n }\n\n getCurrentChainId(): SupportedChainId {\n return this.currentChainId;\n }\n\n /**\n * Switch to a specific chain\n * @param chainId - Chain ID to switch to\n * @param force - Force switch even if node is running (for wallet operations)\n */\n switchChain(chainId: SupportedChainId, force = false): void {\n if (!isValidChainId(chainId)) {\n throw new Error(`Invalid chain ID: ${chainId}`);\n }\n\n // If node is running and we're trying to switch to non-local, only allow if forced\n if (this.isNodeRunning && !this.isLocalChain(chainId) && !force) {\n console.warn(\n `Cannot switch to chain ${chainId} while local node is running. Use force=true for wallet operations.`\n );\n return;\n }\n\n if (this.currentChainId !== chainId) {\n this.currentChainId = chainId;\n this.notifyListeners();\n }\n }\n\n /**\n * Called when local node starts - automatically switches to local chains\n */\n onNodeStart(\n coreChainId: SupportedChainId = 2029,\n evmChainId: SupportedChainId = 2030\n ): void {\n if (!this.isNodeRunning) {\n // Store previous chain for restoration later\n if (!this.isLocal()) {\n this.previousChainId = this.currentChainId;\n }\n\n this.isNodeRunning = true;\n this.lockedToLocal = true;\n\n // Switch to appropriate local chain based on current chain type\n const targetLocalChain = this.isEvm() ? evmChainId : coreChainId;\n this.switchChain(targetLocalChain, true); // Force switch to local\n\n // Notify node running listeners\n this.notifyNodeRunningListeners();\n }\n }\n\n /**\n * Called when local node stops - can restore previous chain\n */\n onNodeStop(restorePrevious = true): void {\n if (this.isNodeRunning) {\n this.isNodeRunning = false;\n this.lockedToLocal = false;\n\n // Restore previous chain if requested and available\n if (restorePrevious && this.previousChainId) {\n this.switchChain(this.previousChainId, true);\n this.previousChainId = null;\n }\n\n // Notify node running listeners\n this.notifyNodeRunningListeners();\n }\n }\n\n /**\n * Check if node is currently running\n */\n getNodeRunningStatus(): boolean {\n return this.isNodeRunning;\n }\n\n /**\n * Check if selector is locked to local chains\n */\n isLockedToLocal(): boolean {\n return this.lockedToLocal;\n }\n\n onChainChange(listener: (chainId: SupportedChainId) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n onNodeRunningChange(listener: (isRunning: boolean) => void): () => void {\n this.nodeRunningListeners.add(listener);\n return () => this.nodeRunningListeners.delete(listener);\n }\n\n private notifyListeners(): void {\n for (const listener of this.listeners) {\n try {\n listener(this.currentChainId);\n } catch (error) {\n console.error('Error in chain change listener:', error);\n }\n }\n }\n\n private notifyNodeRunningListeners(): void {\n for (const listener of this.nodeRunningListeners) {\n try {\n listener(this.isNodeRunning);\n } catch (error) {\n console.error('Error in node running listener:', error);\n }\n }\n }\n\n private isLocalChain(chainId: SupportedChainId): boolean {\n return chainId === 2029 || chainId === 2030;\n }\n\n // Helper methods for chain type detection\n isCore(): boolean {\n return this.getCurrentChain().type === 'core';\n }\n\n isEvm(): boolean {\n return this.getCurrentChain().type === 'evm';\n }\n\n isTestnet(): boolean {\n return this.getCurrentChain().testnet;\n }\n\n isLocal(): boolean {\n return this.currentChainId === 2029 || this.currentChainId === 2030;\n }\n\n // Get corresponding chain IDs\n getCorrespondingChainId(): SupportedChainId | null {\n switch (this.currentChainId) {\n case 1029:\n return 1030; // Core mainnet -> eSpace mainnet\n case 1030:\n return 1029; // eSpace mainnet -> Core mainnet\n case 1:\n return 71; // Core testnet -> eSpace testnet\n case 71:\n return 1; // eSpace testnet -> Core testnet\n case 2029:\n return 2030; // Core local -> eSpace local\n case 2030:\n return 2029; // eSpace local -> Core local\n default:\n return null;\n }\n }\n\n /**\n * Update local chain configurations with actual node URLs\n * Called when ServerManager starts with specific ports\n */\n updateLocalChainUrls(\n coreRpcPort: number,\n evmRpcPort: number,\n wsPort?: number\n ): void {\n // Update Core local chain\n const coreLocal = SUPPORTED_CHAINS[2029];\n if (coreLocal) {\n coreLocal.rpcUrls.default.http = [`http://localhost:${coreRpcPort}`];\n if (wsPort) {\n coreLocal.rpcUrls.default.webSocket = [`ws://localhost:${wsPort}`];\n }\n }\n\n // Update eSpace local chain\n const evmLocal = SUPPORTED_CHAINS[2030];\n if (evmLocal) {\n evmLocal.rpcUrls.default.http = [`http://localhost:${evmRpcPort}`];\n }\n }\n}\n\n// Default network selector instance\nexport const defaultNetworkSelector = new NetworkSelector();\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Core Configuration Types\n// Based on proven patterns from DevKit CLI and @xcfx/node\n\nexport interface NodeConfig {\n // Chain Configuration\n readonly chainId?: number; // Core space chain ID (default: 2029)\n readonly evmChainId?: number; // EVM space chain ID (default: 2030)\n\n // Network Ports\n readonly jsonrpcHttpPort?: number; // Core HTTP RPC port (default: 12537)\n readonly jsonrpcHttpEthPort?: number; // EVM HTTP RPC port (default: 8545)\n readonly jsonrpcWsPort?: number; // Core WebSocket port (default: 12538)\n readonly jsonrpcWsEthPort?: number; // EVM WebSocket port (default: 8546)\n\n // // Development Settings\n // readonly devBlockIntervalMs?: number; // Block generation interval (default: 1000)\n // readonly devPackTxImmediately?: boolean; // Pack transactions immediately\n\n // Data & Logging\n readonly confluxDataDir?: string; // Data directory path\n readonly log?: boolean; // Enable console logging\n readonly logConf?: string; // Custom log configuration file\n\n // Genesis Configuration\n readonly genesisSecrets?: readonly string[]; // Core space genesis private keys\n readonly genesisEvmSecrets?: readonly string[]; // EVM space genesis private keys\n readonly miningAuthor?: string; // Mining rewards recipient\n\n // Node Type\n readonly nodeType?: 'full' | 'archive' | 'light';\n readonly blockDbType?: 'rocksdb' | 'sqlite';\n}\n\nexport interface ExtendedNodeConfig extends NodeConfig {\n // DevKit Extensions\n readonly accountCount?: number; // Number of accounts to generate per chain\n readonly silent?: boolean; // Suppress all logging\n readonly fundAccounts?: boolean; // Auto-fund generated accounts\n readonly enabledChains?: readonly ('core' | 'evm')[]; // Active chains\n\n // Derivation paths for account generation\n readonly derivationPaths?: {\n readonly core: string; // Core derivation path template\n readonly evm: string; // EVM derivation path template\n };\n}\n\n// Address and Hash Types\nexport type Address = string;\nexport type CoreAddress = string; // cfx:... format\nexport type EvmAddress = string; // 0x... format\nexport type Hash = string;\nexport type ChainType = 'core' | 'evm';\n\n// Account Types\nexport interface UnifiedAccount {\n readonly id: string; // Unique identifier\n readonly name: string; // Human-readable name\n readonly index: number; // Derivation index\n readonly privateKey: string; // Private key (hex format)\n readonly derivationPath: string; // BIP32 derivation path\n\n // Chain-specific addresses (same private key, different formats)\n readonly coreAddress: CoreAddress; // cfx:... format\n readonly evmAddress: EvmAddress; // 0x... format\n\n // Chain-specific state\n readonly coreBalance: bigint;\n readonly evmBalance: bigint;\n readonly coreNonce: number;\n readonly evmNonce: number;\n\n // Metadata\n readonly isActive: boolean;\n readonly createdAt: Date;\n readonly updatedAt: Date;\n}\n\n// Client Status Types\nexport interface ChainStatus {\n readonly isRunning: boolean;\n readonly chainId: number;\n readonly blockNumber: bigint;\n readonly gasPrice: bigint;\n readonly peerCount: number;\n readonly syncStatus: 'syncing' | 'synced';\n readonly latestBlockHash: string;\n readonly mining: boolean;\n readonly pendingTransactions: number;\n readonly rpcEndpoint: string;\n readonly wsEndpoint?: string;\n}\n\nexport interface NodeStatus {\n readonly isRunning: boolean;\n readonly uptime: number;\n readonly startTime: Date | null;\n readonly core: ChainStatus;\n readonly evm: ChainStatus;\n readonly dataDir: string;\n readonly config: NodeConfig;\n readonly mining: MiningStatus;\n}\n\nexport interface MiningStatus {\n readonly isRunning: boolean;\n readonly interval: number;\n readonly blocksMined: number;\n readonly startTime: Date | null;\n readonly lastBlockTime: Date | null;\n}\n\n// Transaction Types\nexport interface BaseTransaction {\n readonly to?: string;\n readonly value?: bigint;\n readonly data?: string;\n readonly gasLimit?: bigint;\n readonly gasPrice?: bigint;\n readonly nonce?: number;\n}\n\nexport interface TransactionReceipt {\n readonly hash: string;\n readonly blockNumber: bigint;\n readonly blockHash: string;\n readonly transactionIndex: number;\n readonly status: 'success' | 'reverted';\n readonly gasUsed: bigint;\n readonly contractAddress?: string;\n readonly logs: readonly Log[];\n}\n\nexport interface Log {\n readonly address: string;\n readonly topics: readonly string[];\n readonly data: string;\n readonly blockNumber: bigint;\n readonly transactionHash: string;\n readonly logIndex: number;\n}\n\n// Error Types\nexport interface ConfluxNodeError extends Error {\n readonly code: string;\n readonly chain?: ChainType;\n readonly context?: Record<string, unknown>;\n}\n\nexport class NodeError extends Error implements ConfluxNodeError {\n public readonly code: string;\n public readonly chain?: ChainType;\n public readonly context?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: string,\n chain?: ChainType,\n context?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'NodeError';\n this.code = code;\n this.chain = chain;\n this.context = context;\n }\n}\n\n// Event Types\nexport interface BlockEvent {\n readonly chainType: ChainType;\n readonly blockNumber: bigint;\n readonly blockHash: string;\n readonly timestamp: number;\n readonly transactionCount: number;\n}\n\nexport interface TransactionEvent {\n readonly chainType: ChainType;\n readonly hash: string;\n readonly from: string;\n readonly to?: string;\n readonly value: bigint;\n readonly blockNumber: bigint;\n}\n\n// Utility Types\nexport type EventCallback<T> = (event: T) => void;\nexport type UnwatchFunction = () => void;\n\n// Server Management Types\nexport type ServerStatus =\n | 'stopped'\n | 'starting'\n | 'running'\n | 'stopping'\n | 'error';\n\nexport interface ServerConfig {\n readonly coreRpcPort?: number;\n readonly evmRpcPort?: number;\n readonly wsPort?: number;\n readonly chainId?: number;\n readonly evmChainId?: number;\n readonly accounts?: number;\n readonly balance?: string;\n readonly mnemonic?: string;\n readonly logging?: boolean;\n readonly detached?: boolean;\n readonly mining?: MiningConfig;\n readonly devBlockIntervalMs?: number; // Auto block generation interval in ms (undefined = disabled)\n readonly devPackTxImmediately?: boolean; // Pack transactions immediately for responsiveness\n readonly dataDir?: string; // Data directory for Conflux node (default: /workspace/.conflux-dev)\n}\n\nexport interface MiningConfig {\n readonly enabled: boolean;\n readonly interval: number; // milliseconds between blocks\n readonly autoStart: boolean; // start mining when server starts\n}\n\nexport interface AccountInfo {\n readonly index: number;\n readonly privateKey: string;\n readonly coreAddress: string;\n readonly evmAddress: string;\n readonly mnemonic: string;\n readonly path: string;\n readonly evmPrivateKey?: string; // Ethereum-derived private key for EVM operations\n readonly evmPath?: string; // Ethereum derivation path (m/44'/60'/0'/0/i)\n}\n\n// Additional types will be migrated from devkit-node as needed\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// EVM Space Client Implementation (eSpace)\n// Based on proven patterns from DevKit CLI, adapted for unified interface\n\nimport {\n type Address,\n type Chain,\n createPublicClient,\n createTestClient,\n createWalletClient,\n defineChain,\n encodeFunctionData,\n formatEther,\n http,\n isAddress as isEvmAddress,\n type PublicClient,\n parseEther,\n type TestClient as ViemTestClient,\n type WalletClient,\n} from 'viem';\nimport { type Account, privateKeyToAccount } from 'viem/accounts';\nimport { getChainConfig, type SupportedChainId } from '../config/chains.js';\nimport type {\n BaseTransaction,\n BlockEvent,\n ChainClient,\n ClientConfig,\n EspaceClientInstance,\n EventCallback,\n TestClient,\n TestConfig,\n TransactionEvent,\n TransactionReceipt,\n WalletClient as UnifiedWalletClient,\n WalletConfig,\n} from '../types/index.js';\nimport { NodeError } from '../types/index.js';\n\n// Define eSpace chains if not available from viem/chains\nconst espaceMainnet = defineChain({\n id: 1030,\n name: 'Conflux eSpace',\n nativeCurrency: { name: 'Conflux', symbol: 'CFX', decimals: 18 },\n rpcUrls: { default: { http: ['https://evm.confluxrpc.com'] } },\n blockExplorers: {\n default: { name: 'ConfluxScan', url: 'https://evm.confluxscan.net' },\n },\n});\n\nconst espaceTestnet = defineChain({\n id: 71,\n name: 'Conflux eSpace Testnet',\n nativeCurrency: { name: 'Conflux', symbol: 'CFX', decimals: 18 },\n rpcUrls: { default: { http: ['https://evmtestnet.confluxrpc.com'] } },\n blockExplorers: {\n default: { name: 'ConfluxScan', url: 'https://evmtestnet.confluxscan.net' },\n },\n});\n\n/**\n * EVM Space (eSpace) Client Implementation\n * Provides unified interface for Ethereum-compatible operations on Conflux eSpace\n */\nexport class EspaceClient implements ChainClient {\n readonly chainId: number;\n readonly chainType = 'evm' as const;\n readonly publicClient: PublicClient;\n protected readonly chain: Chain;\n public address: Address;\n\n constructor(config: ClientConfig) {\n this.chainId = config.chainId;\n\n // Create chain configuration based on provided chain ID\n if (config.chainId === 1030) {\n this.chain = espaceMainnet;\n } else if (config.chainId === 71) {\n this.chain = espaceTestnet;\n } else {\n // Custom chain configuration for development\n this.chain = defineChain({\n id: config.chainId,\n name: `Conflux eSpace (${config.chainId})`,\n nativeCurrency: { name: 'Conflux', symbol: 'CFX', decimals: 18 },\n rpcUrls: { default: { http: [config.rpcUrl] } },\n });\n }\n\n this.publicClient = createPublicClient({\n chain: this.chain,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n\n // Address will be set by wallet client\n this.address = '' as Address;\n }\n\n async getBlockNumber(): Promise<bigint> {\n try {\n const blockNumber = await this.publicClient.getBlockNumber();\n return blockNumber;\n } catch (error) {\n throw new NodeError(\n `Failed to get block number: ${error instanceof Error ? error.message : String(error)}`,\n 'BLOCK_NUMBER_ERROR',\n 'evm',\n { originalError: error }\n );\n }\n }\n\n async getBalance(address: Address): Promise<string> {\n if (!isEvmAddress(address)) {\n throw new NodeError(\n 'Invalid EVM address format',\n 'INVALID_ADDRESS',\n 'evm'\n );\n }\n\n try {\n const balance = await this.publicClient.getBalance({ address });\n return formatEther(balance);\n } catch (error) {\n throw new NodeError(\n `Failed to get balance: ${error instanceof Error ? error.message : String(error)}`,\n 'BALANCE_ERROR',\n 'evm',\n { address, originalError: error }\n );\n }\n }\n\n async estimateGas(tx: BaseTransaction): Promise<bigint> {\n try {\n const gas = await this.publicClient.estimateGas({\n to: tx.to as Address,\n value: tx.value,\n data: tx.data as `0x${string}`,\n });\n return gas;\n } catch (error) {\n throw new NodeError(\n `Failed to estimate gas: ${error instanceof Error ? error.message : String(error)}`,\n 'GAS_ESTIMATE_ERROR',\n 'evm',\n { transaction: tx, originalError: error }\n );\n }\n }\n\n async waitForTransaction(hash: string): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: hash as `0x${string}`,\n timeout: 5_000, // 5 second timeout for faster response\n });\n\n return {\n hash: receipt.transactionHash,\n blockNumber: receipt.blockNumber,\n blockHash: receipt.blockHash,\n transactionIndex: receipt.transactionIndex,\n status: receipt.status === 'success' ? 'success' : 'reverted',\n gasUsed: receipt.gasUsed,\n contractAddress: receipt.contractAddress || undefined,\n logs: receipt.logs.map((log) => ({\n address: log.address,\n topics: log.topics,\n data: log.data,\n blockNumber: log.blockNumber || 0n,\n transactionHash: log.transactionHash || '',\n logIndex: log.logIndex || 0,\n })),\n };\n } catch (error) {\n throw new NodeError(\n `Failed to wait for transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'TRANSACTION_WAIT_ERROR',\n 'evm',\n { hash, originalError: error }\n );\n }\n }\n\n async getGasPrice(): Promise<bigint> {\n try {\n const gasPrice = await this.publicClient.getGasPrice();\n return gasPrice;\n } catch (error) {\n throw new NodeError(\n `Failed to get gas price: ${error instanceof Error ? error.message : String(error)}`,\n 'GAS_PRICE_ERROR',\n 'evm',\n { originalError: error }\n );\n }\n }\n\n /**\n * Get the current chain ID from the network\n */\n async getChainId(): Promise<number> {\n try {\n const chainId = await this.publicClient.getChainId();\n return chainId;\n } catch (error) {\n throw new NodeError(\n `Failed to get chain ID: ${error instanceof Error ? error.message : String(error)}`,\n 'CHAIN_ID_ERROR',\n 'evm',\n { originalError: error }\n );\n }\n }\n\n /**\n * Check if the client is connected to the network\n */\n async isConnected(): Promise<boolean> {\n try {\n await this.publicClient.getBlockNumber();\n return true;\n } catch {\n return false;\n }\n }\n\n // Base implementation - should be overridden by WalletClient\n async sendTransaction(_tx: BaseTransaction): Promise<string> {\n throw new NodeError(\n 'sendTransaction not available on public client',\n 'METHOD_NOT_AVAILABLE',\n 'evm'\n );\n }\n\n async getTokenBalance(\n _address: string,\n _tokenAddress: string\n ): Promise<string> {\n try {\n const balance = await this.publicClient.readContract({\n address: _tokenAddress as Address,\n abi: [\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n },\n ],\n functionName: 'balanceOf',\n args: [_address as Address],\n });\n return balance.toString();\n } catch (error) {\n throw new NodeError(\n `Failed to get token balance: ${error instanceof Error ? error.message : String(error)}`,\n 'TOKEN_BALANCE_ERROR',\n 'evm',\n { address: _address, tokenAddress: _tokenAddress, originalError: error }\n );\n }\n }\n\n watchBlocks(callback: EventCallback<BlockEvent>): () => void {\n const unwatch = this.publicClient.watchBlocks({\n onBlock: (block) =>\n callback({\n chainType: 'evm',\n blockNumber: block.number || 0n,\n blockHash: block.hash || '',\n timestamp: Number(block.timestamp || 0),\n transactionCount: block.transactions?.length || 0,\n }),\n });\n return unwatch;\n }\n\n async watchTransaction(\n _hash: string,\n _callback: (receipt: TransactionReceipt) => void\n ): Promise<() => void> {\n // This is a simplified implementation - viem doesn't have a direct watchTransaction\n // In practice, you'd poll for the transaction receipt\n const pollTransaction = async () => {\n try {\n const receipt = await this.waitForTransaction(_hash);\n _callback(receipt);\n } catch {\n // Transaction might not be mined yet, continue polling\n setTimeout(pollTransaction, 1000);\n }\n };\n\n setTimeout(pollTransaction, 1000);\n return () => {}; // Return a no-op unwatch function\n }\n\n getInternalClient(): PublicClient | WalletClient {\n return this.publicClient;\n }\n\n // Base implementation - should be overridden by TestClient\n watchTransactions(_callback: EventCallback<TransactionEvent>): () => void {\n throw new NodeError(\n 'watchTransactions not available on public client',\n 'METHOD_NOT_AVAILABLE',\n 'evm'\n );\n }\n\n isValidAddress(address: string): boolean {\n return isEvmAddress(address);\n }\n\n formatAmount(amount: bigint): string {\n return formatEther(amount);\n }\n\n parseAmount(amount: string): bigint {\n return parseEther(amount);\n }\n}\n\n/**\n * EVM Space Wallet Client\n * Extends EspaceClient with transaction and account functionality\n */\nexport class EspaceWalletClient\n extends EspaceClient\n implements UnifiedWalletClient\n{\n private readonly walletClient: WalletClient;\n private readonly account: Account;\n\n constructor(config: ClientConfig & { privateKey: string }) {\n super(config);\n\n // Create account from private key\n this.account = privateKeyToAccount(config.privateKey as `0x${string}`);\n this.address = this.account.address;\n\n // Create wallet client\n this.walletClient = createWalletClient({\n account: this.account,\n chain: this.chain,\n transport: http(config.rpcUrl),\n });\n }\n\n getAddress(): Address {\n return this.address;\n }\n\n async sendTransaction(tx: BaseTransaction): Promise<string> {\n try {\n const hash = await this.walletClient.sendTransaction({\n account: this.account,\n chain: this.chain,\n to: tx.to as Address,\n value: tx.value,\n data: tx.data as `0x${string}`,\n gas: tx.gasLimit,\n gasPrice: tx.gasPrice,\n nonce: tx.nonce,\n });\n return hash;\n } catch (error) {\n throw new NodeError(\n `Failed to send transaction: ${error instanceof Error ? error.message : String(error)}`,\n 'TRANSACTION_ERROR',\n 'evm',\n { transaction: tx, originalError: error }\n );\n }\n }\n\n async signMessage(message: string): Promise<string> {\n try {\n const signature = await this.walletClient.signMessage({\n account: this.account,\n message,\n });\n return signature;\n } catch (error) {\n throw new NodeError(\n `Failed to sign message: ${error instanceof Error ? error.message : String(error)}`,\n 'SIGNING_ERROR',\n 'evm',\n { message, originalError: error }\n );\n }\n }\n\n async deployContract(\n abi: unknown[],\n bytecode: string,\n constructorArgs: unknown[] = []\n ): Promise<string> {\n try {\n const hash = await this.walletClient.deployContract({\n account: this.account,\n chain: this.chain,\n abi,\n bytecode: bytecode as `0x${string}`,\n args: constructorArgs,\n });\n\n // Wait for transaction to be mined and get the contract address\n const receipt = await this.waitForTransaction(hash);\n\n if (!receipt.contractAddress) {\n throw new Error('Contract address not found in transaction receipt');\n }\n\n return receipt.contractAddress;\n } catch (error) {\n throw new NodeError(\n `Failed to deploy contract: ${error instanceof Error ? error.message : String(error)}`,\n 'DEPLOYMENT_ERROR',\n 'evm',\n { bytecode, constructorArgs, originalError: error }\n );\n }\n }\n\n async callContract<T = unknown>(\n address: string,\n abi: unknown[],\n functionName: string,\n args: unknown[] = []\n ): Promise<T> {\n try {\n const result = await this.publicClient.readContract({\n address: address as Address,\n abi,\n functionName,\n args,\n });\n return result as T;\n } catch (error) {\n throw new NodeError(\n `Failed to call contract: ${error instanceof Error ? error.message : String(error)}`,\n 'CONTRACT_CALL_ERROR',\n 'evm',\n { address, functionName, args, originalError: error }\n );\n }\n }\n\n async writeContract(\n address: string,\n abi: unknown[],\n functionName: string,\n args: unknown[] = [],\n value?: bigint\n ): Promise<string> {\n try {\n const hash = await this.walletClient.writeContract({\n account: this.account,\n chain: this.chain,\n address: address as Address,\n abi,\n functionName,\n args,\n value,\n });\n return hash;\n } catch (error) {\n throw new NodeError(\n `Failed to write contract: ${error instanceof Error ? error.message : String(error)}`,\n 'CONTRACT_WRITE_ERROR',\n 'evm',\n { address, functionName, args, value, originalError: error }\n );\n }\n }\n\n /**\n * Transfer CFX from eSpace to Core Space\n * Uses the built-in withdrawal mechanism\n */\n async faucetToCore(coreAddress: string, amount: string): Promise<string> {\n // Basic Core address format validation (cfx:...)\n if (!coreAddress.startsWith('cfx:') || coreAddress.length < 30) {\n throw new NodeError(\n 'Invalid Core address format',\n 'INVALID_ADDRESS',\n 'evm',\n { coreAddress }\n );\n }\n\n try {\n // Use the CrossSpaceCall precompiled contract for eSpace to Core transfers\n const hash = await this.walletClient.sendTransaction({\n account: this.account,\n chain: this.chain,\n to: '0x0888000000000000000000000000000000000006', // CrossSpaceCall precompiled address\n value: parseEther(amount),\n data: encodeFunctionData({\n abi: [\n {\n type: 'function',\n name: 'withdrawFromMapped',\n inputs: [{ name: 'value', type: 'uint256' }],\n outputs: [],\n stateMutability: 'payable',\n },\n ],\n functionName: 'withdrawFromMapped',\n args: [parseEther(amount)],\n }),\n });\n\n return hash;\n } catch (error) {\n throw new NodeError(\n `Failed to send faucet transaction to Core: ${error instanceof Error ? error.message : String(error)}`,\n 'FAUCET_ERROR',\n 'evm',\n { coreAddress, amount, originalError: error }\n );\n }\n }\n\n getInternalClient(): PublicClient | WalletClient {\n return this.walletClient;\n }\n}\n\n/**\n * EVM Space Test Client\n * Extends EspaceWalletClient with additional testing utilities\n */\nexport class EspaceTestClient extends EspaceWalletClient implements TestClient {\n private readonly testClient: ViemTestClient;\n\n constructor(config: TestConfig & { privateKey: string }) {\n super(config);\n\n this.testClient = createTestClient({\n mode: 'anvil',\n chain: this.chainId === 1030 ? espaceMainnet : espaceTestnet,\n transport: http(config.rpcUrl),\n pollingInterval: config.pollingInterval || 1000,\n });\n }\n\n async mine(blocks = 1): Promise<void> {\n try {\n await this.testClient.mine({ blocks });\n } catch (error) {\n throw new NodeError(\n `Failed to mine blocks: ${error instanceof Error ? error.message : String(error)}`,\n 'MINING_ERROR',\n 'evm',\n { blocks, originalError: error }\n );\n }\n }\n\n async setNextBlockTimestamp(timestamp: number): Promise<void> {\n try {\n await this.testClient.setNextBlockTimestamp({\n timestamp: BigInt(timestamp),\n });\n } catch (error) {\n throw new NodeError(\n `Failed to set next block timestamp: ${error instanceof Error ? error.message : String(error)}`,\n 'TIMESTAMP_ERROR',\n 'evm',\n { timestamp, originalError: error }\n );\n }\n }\n\n async increaseTime(seconds: number): Promise<void> {\n try {\n await this.testClient.increaseTime({ seconds });\n } catch (error) {\n throw new NodeError(\n `Failed to increase time: ${error instanceof Error ? error.message : String(error)}`,\n 'TIME_INCREASE_ERROR',\n 'evm',\n { seconds, originalError: error }\n );\n }\n }\n\n async impersonateAccount(address: string): Promise<void> {\n try {\n await this.testClient.impersonateAccount({ address: address as Address });\n } catch (error) {\n throw new NodeError(\n `Failed to impersonate account: ${error instanceof Error ? error.message : String(error)}`,\n 'IMPERSONATION_ERROR',\n 'evm',\n { address, originalError: error }\n );\n }\n }\n\n async stopImpersonatingAccount(address: string): Promise<void> {\n try {\n await this.testClient.stopImpersonatingAccount({\n address: address as Address,\n });\n } catch (error) {\n throw new NodeError(\n `Failed to stop impersonating account: ${error instanceof Error ? error.message : String(error)}`,\n 'IMPERSONATION_STOP_ERROR',\n 'evm',\n { address, originalError: error }\n );\n }\n }\n\n async setBalance(address: string, balance: bigint): Promise<void> {\n try {\n await this.testClient.setBalance({\n address: address as Address,\n value: balance,\n });\n } catch (error) {\n throw new NodeError(\n `Failed to set balance: ${error instanceof Error ? error.message : String(error)}`,\n 'BALANCE_SET_ERROR',\n 'evm',\n { address, balance, originalError: error }\n );\n }\n }\n\n async snapshot(): Promise<string> {\n try {\n const snapshotId = await this.testClient.snapshot();\n return snapshotId;\n } catch (error) {\n throw new NodeError(\n `Failed to create snapshot: ${error instanceof Error ? error.message : String(error)}`,\n 'SNAPSHOT_ERROR',\n 'evm',\n { originalError: error }\n );\n }\n }\n\n async revert(snapshotId: string): Promise<void> {\n try {\n await this.testClient.revert({ id: snapshotId as `0x${string}` });\n } catch (error) {\n throw new NodeError(\n `Failed to revert to snapshot: ${error instanceof Error ? error.message : String(error)}`,\n 'REVERT_ERROR',\n 'evm',\n { snapshotId, originalError: error }\n );\n }\n }\n\n async getStorageAt(address: string, slot: string): Promise<string> {\n try {\n const value = await this.publicClient.getStorageAt({\n address: address as Address,\n slot: slot as `0x${string}`,\n });\n return value || '0x';\n } catch (error) {\n throw new NodeError(\n `Failed to get storage: ${error instanceof Error ? error.message : String(error)}`,\n 'STORAGE_GET_ERROR',\n 'evm',\n { address, slot, originalError: error }\n );\n }\n }\n\n async setStorageAt(\n address: string,\n slot: string,\n value: string\n ): Promise<void> {\n try {\n await this.testClient.setStorageAt({\n address: address as Address,\n index: slot as `0x${string}`,\n value: value as `0x${string}`,\n });\n } catch (error) {\n throw new NodeError(\n `Failed to set storage: ${error instanceof Error ? error.message : String(error)}`,\n 'STORAGE_SET_ERROR',\n 'evm',\n { address, slot, value, originalError: error }\n );\n }\n }\n\n watchTransactions(callback: EventCallback<TransactionEvent>): () => void {\n // This is a simplified implementation\n // In practice, you'd need to implement proper transaction watching\n const unwatch = this.publicClient.watchPendingTransactions({\n onTransactions: (hashes) => {\n for (const hash of hashes) {\n // For each transaction, we'd need to fetch details\n // This is a simplified callback - in real implementation you'd fetch transaction details\n callback({\n chainType: 'evm',\n hash,\n from: '', // Would need to fetch transaction details\n to: '', // Would need to fetch transaction details\n value: 0n, // Would need to fetch transaction details\n blockNumber: 0n, // Would need to fetch transaction details\n });\n }\n },\n });\n return unwatch;\n }\n\n isValidAddress(address: string): boolean {\n return isEvmAddress(address);\n }\n\n async getCurrentEpoch(): Promise<bigint> {\n return await this.getBlockNumber();\n }\n\n async generateAccounts(count: number): Promise<string[]> {\n const accounts: string[] = [];\n for (let i = 0; i < count; i++) {\n // Generate random private key and derive address\n const privateKey =\n `0x${'0'.repeat(64 - 2)}${i.toString(16).padStart(2, '0')}${'0'.repeat(60)}` as const;\n const account = privateKeyToAccount(privateKey);\n accounts.push(account.address);\n }\n return accounts;\n }\n}\n\n/**\n * Create an eSpace client instance with all components\n */\nexport async function createEspaceClient(\n config: ClientConfig\n): Promise<EspaceClientInstance> {\n const chainConfig = getChainConfig(config.chainId as SupportedChainId);\n\n if (chainConfig.type !== 'evm') {\n throw new NodeError(\n `Invalid chain type for eSpace client: ${chainConfig.type}`,\n 'INVALID_CHAIN_TYPE',\n 'evm'\n );\n }\n\n // Update config with proper RPC URL if not provided\n const clientConfig: ClientConfig = {\n ...config,\n rpcUrl:\n config.rpcUrl ||\n chainConfig.rpcUrls.default.http[0] ||\n 'http://localhost:8545',\n };\n\n const publicClient = new EspaceClient(clientConfig);\n\n let walletClient: EspaceWalletClient | undefined;\n let testClient: EspaceTestClient | undefined;\n\n if (config.account) {\n let privateKey: string;\n if (typeof config.account === 'string') {\n privateKey = config.account;\n } else {\n privateKey = config.account.privateKey;\n }\n\n const walletConfig: WalletConfig = {\n ...clientConfig,\n privateKey,\n accountIndex:\n typeof config.account === 'object' ? config.account.accountIndex : 0,\n };\n walletClient = new EspaceWalletClient(walletConfig);\n }\n\n if (config.testMode) {\n // Test client needs a private key, use a default one if not provided\n let privateKey: string;\n if (config.account) {\n if (typeof config.account === 'string') {\n privateKey = config.account;\n } else {\n privateKey = config.account.privateKey;\n }\n } else {\n // Default test private key\n privateKey =\n '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';\n }\n\n const testConfig: TestConfig & { privateKey: string } = {\n ...clientConfig,\n enableTestMode: true,\n privateKey,\n };\n testClient = new EspaceTestClient(testConfig);\n }\n\n return {\n publicClient,\n walletClient,\n testClient,\n };\n}\n","/*\n * Copyright 2025 Conflux DevKit Team\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Client Manager - Unified orchestration layer for Conflux DevKit Node\n// Manages both Core and EVM clients with health monitoring and network coordination\n\nimport { EventEmitter } from 'node:events';\nimport { createCoreClient } from '../clients/core.js';\nimport { createEspaceClient } from '../clients/evm.js';\nimport {\n defaultNetworkSelector,\n getChainConfig,\n isValidChainId,\n} from '../config/chains.js';\nimport type {\n ChainType,\n ClientConfig,\n CoreClientInstance,\n EspaceClientInstance,\n HealthStatus,\n SupportedChainId,\n} from '../types/index.js';\n\n// Health check intervals (in milliseconds)\nconst HEALTH_CHECK_INTERVAL = 30000; // 30 seconds\nconst HEALTH_CHECK_TIMEOUT = 5000; // 5 seconds\n\n/**\n * Client Manager Events\n */\nexport interface ClientManagerEvents {\n 'client:ready': [{ type: ChainType; chainId: SupportedChainId }];\n 'client:error': [\n { type: ChainType; chainId: SupportedChainId; error: Error },\n ];\n 'client:health': [\n { type: ChainType; chainId: SupportedChainId; status: HealthStatus },\n ];\n 'server:started': [\n { coreChainId: SupportedChainId; evmChainId: SupportedChainId },\n ];\n 'server:stopped': [];\n 'network:switched': [{ from: SupportedChainId; to: SupportedChainId }];\n 'manager:ready': [];\n 'manager:error': [{ error: Error }];\n}\n\n/**\n * Client Manager Configuration\n */\nexport interface ClientManagerConfig {\n /** Core Space client configuration */\n core: ClientConfig;\n /** eSpace client configuration */\n evm: ClientConfig;\n /** Enable automatic health monitoring */\n enableHealthMonitoring?: boolean;\n /** Health check interval in milliseconds */\n healthCheckInterval?: number;\n /** Health check timeout in milliseconds */\n healthCheckTimeout?: number;\n}\n\n/**\n * Client Manager Status\n */\nexport interface ClientManagerStatus {\n initialized: boolean;\n coreClient: {\n connected: boolean;\n chainId: SupportedChainId;\n health: HealthStatus;\n lastHealthCheck?: Date;\n };\n evmClient: {\n connected: boolean;\n chainId: SupportedChainId;\n health: HealthStatus;\n lastHealthCheck?: Date;\n };\n networkSelector: {\n currentChain: SupportedChainId;\n isLocalNode: boolean;\n lockedToLocal: boolean;\n };\n}\n\n/**\n * Unified Client Manager\n *\n * This is the main orchestration layer that manages:\n * - Core Space and eSpace client instances\n * - Local development server lifecycle\n * - Network switching and chain coordination\n * - Health monitoring and error recovery\n * - Event coordination between components\n *\n * Key Design Principles:\n * 1. **Dual Chain Support**: Manages both Core and eSpace clients simultaneously\n * 2. **Network Awareness**: Automatically switches to local chains when dev server runs\n * 3. **Health Monitoring**: Continuous health checks with automatic recovery\n * 4. **Event Coordination**: Unified event system for all components\n * 5. **Type Safety**: Full TypeScript support with proper error handling\n */\nexport class ClientManager extends EventEmitter<ClientManagerEvents> {\n private config: ClientManagerConfig;\n private coreClient: CoreClientInstance | null = null;\n private evmClient: EspaceClientInstance | null = null;\n private healthCheckInterval: NodeJS.Timeout | null = null;\n private networkSelectorUnsubscribe: (() => void) | null = null;\n private nodeRunningUnsubscribe: (() => void) | null = null;\n private initialized = false;\n\n constructor(config: ClientManagerConfig) {\n super();\n this.config = {\n enableHealthMonitoring: true,\n healthCheckInterval: HEALTH_CHECK_INTERVAL,\n healthCheckTimeout: HEALTH_CHECK_TIMEOUT,\n ...config,\n };\n }\n\n /**\n * Initialize the Client Manager\n * Sets up clients, server, and monitoring\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n // Set up network selector listeners\n this.setupNetworkListeners();\n\n // Initialize clients based on current network selection\n await this.initializeClients();\n\n // Start health monitoring if enabled\n if (this.config.enableHealthMonitoring) {\n this.startHealthMonitoring();\n }\n\n this.initialized = true;\n this.emit('manager:ready');\n } catch (error) {\n const managerError =\n error instanceof Error ? error : new Error(String(error));\n this.emit('manager:error', { error: managerError });\n throw managerError;\n }\n }\n\n /**\n * Gracefully shutdown the Client Manager\n */\n async shutdown(): Promise<void> {\n if (!this.initialized) {\n return;\n }\n\n try {\n // Stop health monitoring\n this.stopHealthMonitoring();\n\n // Clean up network selector listeners\n if (this.networkSelectorUnsubscribe) {\n this.networkSelectorUnsubscribe();\n this.networkSelectorUnsubscribe = null;\n }\n\n if (this.nodeRunningUnsubscribe) {\n this.nodeRunningUnsubscribe();\n this.nodeRunningUnsubscribe = null;\n }\n\n // Clean up clients\n this.coreClient = null;\n this.evmClient = null;\n\n this.initialized = false;\n this.removeAllListeners();\n } catch (error) {\n const shutdownError =\n error instanceof Error ? error : new Error(String(error));\n this.emit('manager:error', { error: shutdownError });\n throw shutdownError;\n }\n }\n\n /**\n * Get current Core Space client\n */\n getCoreClient(): CoreClientInstance | null {\n return this.coreClient;\n }\n\n /**\n * Get current eSpace client\n */\n getEvmClient(): EspaceClientInstance | null {\n return this.evmClient;\n }\n\n /**\n * Get comprehensive status\n */\n getStatus(): ClientManagerStatus {\n const currentChainId = defaultNetworkSelector.getCurrentChainId();\n const currentChain = getChainConfig(currentChainId);\n\n return {\n initialized: this.initialized,\n coreClient: {\n connected: !!this.coreClient,\n chainId:\n currentChain.type === 'core'\n ? currentChainId\n : defaultNetworkSelector.getCorrespondingChainId() || 1,\n health: 'unknown', // TODO: Implement health status tracking\n lastHealthCheck: undefined,\n },\n evmClient: {\n connected: !!this.evmClient,\n chainId:\n currentChain.type === 'evm'\n ? currentChainId\n : defaultNetworkSelector.getCorrespondingChainId() || 71,\n health: 'unknown', // TODO: Implement health status tracking\n lastHealthCheck: undefined,\n },\n networkSelector: {\n currentChain: currentChainId,\n isLocalNode: defaultNetworkSelector.getNodeRunningStatus(),\n lockedToLocal: defaultNetworkSelector.isLockedToLocal(),\n },\n };\n }\n\n /**\n * Switch to a specific network\n * @param chainId - Target chain ID\n * @param force - Force switch even if node is running (for wallet operations)\n */\n async switchNetwork(chainId: SupportedChainId, force = false): Promise<void> {\n if (!isValidChainId(chainId)) {\n throw new Error(`Invalid chain ID: ${chainId}`);\n }\n\n const previousChainId = defaultNetworkSelector.getCurrentChainId();\n\n if (previousChainId === chainId) {\n return; // Already on this chain\n }\n\n // Attempt network switch\n defaultNetworkSelector.switchChain(chainId, force);\n\n // If switch was successful, reinitialize clients\n if (defaultNetworkSelector.getCurrentChainId() === chainId) {\n await this.initializeClients();\n this.emit('network:switched', { from: previousChainId, to: chainId });\n }\n }\n\n /**\n * Initialize or reinitialize client instances based on current network\n */\n private async initializeClients(): Promise<void> {\n const currentChainId = defaultNetworkSelector.getCurrentChainId();\n const currentChain = getChainConfig(currentChainId);\n\n try {\n // Always initialize both clients, but connect them to appropriate chains\n if (currentChain.type === 'core') {\n // Current selection is Core, get corresponding eSpace chain\n const evmChainId =\n defaultNetworkSelector.getCorrespondingChainId() || 71;\n\n this.coreClient = await createCoreClient({\n ...this.config.core,\n chainId: currentChainId,\n });\n\n this.evmClient = await createEspaceClient({\n ...this.config.evm,\n chainId: evmChainId,\n });\n } else {\n // Current selection is eSpace, get corresponding Core chain\n const coreChainId =\n defaultNetworkSelector.getCorrespondingChainId() || 1;\n\n this.coreClient = await createCoreClient({\n ...this.config.core,\n chainId: coreChainId,\n });\n\n this.evmClient = await createEspaceClient({\n ...this.config.evm,\n chainId: currentChainId,\n });\n }\n\n // Emit ready events\n this.emit('client:ready', {\n type: 'core' as ChainType,\n chainId: this.coreClient.publicClient.chainId as SupportedChainId,\n });\n this.emit('client:ready', {\n type: 'evm' as ChainType,\n chainId: this.evmClient.publicClient.chainId as SupportedChainId,\n });\n } catch (error) {\n const clientError =\n error instanceof Error ? error : new Error(String(error));\n this.emit('manager:error', { error: clientError });\n throw clientError;\n }\n }\n\n /**\n * Set up network selector event listeners\n */\n private setupNetworkListeners(): void {\n // Listen for chain changes\n this.networkSelectorUnsubscribe = defaultNetworkSelector.onChainChange(\n async (_chainId) => {\n try {\n await this.initializeClients();\n } catch (error) {\n const networkError =\n error instanceof Error ? error : new Error(String(error));\n this.emit('manager:error', { error: networkError });\n }\n }\n );\n\n // Listen for node running status changes\n this.nodeRunningUnsubscribe = defaultNetworkSelector.onNodeRunningChange(\n async (isRunning) => {\n if (isRunning) {\n // Node started - clients will be reinitialized by chain change event\n } else {\n // Node stopped - clients will be reinitialized by chain change event\n }\n }\n );\n }\n\n /**\n * Start health monitoring for all clients\n */\n private startHealthMonitoring(): void {\n if (this.healthCheckInterval) {\n return; // Already running\n }\n\n this.healthCheckInterval = setInterval(async () => {\n await this.performHealthChecks();\n }, this.config.healthCheckInterval || HEALTH_CHECK_INTERVAL);\n\n // Perform initial health check\n setTimeout(() => this.performHealthChecks(), 1000);\n }\n\n /**\n * Stop health monitoring\n */\n private stopHealthMonitoring(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n\n /**\n * Perform health checks on all clients\n */\n private async performHealthChecks(): Promise<void> {\n const timeout = this.config.healthCheckTimeout || HEALTH_CHECK_TIMEOUT;\n\n // Check Core client health\n if (this.coreClient) {\n try {\n const healthPromise = this.checkCoreClientHealth();\n const result = await Promise.race([\n healthPromise,\n new Promise<HealthStatus>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), timeout)\n ),\n ]);\n\n this.emit('client:health', {\n type: 'core' as ChainType,\n chainId: this.coreClient.publicClient.chainId as SupportedChainId,\n status: result,\n });\n } catch (error) {\n this.emit('client:error', {\n type: 'core' as ChainType,\n chainId: this.coreClient.publicClient.chainId as SupportedChainId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n // Check eSpace client health\n if (this.evmClient) {\n try {\n const healthPromise = this.checkEvmClientHealth();\n const result = await Promise.race([\n healthPromise,\n new Promise<HealthStatus>((_, reject) =>\n setTimeout(() => reject(new Error('Health check timeout')), timeout)\n ),\n ]);\n\n this.emit('client:health', {\n type: 'evm' as ChainType,\n chainId: this.evmClient.publicClient.chainId as SupportedChainId,\n status: result,\n });\n } catch (error) {\n this.emit('client:error', {\n type: 'evm' as ChainType,\n chainId: this.evmClient.publicClient.chainId as SupportedChainId,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n }\n\n /**\n * Check Core client health\n */\n private async checkCoreClientHealth(): Promise<HealthStatus> {\n if (!this.coreClient) {\n return 'disconnected';\n }\n\n try {\n // Simple health check - get latest block number\n await this.coreClient.publicClient.getBlockNumber();\n return 'healthy';\n } catch (_error) {\n return 'unhealthy';\n }\n }\n\n /**\n * Check eSpace client health\n */\n private async checkEvmClientHealth(): Promise<HealthStatus> {\n if (!this.evmClient) {\n return 'disconnected';\n }\n\n try {\n // Simple health check - get latest block number\n await this.evmClient.publicClient.getBlockNumber();\n return 'healthy';\n } catch (_error) {\n return 'unhealthy';\n }\n }\n}\n\n/**\n * Create a new Client Manager instance\n */\nexport function createClientManager(\n config: ClientManagerConfig\n): ClientManager {\n return new ClientManager(config);\n}\n\n// Export types are already exported above\n"],"mappings":"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","names":["defineChain","defineChain","createPublicClient","createTestClient","createWalletClient","defineChain","encodeFunctionData","http","privateKeyToAccount","defineChain","createPublicClient","http","privateKeyToAccount","createWalletClient","encodeFunctionData","createTestClient"]}
|