@clonegod/ttd-core 3.1.29 → 3.1.31

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.
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.reportAlert = reportAlert;
13
13
  exports.flushAlerts = flushAlerts;
14
14
  const types_1 = require("./types");
15
- const core_env_1 = require("../app_config/core_env");
15
+ const core_env_1 = require("../appconfig/core_env");
16
16
  const codes_1 = require("./codes");
17
17
  const service_ports_1 = require("../constants/service_ports");
18
18
  let _axios = null;
@@ -48,7 +48,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.AnalyzeWsClient = exports.get_pool_latest_quote_price = exports.report_data_to_analyze = void 0;
49
49
  const axios_1 = __importDefault(require("axios"));
50
50
  const http = __importStar(require("http"));
51
- const core_env_1 = require("../app_config/core_env");
51
+ const core_env_1 = require("../appconfig/core_env");
52
52
  const index_1 = require("../index");
53
53
  const service_ports_1 = require("../constants/service_ports");
54
54
  const ws_client_1 = require("./ws_client");
@@ -0,0 +1,16 @@
1
+ import { TradeResponseType } from "../../types";
2
+ import { AbastrcatTrade } from "../trade/abstract_trade";
3
+ import { AbstractTransactionResultCheck } from "../trade/abstract_tx_check";
4
+ import { AppConfig } from "./AppConfig";
5
+ export declare abstract class AbstractTradeAppConfig extends AppConfig {
6
+ is_already_subscribe_wallet_raw_txn: boolean;
7
+ trade_instance: AbastrcatTrade;
8
+ tx_result_checker: AbstractTransactionResultCheck;
9
+ private is_order_event_subscribed;
10
+ constructor();
11
+ init(): Promise<void>;
12
+ init_trade_runtime(): Promise<void>;
13
+ subscribe_order_event(trade_instance: AbastrcatTrade, new_tx_result_checker_factory: () => AbstractTransactionResultCheck): Promise<void>;
14
+ cache_trade_result(trade_response: TradeResponseType): Promise<void>;
15
+ abstract subscribe_wallet_raw_txn_event(): void;
16
+ }
@@ -0,0 +1,72 @@
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.AbstractTradeAppConfig = void 0;
13
+ const __1 = require("..");
14
+ const handle_order_message_1 = require("../trade/handle_order_message");
15
+ const AppConfig_1 = require("./AppConfig");
16
+ class AbstractTradeAppConfig extends AppConfig_1.AppConfig {
17
+ constructor() {
18
+ super();
19
+ this.is_already_subscribe_wallet_raw_txn = false;
20
+ this.is_order_event_subscribed = false;
21
+ }
22
+ init() {
23
+ const _super = Object.create(null, {
24
+ init: { get: () => super.init }
25
+ });
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ yield _super.init.call(this);
28
+ this.arb_cache.listen_trade_result(this);
29
+ });
30
+ }
31
+ init_trade_runtime() {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ try {
34
+ let { chain_id, dex_id, trade_group_id, trade_pair } = this.env_args;
35
+ this.trade_runtime = yield this.arb_cache.create_trade_runtime(chain_id, trade_group_id, dex_id, trade_pair);
36
+ this.trade_runtime.wallet_token_accounts = new Map();
37
+ }
38
+ catch (err) {
39
+ (0, __1.log_error)(`create_trade_runtime error!`, err);
40
+ yield (0, __1.sleep)(1000);
41
+ process.exit(0);
42
+ }
43
+ });
44
+ }
45
+ subscribe_order_event(trade_instance, new_tx_result_checker_factory) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ if (this.is_order_event_subscribed) {
48
+ (0, __1.log_warn)('subscribe_order_event called multiple times, skip');
49
+ return;
50
+ }
51
+ this.is_order_event_subscribed = true;
52
+ let handler = (message) => (0, handle_order_message_1.handle_order_message)(this, trade_instance, new_tx_result_checker_factory, message);
53
+ let group_id = this.trade_runtime.group.id;
54
+ let pair_name = this.trade_runtime.pair_name;
55
+ let dex_id = this.trade_runtime.dex_id;
56
+ yield this.arb_event_subscriber.subscribe_order_event(group_id, pair_name, dex_id, handler);
57
+ (0, __1.log_info)(`subscribe_order_event, success`, { dex_id, group_id, pair_name });
58
+ });
59
+ }
60
+ cache_trade_result(trade_response) {
61
+ return __awaiter(this, void 0, void 0, function* () {
62
+ try {
63
+ (0, __1.log_info)(`cache_trade_result`, trade_response);
64
+ yield this.arb_cache.cache_trade_result(trade_response);
65
+ }
66
+ catch (err) {
67
+ (0, __1.log_error)(`cache_trade_result error!`, err);
68
+ }
69
+ });
70
+ }
71
+ }
72
+ exports.AbstractTradeAppConfig = AbstractTradeAppConfig;
@@ -0,0 +1,14 @@
1
+ import EventEmitter from "events";
2
+ import { TradeRuntimeType } from "../../types";
3
+ import { ArbCache, ArbEventSubscriber } from "../cache";
4
+ import { EnvArgs } from "./EnvArgs";
5
+ export declare class AppConfig extends EventEmitter {
6
+ env_args: EnvArgs;
7
+ app_full_name: string;
8
+ arb_cache: ArbCache;
9
+ arb_event_subscriber: ArbEventSubscriber;
10
+ trade_runtime: TradeRuntimeType;
11
+ constructor();
12
+ init(): Promise<void>;
13
+ subscribe_config_change(): Promise<void>;
14
+ }
@@ -0,0 +1,51 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AppConfig = void 0;
16
+ const events_1 = __importDefault(require("events"));
17
+ const __1 = require("..");
18
+ const core_env_1 = require("./core_env");
19
+ class AppConfig extends events_1.default {
20
+ constructor() {
21
+ super();
22
+ this.env_args = (0, core_env_1.getCoreEnv)();
23
+ let { chain_id, app_name, dex_id } = this.env_args;
24
+ this.app_full_name = `${chain_id}_${dex_id}_${app_name}`;
25
+ global.app_config = this;
26
+ }
27
+ init() {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ this.arb_cache = (0, __1.getArbCache)(this.env_args);
30
+ yield this.arb_cache.init();
31
+ });
32
+ }
33
+ subscribe_config_change() {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ this.arb_event_subscriber = (0, __1.getArbEventSubscriber)(this.arb_cache);
36
+ yield this.arb_event_subscriber.pre_load_config_cache();
37
+ const refresh_trade_runtime = (is_sussess, event) => __awaiter(this, void 0, void 0, function* () {
38
+ (0, __1.log_info)(`subscribe_config_change_event, callback`, { is_sussess, event });
39
+ if (event.event_type === __1.REDIS_EVENT_TYPE_CONFIG_CHANGE.GROUP_CONFIG_CHANGE) {
40
+ if (!this.trade_runtime) {
41
+ (0, __1.log_warn)(`refresh_trade_runtime, skip...`);
42
+ return;
43
+ }
44
+ this.trade_runtime = yield this.arb_cache.create_trade_runtime(this.trade_runtime.chain_id, this.trade_runtime.group.id, this.trade_runtime.dex_id, this.trade_runtime.pair_name);
45
+ }
46
+ });
47
+ yield this.arb_event_subscriber.subscribe_config_change_event(refresh_trade_runtime);
48
+ });
49
+ }
50
+ }
51
+ exports.AppConfig = AppConfig;
@@ -0,0 +1,52 @@
1
+ import { CHAIN_ID, DEX_ID } from "..";
2
+ export declare class EnvArgs {
3
+ app_name: string;
4
+ app_base_dir: string;
5
+ chain_id: CHAIN_ID;
6
+ dex_id: DEX_ID;
7
+ log_level: string;
8
+ log_depth: number;
9
+ server_id: string;
10
+ redis_host: string;
11
+ redis_port: string;
12
+ config_center_host: string;
13
+ market_data_host: string;
14
+ enable_init_cache: string;
15
+ trade_analyze_url: string;
16
+ trade_analyze_host: string;
17
+ rpc_endpoint: string;
18
+ ws_endpoint: string;
19
+ grpc_endpoint: string;
20
+ grpc_token: string;
21
+ auto_quote_enable: boolean;
22
+ auto_quote_interval_mills: number;
23
+ quote_pair: string;
24
+ quote_amount_usd: number;
25
+ quote_pool_address: string;
26
+ quote_pool_name: string;
27
+ quote_pool_fee_rate: number;
28
+ tick_cache_force_full_refresh_interval: number;
29
+ depth_cex_bps: number;
30
+ group_id: string;
31
+ trade_group_id: string;
32
+ trade_pair: string;
33
+ trade_log_report_cex_url: string;
34
+ trade_log_report_cex_data_type: string;
35
+ token_price_refresh_interval_seconds: number;
36
+ token_market_price_url: string;
37
+ wallet_dir: string;
38
+ encryption_key: string;
39
+ providers_file_path: string;
40
+ fixed_symbol_address_file: string;
41
+ zh_pinyin_map_file: string;
42
+ alert_analyze_host: string;
43
+ alert_flush_size: number;
44
+ alert_flush_ms: number;
45
+ alert_dedup_window_ms: number;
46
+ namespace: string;
47
+ server_ip_list: string;
48
+ ip_exclude_prefix: string;
49
+ protected _cfg: Record<string, any>;
50
+ constructor(chain_id?: CHAIN_ID, dex_id?: DEX_ID);
51
+ print(moduleName?: string): void;
52
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvArgs = void 0;
4
+ const __1 = require("..");
5
+ const env_loader_1 = require("./env_loader");
6
+ class EnvArgs {
7
+ constructor(chain_id, dex_id) {
8
+ const overrides = {};
9
+ if (chain_id)
10
+ overrides.chain_id = chain_id;
11
+ if (dex_id)
12
+ overrides.dex_id = dex_id;
13
+ const cfg = (0, env_loader_1.loadEnvConfig)(overrides);
14
+ this._cfg = cfg;
15
+ const cid = (cfg.chain_id || '').toUpperCase();
16
+ if ((0, __1.isEmpty)(cid)) {
17
+ throw new Error(`environment: CHAIN_ID is empty!!!`);
18
+ }
19
+ }
20
+ print(moduleName) {
21
+ (0, env_loader_1.printEnvConfig)(moduleName || this.app_name || 'EnvArgs', this);
22
+ }
23
+ }
24
+ exports.EnvArgs = EnvArgs;
@@ -0,0 +1,3 @@
1
+ import type { EnvArgs } from './EnvArgs';
2
+ export declare function setCoreEnv(env: EnvArgs): void;
3
+ export declare function getCoreEnv(): EnvArgs;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setCoreEnv = setCoreEnv;
4
+ exports.getCoreEnv = getCoreEnv;
5
+ let _core_env;
6
+ function setCoreEnv(env) {
7
+ _core_env = env;
8
+ }
9
+ function getCoreEnv() {
10
+ if (!_core_env) {
11
+ throw new Error('CoreEnv 尚未初始化 — 应用入口处请 import 模块 appconfig/index.ts(会自动 setCoreEnv),或显式调用 setCoreEnv(envArgs)');
12
+ }
13
+ return _core_env;
14
+ }
@@ -0,0 +1,3 @@
1
+ export declare function loadEnvConfig(overrides?: Record<string, any>): Record<string, any>;
2
+ export declare function validateEnvConfig(overrides?: Record<string, any>): string[];
3
+ export declare function printEnvConfig(moduleName: string, envArgs: Record<string, any>): void;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadEnvConfig = loadEnvConfig;
4
+ exports.validateEnvConfig = validateEnvConfig;
5
+ exports.printEnvConfig = printEnvConfig;
6
+ const env_registry_1 = require("./env_registry");
7
+ function parseValue(raw, def) {
8
+ var _a;
9
+ const str = raw !== undefined ? raw : undefined;
10
+ if (str === undefined || str === '') {
11
+ return def.default !== undefined ? def.default : getTypeDefault(def.type);
12
+ }
13
+ switch (def.type) {
14
+ case 'number':
15
+ const n = Number(str);
16
+ return isNaN(n) ? ((_a = def.default) !== null && _a !== void 0 ? _a : 0) : n;
17
+ case 'boolean':
18
+ return str === 'true' || str === '1';
19
+ case 'string[]':
20
+ return str.split(',').map(s => s.trim()).filter(Boolean);
21
+ default:
22
+ return str;
23
+ }
24
+ }
25
+ function getTypeDefault(type) {
26
+ switch (type) {
27
+ case 'number': return 0;
28
+ case 'boolean': return false;
29
+ case 'string[]': return [];
30
+ default: return '';
31
+ }
32
+ }
33
+ function loadEnvConfig(overrides) {
34
+ const missing = validateEnvConfig(overrides);
35
+ if (missing.length > 0) {
36
+ const header = '[EnvConfig] 以下必填环境变量未设置(进程拒绝启动):';
37
+ const detail = missing.map(m => ` - ${m}`).join('\n');
38
+ throw new Error(`${header}\n${detail}`);
39
+ }
40
+ const registry = (0, env_registry_1.getEnvRegistry)();
41
+ const config = {};
42
+ for (const [key, def] of Object.entries(registry)) {
43
+ if (overrides && key in overrides && overrides[key] !== undefined) {
44
+ config[key] = overrides[key];
45
+ }
46
+ else {
47
+ config[key] = parseValue(process.env[def.env], def);
48
+ }
49
+ }
50
+ return config;
51
+ }
52
+ function validateEnvConfig(overrides) {
53
+ const registry = (0, env_registry_1.getEnvRegistry)();
54
+ const missing = [];
55
+ for (const [key, def] of Object.entries(registry)) {
56
+ const isRequired = def.required === true || !Object.prototype.hasOwnProperty.call(def, 'default');
57
+ if (!isRequired)
58
+ continue;
59
+ if (overrides && key in overrides && overrides[key] !== undefined && overrides[key] !== '')
60
+ continue;
61
+ const val = process.env[def.env];
62
+ if (val === undefined || val === '') {
63
+ missing.push(`${def.env} (${def.desc || key})`);
64
+ }
65
+ }
66
+ return missing;
67
+ }
68
+ const SENSITIVE_RE = /key|token|secret|password|private|auth/i;
69
+ function maskValue(key, value, def) {
70
+ if (value === undefined || value === null || value === '')
71
+ return '(empty)';
72
+ const str = String(value);
73
+ const isSensitive = (def === null || def === void 0 ? void 0 : def.sensitive) || SENSITIVE_RE.test(key);
74
+ if (isSensitive && str.length > 4) {
75
+ return str.slice(0, 4) + '****';
76
+ }
77
+ return str;
78
+ }
79
+ function printEnvConfig(moduleName, envArgs) {
80
+ const registry = (0, env_registry_1.getEnvRegistry)();
81
+ const divider = '═'.repeat(70);
82
+ const keys = Object.keys(envArgs).filter(k => !k.startsWith('_') && typeof envArgs[k] !== 'function');
83
+ const lines = [];
84
+ lines.push('');
85
+ lines.push(divider);
86
+ lines.push(` ${moduleName.toUpperCase()} — Configuration`);
87
+ lines.push(divider);
88
+ const maxKeyLen = Math.max(...keys.map(k => {
89
+ const def = registry[k];
90
+ return def ? def.env.length : k.length;
91
+ }), 20);
92
+ for (const key of keys) {
93
+ const def = registry[key];
94
+ const envName = def ? def.env : key.toUpperCase();
95
+ const val = maskValue(key, envArgs[key], def);
96
+ const desc = (def === null || def === void 0 ? void 0 : def.desc) ? ` # ${def.desc}` : '';
97
+ lines.push(` ${envName.padEnd(maxKeyLen)} ${val}${desc}`);
98
+ }
99
+ lines.push(divider);
100
+ lines.push('');
101
+ console.log(lines.join('\n'));
102
+ }
@@ -0,0 +1,11 @@
1
+ export type EnvVarType = 'string' | 'number' | 'boolean' | 'string[]';
2
+ export interface EnvVarDef {
3
+ env: string;
4
+ type: EnvVarType;
5
+ default?: any;
6
+ required?: boolean;
7
+ sensitive?: boolean;
8
+ desc?: string;
9
+ }
10
+ export declare function registerEnvVars(defs: Record<string, EnvVarDef>): void;
11
+ export declare function getEnvRegistry(): Readonly<Record<string, EnvVarDef>>;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerEnvVars = registerEnvVars;
4
+ exports.getEnvRegistry = getEnvRegistry;
5
+ const _registry = {};
6
+ function registerEnvVars(defs) {
7
+ Object.assign(_registry, defs);
8
+ }
9
+ function getEnvRegistry() {
10
+ return _registry;
11
+ }
12
+ registerEnvVars({
13
+ app_name: { env: 'APP_NAME', type: 'string', default: '', desc: '应用名称(仅日志展示,可选)' },
14
+ app_base_dir: { env: 'APP_BASE_DIR', type: 'string', default: '', desc: '应用根目录(诊断用,可选)' },
15
+ chain_id: { env: 'CHAIN_ID', type: 'string', required: true, desc: '链标识(BSC/SOLANA/TRON)' },
16
+ dex_id: { env: 'DEX_ID', type: 'string', default: '', desc: 'DEX 标识(业务进程用,可选)' },
17
+ log_level: { env: 'LOG_LEVEL', type: 'string', default: '', desc: '日志级别(TRACE/DEBUG/INFO/WARN/ERROR)' },
18
+ log_depth: { env: 'LOG_DEPTH', type: 'number', default: 4, desc: 'console.dir 深度' },
19
+ server_id: { env: 'SERVER_ID', type: 'string', default: '', desc: '服务器标识(用于 region/name 推断)' },
20
+ redis_host: { env: 'REDIS_HOST', type: 'string', default: '127.0.0.1', desc: 'Redis 地址' },
21
+ redis_port: { env: 'REDIS_PORT', type: 'number', default: 6379, desc: 'Redis 端口' },
22
+ rpc_endpoint: { env: 'RPC_ENDPOINT', type: 'string', default: '', desc: 'RPC HTTP 端点' },
23
+ ws_endpoint: { env: 'WS_ENDPOINT', type: 'string', default: '', desc: 'RPC WebSocket 端点' },
24
+ grpc_endpoint: { env: 'GRPC_ENDPOINT', type: 'string', default: '', desc: 'gRPC 端点' },
25
+ grpc_token: { env: 'GRPC_TOKEN', type: 'string', default: '', sensitive: true, desc: 'gRPC 认证 token' },
26
+ config_center_host: { env: 'CONFIG_CENTER_HOST', type: 'string', default: '127.0.0.1', desc: '配置中心' },
27
+ market_data_host: { env: 'MARKET_DATA_HOST', type: 'string', default: '127.0.0.1', desc: 'market-data 服务(L3 现查 / fetch-pool 调用)' },
28
+ enable_init_cache: { env: 'ENABLE_INIT_CACHE', type: 'string', default: '', desc: '仅 config-center:是否初始化缓存(空或 true 视为启用;false 则跳过)' },
29
+ trade_analyze_host: { env: 'TRADE_ANALYZE_HOST', type: 'string', default: '', desc: 'analyze 上报地址(IP);为空则不上报' },
30
+ auto_quote_enable: { env: 'AUTO_QUOTE_ENABLE', type: 'boolean', default: false, desc: '自动报价开关' },
31
+ auto_quote_interval_mills: { env: 'AUTO_QUOTE_INTERVAL_MILLS', type: 'number', default: 60000, desc: '自动报价间隔(ms)' },
32
+ quote_pair: { env: 'QUOTE_PAIR', type: 'string', default: '', desc: '报价币对' },
33
+ quote_amount_usd: { env: 'QUOTE_AMOUNT_USD', type: 'number', default: 100, desc: '报价金额(USD)' },
34
+ quote_pool_address: { env: 'QUOTE_POOL_ADDRESS', type: 'string', default: '', desc: '指定池子地址' },
35
+ quote_pool_name: { env: 'QUOTE_POOL_NAME', type: 'string', default: '', desc: '指定池子名称' },
36
+ quote_pool_fee_rate: { env: 'QUOTE_POOL_FEE_RATE', type: 'number', default: 0, desc: '指定池子费率' },
37
+ tick_cache_force_full_refresh_interval: { env: 'TICK_CACHE_FORCE_FULL_REFRESH_INTERVAL', type: 'number', default: 60000, desc: 'tick 流动性强制全量刷新间隔(ms)' },
38
+ depth_cex_bps: { env: 'DEPTH_CEX_BPS', type: 'number', default: 20, desc: 'CEX 深度 bps(用于报价转换)' },
39
+ group_id: { env: 'GROUP_ID', type: 'string', default: '', desc: '当前 trader 进程绑定的 group(与 TRADE_GROUP_ID 二选一;用于缓存隔离/事件过滤)' },
40
+ trade_group_id: { env: 'TRADE_GROUP_ID', type: 'string', default: '', desc: '交易组 ID' },
41
+ trade_pair: { env: 'TRADE_PAIR', type: 'string', default: '', desc: '交易币对' },
42
+ trade_log_report_cex_url: { env: 'TRADE_LOG_REPORT_CEX_URL', type: 'string', default: '', desc: '【使用方: ttd-core/src/index.ts save_trade_execution_logs】DEX 交易执行日志上报 cex 侧接收端 URL;为空则跳过上报' },
43
+ trade_log_report_cex_data_type: { env: 'TRADE_LOG_REPORT_CEX_DATA_TYPE', type: 'string', default: '', desc: '【使用方: ttd-core/src/index.ts save_trade_execution_logs】上报 payload.type,cex 侧用于路由/区分;为空则跳过上报' },
44
+ wallet_dir: { env: 'WALLET_DIR', type: 'string', default: '', desc: '钱包目录' },
45
+ encryption_key: { env: 'ENCRYPTION_KEY', type: 'string', default: '', sensitive: true, desc: '对称加密密钥(用于钱包文件等)' },
46
+ trade_analyze_url: { env: 'TRADE_ANALYZE_URL', type: 'string', default: '', desc: 'analyze HTTP 基址(旧 EnvArgs;未配则 analyze 上报走默认拼接)' },
47
+ providers_file_path: { env: 'PROVIDERS_FILE_PATH', type: 'string', default: '', desc: 'stream-quote providers.json 绝对路径;留空则仅写 Redis' },
48
+ token_price_refresh_interval_seconds: { env: 'TOKEN_PRICE_REFRESH_INTERVAL_SECONDS', type: 'number', default: 600, desc: 'TokenPriceSyncer 刷价周期(s):market-data 通过 force_fetch 拉外部价(DefiLlama→Gecko→...)并直接批量写入 Redis + 发 TOKEN_CONFIG_CHANGE 事件的频率' },
49
+ token_market_price_url: { env: 'TOKEN_MARKET_PRICE_URL', type: 'string', default: '', desc: '【使用方: ttd-core estimate_token_amount】config-center 市价估算 HTTP 基址;为空则跳过远程回退' },
50
+ fixed_symbol_address_file: { env: 'FIXED_SYMBOL_ADDRESS_FILE', type: 'string', default: '', desc: '固定 symbol/address 映射文件路径(覆盖默认按 CHAIN_ID 推断的路径)' },
51
+ zh_pinyin_map_file: { env: 'ZH_PINYIN_MAP_FILE', type: 'string', default: '', desc: '中文拼音映射文件路径(覆盖默认路径)' },
52
+ server_ip_list: { env: 'SERVER_IP_LIST', type: 'string', default: '', desc: '服务器可用 IP 列表(逗号分隔);配置后优先使用;为空则从网卡探测并结合 IP_EXCLUDE_PREFIX 过滤' },
53
+ ip_exclude_prefix: { env: 'IP_EXCLUDE_PREFIX', type: 'string', default: '192.168', desc: 'IP 前缀排除列表(逗号分隔)' },
54
+ alert_analyze_host: { env: 'ALERT_ANALYZE_HOST', type: 'string', default: '', desc: 'alert ingest 地址(IP);为空则不上报' },
55
+ alert_flush_size: { env: 'ALERT_FLUSH_SIZE', type: 'number', default: 10, desc: 'alert 批处理阈值(条数)' },
56
+ alert_flush_ms: { env: 'ALERT_FLUSH_MS', type: 'number', default: 5000, desc: 'alert 批处理阈值(ms)' },
57
+ alert_dedup_window_ms: { env: 'ALERT_DEDUP_WINDOW_MS', type: 'number', default: 60000, desc: 'alert 去重窗口(ms)' },
58
+ namespace: { env: 'NAMESPACE', type: 'string', default: '', desc: '服务命名空间(用于日志/告警 source 前缀等)' },
59
+ });
@@ -0,0 +1,8 @@
1
+ import { AppConfig } from './AppConfig';
2
+ export * from './EnvArgs';
3
+ export * from './AppConfig';
4
+ export * from './AbstractTradeAppConfig';
5
+ export * from './env_registry';
6
+ export * from './env_loader';
7
+ export * from './core_env';
8
+ export declare const getGlobalAppConfig: () => AppConfig;
@@ -0,0 +1,31 @@
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.getGlobalAppConfig = void 0;
18
+ __exportStar(require("./EnvArgs"), exports);
19
+ __exportStar(require("./AppConfig"), exports);
20
+ __exportStar(require("./AbstractTradeAppConfig"), exports);
21
+ __exportStar(require("./env_registry"), exports);
22
+ __exportStar(require("./env_loader"), exports);
23
+ __exportStar(require("./core_env"), exports);
24
+ const getGlobalAppConfig = () => {
25
+ let app_config = global.app_config;
26
+ if (!app_config) {
27
+ throw new Error('app_config is not set');
28
+ }
29
+ return app_config;
30
+ };
31
+ exports.getGlobalAppConfig = getGlobalAppConfig;
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.ArbCache = void 0;
16
- const core_env_1 = require("../app_config/core_env");
16
+ const core_env_1 = require("../appconfig/core_env");
17
17
  const fs_1 = __importDefault(require("fs"));
18
18
  const path_1 = __importDefault(require("path"));
19
19
  const index_1 = require("../index");
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ArbEventSubscriber = void 0;
13
- const core_env_1 = require("../app_config/core_env");
13
+ const core_env_1 = require("../appconfig/core_env");
14
14
  const index_1 = require("../index");
15
15
  class ArbEventSubscriber {
16
16
  constructor(arb_cache) {
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ import { ArbCache, StandardPoolInfoType, StandardTokenInfoType, TokenPriceWithAm
5
5
  import * as redis from './redis';
6
6
  import * as cache from './cache';
7
7
  export * from './analyze';
8
- export * from './app_config';
8
+ export * from './appconfig';
9
9
  export * from './redis';
10
10
  export * from './cache';
11
11
  export * from './constants';
package/dist/index.js CHANGED
@@ -76,7 +76,7 @@ exports.load_wallet = load_wallet;
76
76
  exports.load_wallet_multi = load_wallet_multi;
77
77
  exports.chunkArray = chunkArray;
78
78
  require('dotenv').config();
79
- const core_env_1 = require("./app_config/core_env");
79
+ const core_env_1 = require("./appconfig/core_env");
80
80
  const log_bus_1 = require("./log_bus");
81
81
  const bn_js_1 = __importDefault(require("bn.js"));
82
82
  const decimal_js_1 = __importDefault(require("decimal.js"));
@@ -89,7 +89,7 @@ const cache = __importStar(require("./cache"));
89
89
  const market_price_1 = require("./market_price");
90
90
  const crypto_1 = require("./util/crypto");
91
91
  __exportStar(require("./analyze"), exports);
92
- __exportStar(require("./app_config"), exports);
92
+ __exportStar(require("./appconfig"), exports);
93
93
  __exportStar(require("./redis"), exports);
94
94
  __exportStar(require("./cache"), exports);
95
95
  __exportStar(require("./constants"), exports);
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.EstimateAmountInToken = void 0;
13
- const core_env_1 = require("../app_config/core_env");
13
+ const core_env_1 = require("../appconfig/core_env");
14
14
  const index_1 = require("../index");
15
15
  var tmp_token_price_cache = new Map();
16
16
  const PRICE_CACHE_EXPIRE_MILLS = 3 * 60 * 1000;
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.cache_pool_config = void 0;
16
16
  const axios_1 = __importDefault(require("axios"));
17
- const core_env_1 = require("../app_config/core_env");
17
+ const core_env_1 = require("../appconfig/core_env");
18
18
  const index_1 = require("../index");
19
19
  const service_ports_1 = require("../constants/service_ports");
20
20
  const is_not_arb_token_1 = require("../token/is_not_arb_token");
@@ -1,5 +1,5 @@
1
1
  import { StandardPoolInfoType, QuoteResultType } from "../../types";
2
- import { AppConfig } from "../app_config";
2
+ import { AppConfig } from "../appconfig";
3
3
  export interface PoolDepthData {
4
4
  ask: Record<number, {
5
5
  amount: number;
@@ -1,3 +1,3 @@
1
1
  import { PriceMessageType } from "../../types";
2
- import { AppConfig } from "../app_config";
2
+ import { AppConfig } from "../appconfig";
3
3
  export declare const publish_quote_price: (appConfig: AppConfig, price_msg: PriceMessageType) => void;
@@ -1,5 +1,5 @@
1
1
  import { StandardPoolInfoType, QuoteTimeInfoType, PriceMessageType } from '../../types';
2
- import { AppConfig } from '../app_config';
2
+ import { AppConfig } from '../appconfig';
3
3
  import { PoolDepthData } from './on_quote_response';
4
4
  export declare const get_quote_token_decimals: (pool_info: StandardPoolInfoType) => number;
5
5
  export declare function to_price_message(appConfig: AppConfig, quote_amount_usd: number, tx_price: number, quote_ask_price: number, quote_bid_price: number, pool_info: StandardPoolInfoType, time: QuoteTimeInfoType, slot?: string, source?: string, depth?: PoolDepthData): Promise<PriceMessageType>;
@@ -16,7 +16,7 @@ exports.get_quote_token_decimals = void 0;
16
16
  exports.to_price_message = to_price_message;
17
17
  exports.normalize_pair_name = normalize_pair_name;
18
18
  const decimal_js_1 = __importDefault(require("decimal.js"));
19
- const core_env_1 = require("../app_config/core_env");
19
+ const core_env_1 = require("../appconfig/core_env");
20
20
  const uuid_1 = require("uuid");
21
21
  const __1 = require("..");
22
22
  const get_quote_token_decimals = (pool_info) => {
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getRedisConnection = getRedisConnection;
13
- const core_env_1 = require("../app_config/core_env");
13
+ const core_env_1 = require("../appconfig/core_env");
14
14
  const redis_1 = require("redis");
15
15
  let redisClient = null;
16
16
  let connectPromise = null;
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.cache_token_config = void 0;
16
16
  const axios_1 = __importDefault(require("axios"));
17
- const core_env_1 = require("../app_config/core_env");
17
+ const core_env_1 = require("../appconfig/core_env");
18
18
  const index_1 = require("../index");
19
19
  const service_ports_1 = require("../constants/service_ports");
20
20
  const is_not_arb_token_1 = require("./is_not_arb_token");
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.get_fixed_symbol_address = void 0;
7
7
  const os_1 = __importDefault(require("os"));
8
- const core_env_1 = require("../app_config/core_env");
8
+ const core_env_1 = require("../appconfig/core_env");
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const index_1 = require("../index");
11
11
  let _first_load_logged = false;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.get_zh_pinyin_map = void 0;
7
7
  exports.replace_zh_symbols = replace_zh_symbols;
8
8
  const os_1 = __importDefault(require("os"));
9
- const core_env_1 = require("../app_config/core_env");
9
+ const core_env_1 = require("../appconfig/core_env");
10
10
  const path_1 = __importDefault(require("path"));
11
11
  const index_1 = require("../index");
12
12
  let _first_load_logged = false;
@@ -1,4 +1,4 @@
1
- import { AbstractTradeAppConfig, AppConfig } from "../app_config";
1
+ import { AbstractTradeAppConfig, AppConfig } from "../appconfig";
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>;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.encrypt = encrypt;
7
7
  exports.decrypt = decrypt;
8
8
  const crypto_1 = __importDefault(require("crypto"));
9
- const core_env_1 = require("../app_config/core_env");
9
+ const core_env_1 = require("../appconfig/core_env");
10
10
  function getEncryptionKey() {
11
11
  const envKey = (0, core_env_1.getCoreEnv)().encryption_key;
12
12
  if (envKey && envKey.length >= 32) {
@@ -38,7 +38,7 @@ exports.getNextIP = getNextIP;
38
38
  exports.getCurrentIpList = getCurrentIpList;
39
39
  require('dotenv').config();
40
40
  const os = __importStar(require("os"));
41
- const core_env_1 = require("../app_config/core_env");
41
+ const core_env_1 = require("../appconfig/core_env");
42
42
  let IP_LIST = [];
43
43
  let ip_list_loaded = false;
44
44
  let ip_counter = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clonegod/ttd-core",
3
- "version": "3.1.29",
3
+ "version": "3.1.31",
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": "dist/index.d.ts",