@3rd-eye-labs/openmm 0.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/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +43 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/balance.d.ts +3 -0
- package/dist/cli/commands/balance.d.ts.map +1 -0
- package/dist/cli/commands/balance.js +51 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/orderbook.d.ts +3 -0
- package/dist/cli/commands/orderbook.d.ts.map +1 -0
- package/dist/cli/commands/orderbook.js +83 -0
- package/dist/cli/commands/orderbook.js.map +1 -0
- package/dist/cli/commands/orders.d.ts +3 -0
- package/dist/cli/commands/orders.d.ts.map +1 -0
- package/dist/cli/commands/orders.js +196 -0
- package/dist/cli/commands/orders.js.map +1 -0
- package/dist/cli/commands/pool-discovery.d.ts +3 -0
- package/dist/cli/commands/pool-discovery.d.ts.map +1 -0
- package/dist/cli/commands/pool-discovery.js +60 -0
- package/dist/cli/commands/pool-discovery.js.map +1 -0
- package/dist/cli/commands/ticker.d.ts +3 -0
- package/dist/cli/commands/ticker.d.ts.map +1 -0
- package/dist/cli/commands/ticker.js +51 -0
- package/dist/cli/commands/ticker.js.map +1 -0
- package/dist/cli/commands/trade.d.ts +3 -0
- package/dist/cli/commands/trade.d.ts.map +1 -0
- package/dist/cli/commands/trade.js +110 -0
- package/dist/cli/commands/trade.js.map +1 -0
- package/dist/cli/commands/trades.d.ts +3 -0
- package/dist/cli/commands/trades.d.ts.map +1 -0
- package/dist/cli/commands/trades.js +73 -0
- package/dist/cli/commands/trades.js.map +1 -0
- package/dist/cli/exchange-factory.d.ts +40 -0
- package/dist/cli/exchange-factory.d.ts.map +1 -0
- package/dist/cli/exchange-factory.js +77 -0
- package/dist/cli/exchange-factory.js.map +1 -0
- package/dist/cli/pool-discovery-core.d.ts +54 -0
- package/dist/cli/pool-discovery-core.d.ts.map +1 -0
- package/dist/cli/pool-discovery-core.js +193 -0
- package/dist/cli/pool-discovery-core.js.map +1 -0
- package/dist/cli/utils/error-handler.d.ts +40 -0
- package/dist/cli/utils/error-handler.d.ts.map +1 -0
- package/dist/cli/utils/error-handler.js +117 -0
- package/dist/cli/utils/error-handler.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +45 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +118 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/dist/config/environment.d.ts +25 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +72 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/launcher-config.d.ts +17 -0
- package/dist/config/launcher-config.d.ts.map +1 -0
- package/dist/config/launcher-config.js +14 -0
- package/dist/config/launcher-config.js.map +1 -0
- package/dist/config/price-aggregation.d.ts +49 -0
- package/dist/config/price-aggregation.d.ts.map +1 -0
- package/dist/config/price-aggregation.js +89 -0
- package/dist/config/price-aggregation.js.map +1 -0
- package/dist/core/exchange/base-exchange-connector.d.ts +45 -0
- package/dist/core/exchange/base-exchange-connector.d.ts.map +1 -0
- package/dist/core/exchange/base-exchange-connector.js +43 -0
- package/dist/core/exchange/base-exchange-connector.js.map +1 -0
- package/dist/core/exchange/base-exchange-data-mapper.d.ts +58 -0
- package/dist/core/exchange/base-exchange-data-mapper.d.ts.map +1 -0
- package/dist/core/exchange/base-exchange-data-mapper.js +60 -0
- package/dist/core/exchange/base-exchange-data-mapper.js.map +1 -0
- package/dist/core/price-aggregation/cardano-price-service.d.ts +31 -0
- package/dist/core/price-aggregation/cardano-price-service.d.ts.map +1 -0
- package/dist/core/price-aggregation/cardano-price-service.js +157 -0
- package/dist/core/price-aggregation/cardano-price-service.js.map +1 -0
- package/dist/core/price-aggregation/index.d.ts +11 -0
- package/dist/core/price-aggregation/index.d.ts.map +1 -0
- package/dist/core/price-aggregation/index.js +21 -0
- package/dist/core/price-aggregation/index.js.map +1 -0
- package/dist/core/price-aggregation/iris-api-client.d.ts +16 -0
- package/dist/core/price-aggregation/iris-api-client.d.ts.map +1 -0
- package/dist/core/price-aggregation/iris-api-client.js +62 -0
- package/dist/core/price-aggregation/iris-api-client.js.map +1 -0
- package/dist/core/price-aggregation/iris-pool-discovery.d.ts +37 -0
- package/dist/core/price-aggregation/iris-pool-discovery.d.ts.map +1 -0
- package/dist/core/price-aggregation/iris-pool-discovery.js +123 -0
- package/dist/core/price-aggregation/iris-pool-discovery.js.map +1 -0
- package/dist/core/price-aggregation/price-calculator.d.ts +27 -0
- package/dist/core/price-aggregation/price-calculator.d.ts.map +1 -0
- package/dist/core/price-aggregation/price-calculator.js +84 -0
- package/dist/core/price-aggregation/price-calculator.js.map +1 -0
- package/dist/core/risk-management/risk-manager.d.ts +14 -0
- package/dist/core/risk-management/risk-manager.d.ts.map +1 -0
- package/dist/core/risk-management/risk-manager.js +40 -0
- package/dist/core/risk-management/risk-manager.js.map +1 -0
- package/dist/core/strategy/base-strategy.d.ts +26 -0
- package/dist/core/strategy/base-strategy.d.ts.map +1 -0
- package/dist/core/strategy/base-strategy.js +46 -0
- package/dist/core/strategy/base-strategy.js.map +1 -0
- package/dist/core/strategy/strategy-factory.d.ts +7 -0
- package/dist/core/strategy/strategy-factory.d.ts.map +1 -0
- package/dist/core/strategy/strategy-factory.js +64 -0
- package/dist/core/strategy/strategy-factory.js.map +1 -0
- package/dist/exchanges/mexc/mexc-auth.d.ts +42 -0
- package/dist/exchanges/mexc/mexc-auth.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-auth.js +122 -0
- package/dist/exchanges/mexc/mexc-auth.js.map +1 -0
- package/dist/exchanges/mexc/mexc-connector.d.ts +125 -0
- package/dist/exchanges/mexc/mexc-connector.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-connector.js +422 -0
- package/dist/exchanges/mexc/mexc-connector.js.map +1 -0
- package/dist/exchanges/mexc/mexc-data-mapper.d.ts +50 -0
- package/dist/exchanges/mexc/mexc-data-mapper.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-data-mapper.js +127 -0
- package/dist/exchanges/mexc/mexc-data-mapper.js.map +1 -0
- package/dist/exchanges/mexc/mexc-protobuf-decoder.d.ts +43 -0
- package/dist/exchanges/mexc/mexc-protobuf-decoder.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-protobuf-decoder.js +235 -0
- package/dist/exchanges/mexc/mexc-protobuf-decoder.js.map +1 -0
- package/dist/exchanges/mexc/mexc-user-stream.d.ts +81 -0
- package/dist/exchanges/mexc/mexc-user-stream.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-user-stream.js +253 -0
- package/dist/exchanges/mexc/mexc-user-stream.js.map +1 -0
- package/dist/exchanges/mexc/mexc-utils.d.ts +31 -0
- package/dist/exchanges/mexc/mexc-utils.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-utils.js +186 -0
- package/dist/exchanges/mexc/mexc-utils.js.map +1 -0
- package/dist/exchanges/mexc/mexc-websocket.d.ts +124 -0
- package/dist/exchanges/mexc/mexc-websocket.d.ts.map +1 -0
- package/dist/exchanges/mexc/mexc-websocket.js +496 -0
- package/dist/exchanges/mexc/mexc-websocket.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/strategies/grid/grid-calculator.d.ts +7 -0
- package/dist/strategies/grid/grid-calculator.d.ts.map +1 -0
- package/dist/strategies/grid/grid-calculator.js +34 -0
- package/dist/strategies/grid/grid-calculator.js.map +1 -0
- package/dist/strategies/grid/grid-order-manager.d.ts +23 -0
- package/dist/strategies/grid/grid-order-manager.d.ts.map +1 -0
- package/dist/strategies/grid/grid-order-manager.js +99 -0
- package/dist/strategies/grid/grid-order-manager.js.map +1 -0
- package/dist/strategies/grid/grid-strategy.d.ts +29 -0
- package/dist/strategies/grid/grid-strategy.d.ts.map +1 -0
- package/dist/strategies/grid/grid-strategy.js +185 -0
- package/dist/strategies/grid/grid-strategy.js.map +1 -0
- package/dist/types/account.d.ts +21 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +3 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/exchange.d.ts +67 -0
- package/dist/types/exchange.d.ts.map +1 -0
- package/dist/types/exchange.js +3 -0
- package/dist/types/exchange.js.map +1 -0
- package/dist/types/grid.d.ts +10 -0
- package/dist/types/grid.d.ts.map +1 -0
- package/dist/types/grid.js +3 -0
- package/dist/types/grid.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +27 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/iris.d.ts +58 -0
- package/dist/types/iris.d.ts.map +1 -0
- package/dist/types/iris.js +7 -0
- package/dist/types/iris.js.map +1 -0
- package/dist/types/market.d.ts +16 -0
- package/dist/types/market.d.ts.map +1 -0
- package/dist/types/market.js +3 -0
- package/dist/types/market.js.map +1 -0
- package/dist/types/mexc-raw.d.ts +87 -0
- package/dist/types/mexc-raw.d.ts.map +1 -0
- package/dist/types/mexc-raw.js +7 -0
- package/dist/types/mexc-raw.js.map +1 -0
- package/dist/types/mexc.d.ts +57 -0
- package/dist/types/mexc.d.ts.map +1 -0
- package/dist/types/mexc.js +8 -0
- package/dist/types/mexc.js.map +1 -0
- package/dist/types/price.d.ts +37 -0
- package/dist/types/price.d.ts.map +1 -0
- package/dist/types/price.js +7 -0
- package/dist/types/price.js.map +1 -0
- package/dist/types/risk.d.ts +22 -0
- package/dist/types/risk.d.ts.map +1 -0
- package/dist/types/risk.js +6 -0
- package/dist/types/risk.js.map +1 -0
- package/dist/types/strategy.d.ts +46 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +3 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +108 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/symbol-utils.d.ts +17 -0
- package/dist/utils/symbol-utils.d.ts.map +1 -0
- package/dist/utils/symbol-utils.js +41 -0
- package/dist/utils/symbol-utils.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MexcProtobufDecoder = void 0;
|
|
4
|
+
const mexc_utils_1 = require("./mexc-utils");
|
|
5
|
+
/**
|
|
6
|
+
* MEXC Protobuf Message Decoder
|
|
7
|
+
*
|
|
8
|
+
* This decoder supports:
|
|
9
|
+
* - Private order messages for user data stream functionality
|
|
10
|
+
* - Market data messages for real-time ticker, orderbook, and trade data
|
|
11
|
+
*
|
|
12
|
+
* Official MEXC Protocol Buffers Documentation:
|
|
13
|
+
* https://www.mexc.com/api-docs/spot-v3/websocket-market-streams#protocol-buffers-integration
|
|
14
|
+
*
|
|
15
|
+
* Supported message types:
|
|
16
|
+
* - spot@private.orders.v3.api.pb (private orders)
|
|
17
|
+
* - spot@public.aggre.bookTicker.v3.api.pb (ticker data)
|
|
18
|
+
* - spot@public.bookTicker.batch.v3.api.pb (batch ticker data)
|
|
19
|
+
* - spot@public.aggre.deals.v3.api.pb (trade data)
|
|
20
|
+
*/
|
|
21
|
+
class MexcProtobufDecoder {
|
|
22
|
+
/**
|
|
23
|
+
* Main decoder function for MEXC protobuf messages
|
|
24
|
+
*/
|
|
25
|
+
static decode(rawMessage) {
|
|
26
|
+
try {
|
|
27
|
+
const channelMatch = rawMessage.match(/^(spot@[^@]*)/);
|
|
28
|
+
const channel = channelMatch ? channelMatch[1] : 'unknown';
|
|
29
|
+
if (rawMessage.includes('private.orders')) {
|
|
30
|
+
return this.decodeOrderMessage(rawMessage, channel);
|
|
31
|
+
}
|
|
32
|
+
else if (rawMessage.includes('aggre.bookTicker') || rawMessage.includes('bookTicker.batch')) {
|
|
33
|
+
return this.decodeTickerMessage(rawMessage, channel);
|
|
34
|
+
}
|
|
35
|
+
else if (rawMessage.includes('aggre.deals')) {
|
|
36
|
+
return this.decodeTradesMessage(rawMessage, channel);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return {
|
|
40
|
+
type: 'unknown',
|
|
41
|
+
raw: rawMessage,
|
|
42
|
+
channel,
|
|
43
|
+
error: `Unsupported message type: ${channel}`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
type: 'unknown',
|
|
50
|
+
raw: rawMessage,
|
|
51
|
+
channel: 'unknown',
|
|
52
|
+
error: `Decoding error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Decode order-related protobuf messages for user data stream
|
|
58
|
+
* Format: spot@private.orders.v3.api.pb\u001a\bINDYUSDT0...
|
|
59
|
+
*/
|
|
60
|
+
static decodeOrderMessage(message, channel) {
|
|
61
|
+
try {
|
|
62
|
+
let symbolMatch = message.match(/\\u001a\\b([A-Z]{3,10}USDT|[A-Z]{3,10}BTC|[A-Z]{3,10}ETH|[A-Z]{3,10}BNB)/);
|
|
63
|
+
if (!symbolMatch) {
|
|
64
|
+
symbolMatch = message.match(/([A-Z]{3,10}USDT|[A-Z]{3,10}BTC|[A-Z]{3,10}ETH|[A-Z]{3,10}BNB)0/);
|
|
65
|
+
}
|
|
66
|
+
if (!symbolMatch) {
|
|
67
|
+
symbolMatch = message.match(/\.pb([A-Z]+USDT|[A-Z]+BTC|[A-Z]+ETH|[A-Z]+BNB)/);
|
|
68
|
+
}
|
|
69
|
+
const symbol = symbolMatch ? symbolMatch[1] : 'UNKNOWN';
|
|
70
|
+
const orderIdMatch = message.match(/C02__(\d+)/);
|
|
71
|
+
const orderId = orderIdMatch ? `C02__${orderIdMatch[1]}` : 'UNKNOWN';
|
|
72
|
+
let price = 0;
|
|
73
|
+
let quantity = 0;
|
|
74
|
+
const priceMatch = message.match(/\*(\d+\.?\d*)"/);
|
|
75
|
+
if (priceMatch)
|
|
76
|
+
price = parseFloat(priceMatch[1]);
|
|
77
|
+
if (price === 0) {
|
|
78
|
+
const decimalMatch = message.match(/(\d+\.\d{4,6})/);
|
|
79
|
+
if (decimalMatch)
|
|
80
|
+
price = parseFloat(decimalMatch[1]);
|
|
81
|
+
}
|
|
82
|
+
const quantityMatch = message.match(/"(\d+\.?\d*)[RH]?/);
|
|
83
|
+
if (quantityMatch)
|
|
84
|
+
quantity = parseFloat(quantityMatch[1]);
|
|
85
|
+
if (quantity === 0) {
|
|
86
|
+
const intMatch = message.match(/(\d{1,4})\D/);
|
|
87
|
+
if (intMatch) {
|
|
88
|
+
const val = parseFloat(intMatch[1]);
|
|
89
|
+
if (val > 0 && val < 1000)
|
|
90
|
+
quantity = val;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const side = mexc_utils_1.MexcUtils.determineSide(message);
|
|
94
|
+
const status = this.extractProtobufOrderStatus(message);
|
|
95
|
+
const decoded = {
|
|
96
|
+
orderId,
|
|
97
|
+
symbol: symbol.includes('/') ? symbol : `${symbol.slice(0, -4)}/${symbol.slice(-4)}`,
|
|
98
|
+
price,
|
|
99
|
+
quantity,
|
|
100
|
+
side,
|
|
101
|
+
status,
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
channel
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
type: 'order',
|
|
107
|
+
raw: message,
|
|
108
|
+
channel,
|
|
109
|
+
symbol: decoded.symbol,
|
|
110
|
+
decoded
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
type: 'order',
|
|
116
|
+
raw: message,
|
|
117
|
+
channel,
|
|
118
|
+
error: `Order decode error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Decode ticker protobuf messages
|
|
124
|
+
* Format: spot@public.aggre.bookTicker.v3.api.pb@100ms@INDYUSDT...
|
|
125
|
+
*/
|
|
126
|
+
static decodeTickerMessage(message, channel) {
|
|
127
|
+
try {
|
|
128
|
+
const symbolMatch = message.match(/([A-Z]{3,10}USDT)/);
|
|
129
|
+
const symbol = symbolMatch ? symbolMatch[1] : 'UNKNOWN';
|
|
130
|
+
const priceMatches = message.match(/(\d+\.\d+)/g);
|
|
131
|
+
let bidprice = '0';
|
|
132
|
+
let askprice = '0';
|
|
133
|
+
let bidquantity = '0';
|
|
134
|
+
let askquantity = '0';
|
|
135
|
+
if (priceMatches && priceMatches.length >= 2) {
|
|
136
|
+
bidprice = priceMatches[0];
|
|
137
|
+
askprice = priceMatches[1];
|
|
138
|
+
if (priceMatches.length >= 4) {
|
|
139
|
+
bidquantity = priceMatches[2];
|
|
140
|
+
askquantity = priceMatches[3];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const decoded = {
|
|
144
|
+
bidprice,
|
|
145
|
+
askprice,
|
|
146
|
+
bidquantity,
|
|
147
|
+
askquantity
|
|
148
|
+
};
|
|
149
|
+
return {
|
|
150
|
+
type: 'ticker',
|
|
151
|
+
raw: message,
|
|
152
|
+
channel,
|
|
153
|
+
symbol,
|
|
154
|
+
decoded
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return {
|
|
159
|
+
type: 'ticker',
|
|
160
|
+
raw: message,
|
|
161
|
+
channel,
|
|
162
|
+
error: `Ticker decode error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Decode trades protobuf messages
|
|
168
|
+
* Format: spot@public.aggre.deals.v3.api.pb@100ms@INDYUSDT...
|
|
169
|
+
*/
|
|
170
|
+
static decodeTradesMessage(message, channel) {
|
|
171
|
+
try {
|
|
172
|
+
const symbolMatch = message.match(/([A-Z]{3,10}USDT)/);
|
|
173
|
+
const symbol = symbolMatch ? symbolMatch[1] : 'UNKNOWN';
|
|
174
|
+
const priceMatches = message.match(/(\d+\.\d+)/g);
|
|
175
|
+
const dealsList = [];
|
|
176
|
+
if (priceMatches && priceMatches.length >= 2) {
|
|
177
|
+
dealsList.push({
|
|
178
|
+
price: priceMatches[0],
|
|
179
|
+
quantity: priceMatches[1] || '1.0',
|
|
180
|
+
time: Date.now().toString(),
|
|
181
|
+
tradetype: 1
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const decoded = {
|
|
185
|
+
dealsList,
|
|
186
|
+
eventtype: 'trade'
|
|
187
|
+
};
|
|
188
|
+
return {
|
|
189
|
+
type: 'trades',
|
|
190
|
+
raw: message,
|
|
191
|
+
channel,
|
|
192
|
+
symbol,
|
|
193
|
+
decoded
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
return {
|
|
198
|
+
type: 'trades',
|
|
199
|
+
raw: message,
|
|
200
|
+
channel,
|
|
201
|
+
error: `Trades decode error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Extract order status from MEXC protobuf message
|
|
207
|
+
*/
|
|
208
|
+
static extractProtobufOrderStatus(message) {
|
|
209
|
+
const hasCancelled = message.includes('\\u0004') || message.includes('\u0004');
|
|
210
|
+
const hasPartial = message.includes('\\u0003') || message.includes('\u0003');
|
|
211
|
+
const hasFilled = message.includes('\\u0002') || message.includes('\u0002');
|
|
212
|
+
if (hasCancelled)
|
|
213
|
+
return 'cancelled';
|
|
214
|
+
if (hasPartial)
|
|
215
|
+
return 'partially_filled';
|
|
216
|
+
if (hasFilled)
|
|
217
|
+
return 'filled';
|
|
218
|
+
const upperMessage = message.toUpperCase();
|
|
219
|
+
if (upperMessage.includes('CANCEL')) {
|
|
220
|
+
return 'cancelled';
|
|
221
|
+
}
|
|
222
|
+
else if (upperMessage.includes('FILLED') || upperMessage.includes('FILL')) {
|
|
223
|
+
return 'filled';
|
|
224
|
+
}
|
|
225
|
+
else if (upperMessage.includes('PARTIAL')) {
|
|
226
|
+
return 'partially_filled';
|
|
227
|
+
}
|
|
228
|
+
else if (upperMessage.includes('EXECUTED') || upperMessage.includes('EXEC')) {
|
|
229
|
+
return 'filled';
|
|
230
|
+
}
|
|
231
|
+
return 'new';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
exports.MexcProtobufDecoder = MexcProtobufDecoder;
|
|
235
|
+
//# sourceMappingURL=mexc-protobuf-decoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mexc-protobuf-decoder.js","sourceRoot":"","sources":["../../../src/exchanges/mexc/mexc-protobuf-decoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Order, Trade } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Official MEXC User Stream Documentation:
|
|
4
|
+
*
|
|
5
|
+
* This user stream module provides:
|
|
6
|
+
* - Real-time order updates (limit/market orders)
|
|
7
|
+
* - Real-time trade executions (fills)
|
|
8
|
+
* - Management of user data stream connection
|
|
9
|
+
* - Keep-alive and listen key management
|
|
10
|
+
*
|
|
11
|
+
* https://www.mexc.com/api-docs/spot-v3/websocket-market-streams
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* MEXC User Data Stream Manager
|
|
16
|
+
* Handles user-specific data stream operations for real-time order updates
|
|
17
|
+
*/
|
|
18
|
+
export declare class MexcUserStream {
|
|
19
|
+
private listenKey?;
|
|
20
|
+
private userDataWs?;
|
|
21
|
+
private keepAliveInterval?;
|
|
22
|
+
private makeRequestFn;
|
|
23
|
+
private logger;
|
|
24
|
+
private orderCallback?;
|
|
25
|
+
private tradeCallback?;
|
|
26
|
+
constructor(makeRequestFn: (endpoint: string, params: Record<string, unknown>, method: string) => Promise<any>);
|
|
27
|
+
/**
|
|
28
|
+
* Connect to user data stream for real-time order updates
|
|
29
|
+
*/
|
|
30
|
+
connectUserDataStream(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Set up immediate disconnect detection
|
|
33
|
+
*/
|
|
34
|
+
private setupDisconnectHandler;
|
|
35
|
+
/**
|
|
36
|
+
* Monitor connection status and reconnect if needed
|
|
37
|
+
*/
|
|
38
|
+
private startConnectionMonitoring;
|
|
39
|
+
/**
|
|
40
|
+
* Reconnect the user data stream
|
|
41
|
+
*/
|
|
42
|
+
private reconnectUserDataStream;
|
|
43
|
+
/**
|
|
44
|
+
* Disconnect user data stream
|
|
45
|
+
*/
|
|
46
|
+
disconnectUserDataStream(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Subscribe to real-time user order updates (limit/market orders)
|
|
49
|
+
*/
|
|
50
|
+
subscribeUserOrders(callback: (order: Order) => void): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Check if user data stream is connected
|
|
53
|
+
*/
|
|
54
|
+
isUserDataStreamConnected(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Subscribe to real-time user trade executions
|
|
57
|
+
* Notifies when user's orders are filled/executed
|
|
58
|
+
*/
|
|
59
|
+
subscribeUserTrades(callback: (trade: Trade) => void): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Get a listen key for user data stream
|
|
62
|
+
*/
|
|
63
|
+
getListenKey(): Promise<string>;
|
|
64
|
+
/**
|
|
65
|
+
* Keep alive a user data stream
|
|
66
|
+
*/
|
|
67
|
+
keepAliveListenKey(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Delete a user data stream
|
|
70
|
+
*/
|
|
71
|
+
deleteListenKey(): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if the data represents a trade execution event
|
|
74
|
+
*/
|
|
75
|
+
private isTradeExecution;
|
|
76
|
+
/**
|
|
77
|
+
* Transform user data to Trade format for trade executions
|
|
78
|
+
*/
|
|
79
|
+
private transformToTrade;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=mexc-user-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mexc-user-stream.d.ts","sourceRoot":"","sources":["../../../src/exchanges/mexc/mexc-user-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;;;;;;;GAWG;AACH;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAC3C,OAAO,CAAC,aAAa,CAAsF;IAC3G,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAC,CAAyB;gBAEnC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC;IAI9G;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B5C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAajC;;OAEG;YACW,uBAAuB;IAoCrC;;OAEG;IACG,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB/C;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAe5E;;OAEG;IACH,yBAAyB,IAAI,OAAO;IAIpC;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB5E;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAarC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUzC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MexcUserStream = void 0;
|
|
4
|
+
const mexc_websocket_1 = require("./mexc-websocket");
|
|
5
|
+
const utils_1 = require("../../utils");
|
|
6
|
+
/**
|
|
7
|
+
* Official MEXC User Stream Documentation:
|
|
8
|
+
*
|
|
9
|
+
* This user stream module provides:
|
|
10
|
+
* - Real-time order updates (limit/market orders)
|
|
11
|
+
* - Real-time trade executions (fills)
|
|
12
|
+
* - Management of user data stream connection
|
|
13
|
+
* - Keep-alive and listen key management
|
|
14
|
+
*
|
|
15
|
+
* https://www.mexc.com/api-docs/spot-v3/websocket-market-streams
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* MEXC User Data Stream Manager
|
|
20
|
+
* Handles user-specific data stream operations for real-time order updates
|
|
21
|
+
*/
|
|
22
|
+
class MexcUserStream {
|
|
23
|
+
constructor(makeRequestFn) {
|
|
24
|
+
this.logger = (0, utils_1.createLogger)('mexc-user-stream');
|
|
25
|
+
this.makeRequestFn = makeRequestFn;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Connect to user data stream for real-time order updates
|
|
29
|
+
*/
|
|
30
|
+
async connectUserDataStream() {
|
|
31
|
+
try {
|
|
32
|
+
await this.getListenKey();
|
|
33
|
+
if (!this.userDataWs) {
|
|
34
|
+
const wsUrl = `wss://wbs-api.mexc.com/ws?listenKey=${this.listenKey}`;
|
|
35
|
+
this.userDataWs = new mexc_websocket_1.MexcWebSocket(wsUrl);
|
|
36
|
+
}
|
|
37
|
+
await this.userDataWs.connectWebSocket();
|
|
38
|
+
this.logger.info('✅ User data stream connected successfully');
|
|
39
|
+
this.keepAliveInterval = setInterval(() => {
|
|
40
|
+
this.keepAliveListenKey().catch((error) => this.logger.error('Keep alive listen key failed', { error }));
|
|
41
|
+
}, 30 * 60 * 1000);
|
|
42
|
+
this.setupDisconnectHandler();
|
|
43
|
+
this.startConnectionMonitoring();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.logger.error('❌ Failed to connect user data stream:', { error });
|
|
47
|
+
throw new Error(`Failed to connect user data stream: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Set up immediate disconnect detection
|
|
52
|
+
*/
|
|
53
|
+
setupDisconnectHandler() {
|
|
54
|
+
if (!this.userDataWs)
|
|
55
|
+
return;
|
|
56
|
+
const originalOnClose = this.userDataWs.ws?.onclose;
|
|
57
|
+
if (this.userDataWs.ws) {
|
|
58
|
+
this.userDataWs.ws.onclose = (event) => {
|
|
59
|
+
if (originalOnClose) {
|
|
60
|
+
originalOnClose.call(this.userDataWs.ws, event);
|
|
61
|
+
}
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
if (this.userDataWs && !this.userDataWs.isConnected()) {
|
|
64
|
+
this.reconnectUserDataStream().catch((error) => this.logger.error('Immediate reconnection failed:', { error }));
|
|
65
|
+
}
|
|
66
|
+
}, 1000);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Monitor connection status and reconnect if needed
|
|
72
|
+
*/
|
|
73
|
+
startConnectionMonitoring() {
|
|
74
|
+
setInterval(() => {
|
|
75
|
+
if (this.userDataWs && !this.userDataWs.isConnected()) {
|
|
76
|
+
this.reconnectUserDataStream().catch((error) => this.logger.error('Failed to reconnect user data stream:', { error }));
|
|
77
|
+
}
|
|
78
|
+
else if (this.userDataWs) {
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.logger.warn('⚠️ No user data WebSocket instance found');
|
|
82
|
+
}
|
|
83
|
+
}, 10000);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Reconnect the user data stream
|
|
87
|
+
*/
|
|
88
|
+
async reconnectUserDataStream() {
|
|
89
|
+
try {
|
|
90
|
+
if (this.userDataWs) {
|
|
91
|
+
await this.userDataWs.disconnectWebSocket();
|
|
92
|
+
this.userDataWs = undefined;
|
|
93
|
+
}
|
|
94
|
+
await this.getListenKey();
|
|
95
|
+
const wsUrl = `wss://wbs-api.mexc.com/ws?listenKey=${this.listenKey}`;
|
|
96
|
+
this.userDataWs = new mexc_websocket_1.MexcWebSocket(wsUrl);
|
|
97
|
+
await this.userDataWs.connectWebSocket();
|
|
98
|
+
this.setupDisconnectHandler();
|
|
99
|
+
if (this.orderCallback) {
|
|
100
|
+
await this.userDataWs.subscribeToUserData(this.orderCallback);
|
|
101
|
+
}
|
|
102
|
+
if (this.tradeCallback) {
|
|
103
|
+
const wrappedCallback = (data) => {
|
|
104
|
+
if (this.isTradeExecution(data)) {
|
|
105
|
+
const trade = this.transformToTrade(data);
|
|
106
|
+
this.tradeCallback(trade);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
await this.userDataWs.subscribeToUserData(wrappedCallback);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.logger.error('❌ Failed to reconnect user data stream:', { error });
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Disconnect user data stream
|
|
119
|
+
*/
|
|
120
|
+
async disconnectUserDataStream() {
|
|
121
|
+
try {
|
|
122
|
+
if (this.keepAliveInterval) {
|
|
123
|
+
clearInterval(this.keepAliveInterval);
|
|
124
|
+
this.keepAliveInterval = undefined;
|
|
125
|
+
}
|
|
126
|
+
if (this.userDataWs) {
|
|
127
|
+
await this.userDataWs.disconnectWebSocket();
|
|
128
|
+
this.userDataWs = undefined;
|
|
129
|
+
}
|
|
130
|
+
await this.deleteListenKey();
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
this.logger.warn('Error during user data stream disconnect', { error });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Subscribe to real-time user order updates (limit/market orders)
|
|
138
|
+
*/
|
|
139
|
+
async subscribeUserOrders(callback) {
|
|
140
|
+
try {
|
|
141
|
+
if (!this.userDataWs) {
|
|
142
|
+
throw new Error('User data stream not connected. Call connect() first.');
|
|
143
|
+
}
|
|
144
|
+
this.orderCallback = callback;
|
|
145
|
+
return await this.userDataWs.subscribeToUserData(callback);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
this.logger.error('❌ Failed to subscribe to user orders:', { error });
|
|
149
|
+
throw new Error(`Failed to subscribe to user orders: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if user data stream is connected
|
|
154
|
+
*/
|
|
155
|
+
isUserDataStreamConnected() {
|
|
156
|
+
return this.userDataWs?.isConnected() || false;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Subscribe to real-time user trade executions
|
|
160
|
+
* Notifies when user's orders are filled/executed
|
|
161
|
+
*/
|
|
162
|
+
async subscribeUserTrades(callback) {
|
|
163
|
+
try {
|
|
164
|
+
if (!this.userDataWs) {
|
|
165
|
+
throw new Error('User data stream not connected. Call connect() first.');
|
|
166
|
+
}
|
|
167
|
+
this.tradeCallback = callback;
|
|
168
|
+
const wrappedCallback = (data) => {
|
|
169
|
+
if (this.isTradeExecution(data)) {
|
|
170
|
+
const trade = this.transformToTrade(data);
|
|
171
|
+
callback(trade);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
return await this.userDataWs.subscribeToUserData(wrappedCallback);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new Error(`Failed to subscribe to user trades: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get a listen key for user data stream
|
|
182
|
+
*/
|
|
183
|
+
async getListenKey() {
|
|
184
|
+
try {
|
|
185
|
+
const result = await this.makeRequestFn('/userDataStream', {}, 'POST');
|
|
186
|
+
this.listenKey = result.listenKey;
|
|
187
|
+
if (!this.listenKey) {
|
|
188
|
+
throw new Error('No listen key received from API');
|
|
189
|
+
}
|
|
190
|
+
return this.listenKey;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new Error(`Failed to get listen key: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Keep alive a user data stream
|
|
198
|
+
*/
|
|
199
|
+
async keepAliveListenKey() {
|
|
200
|
+
if (!this.listenKey)
|
|
201
|
+
return;
|
|
202
|
+
try {
|
|
203
|
+
await this.makeRequestFn('/userDataStream', { listenKey: this.listenKey }, 'PUT');
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
this.logger.warn('Failed to keep alive listen key', { error });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Delete a user data stream
|
|
211
|
+
*/
|
|
212
|
+
async deleteListenKey() {
|
|
213
|
+
if (!this.listenKey)
|
|
214
|
+
return;
|
|
215
|
+
try {
|
|
216
|
+
await this.makeRequestFn('/userDataStream', { listenKey: this.listenKey }, 'DELETE');
|
|
217
|
+
this.listenKey = undefined;
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
this.logger.warn('Failed to delete listen key', { error });
|
|
221
|
+
this.listenKey = undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check if the data represents a trade execution event
|
|
226
|
+
*/
|
|
227
|
+
isTradeExecution(data) {
|
|
228
|
+
if (!data || typeof data !== 'object') {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
const isFilled = data.status === 'filled';
|
|
232
|
+
const isPartiallyFilled = data.filled && data.filled > 0;
|
|
233
|
+
const hasExecutedQuantity = data.amount && data.filled && (data.filled / data.amount) > 0;
|
|
234
|
+
return isFilled || isPartiallyFilled || hasExecutedQuantity;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Transform user data to Trade format for trade executions
|
|
238
|
+
*/
|
|
239
|
+
transformToTrade(data) {
|
|
240
|
+
return {
|
|
241
|
+
id: data.tradeId || `${data.id}_${Date.now()}`,
|
|
242
|
+
orderId: data.id,
|
|
243
|
+
symbol: data.symbol,
|
|
244
|
+
side: data.side,
|
|
245
|
+
amount: parseFloat(data.filled || data.executedQty || '0'),
|
|
246
|
+
price: parseFloat(data.price || '0'),
|
|
247
|
+
fee: parseFloat(data.fee || '0'),
|
|
248
|
+
timestamp: data.timestamp || Date.now()
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.MexcUserStream = MexcUserStream;
|
|
253
|
+
//# sourceMappingURL=mexc-user-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mexc-user-stream.js","sourceRoot":"","sources":["../../../src/exchanges/mexc/mexc-user-stream.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AAEjD,uCAA2C;AAG3C;;;;;;;;;;;GAWG;AACH;;;GAGG;AACH,MAAa,cAAc;IASzB,YAAY,aAAkG;QAJtG,WAAM,GAAG,IAAA,oBAAY,EAAC,kBAAkB,CAAC,CAAC;QAKhD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,uCAAuC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACtE,IAAI,CAAC,UAAU,GAAG,IAAI,8BAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YAE9D,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;gBACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3G,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAEnB,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE9B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEnC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,MAAM,eAAe,GAAI,IAAI,CAAC,UAAkB,CAAC,EAAE,EAAE,OAAO,CAAC;QAC7D,IAAK,IAAI,CAAC,UAAkB,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAkB,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,KAAU,EAAE,EAAE;gBAEnD,IAAI,eAAe,EAAE,CAAC;oBACpB,eAAe,CAAC,IAAI,CAAE,IAAI,CAAC,UAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC3D,CAAC;gBAED,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;wBACtD,IAAI,CAAC,uBAAuB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,CAAC,CAC/D,CAAC;oBACJ,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,yBAAyB;QAC/B,WAAW,CAAC,GAAG,EAAE;YACf,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtD,IAAI,CAAC,uBAAuB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CACtE,CAAC;YACJ,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB;QACnC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBAC5C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;YAED,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE1B,MAAM,KAAK,GAAG,uCAAuC,IAAI,CAAC,SAAS,EAAE,CAAC;YACtE,IAAI,CAAC,UAAU,GAAG,IAAI,8BAAa,CAAC,KAAK,CAAC,CAAC;YAE3C,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAEzC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAE9B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,eAAe,GAAG,CAAC,IAAS,EAAE,EAAE;oBACpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;wBAC1C,IAAI,CAAC,aAAc,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC,CAAC;gBACF,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;YAC7D,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB;QAC5B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACrC,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBAC5C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;YAED,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IACD;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgC;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAE9B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,yBAAyB;QACvB,OAAO,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,KAAK,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgC;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;YAC9B,MAAM,eAAe,GAAG,CAAC,IAAS,EAAE,EAAE;gBACpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;oBAC1C,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC;YAEF,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;YACrF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAS;QAChC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;QAC1C,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1F,OAAO,QAAQ,IAAI,iBAAiB,IAAI,mBAAmB,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAS;QAChC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;YAC9C,OAAO,EAAE,IAAI,CAAC,EAAE;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC;YAC1D,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;YACpC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;SACxC,CAAC;IACJ,CAAC;CACF;AAzQD,wCAyQC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Order, OrderType, OrderSide } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* MEXC Utility Functions
|
|
4
|
+
* Handles MEXC-specific operations like symbol formatting, order parameters, and WebSocket data processing
|
|
5
|
+
*
|
|
6
|
+
* This class focuses on MEXC-specific utilities and WebSocket message processing
|
|
7
|
+
*/
|
|
8
|
+
export declare class MexcUtils {
|
|
9
|
+
/**
|
|
10
|
+
* Unified order transformation function
|
|
11
|
+
* Handles all MEXC order formats: REST API, WebSocket, Protobuf, User Data
|
|
12
|
+
*/
|
|
13
|
+
static transformOrder(orderData: any): Order;
|
|
14
|
+
private static isProtobufOrder;
|
|
15
|
+
private static isUserDataOrder;
|
|
16
|
+
private static isRestApiOrder;
|
|
17
|
+
private static isWebSocketUserOrder;
|
|
18
|
+
private static transformProtobufOrderInternal;
|
|
19
|
+
private static transformUserDataOrderInternal;
|
|
20
|
+
private static transformRestApiOrderInternal;
|
|
21
|
+
private static transformWebSocketUserOrderInternal;
|
|
22
|
+
/**
|
|
23
|
+
* Create order parameters in MEXC format
|
|
24
|
+
*/
|
|
25
|
+
static createOrderParams(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: number): Record<string, any>;
|
|
26
|
+
/**
|
|
27
|
+
* Determine order side from protobuf message patterns
|
|
28
|
+
*/
|
|
29
|
+
static determineSide(message: string): 'buy' | 'sell';
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=mexc-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mexc-utils.d.ts","sourceRoot":"","sources":["../../../src/exchanges/mexc/mexc-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAA0C,MAAM,aAAa,CAAC;AAIlG;;;;;GAKG;AACH,qBAAa,SAAS;IAEpB;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,KAAK;IAmB5C,OAAO,CAAC,MAAM,CAAC,eAAe;IAM9B,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B,OAAO,CAAC,MAAM,CAAC,cAAc;IAM7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAOnC,OAAO,CAAC,MAAM,CAAC,8BAA8B;IA4B7C,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAoC7C,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAmB5C,OAAO,CAAC,MAAM,CAAC,mCAAmC;IAuBlD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgBtB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM;CAQtD"}
|