@clonegod/ttd-sui-common 1.0.68 → 1.0.70

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 (127) hide show
  1. package/dist/grpc/grpc-connection.js +15 -6
  2. package/dist/test/test_grpc.js +12 -2
  3. package/dist/trade/parse/sui_tx_parser.js +0 -13
  4. package/dist/trade/test/test_parse_sui_tx_result.js +24 -24
  5. package/package.json +1 -1
  6. package/dist/rpc/account-api.d.ts +0 -14
  7. package/dist/rpc/account-api.js +0 -113
  8. package/dist/rpc/coin-api.d.ts +0 -0
  9. package/dist/rpc/coin-api.js +0 -0
  10. package/dist/rpc/rpc-connection.d.ts +0 -8
  11. package/dist/rpc/rpc-connection.js +0 -54
  12. package/dist/test/test_checkpoint_processor.d.ts +0 -1
  13. package/dist/test/test_checkpoint_processor.js +0 -112
  14. package/dist/test/test_checkpoint_subscription.d.ts +0 -1
  15. package/dist/test/test_checkpoint_subscription.js +0 -132
  16. package/dist/test/test_checkpoint_with_schema.d.ts +0 -1
  17. package/dist/test/test_checkpoint_with_schema.js +0 -250
  18. package/dist/test/test_dynamic_bcs.d.ts +0 -1
  19. package/dist/test/test_dynamic_bcs.js +0 -82
  20. package/dist/test/test_github_extractor.d.ts +0 -1
  21. package/dist/test/test_github_extractor.js +0 -69
  22. package/dist/test/test_hybrid_bcs.d.ts +0 -1
  23. package/dist/test/test_hybrid_bcs.js +0 -98
  24. package/dist/test/test_momentum_events.d.ts +0 -1
  25. package/dist/test/test_momentum_events.js +0 -113
  26. package/dist/test/test_rpc.d.ts +0 -1
  27. package/dist/test/test_rpc.js +0 -34
  28. package/dist/test/test_schema_database.d.ts +0 -1
  29. package/dist/test/test_schema_database.js +0 -91
  30. package/dist/test/test_simple_schema.d.ts +0 -1
  31. package/dist/test/test_simple_schema.js +0 -78
  32. package/dist/test/test_single_momentum_event.d.ts +0 -1
  33. package/dist/test/test_single_momentum_event.js +0 -44
  34. package/dist/ttd-sui-common/src/constants/index.d.ts +0 -4
  35. package/dist/ttd-sui-common/src/constants/index.js +0 -8
  36. package/dist/ttd-sui-common/src/grpc/gas-price-cache.d.ts +0 -21
  37. package/dist/ttd-sui-common/src/grpc/gas-price-cache.js +0 -83
  38. package/dist/ttd-sui-common/src/grpc/grpc-connection.d.ts +0 -13
  39. package/dist/ttd-sui-common/src/grpc/grpc-connection.js +0 -99
  40. package/dist/ttd-sui-common/src/grpc/index.d.ts +0 -7
  41. package/dist/ttd-sui-common/src/grpc/index.js +0 -17
  42. package/dist/ttd-sui-common/src/grpc/ledger-service.d.ts +0 -12
  43. package/dist/ttd-sui-common/src/grpc/ledger-service.js +0 -161
  44. package/dist/ttd-sui-common/src/grpc/live-data-service.d.ts +0 -10
  45. package/dist/ttd-sui-common/src/grpc/live-data-service.js +0 -107
  46. package/dist/ttd-sui-common/src/grpc/subscription-service.d.ts +0 -7
  47. package/dist/ttd-sui-common/src/grpc/subscription-service.js +0 -69
  48. package/dist/ttd-sui-common/src/grpc/sui-grpc-client.d.ts +0 -16
  49. package/dist/ttd-sui-common/src/grpc/sui-grpc-client.js +0 -38
  50. package/dist/ttd-sui-common/src/grpc/transaction-service.d.ts +0 -7
  51. package/dist/ttd-sui-common/src/grpc/transaction-service.js +0 -49
  52. package/dist/ttd-sui-common/src/index.d.ts +0 -9
  53. package/dist/ttd-sui-common/src/index.js +0 -25
  54. package/dist/ttd-sui-common/src/quote/index.d.ts +0 -1
  55. package/dist/ttd-sui-common/src/quote/index.js +0 -17
  56. package/dist/ttd-sui-common/src/quote/pricing/index.d.ts +0 -1
  57. package/dist/ttd-sui-common/src/quote/pricing/index.js +0 -17
  58. package/dist/ttd-sui-common/src/quote/pricing/token_price_cache.d.ts +0 -9
  59. package/dist/ttd-sui-common/src/quote/pricing/token_price_cache.js +0 -42
  60. package/dist/ttd-sui-common/src/redis/index.d.ts +0 -1
  61. package/dist/ttd-sui-common/src/redis/index.js +0 -17
  62. package/dist/ttd-sui-common/src/redis/redis_client.d.ts +0 -21
  63. package/dist/ttd-sui-common/src/redis/redis_client.js +0 -155
  64. package/dist/ttd-sui-common/src/test/test.d.ts +0 -1
  65. package/dist/ttd-sui-common/src/test/test.js +0 -126
  66. package/dist/ttd-sui-common/src/test/test_checkpoint.d.ts +0 -1
  67. package/dist/ttd-sui-common/src/test/test_checkpoint.js +0 -64
  68. package/dist/ttd-sui-common/src/test/test_grpc.d.ts +0 -1
  69. package/dist/ttd-sui-common/src/test/test_grpc.js +0 -84
  70. package/dist/ttd-sui-common/src/trade/abstract_sui_dex_trade_plus.d.ts +0 -32
  71. package/dist/ttd-sui-common/src/trade/abstract_sui_dex_trade_plus.js +0 -216
  72. package/dist/ttd-sui-common/src/trade/check/index.d.ts +0 -1
  73. package/dist/ttd-sui-common/src/trade/check/index.js +0 -5
  74. package/dist/ttd-sui-common/src/trade/check/tx_result_checker.d.ts +0 -13
  75. package/dist/ttd-sui-common/src/trade/check/tx_result_checker.js +0 -111
  76. package/dist/ttd-sui-common/src/trade/index.d.ts +0 -4
  77. package/dist/ttd-sui-common/src/trade/index.js +0 -20
  78. package/dist/ttd-sui-common/src/trade/parse/index.d.ts +0 -1
  79. package/dist/ttd-sui-common/src/trade/parse/index.js +0 -5
  80. package/dist/ttd-sui-common/src/trade/parse/sui_tx_parser.d.ts +0 -13
  81. package/dist/ttd-sui-common/src/trade/parse/sui_tx_parser.js +0 -167
  82. package/dist/ttd-sui-common/src/trade/send_tx/index.d.ts +0 -10
  83. package/dist/ttd-sui-common/src/trade/send_tx/index.js +0 -48
  84. package/dist/ttd-sui-common/src/trade/test/test_parse_sui_tx_result.d.ts +0 -1
  85. package/dist/ttd-sui-common/src/trade/test/test_parse_sui_tx_result.js +0 -105
  86. package/dist/ttd-sui-common/src/type/index.d.ts +0 -18
  87. package/dist/ttd-sui-common/src/type/index.js +0 -2
  88. package/dist/ttd-sui-common/src/utils/checkpoint_parse.d.ts +0 -0
  89. package/dist/ttd-sui-common/src/utils/checkpoint_parse.js +0 -0
  90. package/dist/ttd-sui-common/src/utils/decode.d.ts +0 -2
  91. package/dist/ttd-sui-common/src/utils/decode.js +0 -43
  92. package/dist/ttd-sui-common/src/utils/format.d.ts +0 -1
  93. package/dist/ttd-sui-common/src/utils/format.js +0 -18
  94. package/dist/ttd-sui-common/src/utils/index.d.ts +0 -2
  95. package/dist/ttd-sui-common/src/utils/index.js +0 -18
  96. package/dist/ttd-sui-market-data/src/sui_objects/config_manager.d.ts +0 -22
  97. package/dist/ttd-sui-market-data/src/sui_objects/config_manager.js +0 -169
  98. package/dist/ttd-sui-market-data/src/sui_objects/example.d.ts +0 -1
  99. package/dist/ttd-sui-market-data/src/sui_objects/example.js +0 -72
  100. package/dist/ttd-sui-market-data/src/sui_objects/index.d.ts +0 -6
  101. package/dist/ttd-sui-market-data/src/sui_objects/index.js +0 -15
  102. package/dist/ttd-sui-market-data/src/sui_objects/object_mgt.d.ts +0 -47
  103. package/dist/ttd-sui-market-data/src/sui_objects/object_mgt.js +0 -483
  104. package/dist/ttd-sui-market-data/src/sui_objects/types.d.ts +0 -60
  105. package/dist/ttd-sui-market-data/src/sui_objects/types.js +0 -24
  106. package/dist/ttd-sui-market-data/src/sui_objects/version_checker.d.ts +0 -30
  107. package/dist/ttd-sui-market-data/src/sui_objects/version_checker.js +0 -207
  108. package/dist/utils/bcs-parser.d.ts +0 -8
  109. package/dist/utils/bcs-parser.js +0 -121
  110. package/dist/utils/checkpoint-processor.d.ts +0 -7
  111. package/dist/utils/checkpoint-processor.js +0 -123
  112. package/dist/utils/checkpoint.d.ts +0 -7
  113. package/dist/utils/checkpoint.js +0 -26
  114. package/dist/utils/dex-parser-manager.d.ts +0 -7
  115. package/dist/utils/dex-parser-manager.js +0 -138
  116. package/dist/utils/dex_event_parser.d.ts +0 -34
  117. package/dist/utils/dex_event_parser.js +0 -132
  118. package/dist/utils/dex_schema_database.d.ts +0 -206
  119. package/dist/utils/dex_schema_database.js +0 -169
  120. package/dist/utils/dynamic_bcs_parser.d.ts +0 -21
  121. package/dist/utils/dynamic_bcs_parser.js +0 -166
  122. package/dist/utils/github_schema_extractor.d.ts +0 -20
  123. package/dist/utils/github_schema_extractor.js +0 -153
  124. package/dist/utils/hybrid_bcs_parser.d.ts +0 -22
  125. package/dist/utils/hybrid_bcs_parser.js +0 -194
  126. package/dist/utils/simple_schema_parser.d.ts +0 -76
  127. package/dist/utils/simple_schema_parser.js +0 -193
@@ -1,483 +0,0 @@
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
- exports.SuiWalletObjectsManagement = void 0;
13
- const dist_1 = require("@clonegod/ttd-core/dist");
14
- const grpc_1 = require("../../../ttd-sui-common/src/grpc");
15
- const redis_1 = require("../../../ttd-sui-common/src/redis");
16
- const config_manager_1 = require("./config_manager");
17
- const types_1 = require("./types");
18
- const version_checker_1 = require("./version_checker");
19
- class SuiWalletObjectsManagement {
20
- constructor(appConfig, group_id, wallet_address) {
21
- this.token_list = [];
22
- this.appConfig = appConfig;
23
- this.group_id = group_id;
24
- this.wallet_address = wallet_address;
25
- this.grpcClient = new grpc_1.SuiGrpcClient();
26
- this.redisClient = new redis_1.SimpleRedisClient(wallet_address);
27
- this.configManager = new config_manager_1.ConfigManager();
28
- this.versionChecker = new version_checker_1.ObjectVersionChecker(this.redisClient, this.grpcClient, wallet_address);
29
- }
30
- init() {
31
- return __awaiter(this, void 0, void 0, function* () {
32
- console.log(`🏗️ 初始化钱包对象管理系统: ${this.wallet_address}`);
33
- yield this.init_trade_tokens();
34
- yield this.initializeAllObjectPools();
35
- this.versionChecker.start();
36
- console.log(`✅ 钱包对象管理系统初始化完成`);
37
- });
38
- }
39
- init_trade_tokens() {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- let token_list = [];
42
- const trade_pools = yield this.appConfig.arb_cache.get_all_trade_pools(this.group_id);
43
- for (const pool of trade_pools) {
44
- let tokenAExist = token_list.some(token => token.address === pool.tokenA.address);
45
- let tokenBExist = token_list.some(token => token.address === pool.tokenB.address);
46
- if (!tokenAExist && pool.tokenA) {
47
- token_list.push(pool.tokenA);
48
- }
49
- if (!tokenBExist && pool.tokenB) {
50
- token_list.push(pool.tokenB);
51
- }
52
- }
53
- this.token_list = token_list;
54
- (0, dist_1.log_info)(`load_trade_pools token_list:`, {
55
- group_id: this.group_id,
56
- wallet_address: this.wallet_address,
57
- token_list: token_list.map(token => token.address),
58
- });
59
- });
60
- }
61
- queryTokenObjectsFromChain(tokenAddress) {
62
- return __awaiter(this, void 0, void 0, function* () {
63
- try {
64
- console.log(`🔍 从链上查询代币对象: ${tokenAddress}`);
65
- const response = yield this.grpcClient.liveDataService.listOwnedObjects(this.wallet_address, tokenAddress, 100);
66
- const objects = [];
67
- if (response && response.objects) {
68
- for (const obj of response.objects) {
69
- const objectData = obj.object;
70
- if (objectData && objectData.balance) {
71
- objects.push({
72
- object_id: objectData.object_id,
73
- balance: BigInt(objectData.balance),
74
- version: objectData.version,
75
- status: types_1.ObjectStatus.AVAILABLE,
76
- allocated_at: undefined,
77
- allocated_by: undefined
78
- });
79
- }
80
- }
81
- }
82
- console.log(`✅ 从链上查询到 ${objects.length} 个 ${tokenAddress} 对象`);
83
- return objects;
84
- }
85
- catch (error) {
86
- console.error(`❌ 查询链上对象失败: ${tokenAddress}`, error);
87
- return [];
88
- }
89
- });
90
- }
91
- initializeAllObjectPools() {
92
- return __awaiter(this, void 0, void 0, function* () {
93
- console.log(`🏗️ 初始化所有对象池`);
94
- for (const token of this.token_list) {
95
- yield this.initializeObjectPool(token.address);
96
- }
97
- });
98
- }
99
- initializeObjectPool(tokenAddress) {
100
- return __awaiter(this, void 0, void 0, function* () {
101
- console.log(`🏗️ 初始化代币对象池: ${tokenAddress}`);
102
- const chainObjects = yield this.queryTokenObjectsFromChain(tokenAddress);
103
- const config = this.configManager.getTokenConfig(tokenAddress);
104
- const currentCount = chainObjects.length;
105
- const needsMoreObjects = currentCount < config.min_objects;
106
- if (needsMoreObjects) {
107
- console.log(`⚠️ 对象数量不足: ${currentCount}/${config.min_objects}`);
108
- yield this.performMaintenance(tokenAddress, 'split');
109
- }
110
- yield this.storeObjectsToRedis(tokenAddress, chainObjects);
111
- console.log(`✅ 代币对象池初始化完成: ${tokenAddress}`);
112
- });
113
- }
114
- allocateObjectForTrade(tokenAddress, requiredAmount, transactionHash) {
115
- return __awaiter(this, void 0, void 0, function* () {
116
- console.log(` 分配对象: ${tokenAddress}, 需要: ${requiredAmount}`);
117
- const availableObjects = yield this.getAvailableObjects(tokenAddress);
118
- availableObjects.sort((a, b) => Number(b.balance - a.balance));
119
- for (const obj of availableObjects) {
120
- if (BigInt(obj.balance) >= requiredAmount) {
121
- const allocated = yield this.allocateObject(tokenAddress, obj, transactionHash);
122
- if (allocated) {
123
- console.log(`✅ 对象分配成功: ${obj.object_id}, 余额: ${obj.balance}`);
124
- return allocated;
125
- }
126
- }
127
- }
128
- console.log(`❌ 对象分配失败: 没有满足条件的对象 (需要: ${requiredAmount})`);
129
- return null;
130
- });
131
- }
132
- performMaintenance(tokenAddress, type) {
133
- return __awaiter(this, void 0, void 0, function* () {
134
- const availableObjects = yield this.getAvailableObjects(tokenAddress);
135
- const config = this.configManager.getTokenConfig(tokenAddress);
136
- if (type === 'auto' || !type) {
137
- const maintenance = this.configManager.needsMaintenance(tokenAddress, availableObjects.length);
138
- if (maintenance.needsSplit) {
139
- console.log(` ⚠️ 需要拆分: ${maintenance.reason}`);
140
- yield this.performMaintenance(tokenAddress, 'split');
141
- }
142
- if (maintenance.needsMerge) {
143
- console.log(` ⚠️ 需要合并: ${maintenance.reason}`);
144
- yield this.performMaintenance(tokenAddress, 'merge');
145
- }
146
- return;
147
- }
148
- if (type === 'split') {
149
- console.log(`🔪 开始拆分维护: ${tokenAddress}`);
150
- const largeObjects = availableObjects.filter(obj => BigInt(obj.balance) > BigInt(config.split_threshold));
151
- if (largeObjects.length === 0) {
152
- console.log(` ℹ️ 没有需要拆分的大对象`);
153
- return;
154
- }
155
- for (const obj of largeObjects) {
156
- yield this.splitObject(tokenAddress, obj);
157
- }
158
- console.log(`✅ 拆分维护完成: ${tokenAddress}`);
159
- }
160
- if (type === 'merge') {
161
- console.log(`🔗 开始合并维护: ${tokenAddress}`);
162
- const smallObjects = availableObjects.filter(obj => BigInt(obj.balance) < BigInt(config.merge_threshold));
163
- if (smallObjects.length < 2) {
164
- console.log(` ℹ️ 没有足够的小对象进行合并`);
165
- return;
166
- }
167
- yield this.mergeObjects(tokenAddress, smallObjects);
168
- console.log(`✅ 合并维护完成: ${tokenAddress}`);
169
- }
170
- });
171
- }
172
- printPoolStatus(tokenAddress) {
173
- return __awaiter(this, void 0, void 0, function* () {
174
- const stats = yield this.getPoolStats(tokenAddress);
175
- const objects = yield this.getObjectsFromRedis(tokenAddress);
176
- if (!stats) {
177
- console.log(`❌ 对象池未初始化: ${tokenAddress}`);
178
- return;
179
- }
180
- const config = this.configManager.getTokenConfig(tokenAddress);
181
- console.log(`\n🏊 对象池状态: ${config.symbol} (${tokenAddress.slice(0, 8)}...)`);
182
- console.log(` 配置: ${config.min_objects}-${config.max_objects} 对象 (目标: ${config.target_objects})`);
183
- console.log(` 总对象数: ${stats.total_objects}`);
184
- console.log(` 可用对象: ${stats.available_objects}`);
185
- console.log(` 使用中对象: ${stats.allocated_objects}`);
186
- console.log(` 维护中对象: ${stats.maintenance_objects}`);
187
- console.log(` 最后更新: ${new Date(stats.last_updated).toLocaleString()}`);
188
- console.log(`\n 对象详情:`);
189
- for (const obj of objects.slice(0, 10)) {
190
- const status = obj.status === types_1.ObjectStatus.AVAILABLE ? '🟢' :
191
- obj.status === types_1.ObjectStatus.ALLOCATED ? '🔒' : '🔧';
192
- const allocatedInfo = obj.allocated_by ? ` (交易: ${obj.allocated_by.slice(0, 8)}...)` : '';
193
- console.log(` ${status} ${obj.object_id.slice(0, 8)}... - ${obj.balance.toString()} (v${obj.version})${allocatedInfo}`);
194
- }
195
- if (objects.length > 10) {
196
- console.log(` ... 还有 ${objects.length - 10} 个对象`);
197
- }
198
- console.log('');
199
- });
200
- }
201
- allocateObject(tokenAddress, obj, transactionHash) {
202
- return __awaiter(this, void 0, void 0, function* () {
203
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
204
- status: types_1.ObjectStatus.ALLOCATED,
205
- allocated_at: Date.now(),
206
- allocated_by: transactionHash
207
- });
208
- return Object.assign(Object.assign({}, obj), { status: types_1.ObjectStatus.ALLOCATED, allocated_at: Date.now(), allocated_by: transactionHash });
209
- });
210
- }
211
- releaseObject(tokenAddress, objectId) {
212
- return __awaiter(this, void 0, void 0, function* () {
213
- yield this.updateObjectStatus(tokenAddress, objectId, {
214
- status: types_1.ObjectStatus.AVAILABLE,
215
- allocated_at: undefined,
216
- allocated_by: undefined
217
- });
218
- console.log(` 释放对象: ${objectId}`);
219
- });
220
- }
221
- poolOperation(tokenAddress, operation, objects) {
222
- return __awaiter(this, void 0, void 0, function* () {
223
- const poolKey = `pool:${this.wallet_address}:${tokenAddress}:objects`;
224
- switch (operation) {
225
- case 'store':
226
- if (!objects)
227
- return;
228
- yield this.redisClient.hsetValue(poolKey, 'data', JSON.stringify(objects), 0);
229
- const stats = {
230
- total_objects: objects.length,
231
- available_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.AVAILABLE).length,
232
- allocated_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.ALLOCATED).length,
233
- maintenance_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.MAINTENANCE).length,
234
- last_updated: Date.now()
235
- };
236
- yield this.redisClient.hsetValue(poolKey, 'stats', JSON.stringify(stats), 0);
237
- break;
238
- case 'get':
239
- const objectsData = yield this.redisClient.hgetvalue(poolKey, 'data');
240
- return objectsData ? JSON.parse(objectsData) : [];
241
- case 'getAvailable':
242
- const allObjects = yield this.poolOperation(tokenAddress, 'get');
243
- return allObjects.filter(obj => obj.status === types_1.ObjectStatus.AVAILABLE);
244
- }
245
- });
246
- }
247
- storeObjectsToRedis(tokenAddress, objects) {
248
- return __awaiter(this, void 0, void 0, function* () {
249
- yield this.poolOperation(tokenAddress, 'store', objects);
250
- });
251
- }
252
- getObjectsFromRedis(tokenAddress) {
253
- return __awaiter(this, void 0, void 0, function* () {
254
- return yield this.poolOperation(tokenAddress, 'get');
255
- });
256
- }
257
- getAvailableObjects(tokenAddress) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- return yield this.poolOperation(tokenAddress, 'getAvailable');
260
- });
261
- }
262
- updateObjectStatus(tokenAddress, objectId, updates) {
263
- return __awaiter(this, void 0, void 0, function* () {
264
- const poolKey = `pool:${this.wallet_address}:${tokenAddress}:objects`;
265
- const objectsData = yield this.redisClient.hgetvalue(poolKey, 'data');
266
- if (!objectsData)
267
- return;
268
- const objects = JSON.parse(objectsData);
269
- const objectIndex = objects.findIndex(obj => obj.object_id === objectId);
270
- if (objectIndex !== -1) {
271
- objects[objectIndex] = Object.assign(Object.assign({}, objects[objectIndex]), updates);
272
- yield this.redisClient.hsetValue(poolKey, 'data', JSON.stringify(objects), 0);
273
- yield this.updatePoolStats(tokenAddress, objects);
274
- }
275
- });
276
- }
277
- updatePoolStats(tokenAddress, objects) {
278
- return __awaiter(this, void 0, void 0, function* () {
279
- const poolKey = `pool:${this.wallet_address}:${tokenAddress}:objects`;
280
- const stats = {
281
- total_objects: objects.length,
282
- available_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.AVAILABLE).length,
283
- allocated_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.ALLOCATED).length,
284
- maintenance_objects: objects.filter(obj => obj.status === types_1.ObjectStatus.MAINTENANCE).length,
285
- last_updated: Date.now()
286
- };
287
- yield this.redisClient.hsetValue(poolKey, 'stats', JSON.stringify(stats), 0);
288
- });
289
- }
290
- getPoolStats(tokenAddress) {
291
- return __awaiter(this, void 0, void 0, function* () {
292
- const poolKey = `pool:${this.wallet_address}:${tokenAddress}:objects`;
293
- const statsData = yield this.redisClient.hgetvalue(poolKey, 'stats');
294
- if (!statsData)
295
- return null;
296
- return JSON.parse(statsData);
297
- });
298
- }
299
- splitObject(tokenAddress, obj) {
300
- return __awaiter(this, void 0, void 0, function* () {
301
- console.log(` 🔪 拆分对象: ${obj.object_id} (余额: ${obj.balance})`);
302
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
303
- status: types_1.ObjectStatus.MAINTENANCE
304
- });
305
- try {
306
- const splitResult = yield this.executeSplitTransaction(obj);
307
- if (splitResult.success) {
308
- yield this.removeObjectFromPool(tokenAddress, obj.object_id);
309
- for (const newObject of splitResult.newObjects) {
310
- yield this.addObjectToPool(tokenAddress, {
311
- object_id: newObject.object_id,
312
- balance: BigInt(newObject.balance),
313
- version: newObject.version,
314
- status: types_1.ObjectStatus.AVAILABLE
315
- });
316
- }
317
- console.log(` ✅ 拆分成功: ${obj.object_id} -> ${splitResult.newObjects.length} 个新对象`);
318
- }
319
- else {
320
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
321
- status: types_1.ObjectStatus.AVAILABLE
322
- });
323
- console.log(` ❌ 拆分失败: ${obj.object_id}`);
324
- }
325
- }
326
- catch (error) {
327
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
328
- status: types_1.ObjectStatus.AVAILABLE
329
- });
330
- console.error(` ❌ 拆分异常: ${obj.object_id}`, error);
331
- }
332
- });
333
- }
334
- mergeObjects(tokenAddress, objects) {
335
- return __awaiter(this, void 0, void 0, function* () {
336
- console.log(` 🔗 合并对象: ${objects.length} 个`);
337
- for (const obj of objects) {
338
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
339
- status: types_1.ObjectStatus.MAINTENANCE
340
- });
341
- }
342
- try {
343
- const mergeResult = yield this.executeMergeTransaction(objects);
344
- if (mergeResult.success) {
345
- for (const obj of objects) {
346
- yield this.removeObjectFromPool(tokenAddress, obj.object_id);
347
- }
348
- yield this.addObjectToPool(tokenAddress, {
349
- object_id: mergeResult.newObject.object_id,
350
- balance: BigInt(mergeResult.newObject.balance),
351
- version: mergeResult.newObject.version,
352
- status: types_1.ObjectStatus.AVAILABLE
353
- });
354
- console.log(` ✅ 合并成功: ${objects.length} 个对象 -> 1 个新对象`);
355
- }
356
- else {
357
- for (const obj of objects) {
358
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
359
- status: types_1.ObjectStatus.AVAILABLE
360
- });
361
- }
362
- console.log(` ❌ 合并失败`);
363
- }
364
- }
365
- catch (error) {
366
- for (const obj of objects) {
367
- yield this.updateObjectStatus(tokenAddress, obj.object_id, {
368
- status: types_1.ObjectStatus.AVAILABLE
369
- });
370
- }
371
- console.error(` ❌ 合并异常`, error);
372
- }
373
- });
374
- }
375
- objectPoolOperation(tokenAddress, operation, objectId, obj) {
376
- return __awaiter(this, void 0, void 0, function* () {
377
- const objects = yield this.getObjectsFromRedis(tokenAddress);
378
- let updatedObjects;
379
- switch (operation) {
380
- case 'add':
381
- if (!obj)
382
- return;
383
- updatedObjects = [...objects, obj];
384
- break;
385
- case 'remove':
386
- if (!objectId)
387
- return;
388
- updatedObjects = objects.filter(o => o.object_id !== objectId);
389
- break;
390
- default:
391
- return;
392
- }
393
- yield this.storeObjectsToRedis(tokenAddress, updatedObjects);
394
- });
395
- }
396
- removeObjectFromPool(tokenAddress, objectId) {
397
- return __awaiter(this, void 0, void 0, function* () {
398
- yield this.objectPoolOperation(tokenAddress, 'remove', objectId);
399
- });
400
- }
401
- addObjectToPool(tokenAddress, obj) {
402
- return __awaiter(this, void 0, void 0, function* () {
403
- yield this.objectPoolOperation(tokenAddress, 'add', undefined, obj);
404
- });
405
- }
406
- executeSplitTransaction(obj) {
407
- return __awaiter(this, void 0, void 0, function* () {
408
- console.log(` 🔄 执行拆分交易: ${obj.object_id}`);
409
- return {
410
- success: true,
411
- newObjects: [
412
- {
413
- object_id: `${obj.object_id}_split_1`,
414
- balance: obj.balance / BigInt(2),
415
- version: obj.version + 1
416
- },
417
- {
418
- object_id: `${obj.object_id}_split_2`,
419
- balance: obj.balance / BigInt(2),
420
- version: obj.version + 1
421
- }
422
- ]
423
- };
424
- });
425
- }
426
- executeMergeTransaction(objects) {
427
- return __awaiter(this, void 0, void 0, function* () {
428
- console.log(` 🔄 执行合并交易: ${objects.length} 个对象`);
429
- const totalBalance = objects.reduce((sum, obj) => sum + obj.balance, BigInt(0));
430
- return {
431
- success: true,
432
- newObject: {
433
- object_id: `merged_${Date.now()}`,
434
- balance: totalBalance,
435
- version: Math.max(...objects.map(obj => obj.version)) + 1
436
- }
437
- };
438
- });
439
- }
440
- grpcQuery(operation, coin_type) {
441
- return __awaiter(this, void 0, void 0, function* () {
442
- switch (operation) {
443
- case 'listOwnedObjects':
444
- if (!coin_type)
445
- throw new Error('coin_type is required for listOwnedObjects');
446
- return yield this.grpcClient.liveDataService.listOwnedObjects(this.wallet_address, coin_type, 100, ['object_id', 'balance', 'object_type', 'version']);
447
- case 'getBalance':
448
- if (!coin_type)
449
- throw new Error('coin_type is required for getBalance');
450
- return yield this.grpcClient.liveDataService.getBalance(this.wallet_address, coin_type);
451
- case 'listBalances':
452
- return yield this.grpcClient.liveDataService.listBalances(this.wallet_address);
453
- case 'getCoinInfo':
454
- if (!coin_type)
455
- throw new Error('coin_type is required for getCoinInfo');
456
- return yield this.grpcClient.liveDataService.getCoinInfo(coin_type);
457
- default:
458
- throw new Error(`Unknown operation: ${operation}`);
459
- }
460
- });
461
- }
462
- listOwnedObjects(coin_type) {
463
- return __awaiter(this, void 0, void 0, function* () {
464
- return yield this.grpcQuery('listOwnedObjects', coin_type);
465
- });
466
- }
467
- getBalance(coin_type) {
468
- return __awaiter(this, void 0, void 0, function* () {
469
- return yield this.grpcQuery('getBalance', coin_type);
470
- });
471
- }
472
- listBalances() {
473
- return __awaiter(this, void 0, void 0, function* () {
474
- return yield this.grpcQuery('listBalances');
475
- });
476
- }
477
- getCoinInfo(coin_type) {
478
- return __awaiter(this, void 0, void 0, function* () {
479
- return yield this.grpcQuery('getCoinInfo', coin_type);
480
- });
481
- }
482
- }
483
- exports.SuiWalletObjectsManagement = SuiWalletObjectsManagement;
@@ -1,60 +0,0 @@
1
- export declare enum ObjectStatus {
2
- AVAILABLE = "available",
3
- ALLOCATED = "allocated",
4
- MAINTENANCE = "maintenance"
5
- }
6
- export interface ObjectInfo {
7
- object_id: string;
8
- balance: bigint;
9
- version: number;
10
- status: ObjectStatus;
11
- allocated_at?: number;
12
- allocated_by?: string;
13
- }
14
- export interface PoolStats {
15
- total_objects: number;
16
- available_objects: number;
17
- allocated_objects: number;
18
- maintenance_objects: number;
19
- last_updated: number;
20
- }
21
- export interface TokenConfig {
22
- address: string;
23
- symbol: string;
24
- min_objects: number;
25
- max_objects: number;
26
- target_objects: number;
27
- min_balance_per_object: string;
28
- max_balance_per_object: string;
29
- split_threshold: string;
30
- merge_threshold: string;
31
- priority: number;
32
- is_gas_token: boolean;
33
- }
34
- export declare enum MaintenanceType {
35
- SPLIT = "split",
36
- MERGE = "merge",
37
- SYNC = "sync"
38
- }
39
- export interface MaintenanceTask {
40
- type: MaintenanceType;
41
- tokenAddress: string;
42
- priority: number;
43
- createdAt: number;
44
- }
45
- export declare enum ObjectEventType {
46
- OBJECT_ALLOCATED = "OBJECT_ALLOCATED",
47
- OBJECT_RELEASED = "OBJECT_RELEASED",
48
- OBJECT_CREATED = "OBJECT_CREATED",
49
- OBJECT_DELETED = "OBJECT_DELETED",
50
- OBJECT_MAINTENANCE_START = "OBJECT_MAINTENANCE_START",
51
- OBJECT_MAINTENANCE_END = "OBJECT_MAINTENANCE_END"
52
- }
53
- export interface ObjectEvent {
54
- type: ObjectEventType;
55
- objectId: string;
56
- tokenAddress: string;
57
- walletAddress: string;
58
- timestamp: number;
59
- data: any;
60
- }
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ObjectEventType = exports.MaintenanceType = exports.ObjectStatus = void 0;
4
- var ObjectStatus;
5
- (function (ObjectStatus) {
6
- ObjectStatus["AVAILABLE"] = "available";
7
- ObjectStatus["ALLOCATED"] = "allocated";
8
- ObjectStatus["MAINTENANCE"] = "maintenance";
9
- })(ObjectStatus || (exports.ObjectStatus = ObjectStatus = {}));
10
- var MaintenanceType;
11
- (function (MaintenanceType) {
12
- MaintenanceType["SPLIT"] = "split";
13
- MaintenanceType["MERGE"] = "merge";
14
- MaintenanceType["SYNC"] = "sync";
15
- })(MaintenanceType || (exports.MaintenanceType = MaintenanceType = {}));
16
- var ObjectEventType;
17
- (function (ObjectEventType) {
18
- ObjectEventType["OBJECT_ALLOCATED"] = "OBJECT_ALLOCATED";
19
- ObjectEventType["OBJECT_RELEASED"] = "OBJECT_RELEASED";
20
- ObjectEventType["OBJECT_CREATED"] = "OBJECT_CREATED";
21
- ObjectEventType["OBJECT_DELETED"] = "OBJECT_DELETED";
22
- ObjectEventType["OBJECT_MAINTENANCE_START"] = "OBJECT_MAINTENANCE_START";
23
- ObjectEventType["OBJECT_MAINTENANCE_END"] = "OBJECT_MAINTENANCE_END";
24
- })(ObjectEventType || (exports.ObjectEventType = ObjectEventType = {}));
@@ -1,30 +0,0 @@
1
- import { SimpleRedisClient } from "../../../ttd-sui-common/src/redis";
2
- import { SuiGrpcClient } from "../../../ttd-sui-common/src/grpc";
3
- export declare class ObjectVersionChecker {
4
- private redisClient;
5
- private grpcClient;
6
- private walletAddress;
7
- private checkInterval;
8
- private isRunning;
9
- private checkTimer?;
10
- private knownTokens;
11
- constructor(redisClient: SimpleRedisClient, grpcClient: SuiGrpcClient, walletAddress: string, knownTokens?: string[]);
12
- start(): void;
13
- stop(): void;
14
- private checkAllocatedObjects;
15
- private checkObjectVersion;
16
- private getAllocatedObjects;
17
- private markObjectReleased;
18
- private markObjectDeleted;
19
- private updateObjectStatus;
20
- private updatePoolStats;
21
- private removeObjectFromPool;
22
- private findObjectToken;
23
- private publishObjectEvent;
24
- updateKnownTokens(tokens: string[]): void;
25
- getStatus(): {
26
- isRunning: boolean;
27
- checkInterval: number;
28
- knownTokens: string[];
29
- };
30
- }