@clonegod/ttd-sui-common 1.0.7 → 1.0.8
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/dist/checkpoint_185049558.json +13761 -0
- package/dist/checkpoint_185049559.json +7487 -0
- package/dist/checkpoint_185071431_decoded.json +4996 -0
- package/dist/checkpoint_185071441_decoded.json +26073 -0
- package/dist/checkpoint_185071445_decoded.json +6731 -0
- package/dist/checkpoint_185071447_decoded.json +5477 -0
- package/dist/checkpoint_185071453_decoded.json +3382 -0
- package/dist/checkpoint_185071454_decoded.json +11236 -0
- package/dist/checkpoint_185071458_decoded.json +1546 -0
- package/dist/checkpoint_185071465_decoded.json +15284 -0
- package/dist/checkpoint_185071468_decoded.json +1616 -0
- package/dist/constants/index.d.ts +5 -0
- package/dist/constants/index.js +20 -0
- package/dist/grpc/grpc-connection.js +7 -1
- package/dist/grpc/subscription-service.js +11 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/test/test_checkpoint.d.ts +1 -0
- package/dist/test/test_checkpoint.js +70 -0
- package/dist/test/test_checkpoint_with_schema.d.ts +1 -0
- package/dist/test/test_checkpoint_with_schema.js +250 -0
- package/dist/test/test_dynamic_bcs.d.ts +1 -0
- package/dist/test/test_dynamic_bcs.js +82 -0
- package/dist/test/test_github_extractor.d.ts +1 -0
- package/dist/test/test_github_extractor.js +69 -0
- package/dist/test/test_grpc.js +0 -11
- package/dist/test/test_hybrid_bcs.d.ts +1 -0
- package/dist/test/test_hybrid_bcs.js +98 -0
- package/dist/test/test_schema_database.d.ts +1 -0
- package/dist/test/test_schema_database.js +91 -0
- package/dist/test/test_simple_schema.d.ts +1 -0
- package/dist/test/test_simple_schema.js +78 -0
- package/dist/utils/dex_event_parser.d.ts +34 -0
- package/dist/utils/dex_event_parser.js +132 -0
- package/dist/utils/dex_schema_database.d.ts +206 -0
- package/dist/utils/dex_schema_database.js +169 -0
- package/dist/utils/dynamic_bcs_parser.d.ts +21 -0
- package/dist/utils/dynamic_bcs_parser.js +166 -0
- package/dist/utils/github_schema_extractor.d.ts +20 -0
- package/dist/utils/github_schema_extractor.js +153 -0
- package/dist/utils/hybrid_bcs_parser.d.ts +22 -0
- package/dist/utils/hybrid_bcs_parser.js +194 -0
- package/dist/utils/simple_schema_parser.d.ts +76 -0
- package/dist/utils/simple_schema_parser.js +193 -0
- package/package.json +2 -2
- package/dist/parsed_swap_transactions_2025-08-30T12-11-48-744Z.json +0 -19215
- package/dist/parsed_swap_transactions_2025-08-30T12-51-39-586Z.json +0 -19309
- package/dist/parsed_swap_transactions_2025-08-30T13-58-34-579Z.json +0 -19005
- package/dist/swap_transactions_2025-08-30T12-05-49-140Z.json +0 -1384
- package/dist/swap_transactions_2025-08-30T12-05-51-529Z.json +0 -2907
- package/dist/swap_transactions_2025-08-30T12-05-54-042Z.json +0 -13392
- package/dist/swap_transactions_2025-08-30T12-05-56-880Z.json +0 -16210
- package/dist/swap_transactions_2025-08-30T12-05-59-588Z.json +0 -17993
- package/dist/swap_transactions_2025-08-30T12-05-59-597Z.json +0 -17993
- package/dist/transaction_28FaeTYoctpP1VdWCuyPxNEBeaMm3ebj27kdF5umi9YL.json +0 -4754
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
require('dotenv').config();
|
|
13
|
+
const client_1 = require("@mysten/sui/client");
|
|
14
|
+
const hybrid_bcs_parser_1 = require("../utils/hybrid_bcs_parser");
|
|
15
|
+
const suiClient = new client_1.SuiClient({
|
|
16
|
+
url: 'https://fullnode.mainnet.sui.io'
|
|
17
|
+
});
|
|
18
|
+
const parser = new hybrid_bcs_parser_1.HybridBCSParser(suiClient);
|
|
19
|
+
const testHybridBCSParsing = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
console.log('=== 测试混合BCS解析 ===');
|
|
21
|
+
const testEvents = [
|
|
22
|
+
{
|
|
23
|
+
name: 'Momentum SwapEvent',
|
|
24
|
+
event: {
|
|
25
|
+
type: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::pool::SwapEvent',
|
|
26
|
+
bcs: {
|
|
27
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'Cetus SwapEvent',
|
|
33
|
+
event: {
|
|
34
|
+
type: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb::pool::SwapEvent',
|
|
35
|
+
bcs: {
|
|
36
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Momentum RepayFlashSwapEvent',
|
|
42
|
+
event: {
|
|
43
|
+
type: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::pool::RepayFlashSwapEvent',
|
|
44
|
+
bcs: {
|
|
45
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'Unknown Event',
|
|
51
|
+
event: {
|
|
52
|
+
type: '0xunknown::module::UnknownEvent',
|
|
53
|
+
bcs: {
|
|
54
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
for (const testCase of testEvents) {
|
|
60
|
+
console.log(`\n测试: ${testCase.name}`);
|
|
61
|
+
try {
|
|
62
|
+
const result = yield parser.parseEvent(testCase.event);
|
|
63
|
+
console.log('解析结果:', JSON.stringify(result, null, 2));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('解析失败:', error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const testAddSchema = () => {
|
|
71
|
+
console.log('\n=== 测试添加新schema ===');
|
|
72
|
+
parser.addSchema('0xnewpackage', 'NewSwapEvent', {
|
|
73
|
+
pool_id: 'address',
|
|
74
|
+
amount: 'u64'
|
|
75
|
+
});
|
|
76
|
+
const stats = parser.getCacheStats();
|
|
77
|
+
console.log('解析器统计:', stats);
|
|
78
|
+
};
|
|
79
|
+
const testCacheFunctionality = () => {
|
|
80
|
+
console.log('\n=== 测试缓存功能 ===');
|
|
81
|
+
const stats = parser.getCacheStats();
|
|
82
|
+
console.log('缓存统计:', stats);
|
|
83
|
+
parser.clearCache();
|
|
84
|
+
console.log('缓存已清除');
|
|
85
|
+
const newStats = parser.getCacheStats();
|
|
86
|
+
console.log('清除后统计:', newStats);
|
|
87
|
+
};
|
|
88
|
+
const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
89
|
+
try {
|
|
90
|
+
yield testHybridBCSParsing();
|
|
91
|
+
testAddSchema();
|
|
92
|
+
testCacheFunctionality();
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('测试失败:', error);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require('dotenv').config();
|
|
4
|
+
const dex_schema_database_1 = require("../utils/dex_schema_database");
|
|
5
|
+
const db = new dex_schema_database_1.DexSchemaDatabase();
|
|
6
|
+
const testSchemaDatabase = () => {
|
|
7
|
+
console.log('=== 测试 DEX Schema 数据库 ===');
|
|
8
|
+
console.log('\n1. 测试获取 DEX 信息...');
|
|
9
|
+
const momentumInfo = db.getDexInfo('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860');
|
|
10
|
+
console.log('Momentum 信息:', momentumInfo);
|
|
11
|
+
console.log('\n2. 测试获取事件 schema...');
|
|
12
|
+
const swapSchema = db.getEventSchema('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860', 'SwapEvent');
|
|
13
|
+
console.log('SwapEvent schema:', swapSchema);
|
|
14
|
+
console.log('\n3. 测试检查支持...');
|
|
15
|
+
const isSupported = db.isSupported('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860');
|
|
16
|
+
console.log('Momentum 是否支持:', isSupported);
|
|
17
|
+
console.log('\n4. 测试获取支持的包...');
|
|
18
|
+
const supportedPackages = db.getSupportedPackages();
|
|
19
|
+
console.log('支持的包:', supportedPackages);
|
|
20
|
+
console.log('\n5. 测试添加新 schema...');
|
|
21
|
+
db.addDexSchema('0xnewdex', 'New DEX', 'https://github.com/newdex', {
|
|
22
|
+
'NewEvent': {
|
|
23
|
+
field1: 'u64',
|
|
24
|
+
field2: 'address'
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
console.log('添加新 DEX 后支持的包:', db.getSupportedPackages());
|
|
28
|
+
console.log('\n6. 测试添加新事件...');
|
|
29
|
+
db.addEventSchema('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860', 'NewMomentumEvent', {
|
|
30
|
+
new_field: 'u128'
|
|
31
|
+
});
|
|
32
|
+
const newEventSchema = db.getEventSchema('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860', 'NewMomentumEvent');
|
|
33
|
+
console.log('新事件 schema:', newEventSchema);
|
|
34
|
+
};
|
|
35
|
+
const testCodeGeneration = () => {
|
|
36
|
+
console.log('\n=== 测试代码生成 ===');
|
|
37
|
+
const tsCode = db.generateTypeScriptCode();
|
|
38
|
+
console.log('生成的 TypeScript 代码:');
|
|
39
|
+
console.log(tsCode);
|
|
40
|
+
const json = db.exportToJSON();
|
|
41
|
+
console.log('\n导出的 JSON:');
|
|
42
|
+
console.log(json);
|
|
43
|
+
};
|
|
44
|
+
const testActualParsing = () => {
|
|
45
|
+
console.log('\n=== 测试实际解析 ===');
|
|
46
|
+
const testEvents = [
|
|
47
|
+
{
|
|
48
|
+
name: 'Momentum SwapEvent',
|
|
49
|
+
event: {
|
|
50
|
+
type: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::pool::SwapEvent',
|
|
51
|
+
bcs: {
|
|
52
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'Cetus SwapEvent',
|
|
58
|
+
event: {
|
|
59
|
+
type: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb::pool::SwapEvent',
|
|
60
|
+
bcs: {
|
|
61
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
for (const testCase of testEvents) {
|
|
67
|
+
console.log(`\n测试: ${testCase.name}`);
|
|
68
|
+
const parts = testCase.event.type.split('::');
|
|
69
|
+
const packageId = parts[0];
|
|
70
|
+
const eventName = parts[parts.length - 1];
|
|
71
|
+
const schema = db.getEventSchema(packageId, eventName);
|
|
72
|
+
console.log('Schema:', schema);
|
|
73
|
+
if (schema) {
|
|
74
|
+
console.log('✅ 找到 schema,可以解析 BCS 数据');
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log('❌ 未找到 schema');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const main = () => {
|
|
82
|
+
try {
|
|
83
|
+
testSchemaDatabase();
|
|
84
|
+
testCodeGeneration();
|
|
85
|
+
testActualParsing();
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error('测试失败:', error);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
main();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require('dotenv').config();
|
|
4
|
+
const simple_schema_parser_1 = require("../utils/simple_schema_parser");
|
|
5
|
+
const parser = new simple_schema_parser_1.SimpleSchemaParser();
|
|
6
|
+
const testSimpleSchemaParsing = () => {
|
|
7
|
+
console.log('=== 测试简单Schema解析 ===');
|
|
8
|
+
const testEvents = [
|
|
9
|
+
{
|
|
10
|
+
name: 'Momentum SwapEvent',
|
|
11
|
+
event: {
|
|
12
|
+
type: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::pool::SwapEvent',
|
|
13
|
+
bcs: {
|
|
14
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'Cetus SwapEvent',
|
|
20
|
+
event: {
|
|
21
|
+
type: '0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb::pool::SwapEvent',
|
|
22
|
+
bcs: {
|
|
23
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'Momentum RepayFlashSwapEvent',
|
|
29
|
+
event: {
|
|
30
|
+
type: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::pool::RepayFlashSwapEvent',
|
|
31
|
+
bcs: {
|
|
32
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'Unknown Event',
|
|
38
|
+
event: {
|
|
39
|
+
type: '0xunknown::module::UnknownEvent',
|
|
40
|
+
bcs: {
|
|
41
|
+
value: '00096703000000000000d9690d000000000000af9374ff98010000202a10443fdf509da5b8a6f8d7b4a58f46a8b3827e11c18cc9ec98a8524bab5daa010020430948c6b6336d3c3fef5a9b710799b0afae62c780592c5a38a99b6e19ce17b30000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
for (const testCase of testEvents) {
|
|
47
|
+
console.log(`\n测试: ${testCase.name}`);
|
|
48
|
+
try {
|
|
49
|
+
const result = parser.parseEvent(testCase.event);
|
|
50
|
+
console.log('解析结果:', JSON.stringify(result, null, 2));
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('解析失败:', error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const testFeatures = () => {
|
|
58
|
+
console.log('\n=== 测试功能 ===');
|
|
59
|
+
const supportedPackages = parser.getSupportedPackages();
|
|
60
|
+
console.log('支持的包:', supportedPackages);
|
|
61
|
+
const isMomentumSupported = parser.isSupported('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860');
|
|
62
|
+
console.log('Momentum 是否支持:', isMomentumSupported);
|
|
63
|
+
parser.addSchema('0xnewpackage', 'NewEvent', {
|
|
64
|
+
field1: 'u64',
|
|
65
|
+
field2: 'address'
|
|
66
|
+
});
|
|
67
|
+
console.log('添加新 schema 后支持的包:', parser.getSupportedPackages());
|
|
68
|
+
};
|
|
69
|
+
const main = () => {
|
|
70
|
+
try {
|
|
71
|
+
testSimpleSchemaParsing();
|
|
72
|
+
testFeatures();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('测试失败:', error);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
main();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface DexEventInfo {
|
|
2
|
+
txIndex: number;
|
|
3
|
+
eventIndex: number;
|
|
4
|
+
dexName: string;
|
|
5
|
+
packageId: string;
|
|
6
|
+
eventType: string;
|
|
7
|
+
eventName: string;
|
|
8
|
+
module: string;
|
|
9
|
+
sender: string;
|
|
10
|
+
hasContent: boolean;
|
|
11
|
+
contents?: any;
|
|
12
|
+
}
|
|
13
|
+
export interface DexEventStats {
|
|
14
|
+
totalEvents: number;
|
|
15
|
+
dexStats: {
|
|
16
|
+
[dex: string]: number;
|
|
17
|
+
};
|
|
18
|
+
eventTypeStats: {
|
|
19
|
+
[eventType: string]: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare class DexEventParser {
|
|
23
|
+
private static readonly DEX_PACKAGES;
|
|
24
|
+
static parseCheckpointEvents(transactions: any[]): DexEventInfo[];
|
|
25
|
+
private static extractEventsFromTransaction;
|
|
26
|
+
private static parseSingleEvent;
|
|
27
|
+
private static extractPackageId;
|
|
28
|
+
private static extractPackageFromEventType;
|
|
29
|
+
private static getDexName;
|
|
30
|
+
private static extractEventName;
|
|
31
|
+
static generateStats(events: DexEventInfo[]): DexEventStats;
|
|
32
|
+
static printStats(events: DexEventInfo[], checkpointId: string): void;
|
|
33
|
+
static printEventDetails(events: DexEventInfo[]): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DexEventParser = void 0;
|
|
4
|
+
class DexEventParser {
|
|
5
|
+
static parseCheckpointEvents(transactions) {
|
|
6
|
+
const dexEvents = [];
|
|
7
|
+
transactions.forEach((transaction, txIndex) => {
|
|
8
|
+
const events = this.extractEventsFromTransaction(transaction, txIndex);
|
|
9
|
+
dexEvents.push(...events);
|
|
10
|
+
});
|
|
11
|
+
return dexEvents;
|
|
12
|
+
}
|
|
13
|
+
static extractEventsFromTransaction(transaction, txIndex) {
|
|
14
|
+
const events = [];
|
|
15
|
+
if (transaction.events && transaction.events.events) {
|
|
16
|
+
transaction.events.events.forEach((event, eventIndex) => {
|
|
17
|
+
const eventInfo = this.parseSingleEvent(event, txIndex, eventIndex);
|
|
18
|
+
if (eventInfo) {
|
|
19
|
+
events.push(eventInfo);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return events;
|
|
24
|
+
}
|
|
25
|
+
static parseSingleEvent(event, txIndex, eventIndex) {
|
|
26
|
+
try {
|
|
27
|
+
const packageId = this.extractPackageId(event);
|
|
28
|
+
const dexName = this.getDexName(packageId);
|
|
29
|
+
const eventName = this.extractEventName(event.event_type);
|
|
30
|
+
const module = event.module || 'Unknown';
|
|
31
|
+
const sender = event.sender || 'Unknown';
|
|
32
|
+
return {
|
|
33
|
+
txIndex: txIndex,
|
|
34
|
+
eventIndex: eventIndex,
|
|
35
|
+
dexName: dexName,
|
|
36
|
+
packageId: packageId,
|
|
37
|
+
eventType: event.event_type || 'Unknown',
|
|
38
|
+
eventName: eventName,
|
|
39
|
+
module: module,
|
|
40
|
+
sender: sender,
|
|
41
|
+
hasContent: !!(event.contents && event.contents.value),
|
|
42
|
+
contents: event.contents
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('解析事件失败:', error);
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
static extractPackageId(event) {
|
|
51
|
+
if (event.package_id) {
|
|
52
|
+
return event.package_id;
|
|
53
|
+
}
|
|
54
|
+
if (event.event_type) {
|
|
55
|
+
return this.extractPackageFromEventType(event.event_type);
|
|
56
|
+
}
|
|
57
|
+
return 'unknown';
|
|
58
|
+
}
|
|
59
|
+
static extractPackageFromEventType(eventType) {
|
|
60
|
+
if (!eventType)
|
|
61
|
+
return 'unknown';
|
|
62
|
+
const parts = eventType.split('::');
|
|
63
|
+
if (parts.length >= 1 && parts[0].startsWith('0x')) {
|
|
64
|
+
return parts[0];
|
|
65
|
+
}
|
|
66
|
+
return 'unknown';
|
|
67
|
+
}
|
|
68
|
+
static getDexName(packageId) {
|
|
69
|
+
return this.DEX_PACKAGES[packageId] || 'Unknown DEX';
|
|
70
|
+
}
|
|
71
|
+
static extractEventName(eventType) {
|
|
72
|
+
if (!eventType)
|
|
73
|
+
return 'Unknown';
|
|
74
|
+
const parts = eventType.split('::');
|
|
75
|
+
return parts[parts.length - 1] || 'Unknown';
|
|
76
|
+
}
|
|
77
|
+
static generateStats(events) {
|
|
78
|
+
const dexStats = {};
|
|
79
|
+
const eventTypeStats = {};
|
|
80
|
+
events.forEach(event => {
|
|
81
|
+
dexStats[event.dexName] = (dexStats[event.dexName] || 0) + 1;
|
|
82
|
+
eventTypeStats[event.eventName] = (eventTypeStats[event.eventName] || 0) + 1;
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
totalEvents: events.length,
|
|
86
|
+
dexStats: dexStats,
|
|
87
|
+
eventTypeStats: eventTypeStats
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
static printStats(events, checkpointId) {
|
|
91
|
+
const stats = this.generateStats(events);
|
|
92
|
+
console.log(`\n=== Checkpoint ${checkpointId} DEX 事件统计 ===`);
|
|
93
|
+
console.log(`总事件数: ${stats.totalEvents}`);
|
|
94
|
+
if (stats.totalEvents > 0) {
|
|
95
|
+
console.log('\n=== DEX 统计 ===');
|
|
96
|
+
Object.entries(stats.dexStats).forEach(([dex, count]) => {
|
|
97
|
+
console.log(`${dex}: ${count} 个事件`);
|
|
98
|
+
});
|
|
99
|
+
console.log('\n=== 事件类型统计 ===');
|
|
100
|
+
Object.entries(stats.eventTypeStats).forEach(([eventType, count]) => {
|
|
101
|
+
console.log(`${eventType}: ${count} 个事件`);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
static printEventDetails(events) {
|
|
106
|
+
if (events.length === 0) {
|
|
107
|
+
console.log('没有找到 DEX 事件');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.log('\n=== DEX 事件详情 ===');
|
|
111
|
+
events.forEach((event, index) => {
|
|
112
|
+
console.log(`事件 ${index + 1}:`);
|
|
113
|
+
console.log(` 交易索引: ${event.txIndex}`);
|
|
114
|
+
console.log(` 事件索引: ${event.eventIndex}`);
|
|
115
|
+
console.log(` DEX: ${event.dexName}`);
|
|
116
|
+
console.log(` 包地址: ${event.packageId}`);
|
|
117
|
+
console.log(` 模块: ${event.module}`);
|
|
118
|
+
console.log(` 事件名称: ${event.eventName}`);
|
|
119
|
+
console.log(` 发送者: ${event.sender}`);
|
|
120
|
+
console.log(` 有内容数据: ${event.hasContent}`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.DexEventParser = DexEventParser;
|
|
125
|
+
DexEventParser.DEX_PACKAGES = {
|
|
126
|
+
'0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb': 'Cetus',
|
|
127
|
+
'0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860': 'Momentum CLMM',
|
|
128
|
+
'0x3492c874c1e3b3e2984e8c41b589e642d4d0a5d6459e5a9cfc2d52fd7c89c267': 'Turbos Finance',
|
|
129
|
+
'0xf1962ddb76a7f9968b4e597278d3cc717a00620cc421b00e3429c5c071eba26a': 'Turbos Finance',
|
|
130
|
+
'0x53134eb544c5a0b5085e99efaf7eab13b28ad123de35d61f941f8c8c40b72033': 'Tradeport',
|
|
131
|
+
'0x67b34b728c4e28e704dcfecf7c5cf55c7fc593b6c65c20d1836d97c209c1928a': 'Unknown DEX'
|
|
132
|
+
};
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
export declare const DEX_SCHEMA_DATABASE: {
|
|
2
|
+
'0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860': {
|
|
3
|
+
name: string;
|
|
4
|
+
source: string;
|
|
5
|
+
events: {
|
|
6
|
+
SwapEvent: {
|
|
7
|
+
pool_id: string;
|
|
8
|
+
token_in: string;
|
|
9
|
+
token_out: string;
|
|
10
|
+
amount_in: string;
|
|
11
|
+
amount_out: string;
|
|
12
|
+
fee: string;
|
|
13
|
+
};
|
|
14
|
+
RepayFlashSwapEvent: {
|
|
15
|
+
pool_id: string;
|
|
16
|
+
token_borrowed: string;
|
|
17
|
+
amount_borrowed: string;
|
|
18
|
+
token_repaid: string;
|
|
19
|
+
amount_repaid: string;
|
|
20
|
+
fee: string;
|
|
21
|
+
};
|
|
22
|
+
AddLiquidityEvent: {
|
|
23
|
+
pool_id: string;
|
|
24
|
+
liquidity: string;
|
|
25
|
+
amount_a: string;
|
|
26
|
+
amount_b: string;
|
|
27
|
+
};
|
|
28
|
+
RemoveLiquidityEvent: {
|
|
29
|
+
pool_id: string;
|
|
30
|
+
liquidity: string;
|
|
31
|
+
amount_a: string;
|
|
32
|
+
amount_b: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
'0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb': {
|
|
37
|
+
name: string;
|
|
38
|
+
source: string;
|
|
39
|
+
events: {
|
|
40
|
+
SwapEvent: {
|
|
41
|
+
pool_id: string;
|
|
42
|
+
token_in: string;
|
|
43
|
+
token_out: string;
|
|
44
|
+
amount_in: string;
|
|
45
|
+
amount_out: string;
|
|
46
|
+
fee: string;
|
|
47
|
+
};
|
|
48
|
+
AddLiquidityEvent: {
|
|
49
|
+
pool_id: string;
|
|
50
|
+
liquidity: string;
|
|
51
|
+
amount_a: string;
|
|
52
|
+
amount_b: string;
|
|
53
|
+
};
|
|
54
|
+
RemoveLiquidityEvent: {
|
|
55
|
+
pool_id: string;
|
|
56
|
+
liquidity: string;
|
|
57
|
+
amount_a: string;
|
|
58
|
+
amount_b: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
'0x5c45d10c26c5fb53f332c6be5c8c6b6b8b9e6b6b8b9e6b6b8b9e6b6b8b9e6b6b': {
|
|
63
|
+
name: string;
|
|
64
|
+
source: string;
|
|
65
|
+
events: {
|
|
66
|
+
SwapEvent: {
|
|
67
|
+
pool_id: string;
|
|
68
|
+
token_in: string;
|
|
69
|
+
token_out: string;
|
|
70
|
+
amount_in: string;
|
|
71
|
+
amount_out: string;
|
|
72
|
+
fee: string;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
'0xcaf6ba059d539a97646d47f0b9ddf843e138d215e2a12ca1f4585d386f7aec3a': {
|
|
77
|
+
name: string;
|
|
78
|
+
source: string;
|
|
79
|
+
events: {
|
|
80
|
+
OrderPlaced: {
|
|
81
|
+
order_id: string;
|
|
82
|
+
user: string;
|
|
83
|
+
amount: string;
|
|
84
|
+
price: string;
|
|
85
|
+
side: string;
|
|
86
|
+
};
|
|
87
|
+
OrderInfo: {
|
|
88
|
+
order_id: string;
|
|
89
|
+
user: string;
|
|
90
|
+
amount: string;
|
|
91
|
+
price: string;
|
|
92
|
+
side: string;
|
|
93
|
+
status: string;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
export declare class DexSchemaDatabase {
|
|
99
|
+
getDexInfo(packageId: string): any;
|
|
100
|
+
getEventSchema(packageId: string, eventName: string): any;
|
|
101
|
+
isSupported(packageId: string): boolean;
|
|
102
|
+
getSupportedPackages(): string[];
|
|
103
|
+
getAllDexInfo(): {
|
|
104
|
+
'0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860': {
|
|
105
|
+
name: string;
|
|
106
|
+
source: string;
|
|
107
|
+
events: {
|
|
108
|
+
SwapEvent: {
|
|
109
|
+
pool_id: string;
|
|
110
|
+
token_in: string;
|
|
111
|
+
token_out: string;
|
|
112
|
+
amount_in: string;
|
|
113
|
+
amount_out: string;
|
|
114
|
+
fee: string;
|
|
115
|
+
};
|
|
116
|
+
RepayFlashSwapEvent: {
|
|
117
|
+
pool_id: string;
|
|
118
|
+
token_borrowed: string;
|
|
119
|
+
amount_borrowed: string;
|
|
120
|
+
token_repaid: string;
|
|
121
|
+
amount_repaid: string;
|
|
122
|
+
fee: string;
|
|
123
|
+
};
|
|
124
|
+
AddLiquidityEvent: {
|
|
125
|
+
pool_id: string;
|
|
126
|
+
liquidity: string;
|
|
127
|
+
amount_a: string;
|
|
128
|
+
amount_b: string;
|
|
129
|
+
};
|
|
130
|
+
RemoveLiquidityEvent: {
|
|
131
|
+
pool_id: string;
|
|
132
|
+
liquidity: string;
|
|
133
|
+
amount_a: string;
|
|
134
|
+
amount_b: string;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
'0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb': {
|
|
139
|
+
name: string;
|
|
140
|
+
source: string;
|
|
141
|
+
events: {
|
|
142
|
+
SwapEvent: {
|
|
143
|
+
pool_id: string;
|
|
144
|
+
token_in: string;
|
|
145
|
+
token_out: string;
|
|
146
|
+
amount_in: string;
|
|
147
|
+
amount_out: string;
|
|
148
|
+
fee: string;
|
|
149
|
+
};
|
|
150
|
+
AddLiquidityEvent: {
|
|
151
|
+
pool_id: string;
|
|
152
|
+
liquidity: string;
|
|
153
|
+
amount_a: string;
|
|
154
|
+
amount_b: string;
|
|
155
|
+
};
|
|
156
|
+
RemoveLiquidityEvent: {
|
|
157
|
+
pool_id: string;
|
|
158
|
+
liquidity: string;
|
|
159
|
+
amount_a: string;
|
|
160
|
+
amount_b: string;
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
'0x5c45d10c26c5fb53f332c6be5c8c6b6b8b9e6b6b8b9e6b6b8b9e6b6b8b9e6b6b': {
|
|
165
|
+
name: string;
|
|
166
|
+
source: string;
|
|
167
|
+
events: {
|
|
168
|
+
SwapEvent: {
|
|
169
|
+
pool_id: string;
|
|
170
|
+
token_in: string;
|
|
171
|
+
token_out: string;
|
|
172
|
+
amount_in: string;
|
|
173
|
+
amount_out: string;
|
|
174
|
+
fee: string;
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
'0xcaf6ba059d539a97646d47f0b9ddf843e138d215e2a12ca1f4585d386f7aec3a': {
|
|
179
|
+
name: string;
|
|
180
|
+
source: string;
|
|
181
|
+
events: {
|
|
182
|
+
OrderPlaced: {
|
|
183
|
+
order_id: string;
|
|
184
|
+
user: string;
|
|
185
|
+
amount: string;
|
|
186
|
+
price: string;
|
|
187
|
+
side: string;
|
|
188
|
+
};
|
|
189
|
+
OrderInfo: {
|
|
190
|
+
order_id: string;
|
|
191
|
+
user: string;
|
|
192
|
+
amount: string;
|
|
193
|
+
price: string;
|
|
194
|
+
side: string;
|
|
195
|
+
status: string;
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
};
|
|
200
|
+
addDexSchema(packageId: string, name: string, source: string, events: any): void;
|
|
201
|
+
addEventSchema(packageId: string, eventName: string, schema: any): void;
|
|
202
|
+
generateTypeScriptCode(): string;
|
|
203
|
+
exportToJSON(): string;
|
|
204
|
+
importFromJSON(json: string): void;
|
|
205
|
+
}
|
|
206
|
+
export declare const createSchemaDatabase: () => DexSchemaDatabase;
|