@clonegod/ttd-core 2.0.16 → 2.0.18

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.
@@ -9,7 +9,7 @@ export declare abstract class AbstractTradeAppConfig extends AppConfig {
9
9
  constructor();
10
10
  init(): Promise<void>;
11
11
  init_trade_runtime(): Promise<void>;
12
- subscribe_order_event(trade_instance: AbastrcatTrade, tx_result_checker: AbstractTransactionResultCheck): Promise<void>;
13
- abstract subscribe_wallet_raw_txn_event(): void;
12
+ subscribe_order_event(trade_instance: AbastrcatTrade, new_tx_result_checker_factory: () => AbstractTransactionResultCheck): Promise<void>;
14
13
  cache_trade_result(trade_response: TradeResponseType): Promise<void>;
14
+ abstract subscribe_wallet_raw_txn_event(): void;
15
15
  }
@@ -41,9 +41,9 @@ class AbstractTradeAppConfig extends AppConfig_1.AppConfig {
41
41
  }
42
42
  });
43
43
  }
44
- subscribe_order_event(trade_instance, tx_result_checker) {
44
+ subscribe_order_event(trade_instance, new_tx_result_checker_factory) {
45
45
  return __awaiter(this, void 0, void 0, function* () {
46
- let handler = (message) => (0, handle_order_message_1.handle_order_message)(this, trade_instance, tx_result_checker, message);
46
+ let handler = (message) => (0, handle_order_message_1.handle_order_message)(this, trade_instance, new_tx_result_checker_factory, message);
47
47
  let group_id = this.trade_runtime.group.id;
48
48
  let pair_name = this.trade_runtime.pair_name;
49
49
  let dex_id = this.trade_runtime.dex_id;
@@ -17,7 +17,7 @@ require('dotenv').config();
17
17
  const axios_1 = __importDefault(require("axios"));
18
18
  const index_1 = require("../../index");
19
19
  const gecko_terminal_1 = require("./gecko_terminal");
20
- const cached_price_1 = require("./cached_price");
20
+ const price_cache_1 = require("./price_cache");
21
21
  function get_bsc_token_price_info(addresses) {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
23
  addresses = addresses.map(addr => addr.toLowerCase());
@@ -25,7 +25,7 @@ function get_bsc_token_price_info(addresses) {
25
25
  const PRICE_CHANNELS = [
26
26
  {
27
27
  name: 'CachedPrice',
28
- fetchFn: cached_price_1.fetchPriceFromCache,
28
+ fetchFn: price_cache_1.fetchPriceFromCache,
29
29
  batchSize: 100,
30
30
  batchDelay: 1000,
31
31
  },
@@ -61,7 +61,7 @@ function get_bsc_token_price_info(addresses) {
61
61
  result.set(address, priceInfo);
62
62
  remainingAddresses = remainingAddresses.filter(addr => addr !== address);
63
63
  if (channel.name !== 'CachedPrice') {
64
- (0, cached_price_1.cache_new_market_price)(address, priceInfo.price, channel.name);
64
+ (0, price_cache_1.cache_new_market_price)(address, priceInfo.price, channel.name);
65
65
  }
66
66
  }
67
67
  }
@@ -17,14 +17,14 @@ require('dotenv').config();
17
17
  const axios_1 = __importDefault(require("axios"));
18
18
  const index_1 = require("../../index");
19
19
  const gecko_terminal_1 = require("./gecko_terminal");
20
- const cached_price_1 = require("./cached_price");
20
+ const price_cache_1 = require("./price_cache");
21
21
  function get_solana_token_price_info(addresses) {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
23
  const result = new Map();
24
24
  const PRICE_CHANNELS = [
25
25
  {
26
26
  name: 'CachedPrice',
27
- fetchFn: cached_price_1.fetchPriceFromCache,
27
+ fetchFn: price_cache_1.fetchPriceFromCache,
28
28
  batchSize: 100,
29
29
  batchDelay: 1000,
30
30
  },
@@ -60,7 +60,7 @@ function get_solana_token_price_info(addresses) {
60
60
  result.set(address, priceInfo);
61
61
  remainingAddresses = remainingAddresses.filter(addr => addr !== address);
62
62
  if (channel.name !== 'CachedPrice') {
63
- (0, cached_price_1.cache_new_market_price)(address, priceInfo.price, channel.name);
63
+ (0, price_cache_1.cache_new_market_price)(address, priceInfo.price, channel.name);
64
64
  }
65
65
  }
66
66
  (0, index_1.log_debug)(`[get_token_price_info] ${channel.name} found prices for ${channelResult.size}/${batch.length} tokens in batch ${i + 1}`);
@@ -17,14 +17,14 @@ require('dotenv').config();
17
17
  const axios_1 = __importDefault(require("axios"));
18
18
  const index_1 = require("../../index");
19
19
  const gecko_terminal_1 = require("./gecko_terminal");
20
- const cached_price_1 = require("./cached_price");
20
+ const price_cache_1 = require("./price_cache");
21
21
  function get_tron_token_price_info(addresses) {
22
22
  return __awaiter(this, void 0, void 0, function* () {
23
23
  const result = new Map();
24
24
  const PRICE_CHANNELS = [
25
25
  {
26
26
  name: 'CachedPrice',
27
- fetchFn: cached_price_1.fetchPriceFromCache,
27
+ fetchFn: price_cache_1.fetchPriceFromCache,
28
28
  batchSize: 100,
29
29
  batchDelay: 1000,
30
30
  },
@@ -66,7 +66,7 @@ function get_tron_token_price_info(addresses) {
66
66
  result.set(address, priceInfo);
67
67
  remainingAddresses = remainingAddresses.filter(addr => addr !== address);
68
68
  if (channel.name !== 'CachedPrice') {
69
- (0, cached_price_1.cache_new_market_price)(address, priceInfo.price, channel.name);
69
+ (0, price_cache_1.cache_new_market_price)(address, priceInfo.price, channel.name);
70
70
  }
71
71
  }
72
72
  (0, index_1.log_debug)(`[get_token_price_info] ${channel.name} found prices for ${channelResult.size}/${batch.length} tokens in batch ${i + 1}`);
@@ -0,0 +1,3 @@
1
+ import { FormattedTokenPrice } from "../..";
2
+ export declare const fetchPriceFromCache: (token_address_list: string[]) => Promise<Map<string, FormattedTokenPrice>>;
3
+ export declare function cache_new_market_price(token_address: string, market_price: string, market_source: string): Promise<void>;
@@ -0,0 +1,115 @@
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.fetchPriceFromCache = void 0;
13
+ exports.cache_new_market_price = cache_new_market_price;
14
+ const __1 = require("../..");
15
+ const check_token_price_timeout = (token_info, token_price_timeout_seconds) => {
16
+ if ((0, __1.isEmpty)(token_info.market_price) || (0, __1.isEmpty)(token_info.update_time)) {
17
+ return true;
18
+ }
19
+ let last_update_time = token_info.update_time;
20
+ let diff_seconds = Math.floor((Date.now() - (0, __1.parseDateTimeStrToMills)(last_update_time)) / 1000);
21
+ return diff_seconds > token_price_timeout_seconds;
22
+ };
23
+ const get_diff_seconds = (last_update_time, now) => {
24
+ return Math.floor((now - (0, __1.parseDateTimeStrToMills)(last_update_time)) / 1000);
25
+ };
26
+ const fetchPriceFromCache = (token_address_list) => __awaiter(void 0, void 0, void 0, function* () {
27
+ let result = new Map();
28
+ let global_app_config;
29
+ try {
30
+ global_app_config = (0, __1.getGlobalAppConfig)();
31
+ }
32
+ catch (err) {
33
+ (0, __1.log_warn)('global_app_config is not set, skip get token price from cache');
34
+ return result;
35
+ }
36
+ let token_price_timeout_seconds = 600;
37
+ let all_token_list = yield global_app_config.arb_cache.get_token_list();
38
+ let token_list = all_token_list.filter(e => token_address_list.includes(e.address) && !(0, __1.isEmpty)(e.market_price) && !(0, __1.isEmpty)(e.update_time));
39
+ let not_found_token_list = [];
40
+ for (let token_info of token_list) {
41
+ try {
42
+ if (check_token_price_timeout(token_info, token_price_timeout_seconds)) {
43
+ not_found_token_list.push(token_info);
44
+ }
45
+ else {
46
+ let diff_seconds = get_diff_seconds(token_info.update_time, Date.now());
47
+ result.set(token_info.address, {
48
+ address: token_info.address,
49
+ price: token_info.market_price,
50
+ update_time: token_info.update_time,
51
+ });
52
+ (0, __1.log_debug)(`get token price from cache(token_info) success: ${token_info.symbol} ${token_info.address}, price=${token_info.market_price} (${diff_seconds}s ago)`);
53
+ }
54
+ }
55
+ catch (err) {
56
+ (0, __1.log_error)(`get token price from cache failed`, err);
57
+ }
58
+ }
59
+ for (let token_info of not_found_token_list) {
60
+ let price_info = yield global_app_config.get_token_market_price(token_info.symbol);
61
+ if (!price_info || check_token_price_timeout(price_info, token_price_timeout_seconds)) {
62
+ continue;
63
+ }
64
+ result.set(token_info.address, {
65
+ address: token_info.address,
66
+ price: price_info.market_price,
67
+ update_time: price_info.update_time,
68
+ });
69
+ let diff_seconds = get_diff_seconds(price_info.update_time, Date.now());
70
+ (0, __1.log_debug)(`get token price from cache(market_price) success: ${token_info.symbol} ${token_info.address}, price=${price_info.market_price} (${diff_seconds}s ago)`);
71
+ }
72
+ return result;
73
+ });
74
+ exports.fetchPriceFromCache = fetchPriceFromCache;
75
+ function cache_new_market_price(token_address, market_price, market_source) {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ let global_app_config;
78
+ try {
79
+ global_app_config = (0, __1.getGlobalAppConfig)();
80
+ }
81
+ catch (err) {
82
+ (0, __1.log_warn)('global_app_config is not set, skip get token price from cache');
83
+ return;
84
+ }
85
+ let ttl = global_app_config.env_args.token_price_cache_seconds;
86
+ let tokenInfo = global_app_config.arb_cache.token_address_map.get(token_address);
87
+ if (!tokenInfo) {
88
+ tokenInfo = (yield global_app_config.arb_cache.get_token_list_no_cache()).find(e => e.address === token_address);
89
+ }
90
+ if (!tokenInfo) {
91
+ (0, __1.log_warn)(`tokenInfo is not found in cache: token_address=${token_address}`);
92
+ return;
93
+ }
94
+ let { symbol, address } = tokenInfo;
95
+ if (market_price && Number(market_price) > 0) {
96
+ let clone_token_info = (0, __1.deep_clone)(tokenInfo);
97
+ clone_token_info.market_price = market_price;
98
+ global_app_config.cache_token_market_price(clone_token_info, ttl)
99
+ .then(() => {
100
+ (0, __1.log_info)(`cache new market price success: ${symbol} ${address}, price=${market_price} (${ttl}s), source=${market_source}`);
101
+ })
102
+ .catch(err => {
103
+ (0, __1.log_error)(`cache new market price failed: ${symbol} ${address}, price=${market_price} (${ttl}s)`, err);
104
+ });
105
+ }
106
+ else {
107
+ (0, __1.log_warn)(`skip cache invalid market_price from ${market_source}`, {
108
+ symbol,
109
+ address,
110
+ market_price,
111
+ market_source,
112
+ });
113
+ }
114
+ });
115
+ }
@@ -2,4 +2,4 @@ import { AbstractTradeAppConfig, AppConfig } from "../app_config";
2
2
  import { AbastrcatTrade } from "./abstract_trade";
3
3
  import { AbstractTransactionResultCheck } from "./abstract_tx_check";
4
4
  export declare const try_lock_order_msg: (appConfig: AppConfig, order_msg: any) => Promise<boolean>;
5
- export declare const handle_order_message: (trade_appconfig: AbstractTradeAppConfig, trade_instance: AbastrcatTrade, tx_result_checker: AbstractTransactionResultCheck, recv_order_msg: string) => Promise<void>;
5
+ export declare const handle_order_message: (trade_appconfig: AbstractTradeAppConfig, trade_instance: AbastrcatTrade, tx_result_checker_factory: () => AbstractTransactionResultCheck, recv_order_msg: string) => Promise<void>;
@@ -56,7 +56,7 @@ const try_lock_order_msg = (appConfig, order_msg) => __awaiter(void 0, void 0, v
56
56
  return is_lock_success;
57
57
  });
58
58
  exports.try_lock_order_msg = try_lock_order_msg;
59
- const handle_order_message = (trade_appconfig, trade_instance, tx_result_checker, recv_order_msg) => __awaiter(void 0, void 0, void 0, function* () {
59
+ const handle_order_message = (trade_appconfig, trade_instance, tx_result_checker_factory, recv_order_msg) => __awaiter(void 0, void 0, void 0, function* () {
60
60
  (0, __1.new_line)(3);
61
61
  console.log(`=================================================================================`);
62
62
  console.log(`| NEW ORDER MESSAGE |`);
@@ -94,7 +94,7 @@ const handle_order_message = (trade_appconfig, trade_instance, tx_result_checker
94
94
  txid
95
95
  };
96
96
  global.event_emitter = trade_appconfig;
97
- tx_result_checker.set_context(context).set_txid(txid).init_tx_status().check();
97
+ tx_result_checker_factory().set_context(context).set_txid(txid).init_tx_status().check();
98
98
  trade_appconfig.subscribe_wallet_raw_txn_event();
99
99
  }
100
100
  catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clonegod/ttd-core",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "description": "Common types and utilities for trading systems - use `npm run push` to publish",
5
5
  "main": "dist/index.js",
6
6
  "types": "types/index.d.ts",