{"version":3,"sources":["../src/config.ts","../src/index.ts","../src/agent/analytics.ts","../src/mcp/balance/get_balance_tools.ts","../src/mcp/transaction/get_transaction_tools.ts","../src/mcp/block/get_block_tools.ts","../src/mcp/defi/get_defi_tools.ts","../src/mcp/cronosid/get_cronosid_tools.ts","../src/mcp/vvs/get_vvs_tools.ts","../src/mcp/vvs/vvs_analytics.ts","../src/types.ts","../src/mcp/market/get_market_tools.ts","../src/mcp/index.ts"],"sourcesContent":["import { CronosEvm, CronosZkEvm, Client } from '@crypto.com/developer-platform-client';\n\nexport type CronosNetwork = 'cronos-mainnet' | 'cronos-zkevm-mainnet';\n\nexport interface NetworkConfig {\n    name: string;\n    chain: CronosEvm | CronosZkEvm;\n    rpcUrl: string;\n    blockExplorer: string;\n    nativeCurrency: string;\n    apiKeyRequired: boolean;\n}\n\nexport const NETWORK_CONFIGS: Record<CronosNetwork, NetworkConfig> = {\n    'cronos-mainnet': {\n        name: 'Cronos Mainnet',\n        chain: CronosEvm.Mainnet,\n        rpcUrl: 'https://evm.cronos.org',\n        blockExplorer: 'https://cronoscan.com',\n        nativeCurrency: 'CRO',\n        apiKeyRequired: true\n    },\n    'cronos-zkevm-mainnet': {\n        name: 'Cronos zkEVM Mainnet', \n        chain: CronosZkEvm.Mainnet,\n        rpcUrl: 'https://mainnet.zkevm.cronos.org',\n        blockExplorer: 'https://explorer.zkevm.cronos.org',\n        nativeCurrency: 'zkCRO',\n        apiKeyRequired: true\n    }\n};\n\nconst getArgs = () =>\n    process.argv.reduce((args: any, arg: any) => {\n        // long arg\n        if (arg.slice(0, 2) === \"--\") {\n            const longArg = arg.split(\"=\");\n            const longArgFlag = longArg[0].slice(2);\n            const longArgValue = longArg.length > 1 ? longArg[1] : true;\n            args[longArgFlag] = longArgValue;\n        }\n        // flags\n        else if (arg[0] === \"-\") {\n            const flags = arg.slice(1).split(\"\");\n            flags.forEach((flag: any) => {\n                args[flag] = true;\n            });\n        }\n        return args;\n    }, {});\n\nconst getApiKeys = (): { evmKey: string; zkevmKey: string } => {\n    const args = getArgs();\n    \n    return {\n        evmKey: process.env.CRONOS_EVM_API_KEY || args.cronos_evm_api_key || '',\n        zkevmKey: process.env.CRONOS_ZKEVM_API_KEY || args.cronos_zkevm_api_key || ''\n    };\n};\n\nconst determineNetwork = (): CronosNetwork => {\n    const args = getArgs();\n    const { evmKey, zkevmKey } = getApiKeys();\n    \n    // If network is explicitly specified, use it (for override)\n    if (args.network) {\n        const network = args.network as CronosNetwork;\n        if (network in NETWORK_CONFIGS) {\n            return network;\n        }\n        throw new Error(`Invalid network: ${network}. Must be one of: ${Object.keys(NETWORK_CONFIGS).join(', ')}`);\n    }\n    \n    // Auto-detect network based on available API keys\n    if (evmKey && zkevmKey) {\n        // Both keys available, default to Cronos Mainnet\n        console.error('🔑 Both API keys detected, defaulting to Cronos Mainnet');\n        console.error('💡 Use --network=cronos-zkevm-mainnet to use zkEVM instead');\n        return 'cronos-mainnet';\n    } else if (evmKey) {\n        console.error('🔑 Cronos EVM API key detected, using Cronos Mainnet');\n        return 'cronos-mainnet';\n    } else if (zkevmKey) {\n        console.error('🔑 Cronos zkEVM API key detected, using zkEVM Mainnet');\n        return 'cronos-zkevm-mainnet';\n    } else {\n        throw new Error('❌ No API keys provided! Set CRONOS_EVM_API_KEY or CRONOS_ZKEVM_API_KEY');\n    }\n};\n\nconst getApiKeyForNetwork = (network: CronosNetwork): string => {\n    const { evmKey, zkevmKey } = getApiKeys();\n    return network === 'cronos-mainnet' ? evmKey : zkevmKey;\n};\n\n// Initialize configuration\nexport const network = determineNetwork();\nexport const networkInfo = NETWORK_CONFIGS[network];\nexport const apiKey = getApiKeyForNetwork(network);\n\n// Initialize Cronos Client\nif (apiKey) {\n    Client.init({\n        chain: networkInfo.chain,\n        apiKey: apiKey\n    } as any);\n} else {\n    console.warn(`⚠️ No API key provided for ${network}. Some features may be limited.`);\n}\n\nexport function validateEnvironment(): void {\n    try {\n        const { evmKey, zkevmKey } = getApiKeys();\n        const keyType = network === 'cronos-mainnet' ? 'CRONOS_EVM_API_KEY' : 'CRONOS_ZKEVM_API_KEY';\n        \n        console.error(`✅ Cronos MCP environment configuration valid`);\n        console.error(`📍 Active Network: ${networkInfo.name}`);\n        console.error(`📍 RPC URL: ${networkInfo.rpcUrl}`);\n        console.error(`📍 Block Explorer: ${networkInfo.blockExplorer}`);\n        console.error(`📍 Native Currency: ${networkInfo.nativeCurrency}`);\n        \n        if (apiKey) {\n            console.error(`📍 Active API Key (${keyType}): ****${apiKey.slice(-4)}`);\n        }\n        \n        // Show availability of both networks\n        console.error(`🌐 Network Availability:`);\n        console.error(`   • Cronos Mainnet: ${evmKey ? '✅ Available' : '❌ Missing CRONOS_EVM_API_KEY'}`);\n        console.error(`   • zkEVM Mainnet: ${zkevmKey ? '✅ Available' : '❌ Missing CRONOS_ZKEVM_API_KEY'}`);\n        \n    } catch (error) {\n        console.error('❌ Invalid environment configuration:', error);\n        throw error;\n    }\n}\n\n// Helper function to create client for different network\nexport function initializeClientForNetwork(targetNetwork: CronosNetwork): void {\n    const config = NETWORK_CONFIGS[targetNetwork];\n    const key = getApiKeyForNetwork(targetNetwork);\n    \n    if (key) {\n        Client.init({\n            chain: config.chain,\n            apiKey: key\n        } as any);\n        console.error(`🔄 Switched to ${config.name} with API key ****${key.slice(-4)}`);\n    } else {\n        const requiredKey = targetNetwork === 'cronos-mainnet' ? 'CRONOS_EVM_API_KEY' : 'CRONOS_ZKEVM_API_KEY';\n        throw new Error(`Missing ${requiredKey} for ${config.name}`);\n    }\n}\n\n// Helper to get all available API keys for validation\nexport function getAllApiKeys(): Record<CronosNetwork, string> {\n    const { evmKey, zkevmKey } = getApiKeys();\n    return {\n        'cronos-mainnet': evmKey,\n        'cronos-zkevm-mainnet': zkevmKey\n    };\n}\n\n// Helper to check if network switching is possible\nexport function canSwitchToNetwork(targetNetwork: CronosNetwork): boolean {\n    return !!getApiKeyForNetwork(targetNetwork);\n}\n\n// Helper to get available networks\nexport function getAvailableNetworks(): CronosNetwork[] {\n    const { evmKey, zkevmKey } = getApiKeys();\n    const available: CronosNetwork[] = [];\n    \n    if (evmKey) available.push('cronos-mainnet');\n    if (zkevmKey) available.push('cronos-zkevm-mainnet');\n    \n    return available;\n}\n","#!/usr/bin/env node\n\nimport { validateEnvironment, getAllApiKeys, getAvailableNetworks } from \"./config\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CronosAnalyticsAgent } from \"./agent/analytics\";\nimport { CronosAnalyticsTools, TOOL_COUNT } from \"./mcp\";\n\n/**\n * Creates an MCP server for Cronos Web3 Analytics\n * Supports both Cronos Mainnet and zkEVM Mainnet\n * Provides comprehensive analytics without requiring private keys\n */\nfunction createCronosMcpServer(agent: CronosAnalyticsAgent) {\n    // Create MCP server instance\n    const server = new McpServer({\n        name: \"cronos-mcp\",\n        version: \"0.1.0\"\n    });\n\n    // Register all analytics tools\n    for (const [toolKey, tool] of Object.entries(CronosAnalyticsTools)) {\n        server.tool(tool.name, tool.description, tool.schema, async (params: any): Promise<any> => {\n            try {\n                // Execute the handler with the agent and params\n                const result = await tool.handler(agent, params);\n\n                // Format the result as MCP tool response\n                return {\n                    content: [\n                        {\n                            type: \"text\",\n                            text: JSON.stringify(result, null, 2),\n                        },\n                    ],\n                };\n            } catch (error) {\n                console.error(`Tool execution error [${tool.name}]:`, error);\n                // Handle errors in MCP format\n                return {\n                    isError: true,\n                    content: [\n                        {\n                            type: \"text\",\n                            text: error instanceof Error\n                                ? error.message\n                                : \"Unknown error occurred\",\n                        },\n                    ],\n                };\n            }\n        });\n    }\n\n    console.error(`✅ Registered ${TOOL_COUNT} Cronos analytics tools`);\n    return server;\n}\n\nasync function main() {\n    try {\n        console.error(\"🔍 Starting Cronos Analytics MCP Server...\");\n\n        // Validate environment before proceeding\n        validateEnvironment();\n\n        // Check available networks\n        const availableNetworks = getAvailableNetworks();\n        \n        if (availableNetworks.length === 0) {\n            console.error('❌ No API keys found for any network!');\n            console.error('💡 Please set CRONOS_EVM_API_KEY and/or CRONOS_ZKEVM_API_KEY');\n            process.exit(1);\n        }\n\n        // Create Cronos Analytics agent \n        const cronosAgent = new CronosAnalyticsAgent();\n\n        // Create and start MCP server\n        const server = createCronosMcpServer(cronosAgent);\n        const transport = new StdioServerTransport();\n        await server.connect(transport);\n\n        console.error(\"✅ Cronos Analytics MCP Server is running!\");\n        console.error(\"🔧 Available capabilities:\");\n        console.error(\"   • Native token balance analytics (CRO/zkCRO)\");\n        console.error(\"   • ERC20 token analytics with VVS pricing\");\n        console.error(\"   • Advanced wallet analytics & batch queries\");\n        console.error(\"   • Transaction & block analysis\");\n        console.error(\"   • DeFi protocols (VVS Finance, H2 Finance)\");\n        console.error(\"   • VVS Finance DEX integration (top DEX on Cronos)\");\n        console.error(\"   • CronosId domain resolution (.cro)\");\n        console.error(\"   • Exchange market data\");\n        console.error(`   • ${availableNetworks.length === 2 ? 'Multi-network' : 'Single-network'} support`);\n        \n        if (availableNetworks.length === 2) {\n            console.error(\"🌐 Cross-network analytics enabled!\");\n        } else {\n            const hasEvm = availableNetworks.includes('cronos-mainnet');\n            const missingNetwork = hasEvm ? 'zkEVM Mainnet' : 'Cronos Mainnet';\n            const missingKey = hasEvm ? 'CRONOS_ZKEVM_API_KEY' : 'CRONOS_EVM_API_KEY';\n            console.error(`💡 Add ${missingKey} to enable ${missingNetwork} analytics`);\n        }\n\n    } catch (error) {\n        console.error('❌ Error starting Cronos Analytics MCP server:', error);\n        process.exit(1);\n    }\n}\n\nmain();\n","import { Token, Wallet, Block, Transaction, Exchange, Defi, CronosId } from \"@crypto.com/developer-platform-client\";\nimport { DefiProtocol } from \"@crypto.com/developer-platform-client\";\nimport { networkInfo, apiKey, initializeClientForNetwork, canSwitchToNetwork, type CronosNetwork } from '../config';\nimport type { AnalyticsResponse, TokenBalance, TransactionData, NetworkStats } from '../types';\n\nexport class CronosAnalyticsAgent {\n    public network: CronosNetwork;\n    public networkInfo: typeof networkInfo;\n\n    constructor(targetNetwork?: CronosNetwork) {\n        this.network = targetNetwork || 'cronos-mainnet';\n        this.networkInfo = networkInfo;\n\n        // Initialize client for target network if different\n        if (targetNetwork && targetNetwork !== this.network) {\n            if (canSwitchToNetwork(targetNetwork)) {\n                initializeClientForNetwork(targetNetwork);\n                this.network = targetNetwork;\n            } else {\n                const requiredKey = targetNetwork === 'cronos-mainnet' ? 'CRONOS_EVM_API_KEY' : 'CRONOS_ZKEVM_API_KEY';\n                console.warn(`⚠️ Cannot switch to ${targetNetwork}: Missing ${requiredKey}`);\n                console.warn(`📍 Continuing with default network: ${this.network}`);\n            }\n        }\n\n        console.error(`🔍 Cronos Analytics Agent initialized for ${this.network}`);\n        console.error(`📍 Network: ${this.networkInfo.name}`);\n        console.error(`🔗 Block Explorer: ${this.networkInfo.blockExplorer}`);\n    }\n\n    // === BALANCE & TOKEN ANALYTICS ===\n\n    async getNativeTokenBalance(address: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Token.getNativeTokenBalance(address);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    currency: this.networkInfo.nativeCurrency\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get native balance',\n                network: this.network\n            };\n        }\n    }\n\n    async getERC20TokenBalance(address: string, contractAddress: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Token.getERC20TokenBalance(address, contractAddress);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    contractAddress\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get ERC20 balance',\n                network: this.network\n            };\n        }\n    }\n\n    async getWalletOverview(address: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Wallet.balance(address);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    address\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get wallet overview',\n                network: this.network\n            };\n        }\n    }\n\n    // === TRANSACTION ANALYTICS ===\n\n    async getTransactionByHash(transactionHash: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Transaction.getTransactionByHash(transactionHash);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    blockExplorer: `${this.networkInfo.blockExplorer}/tx/${transactionHash}`\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get transaction details',\n                network: this.network\n            };\n        }\n    }\n\n    async getTransactionStatus(transactionHash: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Transaction.getTransactionStatus(transactionHash);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    transactionHash\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get transaction status',\n                network: this.network\n            };\n        }\n    }\n\n    // === BLOCK ANALYTICS ===\n\n    async getCurrentBlock(): Promise<AnalyticsResponse> {\n        try {\n            const result = await Block.getCurrentBlock();\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get current block',\n                network: this.network\n            };\n        }\n    }\n\n    async getBlockByTag(blockTag: string, includeTransactions: boolean = false): Promise<AnalyticsResponse> {\n        try {\n            const result = await Block.getBlockByTag(blockTag, includeTransactions ? 'true' : 'false');\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    blockTag,\n                    includeTransactions\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get block data',\n                network: this.network\n            };\n        }\n    }\n\n    // === DEFI ANALYTICS ===\n\n    async getWhitelistedTokens(protocol: DefiProtocol): Promise<AnalyticsResponse> {\n        try {\n            const result = await Defi.getWhitelistedTokens(protocol);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    protocol\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get whitelisted tokens',\n                network: this.network\n            };\n        }\n    }\n\n    async getAllFarms(protocol: DefiProtocol): Promise<AnalyticsResponse> {\n        try {\n            const result = await Defi.getAllFarms(protocol);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    protocol\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get farms',\n                network: this.network\n            };\n        }\n    }\n\n    async getFarmBySymbol(protocol: DefiProtocol, symbol: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Defi.getFarmBySymbol(protocol, symbol);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    protocol,\n                    symbol\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get farm data',\n                network: this.network\n            };\n        }\n    }\n\n    // === CRONOS ID ANALYTICS ===\n\n    async resolveCronosId(cronosId: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await CronosId.forwardResolve(cronosId);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    cronosId\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to resolve CronosId',\n                network: this.network\n            };\n        }\n    }\n\n    async reverseResolveCronosId(address: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await CronosId.reverseResolve(address);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    address\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to reverse resolve address',\n                network: this.network\n            };\n        }\n    }\n\n    // === EXCHANGE & MARKET ANALYTICS ===\n\n    async getAllTickers(): Promise<AnalyticsResponse> {\n        try {\n            const result = await Exchange.getAllTickers();\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    exchangeInfo: 'Crypto.com Exchange data'\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get exchange tickers',\n                network: this.network\n            };\n        }\n    }\n\n    async getTickerByInstrument(instrument: string): Promise<AnalyticsResponse> {\n        try {\n            const result = await Exchange.getTickerByInstrument(instrument);\n            return {\n                status: 'success',\n                data: {\n                    ...result.data,\n                    network: this.network,\n                    instrument\n                },\n                network: this.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get ticker data',\n                network: this.network\n            };\n        }\n    }\n\n    // === UTILITY METHODS ===\n\n    getNetworkInfo(): AnalyticsResponse {\n        return {\n            status: 'success',\n            data: {\n                network: this.network,\n                name: this.networkInfo.name,\n                rpcUrl: this.networkInfo.rpcUrl,\n                blockExplorer: this.networkInfo.blockExplorer,\n                nativeCurrency: this.networkInfo.nativeCurrency,\n                hasApiKey: !!apiKey,\n                canSwitchNetworks: {\n                    'cronos-mainnet': canSwitchToNetwork('cronos-mainnet'),\n                    'cronos-zkevm-mainnet': canSwitchToNetwork('cronos-zkevm-mainnet')\n                }\n            },\n            network: this.network,\n            timestamp: Date.now()\n        };\n    }\n\n    // Format large numbers for better readability\n    formatBalance(balance: string, decimals: number = 18): string {\n        const balanceNum = parseFloat(balance) / Math.pow(10, decimals);\n        if (balanceNum >= 1e9) return `${(balanceNum / 1e9).toFixed(2)}B`;\n        if (balanceNum >= 1e6) return `${(balanceNum / 1e6).toFixed(2)}M`;\n        if (balanceNum >= 1e3) return `${(balanceNum / 1e3).toFixed(2)}K`;\n        return balanceNum.toFixed(4);\n    }\n\n    // Validate Ethereum address format\n    isValidAddress(address: string): boolean {\n        return /^0x[a-fA-F0-9]{40}$/.test(address);\n    }\n\n    // Validate transaction hash format\n    isValidTxHash(hash: string): boolean {\n        return /^0x[a-fA-F0-9]{64}$/.test(hash);\n    }\n\n    // Validate CronosId format\n    isValidCronosId(name: string): boolean {\n        return CronosId.isCronosId(name);\n    }\n}\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetNativeBalanceTool: McpTool = {\n    name: \"cronos_get_native_balance\",\n    description: \"Get native token balance (CRO/zkCRO) for any address on Cronos networks\",\n    schema: {\n        address: z.string()\n            .describe(\"Wallet address to check balance for (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid Ethereum address\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getNativeTokenBalance(input.address);\n            \n            return {\n                status: \"success\",\n                message: `✅ Native balance retrieved for ${input.address}`,\n                data: {\n                    address: input.address,\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/address/${input.address}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get native balance: ${error.message}`);\n        }\n    }\n};\n\nexport const GetERC20BalanceTool: McpTool = {\n    name: \"cronos_get_erc20_balance\",\n    description: \"Get ERC20 token balance for any address and token contract on Cronos networks\",\n    schema: {\n        address: z.string()\n            .describe(\"Wallet address to check balance for (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid Ethereum address\"),\n        contractAddress: z.string()\n            .describe(\"ERC20 token contract address (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid contract address\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getERC20TokenBalance(input.address, input.contractAddress);\n            \n            return {\n                status: \"success\",\n                message: `✅ ERC20 balance retrieved for ${input.address}`,\n                data: {\n                    address: input.address,\n                    contractAddress: input.contractAddress,\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/token/${input.contractAddress}?a=${input.address}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get ERC20 balance: ${error.message}`);\n        }\n    }\n};\n\nexport const GetWalletOverviewTool: McpTool = {\n    name: \"cronos_get_wallet_overview\",\n    description: \"Get comprehensive wallet overview including all token balances and portfolio summary\",\n    schema: {\n        address: z.string()\n            .describe(\"Wallet address to analyze (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid Ethereum address\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getWalletOverview(input.address);\n            \n            return {\n                status: \"success\",\n                message: `✅ Wallet overview retrieved for ${input.address}`,\n                data: {\n                    address: input.address,\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/address/${input.address}`,\n                    analytics: {\n                        totalTokens: result.data?.tokens?.length || 0,\n                        hasActivity: result.data?.transactionCount > 0\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get wallet overview: ${error.message}`);\n        }\n    }\n};\n\nexport const GetNetworkInfoTool: McpTool = {\n    name: \"cronos_get_network_info\",\n    description: \"Get current network information and statistics\",\n    schema: {\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = targetAgent.getNetworkInfo();\n            \n            return {\n                status: \"success\",\n                message: `✅ Network information retrieved`,\n                data: {\n                    ...result.data,\n                    capabilities: [\n                        \"Native token balance queries\",\n                        \"ERC20 token analytics\", \n                        \"Transaction analysis\",\n                        \"Contract information\",\n                        \"Exchange data integration\"\n                    ]\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get network info: ${error.message}`);\n        }\n    }\n};\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetTransactionTool: McpTool = {\n    name: \"cronos_get_transaction\",\n    description: \"Get detailed transaction information by transaction hash\",\n    schema: {\n        transactionHash: z.string()\n            .describe(\"Transaction hash to look up (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{64}$/, \"Must be a valid transaction hash\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getTransactionByHash(input.transactionHash);\n            \n            return {\n                status: \"success\",\n                message: `✅ Transaction details retrieved`,\n                data: {\n                    transactionHash: input.transactionHash,\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/tx/${input.transactionHash}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get transaction: ${error.message}`);\n        }\n    }\n};\n\nexport const GetTransactionStatusTool: McpTool = {\n    name: \"cronos_get_transaction_status\",\n    description: \"Get transaction confirmation status and details\",\n    schema: {\n        transactionHash: z.string()\n            .describe(\"Transaction hash to check status (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{64}$/, \"Must be a valid transaction hash\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getTransactionStatus(input.transactionHash);\n            \n            return {\n                status: \"success\",\n                message: `✅ Transaction status retrieved`,\n                data: {\n                    transactionHash: input.transactionHash,\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/tx/${input.transactionHash}`,\n                    statusSummary: {\n                        isConfirmed: result.data?.status === 'confirmed',\n                        isPending: result.data?.status === 'pending',\n                        hasFailed: result.data?.status === 'failed'\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get transaction status: ${error.message}`);\n        }\n    }\n};\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetCurrentBlockTool: McpTool = {\n    name: \"cronos_get_current_block\",\n    description: \"Get the current latest block number and information\",\n    schema: {\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getCurrentBlock();\n            \n            return {\n                status: \"success\",\n                message: `✅ Current block information retrieved`,\n                data: {\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/block/${result.data?.blockNumber || 'latest'}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get current block: ${error.message}`);\n        }\n    }\n};\n\nexport const GetBlockByTagTool: McpTool = {\n    name: \"cronos_get_block_by_tag\",\n    description: \"Get block information by block number, 'latest', or 'pending'\",\n    schema: {\n        blockTag: z.string()\n            .describe(\"Block identifier ('latest', 'pending', or block number in hex like '0x1b4')\"),\n        includeTransactions: z.boolean()\n            .optional()\n            .describe(\"Include full transaction details (default: false)\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getBlockByTag(input.blockTag, input.includeTransactions || false);\n            \n            return {\n                status: \"success\",\n                message: `✅ Block data retrieved for ${input.blockTag}`,\n                data: {\n                    ...result.data,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/block/${input.blockTag}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get block data: ${error.message}`);\n        }\n    }\n};\n","import { z } from \"zod\";\nimport { DefiProtocol } from \"@crypto.com/developer-platform-client\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetAllFarmsTool: McpTool = {\n    name: \"cronos_get_all_farms\",\n    description: \"Get all yield farms for DeFi protocols with APR/APY data\",\n    schema: {\n        protocol: z.enum(['h2finance', 'vvsfinance'])\n            .describe(\"DeFi protocol to query\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const protocol = input.protocol === 'h2finance' ? DefiProtocol.H2 : DefiProtocol.VVS;\n            const result = await targetAgent.getAllFarms(protocol);\n            \n            const farms = Array.isArray(result.data) ? result.data : [];\n            const activeFarms = farms.filter((farm: any) => !farm.isFinished);\n            \n            return {\n                status: \"success\",\n                message: `✅ Farm data retrieved for ${input.protocol}`,\n                data: {\n                    ...result.data,\n                    protocol: input.protocol,\n                    summary: {\n                        totalFarms: farms.length,\n                        activeFarms: activeFarms.length,\n                        finishedFarms: farms.length - activeFarms.length,\n                        averageAPR: activeFarms.length > 0 \n                            ? activeFarms.reduce((sum: number, farm: any) => sum + (farm.baseApr || 0), 0) / activeFarms.length\n                            : 0\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get farms: ${error.message}`);\n        }\n    }\n};\n\nexport const GetFarmBySymbolTool: McpTool = {\n    name: \"cronos_get_farm_by_symbol\",\n    description: \"Get specific farm details by LP symbol\",\n    schema: {\n        protocol: z.enum(['h2finance', 'vvsfinance'])\n            .describe(\"DeFi protocol to query\"),\n        symbol: z.string()\n            .describe(\"LP symbol to query (e.g., 'zkCRO-MOON', 'CRO-USDC')\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const protocol = input.protocol === 'h2finance' ? DefiProtocol.H2 : DefiProtocol.VVS;\n            const result = await targetAgent.getFarmBySymbol(protocol, input.symbol);\n            \n            return {\n                status: \"success\",\n                message: `✅ Farm details retrieved for ${input.symbol}`,\n                data: {\n                    ...result.data,\n                    protocol: input.protocol,\n                    symbol: input.symbol,\n                    yieldInfo: {\n                        baseAPR: result.data?.baseApr || 0,\n                        baseAPY: result.data?.baseApy || 0,\n                        lpAPR: result.data?.lpApr || 0,\n                        lpAPY: result.data?.lpApy || 0,\n                        isActive: !result.data?.isFinished,\n                        rewardEndDate: result.data?.rewardEndAt\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get farm data: ${error.message}`);\n        }\n    }\n};\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const ResolveCronosIdTool: McpTool = {\n    name: \"cronos_resolve_cronosid\",\n    description: \"Resolve a CronosId (like alice.cro) to its wallet address\",\n    schema: {\n        cronosId: z.string()\n            .describe(\"CronosId to resolve (e.g., 'alice.cro')\")\n            .regex(/^[a-zA-Z0-9_-]+\\.cro$/, \"Must be a valid CronosId ending with .cro\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            if (!targetAgent.isValidCronosId(input.cronosId)) {\n                throw new Error(\"Invalid CronosId format. Must end with .cro\");\n            }\n\n            const result = await targetAgent.resolveCronosId(input.cronosId);\n            \n            return {\n                status: \"success\",\n                message: `✅ CronosId resolved: ${input.cronosId}`,\n                data: {\n                    cronosId: input.cronosId,\n                    ...result.data,\n                    blockExplorer: result.data?.address \n                        ? `${targetAgent.networkInfo.blockExplorer}/address/${result.data.address}`\n                        : undefined\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to resolve CronosId: ${error.message}`);\n        }\n    }\n};\n\nexport const ReverseResolveCronosIdTool: McpTool = {\n    name: \"cronos_reverse_resolve_cronosid\",\n    description: \"Look up the CronosId associated with a wallet address\",\n    schema: {\n        address: z.string()\n            .describe(\"Wallet address to reverse resolve (0x...)\")\n            .regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid Ethereum address\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.reverseResolveCronosId(input.address);\n            \n            return {\n                status: \"success\",\n                message: `✅ Address reverse resolved: ${input.address}`,\n                data: {\n                    address: input.address,\n                    ...result.data,\n                    hasCronosId: !!result.data?.name,\n                    blockExplorer: `${targetAgent.networkInfo.blockExplorer}/address/${input.address}`\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to reverse resolve address: ${error.message}`);\n        }\n    }\n};\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { VVSAnalytics } from \"./vvs_analytics\";\nimport { type McpTool, AddressSchema, NetworkSchema } from \"../../types\";\n\nexport const GetVVSSupplyTool: McpTool = {\n    name: \"cronos_get_vvs_supply\",\n    description: \"Get VVS token supply information (total, circulating, burned)\",\n    schema: {\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getSupplyInfo();\n            \n            return {\n                status: \"success\",\n                message: `✅ VVS supply information retrieved`,\n                data: {\n                    ...result.data,\n                    protocol: \"VVS Finance\",\n                    dex: \"Leading DEX on Cronos\"\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get VVS supply info: ${error.message}`);\n        }\n    }\n};\n\nexport const GetVVSSummaryTool: McpTool = {\n    name: \"cronos_get_vvs_summary\",\n    description: \"Get VVS DEX summary with top trading pairs and liquidity data\",\n    schema: {\n        limit: z.number()\n            .optional()\n            .describe(\"Limit number of pairs returned (default: 50, max: 1000)\") \n            .default(50),\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getSummary(input.limit || 50);\n            \n            return {\n                status: \"success\",\n                message: `✅ VVS DEX summary retrieved`,\n                data: {\n                    ...result.data,\n                    protocol: \"VVS Finance\",\n                    description: \"Top DEX on Cronos network\",\n                    wcroInfo: {\n                        address: \"0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23\",\n                        note: \"CRO is represented as WCRO in pairs\"\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get VVS summary: ${error.message}`);\n        }\n    }\n};\n\nexport const GetVVSTokensTool: McpTool = {\n    name: \"cronos_get_vvs_tokens\",\n    description: \"Get all tokens available on VVS with price information\",\n    schema: {\n        limit: z.number()\n            .optional()\n            .describe(\"Limit number of tokens returned (default: 100, max: 1000)\") \n            .default(100),\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getTokens(input.limit || 100);\n            \n            return {\n                status: \"success\",\n                message: `✅ VVS tokens retrieved`,\n                data: {\n                    ...result.data,\n                    protocol: \"VVS Finance\",\n                    wcroInfo: {\n                        address: \"0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23\",\n                        note: \"Canonical WCRO address used by VVS\"\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get VVS tokens: ${error.message}`);\n        }\n    }\n};\n\nexport const GetVVSTokenInfoTool: McpTool = {\n    name: \"cronos_get_vvs_token_info\",\n    description: \"Get specific token information from VVS including USD and CRO prices\",\n    schema: {\n        tokenAddress: AddressSchema\n            .describe(\"Token contract address (0x...)\"),\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getTokenInfo(input.tokenAddress);\n            \n            return {\n                status: \"success\",\n                message: `✅ VVS token info retrieved for ${input.tokenAddress}`,\n                data: {\n                    ...result.data,\n                    protocol: \"VVS Finance\",\n                    tokenAddress: input.tokenAddress\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get VVS token info: ${error.message}`);\n        }\n    }\n};\n\nexport const GetVVSPairsTool: McpTool = {\n    name: \"cronos_get_vvs_pairs\",\n    description: \"Get all trading pairs on VVS with detailed liquidity and volume data\",\n    schema: {\n        limit: z.number()\n            .optional()\n            .describe(\"Limit number of pairs returned (default: 100, max: 1000)\") \n            .default(100),\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getPairs(input.limit || 100);\n            \n            return {\n                status: \"success\",\n                message: `✅ VVS trading pairs retrieved`,\n                data: {\n                    ...result.data,\n                    protocol: \"VVS Finance\",\n                    dexInfo: {\n                        type: \"Automated Market Maker (AMM)\",\n                        chainName: targetAgent.networkInfo.name,\n                        wcroAddress: \"0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23\"\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get VVS pairs: ${error.message}`);\n        }\n    }\n};\n\nexport const GetVVSTopPairsTool: McpTool = {\n    name: \"cronos_get_vvs_top_pairs\",\n    description: \"Get top VVS trading pairs by liquidity with analytics\",\n    schema: {\n        limit: z.number()\n            .optional()\n            .describe(\"Number of top pairs to return (default: 10, max: 50)\")\n            .default(10),\n        sortBy: z.enum(['liquidity', 'volume'])\n            .optional()\n            .describe(\"Sort criteria (default: liquidity)\"),\n        network: NetworkSchema.optional()\n            .describe(\"Network to query (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const vvsAnalytics = new VVSAnalytics(targetAgent);\n            const result = await vvsAnalytics.getPairs(1000); // Get all pairs first\n            \n            if (result.status !== 'success' || !result.data?.pairs) {\n                throw new Error('Failed to fetch pairs data');\n            }\n\n            const sortBy = input.sortBy || 'liquidity';\n            const limit = input.limit || 10;\n            \n            const sortedPairs = result.data.pairs.sort((a: any, b: any) => {\n                if (sortBy === 'volume') {\n                    return (b.baseVolume + b.quoteVolume) - (a.baseVolume + a.quoteVolume);\n                }\n                return b.liquidityUSD - a.liquidityUSD;\n            }).slice(0, limit);\n\n            const analytics = {\n                totalLiquidityInTopPairs: sortedPairs.reduce((sum: number, pair: any) => sum + pair.liquidityUSD, 0),\n                totalVolumeInTopPairs: sortedPairs.reduce((sum: number, pair: any) => sum + pair.baseVolume + pair.quoteVolume, 0),\n                wcroWallets: sortedPairs.filter((pair: any) => pair.hasWCRO).length,\n                stablePairs: sortedPairs.filter((pair: any) => pair.isStablePair).length,\n                averageLiquidity: sortedPairs.reduce((sum: number, pair: any) => sum + pair.liquidityUSD, 0) / sortedPairs.length\n            };\n            \n            return {\n                status: \"success\",\n                message: `✅ Top ${limit} VVS pairs retrieved (sorted by ${sortBy})`,\n                data: {\n                    pairs: sortedPairs,\n                    analytics,\n                    sortBy,\n                    limit,\n                    protocol: \"VVS Finance\",\n                    updated_at: result.data.updated_at,\n                    network: targetAgent.network\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get top VVS pairs: ${error.message}`);\n        }\n    }\n};\n","import axios from 'axios';\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport type { AnalyticsResponse } from '../../types';\n\nconst VVS_API_BASE = 'https://api.vvs.finance/info/api';\n\nexport class VVSAnalytics {\n    private agent: CronosAnalyticsAgent;\n\n    constructor(agent: CronosAnalyticsAgent) {\n        this.agent = agent;\n    }\n\n    async getSupplyInfo(): Promise<AnalyticsResponse> {\n        try {\n            const response = await axios.get(`${VVS_API_BASE}/supply`);\n            const data = response.data;\n\n            return {\n                status: 'success',\n                data: {\n                    ...data,\n                    network: this.agent.network,\n                    formatted: {\n                        totalSupply: this.formatTokenAmount(data.totalSupply),\n                        circulatingSupply: this.formatTokenAmount(data.circulatingSupply),\n                        burnedSupply: this.formatTokenAmount(data.burnedSupply),\n                        burnRate: ((parseFloat(data.burnedSupply) / parseFloat(data.totalSupply)) * 100).toFixed(2) + '%'\n                    }\n                },\n                network: this.agent.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get VVS supply info',\n                network: this.agent.network\n            };\n        }\n    }\n\n    async getSummary(limit?: number): Promise<AnalyticsResponse> {\n        try {\n            const response = await axios.get(`${VVS_API_BASE}/summary`);\n            const data = response.data;\n\n            let pairs = Object.entries(data.data || {});\n            if (limit && pairs.length > limit) {\n                pairs = pairs.slice(0, limit);\n            }\n\n            const pairAnalysis = pairs.map(([pairId, pairData]: [string, any]) => ({\n                pairId,\n                ...pairData,\n                tokens: pairId.split('_'),\n                liquidityUSD: parseFloat(pairData.liquidity || '0'),\n                liquidityCRO: parseFloat(pairData.liquidity_CRO || '0'),\n                volume24hUSD: parseFloat(pairData.base_volume || '0') + parseFloat(pairData.quote_volume || '0')\n            }));\n\n            const totalLiquidityUSD = pairAnalysis.reduce((sum, pair) => sum + pair.liquidityUSD, 0);\n            const totalVolume24h = pairAnalysis.reduce((sum, pair) => sum + pair.volume24hUSD, 0);\n\n            return {\n                status: 'success',\n                data: {\n                    updated_at: data.updated_at,\n                    pairs: pairAnalysis,\n                    network: this.agent.network,\n                    summary: {\n                        totalPairs: pairAnalysis.length,\n                        totalLiquidityUSD: totalLiquidityUSD,\n                        totalVolume24hUSD: totalVolume24h,\n                        averageLiquidityPerPair: totalLiquidityUSD / pairAnalysis.length,\n                        topPairByLiquidity: pairAnalysis.sort((a, b) => b.liquidityUSD - a.liquidityUSD)[0]?.pairId\n                    }\n                },\n                network: this.agent.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get VVS summary',\n                network: this.agent.network\n            };\n        }\n    }\n\n    async getTokens(limit?: number): Promise<AnalyticsResponse> {\n        try {\n            const response = await axios.get(`${VVS_API_BASE}/tokens`);\n            const data = response.data;\n\n            let tokens = Object.entries(data.data || {});\n            if (limit && tokens.length > limit) {\n                tokens = tokens.slice(0, limit);\n            }\n\n            const tokenAnalysis = tokens.map(([address, tokenData]: [string, any]) => ({\n                address,\n                ...tokenData,\n                priceUSD: parseFloat(tokenData.price || '0'),\n                priceCRO: parseFloat(tokenData.price_CRO || '0'),\n                isWCRO: address.toLowerCase() === '0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23'\n            }));\n\n            const wcroToken = tokenAnalysis.find(token => token.isWCRO);\n\n            return {\n                status: 'success',\n                data: {\n                    updated_at: data.updated_at,\n                    tokens: tokenAnalysis,\n                    network: this.agent.network,\n                    summary: {\n                        totalTokens: tokenAnalysis.length,\n                        wcroPrice: wcroToken?.priceUSD || 0,\n                        wcroAddress: '0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23',\n                        tokensWithUSDPrice: tokenAnalysis.filter(t => t.priceUSD > 0).length,\n                        tokensWithCROPrice: tokenAnalysis.filter(t => t.priceCRO > 0).length\n                    }\n                },\n                network: this.agent.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get VVS tokens',\n                network: this.agent.network\n            };\n        }\n    }\n\n    async getTokenInfo(tokenAddress: string): Promise<AnalyticsResponse> {\n        try {\n            const response = await axios.get(`${VVS_API_BASE}/tokens/${tokenAddress}`);\n            const data = response.data;\n\n            const isWCRO = tokenAddress.toLowerCase() === '0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23';\n\n            return {\n                status: 'success',\n                data: {\n                    ...data.data,\n                    address: tokenAddress,\n                    updated_at: data.updated_at,\n                    network: this.agent.network,\n                    priceUSD: parseFloat(data.data?.price || '0'),\n                    priceCRO: parseFloat(data.data?.price_CRO || '0'),\n                    isWCRO,\n                    blockExplorer: `${this.agent.networkInfo.blockExplorer}/token/${tokenAddress}`\n                },\n                network: this.agent.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get token info',\n                network: this.agent.network\n            };\n        }\n    }\n\n    async getPairs(limit?: number): Promise<AnalyticsResponse> {\n        try {\n            const response = await axios.get(`${VVS_API_BASE}/pairs`);\n            const data = response.data;\n\n            let pairs = Object.entries(data.data || {});\n            if (limit && pairs.length > limit) {\n                pairs = pairs.slice(0, limit);\n            }\n\n            const pairAnalysis = pairs.map(([pairId, pairData]: [string, any]) => ({\n                pairId,\n                ...pairData,\n                tokens: pairId.split('_'),\n                liquidityUSD: parseFloat(pairData.liquidity || '0'),\n                liquidityCRO: parseFloat(pairData.liquidity_CRO || '0'),\n                baseVolume: parseFloat(pairData.base_volume || '0'),\n                quoteVolume: parseFloat(pairData.quote_volume || '0'),\n                price: parseFloat(pairData.price || '0'),\n                hasWCRO: pairId.includes('0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23'),\n                isStablePair: this.isStablePair(pairData)\n            }));\n\n            const totalLiquidityUSD = pairAnalysis.reduce((sum, pair) => sum + pair.liquidityUSD, 0);\n            const wcroWallets = pairAnalysis.filter(pair => pair.hasWCRO);\n\n            return {\n                status: 'success',\n                data: {\n                    updated_at: data.updated_at,\n                    pairs: pairAnalysis,\n                    network: this.agent.network,\n                    summary: {\n                        totalPairs: pairAnalysis.length,\n                        totalLiquidityUSD: totalLiquidityUSD,\n                        wcroPairs: wcroWallets.length,\n                        stablePairs: pairAnalysis.filter(p => p.isStablePair).length,\n                        topPairsByLiquidity: pairAnalysis\n                            .sort((a, b) => b.liquidityUSD - a.liquidityUSD)\n                            .slice(0, 5)\n                            .map(p => ({ pairId: p.pairId, liquidity: p.liquidityUSD }))\n                    }\n                },\n                network: this.agent.network,\n                timestamp: Date.now()\n            };\n        } catch (error: any) {\n            return {\n                status: 'error',\n                message: error.message || 'Failed to get VVS pairs',\n                network: this.agent.network\n            };\n        }\n    }\n\n    private formatTokenAmount(amount: string): string {\n        const num = parseFloat(amount) / 1e18; // Assuming 18 decimals\n        if (num >= 1e12) return `${(num / 1e12).toFixed(2)}T`;\n        if (num >= 1e9) return `${(num / 1e9).toFixed(2)}B`;\n        if (num >= 1e6) return `${(num / 1e6).toFixed(2)}M`;\n        if (num >= 1e3) return `${(num / 1e3).toFixed(2)}K`;\n        return num.toFixed(2);\n    }\n\n    private isStablePair(pairData: any): boolean {\n        const stableTokens = ['USDT', 'USDC', 'DAI', 'BUSD'];\n        const baseSymbol = pairData.base_symbol?.toUpperCase() || '';\n        const quoteSymbol = pairData.quote_symbol?.toUpperCase() || '';\n        \n        return stableTokens.includes(baseSymbol) || stableTokens.includes(quoteSymbol);\n    }\n}\n","import { z } from \"zod\";\nimport { DefiProtocol } from \"@crypto.com/developer-platform-client\";\n\nexport interface McpTool {\n    name: string;\n    description: string;\n    schema: Record<string, any>;\n    handler: (agent: any, input: Record<string, any>) => Promise<any>;\n}\n\nexport interface TokenBalance {\n    address: string;\n    balance: string;\n    symbol?: string;\n    name?: string;\n    decimals?: number;\n    balanceFormatted?: string;\n}\n\nexport interface TransactionData {\n    hash: string;\n    from: string;\n    to: string;\n    value: string;\n    gasPrice?: string;\n    gasUsed?: string;\n    blockNumber?: number;\n    timestamp?: number;\n    status?: string;\n}\n\nexport interface NetworkStats {\n    chainId: number;\n    blockNumber: number;\n    gasPrice: string;\n    networkName: string;\n}\n\nexport interface ExchangeData {\n    instrument: string;\n    price: string;\n    volume24h?: string;\n    change24h?: string;\n}\n\nexport interface AnalyticsResponse {\n    status: 'success' | 'error';\n    message?: string;\n    data?: any;\n    network?: string;\n    timestamp?: number;\n}\n\nexport interface DefiToken {\n    id: number;\n    name: string;\n    symbol: string;\n    address: string;\n    decimal: number;\n    logoImagePngUrl: string;\n    logoImageSvgUrl: string;\n    chain: string;\n    chainId: number;\n}\n\nexport interface Farm {\n    id: number;\n    pid: number;\n    lpSymbol: string;\n    lpAddress: string;\n    baseApr: number;\n    baseApy: number;\n    lpApr: number;\n    lpApy: number;\n    isFinished: boolean;\n    rewardStartAt: string;\n    rewardEndAt?: string;\n    chain: string;\n    chainId: number;\n}\n\nexport interface BlockData {\n    number: string;\n    hash: string;\n    parentHash: string;\n    timestamp: string;\n    gasLimit: string;\n    gasUsed: string;\n    transactions?: any[];\n}\n\nexport interface CronosIdData {\n    name?: string;\n    address?: string;\n}\n\n// Utility type for enum validation\nexport const DefiProtocolSchema = z.enum(['h2finance', 'vvsfinance']);\nexport const NetworkSchema = z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet']);\nexport const AddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, \"Must be a valid Ethereum address\");\nexport const TxHashSchema = z.string().regex(/^0x[a-fA-F0-9]{64}$/, \"Must be a valid transaction hash\");\nexport const CronosIdSchema = z.string().regex(/^[a-zA-Z0-9_-]+\\.cro$/, \"Must be a valid CronosId ending with .cro\");\n","import { z } from \"zod\";\nimport { CronosAnalyticsAgent } from \"../../agent/analytics\";\nimport { type McpTool } from \"../../types\";\n\nexport const GetAllTickersTool: McpTool = {\n    name: \"cronos_get_all_tickers\",\n    description: \"Get all available trading pairs and market data from Crypto.com Exchange\",\n    schema: {\n        limit: z.number()\n            .optional()\n            .describe(\"Limit number of results (default: 50, max: 200)\")\n            .default(50),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network context (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getAllTickers();\n            \n            // Apply limit if specified\n            let tickers = result.data?.result || [];\n            if (input.limit && tickers.length > input.limit) {\n                tickers = tickers.slice(0, input.limit);\n            }\n            \n            return {\n                status: \"success\",\n                message: `✅ Retrieved ${tickers.length} trading pairs`,\n                data: {\n                    tickers: tickers,\n                    count: tickers.length,\n                    exchange: \"Crypto.com Exchange\",\n                    network: targetAgent.network,\n                    timestamp: Date.now(),\n                    summary: {\n                        totalPairs: result.data?.result?.length || 0,\n                        croBasePairs: tickers.filter((t: any) => t.i && t.i.endsWith('_CRO')).length,\n                        usdBasePairs: tickers.filter((t: any) => t.i && (t.i.endsWith('_USD') || t.i.endsWith('_USDT') || t.i.endsWith('_USDC'))).length\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get all tickers: ${error.message}`);\n        }\n    }\n};\n\nexport const GetTickerTool: McpTool = {\n    name: \"cronos_get_ticker\",\n    description: \"Get specific trading pair data and market information\",\n    schema: {\n        instrument: z.string()\n            .describe(\"Trading pair instrument name (e.g., 'CRO_USD', 'BTC_CRO')\")\n            .min(1),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network context (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const result = await targetAgent.getTickerByInstrument(input.instrument);\n            \n            return {\n                status: \"success\",\n                message: `✅ Ticker data retrieved for ${input.instrument}`,\n                data: {\n                    instrument: input.instrument,\n                    ...result.data,\n                    exchange: \"Crypto.com Exchange\",\n                    network: targetAgent.network,\n                    timestamp: Date.now(),\n                    analysis: {\n                        isCROPair: input.instrument.includes('CRO'),\n                        isStablePair: input.instrument.includes('USD') || input.instrument.includes('USDT') || input.instrument.includes('USDC'),\n                        priceAvailable: !!result.data?.result?.a,\n                        volumeAvailable: !!result.data?.result?.v\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get ticker for ${input.instrument}: ${error.message}`);\n        }\n    }\n};\n\nexport const GetMarketSummaryTool: McpTool = {\n    name: \"cronos_get_market_summary\",\n    description: \"Get market summary and CRO-related trading data\",\n    schema: {\n        includeCROPairs: z.boolean()\n            .optional()\n            .describe(\"Include CRO trading pairs analysis (default: true)\"),\n        network: z.enum(['cronos-mainnet', 'cronos-zkevm-mainnet'])\n            .optional()\n            .describe(\"Network context (defaults to configured network)\")\n    },\n    handler: async (agent: CronosAnalyticsAgent, input: Record<string, any>) => {\n        try {\n            const targetAgent = input.network && input.network !== agent.network \n                ? new CronosAnalyticsAgent(input.network)\n                : agent;\n\n            const includeCRO = input.includeCROPairs !== false;\n            \n            // Get all tickers for analysis\n            const allTickersResult = await targetAgent.getAllTickers();\n            const tickers = allTickersResult.data?.result || [];\n            \n            // Get specific CRO price if available\n            let croPrice = null;\n            if (includeCRO) {\n                try {\n                    const croResult = await targetAgent.getTickerByInstrument('CRO_USD');\n                    croPrice = croResult.data?.result;\n                } catch {\n                    // Try alternative CRO pairs\n                    try {\n                        const croResult = await targetAgent.getTickerByInstrument('CRO_USDT');\n                        croPrice = croResult.data?.result;\n                    } catch {\n                        // CRO price not available\n                    }\n                }\n            }\n            \n            return {\n                status: \"success\",\n                message: `✅ Market summary retrieved`,\n                data: {\n                    exchange: \"Crypto.com Exchange\",\n                    network: targetAgent.network,\n                    timestamp: Date.now(),\n                    summary: {\n                        totalTradingPairs: tickers.length,\n                        croPrice: croPrice,\n                        croBasePairs: tickers.filter((t: any) => t.i && t.i.endsWith('_CRO')).length,\n                        usdBasePairs: tickers.filter((t: any) => t.i && (t.i.endsWith('_USD') || t.i.endsWith('_USDT') || t.i.endsWith('_USDC'))).length\n                    },\n                    croPairs: includeCRO ? tickers.filter((t: any) => t.i && (t.i.includes('CRO_') || t.i.includes('_CRO'))) : [],\n                    networkInfo: {\n                        nativeCurrency: targetAgent.networkInfo.nativeCurrency,\n                        blockExplorer: targetAgent.networkInfo.blockExplorer\n                    }\n                }\n            };\n        } catch (error: any) {\n            throw new Error(`Failed to get market summary: ${error.message}`);\n        }\n    }\n};\n","// Balance & Token Analytics Tools\nimport { \n    GetNativeBalanceTool,\n    GetERC20BalanceTool,\n    GetWalletOverviewTool,\n    GetNetworkInfoTool\n} from \"./balance/get_balance_tools\";\n\n// Transaction Analytics Tools\nimport {\n    GetTransactionTool,\n    GetTransactionStatusTool\n} from \"./transaction/get_transaction_tools\";\n\n// Block Analytics Tools\nimport {\n    GetCurrentBlockTool,\n    GetBlockByTagTool\n} from \"./block/get_block_tools\";\n\n// DeFi Analytics Tools  \nimport {\n    GetAllFarmsTool,\n    GetFarmBySymbolTool\n} from \"./defi/get_defi_tools\";\n \n// CronosId Tools\nimport {\n    ResolveCronosIdTool,\n    ReverseResolveCronosIdTool\n} from \"./cronosid/get_cronosid_tools\";\n\n// VVS Finance DEX Tools\nimport {\n    GetVVSSupplyTool,\n    GetVVSSummaryTool,\n    GetVVSTokensTool,\n    GetVVSTokenInfoTool,\n    GetVVSPairsTool,\n    GetVVSTopPairsTool\n} from \"./vvs/get_vvs_tools\";\n\n// Market & Exchange Tools\nimport {\n    GetAllTickersTool,\n    GetTickerTool,\n    GetMarketSummaryTool\n} from \"./market/get_market_tools\";\n\n// Complete Analytics Tools Collection\nexport const CronosAnalyticsTools = {\n    // === BALANCE & TOKEN ANALYTICS (4 tools) ===\n    \"GetNativeBalanceTool\": GetNativeBalanceTool,                    // Native CRO/zkCRO balance\n    \"GetERC20BalanceTool\": GetERC20BalanceTool,                      // ERC20 token balances\n    \"GetWalletOverviewTool\": GetWalletOverviewTool,                  // Complete wallet portfolio\n    \"GetNetworkInfoTool\": GetNetworkInfoTool,                       // Network information\n\n    // === TRANSACTION ANALYTICS (2 tools) ===\n    \"GetTransactionTool\": GetTransactionTool,                       // Transaction details\n    \"GetTransactionStatusTool\": GetTransactionStatusTool,           // Transaction status\n\n    // === BLOCK ANALYTICS (2 tools) ===\n    \"GetCurrentBlockTool\": GetCurrentBlockTool,                     // Current block info\n    \"GetBlockByTagTool\": GetBlockByTagTool,                         // Block by number/tag\n \n    // === DEFI ANALYTICS (2 tools) ===\n    \"GetAllFarmsTool\": GetAllFarmsTool,                             // All yield farms\n    \"GetFarmBySymbolTool\": GetFarmBySymbolTool,                     // Specific farm data\n\n    // === CRONOS ID (2 tools) ===\n    \"ResolveCronosIdTool\": ResolveCronosIdTool,                     // Resolve name to address\n    \"ReverseResolveCronosIdTool\": ReverseResolveCronosIdTool,       // Resolve address to name\n\n    // === VVS FINANCE DEX (6 tools) ===\n    \"GetVVSSupplyTool\": GetVVSSupplyTool,                           // VVS token supply info\n    \"GetVVSSummaryTool\": GetVVSSummaryTool,                         // VVS DEX overview\n    \"GetVVSTokensTool\": GetVVSTokensTool,                           // All VVS tokens\n    \"GetVVSTokenInfoTool\": GetVVSTokenInfoTool,                     // Specific token on VVS\n    \"GetVVSPairsTool\": GetVVSPairsTool,                             // All VVS trading pairs\n    \"GetVVSTopPairsTool\": GetVVSTopPairsTool,                       // Top VVS pairs by liquidity/volume\n\n    // === MARKET & EXCHANGE DATA (3 tools) ===\n    \"GetAllTickersTool\": GetAllTickersTool,                         // All trading pairs\n    \"GetTickerTool\": GetTickerTool,                                 // Specific ticker data\n    \"GetMarketSummaryTool\": GetMarketSummaryTool,                   // Market overview\n};\n\n// Export count for verification\nexport const TOOL_COUNT = Object.keys(CronosAnalyticsTools).length;\n"],"mappings":"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","names":["network","z","z","z","z","z","z","z","z","z","z","z","z","z"]}