@clonegod/ttd-base-common 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/common/abi.d.ts +1 -0
  2. package/dist/common/abi.js +14 -0
  3. package/dist/common/constants.d.ts +18 -0
  4. package/dist/common/constants.js +34 -0
  5. package/dist/common/index.d.ts +2 -0
  6. package/dist/common/index.js +18 -0
  7. package/dist/config/base_env_args.d.ts +11 -0
  8. package/dist/config/base_env_args.js +19 -0
  9. package/dist/config/bsc_env_args.d.ts +11 -0
  10. package/dist/config/bsc_env_args.js +19 -0
  11. package/dist/config/index.d.ts +1 -0
  12. package/dist/config/index.js +17 -0
  13. package/dist/index.d.ts +7 -0
  14. package/dist/index.js +23 -0
  15. package/dist/quote/event/index.d.ts +1 -0
  16. package/dist/quote/event/index.js +17 -0
  17. package/dist/quote/event/pool_event_listener.d.ts +53 -0
  18. package/dist/quote/event/pool_event_listener.js +334 -0
  19. package/dist/quote/event/verify_clmm_swap_event.d.ts +1 -0
  20. package/dist/quote/event/verify_clmm_swap_event.js +178 -0
  21. package/dist/quote/index.d.ts +2 -0
  22. package/dist/quote/index.js +18 -0
  23. package/dist/quote/pricing/index.d.ts +2 -0
  24. package/dist/quote/pricing/index.js +18 -0
  25. package/dist/quote/pricing/pool.d.ts +13 -0
  26. package/dist/quote/pricing/pool.js +21 -0
  27. package/dist/quote/pricing/token_price_cache.d.ts +10 -0
  28. package/dist/quote/pricing/token_price_cache.js +40 -0
  29. package/dist/redis/index.d.ts +1 -0
  30. package/dist/redis/index.js +17 -0
  31. package/dist/redis/redis_client.d.ts +21 -0
  32. package/dist/redis/redis_client.js +155 -0
  33. package/dist/trade/abstract_dex_trade.d.ts +27 -0
  34. package/dist/trade/abstract_dex_trade.js +153 -0
  35. package/dist/trade/abstract_dex_trade_plus.d.ts +30 -0
  36. package/dist/trade/abstract_dex_trade_plus.js +227 -0
  37. package/dist/trade/check/index.d.ts +1 -0
  38. package/dist/trade/check/index.js +17 -0
  39. package/dist/trade/check/tx_websocket_manager.d.ts +23 -0
  40. package/dist/trade/check/tx_websocket_manager.js +119 -0
  41. package/dist/trade/index.d.ts +5 -0
  42. package/dist/trade/index.js +21 -0
  43. package/dist/trade/parse/abstract_parser.d.ts +8 -0
  44. package/dist/trade/parse/abstract_parser.js +2 -0
  45. package/dist/trade/parse/base_parser.d.ts +19 -0
  46. package/dist/trade/parse/base_parser.js +69 -0
  47. package/dist/trade/parse/index.d.ts +1 -0
  48. package/dist/trade/parse/index.js +5 -0
  49. package/dist/trade/send/48club.d.ts +18 -0
  50. package/dist/trade/send/48club.js +97 -0
  51. package/dist/trade/send/blockrazor.d.ts +7 -0
  52. package/dist/trade/send/blockrazor.js +79 -0
  53. package/dist/trade/send/bsc_rpc.d.ts +6 -0
  54. package/dist/trade/send/bsc_rpc.js +43 -0
  55. package/dist/trade/send/index.d.ts +5 -0
  56. package/dist/trade/send/index.js +23 -0
  57. package/dist/trade/send/send_tx.d.ts +8 -0
  58. package/dist/trade/send/send_tx.js +91 -0
  59. package/dist/types/config_types.d.ts +28 -0
  60. package/dist/types/config_types.js +2 -0
  61. package/dist/types/event_types.d.ts +30 -0
  62. package/dist/types/event_types.js +2 -0
  63. package/dist/types/index.d.ts +4 -0
  64. package/dist/types/index.js +20 -0
  65. package/dist/types/quote_types.d.ts +27 -0
  66. package/dist/types/quote_types.js +2 -0
  67. package/dist/types/trade_types.d.ts +38 -0
  68. package/dist/types/trade_types.js +8 -0
  69. package/dist/utils/gas_helper.d.ts +5 -0
  70. package/dist/utils/gas_helper.js +72 -0
  71. package/dist/utils/index.d.ts +7 -0
  72. package/dist/utils/index.js +43 -0
  73. package/package.json +30 -0
@@ -0,0 +1,69 @@
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.BaseTxParser = void 0;
13
+ const dist_1 = require("@clonegod/ttd-core/dist");
14
+ const ethers_1 = require("ethers");
15
+ class BaseTxParser {
16
+ constructor(config) {
17
+ this.blockTimeCache = new Map();
18
+ this.CACHE_EXPIRY = 1000 * 60 * 60;
19
+ this.config = config;
20
+ this.provider = new ethers_1.ethers.providers.JsonRpcProvider(config.rpcEndpoint);
21
+ }
22
+ getBlockTime(blockNumber) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ if (process.env.NEED_BLOCK_TIME_INFO !== 'true') {
25
+ return 0;
26
+ }
27
+ try {
28
+ if (this.blockTimeCache.has(blockNumber)) {
29
+ return this.blockTimeCache.get(blockNumber);
30
+ }
31
+ const block = yield this.provider.getBlock(blockNumber);
32
+ const timestamp = block.timestamp * 1000;
33
+ this.blockTimeCache.set(blockNumber, timestamp);
34
+ setTimeout(() => {
35
+ this.blockTimeCache.delete(blockNumber);
36
+ }, this.CACHE_EXPIRY);
37
+ return timestamp;
38
+ }
39
+ catch (error) {
40
+ console.error('获取区块时间失败:', error);
41
+ return 0;
42
+ }
43
+ });
44
+ }
45
+ calculateGasFee(txReceipt) {
46
+ try {
47
+ const gasUsed = txReceipt.gasUsed || ethers_1.ethers.BigNumber.from(0);
48
+ const effectiveGasPrice = txReceipt.effectiveGasPrice || ethers_1.ethers.BigNumber.from(0);
49
+ const gasFeeBN = gasUsed.mul(effectiveGasPrice);
50
+ const base_fee = Number(ethers_1.ethers.utils.formatEther(gasFeeBN));
51
+ const priority_fee = 0;
52
+ const total_fee = base_fee + priority_fee;
53
+ return {
54
+ base_fee,
55
+ priority_fee,
56
+ total_fee
57
+ };
58
+ }
59
+ catch (error) {
60
+ (0, dist_1.log_error)('calculateGasFee error:', error);
61
+ return {
62
+ base_fee: 0,
63
+ priority_fee: 0,
64
+ total_fee: 0
65
+ };
66
+ }
67
+ }
68
+ }
69
+ exports.BaseTxParser = BaseTxParser;
@@ -0,0 +1 @@
1
+ export { BaseTxParser } from './base_parser';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseTxParser = void 0;
4
+ var base_parser_1 = require("./base_parser");
5
+ Object.defineProperty(exports, "BaseTxParser", { enumerable: true, get: function () { return base_parser_1.BaseTxParser; } });
@@ -0,0 +1,18 @@
1
+ export declare const _48CLUB_BUILDER_CONTROL_EOA = "0x4848489f0b2BEdd788c696e2D79b6b69D7484848";
2
+ export interface BundleParams {
3
+ txs: string[];
4
+ maxBlockNumber?: number;
5
+ maxTimestamp?: number;
6
+ revertingTxHashes?: string[];
7
+ noMerge?: boolean;
8
+ backrunTarget?: string;
9
+ }
10
+ export declare class _48ClubTrade {
11
+ private rpcUrl;
12
+ private soulPointSignature?;
13
+ private provider;
14
+ constructor(soulPointSignature?: string);
15
+ sendPrivateTransaction(signedTx: string): Promise<string>;
16
+ _sendPrivateTransactionWith48SP(signedTx: string): Promise<string>;
17
+ sendBundle(params: BundleParams): Promise<string>;
18
+ }
@@ -0,0 +1,97 @@
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._48ClubTrade = exports._48CLUB_BUILDER_CONTROL_EOA = void 0;
16
+ const axios_1 = __importDefault(require("axios"));
17
+ const ethers_1 = require("ethers");
18
+ exports._48CLUB_BUILDER_CONTROL_EOA = '0x4848489f0b2BEdd788c696e2D79b6b69D7484848';
19
+ class _48ClubTrade {
20
+ constructor(soulPointSignature) {
21
+ this.rpcUrl = process.env._48CLUB_RPC_URL || 'https://puissant-builder.48.club/';
22
+ this.soulPointSignature = soulPointSignature;
23
+ this.provider = new ethers_1.ethers.providers.JsonRpcProvider(this.rpcUrl);
24
+ }
25
+ sendPrivateTransaction(signedTx) {
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ try {
28
+ const response = yield axios_1.default.post(this.rpcUrl, {
29
+ jsonrpc: "2.0",
30
+ id: "1",
31
+ method: "eth_sendRawTransaction",
32
+ params: [signedTx]
33
+ });
34
+ if (response.data.error) {
35
+ throw new Error(`RPC Error: ${response.data.error.message}`);
36
+ }
37
+ return response.data.result;
38
+ }
39
+ catch (error) {
40
+ if (error instanceof Error) {
41
+ throw new Error(`48club sendPrivateTransaction failed!!! ${error.message}`);
42
+ }
43
+ throw new Error('48club sendPrivateTransaction failed!!! Unknown error');
44
+ }
45
+ });
46
+ }
47
+ _sendPrivateTransactionWith48SP(signedTx) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ try {
50
+ if (!this.soulPointSignature) {
51
+ throw new Error('48 SoulPoint signature is required');
52
+ }
53
+ const response = yield axios_1.default.post(this.rpcUrl, {
54
+ jsonrpc: "2.0",
55
+ id: "1",
56
+ method: "eth_sendPrivateTransactionWith48SP",
57
+ params: [signedTx, this.soulPointSignature]
58
+ });
59
+ if (response.data.error) {
60
+ throw new Error(`RPC Error: ${response.data.error.message}`);
61
+ }
62
+ return response.data.result;
63
+ }
64
+ catch (error) {
65
+ if (error instanceof Error) {
66
+ throw new Error(`48club sendPrivateTransactionWith48SP failed!!! ${error.message}`);
67
+ }
68
+ throw new Error('48club sendPrivateTransactionWith48SP failed!!! Unknown error');
69
+ }
70
+ });
71
+ }
72
+ sendBundle(params) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ try {
75
+ const currentTimestamp = Math.floor(Date.now() / 1000);
76
+ const requestParams = Object.assign({ txs: params.txs, maxBlockNumber: params.maxBlockNumber, maxTimestamp: params.maxTimestamp || currentTimestamp + 30, revertingTxHashes: params.revertingTxHashes, noMerge: params.noMerge, backrunTarget: params.backrunTarget }, (this.soulPointSignature ? { '48spSign': this.soulPointSignature } : {}));
77
+ const response = yield axios_1.default.post(this.rpcUrl, {
78
+ jsonrpc: "2.0",
79
+ id: "1",
80
+ method: "eth_sendBundle",
81
+ params: [requestParams]
82
+ });
83
+ if (response.data.error) {
84
+ throw new Error(`RPC Error: ${response.data.error.message}`);
85
+ }
86
+ return response.data.result;
87
+ }
88
+ catch (error) {
89
+ if (error instanceof Error) {
90
+ throw new Error(`48club sendBundle failed!!! ${error.message}`);
91
+ }
92
+ throw new Error('48club sendBundle failed!!! Unknown error');
93
+ }
94
+ });
95
+ }
96
+ }
97
+ exports._48ClubTrade = _48ClubTrade;
@@ -0,0 +1,7 @@
1
+ export declare class BlockRazorTrade {
2
+ private rpcUrl;
3
+ private authToken;
4
+ constructor();
5
+ sendPrivateTransaction(signedTx: string): Promise<string>;
6
+ sendBundle(transactions: string[], maxBlockNumber?: number, revertingTxHashes?: string[]): Promise<string>;
7
+ }
@@ -0,0 +1,79 @@
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.BlockRazorTrade = void 0;
16
+ const dist_1 = require("@clonegod/ttd-core/dist");
17
+ const axios_1 = __importDefault(require("axios"));
18
+ class BlockRazorTrade {
19
+ constructor() {
20
+ this.rpcUrl = process.env.BLOCKRAZOR_RPC_URL || 'https://rpc.blockrazor.builders';
21
+ this.authToken = process.env.BLOCKRAZOR_AUTH_TOKEN || '';
22
+ }
23
+ sendPrivateTransaction(signedTx) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ try {
26
+ const response = yield axios_1.default.post(this.rpcUrl, {
27
+ jsonrpc: "2.0",
28
+ id: "1",
29
+ method: "eth_sendPrivateTransaction",
30
+ params: [signedTx]
31
+ }, {
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ 'Authorization': this.authToken
35
+ }
36
+ });
37
+ if (response.data.error) {
38
+ throw new Error(`交易发送失败: ${response.data.error.code} - ${response.data.error.message}`);
39
+ }
40
+ return response.data.result;
41
+ }
42
+ catch (error) {
43
+ (0, dist_1.log_error)('blockrazor sendPrivateTransaction failed!!!', error);
44
+ throw error;
45
+ }
46
+ });
47
+ }
48
+ sendBundle(transactions, maxBlockNumber, revertingTxHashes) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ try {
51
+ const currentTimestamp = Math.floor(Date.now() / 1000);
52
+ const response = yield axios_1.default.post(this.rpcUrl, {
53
+ jsonrpc: "2.0",
54
+ id: "1",
55
+ method: "eth_sendBundle",
56
+ params: [{
57
+ txs: transactions,
58
+ minTimestamp: currentTimestamp + 1,
59
+ maxTimestamp: currentTimestamp + 30,
60
+ }]
61
+ }, {
62
+ headers: {
63
+ 'Content-Type': 'application/json',
64
+ 'Authorization': this.authToken,
65
+ }
66
+ });
67
+ if (response.data.error) {
68
+ throw new Error(`Bundle 发送失败: ${response.data.error.message}`);
69
+ }
70
+ return response.data.result;
71
+ }
72
+ catch (error) {
73
+ (0, dist_1.log_error)('blockrazor sendBundle failed!!!', error);
74
+ throw error;
75
+ }
76
+ });
77
+ }
78
+ }
79
+ exports.BlockRazorTrade = BlockRazorTrade;
@@ -0,0 +1,6 @@
1
+ export declare class BscRpc {
2
+ private url;
3
+ private headers;
4
+ constructor(rpc_endpoint: string);
5
+ eth_sendRawTransaction(signedTx: string): Promise<string>;
6
+ }
@@ -0,0 +1,43 @@
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.BscRpc = void 0;
13
+ class BscRpc {
14
+ constructor(rpc_endpoint) {
15
+ this.url = rpc_endpoint || process.env.BSC_RPC_ENDPOINT || '';
16
+ this.headers = new Headers();
17
+ this.headers.append("Content-Type", "application/json");
18
+ }
19
+ eth_sendRawTransaction(signedTx) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ console.log(`Sending transaction to ${this.url}`);
22
+ const raw = JSON.stringify({
23
+ jsonrpc: "2.0",
24
+ method: "eth_sendRawTransaction",
25
+ params: [signedTx],
26
+ id: 1
27
+ });
28
+ const requestOptions = {
29
+ method: 'POST',
30
+ headers: this.headers,
31
+ body: raw,
32
+ redirect: 'follow'
33
+ };
34
+ const response = yield fetch(this.url, requestOptions);
35
+ const result = yield response.json();
36
+ if (result.error) {
37
+ throw new Error(result.error.message);
38
+ }
39
+ return result.result;
40
+ });
41
+ }
42
+ }
43
+ exports.BscRpc = BscRpc;
@@ -0,0 +1,5 @@
1
+ export * from './send_tx';
2
+ export declare enum BSC_EOA_ADDRESS {
3
+ BLOCKRAZOR = "0x1266C6bE60392A8Ff346E8d5ECCd3E69dD9c5F20",
4
+ _48CLUB = "0x4848489f0b2BEdd788c696e2D79b6b69D7484848"
5
+ }
@@ -0,0 +1,23 @@
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.BSC_EOA_ADDRESS = void 0;
18
+ __exportStar(require("./send_tx"), exports);
19
+ var BSC_EOA_ADDRESS;
20
+ (function (BSC_EOA_ADDRESS) {
21
+ BSC_EOA_ADDRESS["BLOCKRAZOR"] = "0x1266C6bE60392A8Ff346E8d5ECCd3E69dD9c5F20";
22
+ BSC_EOA_ADDRESS["_48CLUB"] = "0x4848489f0b2BEdd788c696e2D79b6b69D7484848";
23
+ })(BSC_EOA_ADDRESS || (exports.BSC_EOA_ADDRESS = BSC_EOA_ADDRESS = {}));
@@ -0,0 +1,8 @@
1
+ import { AppConfig } from "@clonegod/ttd-core/dist";
2
+ export declare class TransactionSender {
3
+ private rpc;
4
+ private blockRazor;
5
+ private _48Club;
6
+ constructor(appConfig: AppConfig);
7
+ sendTransaction(signedMainTx: string, eoa_tip_transaction: (eoa_address: string) => Promise<string>, order_trace_id: string): Promise<string[]>;
8
+ }
@@ -0,0 +1,91 @@
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.TransactionSender = void 0;
13
+ const dist_1 = require("@clonegod/ttd-core/dist");
14
+ const blockrazor_1 = require("./blockrazor");
15
+ const bsc_rpc_1 = require("./bsc_rpc");
16
+ const _48club_1 = require("./48club");
17
+ const _1 = require(".");
18
+ class TransactionSender {
19
+ constructor(appConfig) {
20
+ this.rpc = new bsc_rpc_1.BscRpc(appConfig.env_args.rpc_endpoint);
21
+ this.blockRazor = new blockrazor_1.BlockRazorTrade();
22
+ this._48Club = new _48club_1._48ClubTrade();
23
+ }
24
+ sendTransaction(signedMainTx, eoa_tip_transaction, order_trace_id) {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ const rpcProviders = [
27
+ {
28
+ name: 'Default (QuickNode / Merkle)',
29
+ enable: process.env.SEND_TX_DEFAULT_RPC_PRIVATE === 'true',
30
+ send: () => __awaiter(this, void 0, void 0, function* () {
31
+ return yield this.rpc.eth_sendRawTransaction(signedMainTx);
32
+ })
33
+ },
34
+ {
35
+ name: 'BlockRazor - Private Transaction',
36
+ enable: process.env.SEND_TX_BLOCKRAZOR_PRIVATE === 'true',
37
+ send: () => __awaiter(this, void 0, void 0, function* () {
38
+ return yield this.blockRazor.sendPrivateTransaction(signedMainTx);
39
+ })
40
+ },
41
+ {
42
+ name: 'BlockRazor - sendBundle',
43
+ enable: process.env.SEND_TX_BLOCKRAZOR_BUNDLE === 'true',
44
+ send: () => __awaiter(this, void 0, void 0, function* () {
45
+ let bundle = [signedMainTx, yield eoa_tip_transaction(_1.BSC_EOA_ADDRESS.BLOCKRAZOR)];
46
+ return yield this.blockRazor.sendBundle(bundle);
47
+ })
48
+ },
49
+ {
50
+ name: '48Club - Private Transaction',
51
+ enable: process.env.SEND_TX_48CLUB_PRIVATE === 'true',
52
+ send: () => __awaiter(this, void 0, void 0, function* () {
53
+ return yield this._48Club.sendPrivateTransaction(signedMainTx);
54
+ })
55
+ },
56
+ {
57
+ name: '48Club - sendBundle',
58
+ enable: process.env.SEND_TX_48CLUB_BUNDLE === 'true',
59
+ send: () => __awaiter(this, void 0, void 0, function* () {
60
+ let bundle = [signedMainTx, yield eoa_tip_transaction(_1.BSC_EOA_ADDRESS._48CLUB)];
61
+ return yield this._48Club.sendBundle({ txs: bundle });
62
+ })
63
+ }
64
+ ];
65
+ const results = [];
66
+ const errors = [];
67
+ yield Promise.all(rpcProviders.filter(provider => provider.enable).map((provider) => __awaiter(this, void 0, void 0, function* () {
68
+ try {
69
+ const txHash = yield provider.send();
70
+ results.push(txHash);
71
+ (0, dist_1.log_info)(`Transaction sent successfully`, { provider: provider.name, order_trace_id, txHash });
72
+ }
73
+ catch (error) {
74
+ errors.push(`${provider.name}: ${error.message}`);
75
+ (0, dist_1.log_info)(`Transaction sending failed`, { provider: provider.name, order_trace_id, error: error.message });
76
+ }
77
+ })));
78
+ if (errors.some(error => error.includes('nonce'))) {
79
+ throw new Error(`!!!!!! Some RPC providers returned nonce error: ${JSON.stringify(errors)}`);
80
+ }
81
+ if (errors.some(error => error.includes('bundle already exist') || error.includes('already known'))) {
82
+ return results;
83
+ }
84
+ if (results.length === 0 || errors.length > 0) {
85
+ throw new Error(`!!!!!! Some RPC providers failed to send transactions: ${JSON.stringify(errors)}`);
86
+ }
87
+ return results;
88
+ });
89
+ }
90
+ }
91
+ exports.TransactionSender = TransactionSender;
@@ -0,0 +1,28 @@
1
+ export interface GasOptions {
2
+ gasLimit: number;
3
+ defaultGasPriceGwei: number;
4
+ maxGasPriceGwei: number;
5
+ defaultTipAmountGwei: number;
6
+ maxTipAmountGwei: number;
7
+ txStatusCheckIntervalMills: number;
8
+ txCancelTimeoutMills: number;
9
+ txCancelGasBoostFactor: number;
10
+ }
11
+ export interface EvmChainConfig {
12
+ chainId: number;
13
+ nativeCurrency: string;
14
+ wrappedNativeCurrencyAddress: string;
15
+ chainName: string;
16
+ rpcEndpoint: string;
17
+ blockConfirmations: number;
18
+ gasOptions: GasOptions;
19
+ }
20
+ export interface DexConfig {
21
+ dexId: string;
22
+ dexName: string;
23
+ routerAddress: string;
24
+ factoryAddress?: string;
25
+ routerAbi: any;
26
+ pairAbi: any;
27
+ dexType: string;
28
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,30 @@
1
+ import { ethers } from 'ethers';
2
+ export interface EvmContractEventData {
3
+ blockNumber: number;
4
+ blockHash: string;
5
+ transactionIndex: number;
6
+ transactionHash: string;
7
+ logIndex: number;
8
+ removed: boolean;
9
+ address: string;
10
+ data: string;
11
+ topics: string[];
12
+ event: string;
13
+ eventSignature: string;
14
+ args: any;
15
+ removeListener: () => void;
16
+ getBlock: () => Promise<ethers.providers.Block>;
17
+ getTransaction: () => Promise<ethers.providers.TransactionResponse>;
18
+ getTransactionReceipt: () => Promise<ethers.providers.TransactionReceipt>;
19
+ decode: (data: string, topics?: string[]) => any;
20
+ }
21
+ export interface AmmPoolSyncEventData extends EvmContractEventData {
22
+ event: 'Sync';
23
+ eventSignature: 'Sync(uint112,uint112)';
24
+ args: {
25
+ 0: ethers.BigNumber;
26
+ 1: ethers.BigNumber;
27
+ reserve0: ethers.BigNumber;
28
+ reserve1: ethers.BigNumber;
29
+ };
30
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export * from './config_types';
2
+ export * from './event_types';
3
+ export * from './quote_types';
4
+ export * from './trade_types';
@@ -0,0 +1,20 @@
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("./config_types"), exports);
18
+ __exportStar(require("./event_types"), exports);
19
+ __exportStar(require("./quote_types"), exports);
20
+ __exportStar(require("./trade_types"), exports);
@@ -0,0 +1,27 @@
1
+ import { BigNumber } from "ethers";
2
+ import { EvmContractEventData } from "./event_types";
3
+ export interface ReserveData {
4
+ reserve0: BigNumber;
5
+ reserve1: BigNumber;
6
+ timestamp: number;
7
+ }
8
+ export interface PoolSyncEventData {
9
+ poolAddress: string;
10
+ reserve0: BigNumber;
11
+ reserve1: BigNumber;
12
+ streamTime?: number;
13
+ event: EvmContractEventData;
14
+ }
15
+ export interface PriceChangeResult {
16
+ eventType: 'NORMAL' | 'LARGE_TRADE' | 'NO_CHANGE' | 'UNKNOWN';
17
+ tradeDirection?: 'BUY' | 'SELL' | 'UNKNOWN';
18
+ details: string;
19
+ priceImpact?: number;
20
+ tradeAmountUsd?: number;
21
+ token0Change?: string;
22
+ token1Change?: string;
23
+ }
24
+ export interface ThresholdConfig {
25
+ largeTradeThresholdUsd: number;
26
+ significantPriceChangePercent: number;
27
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,38 @@
1
+ import { BigNumber, ethers } from 'ethers';
2
+ export interface TxOption {
3
+ gasLimit: number;
4
+ gasPrice: ethers.BigNumber;
5
+ nonce?: number;
6
+ value?: any;
7
+ }
8
+ export interface SwapEvent {
9
+ amount0In: BigNumber;
10
+ amount0Out: BigNumber;
11
+ amount1In: BigNumber;
12
+ amount1Out: BigNumber;
13
+ sender: string;
14
+ to: string;
15
+ }
16
+ export interface ParserConfig {
17
+ version: string;
18
+ rpcEndpoint: string;
19
+ walletAddress: string;
20
+ }
21
+ export interface TokenChanges {
22
+ pre_bal: number;
23
+ post_bal: number;
24
+ change: string;
25
+ }
26
+ export interface TransactionResult {
27
+ status: 'success' | 'failed' | 'pending';
28
+ hash: string;
29
+ blockNumber?: number;
30
+ gasUsed?: ethers.BigNumber;
31
+ effectiveGasPrice?: ethers.BigNumber;
32
+ totalCost?: ethers.BigNumber;
33
+ errorMessage?: string;
34
+ }
35
+ export declare enum TxStatus {
36
+ PENDING = "pending",
37
+ CONFIRMED = "confirmed"
38
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TxStatus = void 0;
4
+ var TxStatus;
5
+ (function (TxStatus) {
6
+ TxStatus["PENDING"] = "pending";
7
+ TxStatus["CONFIRMED"] = "confirmed";
8
+ })(TxStatus || (exports.TxStatus = TxStatus = {}));
@@ -0,0 +1,5 @@
1
+ import { ethers } from 'ethers';
2
+ export declare class EVMGasHelper {
3
+ static wrapNativeToken(provider: ethers.providers.Provider, wallet: ethers.Wallet, wrappedTokenAddress: string, amount: string, minReserve?: string, tokenSymbol?: string): Promise<string>;
4
+ static checkNativeBalance(provider: ethers.providers.Provider, walletAddress: string): Promise<ethers.BigNumber>;
5
+ }