@clonegod/ttd-sol-common 1.2.1 → 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/dist/index.d.ts +0 -6
- package/dist/index.js +0 -6
- package/dist/quote/index.d.ts +1 -3
- package/dist/quote/index.js +1 -3
- package/dist/quote/pricing/index.d.ts +1 -0
- package/dist/{helius_sdk_v1.4.0/utils → quote/pricing}/index.js +1 -1
- package/dist/quote/pricing/token_price_cache.d.ts +9 -0
- package/dist/quote/pricing/token_price_cache.js +39 -0
- package/package.json +2 -3
- package/src/index.ts +1 -0
- package/src/quote/index.ts +1 -0
- package/src/quote/pricing/index.ts +1 -0
- package/src/quote/pricing/token_price_cache.ts +48 -0
- package/tsconfig.json +22 -0
- package/dist/appconfig/app_config.d.ts +0 -23
- package/dist/appconfig/app_config.js +0 -134
- package/dist/appconfig/env_args.d.ts +0 -27
- package/dist/appconfig/env_args.js +0 -39
- package/dist/appconfig/index.d.ts +0 -2
- package/dist/appconfig/index.js +0 -18
- package/dist/common/constants.d.ts +0 -12
- package/dist/common/constants.js +0 -18
- package/dist/common/context.d.ts +0 -23
- package/dist/common/context.js +0 -51
- package/dist/common/index.d.ts +0 -2
- package/dist/common/index.js +0 -18
- package/dist/helius_geyser_ws/index.d.ts +0 -3
- package/dist/helius_geyser_ws/index.js +0 -19
- package/dist/helius_geyser_ws/subscribe_pool_change_by_geyser.d.ts +0 -3
- package/dist/helius_geyser_ws/subscribe_pool_change_by_geyser.js +0 -102
- package/dist/helius_geyser_ws/subscribe_txid.d.ts +0 -2
- package/dist/helius_geyser_ws/subscribe_txid.js +0 -109
- package/dist/helius_geyser_ws/subscribe_wallet_transaction.d.ts +0 -2
- package/dist/helius_geyser_ws/subscribe_wallet_transaction.js +0 -102
- package/dist/helius_sdk_v1.4.0/Helius.d.ts +0 -31
- package/dist/helius_sdk_v1.4.0/Helius.js +0 -450
- package/dist/helius_sdk_v1.4.0/RpcClient.d.ts +0 -70
- package/dist/helius_sdk_v1.4.0/RpcClient.js +0 -978
- package/dist/helius_sdk_v1.4.0/constants.d.ts +0 -1
- package/dist/helius_sdk_v1.4.0/constants.js +0 -4
- package/dist/helius_sdk_v1.4.0/index.d.ts +0 -5
- package/dist/helius_sdk_v1.4.0/index.js +0 -21
- package/dist/helius_sdk_v1.4.0/types/das-types.d.ts +0 -408
- package/dist/helius_sdk_v1.4.0/types/das-types.js +0 -2
- package/dist/helius_sdk_v1.4.0/types/enums.d.ts +0 -542
- package/dist/helius_sdk_v1.4.0/types/enums.js +0 -606
- package/dist/helius_sdk_v1.4.0/types/index.d.ts +0 -3
- package/dist/helius_sdk_v1.4.0/types/index.js +0 -19
- package/dist/helius_sdk_v1.4.0/types/types.d.ts +0 -305
- package/dist/helius_sdk_v1.4.0/types/types.js +0 -2
- package/dist/helius_sdk_v1.4.0/utils/get-helius-endpoints.d.ts +0 -2
- package/dist/helius_sdk_v1.4.0/utils/get-helius-endpoints.js +0 -19
- package/dist/helius_sdk_v1.4.0/utils/index.d.ts +0 -1
- package/dist/helius_sdk_v1.4.0/utils/mintApi.d.ts +0 -2
- package/dist/helius_sdk_v1.4.0/utils/mintApi.js +0 -14
- package/dist/jito/index.d.ts +0 -14
- package/dist/jito/index.js +0 -142
- package/dist/jito/jitodontfront.d.ts +0 -5
- package/dist/jito/jitodontfront.js +0 -41
- package/dist/quote/log_quote_price.d.ts +0 -2
- package/dist/quote/log_quote_price.js +0 -29
- package/dist/quote/publish_quote_price.d.ts +0 -3
- package/dist/quote/publish_quote_price.js +0 -19
- package/dist/quote/to_price_message.d.ts +0 -5
- package/dist/quote/to_price_message.js +0 -103
- package/dist/send_tx/get_jito_tip_floor.d.ts +0 -1
- package/dist/send_tx/get_jito_tip_floor.js +0 -86
- package/dist/send_tx/get_signature.d.ts +0 -2
- package/dist/send_tx/get_signature.js +0 -17
- package/dist/send_tx/helius_client.d.ts +0 -16
- package/dist/send_tx/helius_client.js +0 -119
- package/dist/send_tx/index.d.ts +0 -4
- package/dist/send_tx/index.js +0 -20
- package/dist/send_tx/notify_new_txid.d.ts +0 -1
- package/dist/send_tx/notify_new_txid.js +0 -20
- package/dist/send_tx/sol_gas_cache.d.ts +0 -3
- package/dist/send_tx/sol_gas_cache.js +0 -15
- package/dist/send_tx/strategy_util.d.ts +0 -7
- package/dist/send_tx/strategy_util.js +0 -147
- package/dist/token/get_token_info.d.ts +0 -4
- package/dist/token/get_token_info.js +0 -136
- package/dist/token/get_token_price.d.ts +0 -6
- package/dist/token/get_token_price.js +0 -186
- package/dist/token/index.d.ts +0 -4
- package/dist/token/index.js +0 -20
- package/dist/token/types.d.ts +0 -17
- package/dist/token/types.js +0 -2
- package/dist/token/util.d.ts +0 -3
- package/dist/token/util.js +0 -33
- package/dist/trade/abstract_trade.d.ts +0 -5
- package/dist/trade/abstract_trade.js +0 -6
- package/dist/trade/handle_order_message.d.ts +0 -4
- package/dist/trade/handle_order_message.js +0 -118
- package/dist/trade/index.d.ts +0 -4
- package/dist/trade/index.js +0 -20
- package/dist/trade/tx_result_check.d.ts +0 -29
- package/dist/trade/tx_result_check.js +0 -232
- package/dist/trade/tx_result_parse.d.ts +0 -13
- package/dist/trade/tx_result_parse.js +0 -150
- package/grpc/transaction/LThcUp2D5p4JgRMnWEUVVSdNEHiq5YfN5HXPGRYeWBfypMT3aTa1CaC9XdPT69CyMdoJ32XAkjXAa2TmBYBeZAy.json +0 -1
- package/types/index.d.ts +0 -71
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -14,10 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./appconfig"), exports);
|
|
18
|
-
__exportStar(require("./common"), exports);
|
|
19
|
-
__exportStar(require("./helius_geyser_ws"), exports);
|
|
20
17
|
__exportStar(require("./quote"), exports);
|
|
21
|
-
__exportStar(require("./send_tx"), exports);
|
|
22
|
-
__exportStar(require("./trade"), exports);
|
|
23
|
-
__exportStar(require("./token"), exports);
|
package/dist/quote/index.d.ts
CHANGED
package/dist/quote/index.js
CHANGED
|
@@ -14,6 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
__exportStar(require("./publish_quote_price"), exports);
|
|
19
|
-
__exportStar(require("./to_price_message"), exports);
|
|
17
|
+
__exportStar(require("./pricing"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './token_price_cache';
|
|
@@ -14,4 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
17
|
+
__exportStar(require("./token_price_cache"), exports);
|
|
@@ -0,0 +1,39 @@
|
|
|
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.TokenPriceCache = void 0;
|
|
13
|
+
const dist_1 = require("@clonegod/ttd-core/dist");
|
|
14
|
+
class TokenPriceCache {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.tokenPriceCache = new Map();
|
|
17
|
+
this.PRICE_CACHE_TIMEOUT_MILLS = parseInt(process.env.PRICE_CACHE_TIMEOUT_MILLS || Number(1000 * 60 * 60 * 1).toString());
|
|
18
|
+
(0, dist_1.log_info)(`代币价格缓存超时时间: ${this.PRICE_CACHE_TIMEOUT_MILLS} ms`);
|
|
19
|
+
}
|
|
20
|
+
getTokenPrice(tokenAddress) {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
const cachedData = this.tokenPriceCache.get(tokenAddress);
|
|
24
|
+
if (cachedData && (now - cachedData.timestamp) < this.PRICE_CACHE_TIMEOUT_MILLS) {
|
|
25
|
+
(0, dist_1.log_debug)(`use cached token price: ${tokenAddress}, price: ${cachedData.price}`, '');
|
|
26
|
+
return cachedData;
|
|
27
|
+
}
|
|
28
|
+
const priceMap = yield (0, dist_1.get_solana_token_price_info)([tokenAddress]);
|
|
29
|
+
const tokenPrice = priceMap.get(tokenAddress);
|
|
30
|
+
if (!tokenPrice || !tokenPrice.price || Number(tokenPrice.price) <= 0) {
|
|
31
|
+
throw new Error(`无法获取代币 ${tokenAddress} 的有效USD价格`);
|
|
32
|
+
}
|
|
33
|
+
const newPrice = { price: tokenPrice.price, timestamp: now };
|
|
34
|
+
this.tokenPriceCache.set(tokenAddress, newPrice);
|
|
35
|
+
return newPrice;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.TokenPriceCache = TokenPriceCache;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clonegod/ttd-sol-common",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "types/index.d.ts",
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
"push": "npm run build && npm publish"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@clonegod/ttd-core": "2.1.
|
|
17
|
-
"@metaplex-foundation/mpl-token-metadata": "^2.5.2",
|
|
16
|
+
"@clonegod/ttd-core": "2.1.2",
|
|
18
17
|
"@solana/web3.js": "1.91.6",
|
|
19
18
|
"rpc-websockets": "7.10.0",
|
|
20
19
|
"axios": "^1.2.3",
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './quote'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './pricing'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './token_price_cache'
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { get_solana_token_price_info, log_debug, log_info } from "@clonegod/ttd-core/dist";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 代币价格管理器
|
|
5
|
+
* 负责获取和缓存代币价格
|
|
6
|
+
*/
|
|
7
|
+
export class TokenPriceCache {
|
|
8
|
+
// 代币相对美元(USD)的市场价格-缓存
|
|
9
|
+
private tokenPriceCache: Map<string, { price: string, timestamp: number }> = new Map();
|
|
10
|
+
private readonly PRICE_CACHE_TIMEOUT_MILLS: number;
|
|
11
|
+
|
|
12
|
+
constructor() {
|
|
13
|
+
this.PRICE_CACHE_TIMEOUT_MILLS = parseInt(process.env.PRICE_CACHE_TIMEOUT_MILLS || Number(1000 * 60 * 60 * 1).toString());
|
|
14
|
+
log_info(`代币价格缓存超时时间: ${this.PRICE_CACHE_TIMEOUT_MILLS} ms`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 获取代币价格,优先使用缓存
|
|
19
|
+
* @param tokenAddress 代币地址
|
|
20
|
+
* @returns 代币价格信息
|
|
21
|
+
*/
|
|
22
|
+
public async getTokenPrice(tokenAddress: string): Promise<{ price: string, timestamp: number }> {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
|
|
25
|
+
// 检查缓存
|
|
26
|
+
const cachedData = this.tokenPriceCache.get(tokenAddress);
|
|
27
|
+
if (cachedData && (now - cachedData.timestamp) < this.PRICE_CACHE_TIMEOUT_MILLS) {
|
|
28
|
+
log_debug(`use cached token price: ${tokenAddress}, price: ${cachedData.price}`, '');
|
|
29
|
+
return cachedData;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 缓存不存在或已过期,请求最新价格
|
|
33
|
+
// log_info(`获取代币${tokenAddress}的最新价格`, '');
|
|
34
|
+
const priceMap = await get_solana_token_price_info([tokenAddress]);
|
|
35
|
+
const tokenPrice = priceMap.get(tokenAddress);
|
|
36
|
+
|
|
37
|
+
if (!tokenPrice || !tokenPrice.price || Number(tokenPrice.price) <= 0) {
|
|
38
|
+
throw new Error(`无法获取代币 ${tokenAddress} 的有效USD价格`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 更新缓存
|
|
42
|
+
const newPrice = { price: tokenPrice.price, timestamp: now };
|
|
43
|
+
this.tokenPriceCache.set(tokenAddress, newPrice);
|
|
44
|
+
|
|
45
|
+
return newPrice;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"typeRoots": [
|
|
4
|
+
"./node_modules/@types",
|
|
5
|
+
"./types",
|
|
6
|
+
],
|
|
7
|
+
"lib": [
|
|
8
|
+
"es2015"
|
|
9
|
+
],
|
|
10
|
+
"module": "CommonJS",
|
|
11
|
+
"target": "es6",
|
|
12
|
+
"rootDirs": [
|
|
13
|
+
"src"
|
|
14
|
+
],
|
|
15
|
+
"outDir": "./dist",
|
|
16
|
+
"declaration": true,
|
|
17
|
+
"esModuleInterop": true,
|
|
18
|
+
"skipLibCheck": true,
|
|
19
|
+
"resolveJsonModule": true,
|
|
20
|
+
"removeComments": true,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { ArbCache, ArbEventSubscriber, TradeResponseType, TradeRuntimeType } from "@clonegod/ttd-core";
|
|
2
|
-
import { Connection, Keypair } from "@solana/web3.js";
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
4
|
-
import { AbastrcatTrade } from "../trade";
|
|
5
|
-
import { EnvArgs } from "./env_args";
|
|
6
|
-
export declare class AppConfig extends EventEmitter {
|
|
7
|
-
env_args: EnvArgs;
|
|
8
|
-
app_full_name: string;
|
|
9
|
-
arb_cache: ArbCache;
|
|
10
|
-
arb_event_subscriber: ArbEventSubscriber;
|
|
11
|
-
is_already_subscribe_wallet_raw_txn: boolean;
|
|
12
|
-
query_token_market_price_url: string;
|
|
13
|
-
trade_runtime: TradeRuntimeType;
|
|
14
|
-
connection: Connection;
|
|
15
|
-
keypair: Keypair;
|
|
16
|
-
constructor();
|
|
17
|
-
init(): Promise<void>;
|
|
18
|
-
init_trade_runtime(): Promise<void>;
|
|
19
|
-
subscribe_config_change(): Promise<void>;
|
|
20
|
-
subscribe_order_event(trade_instance: AbastrcatTrade): Promise<void>;
|
|
21
|
-
subscribe_wallet_raw_txn_event(): Promise<void>;
|
|
22
|
-
cache_trade_result(trade_response: TradeResponseType): Promise<void>;
|
|
23
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
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 dist_1 = require("@clonegod/ttd-core/dist");
|
|
17
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
18
|
-
const bs58_1 = __importDefault(require("bs58"));
|
|
19
|
-
const events_1 = require("events");
|
|
20
|
-
const common_1 = require("../common");
|
|
21
|
-
const trade_1 = require("../trade");
|
|
22
|
-
const env_args_1 = require("./env_args");
|
|
23
|
-
class AppConfig extends events_1.EventEmitter {
|
|
24
|
-
constructor() {
|
|
25
|
-
super();
|
|
26
|
-
this.is_already_subscribe_wallet_raw_txn = false;
|
|
27
|
-
this.env_args = new env_args_1.EnvArgs();
|
|
28
|
-
let { chain_id, app_name } = this.env_args;
|
|
29
|
-
this.app_full_name = app_name;
|
|
30
|
-
global.appConfig = this;
|
|
31
|
-
}
|
|
32
|
-
init() {
|
|
33
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
this.arb_cache = (0, dist_1.getArbCache)(this.env_args);
|
|
35
|
-
yield this.arb_cache.init();
|
|
36
|
-
this.arb_cache.listen_trade_result(this);
|
|
37
|
-
let commitment = process.env.CONNECTION_COMMITMENT_LEVEL || common_1.COMMITMENT_LEVEL.CONFIRMED;
|
|
38
|
-
this.connection = new web3_js_1.Connection(this.env_args.rpc_endpoint, {
|
|
39
|
-
commitment,
|
|
40
|
-
});
|
|
41
|
-
let common_service_config = yield this.arb_cache.get_common_service();
|
|
42
|
-
if ((0, dist_1.isEmpty)(common_service_config)) {
|
|
43
|
-
throw new Error(`get_common_service from cache failed! read from cache=${(0, dist_1.to_json_str)(common_service_config)}`);
|
|
44
|
-
}
|
|
45
|
-
let { config_center } = common_service_config;
|
|
46
|
-
this.query_token_market_price_url = this.env_args.token_price_url
|
|
47
|
-
.replace('${config_center_http_port}', config_center.http_port + '')
|
|
48
|
-
.replace('${chain_id}', this.env_args.chain_id);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
init_trade_runtime() {
|
|
52
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
try {
|
|
54
|
-
let { chain_id, dex_id_list, trade_group_id, trade_pair } = this.env_args;
|
|
55
|
-
this.trade_runtime = yield this.arb_cache.create_trade_runtime(chain_id, trade_group_id, dex_id_list[0], trade_pair);
|
|
56
|
-
this.trade_runtime.wallet_token_accounts = new Map();
|
|
57
|
-
let secret_key = new Uint8Array(bs58_1.default.decode(this.trade_runtime.wallet.private_key));
|
|
58
|
-
this.keypair = web3_js_1.Keypair.fromSecretKey(secret_key);
|
|
59
|
-
}
|
|
60
|
-
catch (err) {
|
|
61
|
-
(0, dist_1.log_error)(`create_trade_runtime error!`, err);
|
|
62
|
-
yield (0, dist_1.sleep)(1000);
|
|
63
|
-
process.exit(0);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
subscribe_config_change() {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
this.arb_event_subscriber = (0, dist_1.getArbEventSubscriber)(this.arb_cache);
|
|
70
|
-
yield this.arb_event_subscriber.pre_load_config_cache();
|
|
71
|
-
const refresh_trade_runtime = (is_sussess, event) => __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
(0, dist_1.log_info)(`subscribe_config_change_event, callback`, { is_sussess, event });
|
|
73
|
-
if (event.event_type === dist_1.REDIS_EVENT_TYPE_CONFIG_CHANGE.GROUP_CONFIG_CHANGE) {
|
|
74
|
-
if (!this.trade_runtime) {
|
|
75
|
-
(0, dist_1.log_warn)(`refresh_trade_runtime, skip...`);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
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);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
yield this.arb_event_subscriber.subscribe_config_change_event(refresh_trade_runtime);
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
subscribe_order_event(trade_instance) {
|
|
85
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
-
let handler = (message) => (0, trade_1.handle_order_message)(this, trade_instance, message);
|
|
87
|
-
let group_id = this.trade_runtime.group.id;
|
|
88
|
-
let pair_name = this.trade_runtime.pair_name;
|
|
89
|
-
let dex_id = this.trade_runtime.dex_id;
|
|
90
|
-
yield this.arb_event_subscriber.subscribe_order_event(group_id, pair_name, dex_id, handler);
|
|
91
|
-
(0, dist_1.log_info)(`subscribe_order_event, success`, { dex_id, group_id, pair_name });
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
subscribe_wallet_raw_txn_event() {
|
|
95
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
-
if (this.is_already_subscribe_wallet_raw_txn) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
this.is_already_subscribe_wallet_raw_txn = true;
|
|
100
|
-
let handler = (data) => {
|
|
101
|
-
let { txid, tx_data } = JSON.parse(data);
|
|
102
|
-
let transaction_data = {
|
|
103
|
-
params: {
|
|
104
|
-
result: {
|
|
105
|
-
signature: txid,
|
|
106
|
-
slot: tx_data.slot,
|
|
107
|
-
transaction: {
|
|
108
|
-
transaction: tx_data.transaction.transaction,
|
|
109
|
-
meta: tx_data.transaction.meta,
|
|
110
|
-
version: 0
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
this.emit(common_1.LOCAL_EVENT_NAME.EVENT_WALLET_TRANSACTION + '#' + txid, transaction_data);
|
|
116
|
-
};
|
|
117
|
-
let group_id = this.trade_runtime.group.id;
|
|
118
|
-
yield this.arb_event_subscriber.subscribe_wallet_raw_tx_result(group_id, '', handler);
|
|
119
|
-
(0, dist_1.log_info)(`subscribe_wallet_raw_txn_event, success! group_id=${group_id}`);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
cache_trade_result(trade_response) {
|
|
123
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
-
try {
|
|
125
|
-
(0, dist_1.log_info)(`cache_trade_result`, trade_response);
|
|
126
|
-
yield this.arb_cache.cache_trade_result(trade_response);
|
|
127
|
-
}
|
|
128
|
-
catch (err) {
|
|
129
|
-
(0, dist_1.log_error)(`cache_trade_result error!`, err);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.AppConfig = AppConfig;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { CHAIN_ID, DEX_ID } from "@clonegod/ttd-core/dist";
|
|
2
|
-
export declare class EnvArgs {
|
|
3
|
-
chain_id: CHAIN_ID;
|
|
4
|
-
app_name: string;
|
|
5
|
-
redis_host: string;
|
|
6
|
-
redis_port: string;
|
|
7
|
-
dex_id: DEX_ID;
|
|
8
|
-
geyser_ws_url: string;
|
|
9
|
-
token_price_url: string;
|
|
10
|
-
auto_quote_enable: boolean;
|
|
11
|
-
auto_quote_interval_seconds: number;
|
|
12
|
-
quote_pair_list: string[];
|
|
13
|
-
dex_id_list: string[];
|
|
14
|
-
trade_group_id: string;
|
|
15
|
-
trade_pair: string;
|
|
16
|
-
ws_endpoint: string;
|
|
17
|
-
rpc_endpoint: string;
|
|
18
|
-
helius_laser_stream_url: string;
|
|
19
|
-
helius_api_key: string;
|
|
20
|
-
quote_pair: string;
|
|
21
|
-
quote_pool_name: string;
|
|
22
|
-
quote_pool_fee_rate: number;
|
|
23
|
-
quote_pool_address: string;
|
|
24
|
-
quote_amount_usd: number;
|
|
25
|
-
constructor();
|
|
26
|
-
init(): void;
|
|
27
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EnvArgs = void 0;
|
|
4
|
-
const dist_1 = require("@clonegod/ttd-core/dist");
|
|
5
|
-
class EnvArgs {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.init();
|
|
8
|
-
}
|
|
9
|
-
init() {
|
|
10
|
-
var _a;
|
|
11
|
-
this.dex_id_list = (process.env.DEX_ID_LIST || '').split(',');
|
|
12
|
-
this.trade_pair = process.env.TRADE_PAIR;
|
|
13
|
-
this.trade_group_id = process.env.TRADE_GROUP_ID;
|
|
14
|
-
this.app_name = `${this.trade_pair}_${this.dex_id_list[0]}_${this.trade_group_id}`;
|
|
15
|
-
this.chain_id = process.env.CHAIN_ID.toUpperCase();
|
|
16
|
-
if ((0, dist_1.isEmpty)(this.chain_id)) {
|
|
17
|
-
throw new Error(`environment: CHAIN_ID is empty!!!`);
|
|
18
|
-
}
|
|
19
|
-
this.redis_host = process.env.REDIS_HOST;
|
|
20
|
-
this.redis_port = process.env.REDIS_PORT;
|
|
21
|
-
this.geyser_ws_url = `wss://atlas-mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`;
|
|
22
|
-
this.token_price_url = process.env.TOKEN_PRICE_URL;
|
|
23
|
-
this.auto_quote_enable = process.env.AUTO_QUOTE_ENABLE === 'true';
|
|
24
|
-
this.auto_quote_interval_seconds = parseInt(process.env.AUTO_QUOTE_INTERVAL_SECONDS || '60');
|
|
25
|
-
this.quote_pair_list = (process.env.QUOTE_PAIR_LIST || '').split(',');
|
|
26
|
-
this.dex_id = (_a = process.env.DEX_ID) === null || _a === void 0 ? void 0 : _a.toUpperCase();
|
|
27
|
-
this.quote_pair = process.env.QUOTE_PAIR;
|
|
28
|
-
this.quote_pool_name = process.env.QUOTE_POOL_NAME;
|
|
29
|
-
this.quote_pool_fee_rate = parseInt(process.env.QUOTE_POOL_FEE_RATE || '0');
|
|
30
|
-
this.quote_pool_address = process.env.QUOTE_POOL_ADDRESS;
|
|
31
|
-
this.quote_amount_usd = parseInt(process.env.QUOTE_AMOUNT_USD || '100');
|
|
32
|
-
this.ws_endpoint = process.env.WS_ENDPOINT;
|
|
33
|
-
this.rpc_endpoint = process.env.RPC_ENDPOINT;
|
|
34
|
-
this.helius_laser_stream_url = process.env.HELIUS_LASER_STREAM_URL;
|
|
35
|
-
this.helius_api_key = process.env.HELIUS_API_KEY;
|
|
36
|
-
(0, dist_1.log_info)('Env args init finish', this);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.EnvArgs = EnvArgs;
|
package/dist/appconfig/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
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
|
-
__exportStar(require("./app_config"), exports);
|
|
18
|
-
__exportStar(require("./env_args"), exports);
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export declare const MAX_GAS_FEE: number;
|
|
2
|
-
export declare const ONE_MILLION = 1000000;
|
|
3
|
-
export declare enum COMMITMENT_LEVEL {
|
|
4
|
-
PROCESSED = "processed",
|
|
5
|
-
CONFIRMED = "confirmed",
|
|
6
|
-
_FINALIZED = "finalized"
|
|
7
|
-
}
|
|
8
|
-
export declare enum LOCAL_EVENT_NAME {
|
|
9
|
-
EVENT_POOL_ACCOUNT_CHANGE = "EVENT_POOL_ACCOUNT_CHANGE",
|
|
10
|
-
EVENT_WALLET_TRANSACTION = "EVENT_WALLET_TRANSACTION",
|
|
11
|
-
EVENT_WALLET_TRANSACTION_NEW_TXID = "EVENT_WALLET_TRANSACTION_NEW_TXID"
|
|
12
|
-
}
|
package/dist/common/constants.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.LOCAL_EVENT_NAME = exports.COMMITMENT_LEVEL = exports.ONE_MILLION = exports.MAX_GAS_FEE = void 0;
|
|
4
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
-
exports.MAX_GAS_FEE = web3_js_1.LAMPORTS_PER_SOL / 1000;
|
|
6
|
-
exports.ONE_MILLION = 1000000;
|
|
7
|
-
var COMMITMENT_LEVEL;
|
|
8
|
-
(function (COMMITMENT_LEVEL) {
|
|
9
|
-
COMMITMENT_LEVEL["PROCESSED"] = "processed";
|
|
10
|
-
COMMITMENT_LEVEL["CONFIRMED"] = "confirmed";
|
|
11
|
-
COMMITMENT_LEVEL["_FINALIZED"] = "finalized";
|
|
12
|
-
})(COMMITMENT_LEVEL || (exports.COMMITMENT_LEVEL = COMMITMENT_LEVEL = {}));
|
|
13
|
-
var LOCAL_EVENT_NAME;
|
|
14
|
-
(function (LOCAL_EVENT_NAME) {
|
|
15
|
-
LOCAL_EVENT_NAME["EVENT_POOL_ACCOUNT_CHANGE"] = "EVENT_POOL_ACCOUNT_CHANGE";
|
|
16
|
-
LOCAL_EVENT_NAME["EVENT_WALLET_TRANSACTION"] = "EVENT_WALLET_TRANSACTION";
|
|
17
|
-
LOCAL_EVENT_NAME["EVENT_WALLET_TRANSACTION_NEW_TXID"] = "EVENT_WALLET_TRANSACTION_NEW_TXID";
|
|
18
|
-
})(LOCAL_EVENT_NAME || (exports.LOCAL_EVENT_NAME = LOCAL_EVENT_NAME = {}));
|
package/dist/common/context.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { OrderMessageType, PriceMessageType, StandardPoolInfoType, TradeRuntimeType } from "@clonegod/ttd-core";
|
|
2
|
-
import { CHAIN_ID, DEX_ID } from "@clonegod/ttd-core/dist";
|
|
3
|
-
import { Connection } from "@solana/web3.js";
|
|
4
|
-
import { SolanaTradeRuntimeType } from "../../types";
|
|
5
|
-
import { AppConfig } from "../appconfig";
|
|
6
|
-
export declare class TradeContext {
|
|
7
|
-
connection: Connection;
|
|
8
|
-
trade_runtime: TradeRuntimeType;
|
|
9
|
-
solana_trade_runtime: SolanaTradeRuntimeType;
|
|
10
|
-
price_msg: PriceMessageType;
|
|
11
|
-
order_msg: OrderMessageType;
|
|
12
|
-
order_trace_id: string;
|
|
13
|
-
group_id: string;
|
|
14
|
-
chain_id: CHAIN_ID;
|
|
15
|
-
dex_id: DEX_ID;
|
|
16
|
-
pool_id: string;
|
|
17
|
-
fee_rate: string;
|
|
18
|
-
pool_info: StandardPoolInfoType;
|
|
19
|
-
aToB: boolean;
|
|
20
|
-
slippage_bps: number;
|
|
21
|
-
constructor(price_msg: PriceMessageType, order_msg: OrderMessageType);
|
|
22
|
-
init(appConfig: AppConfig): Promise<void>;
|
|
23
|
-
}
|
package/dist/common/context.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.TradeContext = void 0;
|
|
13
|
-
const dist_1 = require("@clonegod/ttd-core/dist");
|
|
14
|
-
const send_tx_1 = require("../send_tx");
|
|
15
|
-
class TradeContext {
|
|
16
|
-
constructor(price_msg, order_msg) {
|
|
17
|
-
this.price_msg = price_msg;
|
|
18
|
-
this.order_msg = order_msg;
|
|
19
|
-
this.order_trace_id = order_msg.order_trace_id;
|
|
20
|
-
}
|
|
21
|
-
init(appConfig) {
|
|
22
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
this.connection = appConfig.connection;
|
|
24
|
-
this.trade_runtime = appConfig.trade_runtime;
|
|
25
|
-
let { group_id, unique_orderbook_id } = this.order_msg;
|
|
26
|
-
this.group_id = group_id;
|
|
27
|
-
let unique_orderbook_id_obj = (0, dist_1.parse_unique_orderbook_id)(unique_orderbook_id);
|
|
28
|
-
this.chain_id = dist_1.CHAIN_ID[unique_orderbook_id_obj.chain_id];
|
|
29
|
-
this.dex_id = dist_1.DEX_ID[unique_orderbook_id_obj.dex_id];
|
|
30
|
-
this.pool_id = unique_orderbook_id_obj.pool_id;
|
|
31
|
-
this.fee_rate = unique_orderbook_id_obj.fee_rate;
|
|
32
|
-
this.pool_info = yield appConfig.arb_cache.get_one_pool_info(this.pool_id);
|
|
33
|
-
if (!this.pool_info) {
|
|
34
|
-
throw new Error(`Not found pool_info! pool_id=${this.pool_id}, pool_info_list=${JSON.stringify(this.trade_runtime.pair_dex.pool_info_list)}`);
|
|
35
|
-
}
|
|
36
|
-
let { inputToken, outputToken } = (0, dist_1.get_input_out_token)(this.pool_info, this.order_msg.aToB);
|
|
37
|
-
let { amount } = this.order_msg;
|
|
38
|
-
let amount_dot_index = amount.indexOf('.');
|
|
39
|
-
if (amount_dot_index != -1) {
|
|
40
|
-
let amount_with_exact_decimals = amount.substring(0, amount_dot_index + inputToken.decimals + 1);
|
|
41
|
-
let uiAmount = parseFloat(amount_with_exact_decimals).toString();
|
|
42
|
-
this.order_msg.amount = uiAmount;
|
|
43
|
-
(0, dist_1.log_warn)(`Fix input token's amount decimal: from ${amount} to ${uiAmount}`);
|
|
44
|
-
}
|
|
45
|
-
this.slippage_bps = Math.min(300, Math.max(0, this.trade_runtime.settings.slippage_bps));
|
|
46
|
-
this.aToB = this.pool_info.is_reverse_token ? !this.order_msg.aToB : this.order_msg.aToB;
|
|
47
|
-
this.solana_trade_runtime = yield (0, send_tx_1.create_solana_trade_runtime)(this.connection, this.trade_runtime, this.pool_info);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
exports.TradeContext = TradeContext;
|
package/dist/common/index.d.ts
DELETED
package/dist/common/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
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
|
-
__exportStar(require("./constants"), exports);
|
|
18
|
-
__exportStar(require("./context"), exports);
|
|
@@ -1,19 +0,0 @@
|
|
|
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
|
-
__exportStar(require("./subscribe_pool_change_by_geyser"), exports);
|
|
18
|
-
__exportStar(require("./subscribe_wallet_transaction"), exports);
|
|
19
|
-
__exportStar(require("./subscribe_txid"), exports);
|