-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestDecoder.js
More file actions
87 lines (76 loc) · 4.7 KB
/
Copy pathtestDecoder.js
File metadata and controls
87 lines (76 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
const ABIDecoder = require('./abiDecoder');
/**
* 测试ABI解码器的功能
*/
async function runTests() {
console.log('===== ABI解码器测试 =====\n');
const decoder = new ABIDecoder();
decoder.init(); // 初始化,不依赖实际节点连接
// 测试1: 解码ERC20转账交易数据
console.log('测试1: 解码ERC20转账交易数据');
const transferData = '0xa9059cbb0000000000000000000000001234567890123456789012345678901234567890000000000000000000000000000000000000000000000000de0b6b3a7640000';
const transferResult = decoder.decodeTransactionData(transferData);
console.log(JSON.stringify(transferResult, null, 2));
console.log('验证结果: 函数签名应为 0xa9059cbb');
console.log(`验证通过: ${transferResult.signature === '0xa9059cbb'}`);
console.log('验证结果: 函数名称应为 transfer(address,uint256)');
console.log(`验证通过: ${transferResult.functionName === 'transfer(address,uint256)'}`);
console.log('验证结果: 应有2个参数');
console.log(`验证通过: ${transferResult.params && transferResult.params.param1 && transferResult.params.param2 ? '是' : '否'}`);
console.log('------------------------\n');
// 测试2: 解码approve函数
console.log('测试2: 解码approve函数');
const approveData = '0x095ea7b3000000000000000000000000987654321098765432109876543210987654321000000000000000000000000000000000000000000000000016345785d8a0000';
const approveResult = decoder.decodeTransactionData(approveData);
console.log(JSON.stringify(approveResult, null, 2));
console.log('验证结果: 函数签名应为 0x095ea7b3');
console.log(`验证通过: ${approveResult.signature === '0x095ea7b3'}`);
console.log('------------------------\n');
// 测试3: 解码未知函数签名
console.log('测试3: 解码未知函数签名');
const unknownData = '0x1234abcd0000000000000000000000000000000000000000000000000000000000000001';
const unknownResult = decoder.decodeTransactionData(unknownData);
console.log(JSON.stringify(unknownResult, null, 2));
console.log('验证结果: 应识别为未知函数');
console.log(`验证通过: ${unknownResult.functionName === '未知函数'}`);
console.log('------------------------\n');
// 测试4: 添加自定义函数签名
console.log('测试4: 添加自定义函数签名');
decoder.addFunctionSignatures({
'0x1234abcd': 'customFunction(uint256)'
});
const customResult = decoder.decodeTransactionData(unknownData);
console.log(JSON.stringify(customResult, null, 2));
console.log('验证结果: 应识别为自定义函数');
console.log(`验证通过: ${customResult.functionName === 'customFunction(uint256)'}`);
console.log('------------------------\n');
// 测试5: 无效数据格式
console.log('测试5: 无效数据格式');
const invalidData = 'invalid_data';
const invalidResult = decoder.decodeTransactionData(invalidData);
console.log(JSON.stringify(invalidResult, null, 2));
console.log('验证结果: 应返回错误信息');
console.log(`验证通过: ${invalidResult.error !== undefined}`);
console.log('------------------------\n');
// 测试6: 解码复杂参数类型(如multicall)
console.log('测试6: 解码multicall函数');
const multicallData = '0x02751cec00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004470a082310000000000000000000000001234567890123456789012345678901234567890000000000000000000000000000000000000000000000000000000000000000';
const multicallResult = decoder.decodeTransactionData(multicallData);
console.log(JSON.stringify(multicallResult, null, 2));
console.log('------------------------\n');
// 测试7: 测试交易哈希格式验证
console.log('测试7: 测试交易哈希格式验证');
const validHash = '0x1234567890123456789012345678901234567890123456789012345678901234';
const invalidHash = 'invalid_hash';
console.log(`有效哈希验证: ${decoder.isPossibleTransactionHash(validHash)}`);
console.log(`无效哈希验证: ${!decoder.isPossibleTransactionHash(invalidHash)}`);
console.log('------------------------\n');
console.log('===== 测试完成 =====');
console.log('注意: 由于没有实际连接到以太坊节点,无法测试从交易哈希获取数据的功能');
console.log('要测试完整功能,请确保有有效的以太坊节点连接,并使用真实的交易哈希');
}
// 运行测试
runTests().catch(error => {
console.error('测试失败:', error);
process.exit(1);
});