@clonegod/ttd-core 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.
- package/README.md +3 -0
- package/dist/analyze/index.d.ts +3 -0
- package/dist/analyze/index.js +49 -0
- package/dist/app_config/app_config.d.ts +15 -0
- package/dist/app_config/app_config.js +50 -0
- package/dist/app_config/env_args.d.ts +16 -0
- package/dist/app_config/env_args.js +28 -0
- package/dist/app_config/index.d.ts +2 -0
- package/dist/app_config/index.js +18 -0
- package/dist/cache/arb_cache.d.ts +80 -0
- package/dist/cache/arb_cache.js +1010 -0
- package/dist/cache/arb_event_pub.d.ts +14 -0
- package/dist/cache/arb_event_pub.js +77 -0
- package/dist/cache/arb_event_sub.d.ts +17 -0
- package/dist/cache/arb_event_sub.js +166 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.js +22 -0
- package/dist/cache/loading_cache.d.ts +62 -0
- package/dist/cache/loading_cache.js +233 -0
- package/dist/cache/redis_client.d.ts +3 -0
- package/dist/cache/redis_client.js +73 -0
- package/dist/cache/redis_cmd.d.ts +14 -0
- package/dist/cache/redis_cmd.js +83 -0
- package/dist/index.d.ts +216 -0
- package/dist/index.js +883 -0
- package/dist/market_price/estimate_token_amount.d.ts +4 -0
- package/dist/market_price/estimate_token_amount.js +109 -0
- package/dist/market_price/index.d.ts +1 -0
- package/dist/market_price/index.js +17 -0
- package/dist/pool/cache_pool_config.d.ts +2 -0
- package/dist/pool/cache_pool_config.js +116 -0
- package/dist/pool/index.d.ts +3 -0
- package/dist/pool/index.js +19 -0
- package/dist/pool/pool_util.d.ts +5 -0
- package/dist/pool/pool_util.js +65 -0
- package/dist/pool/types.d.ts +20 -0
- package/dist/pool/types.js +2 -0
- package/dist/quote/index.d.ts +1 -0
- package/dist/quote/index.js +17 -0
- package/dist/quote/log_quote_price.d.ts +2 -0
- package/dist/quote/log_quote_price.js +29 -0
- package/dist/quote/on_quote_response.d.ts +3 -0
- package/dist/quote/on_quote_response.js +28 -0
- package/dist/quote/publish_quote_price.d.ts +3 -0
- package/dist/quote/publish_quote_price.js +19 -0
- package/dist/quote/to_price_message.d.ts +5 -0
- package/dist/quote/to_price_message.js +103 -0
- package/dist/test/test_is_empty.d.ts +1 -0
- package/dist/test/test_is_empty.js +24 -0
- package/dist/test/test_log_level.d.ts +3 -0
- package/dist/test/test_log_level.js +29 -0
- package/dist/test/test_merge_property.d.ts +1 -0
- package/dist/test/test_merge_property.js +21 -0
- package/dist/token/cache_token_config.d.ts +2 -0
- package/dist/token/cache_token_config.js +68 -0
- package/dist/token/fixed_symbol_address.d.ts +2 -0
- package/dist/token/fixed_symbol_address.js +26 -0
- package/dist/token/index.d.ts +6 -0
- package/dist/token/index.js +22 -0
- package/dist/token/is_not_arb_token.d.ts +1 -0
- package/dist/token/is_not_arb_token.js +24 -0
- package/dist/token/price/gecko_terminal.d.ts +2 -0
- package/dist/token/price/gecko_terminal.js +69 -0
- package/dist/token/price/get_bsc_token_price.d.ts +2 -0
- package/dist/token/price/get_bsc_token_price.js +131 -0
- package/dist/token/price/get_solana_token_price.d.ts +2 -0
- package/dist/token/price/get_solana_token_price.js +17 -0
- package/dist/token/price/get_tron_token_price.d.ts +2 -0
- package/dist/token/price/get_tron_token_price.js +17 -0
- package/dist/token/price/index.d.ts +3 -0
- package/dist/token/price/index.js +19 -0
- package/dist/token/token_util.d.ts +3 -0
- package/dist/token/token_util.js +23 -0
- package/dist/token/types.d.ts +29 -0
- package/dist/token/types.js +2 -0
- package/package.json +47 -0
- package/types/index.d.ts +709 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,883 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
38
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
39
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
40
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
41
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
42
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
43
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
44
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
+
};
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.uuid = exports.DATE_TIME_FORMAT_NO_WHITESPACE = exports.DATE_TIME_FORMAT_DEFAULT = exports.to_json_str = exports.DecimalUtil = exports.generateRandomNumber = exports.LOG = exports._active_log_level = exports.LOG_LEVEL = exports.REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE = exports.REDIS_EVENT_TYPE_ORDER = exports.REDIS_EVENT_TYPE_QUOTE = exports.REDIS_EVENT_TYPE_CONFIG_CHANGE = exports.REDIS_EVENT_CHANNEL = exports.get_tx_result_channel_name = exports.get_wallet_raw_tx_channel_name = exports.get_order_channel_name = exports.get_quote_channel_name = exports.get_config_channel_name = exports.get_cache_key = exports.getArbEventSubscriber = exports.getArbEventPublisher = exports.getArbCache = exports.getRedisCommamd = exports.getLoadingCache = exports.getRedisCache = exports.format_order_lock_key = exports.format_unique_order_msg_id = exports.parse_unique_orderbook_id = exports.format_unique_orderbook_id = exports.format_symbol_name = exports.CACHE_KEY_TYPE = exports.OnChainDataSubscribeType = exports.TradeErrorCodeType = exports.SystemErrorCodeType = exports.TRADE_TYPE = exports.GROUP_ID = exports.DEX_ID = exports.CHAIN_ID = exports.STREAMING_TRANSACTION_CONFIRMED = exports.TRANSACTION_STATE_FAILED = exports.TRANSACTION_STATE_SUCCESS = exports.TRANSACTION_STATE_PROCESSING = exports.QUOTE_AMOUNT_USD_MAX = exports.QUOTE_AMOUNT_USD_MIN = exports.REGEX_HEX_PREFIX = exports.PROCESSING = exports.NOT_FOUND = exports.SUCCESS = exports.FAILED = void 0;
|
|
52
|
+
exports.execute_bash = exports.inspect_arb_local_cache = exports.save_trade_execution_logs = exports.parse_trade_cmdline_args = exports.get_input_out_token_fix = exports.get_input_out_token = exports.calc_amount_in_token = exports.estimate_amount_in_token = exports.failed = exports.success = exports.home_dir = exports.postJSON = exports.deep_merge_object = exports.isArray = exports.isTrue = exports.deep_clone = void 0;
|
|
53
|
+
exports._caller = _caller;
|
|
54
|
+
exports.log_trace = log_trace;
|
|
55
|
+
exports.log_debug = log_debug;
|
|
56
|
+
exports.log_warn = log_warn;
|
|
57
|
+
exports.log_info = log_info;
|
|
58
|
+
exports.log_error = log_error;
|
|
59
|
+
exports.new_line = new_line;
|
|
60
|
+
exports.getCurDateTime = getCurDateTime;
|
|
61
|
+
exports.getCurTimeShort = getCurTimeShort;
|
|
62
|
+
exports.parseToDateTime = parseToDateTime;
|
|
63
|
+
exports.getCurTimeInMills = getCurTimeInMills;
|
|
64
|
+
exports.curr_milliseconds = curr_milliseconds;
|
|
65
|
+
exports.sleep = sleep;
|
|
66
|
+
exports.parseDateTimeStrToMills = parseDateTimeStrToMills;
|
|
67
|
+
exports.isEmpty = isEmpty;
|
|
68
|
+
exports.file_exists = file_exists;
|
|
69
|
+
exports.readFile = readFile;
|
|
70
|
+
exports.writeFile = writeFile;
|
|
71
|
+
exports.mkdirSync = mkdirSync;
|
|
72
|
+
exports.getServerInfo = getServerInfo;
|
|
73
|
+
exports.getIPAddress = getIPAddress;
|
|
74
|
+
exports.load_wallet = load_wallet;
|
|
75
|
+
exports.chunkArray = chunkArray;
|
|
76
|
+
require('dotenv').config();
|
|
77
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
78
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
79
|
+
const fs_1 = __importDefault(require("fs"));
|
|
80
|
+
const moment_1 = __importDefault(require("moment"));
|
|
81
|
+
const os_1 = __importDefault(require("os"));
|
|
82
|
+
const path_1 = __importDefault(require("path"));
|
|
83
|
+
const cache = __importStar(require("./cache"));
|
|
84
|
+
const market_price_1 = require("./market_price");
|
|
85
|
+
__exportStar(require("./analyze"), exports);
|
|
86
|
+
__exportStar(require("./app_config"), exports);
|
|
87
|
+
__exportStar(require("./pool"), exports);
|
|
88
|
+
__exportStar(require("./quote"), exports);
|
|
89
|
+
__exportStar(require("./token"), exports);
|
|
90
|
+
const short = require('short-uuid');
|
|
91
|
+
const exec = require('util').promisify(require('child_process').exec);
|
|
92
|
+
exports.FAILED = 'FAILED';
|
|
93
|
+
exports.SUCCESS = 'SUCCESS';
|
|
94
|
+
exports.NOT_FOUND = 'NOT_FOUND';
|
|
95
|
+
exports.PROCESSING = 'PROCESSING';
|
|
96
|
+
exports.REGEX_HEX_PREFIX = /^(0x)/;
|
|
97
|
+
exports.QUOTE_AMOUNT_USD_MIN = 50;
|
|
98
|
+
exports.QUOTE_AMOUNT_USD_MAX = 500;
|
|
99
|
+
exports.TRANSACTION_STATE_PROCESSING = 'TRANSACTION_STATE_PROCESSING';
|
|
100
|
+
exports.TRANSACTION_STATE_SUCCESS = 'TRANSACTION_STATE_SUCCESS';
|
|
101
|
+
exports.TRANSACTION_STATE_FAILED = 'TRANSACTION_STATE_FAILED';
|
|
102
|
+
exports.STREAMING_TRANSACTION_CONFIRMED = 'STREAMING_TRANSACTION_CONFIRMED';
|
|
103
|
+
var CHAIN_ID;
|
|
104
|
+
(function (CHAIN_ID) {
|
|
105
|
+
CHAIN_ID["TRON"] = "TRON";
|
|
106
|
+
CHAIN_ID["SOLANA"] = "SOLANA";
|
|
107
|
+
CHAIN_ID["BSC"] = "BSC";
|
|
108
|
+
})(CHAIN_ID || (exports.CHAIN_ID = CHAIN_ID = {}));
|
|
109
|
+
var DEX_ID;
|
|
110
|
+
(function (DEX_ID) {
|
|
111
|
+
DEX_ID["SUNSWAP_V2"] = "SUNSWAP-V2";
|
|
112
|
+
DEX_ID["SUNSWAP_V3"] = "SUNSWAP-V3";
|
|
113
|
+
DEX_ID["RAYDIUM_AMM"] = "RAYDIUM-AMM";
|
|
114
|
+
DEX_ID["RAYDIUM_CLMM"] = "RAYDIUM-CLMM";
|
|
115
|
+
DEX_ID["RAYDIUM_CPMM"] = "RAYDIUM-CPMM";
|
|
116
|
+
DEX_ID["ORCA_CLMM"] = "ORCA-CLMM";
|
|
117
|
+
DEX_ID["METEORA_DLMM"] = "METEORA-DLMM";
|
|
118
|
+
DEX_ID["PUMPFUN_AMM"] = "PUMPFUN-AMM";
|
|
119
|
+
DEX_ID["PANCAKE_AMM"] = "PANCAKE-AMM";
|
|
120
|
+
DEX_ID["PANCAKE_CLMM"] = "PANCAKE-CLMM";
|
|
121
|
+
})(DEX_ID || (exports.DEX_ID = DEX_ID = {}));
|
|
122
|
+
var GROUP_ID;
|
|
123
|
+
(function (GROUP_ID) {
|
|
124
|
+
GROUP_ID["TRON_DEV1"] = "TRON-DEV1";
|
|
125
|
+
GROUP_ID["TRON_TEST1"] = "TRON-TEST1";
|
|
126
|
+
GROUP_ID["TRON_TEST2"] = "TRON-TEST2";
|
|
127
|
+
GROUP_ID["TRON_TTD1"] = "TRON-TTD1";
|
|
128
|
+
})(GROUP_ID || (exports.GROUP_ID = GROUP_ID = {}));
|
|
129
|
+
var TRADE_TYPE;
|
|
130
|
+
(function (TRADE_TYPE) {
|
|
131
|
+
TRADE_TYPE["SWAP"] = "swap";
|
|
132
|
+
TRADE_TYPE["ORDERBOOK"] = "orderbook";
|
|
133
|
+
})(TRADE_TYPE || (exports.TRADE_TYPE = TRADE_TYPE = {}));
|
|
134
|
+
var SystemErrorCodeType;
|
|
135
|
+
(function (SystemErrorCodeType) {
|
|
136
|
+
SystemErrorCodeType["INVALID_GROUP_ID"] = "INVALID_GROUP_ID";
|
|
137
|
+
SystemErrorCodeType["SYSTEM_ERROR"] = "SYSTEM_ERROR";
|
|
138
|
+
SystemErrorCodeType["UNKOWN_ERROR"] = "UNKOWN_ERROR";
|
|
139
|
+
})(SystemErrorCodeType || (exports.SystemErrorCodeType = SystemErrorCodeType = {}));
|
|
140
|
+
var TradeErrorCodeType;
|
|
141
|
+
(function (TradeErrorCodeType) {
|
|
142
|
+
TradeErrorCodeType["AmountOutBelowMinimum"] = "AmountOutBelowMinimum";
|
|
143
|
+
TradeErrorCodeType["InsufficientFunds"] = "InsufficientFunds";
|
|
144
|
+
TradeErrorCodeType["ExceededCUsLimit"] = "ExceededCUsLimit";
|
|
145
|
+
TradeErrorCodeType["BlockhashNotFound"] = "BlockhashNotFound";
|
|
146
|
+
TradeErrorCodeType["AccountNotInitialized"] = "AccountNotInitialized";
|
|
147
|
+
TradeErrorCodeType["InvalidTickArraySequence"] = "InvalidTickArraySequence";
|
|
148
|
+
TradeErrorCodeType["TokenNotApproved"] = "TokenNotApproved";
|
|
149
|
+
TradeErrorCodeType["UNKOWN"] = "UNKOWN";
|
|
150
|
+
})(TradeErrorCodeType || (exports.TradeErrorCodeType = TradeErrorCodeType = {}));
|
|
151
|
+
var OnChainDataSubscribeType;
|
|
152
|
+
(function (OnChainDataSubscribeType) {
|
|
153
|
+
OnChainDataSubscribeType["WS"] = "ws";
|
|
154
|
+
OnChainDataSubscribeType["GRPC"] = "grpc";
|
|
155
|
+
})(OnChainDataSubscribeType || (exports.OnChainDataSubscribeType = OnChainDataSubscribeType = {}));
|
|
156
|
+
var CACHE_KEY_TYPE;
|
|
157
|
+
(function (CACHE_KEY_TYPE) {
|
|
158
|
+
CACHE_KEY_TYPE["MARKET_TOKEN_PRICE"] = "m:price";
|
|
159
|
+
CACHE_KEY_TYPE["CONFIG_TOKEN_LIST"] = "c:token";
|
|
160
|
+
CACHE_KEY_TYPE["CONFIG_POOL_LIST"] = "c:pool";
|
|
161
|
+
CACHE_KEY_TYPE["CONFIG_PAIR_LIST"] = "c:pair";
|
|
162
|
+
CACHE_KEY_TYPE["CONFIG_COMMON_SERVICE"] = "c:common";
|
|
163
|
+
CACHE_KEY_TYPE["CONFIG_TRADE_SERVICE"] = "c:trade";
|
|
164
|
+
CACHE_KEY_TYPE["QUOTE_PRICE"] = "q:price";
|
|
165
|
+
CACHE_KEY_TYPE["ORDER_MESSAGE"] = "o:msg";
|
|
166
|
+
CACHE_KEY_TYPE["ORDER_RESULT"] = "o:result";
|
|
167
|
+
})(CACHE_KEY_TYPE || (exports.CACHE_KEY_TYPE = CACHE_KEY_TYPE = {}));
|
|
168
|
+
const format_symbol_name = (symbol) => {
|
|
169
|
+
return symbol.replace('USDC', 'USDT')
|
|
170
|
+
.replace('WTRX', 'TRX')
|
|
171
|
+
.replace('$', '')
|
|
172
|
+
.replace('WSOL', 'SOL')
|
|
173
|
+
.replace('WBTC', 'BTC')
|
|
174
|
+
.replace('WETH', 'ETH')
|
|
175
|
+
.replace('WBNB', 'BNB')
|
|
176
|
+
.toUpperCase();
|
|
177
|
+
};
|
|
178
|
+
exports.format_symbol_name = format_symbol_name;
|
|
179
|
+
const format_unique_orderbook_id = (chain_id, dex_id, pool_id, fee_rate) => {
|
|
180
|
+
return `${chain_id}_${dex_id}_${pool_id}_${fee_rate}`;
|
|
181
|
+
};
|
|
182
|
+
exports.format_unique_orderbook_id = format_unique_orderbook_id;
|
|
183
|
+
const parse_unique_orderbook_id = (unique_orderbook_id) => {
|
|
184
|
+
let [chain_id, dex_id, pool_id, fee_rate] = unique_orderbook_id.split('_');
|
|
185
|
+
return {
|
|
186
|
+
chain_id,
|
|
187
|
+
dex_id,
|
|
188
|
+
pool_id,
|
|
189
|
+
fee_rate
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
exports.parse_unique_orderbook_id = parse_unique_orderbook_id;
|
|
193
|
+
const format_unique_order_msg_id = (group_id, price_id, order_trace_id) => {
|
|
194
|
+
return `${group_id}_${price_id}_${order_trace_id}`;
|
|
195
|
+
};
|
|
196
|
+
exports.format_unique_order_msg_id = format_unique_order_msg_id;
|
|
197
|
+
const format_order_lock_key = (chain_id, group_id, price_id, order_trace_id) => {
|
|
198
|
+
return `${chain_id}:lock:${group_id}:${price_id}:${order_trace_id}`;
|
|
199
|
+
};
|
|
200
|
+
exports.format_order_lock_key = format_order_lock_key;
|
|
201
|
+
const getRedisCache = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
202
|
+
yield sleep(1000);
|
|
203
|
+
return cache.getCache();
|
|
204
|
+
});
|
|
205
|
+
exports.getRedisCache = getRedisCache;
|
|
206
|
+
const getLoadingCache = () => {
|
|
207
|
+
return new cache.LoadingCache();
|
|
208
|
+
};
|
|
209
|
+
exports.getLoadingCache = getLoadingCache;
|
|
210
|
+
const getRedisCommamd = () => {
|
|
211
|
+
return new cache.RedisCommand();
|
|
212
|
+
};
|
|
213
|
+
exports.getRedisCommamd = getRedisCommamd;
|
|
214
|
+
const getArbCache = (env_args) => {
|
|
215
|
+
return new cache.ArbCache(env_args);
|
|
216
|
+
};
|
|
217
|
+
exports.getArbCache = getArbCache;
|
|
218
|
+
const getArbEventPublisher = (arb_cache) => {
|
|
219
|
+
return new cache.ArbEventPublisher(arb_cache);
|
|
220
|
+
};
|
|
221
|
+
exports.getArbEventPublisher = getArbEventPublisher;
|
|
222
|
+
const getArbEventSubscriber = (arb_cache) => {
|
|
223
|
+
return new cache.ArbEventSubscriber(arb_cache);
|
|
224
|
+
};
|
|
225
|
+
exports.getArbEventSubscriber = getArbEventSubscriber;
|
|
226
|
+
const get_cache_key = (chain_id, cache_type, id) => {
|
|
227
|
+
let chain_id_lower = chain_id.toLowerCase();
|
|
228
|
+
let key = '';
|
|
229
|
+
if (!id) {
|
|
230
|
+
key = `${chain_id_lower}:${cache_type}`;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
key = `${chain_id_lower}:${cache_type}:${id}`;
|
|
234
|
+
}
|
|
235
|
+
return key;
|
|
236
|
+
};
|
|
237
|
+
exports.get_cache_key = get_cache_key;
|
|
238
|
+
const get_config_channel_name = (chain_id) => {
|
|
239
|
+
return `${chain_id}_${REDIS_EVENT_CHANNEL.CONFIG_CHANGE}`.toUpperCase();
|
|
240
|
+
};
|
|
241
|
+
exports.get_config_channel_name = get_config_channel_name;
|
|
242
|
+
const get_quote_channel_name = (chain_id) => {
|
|
243
|
+
return `${REDIS_EVENT_CHANNEL.QUOTE}_${chain_id}`.toUpperCase();
|
|
244
|
+
};
|
|
245
|
+
exports.get_quote_channel_name = get_quote_channel_name;
|
|
246
|
+
const get_order_channel_name = (group_id, pair, dex_id) => {
|
|
247
|
+
return `${REDIS_EVENT_CHANNEL.ORDER}_${pair}_${dex_id}_${group_id}`.toUpperCase();
|
|
248
|
+
};
|
|
249
|
+
exports.get_order_channel_name = get_order_channel_name;
|
|
250
|
+
const get_wallet_raw_tx_channel_name = (group_id, wallet) => {
|
|
251
|
+
return `${REDIS_EVENT_CHANNEL.TX_RAW_DATA}_${group_id}_${wallet}`.toUpperCase();
|
|
252
|
+
};
|
|
253
|
+
exports.get_wallet_raw_tx_channel_name = get_wallet_raw_tx_channel_name;
|
|
254
|
+
const get_tx_result_channel_name = (group_id, pair) => {
|
|
255
|
+
return `${REDIS_EVENT_CHANNEL.TX_RESULT}_${group_id}_${pair}`.toUpperCase();
|
|
256
|
+
};
|
|
257
|
+
exports.get_tx_result_channel_name = get_tx_result_channel_name;
|
|
258
|
+
var REDIS_EVENT_CHANNEL;
|
|
259
|
+
(function (REDIS_EVENT_CHANNEL) {
|
|
260
|
+
REDIS_EVENT_CHANNEL["CONFIG_CHANGE"] = "CONFIG_CHANGE";
|
|
261
|
+
REDIS_EVENT_CHANNEL["QUOTE"] = "QUOTE";
|
|
262
|
+
REDIS_EVENT_CHANNEL["ORDER"] = "ORDER";
|
|
263
|
+
REDIS_EVENT_CHANNEL["ORDER_RESULT"] = "ORDER_RESULT";
|
|
264
|
+
REDIS_EVENT_CHANNEL["TX_RAW_DATA"] = "TX_RAW_DATA";
|
|
265
|
+
REDIS_EVENT_CHANNEL["TX_RESULT"] = "TX_RESULT";
|
|
266
|
+
REDIS_EVENT_CHANNEL["TRADE_INSTANCE_STATUS"] = "TRADE_INSTANCE_STATUS";
|
|
267
|
+
})(REDIS_EVENT_CHANNEL || (exports.REDIS_EVENT_CHANNEL = REDIS_EVENT_CHANNEL = {}));
|
|
268
|
+
var REDIS_EVENT_TYPE_CONFIG_CHANGE;
|
|
269
|
+
(function (REDIS_EVENT_TYPE_CONFIG_CHANGE) {
|
|
270
|
+
REDIS_EVENT_TYPE_CONFIG_CHANGE["TOKEN_CONFIG_CHANGE"] = "TOKEN_CONFIG_CHANGE";
|
|
271
|
+
REDIS_EVENT_TYPE_CONFIG_CHANGE["POOL_CONFIG_CHANGE"] = "POOL_CONFIG_CHANGE";
|
|
272
|
+
REDIS_EVENT_TYPE_CONFIG_CHANGE["GROUP_CONFIG_CHANGE"] = "GROUP_CONFIG_CHANGE";
|
|
273
|
+
})(REDIS_EVENT_TYPE_CONFIG_CHANGE || (exports.REDIS_EVENT_TYPE_CONFIG_CHANGE = REDIS_EVENT_TYPE_CONFIG_CHANGE = {}));
|
|
274
|
+
var REDIS_EVENT_TYPE_QUOTE;
|
|
275
|
+
(function (REDIS_EVENT_TYPE_QUOTE) {
|
|
276
|
+
REDIS_EVENT_TYPE_QUOTE["NEW_QUOTE_PRICE"] = "NEW_QUOTE_PRICE";
|
|
277
|
+
})(REDIS_EVENT_TYPE_QUOTE || (exports.REDIS_EVENT_TYPE_QUOTE = REDIS_EVENT_TYPE_QUOTE = {}));
|
|
278
|
+
var REDIS_EVENT_TYPE_ORDER;
|
|
279
|
+
(function (REDIS_EVENT_TYPE_ORDER) {
|
|
280
|
+
REDIS_EVENT_TYPE_ORDER["NEW_ORDER"] = "NEW_ORDER";
|
|
281
|
+
REDIS_EVENT_TYPE_ORDER["ORDER_PROCESSING"] = "ORDER_PROCESSING";
|
|
282
|
+
REDIS_EVENT_TYPE_ORDER["ORDER_SUCCESS"] = "ORDER_SUCCESS";
|
|
283
|
+
REDIS_EVENT_TYPE_ORDER["ORDER_FAILED"] = "ORDER_FAILED";
|
|
284
|
+
REDIS_EVENT_TYPE_ORDER["ORDER_NOT_FOUND"] = "ORDER_NOT_FOUND";
|
|
285
|
+
})(REDIS_EVENT_TYPE_ORDER || (exports.REDIS_EVENT_TYPE_ORDER = REDIS_EVENT_TYPE_ORDER = {}));
|
|
286
|
+
var REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE;
|
|
287
|
+
(function (REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE) {
|
|
288
|
+
REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE["TRADE_INSTANCE_STARTUP"] = "TRADE_INSTANCE_STARTUP";
|
|
289
|
+
REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE["TRADE_INSTANCE_EXIT"] = "TRADE_INSTANCE_EXIT";
|
|
290
|
+
})(REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE || (exports.REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE = REDIS_EVENT_TYPE_TRADE_INSTANCE_CHANGE = {}));
|
|
291
|
+
function _caller() {
|
|
292
|
+
try {
|
|
293
|
+
throw new Error('');
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
let line = err.stack.split('\n')[3];
|
|
297
|
+
let module = (line.substring(line.lastIndexOf(path_1.default.sep) + 1, line.indexOf(':')).replace('.js', ''));
|
|
298
|
+
return {
|
|
299
|
+
method: '',
|
|
300
|
+
module
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
var LOG_LEVEL;
|
|
305
|
+
(function (LOG_LEVEL) {
|
|
306
|
+
LOG_LEVEL[LOG_LEVEL["TRACE"] = 1] = "TRACE";
|
|
307
|
+
LOG_LEVEL[LOG_LEVEL["DEBUG"] = 2] = "DEBUG";
|
|
308
|
+
LOG_LEVEL[LOG_LEVEL["INFO"] = 3] = "INFO";
|
|
309
|
+
LOG_LEVEL[LOG_LEVEL["WARN"] = 4] = "WARN";
|
|
310
|
+
LOG_LEVEL[LOG_LEVEL["ERROR"] = 5] = "ERROR";
|
|
311
|
+
})(LOG_LEVEL || (exports.LOG_LEVEL = LOG_LEVEL = {}));
|
|
312
|
+
let _log_level = LOG_LEVEL[process.env.LOG_LEVEL];
|
|
313
|
+
if (_log_level) {
|
|
314
|
+
console.log(`Log level`, {
|
|
315
|
+
'process.env.LOG_LEVEL': process.env.LOG_LEVEL,
|
|
316
|
+
_log_level
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
_log_level = LOG_LEVEL.INFO;
|
|
321
|
+
console.log(`Log level is invalid! set default level: INFO`, {
|
|
322
|
+
'process.env.LOG_LEVEL': process.env.LOG_LEVEL,
|
|
323
|
+
_log_level
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
exports._active_log_level = _log_level;
|
|
327
|
+
class LOG {
|
|
328
|
+
}
|
|
329
|
+
exports.LOG = LOG;
|
|
330
|
+
LOG.trace = exports._active_log_level <= LOG_LEVEL.TRACE;
|
|
331
|
+
LOG.debug = exports._active_log_level <= LOG_LEVEL.DEBUG;
|
|
332
|
+
LOG.info = exports._active_log_level <= LOG_LEVEL.INFO;
|
|
333
|
+
LOG.warn = exports._active_log_level <= LOG_LEVEL.WARN;
|
|
334
|
+
function log_trace(msg, data = {}, traceId = '') {
|
|
335
|
+
log_info(msg, data, traceId, _caller(), LOG_LEVEL.TRACE);
|
|
336
|
+
}
|
|
337
|
+
function log_debug(msg, data = {}, traceId = '') {
|
|
338
|
+
log_info(msg, data, traceId, _caller(), LOG_LEVEL.DEBUG);
|
|
339
|
+
}
|
|
340
|
+
function log_warn(msg, data = {}, traceId = '') {
|
|
341
|
+
log_info(`!!! ${msg}`, data, traceId, _caller(), LOG_LEVEL.WARN);
|
|
342
|
+
}
|
|
343
|
+
function log_info(msg, data = {}, traceId = '', caller = undefined, level = LOG_LEVEL.INFO) {
|
|
344
|
+
if (level < _log_level) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (!caller) {
|
|
348
|
+
caller = _caller();
|
|
349
|
+
}
|
|
350
|
+
if (traceId) {
|
|
351
|
+
console.log(`${getCurDateTime()} - [${level}] - [${caller.module}] - ${traceId} - ${msg}`);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
console.log(`${getCurDateTime()} - [${level}] - [${caller.module}] - ${msg}`);
|
|
355
|
+
}
|
|
356
|
+
if (!isEmpty(data)) {
|
|
357
|
+
console.dir(data, { depth: parseInt(process.env.LOG_DEPTH || '4') });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function log_error(msg, err, traceId = '', caller = undefined) {
|
|
361
|
+
if (!caller) {
|
|
362
|
+
caller = _caller();
|
|
363
|
+
}
|
|
364
|
+
if (traceId) {
|
|
365
|
+
console.error(`${getCurDateTime()} - [5] - [${caller.module}] - ${msg}`, err);
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
console.error(`${getCurDateTime()} - [5] - [${caller.module}] - ${traceId} - ${msg}`, err);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
function new_line(lines = 2) {
|
|
372
|
+
for (let i = 0; i < lines; i++) {
|
|
373
|
+
console.log('>');
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const generateRandomNumber = (min, max) => {
|
|
377
|
+
if (min > max) {
|
|
378
|
+
[min, max] = [max, min];
|
|
379
|
+
}
|
|
380
|
+
const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
|
|
381
|
+
return randomNumber;
|
|
382
|
+
};
|
|
383
|
+
exports.generateRandomNumber = generateRandomNumber;
|
|
384
|
+
class DecimalUtil {
|
|
385
|
+
static adjustDecimals(input, shift = 0) {
|
|
386
|
+
return input.div(decimal_js_1.default.pow(10, shift));
|
|
387
|
+
}
|
|
388
|
+
static fromBN(input, shift = 0) {
|
|
389
|
+
return new decimal_js_1.default(input.toString()).div(new decimal_js_1.default(10).pow(shift));
|
|
390
|
+
}
|
|
391
|
+
static fromNumber(input, shift = 0) {
|
|
392
|
+
return new decimal_js_1.default(input).div(new decimal_js_1.default(10).pow(shift));
|
|
393
|
+
}
|
|
394
|
+
static toBN(input, shift = 0) {
|
|
395
|
+
if (input.isNeg()) {
|
|
396
|
+
throw new Error('Negative decimal value ${input} cannot be converted to BN.');
|
|
397
|
+
}
|
|
398
|
+
const shiftedValue = input.mul(new decimal_js_1.default(10).pow(shift));
|
|
399
|
+
const zeroDecimalValue = shiftedValue.trunc();
|
|
400
|
+
return new bn_js_1.default(zeroDecimalValue.toString());
|
|
401
|
+
}
|
|
402
|
+
static number_div(number1, number2, decimals = 6) {
|
|
403
|
+
if (number2 == 0) {
|
|
404
|
+
return 0;
|
|
405
|
+
}
|
|
406
|
+
return Math.abs(Number(this.fromNumber(number1).div(this.fromNumber(number2)).toFixed(decimals)));
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
exports.DecimalUtil = DecimalUtil;
|
|
410
|
+
const to_json_str = (value, space = 4) => {
|
|
411
|
+
return JSON.stringify(value, null, space);
|
|
412
|
+
};
|
|
413
|
+
exports.to_json_str = to_json_str;
|
|
414
|
+
exports.DATE_TIME_FORMAT_DEFAULT = 'YYYY-MM-DD HH:mm:ss SSS';
|
|
415
|
+
exports.DATE_TIME_FORMAT_NO_WHITESPACE = 'YYYY_MM_DD_HH_mm_ss';
|
|
416
|
+
function getCurDateTime(format = '') {
|
|
417
|
+
if (format) {
|
|
418
|
+
return (0, moment_1.default)().format(format);
|
|
419
|
+
}
|
|
420
|
+
return (0, moment_1.default)().format(exports.DATE_TIME_FORMAT_DEFAULT);
|
|
421
|
+
}
|
|
422
|
+
function getCurTimeShort() {
|
|
423
|
+
return (0, moment_1.default)().format('HH:mm:ss SSS');
|
|
424
|
+
}
|
|
425
|
+
function parseToDateTime(milliseconds, format = exports.DATE_TIME_FORMAT_DEFAULT) {
|
|
426
|
+
return moment_1.default.utc(milliseconds).format(format);
|
|
427
|
+
}
|
|
428
|
+
function getCurTimeInMills() {
|
|
429
|
+
return (0, moment_1.default)().valueOf();
|
|
430
|
+
}
|
|
431
|
+
function curr_milliseconds() {
|
|
432
|
+
return (0, moment_1.default)().valueOf();
|
|
433
|
+
}
|
|
434
|
+
function sleep(mills) {
|
|
435
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
436
|
+
yield new Promise((r) => setTimeout(r, mills));
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
function parseDateTimeStrToMills(date_time_str, format = exports.DATE_TIME_FORMAT_DEFAULT) {
|
|
440
|
+
return (0, moment_1.default)(date_time_str, format, true).valueOf();
|
|
441
|
+
}
|
|
442
|
+
const uuid = () => {
|
|
443
|
+
return short.generate();
|
|
444
|
+
};
|
|
445
|
+
exports.uuid = uuid;
|
|
446
|
+
const deep_clone = (obj) => {
|
|
447
|
+
return JSON.parse(JSON.stringify(obj));
|
|
448
|
+
};
|
|
449
|
+
exports.deep_clone = deep_clone;
|
|
450
|
+
function isEmpty(v) {
|
|
451
|
+
let type = typeof v;
|
|
452
|
+
if (type === 'undefined') {
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
if (type === 'boolean') {
|
|
456
|
+
return !v;
|
|
457
|
+
}
|
|
458
|
+
if (v === null) {
|
|
459
|
+
return true;
|
|
460
|
+
}
|
|
461
|
+
if (v === undefined) {
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
if (v instanceof Array) {
|
|
465
|
+
if (v.length < 1) {
|
|
466
|
+
return true;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else if (type === 'string') {
|
|
470
|
+
if (v.trim().length < 1) {
|
|
471
|
+
return true;
|
|
472
|
+
}
|
|
473
|
+
if (v === '0' || v === 'false') {
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
else if (type === 'object') {
|
|
478
|
+
if (Object.keys(v).length < 1) {
|
|
479
|
+
return true;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
else if (type === 'number') {
|
|
483
|
+
if (v === 0 || isNaN(v)) {
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
const isTrue = (value) => {
|
|
490
|
+
if (!value)
|
|
491
|
+
return false;
|
|
492
|
+
return value.toString().toLowerCase() === 'true';
|
|
493
|
+
};
|
|
494
|
+
exports.isTrue = isTrue;
|
|
495
|
+
const isArray = (arg) => Array.isArray(arg);
|
|
496
|
+
exports.isArray = isArray;
|
|
497
|
+
const deep_merge_object = (default_obj, new_obj) => {
|
|
498
|
+
const result = Object.assign({}, default_obj);
|
|
499
|
+
for (let key in new_obj) {
|
|
500
|
+
if (new_obj.hasOwnProperty(key)) {
|
|
501
|
+
if (new_obj[key] instanceof Object && default_obj[key] instanceof Object) {
|
|
502
|
+
result[key] = (0, exports.deep_merge_object)(default_obj[key], new_obj[key]);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
result[key] = new_obj[key];
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return result;
|
|
510
|
+
};
|
|
511
|
+
exports.deep_merge_object = deep_merge_object;
|
|
512
|
+
const postJSON = (url, data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
513
|
+
const rawResponse = yield fetch(url, {
|
|
514
|
+
method: 'POST',
|
|
515
|
+
headers: {
|
|
516
|
+
Accept: 'application/json',
|
|
517
|
+
'Content-Type': 'application/json',
|
|
518
|
+
},
|
|
519
|
+
body: JSON.stringify(data),
|
|
520
|
+
});
|
|
521
|
+
try {
|
|
522
|
+
return rawResponse.json();
|
|
523
|
+
}
|
|
524
|
+
catch (err) {
|
|
525
|
+
console.error(`postJSON error!`, err);
|
|
526
|
+
const text = yield rawResponse.text();
|
|
527
|
+
console.log(`postJSON res text=`, text);
|
|
528
|
+
throw err;
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
exports.postJSON = postJSON;
|
|
532
|
+
const home_dir = () => {
|
|
533
|
+
return os_1.default.homedir();
|
|
534
|
+
};
|
|
535
|
+
exports.home_dir = home_dir;
|
|
536
|
+
function file_exists(filepath) {
|
|
537
|
+
return fs_1.default.existsSync(filepath);
|
|
538
|
+
}
|
|
539
|
+
function readFile(filename, to_json_object = true, print_content = false) {
|
|
540
|
+
const filepath = path_1.default.resolve('.', filename);
|
|
541
|
+
const content = fs_1.default.readFileSync(filepath, 'utf-8');
|
|
542
|
+
if (print_content) {
|
|
543
|
+
console.log(`Read file: ${filepath}`, content);
|
|
544
|
+
}
|
|
545
|
+
if (to_json_object) {
|
|
546
|
+
return JSON.parse(content);
|
|
547
|
+
}
|
|
548
|
+
return content;
|
|
549
|
+
}
|
|
550
|
+
function writeFile(filename, data) {
|
|
551
|
+
const filepath = path_1.default.resolve('.', filename);
|
|
552
|
+
if (LOG.trace) {
|
|
553
|
+
log_trace(`Write file: ${filepath}`);
|
|
554
|
+
}
|
|
555
|
+
fs_1.default.writeFileSync(filepath, data, 'utf-8');
|
|
556
|
+
}
|
|
557
|
+
function mkdirSync(path, recursive = false) {
|
|
558
|
+
if (fs_1.default.existsSync(path)) {
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
fs_1.default.mkdirSync(path, { recursive });
|
|
562
|
+
}
|
|
563
|
+
function getServerInfo() {
|
|
564
|
+
let region = '';
|
|
565
|
+
let ip = '';
|
|
566
|
+
let name = '';
|
|
567
|
+
try {
|
|
568
|
+
ip = getIPAddress();
|
|
569
|
+
name = process.env.SERVER_ID;
|
|
570
|
+
region = (process.env.SERVER_ID || '').replace('lmm-', '').split('-')[0];
|
|
571
|
+
}
|
|
572
|
+
catch (err) {
|
|
573
|
+
log_error('getServerInfo error!', err);
|
|
574
|
+
}
|
|
575
|
+
return {
|
|
576
|
+
region,
|
|
577
|
+
ip,
|
|
578
|
+
name,
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
function getIPAddress() {
|
|
582
|
+
const ips = [];
|
|
583
|
+
var interfaces = os_1.default.networkInterfaces();
|
|
584
|
+
for (var devName in interfaces) {
|
|
585
|
+
var iface = interfaces[devName] || [];
|
|
586
|
+
for (var i = 0; i < iface.length; i++) {
|
|
587
|
+
var alias = iface[i];
|
|
588
|
+
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
|
|
589
|
+
ips.push(alias.address);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
if (ips.length > 1) {
|
|
594
|
+
return ips.find((e) => String(e).indexOf('192.168') === -1);
|
|
595
|
+
}
|
|
596
|
+
return ips[0];
|
|
597
|
+
}
|
|
598
|
+
function load_wallet(group_id, only_pubkey = true) {
|
|
599
|
+
if (!group_id) {
|
|
600
|
+
throw new Error('Invalid param: group_id is empty or null !');
|
|
601
|
+
}
|
|
602
|
+
let wallet_dir = process.env.WALLET_DIR;
|
|
603
|
+
if (!wallet_dir) {
|
|
604
|
+
wallet_dir = path_1.default.join((0, exports.home_dir)(), 'data', 'keypairs');
|
|
605
|
+
}
|
|
606
|
+
let file_path = path_1.default.join(wallet_dir, `${group_id}.json`);
|
|
607
|
+
log_info(`Load wallet, group_id=${group_id}, file_path=${file_path}`);
|
|
608
|
+
let wallet = readFile(file_path, true, false);
|
|
609
|
+
if (only_pubkey) {
|
|
610
|
+
return {
|
|
611
|
+
public_key: wallet.public_key,
|
|
612
|
+
private_key: ''
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
return wallet;
|
|
616
|
+
}
|
|
617
|
+
const success = (data) => {
|
|
618
|
+
return {
|
|
619
|
+
code: 200,
|
|
620
|
+
msg: exports.SUCCESS,
|
|
621
|
+
data,
|
|
622
|
+
};
|
|
623
|
+
};
|
|
624
|
+
exports.success = success;
|
|
625
|
+
const failed = (err, error_code = 'SYSTEM_ERROR', code = 500) => {
|
|
626
|
+
return {
|
|
627
|
+
code,
|
|
628
|
+
msg: (err === null || err === void 0 ? void 0 : err.message) || exports.FAILED,
|
|
629
|
+
error_code
|
|
630
|
+
};
|
|
631
|
+
};
|
|
632
|
+
exports.failed = failed;
|
|
633
|
+
const estimate_amount_in_token = (arb_cache_1, token_1, amount_in_usd_1, ...args_1) => __awaiter(void 0, [arb_cache_1, token_1, amount_in_usd_1, ...args_1], void 0, function* (arb_cache, token, amount_in_usd, query_token_market_price_url = '') {
|
|
634
|
+
return yield market_price_1.EstimateAmountInToken.estimate_amount_in_token(arb_cache, token, amount_in_usd, query_token_market_price_url);
|
|
635
|
+
});
|
|
636
|
+
exports.estimate_amount_in_token = estimate_amount_in_token;
|
|
637
|
+
const calc_amount_in_token = (amount_in_usd, market_price, token_info) => {
|
|
638
|
+
if (isEmpty(market_price) || Number(market_price) === 0) {
|
|
639
|
+
throw new Error(`calc_token_amount_out error! invalid argument! market_price=${market_price}`);
|
|
640
|
+
}
|
|
641
|
+
let { decimals } = token_info;
|
|
642
|
+
const amount_in_token = Number(new decimal_js_1.default(amount_in_usd).div(new decimal_js_1.default(market_price)).toFixed(decimals));
|
|
643
|
+
return {
|
|
644
|
+
token_info,
|
|
645
|
+
market_price,
|
|
646
|
+
amount_in_usd,
|
|
647
|
+
amount_in_token
|
|
648
|
+
};
|
|
649
|
+
};
|
|
650
|
+
exports.calc_amount_in_token = calc_amount_in_token;
|
|
651
|
+
const get_input_out_token = (poolInfo, aToB) => {
|
|
652
|
+
let { is_reverse_token } = poolInfo;
|
|
653
|
+
let inputToken;
|
|
654
|
+
let outputToken;
|
|
655
|
+
if (!is_reverse_token) {
|
|
656
|
+
if (aToB) {
|
|
657
|
+
inputToken = poolInfo.tokenA;
|
|
658
|
+
outputToken = poolInfo.tokenB;
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
inputToken = poolInfo.tokenB;
|
|
662
|
+
outputToken = poolInfo.tokenA;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
else {
|
|
666
|
+
if (aToB) {
|
|
667
|
+
inputToken = poolInfo.tokenB;
|
|
668
|
+
outputToken = poolInfo.tokenA;
|
|
669
|
+
}
|
|
670
|
+
else {
|
|
671
|
+
inputToken = poolInfo.tokenA;
|
|
672
|
+
outputToken = poolInfo.tokenB;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
return {
|
|
676
|
+
inputToken,
|
|
677
|
+
outputToken
|
|
678
|
+
};
|
|
679
|
+
};
|
|
680
|
+
exports.get_input_out_token = get_input_out_token;
|
|
681
|
+
const get_input_out_token_fix = (poolInfo, aToB) => {
|
|
682
|
+
let inputToken;
|
|
683
|
+
let outputToken;
|
|
684
|
+
if (aToB) {
|
|
685
|
+
inputToken = poolInfo.tokenA;
|
|
686
|
+
outputToken = poolInfo.tokenB;
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
inputToken = poolInfo.tokenB;
|
|
690
|
+
outputToken = poolInfo.tokenA;
|
|
691
|
+
}
|
|
692
|
+
return {
|
|
693
|
+
inputToken,
|
|
694
|
+
outputToken
|
|
695
|
+
};
|
|
696
|
+
};
|
|
697
|
+
exports.get_input_out_token_fix = get_input_out_token_fix;
|
|
698
|
+
const parse_trade_cmdline_args = () => {
|
|
699
|
+
var _a;
|
|
700
|
+
let chain_id = process.env.CHAIN_ID || '';
|
|
701
|
+
let input_group_id = process.env.INPUT_GROUP_ID || '';
|
|
702
|
+
let input_pair = process.env.INPUT_PAIR || '';
|
|
703
|
+
let input_dex_id = ((_a = process.env.INPUT_DEX_ID) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || '';
|
|
704
|
+
let cmd_args = {
|
|
705
|
+
chain_id,
|
|
706
|
+
input_dex_id,
|
|
707
|
+
input_pair,
|
|
708
|
+
input_group_id
|
|
709
|
+
};
|
|
710
|
+
return cmd_args;
|
|
711
|
+
};
|
|
712
|
+
exports.parse_trade_cmdline_args = parse_trade_cmdline_args;
|
|
713
|
+
const empty_broadcast = [
|
|
714
|
+
{
|
|
715
|
+
rpc: {
|
|
716
|
+
read: '', write: ''
|
|
717
|
+
},
|
|
718
|
+
type: '',
|
|
719
|
+
fee: {
|
|
720
|
+
base_fee: 0,
|
|
721
|
+
priority_fee: 0,
|
|
722
|
+
total_fee: 0
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
];
|
|
726
|
+
const log_url = process.env.TRADE_LOG_SEND_URL || '';
|
|
727
|
+
const log_type = process.env.TRADE_LOG_DATA_TYPE || '';
|
|
728
|
+
const save_trade_execution_logs = (trade_response) => __awaiter(void 0, void 0, void 0, function* () {
|
|
729
|
+
if (LOG.debug) {
|
|
730
|
+
log_debug(`save_trade_execution_logs, start`, {
|
|
731
|
+
log_url,
|
|
732
|
+
log_type,
|
|
733
|
+
trade_response: JSON.stringify(trade_response)
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
try {
|
|
737
|
+
let { code, msg, data, error_code } = trade_response;
|
|
738
|
+
let { success, start_time, end_time, total_time, dex_id, pair, chain_id, group_id, txid, balance, execution } = data;
|
|
739
|
+
let { time, broadcast, server_info } = execution;
|
|
740
|
+
if (!broadcast) {
|
|
741
|
+
broadcast = empty_broadcast;
|
|
742
|
+
}
|
|
743
|
+
let _broadcast = broadcast[0];
|
|
744
|
+
let trade_logs = {
|
|
745
|
+
success, msg, error_code,
|
|
746
|
+
group_id, chain_id, pair, dex_id,
|
|
747
|
+
start_time, end_time, total_time,
|
|
748
|
+
txid,
|
|
749
|
+
t_block_time: time.block_time,
|
|
750
|
+
t_stream_time: time.stream_time,
|
|
751
|
+
t_quote_start_time: time.quote_start_time,
|
|
752
|
+
t_quote_end_time: time.quote_end_time,
|
|
753
|
+
t_price_time: time.price_time,
|
|
754
|
+
t_total_quote_time: time.total_quote_time,
|
|
755
|
+
t_order_send_time: time.order_send_time,
|
|
756
|
+
t_order_recv_time: time.order_recv_time,
|
|
757
|
+
t_order_submit_time: time.order_submit_time,
|
|
758
|
+
t_order_end_time: time.order_end_time,
|
|
759
|
+
t_order_block_time: time.order_block_time,
|
|
760
|
+
t_total_order_time: time.total_order_time,
|
|
761
|
+
broadcast_type: _broadcast.type,
|
|
762
|
+
rpc_read: `${_broadcast.rpc.read}`,
|
|
763
|
+
rpc_write: `${_broadcast.rpc.write}`,
|
|
764
|
+
gas_base_fee: _broadcast.fee.base_fee,
|
|
765
|
+
gas_priority_fee: _broadcast.fee.priority_fee,
|
|
766
|
+
gas_total_fee: _broadcast.fee.total_fee,
|
|
767
|
+
server_ip: server_info.ip,
|
|
768
|
+
server_name: server_info.name,
|
|
769
|
+
server_region: server_info.region,
|
|
770
|
+
};
|
|
771
|
+
const payload = {
|
|
772
|
+
type: log_type,
|
|
773
|
+
msgJson: JSON.stringify(trade_logs),
|
|
774
|
+
};
|
|
775
|
+
if (isEmpty(log_url) || isEmpty(log_type)) {
|
|
776
|
+
log_warn(`save_trade_execution_logs, skip!!! TRADE_LOG_SEND_URL or TRADE_LOG_DATA_TYPE is empty`);
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
if (LOG.debug) {
|
|
780
|
+
log_debug('save_trade_execution_logs, data=', {
|
|
781
|
+
txid,
|
|
782
|
+
log_url,
|
|
783
|
+
log_type,
|
|
784
|
+
payload
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
(0, exports.postJSON)(log_url, payload)
|
|
788
|
+
.then((res) => console.log(`${getCurDateTime()} save_trade_execution_logs, success. txid=${txid}`, res))
|
|
789
|
+
.catch((err) => {
|
|
790
|
+
console.error(`${getCurDateTime()} save_trade_execution_logs, error! txid=${txid}`);
|
|
791
|
+
console.log(err);
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
catch (err) {
|
|
795
|
+
log_error(`save_trade_execution_logs error!`, err);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
exports.save_trade_execution_logs = save_trade_execution_logs;
|
|
799
|
+
const inspect_arb_local_cache = (express, appConfig) => {
|
|
800
|
+
let { chain_id } = appConfig.arb_cache;
|
|
801
|
+
express.get(`/${chain_id}/cache/summary`, (req, res) => {
|
|
802
|
+
let { token_list, token_list_cache_last_update_time, pool_list, pool_list_cahce_last_update_time, trade_config_list, trade_config_cache_last_update_time } = appConfig.arb_cache;
|
|
803
|
+
let group_config = trade_config_list.map(e => {
|
|
804
|
+
return {
|
|
805
|
+
group_id: e.group.id,
|
|
806
|
+
pairs: e.pair_list.map(e => e.name)
|
|
807
|
+
};
|
|
808
|
+
});
|
|
809
|
+
let summary = {
|
|
810
|
+
token_config: {
|
|
811
|
+
last_update_time: token_list_cache_last_update_time,
|
|
812
|
+
token_count: token_list.length
|
|
813
|
+
},
|
|
814
|
+
pool_config: {
|
|
815
|
+
last_update_time: pool_list_cahce_last_update_time,
|
|
816
|
+
pool_count: pool_list.length
|
|
817
|
+
},
|
|
818
|
+
trade_config: {
|
|
819
|
+
last_update_time: trade_config_cache_last_update_time,
|
|
820
|
+
group_config
|
|
821
|
+
}
|
|
822
|
+
};
|
|
823
|
+
res.json((0, exports.success)({ summary }));
|
|
824
|
+
});
|
|
825
|
+
express.get(`/${chain_id}/cache/:type`, (req, res) => {
|
|
826
|
+
let { token_list, token_symbol_map, token_address_map, token_list_cache_last_update_time, pool_list, pool_address_map, pool_list_cahce_last_update_time, trade_config_list, trade_config_map, trade_config_cache_last_update_time } = appConfig.arb_cache;
|
|
827
|
+
let type = req.params.type;
|
|
828
|
+
if (type === 'tokens') {
|
|
829
|
+
res.json({
|
|
830
|
+
token_list_cache_last_update_time,
|
|
831
|
+
token_list,
|
|
832
|
+
_token_symbol_map: Object.fromEntries(token_symbol_map),
|
|
833
|
+
_token_address_map: Object.fromEntries(token_address_map),
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
else if (type === 'pools') {
|
|
837
|
+
res.json({
|
|
838
|
+
pool_list_cahce_last_update_time,
|
|
839
|
+
pool_list,
|
|
840
|
+
_pool_address_map: Object.fromEntries(pool_address_map),
|
|
841
|
+
});
|
|
842
|
+
}
|
|
843
|
+
else if (type === 'group') {
|
|
844
|
+
res.json({
|
|
845
|
+
trade_config_cache_last_update_time,
|
|
846
|
+
trade_config_list,
|
|
847
|
+
_trade_config_map: Object.fromEntries(trade_config_map),
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
res.json((0, exports.success)({}));
|
|
852
|
+
}
|
|
853
|
+
});
|
|
854
|
+
};
|
|
855
|
+
exports.inspect_arb_local_cache = inspect_arb_local_cache;
|
|
856
|
+
const execute_bash = (command_1, ...args_1) => __awaiter(void 0, [command_1, ...args_1], void 0, function* (command, parse_json = true) {
|
|
857
|
+
try {
|
|
858
|
+
let out = yield exec(command);
|
|
859
|
+
log_debug(`execute_bash: `, {
|
|
860
|
+
command,
|
|
861
|
+
out
|
|
862
|
+
});
|
|
863
|
+
let stdout = out.stdout;
|
|
864
|
+
if (parse_json) {
|
|
865
|
+
return JSON.parse(stdout);
|
|
866
|
+
}
|
|
867
|
+
return stdout;
|
|
868
|
+
}
|
|
869
|
+
catch (err) {
|
|
870
|
+
throw err;
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
exports.execute_bash = execute_bash;
|
|
874
|
+
function chunkArray(arr, chunkSize) {
|
|
875
|
+
if (chunkSize <= 0 || !Number.isInteger(chunkSize)) {
|
|
876
|
+
throw new Error("chunkSize 必须为大于 0 的整数");
|
|
877
|
+
}
|
|
878
|
+
const result = [];
|
|
879
|
+
for (let i = 0; i < arr.length; i += chunkSize) {
|
|
880
|
+
result.push(arr.slice(i, i + chunkSize));
|
|
881
|
+
}
|
|
882
|
+
return result;
|
|
883
|
+
}
|