@clonegod/ttd-base-common 1.0.26 → 1.1.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.
Files changed (144) hide show
  1. package/dist/appconfig/BaseQuoteAppConfig.d.ts +10 -0
  2. package/dist/appconfig/BaseQuoteAppConfig.js +36 -0
  3. package/dist/appconfig/BaseTradeAppConfig.d.ts +7 -0
  4. package/dist/appconfig/BaseTradeAppConfig.js +13 -0
  5. package/dist/appconfig/base_dex_env_args.d.ts +5 -0
  6. package/dist/appconfig/base_dex_env_args.js +68 -0
  7. package/dist/appconfig/base_env_args.d.ts +82 -0
  8. package/dist/appconfig/base_env_args.js +91 -0
  9. package/dist/appconfig/ensure_core_env.d.ts +1 -0
  10. package/dist/appconfig/ensure_core_env.js +18 -0
  11. package/dist/appconfig/index.d.ts +5 -0
  12. package/dist/appconfig/index.js +21 -0
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +2 -2
  15. package/dist/quote/depth/amm_depth_calculator.d.ts +19 -0
  16. package/dist/quote/depth/amm_depth_calculator.js +55 -0
  17. package/dist/quote/depth/clmm_depth_calculator.d.ts +28 -0
  18. package/dist/quote/depth/clmm_depth_calculator.js +176 -0
  19. package/dist/quote/depth/index.d.ts +51 -0
  20. package/dist/quote/depth/index.js +264 -0
  21. package/dist/quote/depth/tick_liquidity_snapshot.d.ts +58 -0
  22. package/dist/quote/depth/tick_liquidity_snapshot.js +143 -0
  23. package/dist/quote/event/index.d.ts +1 -0
  24. package/dist/quote/event/index.js +1 -0
  25. package/dist/quote/event/pool_event_listener.d.ts +5 -3
  26. package/dist/quote/event/pool_event_listener.js +128 -150
  27. package/dist/quote/event/swap_debouncer.d.ts +22 -0
  28. package/dist/quote/event/swap_debouncer.js +80 -0
  29. package/dist/quote/get_base_token_price.d.ts +6 -0
  30. package/dist/quote/get_base_token_price.js +90 -0
  31. package/dist/quote/index.d.ts +7 -0
  32. package/dist/quote/index.js +7 -0
  33. package/dist/quote/preload_token_prices.d.ts +2 -0
  34. package/dist/quote/preload_token_prices.js +37 -0
  35. package/dist/quote/price_feed_handler.d.ts +15 -0
  36. package/dist/quote/price_feed_handler.js +56 -0
  37. package/dist/quote/pricing/fee_helpers.d.ts +13 -0
  38. package/dist/quote/pricing/fee_helpers.js +68 -0
  39. package/dist/quote/pricing/index.d.ts +3 -1
  40. package/dist/quote/pricing/index.js +3 -1
  41. package/dist/quote/pricing/pool_state_initializer.d.ts +12 -0
  42. package/dist/quote/pricing/pool_state_initializer.js +191 -0
  43. package/dist/quote/pricing/sdk_token_factory.d.ts +2 -0
  44. package/dist/quote/pricing/sdk_token_factory.js +21 -0
  45. package/dist/quote/quote_amount.d.ts +4 -0
  46. package/dist/quote/quote_amount.js +24 -0
  47. package/dist/quote/tick/cached_tick_data_provider.d.ts +12 -0
  48. package/dist/quote/tick/cached_tick_data_provider.js +45 -0
  49. package/dist/quote/tick/clmm_tick_cache.d.ts +42 -0
  50. package/dist/quote/tick/clmm_tick_cache.js +236 -0
  51. package/dist/quote/tick/index.d.ts +4 -0
  52. package/dist/{ws → quote/tick}/index.js +4 -2
  53. package/dist/quote/tick/state_view_tick_loader.d.ts +17 -0
  54. package/dist/quote/tick/state_view_tick_loader.js +136 -0
  55. package/dist/quote/tick/tick_lens_loaders.d.ts +24 -0
  56. package/dist/quote/tick/tick_lens_loaders.js +158 -0
  57. package/dist/quote/verify/index.d.ts +2 -0
  58. package/dist/quote/verify/index.js +5 -0
  59. package/dist/quote/verify/quote_price_verify.d.ts +30 -0
  60. package/dist/quote/verify/quote_price_verify.js +240 -0
  61. package/dist/redis/redis_client.d.ts +3 -2
  62. package/dist/redis/redis_client.js +86 -116
  63. package/dist/send-tx/constants.d.ts +2 -0
  64. package/dist/send-tx/constants.js +6 -0
  65. package/dist/send-tx/index.d.ts +2 -0
  66. package/dist/{config → send-tx}/index.js +2 -1
  67. package/dist/send-tx/types.d.ts +4 -0
  68. package/dist/send-tx/types.js +2 -0
  69. package/dist/trade/abstract_dex_trade.d.ts +43 -21
  70. package/dist/trade/abstract_dex_trade.js +347 -133
  71. package/dist/trade/caller_manager.d.ts +31 -0
  72. package/dist/trade/caller_manager.js +202 -0
  73. package/dist/trade/check/abstract_tx_result_checker.d.ts +28 -0
  74. package/dist/trade/check/abstract_tx_result_checker.js +192 -0
  75. package/dist/trade/check/index.d.ts +1 -1
  76. package/dist/trade/check/index.js +1 -1
  77. package/dist/trade/index.d.ts +2 -2
  78. package/dist/trade/index.js +2 -2
  79. package/dist/trade/parse/base_parser.d.ts +1 -2
  80. package/dist/trade/parse/base_parser.js +36 -36
  81. package/dist/trade/trade_trace.d.ts +17 -0
  82. package/dist/trade/trade_trace.js +65 -0
  83. package/dist/types/config_types.d.ts +3 -3
  84. package/dist/types/event_types.d.ts +3 -3
  85. package/dist/types/pool_state.d.ts +140 -13
  86. package/dist/utils/ethers_compat.d.ts +13 -0
  87. package/dist/utils/ethers_compat.js +18 -0
  88. package/dist/utils/fast_signer.d.ts +1 -0
  89. package/dist/utils/fast_signer.js +87 -0
  90. package/dist/utils/gas_helper.d.ts +2 -2
  91. package/dist/utils/gas_helper.js +48 -60
  92. package/dist/utils/index.d.ts +5 -2
  93. package/dist/utils/index.js +6 -2
  94. package/dist/utils/pool_filter.d.ts +8 -0
  95. package/dist/utils/pool_filter.js +38 -0
  96. package/dist/utils/trade_direction.d.ts +14 -0
  97. package/dist/utils/trade_direction.js +23 -0
  98. package/package.json +2 -2
  99. package/dist/config/base_env_args.d.ts +0 -11
  100. package/dist/config/base_env_args.js +0 -19
  101. package/dist/config/index.d.ts +0 -1
  102. package/dist/quote/event/verify_clmm_swap_event.d.ts +0 -1
  103. package/dist/quote/event/verify_clmm_swap_event.js +0 -178
  104. package/dist/quote/pricing/token_price_cache.d.ts +0 -10
  105. package/dist/quote/pricing/token_price_cache.js +0 -40
  106. package/dist/trade/abstract_dex_trade_plus.d.ts +0 -43
  107. package/dist/trade/abstract_dex_trade_plus.js +0 -421
  108. package/dist/trade/check/tx_websocket_manager.d.ts +0 -23
  109. package/dist/trade/check/tx_websocket_manager.js +0 -119
  110. package/dist/trade/send/alchemy_base.d.ts +0 -5
  111. package/dist/trade/send/alchemy_base.js +0 -48
  112. package/dist/trade/send/ankr_base.d.ts +0 -5
  113. package/dist/trade/send/ankr_base.js +0 -48
  114. package/dist/trade/send/base_rpc.d.ts +0 -5
  115. package/dist/trade/send/base_rpc.js +0 -48
  116. package/dist/trade/send/blockpi_base.d.ts +0 -5
  117. package/dist/trade/send/blockpi_base.js +0 -48
  118. package/dist/trade/send/bloxroute_base.d.ts +0 -11
  119. package/dist/trade/send/bloxroute_base.js +0 -115
  120. package/dist/trade/send/chainstack_base.d.ts +0 -5
  121. package/dist/trade/send/chainstack_base.js +0 -48
  122. package/dist/trade/send/drpc_base.d.ts +0 -5
  123. package/dist/trade/send/drpc_base.js +0 -48
  124. package/dist/trade/send/getblock_base.d.ts +0 -5
  125. package/dist/trade/send/getblock_base.js +0 -48
  126. package/dist/trade/send/index.d.ts +0 -15
  127. package/dist/trade/send/index.js +0 -33
  128. package/dist/trade/send/infura_base.d.ts +0 -5
  129. package/dist/trade/send/infura_base.js +0 -48
  130. package/dist/trade/send/moralis_base.d.ts +0 -5
  131. package/dist/trade/send/moralis_base.js +0 -48
  132. package/dist/trade/send/onerpc_base.d.ts +0 -5
  133. package/dist/trade/send/onerpc_base.js +0 -48
  134. package/dist/trade/send/quicknode_base.d.ts +0 -5
  135. package/dist/trade/send/quicknode_base.js +0 -48
  136. package/dist/trade/send/send_tx.d.ts +0 -17
  137. package/dist/trade/send/send_tx.js +0 -163
  138. package/dist/ws/event_filter.d.ts +0 -8
  139. package/dist/ws/event_filter.js +0 -36
  140. package/dist/ws/index.d.ts +0 -2
  141. package/dist/ws/subscribe_v2_events.d.ts +0 -14
  142. package/dist/ws/subscribe_v2_events.js +0 -174
  143. package/dist/ws/subscribe_v3_events.d.ts +0 -14
  144. package/dist/ws/subscribe_v3_events.js +0 -174
@@ -1,48 +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.QuickNodeBase = void 0;
16
- const dist_1 = require("@clonegod/ttd-core/dist");
17
- const axios_1 = __importDefault(require("axios"));
18
- class QuickNodeBase {
19
- constructor() {
20
- this.endpoint = process.env.BASE_QUICKNODE_RPC_ENDPOINT || '';
21
- }
22
- sendTransaction(signedTx) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- try {
25
- const response = yield axios_1.default.post(this.endpoint, {
26
- jsonrpc: "2.0",
27
- id: "1",
28
- method: "eth_sendRawTransaction",
29
- params: [signedTx]
30
- }, {
31
- headers: {
32
- 'Content-Type': 'application/json'
33
- },
34
- timeout: 3000
35
- });
36
- if (response.data.error) {
37
- throw new Error(`QuickNode Base Error: ${response.data.error.code} - ${response.data.error.message}`);
38
- }
39
- return response.data.result;
40
- }
41
- catch (error) {
42
- (0, dist_1.log_error)('QuickNode Base sendTransaction failed!!!', error);
43
- throw error;
44
- }
45
- });
46
- }
47
- }
48
- exports.QuickNodeBase = QuickNodeBase;
@@ -1,17 +0,0 @@
1
- import { AppConfig } from "@clonegod/ttd-core/dist";
2
- export declare class BaseTransactionSender {
3
- private rpc;
4
- private quicknode;
5
- private alchemy;
6
- private infura;
7
- private drpc;
8
- private blockpi;
9
- private getblock;
10
- private ankr;
11
- private chainstack;
12
- private oneRpc;
13
- private moralis;
14
- private bloxroute;
15
- constructor(appConfig: AppConfig);
16
- sendTransaction(signedMainTx: string, eoa_tip_transaction: (eoa_address: string) => Promise<string>, order_trace_id: string): Promise<string[]>;
17
- }
@@ -1,163 +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.BaseTransactionSender = void 0;
13
- const dist_1 = require("@clonegod/ttd-core/dist");
14
- const base_rpc_1 = require("./base_rpc");
15
- const quicknode_base_1 = require("./quicknode_base");
16
- const bloxroute_base_1 = require("./bloxroute_base");
17
- const alchemy_base_1 = require("./alchemy_base");
18
- const infura_base_1 = require("./infura_base");
19
- const drpc_base_1 = require("./drpc_base");
20
- const blockpi_base_1 = require("./blockpi_base");
21
- const getblock_base_1 = require("./getblock_base");
22
- const ankr_base_1 = require("./ankr_base");
23
- const chainstack_base_1 = require("./chainstack_base");
24
- const moralis_base_1 = require("./moralis_base");
25
- const onerpc_base_1 = require("./onerpc_base");
26
- class BaseTransactionSender {
27
- constructor(appConfig) {
28
- this.rpc = new base_rpc_1.BaseRpc(appConfig.env_args.rpc_endpoint);
29
- this.quicknode = new quicknode_base_1.QuickNodeBase();
30
- this.alchemy = new alchemy_base_1.AlchemyBase();
31
- this.infura = new infura_base_1.InfuraBase();
32
- this.drpc = new drpc_base_1.DrpcBase();
33
- this.blockpi = new blockpi_base_1.BlockpiBase();
34
- this.getblock = new getblock_base_1.GetblockBase();
35
- this.ankr = new ankr_base_1.AnkrBase();
36
- this.chainstack = new chainstack_base_1.ChainstackBase();
37
- this.oneRpc = new onerpc_base_1.OneRpcBase();
38
- this.moralis = new moralis_base_1.MoralisBase();
39
- this.bloxroute = new bloxroute_base_1.BloxrouteBase();
40
- }
41
- sendTransaction(signedMainTx, eoa_tip_transaction, order_trace_id) {
42
- return __awaiter(this, void 0, void 0, function* () {
43
- const rpcProviders = [
44
- {
45
- name: 'Base Official RPC',
46
- enable: process.env.SEND_TX_BASE_OFFICIAL_RPC === 'true',
47
- send: () => __awaiter(this, void 0, void 0, function* () {
48
- return yield this.rpc.eth_sendRawTransaction(signedMainTx);
49
- })
50
- },
51
- {
52
- name: 'Base QuickNode RPC',
53
- enable: process.env.SEND_TX_BASE_QUICKNODE_RPC === 'true',
54
- send: () => __awaiter(this, void 0, void 0, function* () {
55
- return yield this.quicknode.sendTransaction(signedMainTx);
56
- })
57
- },
58
- {
59
- name: 'Base DRPC RPC',
60
- enable: process.env.SEND_TX_BASE_DRPC_RPC === 'true',
61
- send: () => __awaiter(this, void 0, void 0, function* () {
62
- return yield this.drpc.sendTransaction(signedMainTx);
63
- })
64
- },
65
- {
66
- name: 'Base Alchemy RPC',
67
- enable: process.env.SEND_TX_BASE_ALCHEMY_RPC === 'true',
68
- send: () => __awaiter(this, void 0, void 0, function* () {
69
- return yield this.alchemy.sendTransaction(signedMainTx);
70
- })
71
- },
72
- {
73
- name: 'Base Infura RPC',
74
- enable: process.env.SEND_TX_BASE_INFURA_RPC === 'true',
75
- send: () => __awaiter(this, void 0, void 0, function* () {
76
- return yield this.infura.sendTransaction(signedMainTx);
77
- })
78
- },
79
- {
80
- name: 'Base BlockPI RPC',
81
- enable: process.env.SEND_TX_BASE_BLOCKPI_RPC === 'true',
82
- send: () => __awaiter(this, void 0, void 0, function* () {
83
- return yield this.blockpi.sendTransaction(signedMainTx);
84
- })
85
- },
86
- {
87
- name: 'Base GetBlock RPC',
88
- enable: process.env.SEND_TX_BASE_GETBLOCK_RPC === 'true',
89
- send: () => __awaiter(this, void 0, void 0, function* () {
90
- return yield this.getblock.sendTransaction(signedMainTx);
91
- })
92
- },
93
- {
94
- name: 'Base Ankr RPC',
95
- enable: process.env.SEND_TX_BASE_ANKR_RPC === 'true',
96
- send: () => __awaiter(this, void 0, void 0, function* () {
97
- return yield this.ankr.sendTransaction(signedMainTx);
98
- })
99
- },
100
- {
101
- name: 'Base Chainstack RPC',
102
- enable: process.env.SEND_TX_BASE_CHAINSTACK_RPC === 'true',
103
- send: () => __awaiter(this, void 0, void 0, function* () {
104
- return yield this.chainstack.sendTransaction(signedMainTx);
105
- })
106
- },
107
- {
108
- name: 'Base Moralis RPC',
109
- enable: process.env.SEND_TX_BASE_MORALIS_RPC === 'true',
110
- send: () => __awaiter(this, void 0, void 0, function* () {
111
- return yield this.moralis.sendTransaction(signedMainTx);
112
- })
113
- },
114
- {
115
- name: 'Base 1RPC',
116
- enable: process.env.SEND_TX_BASE_1RPC_RPC === 'true',
117
- send: () => __awaiter(this, void 0, void 0, function* () {
118
- return yield this.oneRpc.sendTransaction(signedMainTx);
119
- })
120
- },
121
- {
122
- name: 'BloXroute RPC|WS',
123
- enable: process.env.SEND_TX_BLOXROUTE_RPC === 'true',
124
- send: () => __awaiter(this, void 0, void 0, function* () {
125
- return yield this.bloxroute.sendTransaction(signedMainTx);
126
- })
127
- }
128
- ];
129
- const results = [];
130
- const errors = [];
131
- yield Promise.all(rpcProviders.filter(provider => provider.enable).map((provider) => __awaiter(this, void 0, void 0, function* () {
132
- try {
133
- const txHash = yield provider.send();
134
- results.push(txHash);
135
- (0, dist_1.log_info)(`Base transaction sent successfully`, {
136
- provider: provider.name,
137
- order_trace_id,
138
- txHash
139
- });
140
- }
141
- catch (error) {
142
- errors.push(`${provider.name}: ${error.message}`);
143
- (0, dist_1.log_info)(`Base transaction sending failed`, {
144
- provider: provider.name,
145
- order_trace_id,
146
- error: error.message
147
- });
148
- }
149
- })));
150
- if (errors.some(error => error.includes('nonce'))) {
151
- throw new Error(`!!!!!! Some Base RPC providers returned nonce error: ${JSON.stringify(errors)}`);
152
- }
153
- if (errors.some(error => error.includes('already known') || error.includes('already exist'))) {
154
- return results;
155
- }
156
- if (results.length === 0 || errors.length > 0) {
157
- throw new Error(`!!!!!! Some Base RPC providers failed to send transactions: ${JSON.stringify(errors)}`);
158
- }
159
- return results;
160
- });
161
- }
162
- }
163
- exports.BaseTransactionSender = BaseTransactionSender;
@@ -1,8 +0,0 @@
1
- export declare class EventFilter {
2
- private static poolEventMap;
3
- private static readonly CLEANUP_INTERVAL_MS;
4
- private static readonly EVENT_EXPIRE_MS;
5
- private static cleanupInitialized;
6
- private static initializeCleanup;
7
- static filterEvent<T>(poolAddress: string, blockNumber: number, eventType: string, callback: (data: T) => void, eventData: T): boolean;
8
- }
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventFilter = void 0;
4
- const dist_1 = require("@clonegod/ttd-core/dist");
5
- class EventFilter {
6
- static initializeCleanup() {
7
- if (this.cleanupInitialized) {
8
- return;
9
- }
10
- setInterval(() => {
11
- const now = Date.now();
12
- this.poolEventMap.forEach((timestamp, key) => {
13
- if (now - timestamp > this.EVENT_EXPIRE_MS) {
14
- this.poolEventMap.delete(key);
15
- }
16
- });
17
- }, this.CLEANUP_INTERVAL_MS);
18
- this.cleanupInitialized = true;
19
- }
20
- static filterEvent(poolAddress, blockNumber, eventType, callback, eventData) {
21
- this.initializeCleanup();
22
- const key = `${poolAddress}-${blockNumber}-${eventType.toUpperCase()}`;
23
- if (this.poolEventMap.has(key)) {
24
- (0, dist_1.log_warn)(`Event ${eventType} already occurred on pool: ${poolAddress}, block: ${blockNumber}`);
25
- return false;
26
- }
27
- this.poolEventMap.set(key, Date.now());
28
- callback(eventData);
29
- return true;
30
- }
31
- }
32
- exports.EventFilter = EventFilter;
33
- EventFilter.poolEventMap = new Map();
34
- EventFilter.CLEANUP_INTERVAL_MS = 10 * 1000;
35
- EventFilter.EVENT_EXPIRE_MS = 10 * 60 * 1000;
36
- EventFilter.cleanupInitialized = false;
@@ -1,2 +0,0 @@
1
- export * from './subscribe_v2_events';
2
- export * from './subscribe_v3_events';
@@ -1,14 +0,0 @@
1
- export declare class UniswapV2AmmPoolEventsSubscriber {
2
- private wsUrl;
3
- private poolAddress;
4
- private provider;
5
- private poolContract;
6
- private eventCallbacks;
7
- private isConnected;
8
- constructor(wsUrl: string, poolAddress: string);
9
- initialize(): Promise<void>;
10
- subscribe(eventType: string, callback: any): void;
11
- unsubscribe(eventType: string): Promise<void>;
12
- disconnect(): Promise<void>;
13
- _reconnect(): void;
14
- }
@@ -1,174 +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.UniswapV2AmmPoolEventsSubscriber = void 0;
13
- const ethers_1 = require("ethers");
14
- const event_filter_1 = require("./event_filter");
15
- const UNISWAP_V2_POOL_ABI = [
16
- 'event Sync(uint112 reserve0, uint112 reserve1)',
17
- 'event Mint(address indexed sender, uint amount0, uint amount1)',
18
- 'event Burn(address indexed sender, uint amount0, uint amount1, address indexed to)'
19
- ];
20
- class UniswapV2AmmPoolEventsSubscriber {
21
- constructor(wsUrl, poolAddress) {
22
- this.wsUrl = wsUrl;
23
- this.poolAddress = poolAddress;
24
- this.provider = null;
25
- this.poolContract = null;
26
- this.eventCallbacks = {
27
- sync: null,
28
- mint: null,
29
- burn: null
30
- };
31
- this.isConnected = false;
32
- }
33
- initialize() {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- try {
36
- if (!this.wsUrl || !this.poolAddress) {
37
- throw new Error(`wsUrl and poolAddress are required! wsUrl=${this.wsUrl} poolAddress=${this.poolAddress}`);
38
- }
39
- this.provider = new ethers_1.ethers.providers.WebSocketProvider(this.wsUrl);
40
- this.poolContract = new ethers_1.ethers.Contract(this.poolAddress, UNISWAP_V2_POOL_ABI, this.provider);
41
- this.isConnected = true;
42
- console.log(`Connected to WebSocket: ${this.wsUrl} for pool: ${this.poolAddress}`);
43
- this.provider._websocket.on('error', (error) => {
44
- console.error('WebSocket Error:', error);
45
- this.isConnected = false;
46
- this._reconnect();
47
- });
48
- this.provider._websocket.on('close', (code, reason) => {
49
- console.error('WebSocket Closed:', code, reason);
50
- this.isConnected = false;
51
- this._reconnect();
52
- });
53
- }
54
- catch (error) {
55
- console.error('Initialization Error:', error);
56
- this.isConnected = false;
57
- this._reconnect();
58
- }
59
- });
60
- }
61
- subscribe(eventType, callback) {
62
- if (!this.poolContract) {
63
- throw new Error('Contract not initialized. Call initialize() first.');
64
- }
65
- if (!['sync', 'mint', 'burn'].includes(eventType.toLowerCase())) {
66
- throw new Error('Invalid event type. Use "sync", "mint", or "burn".');
67
- }
68
- this.eventCallbacks[eventType.toLowerCase()] = callback;
69
- if (eventType.toLowerCase() === 'sync') {
70
- this.poolContract.on('Sync', (reserve0, reserve1, event) => {
71
- const event_data = {
72
- pool_address: this.poolAddress,
73
- type: 'sync',
74
- event_time: Date.now(),
75
- data: {
76
- blockNumber: event.blockNumber,
77
- transactionIndex: event.transactionIndex,
78
- transactionHash: event.transactionHash,
79
- amount0: '0',
80
- amount1: '0',
81
- reserve0: BigInt(reserve0.toString()),
82
- reserve1: BigInt(reserve1.toString()),
83
- tick: 0,
84
- sqrtPriceX96: BigInt(0),
85
- liquidity: BigInt(0),
86
- }
87
- };
88
- callback(event_data);
89
- });
90
- }
91
- else if (eventType.toLowerCase() === 'mint') {
92
- this.poolContract.on('Mint', (sender, amount0, amount1, event) => {
93
- const event_data = {
94
- pool_address: this.poolAddress,
95
- type: 'mint',
96
- event_time: Date.now(),
97
- data: {
98
- blockNumber: event.blockNumber,
99
- transactionIndex: event.transactionIndex,
100
- transactionHash: event.transactionHash,
101
- amount0: amount0.toString(),
102
- amount1: amount1.toString(),
103
- reserve0: BigInt(0),
104
- reserve1: BigInt(0),
105
- tick: 0,
106
- sqrtPriceX96: BigInt(0),
107
- liquidity: BigInt(0),
108
- }
109
- };
110
- event_filter_1.EventFilter.filterEvent(this.poolAddress, event.blockNumber, 'mint', callback, event_data);
111
- });
112
- }
113
- else if (eventType.toLowerCase() === 'burn') {
114
- this.poolContract.on('Burn', (sender, amount0, amount1, to, event) => {
115
- const event_data = {
116
- pool_address: this.poolAddress,
117
- type: 'burn',
118
- event_time: Date.now(),
119
- data: {
120
- blockNumber: event.blockNumber,
121
- transactionIndex: event.transactionIndex,
122
- transactionHash: event.transactionHash,
123
- amount0: amount0.toString(),
124
- amount1: amount1.toString(),
125
- reserve0: BigInt(0),
126
- reserve1: BigInt(0),
127
- tick: 0,
128
- sqrtPriceX96: BigInt(0),
129
- liquidity: BigInt(0),
130
- }
131
- };
132
- event_filter_1.EventFilter.filterEvent(this.poolAddress, event.blockNumber, 'burn', callback, event_data);
133
- });
134
- }
135
- }
136
- unsubscribe(eventType) {
137
- return __awaiter(this, void 0, void 0, function* () {
138
- if (!this.poolContract) {
139
- throw new Error('Contract not initialized.');
140
- }
141
- if (!['sync', 'mint', 'burn'].includes(eventType.toLowerCase())) {
142
- throw new Error('Invalid event type. Use "sync", "mint", or "burn".');
143
- }
144
- this.poolContract.removeAllListeners(eventType);
145
- this.eventCallbacks[eventType.toLowerCase()] = null;
146
- console.log(`Unsubscribed from ${eventType} events`);
147
- });
148
- }
149
- disconnect() {
150
- return __awaiter(this, void 0, void 0, function* () {
151
- if (this.provider) {
152
- yield this.provider.destroy();
153
- this.provider = null;
154
- this.poolContract = null;
155
- this.isConnected = false;
156
- console.log('Disconnected from WebSocket');
157
- }
158
- });
159
- }
160
- _reconnect() {
161
- if (!this.isConnected) {
162
- console.log('Attempting to reconnect...');
163
- setTimeout(() => __awaiter(this, void 0, void 0, function* () {
164
- yield this.initialize();
165
- for (const [eventType, callback] of Object.entries(this.eventCallbacks)) {
166
- if (callback) {
167
- this.subscribe(eventType, callback);
168
- }
169
- }
170
- }), 2000);
171
- }
172
- }
173
- }
174
- exports.UniswapV2AmmPoolEventsSubscriber = UniswapV2AmmPoolEventsSubscriber;
@@ -1,14 +0,0 @@
1
- export declare class UniswapV3PoolEventsSubscriber {
2
- private wsUrl;
3
- private poolAddress;
4
- private provider;
5
- private poolContract;
6
- private eventCallbacks;
7
- private isConnected;
8
- constructor(wsUrl: string, poolAddress: string);
9
- initialize(): Promise<void>;
10
- subscribe(eventType: string, callback: any): void;
11
- unsubscribe(eventType: string): Promise<void>;
12
- disconnect(): Promise<void>;
13
- _reconnect(): void;
14
- }
@@ -1,174 +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.UniswapV3PoolEventsSubscriber = void 0;
13
- const ethers_1 = require("ethers");
14
- const event_filter_1 = require("./event_filter");
15
- const UNISWAP_V3_POOL_ABI = [
16
- 'event Swap(address indexed sender, address indexed recipient, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)',
17
- 'event Mint(address sender, address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)',
18
- 'event Burn(address indexed owner, int24 indexed tickLower, int24 indexed tickUpper, uint128 amount, uint256 amount0, uint256 amount1)'
19
- ];
20
- class UniswapV3PoolEventsSubscriber {
21
- constructor(wsUrl, poolAddress) {
22
- this.wsUrl = wsUrl;
23
- this.poolAddress = poolAddress;
24
- this.provider = null;
25
- this.poolContract = null;
26
- this.eventCallbacks = {
27
- swap: null,
28
- mint: null,
29
- burn: null
30
- };
31
- this.isConnected = false;
32
- }
33
- initialize() {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- try {
36
- if (!this.wsUrl || !this.poolAddress) {
37
- throw new Error(`wsUrl and poolAddress are required! wsUrl=${this.wsUrl} poolAddress=${this.poolAddress}`);
38
- }
39
- this.provider = new ethers_1.ethers.providers.WebSocketProvider(this.wsUrl);
40
- this.poolContract = new ethers_1.ethers.Contract(this.poolAddress, UNISWAP_V3_POOL_ABI, this.provider);
41
- this.isConnected = true;
42
- console.log(`Connected to WebSocket: ${this.wsUrl} for pool: ${this.poolAddress}`);
43
- this.provider._websocket.on('error', (error) => {
44
- console.error('WebSocket Error:', error);
45
- this.isConnected = false;
46
- this._reconnect();
47
- });
48
- this.provider._websocket.on('close', (code, reason) => {
49
- console.error('WebSocket Closed:', code, reason);
50
- this.isConnected = false;
51
- this._reconnect();
52
- });
53
- }
54
- catch (error) {
55
- console.error('Initialization Error:', error);
56
- this.isConnected = false;
57
- this._reconnect();
58
- }
59
- });
60
- }
61
- subscribe(eventType, callback) {
62
- if (!this.poolContract) {
63
- throw new Error('Contract not initialized. Call initialize() first.');
64
- }
65
- if (!['swap', 'mint', 'burn'].includes(eventType.toLowerCase())) {
66
- throw new Error('Invalid event type. Use "swap", "mint", or "burn".');
67
- }
68
- this.eventCallbacks[eventType.toLowerCase()] = callback;
69
- if (eventType.toLowerCase() === 'swap') {
70
- this.poolContract.on('Swap', (sender, recipient, amount0, amount1, sqrtPriceX96, liquidity, tick, event) => {
71
- const event_data = {
72
- pool_address: this.poolAddress,
73
- type: 'swap',
74
- event_time: Date.now(),
75
- data: {
76
- blockNumber: event.blockNumber,
77
- transactionIndex: event.transactionIndex,
78
- transactionHash: event.transactionHash,
79
- amount0: amount0.toString(),
80
- amount1: amount1.toString(),
81
- reserve0: BigInt(0),
82
- reserve1: BigInt(0),
83
- tick,
84
- sqrtPriceX96: sqrtPriceX96.toString(),
85
- liquidity: liquidity.toString(),
86
- }
87
- };
88
- callback(event_data);
89
- });
90
- }
91
- else if (eventType.toLowerCase() === 'mint') {
92
- this.poolContract.on('Mint', (sender, owner, tickLower, tickUpper, amount, amount0, amount1, event) => {
93
- const event_data = {
94
- pool_address: this.poolAddress,
95
- type: 'mint',
96
- event_time: Date.now(),
97
- data: {
98
- blockNumber: event.blockNumber,
99
- transactionIndex: event.transactionIndex,
100
- transactionHash: event.transactionHash,
101
- amount0: amount0.toString(),
102
- amount1: amount1.toString(),
103
- reserve0: BigInt(0),
104
- reserve1: BigInt(0),
105
- tick: 0,
106
- sqrtPriceX96: BigInt(0),
107
- liquidity: BigInt(0),
108
- }
109
- };
110
- event_filter_1.EventFilter.filterEvent(this.poolAddress, event.blockNumber, 'mint', callback, event_data);
111
- });
112
- }
113
- else if (eventType.toLowerCase() === 'burn') {
114
- this.poolContract.on('Burn', (owner, tickLower, tickUpper, amount, amount0, amount1, event) => {
115
- const event_data = {
116
- pool_address: this.poolAddress,
117
- type: 'burn',
118
- event_time: Date.now(),
119
- data: {
120
- blockNumber: event.blockNumber,
121
- transactionIndex: event.transactionIndex,
122
- transactionHash: event.transactionHash,
123
- amount0: amount0.toString(),
124
- amount1: amount1.toString(),
125
- reserve0: BigInt(0),
126
- reserve1: BigInt(0),
127
- tick: 0,
128
- sqrtPriceX96: BigInt(0),
129
- liquidity: BigInt(0),
130
- }
131
- };
132
- event_filter_1.EventFilter.filterEvent(this.poolAddress, event.blockNumber, 'burn', callback, event_data);
133
- });
134
- }
135
- }
136
- unsubscribe(eventType) {
137
- return __awaiter(this, void 0, void 0, function* () {
138
- if (!this.poolContract) {
139
- throw new Error('Contract not initialized.');
140
- }
141
- if (!['swap', 'mint', 'burn'].includes(eventType.toLowerCase())) {
142
- throw new Error('Invalid event type. Use "swap", "mint", or "burn".');
143
- }
144
- this.poolContract.removeAllListeners(eventType);
145
- this.eventCallbacks[eventType.toLowerCase()] = null;
146
- console.log(`Unsubscribed from ${eventType} events`);
147
- });
148
- }
149
- disconnect() {
150
- return __awaiter(this, void 0, void 0, function* () {
151
- if (this.provider) {
152
- yield this.provider.destroy();
153
- this.provider = null;
154
- this.poolContract = null;
155
- this.isConnected = false;
156
- console.log('Disconnected from WebSocket');
157
- }
158
- });
159
- }
160
- _reconnect() {
161
- if (!this.isConnected) {
162
- console.log('Attempting to reconnect...');
163
- setTimeout(() => __awaiter(this, void 0, void 0, function* () {
164
- yield this.initialize();
165
- for (const [eventType, callback] of Object.entries(this.eventCallbacks)) {
166
- if (callback) {
167
- this.subscribe(eventType, callback);
168
- }
169
- }
170
- }), 2000);
171
- }
172
- }
173
- }
174
- exports.UniswapV3PoolEventsSubscriber = UniswapV3PoolEventsSubscriber;