web3-tools-mcp 1.0.0 → 1.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.
Files changed (135) hide show
  1. package/README.md +92 -259
  2. package/dist/client.d.ts +1653 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +142 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +78 -28274
  9. package/dist/index.js.map +1 -0
  10. package/dist/package.json +60 -0
  11. package/dist/src/client.d.ts +1653 -0
  12. package/dist/src/client.d.ts.map +1 -0
  13. package/dist/src/client.js +142 -0
  14. package/dist/src/client.js.map +1 -0
  15. package/dist/src/index.d.ts +3 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +88 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/tools/advanced.d.ts +75 -0
  20. package/dist/src/tools/advanced.d.ts.map +1 -0
  21. package/dist/src/tools/advanced.js +234 -0
  22. package/dist/src/tools/advanced.js.map +1 -0
  23. package/dist/src/tools/balance.d.ts +55 -0
  24. package/dist/src/tools/balance.d.ts.map +1 -0
  25. package/dist/src/tools/balance.js +146 -0
  26. package/dist/src/tools/balance.js.map +1 -0
  27. package/dist/src/tools/contract-info.d.ts +79 -0
  28. package/dist/src/tools/contract-info.d.ts.map +1 -0
  29. package/dist/src/tools/contract-info.js +450 -0
  30. package/dist/src/tools/contract-info.js.map +1 -0
  31. package/dist/src/tools/contract.d.ts +79 -0
  32. package/dist/src/tools/contract.d.ts.map +1 -0
  33. package/dist/src/tools/contract.js +140 -0
  34. package/dist/src/tools/contract.js.map +1 -0
  35. package/dist/src/tools/index.d.ts +3 -0
  36. package/dist/src/tools/index.d.ts.map +1 -0
  37. package/dist/src/tools/index.js +27 -0
  38. package/dist/src/tools/index.js.map +1 -0
  39. package/dist/src/tools/logs.d.ts +39 -0
  40. package/dist/src/tools/logs.d.ts.map +1 -0
  41. package/dist/src/tools/logs.js +231 -0
  42. package/dist/src/tools/logs.js.map +1 -0
  43. package/dist/src/tools/signatures.d.ts +83 -0
  44. package/dist/src/tools/signatures.d.ts.map +1 -0
  45. package/dist/src/tools/signatures.js +93 -0
  46. package/dist/src/tools/signatures.js.map +1 -0
  47. package/dist/src/types.d.ts +22 -0
  48. package/dist/src/types.d.ts.map +1 -0
  49. package/dist/src/types.js +2 -0
  50. package/dist/src/types.js.map +1 -0
  51. package/dist/src/utils.d.ts +22 -0
  52. package/dist/src/utils.d.ts.map +1 -0
  53. package/dist/src/utils.js +183 -0
  54. package/dist/src/utils.js.map +1 -0
  55. package/dist/test/mcp-client.test.d.ts +2 -0
  56. package/dist/test/mcp-client.test.d.ts.map +1 -0
  57. package/dist/test/mcp-client.test.js +376 -0
  58. package/dist/test/mcp-client.test.js.map +1 -0
  59. package/dist/test/tools/advanced.test.d.ts +2 -0
  60. package/dist/test/tools/advanced.test.d.ts.map +1 -0
  61. package/dist/test/tools/advanced.test.js +235 -0
  62. package/dist/test/tools/advanced.test.js.map +1 -0
  63. package/dist/test/tools/balance.test.d.ts +2 -0
  64. package/dist/test/tools/balance.test.d.ts.map +1 -0
  65. package/dist/test/tools/balance.test.js +167 -0
  66. package/dist/test/tools/balance.test.js.map +1 -0
  67. package/dist/test/tools/contract-info.test.d.ts +2 -0
  68. package/dist/test/tools/contract-info.test.d.ts.map +1 -0
  69. package/dist/test/tools/contract-info.test.js +286 -0
  70. package/dist/test/tools/contract-info.test.js.map +1 -0
  71. package/dist/test/tools/contract.test.d.ts +2 -0
  72. package/dist/test/tools/contract.test.d.ts.map +1 -0
  73. package/dist/test/tools/contract.test.js +234 -0
  74. package/dist/test/tools/contract.test.js.map +1 -0
  75. package/dist/test/tools/logs.test.d.ts +2 -0
  76. package/dist/test/tools/logs.test.d.ts.map +1 -0
  77. package/dist/test/tools/logs.test.js +196 -0
  78. package/dist/test/tools/logs.test.js.map +1 -0
  79. package/dist/test/tools/signatures.test.d.ts +2 -0
  80. package/dist/test/tools/signatures.test.d.ts.map +1 -0
  81. package/dist/test/tools/signatures.test.js +112 -0
  82. package/dist/test/tools/signatures.test.js.map +1 -0
  83. package/dist/tools/advanced.d.ts +75 -0
  84. package/dist/tools/advanced.d.ts.map +1 -0
  85. package/dist/tools/advanced.js +234 -0
  86. package/dist/tools/advanced.js.map +1 -0
  87. package/dist/tools/balance.d.ts +55 -0
  88. package/dist/tools/balance.d.ts.map +1 -0
  89. package/dist/tools/balance.js +146 -0
  90. package/dist/tools/balance.js.map +1 -0
  91. package/dist/tools/batch.d.ts +122 -0
  92. package/dist/tools/batch.d.ts.map +1 -0
  93. package/dist/tools/batch.js +243 -0
  94. package/dist/tools/batch.js.map +1 -0
  95. package/dist/tools/contract-info.d.ts +79 -0
  96. package/dist/tools/contract-info.d.ts.map +1 -0
  97. package/dist/tools/contract-info.js +450 -0
  98. package/dist/tools/contract-info.js.map +1 -0
  99. package/dist/tools/contract.d.ts +79 -0
  100. package/dist/tools/contract.d.ts.map +1 -0
  101. package/dist/tools/contract.js +140 -0
  102. package/dist/tools/contract.js.map +1 -0
  103. package/dist/tools/index.d.ts +3 -0
  104. package/dist/tools/index.d.ts.map +1 -0
  105. package/dist/tools/index.js +27 -0
  106. package/dist/tools/index.js.map +1 -0
  107. package/dist/tools/logs.d.ts +39 -0
  108. package/dist/tools/logs.d.ts.map +1 -0
  109. package/dist/tools/logs.js +231 -0
  110. package/dist/tools/logs.js.map +1 -0
  111. package/dist/tools/signatures.d.ts +83 -0
  112. package/dist/tools/signatures.d.ts.map +1 -0
  113. package/dist/tools/signatures.js +93 -0
  114. package/dist/tools/signatures.js.map +1 -0
  115. package/dist/types.d.ts +22 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils.d.ts +22 -0
  120. package/dist/utils.d.ts.map +1 -0
  121. package/dist/utils.js +183 -0
  122. package/dist/utils.js.map +1 -0
  123. package/package.json +35 -23
  124. package/src/client.ts +160 -0
  125. package/src/index.ts +96 -0
  126. package/src/tools/advanced.ts +262 -0
  127. package/src/tools/balance.ts +176 -0
  128. package/src/tools/contract-info.ts +582 -0
  129. package/src/tools/contract.ts +180 -0
  130. package/src/tools/index.ts +35 -0
  131. package/src/tools/logs.ts +291 -0
  132. package/src/tools/signatures.ts +126 -0
  133. package/src/types.ts +29 -0
  134. package/src/utils.ts +222 -0
  135. package/dist/hypersync-client.darwin-arm64-7fegfwn5.node +0 -0
@@ -0,0 +1,376 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
+ import { spawn } from 'child_process';
4
+ import { config } from 'dotenv';
5
+ import { fileURLToPath } from 'url';
6
+ import { dirname, join } from 'path';
7
+ // Load environment variables from .env file
8
+ config();
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ const projectRoot = join(__dirname, '..');
12
+ class MCPTestClient {
13
+ client;
14
+ transport;
15
+ results = [];
16
+ async connect() {
17
+ // Spawn the MCP server process
18
+ const serverPath = join(projectRoot, 'dist', 'index.js');
19
+ const serverProcess = spawn('node', [
20
+ serverPath,
21
+ '--etherscan-api-key',
22
+ process.env.ETHERSCAN_API_KEY || '',
23
+ '--alchemy-api-key',
24
+ process.env.ALCHEMY_API_KEY || '',
25
+ '--infura-api-key',
26
+ process.env.INFURA_API_KEY || '',
27
+ '--hypersync-api-key',
28
+ process.env.HYPERSYNC_API_KEY || ''
29
+ ]);
30
+ this.transport = new StdioClientTransport({
31
+ command: 'node',
32
+ args: [
33
+ serverPath,
34
+ '--etherscan-api-key',
35
+ process.env.ETHERSCAN_API_KEY || '',
36
+ '--alchemy-api-key',
37
+ process.env.ALCHEMY_API_KEY || '',
38
+ '--infura-api-key',
39
+ process.env.INFURA_API_KEY || '',
40
+ '--hypersync-api-key',
41
+ process.env.HYPERSYNC_API_KEY || ''
42
+ ]
43
+ });
44
+ this.client = new Client({
45
+ name: 'web3-tools-test-client',
46
+ version: '1.0.0'
47
+ }, {
48
+ capabilities: {}
49
+ });
50
+ await this.client.connect(this.transport);
51
+ console.log('✅ Connected to MCP server');
52
+ }
53
+ async disconnect() {
54
+ await this.client.close();
55
+ console.log('✅ Disconnected from MCP server');
56
+ }
57
+ async runTest(name, testFn) {
58
+ const startTime = Date.now();
59
+ try {
60
+ await testFn();
61
+ const duration = Date.now() - startTime;
62
+ this.results.push({ name, passed: true, duration });
63
+ console.log(`✅ ${name} (${duration}ms)`);
64
+ }
65
+ catch (error) {
66
+ const duration = Date.now() - startTime;
67
+ const errorMessage = error instanceof Error ? error.message : String(error);
68
+ this.results.push({ name, passed: false, error: errorMessage, duration });
69
+ console.log(`❌ ${name} (${duration}ms)`);
70
+ console.log(` Error: ${errorMessage}`);
71
+ }
72
+ }
73
+ async runTests() {
74
+ console.log('\n🧪 Starting MCP Server Test Suite\n');
75
+ // Test 1: List available tools
76
+ await this.runTest('List available tools', async () => {
77
+ const tools = await this.client.listTools();
78
+ if (!tools.tools || tools.tools.length === 0) {
79
+ throw new Error('No tools found');
80
+ }
81
+ console.log(` Found ${tools.tools.length} tools`);
82
+ });
83
+ // Test 2: Get function signature
84
+ await this.runTest('Get function signature', async () => {
85
+ const result = await this.client.callTool({
86
+ name: 'get_function_signature',
87
+ arguments: {
88
+ items: [
89
+ { functionAbi: 'function balanceOf(address owner) view returns (uint256)' },
90
+ { functionAbi: 'function transfer(address to, uint256 amount) returns (bool)' }
91
+ ]
92
+ }
93
+ });
94
+ const data = JSON.parse(result.content[0].text);
95
+ if (data.length !== 2) {
96
+ throw new Error('Expected 2 function signatures');
97
+ }
98
+ if (!data[0].signature.startsWith('0x')) {
99
+ throw new Error('Invalid function signature format');
100
+ }
101
+ });
102
+ // Test 3: Get event signature
103
+ await this.runTest('Get event signature', async () => {
104
+ const result = await this.client.callTool({
105
+ name: 'get_event_signature',
106
+ arguments: {
107
+ items: [
108
+ {
109
+ eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)'
110
+ }
111
+ ]
112
+ }
113
+ });
114
+ const data = JSON.parse(result.content[0].text);
115
+ if (!data[0].topic0) {
116
+ throw new Error('Missing topic0 in event signature');
117
+ }
118
+ });
119
+ // Test 4: Get error signature
120
+ await this.runTest('Get error signature', async () => {
121
+ const result = await this.client.callTool({
122
+ name: 'get_error_signature',
123
+ arguments: {
124
+ items: [
125
+ { errorAbi: 'error InsufficientBalance(uint256 available, uint256 required)' }
126
+ ]
127
+ }
128
+ });
129
+ const data = JSON.parse(result.content[0].text);
130
+ if (!data[0].signature) {
131
+ throw new Error('Missing error signature');
132
+ }
133
+ });
134
+ // Test 5: Check if address is contract
135
+ await this.runTest('Check if address is contract', async () => {
136
+ const result = await this.client.callTool({
137
+ name: 'is_contract',
138
+ arguments: {
139
+ chain: 'mainnet',
140
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' // USDC
141
+ }
142
+ });
143
+ const data = JSON.parse(result.content[0].text);
144
+ if (!data.isContract) {
145
+ throw new Error('USDC should be detected as a contract');
146
+ }
147
+ });
148
+ // Test 6: Get native balance
149
+ await this.runTest('Get native balance', async () => {
150
+ const result = await this.client.callTool({
151
+ name: 'get_balance',
152
+ arguments: {
153
+ queries: [
154
+ {
155
+ chain: 'mainnet',
156
+ address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' // Vitalik
157
+ }
158
+ ]
159
+ }
160
+ });
161
+ const data = JSON.parse(result.content[0].text);
162
+ if (!data.success || data.results.length !== 1) {
163
+ throw new Error('Failed to get native balance');
164
+ }
165
+ });
166
+ // Test 7: Get ERC20 token balance
167
+ await this.runTest('Get ERC20 token balance', async () => {
168
+ const result = await this.client.callTool({
169
+ name: 'get_balance',
170
+ arguments: {
171
+ queries: [
172
+ {
173
+ chain: 'mainnet',
174
+ address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // Vitalik
175
+ tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' // USDC
176
+ }
177
+ ]
178
+ }
179
+ });
180
+ const data = JSON.parse(result.content[0].text);
181
+ if (!data.success || data.results.length !== 1) {
182
+ throw new Error('Failed to get ERC20 balance');
183
+ }
184
+ if (!data.results[0].decimals) {
185
+ throw new Error('Missing decimals in balance result');
186
+ }
187
+ });
188
+ // Test 8: Call contract function (batch)
189
+ await this.runTest('Call contract functions (batch)', async () => {
190
+ const result = await this.client.callTool({
191
+ name: 'call_contract_function',
192
+ arguments: {
193
+ calls: [
194
+ {
195
+ chain: 'mainnet',
196
+ contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
197
+ functionAbi: 'function name() view returns (string)',
198
+ label: 'USDC name'
199
+ },
200
+ {
201
+ chain: 'mainnet',
202
+ contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
203
+ functionAbi: 'function symbol() view returns (string)',
204
+ label: 'USDC symbol'
205
+ },
206
+ {
207
+ chain: 'mainnet',
208
+ contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
209
+ functionAbi: 'function decimals() view returns (uint8)',
210
+ label: 'USDC decimals'
211
+ }
212
+ ]
213
+ }
214
+ });
215
+ const data = JSON.parse(result.content[0].text);
216
+ if (data.totalCalls !== 3 || data.successfulCalls !== 3) {
217
+ throw new Error('Expected 3 successful contract calls');
218
+ }
219
+ });
220
+ // Test 9: Get contract ABI (with Etherscan API)
221
+ if (process.env.ETHERSCAN_API_KEY) {
222
+ await this.runTest('Get contract ABI', async () => {
223
+ const result = await this.client.callTool({
224
+ name: 'get_contract_abi',
225
+ arguments: {
226
+ chain: 'mainnet',
227
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
228
+ include: ['abi', 'metadata']
229
+ }
230
+ });
231
+ const data = JSON.parse(result.content[0].text);
232
+ if (!data.success || !data.abi) {
233
+ throw new Error('Failed to get contract ABI');
234
+ }
235
+ if (!data.isProxy) {
236
+ throw new Error('USDC should be detected as proxy');
237
+ }
238
+ });
239
+ // Test 10: Get contract source code (testing cache)
240
+ await this.runTest('Get contract source code (should use cache)', async () => {
241
+ const result = await this.client.callTool({
242
+ name: 'get_contract_source_code',
243
+ arguments: {
244
+ chain: 'mainnet',
245
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
246
+ includeSource: 'summary'
247
+ }
248
+ });
249
+ const data = JSON.parse(result.content[0].text);
250
+ if (!data.success || !data.files) {
251
+ throw new Error('Failed to get contract source code');
252
+ }
253
+ if (!data.implementation) {
254
+ throw new Error('Should include implementation for proxy');
255
+ }
256
+ });
257
+ // Test 11: Get contract source code with full source
258
+ await this.runTest('Get contract source code (full)', async () => {
259
+ const result = await this.client.callTool({
260
+ name: 'get_contract_source_code',
261
+ arguments: {
262
+ chain: 'mainnet',
263
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
264
+ includeSource: 'full',
265
+ includeImplementation: false
266
+ }
267
+ });
268
+ const data = JSON.parse(result.content[0].text);
269
+ if (!data.success || !data.sourceFiles) {
270
+ throw new Error('Failed to get full contract source code');
271
+ }
272
+ });
273
+ // Test 12: Get specific contract source file
274
+ await this.runTest('Get specific contract source file', async () => {
275
+ const result = await this.client.callTool({
276
+ name: 'get_contract_source_file',
277
+ arguments: {
278
+ chain: 'mainnet',
279
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
280
+ filePath: 'FiatTokenProxy.sol'
281
+ }
282
+ });
283
+ const data = JSON.parse(result.content[0].text);
284
+ if (!data.success || !data.content) {
285
+ throw new Error('Failed to get contract source file');
286
+ }
287
+ });
288
+ }
289
+ else {
290
+ console.log('⚠️ Skipping Etherscan API tests (no API key)');
291
+ }
292
+ // Test 13: Get storage at
293
+ await this.runTest('Get storage at', async () => {
294
+ const result = await this.client.callTool({
295
+ name: 'get_storage_at',
296
+ arguments: {
297
+ chain: 'mainnet',
298
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
299
+ slot: '0x0',
300
+ abiType: 'address'
301
+ }
302
+ });
303
+ const data = JSON.parse(result.content[0].text);
304
+ if (!data.rawValue) {
305
+ throw new Error('Failed to get storage');
306
+ }
307
+ });
308
+ // Test 14: Get block info
309
+ await this.runTest('Get block info', async () => {
310
+ const result = await this.client.callTool({
311
+ name: 'get_block_info',
312
+ arguments: {
313
+ chain: 'mainnet'
314
+ }
315
+ });
316
+ const data = JSON.parse(result.content[0].text);
317
+ if (!data.blockNumber || !data.timestamp) {
318
+ throw new Error('Failed to get block info');
319
+ }
320
+ });
321
+ // Test 15: Get logs
322
+ await this.runTest('Get logs (Transfer events)', async () => {
323
+ const result = await this.client.callTool({
324
+ name: 'get_logs',
325
+ arguments: {
326
+ chain: 'mainnet',
327
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
328
+ eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
329
+ fromBlock: '21000000',
330
+ toBlock: '21000100'
331
+ }
332
+ });
333
+ const data = JSON.parse(result.content[0].text);
334
+ if (!data.logs) {
335
+ throw new Error('Failed to get logs');
336
+ }
337
+ console.log(` Found ${data.count} Transfer events`);
338
+ });
339
+ // Print summary
340
+ console.log('\n📊 Test Summary\n');
341
+ const passed = this.results.filter((r) => r.passed).length;
342
+ const failed = this.results.filter((r) => !r.passed).length;
343
+ const total = this.results.length;
344
+ console.log(`Total tests: ${total}`);
345
+ console.log(`✅ Passed: ${passed}`);
346
+ console.log(`❌ Failed: ${failed}`);
347
+ console.log(`📈 Success rate: ${((passed / total) * 100).toFixed(1)}%`);
348
+ if (failed > 0) {
349
+ console.log('\n❌ Failed tests:');
350
+ this.results
351
+ .filter((r) => !r.passed)
352
+ .forEach((r) => {
353
+ console.log(` - ${r.name}: ${r.error}`);
354
+ });
355
+ }
356
+ // Calculate total time
357
+ const totalTime = this.results.reduce((sum, r) => sum + r.duration, 0);
358
+ console.log(`\n⏱️ Total time: ${totalTime}ms`);
359
+ return failed === 0;
360
+ }
361
+ }
362
+ async function main() {
363
+ const testClient = new MCPTestClient();
364
+ try {
365
+ await testClient.connect();
366
+ const success = await testClient.runTests();
367
+ await testClient.disconnect();
368
+ process.exit(success ? 0 : 1);
369
+ }
370
+ catch (error) {
371
+ console.error('❌ Test suite failed:', error);
372
+ process.exit(1);
373
+ }
374
+ }
375
+ main();
376
+ //# sourceMappingURL=mcp-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.test.js","sourceRoot":"","sources":["../../test/mcp-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=advanced.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced.test.d.ts","sourceRoot":"","sources":["../../../test/tools/advanced.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,235 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest';
2
+ import { config } from 'dotenv';
3
+ import { initializeClientManager } from '../../src/client.js';
4
+ import advancedTools from '../../src/tools/advanced.js';
5
+ // Load environment variables
6
+ config();
7
+ describe('Advanced Tools', () => {
8
+ beforeAll(() => {
9
+ // Initialize client manager with config
10
+ initializeClientManager({
11
+ alchemyApiKey: process.env.ALCHEMY_API_KEY,
12
+ infuraApiKey: process.env.INFURA_API_KEY,
13
+ etherscanApiKey: process.env.ETHERSCAN_API_KEY,
14
+ hypersyncApiKey: process.env.HYPERSYNC_API_KEY
15
+ });
16
+ });
17
+ describe('get_storage_at', () => {
18
+ it('should read storage slot from USDC contract', async () => {
19
+ const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
20
+ const result = await advancedTools.get_storage_at.handler({
21
+ chain: 'mainnet',
22
+ address: USDC_CONTRACT,
23
+ slot: '0x0',
24
+ abiType: 'bytes32'
25
+ });
26
+ const data = JSON.parse(result.content[0].text);
27
+ expect(data.address).toBe(USDC_CONTRACT);
28
+ expect(data.slot).toBe('0x0');
29
+ expect(data.rawValue).toBeDefined();
30
+ expect(data.decodedValue).toBeDefined();
31
+ }, 30000);
32
+ it('should decode uint256 storage value', async () => {
33
+ const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
34
+ const result = await advancedTools.get_storage_at.handler({
35
+ chain: 'mainnet',
36
+ address: USDC_CONTRACT,
37
+ slot: '0x2', // totalSupply slot in USDC
38
+ abiType: 'uint256'
39
+ });
40
+ const data = JSON.parse(result.content[0].text);
41
+ expect(data.decodedValue).toBeDefined();
42
+ expect(typeof data.formattedValue).toBe('string');
43
+ }, 30000);
44
+ it('should decode address storage value', async () => {
45
+ const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
46
+ const result = await advancedTools.get_storage_at.handler({
47
+ chain: 'mainnet',
48
+ address: USDC_CONTRACT,
49
+ slot: '0xa', // owner/admin slot (approximate)
50
+ abiType: 'address'
51
+ });
52
+ const data = JSON.parse(result.content[0].text);
53
+ expect(data.decodedValue).toBeDefined();
54
+ // Should be an address format
55
+ if (data.decodedValue !== '0x0000000000000000000000000000000000000000') {
56
+ expect(data.decodedValue).toMatch(/^0x[a-fA-F0-9]{40}$/);
57
+ }
58
+ }, 30000);
59
+ it('should decode bool storage value', async () => {
60
+ const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
61
+ const result = await advancedTools.get_storage_at.handler({
62
+ chain: 'mainnet',
63
+ address: USDC_CONTRACT,
64
+ slot: '0xc', // paused slot (approximate)
65
+ abiType: 'bool'
66
+ });
67
+ const data = JSON.parse(result.content[0].text);
68
+ expect(data.decodedValue).toBeDefined();
69
+ expect(typeof data.decodedValue).toBe('boolean');
70
+ }, 30000);
71
+ it('should read storage at specific block number', async () => {
72
+ const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
73
+ const result = await advancedTools.get_storage_at.handler({
74
+ chain: 'mainnet',
75
+ address: USDC_CONTRACT,
76
+ slot: '0x0',
77
+ abiType: 'bytes32',
78
+ blockNumber: '18000000'
79
+ });
80
+ const data = JSON.parse(result.content[0].text);
81
+ expect(data.blockNumber).toBe('18000000');
82
+ }, 30000);
83
+ });
84
+ describe('get_block_info', () => {
85
+ it('should fetch latest block information', async () => {
86
+ const result = await advancedTools.get_block_info.handler({
87
+ chain: 'mainnet'
88
+ });
89
+ const data = JSON.parse(result.content[0].text);
90
+ expect(data.chain).toBe('mainnet');
91
+ expect(data.blockNumber).toBeDefined();
92
+ expect(data.hash).toBeDefined();
93
+ expect(data.timestamp).toBeDefined();
94
+ expect(data.dateIso).toBeDefined();
95
+ }, 30000);
96
+ it('should fetch specific block by number', async () => {
97
+ const BLOCK_NUMBER = '18000000';
98
+ const result = await advancedTools.get_block_info.handler({
99
+ chain: 'mainnet',
100
+ blockNumber: BLOCK_NUMBER
101
+ });
102
+ const data = JSON.parse(result.content[0].text);
103
+ expect(data.blockNumber).toBe(BLOCK_NUMBER);
104
+ expect(data.hash).toBeDefined();
105
+ expect(data.timestamp).toBeDefined();
106
+ expect(data.dateIso).toBeDefined();
107
+ }, 30000);
108
+ it('should include human-readable date', async () => {
109
+ const result = await advancedTools.get_block_info.handler({
110
+ chain: 'mainnet',
111
+ blockNumber: '18000000'
112
+ });
113
+ const data = JSON.parse(result.content[0].text);
114
+ expect(data.dateIso).toBeDefined();
115
+ expect(typeof data.dateIso).toBe('string');
116
+ // Should be ISO format
117
+ expect(data.dateIso).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
118
+ }, 30000);
119
+ it('should work with different chains', async () => {
120
+ const result = await advancedTools.get_block_info.handler({
121
+ chain: 'base'
122
+ });
123
+ const data = JSON.parse(result.content[0].text);
124
+ expect(data.chain).toBe('base');
125
+ expect(data.blockNumber).toBeDefined();
126
+ }, 30000);
127
+ it('should include miner/validator information', async () => {
128
+ const result = await advancedTools.get_block_info.handler({
129
+ chain: 'mainnet',
130
+ blockNumber: '18000000'
131
+ });
132
+ const data = JSON.parse(result.content[0].text);
133
+ expect(data.parentHash).toBeDefined();
134
+ }, 30000);
135
+ });
136
+ describe('trace_transaction', () => {
137
+ it('should trace a simple ETH transfer transaction', async () => {
138
+ // A well-known simple ETH transfer
139
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
140
+ const result = await advancedTools.trace_transaction.handler({
141
+ chain: 'mainnet',
142
+ transactionHash: TX_HASH,
143
+ traceType: 'trace'
144
+ });
145
+ const data = JSON.parse(result.content[0].text);
146
+ expect(data.transactionHash).toBe(TX_HASH);
147
+ expect(data.traceType).toBe('trace');
148
+ expect(data.trace).toBeDefined();
149
+ }, 30000);
150
+ it('should trace a contract interaction transaction', async () => {
151
+ // Use the same real transaction for consistency
152
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
153
+ const result = await advancedTools.trace_transaction.handler({
154
+ chain: 'mainnet',
155
+ transactionHash: TX_HASH,
156
+ traceType: 'trace'
157
+ });
158
+ const data = JSON.parse(result.content[0].text);
159
+ expect(data).toBeDefined();
160
+ expect(data.transactionHash).toBe(TX_HASH);
161
+ expect(data.trace).toBeDefined();
162
+ }, 30000);
163
+ it('should handle vmTrace type', async () => {
164
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
165
+ const result = await advancedTools.trace_transaction.handler({
166
+ chain: 'mainnet',
167
+ transactionHash: TX_HASH,
168
+ traceType: 'vmTrace'
169
+ });
170
+ const data = JSON.parse(result.content[0].text);
171
+ expect(data.transactionHash).toBe(TX_HASH);
172
+ expect(data.traceType).toBe('vmTrace');
173
+ }, 30000);
174
+ it('should handle stateDiff type', async () => {
175
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
176
+ const result = await advancedTools.trace_transaction.handler({
177
+ chain: 'mainnet',
178
+ transactionHash: TX_HASH,
179
+ traceType: 'stateDiff'
180
+ });
181
+ const data = JSON.parse(result.content[0].text);
182
+ expect(data.transactionHash).toBe(TX_HASH);
183
+ expect(data.traceType).toBe('stateDiff');
184
+ }, 30000);
185
+ it('should include call hierarchy in trace', async () => {
186
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
187
+ const result = await advancedTools.trace_transaction.handler({
188
+ chain: 'mainnet',
189
+ transactionHash: TX_HASH,
190
+ traceType: 'trace'
191
+ });
192
+ const data = JSON.parse(result.content[0].text);
193
+ expect(data.success).toBe(true);
194
+ if (data.trace && data.trace.length > 0) {
195
+ const trace = data.trace[0];
196
+ expect(trace.action).toBeDefined();
197
+ expect(trace.result).toBeDefined();
198
+ expect(trace.type).toBeDefined();
199
+ }
200
+ }, 30000);
201
+ it.skip('should handle failed transactions', async () => {
202
+ // Skipping: would need a real failed transaction hash
203
+ const TX_HASH = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
204
+ try {
205
+ await advancedTools.trace_transaction.handler({
206
+ chain: 'mainnet',
207
+ transactionHash: TX_HASH,
208
+ traceType: 'trace'
209
+ });
210
+ }
211
+ catch (error) {
212
+ expect(error).toBeDefined();
213
+ }
214
+ }, 30000);
215
+ it.skip('should work with different chains', async () => {
216
+ // Skipping: would need a real Base transaction hash
217
+ const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
218
+ try {
219
+ const result = await advancedTools.trace_transaction.handler({
220
+ chain: 'base',
221
+ transactionHash: TX_HASH,
222
+ traceType: 'trace'
223
+ });
224
+ const data = JSON.parse(result.content[0].text);
225
+ expect(data.transactionHash).toBe(TX_HASH);
226
+ expect(data.chain).toBe('base');
227
+ }
228
+ catch (error) {
229
+ // Transaction might not exist on Base
230
+ expect(error).toBeDefined();
231
+ }
232
+ }, 30000);
233
+ });
234
+ });
235
+ //# sourceMappingURL=advanced.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanced.test.js","sourceRoot":"","sources":["../../../test/tools/advanced.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=balance.test.d.ts.map