web3-tools-mcp 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -230
- package/dist/package.json +63 -0
- package/dist/src/client.d.ts +1653 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +142 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +88 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tools/advanced.d.ts +75 -0
- package/dist/src/tools/advanced.d.ts.map +1 -0
- package/dist/src/tools/advanced.js +234 -0
- package/dist/src/tools/advanced.js.map +1 -0
- package/dist/src/tools/balance.d.ts +55 -0
- package/dist/src/tools/balance.d.ts.map +1 -0
- package/dist/src/tools/balance.js +146 -0
- package/dist/src/tools/balance.js.map +1 -0
- package/dist/src/tools/contract-info.d.ts +79 -0
- package/dist/src/tools/contract-info.d.ts.map +1 -0
- package/dist/src/tools/contract-info.js +450 -0
- package/dist/src/tools/contract-info.js.map +1 -0
- package/dist/src/tools/contract.d.ts +79 -0
- package/dist/src/tools/contract.d.ts.map +1 -0
- package/dist/src/tools/contract.js +140 -0
- package/dist/src/tools/contract.js.map +1 -0
- package/dist/src/tools/ens.d.ts +119 -0
- package/dist/src/tools/ens.d.ts.map +1 -0
- package/dist/src/tools/ens.js +425 -0
- package/dist/src/tools/ens.js.map +1 -0
- package/dist/src/tools/index.d.ts +3 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +29 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/logs.d.ts +39 -0
- package/dist/src/tools/logs.d.ts.map +1 -0
- package/dist/src/tools/logs.js +231 -0
- package/dist/src/tools/logs.js.map +1 -0
- package/dist/src/tools/signatures.d.ts +83 -0
- package/dist/src/tools/signatures.d.ts.map +1 -0
- package/dist/src/tools/signatures.js +93 -0
- package/dist/src/tools/signatures.js.map +1 -0
- package/dist/src/types.d.ts +22 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +22 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +183 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/test/tools/advanced.test.d.ts +2 -0
- package/dist/test/tools/advanced.test.d.ts.map +1 -0
- package/dist/test/tools/advanced.test.js +235 -0
- package/dist/test/tools/advanced.test.js.map +1 -0
- package/dist/test/tools/balance.test.d.ts +2 -0
- package/dist/test/tools/balance.test.d.ts.map +1 -0
- package/dist/test/tools/balance.test.js +167 -0
- package/dist/test/tools/balance.test.js.map +1 -0
- package/dist/test/tools/contract-info.test.d.ts +2 -0
- package/dist/test/tools/contract-info.test.d.ts.map +1 -0
- package/dist/test/tools/contract-info.test.js +286 -0
- package/dist/test/tools/contract-info.test.js.map +1 -0
- package/dist/test/tools/contract.test.d.ts +2 -0
- package/dist/test/tools/contract.test.d.ts.map +1 -0
- package/dist/test/tools/contract.test.js +234 -0
- package/dist/test/tools/contract.test.js.map +1 -0
- package/dist/test/tools/ens.test.d.ts +2 -0
- package/dist/test/tools/ens.test.d.ts.map +1 -0
- package/dist/test/tools/ens.test.js +236 -0
- package/dist/test/tools/ens.test.js.map +1 -0
- package/dist/test/tools/logs.test.d.ts +2 -0
- package/dist/test/tools/logs.test.d.ts.map +1 -0
- package/dist/test/tools/logs.test.js +196 -0
- package/dist/test/tools/logs.test.js.map +1 -0
- package/dist/test/tools/signatures.test.d.ts +2 -0
- package/dist/test/tools/signatures.test.d.ts.map +1 -0
- package/dist/test/tools/signatures.test.js +112 -0
- package/dist/test/tools/signatures.test.js.map +1 -0
- package/package.json +37 -22
- package/src/client.ts +160 -0
- package/src/index.ts +96 -0
- package/src/tools/advanced.ts +262 -0
- package/src/tools/balance.ts +176 -0
- package/src/tools/contract-info.ts +582 -0
- package/src/tools/contract.ts +180 -0
- package/src/tools/ens.ts +493 -0
- package/src/tools/index.ts +37 -0
- package/src/tools/logs.ts +291 -0
- package/src/tools/signatures.ts +126 -0
- package/src/types.ts +29 -0
- package/src/utils.ts +222 -0
- package/dist/hypersync-client.darwin-arm64-7fegfwn5.node +0 -0
- package/dist/index.js +0 -28282
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Create tool helper
|
|
2
|
+
export function createTool(title, description, schema, handler) {
|
|
3
|
+
return {
|
|
4
|
+
title,
|
|
5
|
+
description,
|
|
6
|
+
schema,
|
|
7
|
+
handler
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
// Convert BigInt values to strings for JSON serialization
|
|
11
|
+
export function convertBigIntToString(obj) {
|
|
12
|
+
if (typeof obj === 'bigint') {
|
|
13
|
+
return obj.toString();
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(obj)) {
|
|
16
|
+
return obj.map(item => convertBigIntToString(item));
|
|
17
|
+
}
|
|
18
|
+
if (obj && typeof obj === 'object') {
|
|
19
|
+
const converted = {};
|
|
20
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
21
|
+
converted[key] = convertBigIntToString(value);
|
|
22
|
+
}
|
|
23
|
+
return converted;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
// Convert arguments to appropriate types based on ABI
|
|
28
|
+
export function convertArgumentsToTypes(args, abiInputs) {
|
|
29
|
+
return args.map((arg, index) => {
|
|
30
|
+
if (index >= abiInputs.length) {
|
|
31
|
+
throw new Error(`Too many arguments provided. Expected ${abiInputs.length}, got ${args.length}`);
|
|
32
|
+
}
|
|
33
|
+
const param = abiInputs[index];
|
|
34
|
+
if (!param?.type) {
|
|
35
|
+
throw new Error(`Missing type information for parameter at index ${index}`);
|
|
36
|
+
}
|
|
37
|
+
const paramType = param.type;
|
|
38
|
+
// Handle null values
|
|
39
|
+
if (arg === null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
// Handle different parameter types
|
|
43
|
+
if (paramType === 'address') {
|
|
44
|
+
return String(arg);
|
|
45
|
+
}
|
|
46
|
+
if (paramType === 'bool') {
|
|
47
|
+
if (typeof arg === 'boolean')
|
|
48
|
+
return arg;
|
|
49
|
+
if (typeof arg === 'string')
|
|
50
|
+
return arg.toLowerCase() === 'true';
|
|
51
|
+
return Boolean(arg);
|
|
52
|
+
}
|
|
53
|
+
if (paramType.startsWith('uint') || paramType.startsWith('int')) {
|
|
54
|
+
if (typeof arg === 'number')
|
|
55
|
+
return BigInt(arg);
|
|
56
|
+
if (typeof arg === 'string')
|
|
57
|
+
return BigInt(arg);
|
|
58
|
+
throw new Error(`Invalid type for ${paramType}: ${typeof arg}`);
|
|
59
|
+
}
|
|
60
|
+
if (paramType === 'string') {
|
|
61
|
+
return String(arg);
|
|
62
|
+
}
|
|
63
|
+
if (paramType === 'bytes' || paramType.startsWith('bytes')) {
|
|
64
|
+
return String(arg);
|
|
65
|
+
}
|
|
66
|
+
// For other types, try to convert appropriately
|
|
67
|
+
if (typeof arg === 'string' && arg.startsWith('0x')) {
|
|
68
|
+
return arg; // Assume it's already properly formatted
|
|
69
|
+
}
|
|
70
|
+
return arg;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Convert event arguments to appropriate types
|
|
74
|
+
export function convertEventArgsToTypes(eventArgs, abiInputs) {
|
|
75
|
+
const converted = {};
|
|
76
|
+
for (const [argName, argValue] of Object.entries(eventArgs)) {
|
|
77
|
+
// Find the parameter definition for this argument name
|
|
78
|
+
const param = abiInputs.find(input => input.name === argName);
|
|
79
|
+
if (!param) {
|
|
80
|
+
throw new Error(`Parameter '${argName}' not found in event ABI`);
|
|
81
|
+
}
|
|
82
|
+
if (!param.type) {
|
|
83
|
+
throw new Error(`Missing type information for parameter '${argName}'`);
|
|
84
|
+
}
|
|
85
|
+
const paramType = param.type;
|
|
86
|
+
// Handle null/undefined values
|
|
87
|
+
if (argValue === null || argValue === undefined) {
|
|
88
|
+
converted[argName] = null;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Handle different parameter types
|
|
92
|
+
if (paramType === 'address') {
|
|
93
|
+
converted[argName] = String(argValue);
|
|
94
|
+
}
|
|
95
|
+
else if (paramType === 'bool') {
|
|
96
|
+
if (typeof argValue === 'boolean') {
|
|
97
|
+
converted[argName] = argValue;
|
|
98
|
+
}
|
|
99
|
+
else if (typeof argValue === 'string') {
|
|
100
|
+
converted[argName] = argValue.toLowerCase() === 'true';
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
converted[argName] = Boolean(argValue);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else if (paramType.startsWith('uint') || paramType.startsWith('int')) {
|
|
107
|
+
if (typeof argValue === 'number') {
|
|
108
|
+
converted[argName] = BigInt(argValue);
|
|
109
|
+
}
|
|
110
|
+
else if (typeof argValue === 'string') {
|
|
111
|
+
converted[argName] = BigInt(argValue);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
throw new Error(`Invalid type for ${paramType}: ${typeof argValue}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else if (paramType === 'string') {
|
|
118
|
+
converted[argName] = String(argValue);
|
|
119
|
+
}
|
|
120
|
+
else if (paramType === 'bytes' || paramType.startsWith('bytes')) {
|
|
121
|
+
converted[argName] = String(argValue);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// For other types, handle arrays and try to convert appropriately
|
|
125
|
+
if (Array.isArray(argValue)) {
|
|
126
|
+
converted[argName] = argValue;
|
|
127
|
+
}
|
|
128
|
+
else if (typeof argValue === 'string' && argValue.startsWith('0x')) {
|
|
129
|
+
converted[argName] = argValue; // Assume it's already properly formatted
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
converted[argName] = argValue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return converted;
|
|
137
|
+
}
|
|
138
|
+
// Format response as tool result
|
|
139
|
+
export function formatResponse(data) {
|
|
140
|
+
const serializable = convertBigIntToString(data);
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: 'text',
|
|
145
|
+
text: JSON.stringify(serializable, null, 2)
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// Parse command line arguments
|
|
151
|
+
export function parseCommandLineArgs() {
|
|
152
|
+
const config = {};
|
|
153
|
+
function getArgValue(argName) {
|
|
154
|
+
const args = process.argv;
|
|
155
|
+
const index = args.findIndex(arg => arg === argName);
|
|
156
|
+
return index !== -1 && index + 1 < args.length ? args[index + 1] : undefined;
|
|
157
|
+
}
|
|
158
|
+
function hasArg(argName) {
|
|
159
|
+
return process.argv.includes(argName);
|
|
160
|
+
}
|
|
161
|
+
// Check for help flag
|
|
162
|
+
if (hasArg('--help') || hasArg('-h')) {
|
|
163
|
+
config.showHelp = true;
|
|
164
|
+
return config;
|
|
165
|
+
}
|
|
166
|
+
// Parse environment variables and command line arguments
|
|
167
|
+
config.etherscanApiKey = process.env.ETHERSCAN_API_KEY || getArgValue('--etherscan-api-key');
|
|
168
|
+
config.alchemyApiKey = process.env.ALCHEMY_API_KEY || getArgValue('--alchemy-api-key');
|
|
169
|
+
config.infuraApiKey = process.env.INFURA_API_KEY || getArgValue('--infura-api-key');
|
|
170
|
+
config.hypersyncApiKey = process.env.HYPERSYNC_API_KEY || getArgValue('--hypersync-api-key');
|
|
171
|
+
// Parse custom RPC URLs
|
|
172
|
+
const customRpcs = getArgValue('--custom-rpc');
|
|
173
|
+
if (customRpcs) {
|
|
174
|
+
try {
|
|
175
|
+
config.customRpcUrls = JSON.parse(customRpcs);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
console.error('Invalid JSON for --custom-rpc:', customRpcs);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return config;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"balance.test.d.ts","sourceRoot":"","sources":["../../../test/tools/balance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { config } from 'dotenv';
|
|
3
|
+
import { initializeClientManager } from '../../src/client.js';
|
|
4
|
+
import balanceTools from '../../src/tools/balance.js';
|
|
5
|
+
// Load environment variables
|
|
6
|
+
config();
|
|
7
|
+
describe('Balance 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_balance', () => {
|
|
18
|
+
it('should fetch native ETH balance for an address', async () => {
|
|
19
|
+
const VITALIK_ADDRESS = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
|
20
|
+
const result = await balanceTools.get_balance.handler({
|
|
21
|
+
queries: [
|
|
22
|
+
{
|
|
23
|
+
chain: 'mainnet',
|
|
24
|
+
address: VITALIK_ADDRESS
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
const data = JSON.parse(result.content[0].text);
|
|
29
|
+
expect(data.success).toBe(true);
|
|
30
|
+
expect(data.results).toHaveLength(1);
|
|
31
|
+
expect(data.results[0].success).toBe(true);
|
|
32
|
+
expect(data.results[0].address).toBe(VITALIK_ADDRESS);
|
|
33
|
+
expect(data.results[0].chain).toBe('mainnet');
|
|
34
|
+
expect(data.results[0].balance).toBeDefined();
|
|
35
|
+
expect(data.results[0].balanceFormatted).toBeDefined();
|
|
36
|
+
}, 30000);
|
|
37
|
+
it('should fetch ERC20 token balance (USDC)', async () => {
|
|
38
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
39
|
+
const HOLDER_ADDRESS = '0x28C6c06298d514Db089934071355E5743bf21d60'; // Binance 14
|
|
40
|
+
const result = await balanceTools.get_balance.handler({
|
|
41
|
+
queries: [
|
|
42
|
+
{
|
|
43
|
+
chain: 'mainnet',
|
|
44
|
+
address: HOLDER_ADDRESS,
|
|
45
|
+
tokenAddress: USDC_CONTRACT
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
const data = JSON.parse(result.content[0].text);
|
|
50
|
+
expect(data.success).toBe(true);
|
|
51
|
+
expect(data.results).toHaveLength(1);
|
|
52
|
+
expect(data.results[0].success).toBe(true);
|
|
53
|
+
expect(data.results[0].address).toBe(HOLDER_ADDRESS);
|
|
54
|
+
expect(data.results[0].tokenAddress).toBe(USDC_CONTRACT);
|
|
55
|
+
expect(data.results[0].balance).toBeDefined();
|
|
56
|
+
expect(data.results[0].balanceFormatted).toBeDefined();
|
|
57
|
+
expect(data.results[0].decimals).toBe(6);
|
|
58
|
+
expect(BigInt(data.results[0].balance)).toBeGreaterThan(0n);
|
|
59
|
+
}, 30000);
|
|
60
|
+
it('should handle batch queries efficiently', async () => {
|
|
61
|
+
const VITALIK_ADDRESS = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
|
62
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
63
|
+
const result = await balanceTools.get_balance.handler({
|
|
64
|
+
queries: [
|
|
65
|
+
{
|
|
66
|
+
chain: 'mainnet',
|
|
67
|
+
address: VITALIK_ADDRESS,
|
|
68
|
+
label: 'Vitalik ETH'
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
chain: 'mainnet',
|
|
72
|
+
address: VITALIK_ADDRESS,
|
|
73
|
+
tokenAddress: USDC_CONTRACT,
|
|
74
|
+
label: 'Vitalik USDC'
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
const data = JSON.parse(result.content[0].text);
|
|
79
|
+
expect(data.success).toBe(true);
|
|
80
|
+
expect(data.results).toHaveLength(2);
|
|
81
|
+
expect(data.results[0].label).toBe('Vitalik ETH');
|
|
82
|
+
expect(data.results[1].label).toBe('Vitalik USDC');
|
|
83
|
+
expect(data.results[1].decimals).toBe(6);
|
|
84
|
+
}, 30000);
|
|
85
|
+
it('should fetch balance at specific block number', async () => {
|
|
86
|
+
const VITALIK_ADDRESS = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
|
87
|
+
const BLOCK_NUMBER = '18000000';
|
|
88
|
+
const result = await balanceTools.get_balance.handler({
|
|
89
|
+
queries: [
|
|
90
|
+
{
|
|
91
|
+
chain: 'mainnet',
|
|
92
|
+
address: VITALIK_ADDRESS,
|
|
93
|
+
blockNumber: BLOCK_NUMBER
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
});
|
|
97
|
+
const data = JSON.parse(result.content[0].text);
|
|
98
|
+
expect(data.success).toBe(true);
|
|
99
|
+
expect(data.results).toHaveLength(1);
|
|
100
|
+
expect(data.results[0].success).toBe(true);
|
|
101
|
+
expect(data.results[0].blockNumber).toBe(BLOCK_NUMBER);
|
|
102
|
+
expect(data.results[0].balance).toBeDefined();
|
|
103
|
+
}, 30000);
|
|
104
|
+
it('should handle zero balance addresses', async () => {
|
|
105
|
+
// Use an address that's extremely unlikely to have balance
|
|
106
|
+
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000002';
|
|
107
|
+
const result = await balanceTools.get_balance.handler({
|
|
108
|
+
queries: [
|
|
109
|
+
{
|
|
110
|
+
chain: 'mainnet',
|
|
111
|
+
address: ZERO_ADDRESS
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
const data = JSON.parse(result.content[0].text);
|
|
116
|
+
expect(data.success).toBe(true);
|
|
117
|
+
expect(data.results).toHaveLength(1);
|
|
118
|
+
expect(data.results[0].success).toBe(true);
|
|
119
|
+
// Balance might be 0 or very small
|
|
120
|
+
expect(data.results[0].balance).toBeDefined();
|
|
121
|
+
expect(data.results[0].balanceFormatted).toBeDefined();
|
|
122
|
+
}, 30000);
|
|
123
|
+
it('should handle invalid token address gracefully', async () => {
|
|
124
|
+
const VITALIK_ADDRESS = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
|
125
|
+
const INVALID_TOKEN = '0x0000000000000000000000000000000000000001';
|
|
126
|
+
const result = await balanceTools.get_balance.handler({
|
|
127
|
+
queries: [
|
|
128
|
+
{
|
|
129
|
+
chain: 'mainnet',
|
|
130
|
+
address: VITALIK_ADDRESS,
|
|
131
|
+
tokenAddress: INVALID_TOKEN
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
});
|
|
135
|
+
const data = JSON.parse(result.content[0].text);
|
|
136
|
+
expect(data.success).toBe(true);
|
|
137
|
+
expect(data.results).toHaveLength(1);
|
|
138
|
+
// Should either succeed with 0 balance or fail gracefully
|
|
139
|
+
expect(data.results[0]).toHaveProperty('success');
|
|
140
|
+
}, 30000);
|
|
141
|
+
it('should work across different chains', async () => {
|
|
142
|
+
const TEST_ADDRESS = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
|
|
143
|
+
const result = await balanceTools.get_balance.handler({
|
|
144
|
+
queries: [
|
|
145
|
+
{
|
|
146
|
+
chain: 'mainnet',
|
|
147
|
+
address: TEST_ADDRESS,
|
|
148
|
+
label: 'Ethereum'
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
chain: 'base',
|
|
152
|
+
address: TEST_ADDRESS,
|
|
153
|
+
label: 'Base'
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
});
|
|
157
|
+
const data = JSON.parse(result.content[0].text);
|
|
158
|
+
expect(data.success).toBe(true);
|
|
159
|
+
expect(data.results).toHaveLength(2);
|
|
160
|
+
expect(data.results[0].chain).toBe('mainnet');
|
|
161
|
+
expect(data.results[0].label).toBe('Ethereum');
|
|
162
|
+
expect(data.results[1].chain).toBe('base');
|
|
163
|
+
expect(data.results[1].label).toBe('Base');
|
|
164
|
+
}, 30000);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=balance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.test.js","sourceRoot":"","sources":["../../../test/tools/balance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-info.test.d.ts","sourceRoot":"","sources":["../../../test/tools/contract-info.test.ts"],"names":[],"mappings":""}
|