@clonegod/ttd-sui-common 1.0.5 → 1.0.6

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 (35) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +2 -0
  3. package/dist/parsed_swap_transactions_2025-08-30T12-11-48-744Z.json +19215 -0
  4. package/dist/parsed_swap_transactions_2025-08-30T12-51-39-586Z.json +19309 -0
  5. package/dist/parsed_swap_transactions_2025-08-30T13-58-34-579Z.json +19005 -0
  6. package/dist/swap_transactions_2025-08-30T12-05-49-140Z.json +1384 -0
  7. package/dist/swap_transactions_2025-08-30T12-05-51-529Z.json +2907 -0
  8. package/dist/swap_transactions_2025-08-30T12-05-54-042Z.json +13392 -0
  9. package/dist/swap_transactions_2025-08-30T12-05-56-880Z.json +16210 -0
  10. package/dist/swap_transactions_2025-08-30T12-05-59-588Z.json +17993 -0
  11. package/dist/swap_transactions_2025-08-30T12-05-59-597Z.json +17993 -0
  12. package/dist/test/test_checkpoint_processor.d.ts +1 -0
  13. package/dist/test/test_checkpoint_processor.js +112 -0
  14. package/dist/test/test_checkpoint_subscription.d.ts +1 -0
  15. package/dist/test/test_checkpoint_subscription.js +132 -0
  16. package/dist/test/test_grpc.js +1 -1
  17. package/dist/test/test_momentum_events.d.ts +1 -0
  18. package/dist/test/test_momentum_events.js +113 -0
  19. package/dist/test/test_single_momentum_event.d.ts +1 -0
  20. package/dist/test/test_single_momentum_event.js +44 -0
  21. package/dist/type/index.d.ts +45 -0
  22. package/dist/type/index.js +2 -0
  23. package/dist/utils/bcs-parser.d.ts +8 -0
  24. package/dist/utils/bcs-parser.js +121 -0
  25. package/dist/utils/checkpoint-processor.d.ts +7 -0
  26. package/dist/utils/checkpoint-processor.js +123 -0
  27. package/dist/utils/checkpoint_parse.d.ts +26 -0
  28. package/dist/utils/checkpoint_parse.js +277 -0
  29. package/dist/utils/decode.d.ts +2 -0
  30. package/dist/utils/decode.js +43 -0
  31. package/dist/utils/dex-parser-manager.d.ts +7 -0
  32. package/dist/utils/dex-parser-manager.js +138 -0
  33. package/dist/utils/index.d.ts +2 -2
  34. package/dist/utils/index.js +16 -41
  35. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const checkpoint_parse_1 = require("../utils/checkpoint_parse");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ function testCheckpointProcessor() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ console.log('=== 测试 Checkpoint 处理器 ===');
51
+ const distDir = path.join(__dirname, '../../dist');
52
+ const files = fs.readdirSync(distDir)
53
+ .filter(file => file.startsWith('parsed_swap_transactions_'))
54
+ .sort()
55
+ .reverse();
56
+ if (files.length === 0) {
57
+ console.log('没有找到解析结果文件');
58
+ return;
59
+ }
60
+ const latestFile = files[0];
61
+ console.log('使用文件:', latestFile);
62
+ const filePath = path.join(distDir, latestFile);
63
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
64
+ const checkpoints = data.map((item) => ({
65
+ sequence_number: item.checkpoint.sequenceNumber,
66
+ timestamp: new Date().toISOString(),
67
+ transactions: [{
68
+ digest: item.transaction.digest,
69
+ events: {
70
+ events: item.swapEvents.map((event) => (Object.assign({ name: event.eventType }, event.contents)))
71
+ }
72
+ }]
73
+ }));
74
+ const result = checkpoint_parse_1.SuiCheckpointParser.processCheckpoints(checkpoints);
75
+ console.log('\n=== 处理结果 ===');
76
+ console.log(`总 Checkpoint 数: ${result.totalCheckpoints}`);
77
+ console.log(`总交易数: ${result.totalTransactions}`);
78
+ console.log(`总事件数: ${result.totalEvents}`);
79
+ console.log(`活跃池子数: ${Object.keys(result.poolStats).length}`);
80
+ console.log('\n=== DEX 统计 ===');
81
+ for (const [dex, count] of Object.entries(result.dexStats)) {
82
+ console.log(`${dex}: ${count} 个事件`);
83
+ }
84
+ const poolSummary = checkpoint_parse_1.SuiCheckpointParser.getPoolSummary(result.poolStats);
85
+ console.log('\n=== 池子摘要 ===');
86
+ console.log(`总池子数: ${poolSummary.totalPools}`);
87
+ for (const pool of poolSummary.topPools.slice(0, 5)) {
88
+ console.log(`\n池子: ${pool.poolId}`);
89
+ console.log(` DEX: ${pool.dexName}`);
90
+ console.log(` 事件数: ${pool.eventCount}`);
91
+ if (pool.lastLiquidity) {
92
+ console.log(` 最新流动性: ${pool.lastLiquidity}`);
93
+ }
94
+ if (pool.lastSqrtPrice) {
95
+ console.log(` 最新价格: ${pool.lastSqrtPrice}`);
96
+ }
97
+ if (pool.lastTick !== null) {
98
+ console.log(` 最新Tick: ${pool.lastTick}`);
99
+ }
100
+ if (pool.lastReserveX && pool.lastReserveY) {
101
+ console.log(` 最新储备: X=${pool.lastReserveX}, Y=${pool.lastReserveY}`);
102
+ }
103
+ }
104
+ if (result.transactions.length > 0) {
105
+ console.log('\n=== 交易数据示例 ===');
106
+ const tx = result.transactions[0];
107
+ console.log('交易数据结构:');
108
+ console.log(JSON.stringify(tx, null, 2));
109
+ }
110
+ });
111
+ }
112
+ testCheckpointProcessor().catch(console.error);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const dotenv = __importStar(require("dotenv"));
46
+ dotenv.config();
47
+ const bcs_parser_1 = require("../utils/bcs-parser");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ function testParseSavedTransactions() {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ console.log('开始测试解析已保存的 swap 交易文件...');
53
+ const distDir = path.join(__dirname, '../../dist');
54
+ const files = fs.readdirSync(distDir)
55
+ .filter(file => file.startsWith('swap_transactions_'))
56
+ .sort()
57
+ .reverse();
58
+ if (files.length === 0) {
59
+ console.log('没有找到 swap 交易文件');
60
+ return;
61
+ }
62
+ const latestFile = files[0];
63
+ const filePath = path.join(distDir, latestFile);
64
+ console.log(`读取文件: ${latestFile}`);
65
+ try {
66
+ const fileContent = fs.readFileSync(filePath, 'utf8');
67
+ const transactions = JSON.parse(fileContent);
68
+ console.log(`文件包含 ${transactions.length} 个 swap 交易`);
69
+ const maxTransactions = Math.min(5, transactions.length);
70
+ for (let i = 0; i < maxTransactions; i++) {
71
+ const transaction = transactions[i];
72
+ console.log(`\n=== 解析交易 ${i + 1}/${maxTransactions} ===`);
73
+ console.log('Checkpoint:', transaction.checkpoint.sequenceNumber);
74
+ console.log('交易摘要:', transaction.transaction.digest);
75
+ console.log('Swap 事件数量:', transaction.swapEvents.length);
76
+ transaction.swapEvents.forEach((event, eventIndex) => {
77
+ console.log(`\n--- 事件 ${eventIndex + 1} ---`);
78
+ console.log('事件类型:', event.eventType);
79
+ console.log('发送者:', event.sender);
80
+ console.log('模块:', event.module);
81
+ console.log('包ID:', event.packageId);
82
+ if (event.contents) {
83
+ console.log('使用 decodeBytes 解析事件内容...');
84
+ const parsedResult = bcs_parser_1.BcsParser.parseEventWithDecodeBytes(event.contents);
85
+ if (parsedResult) {
86
+ console.log('解析结果:');
87
+ console.log('- 解码内容:', parsedResult.decoded);
88
+ console.log('- Hex 数据:', parsedResult.hexData);
89
+ if (parsedResult.parsedData) {
90
+ console.log('- BCS 解析数据:', parsedResult.parsedData);
91
+ if (parsedResult.parsedData.sqrt_price_after) {
92
+ const price = bcs_parser_1.BcsParser.calculatePrice(BigInt(parsedResult.parsedData.sqrt_price_after), 6, 9);
93
+ console.log('- 计算价格:', price);
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ console.log('解析失败');
99
+ }
100
+ }
101
+ else {
102
+ console.log('没有事件内容数据');
103
+ }
104
+ });
105
+ }
106
+ const parsedResults = [];
107
+ for (const transaction of transactions) {
108
+ const parsedTransaction = {
109
+ checkpoint: transaction.checkpoint,
110
+ transaction: transaction.transaction,
111
+ swapEvents: transaction.swapEvents.map((event) => {
112
+ var _a, _b;
113
+ const parsedEvent = Object.assign(Object.assign({}, event), { parsedResult: event.contents ? bcs_parser_1.BcsParser.parseEventWithDecodeBytes(event.contents) : null });
114
+ if ((_b = (_a = parsedEvent.parsedResult) === null || _a === void 0 ? void 0 : _a.parsedData) === null || _b === void 0 ? void 0 : _b.sqrt_price_after) {
115
+ parsedEvent.calculatedPrice = bcs_parser_1.BcsParser.calculatePrice(BigInt(parsedEvent.parsedResult.parsedData.sqrt_price_after), 6, 9);
116
+ }
117
+ return parsedEvent;
118
+ })
119
+ };
120
+ parsedResults.push(parsedTransaction);
121
+ }
122
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
123
+ const outputFile = `dist/parsed_swap_transactions_${timestamp}.json`;
124
+ fs.writeFileSync(outputFile, JSON.stringify(parsedResults, null, 2), 'utf8');
125
+ console.log(`\n✅ 解析结果已保存到: ${outputFile}`);
126
+ }
127
+ catch (error) {
128
+ console.error('读取或解析文件失败:', error);
129
+ }
130
+ });
131
+ }
132
+ testParseSavedTransactions().catch(console.error);
@@ -86,7 +86,7 @@ const test_list_owned_objects = (wallet_address) => __awaiter(void 0, void 0, vo
86
86
  (0, dist_1.log_info)(`ownedObjects`, ownedObjects);
87
87
  });
88
88
  const main = () => __awaiter(void 0, void 0, void 0, function* () {
89
- test_get_objects(['0xc99d460f211ef0a8f89d7bf4bdc373e593f84258b0e57f222217a1cca1ae302d', '0x2374395d7e409c411bf63a14eba8d47b9ef9bf83b2bb215cf678d711e11be806']);
89
+ test_subscribe_checkpoints();
90
90
  const wallet_address = '0x6367c8755b8c39cab7305bfa75cb17d050508d2e55f6862a7682377ad6d46ee7';
91
91
  const usdc_coin_type = '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC';
92
92
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const bcs_parser_1 = require("../utils/bcs-parser");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ function testMomentumEvents() {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ var _a;
51
+ console.log('=== 测试解析所有 Momentum CLMM 事件 ===');
52
+ const distDir = path.join(__dirname, '../../dist');
53
+ const files = fs.readdirSync(distDir)
54
+ .filter(file => file.startsWith('parsed_swap_transactions_'))
55
+ .sort()
56
+ .reverse();
57
+ if (files.length === 0) {
58
+ console.log('没有找到解析结果文件');
59
+ return;
60
+ }
61
+ const latestFile = files[0];
62
+ console.log('使用文件:', latestFile);
63
+ const filePath = path.join(distDir, latestFile);
64
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf8'));
65
+ let momentumEventCount = 0;
66
+ let successCount = 0;
67
+ for (const transaction of data) {
68
+ for (const event of transaction.swapEvents) {
69
+ if ((_a = event.eventType) === null || _a === void 0 ? void 0 : _a.includes('0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860')) {
70
+ momentumEventCount++;
71
+ console.log(`\n--- Momentum 事件 ${momentumEventCount} ---`);
72
+ console.log('事件类型:', event.eventType);
73
+ console.log('发送者:', event.sender);
74
+ console.log('包ID:', event.packageId);
75
+ if (event.contents) {
76
+ const result = bcs_parser_1.BcsParser.parseEventWithDecodeBytes(event.contents);
77
+ if (result && result.parsedData) {
78
+ successCount++;
79
+ console.log('✅ 解析成功');
80
+ console.log('- DEX:', result.dex);
81
+ if (result.parsedData.pool_id) {
82
+ console.log('- 池子ID:', result.parsedData.pool_id);
83
+ }
84
+ if (result.parsedData.amount_x && result.parsedData.amount_y) {
85
+ console.log('- 交易数量:', `${result.parsedData.amount_x} X → ${result.parsedData.amount_y} Y`);
86
+ }
87
+ if (result.parsedData.sqrt_price_after) {
88
+ console.log('- 交易后价格:', result.parsedData.sqrt_price_after);
89
+ }
90
+ if (result.calculatedPrice) {
91
+ console.log('- 计算价格:', result.calculatedPrice);
92
+ }
93
+ if (result.parsedData.fee_amount) {
94
+ console.log('- 手续费:', result.parsedData.fee_amount);
95
+ }
96
+ }
97
+ else {
98
+ console.log('❌ 解析失败');
99
+ }
100
+ }
101
+ else {
102
+ console.log('❌ 没有事件内容数据');
103
+ }
104
+ }
105
+ }
106
+ }
107
+ console.log(`\n=== 解析统计 ===`);
108
+ console.log(`总 Momentum 事件数: ${momentumEventCount}`);
109
+ console.log(`成功解析数: ${successCount}`);
110
+ console.log(`成功率: ${momentumEventCount > 0 ? (successCount / momentumEventCount * 100).toFixed(2) : 0}%`);
111
+ });
112
+ }
113
+ testMomentumEvents().catch(console.error);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,44 @@
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
+ const bcs_parser_1 = require("../utils/bcs-parser");
13
+ function testSingleMomentumEvent() {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ console.log('=== 测试单个 Momentum CLMM 事件 ===');
16
+ const eventContent = {
17
+ name: "0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860::trade::SwapEvent",
18
+ value: {
19
+ type: "Buffer",
20
+ data: [154, 230, 249, 141, 148, 184, 44, 192, 8, 246, 65, 36, 6, 149, 48, 11, 214, 15, 238, 101, 255, 70, 84, 152, 195, 209, 187, 84, 193, 116, 25, 136, 115, 126, 198, 164, 211, 237, 12, 126, 108, 193, 141, 139, 160, 78, 127, 253, 72, 6, 183, 38, 201, 126, 253, 137, 134, 117, 151, 54, 140, 77, 6, 169, 1, 82, 183, 76, 0, 0, 0, 0, 0, 151, 182, 76, 0, 0, 0, 0, 0, 115, 225, 47, 61, 52, 30, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 253, 119, 207, 36, 52, 30, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 120, 142, 66, 203, 245, 161, 37, 3, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 15, 38, 97, 42, 249, 2, 0, 0, 13, 27, 26, 0, 195, 18, 0, 0]
21
+ }
22
+ };
23
+ console.log('事件类型:', eventContent.name);
24
+ const result = bcs_parser_1.BcsParser.parseEventWithDecodeBytes(eventContent);
25
+ if (result) {
26
+ console.log('解析结果:');
27
+ console.log('- DEX:', result.dex);
28
+ console.log('- Hex 数据:', result.hexData);
29
+ if (result.parsedData) {
30
+ console.log('- BCS 解析数据:', result.parsedData);
31
+ if (result.calculatedPrice) {
32
+ console.log('- 计算价格:', result.calculatedPrice);
33
+ }
34
+ }
35
+ else {
36
+ console.log('- BCS 解析失败');
37
+ }
38
+ }
39
+ else {
40
+ console.log('解析失败');
41
+ }
42
+ });
43
+ }
44
+ testSingleMomentumEvent().catch(console.error);
@@ -0,0 +1,45 @@
1
+ export interface BlockUpdateEvent {
2
+ blockNumber: number;
3
+ blockTime: string;
4
+ transactions: TransactionData[];
5
+ }
6
+ export interface TransactionData {
7
+ txHash: string;
8
+ txIndex: number;
9
+ events: DexEventData[];
10
+ }
11
+ export interface DexEventData {
12
+ eventIndex: number;
13
+ packageId: string;
14
+ dexName: string;
15
+ poolId: string;
16
+ eventName: string;
17
+ eventType: string;
18
+ liquidity: string | null;
19
+ sqrtPrice: string | null;
20
+ tick: number | null;
21
+ sender: string | null;
22
+ amountX: string | null;
23
+ amountY: string | null;
24
+ xForY: boolean | null;
25
+ reserveX: string | null;
26
+ reserveY: string | null;
27
+ }
28
+ export interface SimpleTxEventDataType {
29
+ txHash: string;
30
+ txIndex: number;
31
+ dexId: string;
32
+ dexName: string;
33
+ poolId: string;
34
+ eventName: string;
35
+ eventType: string;
36
+ liquidity: string | null;
37
+ sqrtPrice: string | null;
38
+ tick: number | null;
39
+ sender: string | null;
40
+ amountX: string | null;
41
+ amountY: string | null;
42
+ xForY: boolean | null;
43
+ reserveX: string | null;
44
+ reserveY: string | null;
45
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ export declare class MomentumEventParser {
2
+ private static readonly MOMENTUM_PACKAGE;
3
+ static isMomentumEvent(eventType: string): boolean;
4
+ static parseSwapEvent(eventData: Uint8Array): any;
5
+ static parseRepayFlashSwapEvent(eventData: Uint8Array): any;
6
+ static calculatePrice(sqrtPrice: bigint, tokenXDecimals?: number, tokenYDecimals?: number): number;
7
+ static parseEvent(eventContent: any): any;
8
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MomentumEventParser = void 0;
4
+ const bcs_1 = require("@mysten/sui/bcs");
5
+ function decodeBytes(obj) {
6
+ if (Array.isArray(obj)) {
7
+ return obj.map((item) => decodeBytes(item));
8
+ }
9
+ else if (obj && typeof obj === 'object') {
10
+ const result = {};
11
+ for (const key of Object.keys(obj)) {
12
+ const val = obj[key];
13
+ if (Buffer.isBuffer(val) || (Array.isArray(val) && typeof val[0] === 'number')) {
14
+ result[key] = Buffer.from(val).toString('hex');
15
+ }
16
+ else {
17
+ result[key] = decodeBytes(val);
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ return obj;
23
+ }
24
+ class MomentumEventParser {
25
+ static isMomentumEvent(eventType) {
26
+ return eventType === null || eventType === void 0 ? void 0 : eventType.includes(this.MOMENTUM_PACKAGE);
27
+ }
28
+ static parseSwapEvent(eventData) {
29
+ try {
30
+ const SwapEventSchema = bcs_1.bcs.struct('MomentumSwapEvent', {
31
+ sender: bcs_1.bcs.Address,
32
+ pool_id: bcs_1.bcs.Address,
33
+ x_for_y: bcs_1.bcs.Bool,
34
+ amount_x: bcs_1.bcs.U64,
35
+ amount_y: bcs_1.bcs.U64,
36
+ sqrt_price_before: bcs_1.bcs.U128,
37
+ sqrt_price_after: bcs_1.bcs.U128,
38
+ liquidity: bcs_1.bcs.U128,
39
+ tick_index: bcs_1.bcs.U32,
40
+ fee_amount: bcs_1.bcs.U64,
41
+ protocol_fee: bcs_1.bcs.U64,
42
+ reserve_x: bcs_1.bcs.U64,
43
+ reserve_y: bcs_1.bcs.U64
44
+ });
45
+ return SwapEventSchema.parse(eventData);
46
+ }
47
+ catch (error) {
48
+ console.error('解析 Momentum SwapEvent 失败:', error);
49
+ return null;
50
+ }
51
+ }
52
+ static parseRepayFlashSwapEvent(eventData) {
53
+ try {
54
+ const RepayFlashSwapEventSchema = bcs_1.bcs.struct('MomentumRepayFlashSwapEvent', {
55
+ sender: bcs_1.bcs.Address,
56
+ pool_id: bcs_1.bcs.Address,
57
+ amount_x_debt: bcs_1.bcs.U64,
58
+ amount_y_debt: bcs_1.bcs.U64,
59
+ paid_x: bcs_1.bcs.U64,
60
+ paid_y: bcs_1.bcs.U64,
61
+ reserve_x: bcs_1.bcs.U64,
62
+ reserve_y: bcs_1.bcs.U64
63
+ });
64
+ return RepayFlashSwapEventSchema.parse(eventData);
65
+ }
66
+ catch (error) {
67
+ console.error('解析 Momentum RepayFlashSwapEvent 失败:', error);
68
+ return null;
69
+ }
70
+ }
71
+ static calculatePrice(sqrtPrice, tokenXDecimals = 6, tokenYDecimals = 9) {
72
+ try {
73
+ const price = Number(sqrtPrice * sqrtPrice) / (Math.pow(2, 128));
74
+ const decimalAdjustment = Math.pow(10, (tokenYDecimals - tokenXDecimals));
75
+ return price * decimalAdjustment;
76
+ }
77
+ catch (error) {
78
+ console.error('计算价格失败:', error);
79
+ return 0;
80
+ }
81
+ }
82
+ static parseEvent(eventContent) {
83
+ var _a, _b, _c, _d;
84
+ try {
85
+ if (!this.isMomentumEvent(eventContent.name)) {
86
+ return null;
87
+ }
88
+ const decodedContent = decodeBytes(eventContent);
89
+ if (!((_a = decodedContent.value) === null || _a === void 0 ? void 0 : _a.data) || typeof decodedContent.value.data !== 'string') {
90
+ return null;
91
+ }
92
+ const bytes = new Uint8Array(Buffer.from(decodedContent.value.data, 'hex'));
93
+ let parsedData = null;
94
+ if (((_b = eventContent.name) === null || _b === void 0 ? void 0 : _b.includes('SwapEvent')) && !((_c = eventContent.name) === null || _c === void 0 ? void 0 : _c.includes('RepayFlashSwapEvent'))) {
95
+ parsedData = this.parseSwapEvent(bytes);
96
+ }
97
+ else if ((_d = eventContent.name) === null || _d === void 0 ? void 0 : _d.includes('RepayFlashSwapEvent')) {
98
+ parsedData = this.parseRepayFlashSwapEvent(bytes);
99
+ }
100
+ if (!parsedData) {
101
+ return null;
102
+ }
103
+ const result = {
104
+ dex: 'Momentum CLMM',
105
+ eventType: eventContent.name,
106
+ parsedData,
107
+ calculatedPrice: null
108
+ };
109
+ if (parsedData.sqrt_price_after) {
110
+ result.calculatedPrice = this.calculatePrice(BigInt(parsedData.sqrt_price_after));
111
+ }
112
+ return result;
113
+ }
114
+ catch (error) {
115
+ console.error('解析 Momentum 事件失败:', error);
116
+ return null;
117
+ }
118
+ }
119
+ }
120
+ exports.MomentumEventParser = MomentumEventParser;
121
+ MomentumEventParser.MOMENTUM_PACKAGE = '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860';
@@ -0,0 +1,7 @@
1
+ export declare class CheckpointProcessor {
2
+ static processCheckpoint(checkpoint: any): any;
3
+ static processCheckpoints(checkpoints: any[]): any;
4
+ static getPoolSummary(poolStats: {
5
+ [poolId: string]: any;
6
+ }): any;
7
+ }