web3-tools-mcp 1.2.0 → 1.2.2

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 (31) hide show
  1. package/README.md +91 -228
  2. package/package.json +5 -5
  3. package/dist/package.json +0 -63
  4. package/dist/test/tools/advanced.test.d.ts +0 -2
  5. package/dist/test/tools/advanced.test.d.ts.map +0 -1
  6. package/dist/test/tools/advanced.test.js +0 -235
  7. package/dist/test/tools/advanced.test.js.map +0 -1
  8. package/dist/test/tools/balance.test.d.ts +0 -2
  9. package/dist/test/tools/balance.test.d.ts.map +0 -1
  10. package/dist/test/tools/balance.test.js +0 -167
  11. package/dist/test/tools/balance.test.js.map +0 -1
  12. package/dist/test/tools/contract-info.test.d.ts +0 -2
  13. package/dist/test/tools/contract-info.test.d.ts.map +0 -1
  14. package/dist/test/tools/contract-info.test.js +0 -286
  15. package/dist/test/tools/contract-info.test.js.map +0 -1
  16. package/dist/test/tools/contract.test.d.ts +0 -2
  17. package/dist/test/tools/contract.test.d.ts.map +0 -1
  18. package/dist/test/tools/contract.test.js +0 -234
  19. package/dist/test/tools/contract.test.js.map +0 -1
  20. package/dist/test/tools/ens.test.d.ts +0 -2
  21. package/dist/test/tools/ens.test.d.ts.map +0 -1
  22. package/dist/test/tools/ens.test.js +0 -236
  23. package/dist/test/tools/ens.test.js.map +0 -1
  24. package/dist/test/tools/logs.test.d.ts +0 -2
  25. package/dist/test/tools/logs.test.d.ts.map +0 -1
  26. package/dist/test/tools/logs.test.js +0 -196
  27. package/dist/test/tools/logs.test.js.map +0 -1
  28. package/dist/test/tools/signatures.test.d.ts +0 -2
  29. package/dist/test/tools/signatures.test.d.ts.map +0 -1
  30. package/dist/test/tools/signatures.test.js +0 -112
  31. package/dist/test/tools/signatures.test.js.map +0 -1
@@ -1,236 +0,0 @@
1
- import { describe, it, expect, beforeAll } from 'vitest';
2
- import { config } from 'dotenv';
3
- import { initializeClientManager } from '../../src/client.js';
4
- import ensTools from '../../src/tools/ens.js';
5
- // Load environment variables
6
- config();
7
- describe('ENS 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('resolve_ens_name', () => {
18
- it('should resolve vitalik.eth to an address', async () => {
19
- const result = await ensTools.resolve_ens_name.handler({
20
- chain: 'mainnet',
21
- name: 'vitalik.eth'
22
- });
23
- const data = JSON.parse(result.content[0].text);
24
- expect(data.success).toBe(true);
25
- expect(data.name).toBe('vitalik.eth');
26
- expect(data.address).toBeTruthy();
27
- expect(data.address).toMatch(/^0x[a-fA-F0-9]{40}$/);
28
- }, 30000);
29
- it('should return null for non-existent ENS name', async () => {
30
- const result = await ensTools.resolve_ens_name.handler({
31
- chain: 'mainnet',
32
- name: 'this-name-definitely-does-not-exist-12345.eth'
33
- });
34
- const data = JSON.parse(result.content[0].text);
35
- expect(data.success).toBe(false);
36
- expect(data.address).toBeNull();
37
- }, 30000);
38
- });
39
- describe('reverse_resolve_ens', () => {
40
- it('should reverse resolve vitalik.eth address to name', async () => {
41
- // First resolve vitalik.eth to get the address
42
- const resolveResult = await ensTools.resolve_ens_name.handler({
43
- chain: 'mainnet',
44
- name: 'vitalik.eth'
45
- });
46
- const resolveData = JSON.parse(resolveResult.content[0].text);
47
- const address = resolveData.address;
48
- // Then reverse resolve
49
- const result = await ensTools.reverse_resolve_ens.handler({
50
- chain: 'mainnet',
51
- address
52
- });
53
- const data = JSON.parse(result.content[0].text);
54
- expect(data.success).toBe(true);
55
- expect(data.address).toBe(address);
56
- expect(data.name).toBeTruthy();
57
- }, 30000);
58
- it('should return null for address without reverse record', async () => {
59
- const result = await ensTools.reverse_resolve_ens.handler({
60
- chain: 'mainnet',
61
- address: '0x0000000000000000000000000000000000000001'
62
- });
63
- const data = JSON.parse(result.content[0].text);
64
- expect(data.success).toBe(false);
65
- expect(data.name).toBeNull();
66
- }, 30000);
67
- });
68
- describe('get_ens_text_record', () => {
69
- it('should get text record from ENS name', async () => {
70
- const result = await ensTools.get_ens_text_record.handler({
71
- chain: 'mainnet',
72
- name: 'vitalik.eth',
73
- key: 'url'
74
- });
75
- const data = JSON.parse(result.content[0].text);
76
- // vitalik.eth may or may not have a url record, so we just check the structure
77
- expect(data).toHaveProperty('success');
78
- expect(data.name).toBe('vitalik.eth');
79
- expect(data.key).toBe('url');
80
- }, 30000);
81
- });
82
- describe('get_ens_avatar', () => {
83
- it('should get avatar from ENS name with avatar set', async () => {
84
- const result = await ensTools.get_ens_avatar.handler({
85
- chain: 'mainnet',
86
- name: 'vitalik.eth'
87
- });
88
- const data = JSON.parse(result.content[0].text);
89
- expect(data).toHaveProperty('success');
90
- expect(data.name).toBe('vitalik.eth');
91
- // Avatar may or may not be set
92
- if (data.success) {
93
- expect(data.avatar).toBeTruthy();
94
- }
95
- }, 30000);
96
- });
97
- describe('batch_resolve_ens_names', () => {
98
- it('should batch resolve multiple ENS names', async () => {
99
- const result = await ensTools.batch_resolve_ens_names.handler({
100
- chain: 'mainnet',
101
- names: ['vitalik.eth', 'nick.eth', 'nonexistent12345.eth']
102
- });
103
- const data = JSON.parse(result.content[0].text);
104
- expect(data.success).toBe(true);
105
- expect(data.totalNames).toBe(3);
106
- expect(data.results).toHaveLength(3);
107
- expect(data.successfulResolves).toBeGreaterThan(0);
108
- // Check that vitalik.eth resolved successfully
109
- const vitalikResult = data.results.find((r) => r.name === 'vitalik.eth');
110
- expect(vitalikResult).toBeTruthy();
111
- expect(vitalikResult.success).toBe(true);
112
- expect(vitalikResult.address).toBeTruthy();
113
- }, 30000);
114
- });
115
- // Base ENS Tests
116
- describe('Base ENS Support', () => {
117
- const BASE_TEST_NAME = 'ben👾the👾dev.base.eth';
118
- const BASE_TEST_ADDRESS = '0xc880e213f2aB4BAe36C8bF19a6Df6757152242c0';
119
- describe('resolve_ens_name on Base', () => {
120
- it('should resolve Base ENS name to address', async () => {
121
- const result = await ensTools.resolve_ens_name.handler({
122
- chain: 'base',
123
- name: BASE_TEST_NAME
124
- });
125
- const data = JSON.parse(result.content[0].text);
126
- expect(data.success).toBe(true);
127
- expect(data.name).toBe(BASE_TEST_NAME);
128
- expect(data.address).toBe(BASE_TEST_ADDRESS);
129
- expect(data.chain).toBe('base');
130
- }, 30000);
131
- it('should return null for non-existent Base ENS name', async () => {
132
- const result = await ensTools.resolve_ens_name.handler({
133
- chain: 'base',
134
- name: 'this-definitely-does-not-exist-12345.base.eth'
135
- });
136
- const data = JSON.parse(result.content[0].text);
137
- expect(data.success).toBe(false);
138
- expect(data.address).toBeNull();
139
- }, 30000);
140
- });
141
- describe('reverse_resolve_ens on Base', () => {
142
- it('should reverse resolve Base address to ENS name', async () => {
143
- const result = await ensTools.reverse_resolve_ens.handler({
144
- chain: 'base',
145
- address: BASE_TEST_ADDRESS
146
- });
147
- const data = JSON.parse(result.content[0].text);
148
- expect(data.success).toBe(true);
149
- expect(data.address).toBe(BASE_TEST_ADDRESS);
150
- expect(data.name).toBe(BASE_TEST_NAME);
151
- expect(data.chain).toBe('base');
152
- }, 30000);
153
- it('should return null for Base address without reverse record', async () => {
154
- const result = await ensTools.reverse_resolve_ens.handler({
155
- chain: 'base',
156
- address: '0x0000000000000000000000000000000000000001'
157
- });
158
- const data = JSON.parse(result.content[0].text);
159
- expect(data.success).toBe(false);
160
- expect(data.name).toBeNull();
161
- }, 30000);
162
- });
163
- describe('get_ens_text_record on Base', () => {
164
- it('should get twitter text record from Base ENS name', async () => {
165
- const result = await ensTools.get_ens_text_record.handler({
166
- chain: 'base',
167
- name: BASE_TEST_NAME,
168
- key: 'com.twitter'
169
- });
170
- const data = JSON.parse(result.content[0].text);
171
- expect(data.success).toBe(true);
172
- expect(data.name).toBe(BASE_TEST_NAME);
173
- expect(data.key).toBe('com.twitter');
174
- expect(data.value).toBe('hajnalben');
175
- expect(data.chain).toBe('base');
176
- }, 30000);
177
- it('should get location text record from Base ENS name', async () => {
178
- const result = await ensTools.get_ens_text_record.handler({
179
- chain: 'base',
180
- name: BASE_TEST_NAME,
181
- key: 'location'
182
- });
183
- const data = JSON.parse(result.content[0].text);
184
- expect(data.success).toBe(true);
185
- expect(data.value).toBe('Budapest, Hungary');
186
- }, 30000);
187
- it('should return null for non-existent text record on Base', async () => {
188
- const result = await ensTools.get_ens_text_record.handler({
189
- chain: 'base',
190
- name: BASE_TEST_NAME,
191
- key: 'nonexistent-key-12345'
192
- });
193
- const data = JSON.parse(result.content[0].text);
194
- expect(data.success).toBe(false);
195
- expect(data.value).toBeNull();
196
- }, 30000);
197
- });
198
- describe('get_ens_avatar on Base', () => {
199
- it('should get avatar from Base ENS name', async () => {
200
- const result = await ensTools.get_ens_avatar.handler({
201
- chain: 'base',
202
- name: BASE_TEST_NAME
203
- });
204
- const data = JSON.parse(result.content[0].text);
205
- expect(data.success).toBe(true);
206
- expect(data.name).toBe(BASE_TEST_NAME);
207
- expect(data.avatar).toBeTruthy();
208
- expect(data.avatar).toContain('ipfs://');
209
- expect(data.chain).toBe('base');
210
- }, 30000);
211
- });
212
- describe('batch_resolve_ens_names on Base', () => {
213
- it('should batch resolve multiple Base ENS names', async () => {
214
- const result = await ensTools.batch_resolve_ens_names.handler({
215
- chain: 'base',
216
- names: [BASE_TEST_NAME, 'nonexistent12345.base.eth']
217
- });
218
- const data = JSON.parse(result.content[0].text);
219
- expect(data.success).toBe(true);
220
- expect(data.chain).toBe('base');
221
- expect(data.totalNames).toBe(2);
222
- expect(data.results).toHaveLength(2);
223
- // Check that our test name resolved successfully
224
- const testResult = data.results.find((r) => r.name === BASE_TEST_NAME);
225
- expect(testResult).toBeTruthy();
226
- expect(testResult.success).toBe(true);
227
- expect(testResult.address).toBe(BASE_TEST_ADDRESS);
228
- // Check that non-existent name failed
229
- const nonExistentResult = data.results.find((r) => r.name === 'nonexistent12345.base.eth');
230
- expect(nonExistentResult).toBeTruthy();
231
- expect(nonExistentResult.success).toBe(false);
232
- }, 30000);
233
- });
234
- });
235
- });
236
- //# sourceMappingURL=ens.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ens.test.js","sourceRoot":"","sources":["../../../test/tools/ens.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=logs.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.test.d.ts","sourceRoot":"","sources":["../../../test/tools/logs.test.ts"],"names":[],"mappings":""}
@@ -1,196 +0,0 @@
1
- import { describe, it, expect, beforeAll } from 'vitest';
2
- import { config } from 'dotenv';
3
- import { initializeClientManager } from '../../src/client.js';
4
- import logsTools from '../../src/tools/logs.js';
5
- // Load environment variables
6
- config();
7
- describe('Logs 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_logs', () => {
18
- it('should fetch Transfer events from USDC contract', async () => {
19
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
20
- const result = await logsTools.get_logs.handler({
21
- chain: 'mainnet',
22
- address: USDC_CONTRACT,
23
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
24
- fromBlock: '21000000',
25
- toBlock: '21000100'
26
- });
27
- const data = JSON.parse(result.content[0].text);
28
- expect(data.logs).toBeDefined();
29
- expect(Array.isArray(data.logs)).toBe(true);
30
- expect(data.chain).toBe('mainnet');
31
- expect(data.filters.address).toBe(USDC_CONTRACT);
32
- expect(data.fromBlock).toBe('21000000');
33
- expect(data.toBlock).toBe('21000100');
34
- }, 30000);
35
- it('should filter Transfer events by indexed from parameter', async () => {
36
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
37
- const BINANCE_ADDRESS = '0x28C6c06298d514Db089934071355E5743bf21d60';
38
- const result = await logsTools.get_logs.handler({
39
- chain: 'mainnet',
40
- address: USDC_CONTRACT,
41
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
42
- eventArgs: {
43
- from: BINANCE_ADDRESS
44
- },
45
- fromBlock: '21000000',
46
- toBlock: '21000100'
47
- });
48
- const data = JSON.parse(result.content[0].text);
49
- expect(data.logs).toBeDefined();
50
- // All events should have the specified 'from' address
51
- if (data.logs.length > 0) {
52
- data.logs.forEach((event) => {
53
- expect(event.decoded.args.from.toLowerCase()).toBe(BINANCE_ADDRESS.toLowerCase());
54
- });
55
- }
56
- }, 30000);
57
- it('should filter Transfer events by indexed to parameter', async () => {
58
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
59
- const RECEIVER_ADDRESS = '0x28C6c06298d514Db089934071355E5743bf21d60';
60
- const result = await logsTools.get_logs.handler({
61
- chain: 'mainnet',
62
- address: USDC_CONTRACT,
63
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
64
- eventArgs: {
65
- to: RECEIVER_ADDRESS
66
- },
67
- fromBlock: '21000000',
68
- toBlock: '21000100'
69
- });
70
- const data = JSON.parse(result.content[0].text);
71
- expect(data.logs).toBeDefined();
72
- // All events should have the specified 'to' address
73
- if (data.logs.length > 0) {
74
- data.logs.forEach((event) => {
75
- expect(event.decoded.args.to.toLowerCase()).toBe(RECEIVER_ADDRESS.toLowerCase());
76
- });
77
- }
78
- }, 30000);
79
- it('should decode event arguments correctly', async () => {
80
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
81
- const result = await logsTools.get_logs.handler({
82
- chain: 'mainnet',
83
- address: USDC_CONTRACT,
84
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
85
- fromBlock: '21000000',
86
- toBlock: '21000010'
87
- });
88
- const data = JSON.parse(result.content[0].text);
89
- if (data.logs.length > 0) {
90
- const event = data.logs[0];
91
- expect(event.decoded.args).toBeDefined();
92
- expect(event.decoded.args.from).toBeDefined();
93
- expect(event.decoded.args.to).toBeDefined();
94
- expect(event.decoded.args.value).toBeDefined();
95
- expect(event.blockNumber).toBeDefined();
96
- expect(event.transactionHash).toBeDefined();
97
- expect(event.logIndex).toBeDefined();
98
- }
99
- }, 30000);
100
- it('should fetch Approval events', async () => {
101
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
102
- const result = await logsTools.get_logs.handler({
103
- chain: 'mainnet',
104
- address: USDC_CONTRACT,
105
- eventAbi: 'event Approval(address indexed owner, address indexed spender, uint256 value)',
106
- fromBlock: '21000000',
107
- toBlock: '21000100'
108
- });
109
- const data = JSON.parse(result.content[0].text);
110
- expect(data.logs).toBeDefined();
111
- if (data.logs.length > 0) {
112
- const event = data.logs[0];
113
- expect(event.decoded.args.owner).toBeDefined();
114
- expect(event.decoded.args.spender).toBeDefined();
115
- expect(event.decoded.args.value).toBeDefined();
116
- }
117
- }, 30000);
118
- it('should work without address filter (query all contracts)', async () => {
119
- const result = await logsTools.get_logs.handler({
120
- chain: 'mainnet',
121
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
122
- fromBlock: '21000000',
123
- toBlock: '21000001'
124
- });
125
- const data = JSON.parse(result.content[0].text);
126
- expect(data.logs).toBeDefined();
127
- expect(Array.isArray(data.logs)).toBe(true);
128
- }, 30000);
129
- it('should handle events with no results', async () => {
130
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
131
- const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
132
- const result = await logsTools.get_logs.handler({
133
- chain: 'mainnet',
134
- address: USDC_CONTRACT,
135
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
136
- eventArgs: {
137
- from: ZERO_ADDRESS,
138
- to: ZERO_ADDRESS
139
- },
140
- fromBlock: '21000000',
141
- toBlock: '21000010'
142
- });
143
- const data = JSON.parse(result.content[0].text);
144
- expect(data.logs).toBeDefined();
145
- expect(Array.isArray(data.logs)).toBe(true);
146
- // Might have 0 events, that's valid
147
- }, 30000);
148
- it('should work with different chains', async () => {
149
- const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
150
- const result = await logsTools.get_logs.handler({
151
- chain: 'base',
152
- address: USDC_BASE,
153
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
154
- fromBlock: '10000000',
155
- toBlock: '10000010'
156
- });
157
- const data = JSON.parse(result.content[0].text);
158
- expect(data.chain).toBe('base');
159
- expect(data.logs).toBeDefined();
160
- }, 30000);
161
- it('should include event metadata', async () => {
162
- const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
163
- const result = await logsTools.get_logs.handler({
164
- chain: 'mainnet',
165
- address: USDC_CONTRACT,
166
- eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
167
- fromBlock: '21000000',
168
- toBlock: '21000010'
169
- });
170
- const data = JSON.parse(result.content[0].text);
171
- expect(data.count).toBeDefined();
172
- expect(typeof data.count).toBe('number');
173
- expect(data.eventSignature).toContain('Transfer');
174
- }, 30000);
175
- it('should handle custom events with different parameter types', async () => {
176
- // Using a well-known contract with custom events - Uniswap V2 Pair
177
- const UNISWAP_PAIR = '0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc'; // USDC-WETH
178
- const result = await logsTools.get_logs.handler({
179
- chain: 'mainnet',
180
- address: UNISWAP_PAIR,
181
- eventAbi: 'event Sync(uint112 reserve0, uint112 reserve1)',
182
- fromBlock: '21000000',
183
- toBlock: '21000010'
184
- });
185
- const data = JSON.parse(result.content[0].text);
186
- expect(data.logs).toBeDefined();
187
- if (data.logs.length > 0) {
188
- const event = data.logs[0];
189
- expect(event.decoded.args).toBeDefined();
190
- expect(event.decoded.args.reserve0).toBeDefined();
191
- expect(event.decoded.args.reserve1).toBeDefined();
192
- }
193
- }, 30000);
194
- });
195
- });
196
- //# sourceMappingURL=logs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../test/tools/logs.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=signatures.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signatures.test.d.ts","sourceRoot":"","sources":["../../../test/tools/signatures.test.ts"],"names":[],"mappings":""}
@@ -1,112 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import signatureTools from "../../src/tools/signatures.js";
3
- describe("Signature Tools", () => {
4
- describe("get_function_signature", () => {
5
- it("should generate correct signature for transfer function", async () => {
6
- const result = await signatureTools.get_function_signature.handler({
7
- items: [{ functionAbi: "function transfer(address to, uint256 amount)" }],
8
- });
9
- const data = JSON.parse(result.content[0].text);
10
- expect(data).toHaveLength(1);
11
- expect(data[0].signature).toBe("0xa9059cbb");
12
- expect(data[0].functionName).toBe("transfer");
13
- expect(data[0].inputs).toHaveLength(2);
14
- });
15
- it("should handle multiple function signatures in batch", async () => {
16
- const result = await signatureTools.get_function_signature.handler({
17
- items: [
18
- { functionAbi: "function balanceOf(address owner) view returns (uint256)" },
19
- { functionAbi: "function totalSupply() view returns (uint256)" },
20
- { functionAbi: "function name() view returns (string)" },
21
- ],
22
- });
23
- const data = JSON.parse(result.content[0].text);
24
- expect(data).toHaveLength(3);
25
- expect(data[0].signature).toBe("0x70a08231"); // balanceOf
26
- expect(data[0].functionName).toBe("balanceOf");
27
- expect(data[1].functionName).toBe("totalSupply");
28
- expect(data[2].functionName).toBe("name");
29
- });
30
- it("should include state mutability information", async () => {
31
- const result = await signatureTools.get_function_signature.handler({
32
- items: [{ functionAbi: "function getValue() view returns (uint256)" }],
33
- });
34
- const data = JSON.parse(result.content[0].text);
35
- expect(data[0].stateMutability).toBe("view");
36
- });
37
- });
38
- describe("get_event_signature", () => {
39
- it("should generate correct topic0 for Transfer event", async () => {
40
- const result = await signatureTools.get_event_signature.handler({
41
- items: [
42
- { eventAbi: "event Transfer(address indexed from, address indexed to, uint256 value)" },
43
- ],
44
- });
45
- const data = JSON.parse(result.content[0].text);
46
- expect(data).toHaveLength(1);
47
- expect(data[0].topic0).toBe("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef");
48
- expect(data[0].eventName).toBe("Transfer");
49
- });
50
- it("should handle multiple events in batch", async () => {
51
- const result = await signatureTools.get_event_signature.handler({
52
- items: [
53
- { eventAbi: "event Transfer(address indexed from, address indexed to, uint256 value)" },
54
- {
55
- eventAbi: "event Approval(address indexed owner, address indexed spender, uint256 value)",
56
- },
57
- ],
58
- });
59
- const data = JSON.parse(result.content[0].text);
60
- expect(data).toHaveLength(2);
61
- expect(data[0].eventName).toBe("Transfer");
62
- expect(data[1].eventName).toBe("Approval");
63
- });
64
- it("should include indexed parameter information", async () => {
65
- const result = await signatureTools.get_event_signature.handler({
66
- items: [
67
- { eventAbi: "event Transfer(address indexed from, address indexed to, uint256 value)" },
68
- ],
69
- });
70
- const data = JSON.parse(result.content[0].text);
71
- expect(data[0].inputs).toHaveLength(3);
72
- expect(data[0].inputs[0].indexed).toBe(true);
73
- expect(data[0].inputs[1].indexed).toBe(true);
74
- // Some parsers omit the `indexed` property for non-indexed params -> treat undefined as false
75
- expect(data[0].inputs[2].indexed ?? false).toBe(false);
76
- });
77
- });
78
- describe("get_error_signature", () => {
79
- it("should generate correct signature for custom error", async () => {
80
- const result = await signatureTools.get_error_signature.handler({
81
- items: [{ errorAbi: "error InsufficientBalance(uint256 available, uint256 required)" }],
82
- });
83
- const data = JSON.parse(result.content[0].text);
84
- expect(data).toHaveLength(1);
85
- expect(data[0].signature).toMatch(/^0x[a-f0-9]{8}$/);
86
- expect(data[0].errorName).toBe("InsufficientBalance");
87
- expect(data[0].inputs).toHaveLength(2);
88
- });
89
- it("should handle multiple errors in batch", async () => {
90
- const result = await signatureTools.get_error_signature.handler({
91
- items: [
92
- { errorAbi: "error InsufficientBalance(uint256 available, uint256 required)" },
93
- { errorAbi: "error Unauthorized()" },
94
- { errorAbi: "error InvalidAddress(address addr)" },
95
- ],
96
- });
97
- const data = JSON.parse(result.content[0].text);
98
- expect(data).toHaveLength(3);
99
- expect(data[0].errorName).toBe("InsufficientBalance");
100
- expect(data[1].errorName).toBe("Unauthorized");
101
- expect(data[2].errorName).toBe("InvalidAddress");
102
- });
103
- it("should handle errors with no parameters", async () => {
104
- const result = await signatureTools.get_error_signature.handler({
105
- items: [{ errorAbi: "error Unauthorized()" }],
106
- });
107
- const data = JSON.parse(result.content[0].text);
108
- expect(data[0].inputs).toHaveLength(0);
109
- });
110
- });
111
- });
112
- //# sourceMappingURL=signatures.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signatures.test.js","sourceRoot":"","sources":["../../../test/tools/signatures.test.ts"],"names":[],"mappings":"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"}