@clonegod/ttd-sui-common 1.0.101 → 2.0.1

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 (126) hide show
  1. package/dist/appconfig/SuiQuoteAppConfig.d.ts +10 -0
  2. package/dist/appconfig/SuiQuoteAppConfig.js +35 -0
  3. package/dist/appconfig/SuiTradeAppConfig.d.ts +7 -0
  4. package/dist/appconfig/SuiTradeAppConfig.js +13 -0
  5. package/dist/appconfig/ensure_core_env.d.ts +1 -0
  6. package/dist/appconfig/ensure_core_env.js +18 -0
  7. package/dist/appconfig/index.d.ts +5 -0
  8. package/dist/appconfig/index.js +21 -0
  9. package/dist/appconfig/sui_dex_env_args.d.ts +5 -0
  10. package/dist/appconfig/sui_dex_env_args.js +28 -0
  11. package/dist/appconfig/sui_env_args.d.ts +4 -0
  12. package/dist/appconfig/sui_env_args.js +20 -0
  13. package/dist/grpc/gas-price-cache.js +19 -32
  14. package/dist/grpc/grpc-connection.js +5 -3
  15. package/dist/grpc/grpc_provider_registry.d.ts +14 -0
  16. package/dist/grpc/grpc_provider_registry.js +60 -0
  17. package/dist/grpc/index.d.ts +3 -0
  18. package/dist/grpc/index.js +13 -1
  19. package/dist/grpc/ledger-service.js +107 -128
  20. package/dist/grpc/proto_value.d.ts +4 -0
  21. package/dist/grpc/proto_value.js +59 -0
  22. package/dist/grpc/state-service.d.ts +1 -0
  23. package/dist/grpc/state-service.js +99 -102
  24. package/dist/grpc/sui-grpc-client.js +2 -13
  25. package/dist/grpc/sui_object_reader.d.ts +15 -0
  26. package/dist/grpc/sui_object_reader.js +60 -0
  27. package/dist/grpc/transaction-service.js +26 -37
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/quote/abstract_dex_quote.d.ts +60 -0
  31. package/dist/quote/abstract_dex_quote.js +186 -0
  32. package/dist/quote/chain_ops.d.ts +17 -0
  33. package/dist/quote/chain_ops.js +52 -0
  34. package/dist/quote/index.d.ts +7 -0
  35. package/dist/quote/index.js +7 -0
  36. package/dist/quote/pool_event.d.ts +21 -0
  37. package/dist/quote/pool_event.js +6 -0
  38. package/dist/quote/pricing/token_price_cache.js +18 -29
  39. package/dist/quote/quote_amount.d.ts +4 -0
  40. package/dist/quote/quote_amount.js +24 -0
  41. package/dist/quote/quote_trace.d.ts +16 -0
  42. package/dist/quote/quote_trace.js +40 -0
  43. package/dist/quote/tick/clmm_v3_engine.d.ts +32 -0
  44. package/dist/quote/tick/clmm_v3_engine.js +48 -0
  45. package/dist/quote/tick/index.d.ts +4 -0
  46. package/dist/quote/tick/index.js +20 -0
  47. package/dist/quote/tick/local_clmm_state.d.ts +17 -0
  48. package/dist/quote/tick/local_clmm_state.js +22 -0
  49. package/dist/quote/tick/sui_clmm_tick_cache.d.ts +42 -0
  50. package/dist/quote/tick/sui_clmm_tick_cache.js +163 -0
  51. package/dist/quote/tick/sui_tick_data_provider.d.ts +2 -0
  52. package/dist/quote/tick/sui_tick_data_provider.js +6 -0
  53. package/dist/quote/verify/index.d.ts +1 -0
  54. package/dist/quote/verify/index.js +17 -0
  55. package/dist/quote/verify/quote_price_verify.d.ts +30 -0
  56. package/dist/quote/verify/quote_price_verify.js +247 -0
  57. package/dist/redis/redis_client.d.ts +1 -0
  58. package/dist/redis/redis_client.js +88 -117
  59. package/dist/rpc/index.js +59 -75
  60. package/dist/test/test.js +1 -1
  61. package/dist/test/test_checkpoint.js +4 -13
  62. package/dist/test/test_grpc.js +32 -41
  63. package/dist/trade/abstract_sui_dex_trade.d.ts +43 -0
  64. package/dist/trade/abstract_sui_dex_trade.js +380 -0
  65. package/dist/trade/abstract_sui_dex_trade_plus.d.ts +3 -1
  66. package/dist/trade/abstract_sui_dex_trade_plus.js +232 -212
  67. package/dist/trade/check/tx_result_checker.js +65 -75
  68. package/dist/trade/coin/index.d.ts +1 -0
  69. package/dist/trade/coin/index.js +17 -0
  70. package/dist/trade/coin/lua_scripts.d.ts +5 -0
  71. package/dist/trade/coin/lua_scripts.js +130 -0
  72. package/dist/trade/coin/types.d.ts +30 -0
  73. package/dist/trade/coin/types.js +2 -0
  74. package/dist/trade/coin/wallet_coin_ledger.d.ts +22 -0
  75. package/dist/trade/coin/wallet_coin_ledger.js +85 -0
  76. package/dist/trade/executor/central_executor.d.ts +72 -0
  77. package/dist/trade/executor/central_executor.js +240 -0
  78. package/dist/trade/executor/coin_cache.d.ts +21 -0
  79. package/dist/trade/executor/coin_cache.js +143 -0
  80. package/dist/trade/executor/coin_maintainer.d.ts +32 -0
  81. package/dist/trade/executor/coin_maintainer.js +123 -0
  82. package/dist/trade/executor/core_channel.d.ts +38 -0
  83. package/dist/trade/executor/core_channel.js +131 -0
  84. package/dist/trade/executor/data_channel.d.ts +27 -0
  85. package/dist/trade/executor/data_channel.js +2 -0
  86. package/dist/trade/executor/effects.d.ts +16 -0
  87. package/dist/trade/executor/effects.js +63 -0
  88. package/dist/trade/executor/executor_client.d.ts +13 -0
  89. package/dist/trade/executor/executor_client.js +55 -0
  90. package/dist/trade/executor/executor_protocol.d.ts +26 -0
  91. package/dist/trade/executor/executor_protocol.js +32 -0
  92. package/dist/trade/executor/executor_server.d.ts +8 -0
  93. package/dist/trade/executor/executor_server.js +33 -0
  94. package/dist/trade/executor/executor_ws_client.d.ts +13 -0
  95. package/dist/trade/executor/executor_ws_client.js +58 -0
  96. package/dist/trade/executor/grpc_channel.d.ts +14 -0
  97. package/dist/trade/executor/grpc_channel.js +73 -0
  98. package/dist/trade/executor/index.d.ts +7 -0
  99. package/dist/trade/executor/index.js +23 -0
  100. package/dist/trade/executor/json_rpc_channel.d.ts +14 -0
  101. package/dist/trade/executor/json_rpc_channel.js +77 -0
  102. package/dist/trade/index.d.ts +5 -1
  103. package/dist/trade/index.js +5 -1
  104. package/dist/trade/parse/sui_tx_parser.js +98 -81
  105. package/dist/trade/send_tx/index.js +34 -47
  106. package/dist/trade/swap/builders/bluefin.d.ts +9 -0
  107. package/dist/trade/swap/builders/bluefin.js +60 -0
  108. package/dist/trade/swap/builders/cetus_magma.d.ts +13 -0
  109. package/dist/trade/swap/builders/cetus_magma.js +52 -0
  110. package/dist/trade/swap/builders/momentum.d.ts +9 -0
  111. package/dist/trade/swap/builders/momentum.js +80 -0
  112. package/dist/trade/swap/dex_swap_config.d.ts +28 -0
  113. package/dist/trade/swap/dex_swap_config.js +40 -0
  114. package/dist/trade/swap/index.d.ts +7 -0
  115. package/dist/trade/swap/index.js +36 -0
  116. package/dist/trade/swap/types.d.ts +20 -0
  117. package/dist/trade/swap/types.js +2 -0
  118. package/dist/trade/test/test_parse_sui_tx_result.js +33 -44
  119. package/dist/trade/tx_result_channel.d.ts +7 -0
  120. package/dist/trade/tx_result_channel.js +7 -0
  121. package/dist/utils/decode.js +1 -2
  122. package/dist/utils/index.d.ts +1 -0
  123. package/dist/utils/index.js +1 -0
  124. package/dist/utils/trade_direction.d.ts +14 -0
  125. package/dist/utils/trade_direction.js +23 -0
  126. package/package.json +3 -2
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MOMENTUM_SWAP_BUILDER = void 0;
4
+ const dist_1 = require("@clonegod/ttd-core/dist");
5
+ const dex_swap_config_1 = require("../dex_swap_config");
6
+ class MomentumSwapBuilder {
7
+ constructor() {
8
+ this.dexId = dist_1.DEX_ID.MOMENTUM_CLMM;
9
+ }
10
+ build(tx, params, inputCoin) {
11
+ const { coinTypeA: X, coinTypeB: Y, poolId, a2b: isXtoY, amount } = params;
12
+ const pkg = dex_swap_config_1.MOMENTUM_SWAP_CONFIG.tradePkg;
13
+ const version = tx.object(dex_swap_config_1.MOMENTUM_SWAP_CONFIG.versionId);
14
+ const pool = tx.object(poolId);
15
+ const sqrtLimit = params.sqrtPriceLimit !== 0n
16
+ ? params.sqrtPriceLimit
17
+ : (isXtoY ? dex_swap_config_1.SQRT_PRICE_LIMIT.MOMENTUM_MIN : dex_swap_config_1.SQRT_PRICE_LIMIT.MOMENTUM_MAX);
18
+ const [receiveA, receiveB, flashReceipt] = tx.moveCall({
19
+ target: `${pkg}::trade::flash_swap`,
20
+ typeArguments: [X, Y],
21
+ arguments: [
22
+ pool,
23
+ tx.pure.bool(isXtoY),
24
+ tx.pure.bool(true),
25
+ tx.pure.u64(amount),
26
+ tx.pure.u128(sqrtLimit),
27
+ tx.object(dex_swap_config_1.SUI_CLOCK_ID),
28
+ version,
29
+ ],
30
+ });
31
+ tx.moveCall({
32
+ target: '0x2::balance::destroy_zero',
33
+ typeArguments: [isXtoY ? X : Y],
34
+ arguments: [isXtoY ? receiveA : receiveB],
35
+ });
36
+ const [zeroCoin] = tx.moveCall({
37
+ target: '0x2::coin::zero',
38
+ typeArguments: [isXtoY ? Y : X],
39
+ arguments: [],
40
+ });
41
+ const [coinADebt, coinBDebt] = tx.moveCall({
42
+ target: `${pkg}::trade::swap_receipt_debts`,
43
+ typeArguments: [],
44
+ arguments: [flashReceipt],
45
+ });
46
+ const payCoinA = isXtoY
47
+ ? tx.moveCall({ target: '0x2::coin::split', typeArguments: [X], arguments: [inputCoin, coinADebt] })
48
+ : zeroCoin;
49
+ const payCoinB = isXtoY
50
+ ? zeroCoin
51
+ : tx.moveCall({ target: '0x2::coin::split', typeArguments: [Y], arguments: [inputCoin, coinBDebt] });
52
+ const [payBalA] = tx.moveCall({ target: '0x2::coin::into_balance', typeArguments: [X], arguments: [payCoinA] });
53
+ const [payBalB] = tx.moveCall({ target: '0x2::coin::into_balance', typeArguments: [Y], arguments: [payCoinB] });
54
+ tx.moveCall({
55
+ target: `${pkg}::trade::repay_flash_swap`,
56
+ typeArguments: [X, Y],
57
+ arguments: [pool, flashReceipt, payBalA, payBalB, version],
58
+ });
59
+ tx.moveCall({
60
+ target: `${dex_swap_config_1.MOMENTUM_SWAP_CONFIG.slippageCheckPkg}::slippage_check::assert_slippage`,
61
+ typeArguments: [X, Y],
62
+ arguments: [pool, tx.pure.u128(sqrtLimit), tx.pure.bool(isXtoY)],
63
+ });
64
+ const outType = isXtoY ? Y : X;
65
+ const [outputCoin] = tx.moveCall({
66
+ target: '0x2::coin::from_balance',
67
+ typeArguments: [outType],
68
+ arguments: [isXtoY ? receiveB : receiveA],
69
+ });
70
+ if (params.amountLimit > 0n) {
71
+ tx.moveCall({
72
+ target: `${dex_swap_config_1.CETUS_SWAP_CONFIG.integratePkg}::router::check_coin_threshold`,
73
+ typeArguments: [outType],
74
+ arguments: [outputCoin, tx.pure.u64(params.amountLimit)],
75
+ });
76
+ }
77
+ return { outputCoin, leftoverCoins: [inputCoin] };
78
+ }
79
+ }
80
+ exports.MOMENTUM_SWAP_BUILDER = new MomentumSwapBuilder();
@@ -0,0 +1,28 @@
1
+ export declare const SUI_CLOCK_ID = "0x6";
2
+ export interface CetusLikeSwapConfig {
3
+ integratePkg: string;
4
+ globalConfig: string;
5
+ }
6
+ export declare const CETUS_SWAP_CONFIG: CetusLikeSwapConfig;
7
+ export declare const MAGMA_SWAP_CONFIG: CetusLikeSwapConfig;
8
+ export interface BluefinSwapConfig {
9
+ pkg: string;
10
+ globalConfig: string;
11
+ }
12
+ export declare const BLUEFIN_SWAP_CONFIG: BluefinSwapConfig;
13
+ export interface MomentumSwapConfig {
14
+ tradePkg: string;
15
+ tradePkgPublishedAt: string;
16
+ slippageCheckPkg: string;
17
+ versionId: string;
18
+ }
19
+ export declare const MOMENTUM_SWAP_CONFIG: MomentumSwapConfig;
20
+ export declare function configSharedObjectId(dexId: string): string;
21
+ export declare const SQRT_PRICE_LIMIT: {
22
+ readonly CETUS_MIN: 4295048016n;
23
+ readonly CETUS_MAX: 79226673515401279992447579055n;
24
+ readonly BLUEFIN_MIN: bigint;
25
+ readonly BLUEFIN_MAX: bigint;
26
+ readonly MOMENTUM_MIN: 4295048017n;
27
+ readonly MOMENTUM_MAX: 79226673515401279992447579050n;
28
+ };
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQRT_PRICE_LIMIT = exports.MOMENTUM_SWAP_CONFIG = exports.BLUEFIN_SWAP_CONFIG = exports.MAGMA_SWAP_CONFIG = exports.CETUS_SWAP_CONFIG = exports.SUI_CLOCK_ID = void 0;
4
+ exports.configSharedObjectId = configSharedObjectId;
5
+ exports.SUI_CLOCK_ID = '0x6';
6
+ exports.CETUS_SWAP_CONFIG = {
7
+ integratePkg: '0x2d8c2e0fc6dd25b0214b3fa747e0fd27fd54608142cd2e4f64c1cd350cc4add4',
8
+ globalConfig: '0xdaa46292632c3c4d8f31f23ea0f9b36a28ff3677e9684980e4438403a67a3d8f',
9
+ };
10
+ exports.MAGMA_SWAP_CONFIG = {
11
+ integratePkg: '0x4a9d6fb6f34ca8918756c2dfddf8f0a7fd5ef590bcffa6c03db24a6f10f42c5e',
12
+ globalConfig: '0x4c4e1402401f72c7d8533d0ed8d5f8949da363c7a3319ccef261ffe153d32f8a',
13
+ };
14
+ exports.BLUEFIN_SWAP_CONFIG = {
15
+ pkg: '0x67b34b728c4e28e704dcfecf7c5cf55c7fc593b6c65c20d1836d97c209c1928a',
16
+ globalConfig: '0x03db251ba509a8d5d8777b6338836082335d93eecbdd09a11e190a1cff51c352',
17
+ };
18
+ exports.MOMENTUM_SWAP_CONFIG = {
19
+ tradePkg: '0xcf60a40f45d46fc1e828871a647c1e25a0915dec860d2662eb10fdb382c3c1d1',
20
+ tradePkgPublishedAt: '0x70285592c97965e811e0c6f98dccc3a9c2b4ad854b3594faab9597ada267b860',
21
+ slippageCheckPkg: '0x8add2f0f8bc9748687639d7eb59b2172ba09a0172d9e63c029e23a7dbdb6abe6',
22
+ versionId: '0x2375a0b1ec12010aaea3b2545acfa2ad34cfbba03ce4b59f4c39e1e25eed1b2a',
23
+ };
24
+ function configSharedObjectId(dexId) {
25
+ switch (dexId) {
26
+ case 'CETUS-CLMM': return exports.CETUS_SWAP_CONFIG.globalConfig;
27
+ case 'MAGMA-CLMM': return exports.MAGMA_SWAP_CONFIG.globalConfig;
28
+ case 'BLUEFIN-CLMM': return exports.BLUEFIN_SWAP_CONFIG.globalConfig;
29
+ case 'MOMENTUM-CLMM': return exports.MOMENTUM_SWAP_CONFIG.versionId;
30
+ default: throw new Error(`[swap] 未知 dex_id 无配置共享对象: ${dexId}`);
31
+ }
32
+ }
33
+ exports.SQRT_PRICE_LIMIT = {
34
+ CETUS_MIN: 4295048016n,
35
+ CETUS_MAX: 79226673515401279992447579055n,
36
+ BLUEFIN_MIN: 4295048016n + 1n,
37
+ BLUEFIN_MAX: 79226673515401279992447579055n - 1n,
38
+ MOMENTUM_MIN: 4295048017n,
39
+ MOMENTUM_MAX: 79226673515401279992447579050n,
40
+ };
@@ -0,0 +1,7 @@
1
+ import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';
2
+ import { DEX_ID } from '@clonegod/ttd-core/dist';
3
+ import { SwapBuilder, SwapBuildParams, SwapBuildResult } from './types';
4
+ export * from './types';
5
+ export * from './dex_swap_config';
6
+ export declare const SWAP_BUILDER_REGISTRY: Partial<Record<DEX_ID, SwapBuilder>>;
7
+ export declare function buildSwapMoveCall(dexId: DEX_ID, tx: Transaction, params: SwapBuildParams, inputCoin: TransactionObjectArgument): SwapBuildResult;
@@ -0,0 +1,36 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SWAP_BUILDER_REGISTRY = void 0;
18
+ exports.buildSwapMoveCall = buildSwapMoveCall;
19
+ const dist_1 = require("@clonegod/ttd-core/dist");
20
+ const cetus_magma_1 = require("./builders/cetus_magma");
21
+ const bluefin_1 = require("./builders/bluefin");
22
+ const momentum_1 = require("./builders/momentum");
23
+ __exportStar(require("./types"), exports);
24
+ __exportStar(require("./dex_swap_config"), exports);
25
+ exports.SWAP_BUILDER_REGISTRY = {
26
+ [dist_1.DEX_ID.CETUS_CLMM]: cetus_magma_1.CETUS_SWAP_BUILDER,
27
+ [dist_1.DEX_ID.MAGMA_CLMM]: cetus_magma_1.MAGMA_SWAP_BUILDER,
28
+ [dist_1.DEX_ID.BLUEFIN_CLMM]: bluefin_1.BLUEFIN_SWAP_BUILDER,
29
+ [dist_1.DEX_ID.MOMENTUM_CLMM]: momentum_1.MOMENTUM_SWAP_BUILDER,
30
+ };
31
+ function buildSwapMoveCall(dexId, tx, params, inputCoin) {
32
+ const builder = exports.SWAP_BUILDER_REGISTRY[dexId];
33
+ if (!builder)
34
+ throw new Error(`[swap] 无 ${dexId} 的 swap builder(仅支持 ${Object.keys(exports.SWAP_BUILDER_REGISTRY).join('/')})`);
35
+ return builder.build(tx, params, inputCoin);
36
+ }
@@ -0,0 +1,20 @@
1
+ import { Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';
2
+ import { DEX_ID } from '@clonegod/ttd-core/dist';
3
+ export interface SwapBuildParams {
4
+ coinTypeA: string;
5
+ coinTypeB: string;
6
+ poolId: string;
7
+ a2b: boolean;
8
+ byAmountIn: boolean;
9
+ amount: bigint;
10
+ amountLimit: bigint;
11
+ sqrtPriceLimit: bigint;
12
+ }
13
+ export interface SwapBuildResult {
14
+ outputCoin: TransactionObjectArgument;
15
+ leftoverCoins: TransactionObjectArgument[];
16
+ }
17
+ export interface SwapBuilder {
18
+ readonly dexId: DEX_ID;
19
+ build(tx: Transaction, params: SwapBuildParams, inputCoin: TransactionObjectArgument): SwapBuildResult;
20
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,13 +1,4 @@
1
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
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -17,41 +8,40 @@ const fs_1 = __importDefault(require("fs"));
17
8
  const sui_tx_parser_1 = require("../parse/sui_tx_parser");
18
9
  const index_1 = require("../../index");
19
10
  const index_2 = require("../../index");
20
- function test_get_tx_result() {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- const grpc_endpoint = process.env.SUI_GRPC_ENDPOINT || '';
23
- const grpc_token = process.env.SUI_GRPC_TOKEN || '';
24
- const grpcConnection = index_1.GrpcConnection.getInstance(grpc_endpoint, grpc_token);
25
- const ledgerService = new index_1.LedgerService(grpcConnection);
26
- let wallet_address = '0x6367c8755b8c39cab7305bfa75cb17d050508d2e55f6862a7682377ad6d46ee7';
27
- let test_tx_success_buy = {
28
- txid: '',
29
- filename: './src/trade/test/receipt_buy_sui.json'
30
- };
31
- let test_tx_success_sell = {
32
- txid: '28FaeTYoctpP1VdWCuyPxNEBeaMm3ebj27kdF5umi9YL',
33
- filename: './src/trade/test/receipt_sell_sui.json'
34
- };
35
- let { txid, filename } = test_tx_success_sell;
36
- console.log('=== 测试 SUI 链交易结果查询 ===');
37
- console.log('交易哈希:', txid);
38
- try {
39
- const raw_tx_result = yield ledgerService.getTransaction(txid, ['*']);
40
- console.log('✅ 成功获取交易结果');
41
- const decoded_tx_result = (0, index_2.decodeBytes)(raw_tx_result);
42
- fs_1.default.writeFileSync(filename, JSON.stringify(decoded_tx_result, null, 2));
43
- let poolInfo = get_pool_info();
44
- const parser = new sui_tx_parser_1.SuiTransactionParser(wallet_address);
45
- const result = yield parser.parseTransaction(raw_tx_result, poolInfo);
46
- console.log('解析交易结果:', JSON.stringify(result, null, 2));
47
- }
48
- catch (error) {
49
- console.error('❌ 查询失败:', error);
50
- }
51
- });
11
+ async function test_get_tx_result() {
12
+ const grpc_endpoint = process.env.SUI_GRPC_ENDPOINT || '';
13
+ const grpc_token = process.env.SUI_GRPC_TOKEN || '';
14
+ const grpcConnection = index_1.GrpcConnection.getInstance(grpc_endpoint, grpc_token);
15
+ const ledgerService = new index_1.LedgerService(grpcConnection);
16
+ let wallet_address = '0x6367c8755b8c39cab7305bfa75cb17d050508d2e55f6862a7682377ad6d46ee7';
17
+ let test_tx_success_buy = {
18
+ txid: '',
19
+ filename: './src/trade/test/receipt_buy_sui.json'
20
+ };
21
+ let test_tx_success_sell = {
22
+ txid: '28FaeTYoctpP1VdWCuyPxNEBeaMm3ebj27kdF5umi9YL',
23
+ filename: './src/trade/test/receipt_sell_sui.json'
24
+ };
25
+ let { txid, filename } = test_tx_success_sell;
26
+ console.log('=== 测试 SUI 链交易结果查询 ===');
27
+ console.log('交易哈希:', txid);
28
+ try {
29
+ const raw_tx_result = await ledgerService.getTransaction(txid, ['*']);
30
+ console.log('✅ 成功获取交易结果');
31
+ const decoded_tx_result = (0, index_2.decodeBytes)(raw_tx_result);
32
+ fs_1.default.writeFileSync(filename, JSON.stringify(decoded_tx_result, null, 2));
33
+ let poolInfo = get_pool_info();
34
+ const parser = new sui_tx_parser_1.SuiTransactionParser(wallet_address);
35
+ const result = await parser.parseTransaction(raw_tx_result, poolInfo);
36
+ console.log('解析交易结果:', JSON.stringify(result, null, 2));
37
+ }
38
+ catch (error) {
39
+ console.error('❌ 查询失败:', error);
40
+ }
52
41
  }
53
42
  function get_pool_info() {
54
43
  return {
44
+ "_id": "0x455cf8d2ac91e7cb883f515874af750ed3cd18195c970b7a2d46235ac2b0c388",
55
45
  "program_id": "",
56
46
  "authority": "",
57
47
  "subscribe_type": "grpc",
@@ -59,11 +49,10 @@ function get_pool_info() {
59
49
  "dex_id": "MOMENTUM-CLMM",
60
50
  "pool_name": "SUI/USDC",
61
51
  "pool_address": "0x455cf8d2ac91e7cb883f515874af750ed3cd18195c970b7a2d46235ac2b0c388",
62
- "pool_address_hex": "",
63
52
  "tokenA": {
53
+ "_id": "0x2::sui::sui",
64
54
  "symbol": "SUI",
65
55
  "address": "0x2::sui::SUI",
66
- "address_hex": "",
67
56
  "decimals": 9,
68
57
  "name": "Sui",
69
58
  "is_token2022": false,
@@ -73,9 +62,9 @@ function get_pool_info() {
73
62
  "enable": true
74
63
  },
75
64
  "tokenB": {
65
+ "_id": "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::usdc",
76
66
  "symbol": "USDC",
77
67
  "address": "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC",
78
- "address_hex": "",
79
68
  "decimals": 6,
80
69
  "name": "USDC",
81
70
  "is_token2022": false,
@@ -0,0 +1,7 @@
1
+ export declare function get_sui_tx_result_channel(chainId?: string): string;
2
+ export interface SuiTxResultMsg {
3
+ digest: string;
4
+ success?: boolean;
5
+ error?: string;
6
+ source?: 'executor' | 'stream-trade';
7
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.get_sui_tx_result_channel = get_sui_tx_result_channel;
4
+ const ttd_core_1 = require("@clonegod/ttd-core");
5
+ function get_sui_tx_result_channel(chainId = ttd_core_1.CHAIN_ID.SUI) {
6
+ return `${chainId}:tx:result`;
7
+ }
@@ -22,9 +22,8 @@ function decodeBytes(obj) {
22
22
  return obj;
23
23
  }
24
24
  function parseObjectAmount(objectResponse) {
25
- var _a, _b;
26
25
  try {
27
- if (!((_b = (_a = objectResponse === null || objectResponse === void 0 ? void 0 : objectResponse.object) === null || _a === void 0 ? void 0 : _a.contents) === null || _b === void 0 ? void 0 : _b.value)) {
26
+ if (!objectResponse?.object?.contents?.value) {
28
27
  return null;
29
28
  }
30
29
  const contentsValue = objectResponse.object.contents.value;
@@ -1,2 +1,3 @@
1
1
  export * from './decode';
2
2
  export * from './format';
3
+ export * from './trade_direction';
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./decode"), exports);
18
18
  __exportStar(require("./format"), exports);
19
+ __exportStar(require("./trade_direction"), exports);
@@ -0,0 +1,14 @@
1
+ export interface TradeDirectionResult<T = any> {
2
+ isBuy: boolean;
3
+ inputToken: T;
4
+ outputToken: T;
5
+ baseToken: T;
6
+ quoteToken: T;
7
+ }
8
+ export declare function resolveTradeDirection<T = any>(poolInfo: {
9
+ tokenA: T;
10
+ tokenB: T;
11
+ quote_token: string;
12
+ [key: string]: any;
13
+ }, isBuy: boolean): TradeDirectionResult<T>;
14
+ export declare function calculateStandardPrice(inputAmount: number, outputAmount: number, isBuy: boolean): string;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveTradeDirection = resolveTradeDirection;
4
+ exports.calculateStandardPrice = calculateStandardPrice;
5
+ function resolveTradeDirection(poolInfo, isBuy) {
6
+ const { tokenA, tokenB, quote_token } = poolInfo;
7
+ const quoteToken = [tokenA, tokenB].find(t => t.symbol === quote_token);
8
+ const baseToken = [tokenA, tokenB].find(t => t.symbol !== quote_token);
9
+ if (!quoteToken || !baseToken) {
10
+ throw new Error(`Cannot resolve tokens: tokenA=${tokenA?.symbol}, tokenB=${tokenB?.symbol}, quote_token=${quote_token}`);
11
+ }
12
+ const inputToken = isBuy ? quoteToken : baseToken;
13
+ const outputToken = isBuy ? baseToken : quoteToken;
14
+ return { isBuy, inputToken, outputToken, baseToken, quoteToken };
15
+ }
16
+ function calculateStandardPrice(inputAmount, outputAmount, isBuy) {
17
+ if (isBuy) {
18
+ return (inputAmount / outputAmount).toFixed(18);
19
+ }
20
+ else {
21
+ return (outputAmount / inputAmount).toFixed(18);
22
+ }
23
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clonegod/ttd-sui-common",
3
- "version": "1.0.101",
3
+ "version": "2.0.1",
4
4
  "description": "Sui common library",
5
5
  "license": "UNLICENSED",
6
6
  "main": "dist/index.js",
@@ -15,10 +15,11 @@
15
15
  "push": "npm run build && npm publish"
16
16
  },
17
17
  "dependencies": {
18
- "@clonegod/ttd-core": "2.1.31",
18
+ "@clonegod/ttd-core": "3.1.82",
19
19
  "@grpc/grpc-js": "^1.13.4",
20
20
  "@grpc/proto-loader": "^0.8.0",
21
21
  "@mysten/sui": "^1.37.5",
22
+ "@protobuf-ts/grpc-transport": "~2.11.1",
22
23
  "axios": "^1.12.0",
23
24
  "dotenv": "^16.4.7",
24
25
  "google-protobuf": "^4.0.0",