ccxt 4.3.66 → 4.3.67

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/js/src/bingx.js CHANGED
@@ -286,6 +286,10 @@ export default class bingx extends Exchange {
286
286
  'trade/leverage': 2,
287
287
  'trade/forceOrders': 2,
288
288
  'trade/allFillOrders': 2,
289
+ 'trade/openOrders': 2,
290
+ 'trade/orderDetail': 2,
291
+ 'trade/orderHistory': 2,
292
+ 'trade/marginType': 2,
289
293
  'user/commissionRate': 2,
290
294
  'user/positions': 2,
291
295
  'user/balance': 2,
@@ -294,9 +298,12 @@ export default class bingx extends Exchange {
294
298
  'trade/order': 2,
295
299
  'trade/leverage': 2,
296
300
  'trade/closeAllPositions': 2,
301
+ 'trade/marginType': 2,
302
+ 'trade/positionMargin': 2,
297
303
  },
298
304
  'delete': {
299
305
  'trade/allOpenOrders': 2,
306
+ 'trade/cancelOrder': 2,
300
307
  },
301
308
  },
302
309
  },
@@ -3007,7 +3014,8 @@ export default class bingx extends Exchange {
3007
3014
  // "clientOrderID": ""
3008
3015
  // }
3009
3016
  //
3010
- // inverse swap cancelAllOrders
3017
+ // inverse swap cancelAllOrders, cancelOrder
3018
+ // inverse swap cancelAllOrders, cancelOrder, fetchOpenOrders
3011
3019
  //
3012
3020
  // {
3013
3021
  // "symbol": "SOL-USD",
@@ -3169,13 +3177,14 @@ export default class bingx extends Exchange {
3169
3177
  * @method
3170
3178
  * @name bingx#cancelOrder
3171
3179
  * @description cancels an open order
3172
- * @see https://bingx-api.github.io/docs/#/spot/trade-api.html#Cancel%20an%20Order
3173
- * @see https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Cancel%20an%20Order
3180
+ * @see https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Cancel%20Order
3181
+ * @see https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Cancel%20Order
3182
+ * @see https://bingx-api.github.io/docs/#/en-us/cswap/trade-api.html#Cancel%20an%20Order
3174
3183
  * @param {string} id order id
3175
3184
  * @param {string} symbol unified symbol of the market the order was made in
3176
3185
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3177
3186
  * @param {string} [params.clientOrderId] a unique id for the order
3178
- * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
3187
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
3179
3188
  */
3180
3189
  if (symbol === undefined) {
3181
3190
  throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
@@ -3194,12 +3203,20 @@ export default class bingx extends Exchange {
3194
3203
  request['orderId'] = id;
3195
3204
  }
3196
3205
  let response = undefined;
3197
- const [marketType, query] = this.handleMarketTypeAndParams('cancelOrder', market, params);
3198
- if (marketType === 'spot') {
3199
- response = await this.spotV1PrivatePostTradeCancel(this.extend(request, query));
3206
+ let type = undefined;
3207
+ let subType = undefined;
3208
+ [type, params] = this.handleMarketTypeAndParams('cancelOrder', market, params);
3209
+ [subType, params] = this.handleSubTypeAndParams('cancelOrder', market, params);
3210
+ if (type === 'spot') {
3211
+ response = await this.spotV1PrivatePostTradeCancel(this.extend(request, params));
3200
3212
  }
3201
3213
  else {
3202
- response = await this.swapV2PrivateDeleteTradeOrder(this.extend(request, query));
3214
+ if (subType === 'inverse') {
3215
+ response = await this.cswapV1PrivateDeleteTradeCancelOrder(this.extend(request, params));
3216
+ }
3217
+ else {
3218
+ response = await this.swapV2PrivateDeleteTradeOrder(this.extend(request, params));
3219
+ }
3203
3220
  }
3204
3221
  //
3205
3222
  // spot
@@ -3220,7 +3237,59 @@ export default class bingx extends Exchange {
3220
3237
  // }
3221
3238
  // }
3222
3239
  //
3223
- // swap
3240
+ // inverse swap
3241
+ //
3242
+ // {
3243
+ // "code": 0,
3244
+ // "msg": "",
3245
+ // "data": {
3246
+ // "order": {
3247
+ // "symbol": "SOL-USD",
3248
+ // "orderId": "1816002957423951872",
3249
+ // "side": "BUY",
3250
+ // "positionSide": "Long",
3251
+ // "type": "Pending",
3252
+ // "quantity": 0,
3253
+ // "origQty": "0",
3254
+ // "price": "150",
3255
+ // "executedQty": "0",
3256
+ // "avgPrice": "0",
3257
+ // "cumQuote": "0",
3258
+ // "stopPrice": "",
3259
+ // "profit": "0.0000",
3260
+ // "commission": "0.000000",
3261
+ // "status": "CANCELLED",
3262
+ // "time": 1721803819410,
3263
+ // "updateTime": 1721803819427,
3264
+ // "clientOrderId": "",
3265
+ // "leverage": "",
3266
+ // "takeProfit": {
3267
+ // "type": "",
3268
+ // "quantity": 0,
3269
+ // "stopPrice": 0,
3270
+ // "price": 0,
3271
+ // "workingType": "",
3272
+ // "stopGuaranteed": ""
3273
+ // },
3274
+ // "stopLoss": {
3275
+ // "type": "",
3276
+ // "quantity": 0,
3277
+ // "stopPrice": 0,
3278
+ // "price": 0,
3279
+ // "workingType": "",
3280
+ // "stopGuaranteed": ""
3281
+ // },
3282
+ // "advanceAttr": 0,
3283
+ // "positionID": 0,
3284
+ // "takeProfitEntrustPrice": 0,
3285
+ // "stopLossEntrustPrice": 0,
3286
+ // "orderType": "",
3287
+ // "workingType": ""
3288
+ // }
3289
+ // }
3290
+ // }
3291
+ //
3292
+ // linear swap
3224
3293
  //
3225
3294
  // {
3226
3295
  // "code": 0,
@@ -3247,9 +3316,9 @@ export default class bingx extends Exchange {
3247
3316
  // }
3248
3317
  // }
3249
3318
  //
3250
- const data = this.safeValue(response, 'data');
3251
- const first = this.safeDict(data, 'order', data);
3252
- return this.parseOrder(first, market);
3319
+ const data = this.safeDict(response, 'data', {});
3320
+ const order = this.safeDict(data, 'order', data);
3321
+ return this.parseOrder(order, market);
3253
3322
  }
3254
3323
  async cancelAllOrders(symbol = undefined, params = {}) {
3255
3324
  /**
@@ -3729,9 +3798,10 @@ export default class bingx extends Exchange {
3729
3798
  /**
3730
3799
  * @method
3731
3800
  * @name bingx#fetchOpenOrders
3732
- * @see https://bingx-api.github.io/docs/#/spot/trade-api.html#Query%20Open%20Orders
3733
- * @see https://bingx-api.github.io/docs/#/swapV2/trade-api.html#Query%20all%20current%20pending%20orders
3734
3801
  * @description fetch all unfilled currently open orders
3802
+ * @see https://bingx-api.github.io/docs/#/en-us/spot/trade-api.html#Current%20Open%20Orders
3803
+ * @see https://bingx-api.github.io/docs/#/en-us/swapV2/trade-api.html#Current%20All%20Open%20Orders
3804
+ * @see https://bingx-api.github.io/docs/#/en-us/cswap/trade-api.html#Query%20all%20current%20pending%20orders
3735
3805
  * @param {string} symbol unified market symbol
3736
3806
  * @param {int} [since] the earliest time in ms to fetch open orders for
3737
3807
  * @param {int} [limit] the maximum number of open order structures to retrieve
@@ -3745,13 +3815,21 @@ export default class bingx extends Exchange {
3745
3815
  market = this.market(symbol);
3746
3816
  request['symbol'] = market['id'];
3747
3817
  }
3818
+ let type = undefined;
3819
+ let subType = undefined;
3748
3820
  let response = undefined;
3749
- const [marketType, query] = this.handleMarketTypeAndParams('fetchOpenOrders', market, params);
3750
- if (marketType === 'spot') {
3751
- response = await this.spotV1PrivateGetTradeOpenOrders(this.extend(request, query));
3821
+ [type, params] = this.handleMarketTypeAndParams('fetchOpenOrders', market, params);
3822
+ [subType, params] = this.handleSubTypeAndParams('fetchOpenOrders', market, params);
3823
+ if (type === 'spot') {
3824
+ response = await this.spotV1PrivateGetTradeOpenOrders(this.extend(request, params));
3752
3825
  }
3753
3826
  else {
3754
- response = await this.swapV2PrivateGetTradeOpenOrders(this.extend(request, query));
3827
+ if (subType === 'inverse') {
3828
+ response = await this.cswapV1PrivateGetTradeOpenOrders(this.extend(request, params));
3829
+ }
3830
+ else {
3831
+ response = await this.swapV2PrivateGetTradeOpenOrders(this.extend(request, params));
3832
+ }
3755
3833
  }
3756
3834
  //
3757
3835
  // spot
@@ -3779,7 +3857,61 @@ export default class bingx extends Exchange {
3779
3857
  // }
3780
3858
  // }
3781
3859
  //
3782
- // swap
3860
+ // inverse swap
3861
+ //
3862
+ // {
3863
+ // "code": 0,
3864
+ // "msg": "",
3865
+ // "data": {
3866
+ // "orders": [
3867
+ // {
3868
+ // "symbol": "SOL-USD",
3869
+ // "orderId": "1816013900044320768",
3870
+ // "side": "BUY",
3871
+ // "positionSide": "Long",
3872
+ // "type": "LIMIT",
3873
+ // "quantity": 1,
3874
+ // "origQty": "",
3875
+ // "price": "150",
3876
+ // "executedQty": "0",
3877
+ // "avgPrice": "0.000",
3878
+ // "cumQuote": "",
3879
+ // "stopPrice": "",
3880
+ // "profit": "0.0000",
3881
+ // "commission": "0.0000",
3882
+ // "status": "Pending",
3883
+ // "time": 1721806428334,
3884
+ // "updateTime": 1721806428352,
3885
+ // "clientOrderId": "",
3886
+ // "leverage": "",
3887
+ // "takeProfit": {
3888
+ // "type": "TAKE_PROFIT",
3889
+ // "quantity": 0,
3890
+ // "stopPrice": 0,
3891
+ // "price": 0,
3892
+ // "workingType": "MARK_PRICE",
3893
+ // "stopGuaranteed": ""
3894
+ // },
3895
+ // "stopLoss": {
3896
+ // "type": "STOP",
3897
+ // "quantity": 0,
3898
+ // "stopPrice": 0,
3899
+ // "price": 0,
3900
+ // "workingType": "MARK_PRICE",
3901
+ // "stopGuaranteed": ""
3902
+ // },
3903
+ // "advanceAttr": 0,
3904
+ // "positionID": 0,
3905
+ // "takeProfitEntrustPrice": 0,
3906
+ // "stopLossEntrustPrice": 0,
3907
+ // "orderType": "",
3908
+ // "workingType": "MARK_PRICE"
3909
+ // }
3910
+ // ]
3911
+ // }
3912
+ // }
3913
+ //
3914
+ // linear swap
3783
3915
  //
3784
3916
  // {
3785
3917
  // "code": 0,
package/js/src/bithumb.js CHANGED
@@ -206,17 +206,57 @@ export default class bithumb extends Exchange {
206
206
  * @returns {object[]} an array of objects representing market data
207
207
  */
208
208
  const result = [];
209
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
209
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
210
210
  const quotes = Object.keys(quoteCurrencies);
211
+ const promises = [];
211
212
  for (let i = 0; i < quotes.length; i++) {
212
- const quote = quotes[i];
213
- const quoteId = quote;
214
- const extension = this.safeValue(quoteCurrencies, quote, {});
215
213
  const request = {
216
- 'quoteId': quoteId,
214
+ 'quoteId': quotes[i],
217
215
  };
218
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
219
- const data = this.safeValue(response, 'data');
216
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
217
+ //
218
+ // {
219
+ // "status": "0000",
220
+ // "data": {
221
+ // "ETH": {
222
+ // "opening_price": "0.05153399",
223
+ // "closing_price": "0.05145144",
224
+ // "min_price": "0.05145144",
225
+ // "max_price": "0.05160781",
226
+ // "units_traded": "6.541124172077830855",
227
+ // "acc_trade_value": "0.33705472498492329997697755",
228
+ // "prev_closing_price": "0.0515943",
229
+ // "units_traded_24H": "43.368879902677400513",
230
+ // "acc_trade_value_24H": "2.24165339555398079994373342",
231
+ // "fluctate_24H": "-0.00018203",
232
+ // "fluctate_rate_24H": "-0.35"
233
+ // },
234
+ // "XRP": {
235
+ // "opening_price": "0.00000918",
236
+ // "closing_price": "0.0000092",
237
+ // "min_price": "0.00000918",
238
+ // "max_price": "0.0000092",
239
+ // "units_traded": "6516.949363",
240
+ // "acc_trade_value": "0.0598792533602796",
241
+ // "prev_closing_price": "0.00000916",
242
+ // "units_traded_24H": "229161.50354738",
243
+ // "acc_trade_value_24H": "2.0446589371637117",
244
+ // "fluctate_24H": "0.00000049",
245
+ // "fluctate_rate_24H": "5.63"
246
+ // },
247
+ // ...
248
+ // "date": "1721675913145"
249
+ // }
250
+ // }
251
+ //
252
+ }
253
+ const results = await Promise.all(promises);
254
+ for (let i = 0; i < quotes.length; i++) {
255
+ const quote = quotes[i];
256
+ const quoteId = quote;
257
+ const response = results[i];
258
+ const data = this.safeDict(response, 'data');
259
+ const extension = this.safeDict(quoteCurrencies, quote, {});
220
260
  const currencyIds = Object.keys(data);
221
261
  for (let j = 0; j < currencyIds.length; j++) {
222
262
  const currencyId = currencyIds[j];
@@ -285,7 +325,7 @@ export default class bithumb extends Exchange {
285
325
  }
286
326
  parseBalance(response) {
287
327
  const result = { 'info': response };
288
- const balances = this.safeValue(response, 'data');
328
+ const balances = this.safeDict(response, 'data');
289
329
  const codes = Object.keys(this.currencies);
290
330
  for (let i = 0; i < codes.length; i++) {
291
331
  const code = codes[i];
@@ -356,7 +396,7 @@ export default class bithumb extends Exchange {
356
396
  // }
357
397
  // }
358
398
  //
359
- const data = this.safeValue(response, 'data', {});
399
+ const data = this.safeDict(response, 'data', {});
360
400
  const timestamp = this.safeInteger(data, 'timestamp');
361
401
  return this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks', 'price', 'quantity');
362
402
  }
@@ -420,15 +460,19 @@ export default class bithumb extends Exchange {
420
460
  */
421
461
  await this.loadMarkets();
422
462
  const result = {};
423
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
463
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
424
464
  const quotes = Object.keys(quoteCurrencies);
465
+ const promises = [];
425
466
  for (let i = 0; i < quotes.length; i++) {
426
- const quote = quotes[i];
427
- const quoteId = quote;
428
467
  const request = {
429
- 'quoteId': quoteId,
468
+ 'quoteId': quotes[i],
430
469
  };
431
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
470
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
471
+ }
472
+ const responses = await Promise.all(promises);
473
+ for (let i = 0; i < quotes.length; i++) {
474
+ const quote = quotes[i];
475
+ const response = responses[i];
432
476
  //
433
477
  // {
434
478
  // "status":"0000",
@@ -450,7 +494,7 @@ export default class bithumb extends Exchange {
450
494
  // }
451
495
  // }
452
496
  //
453
- const data = this.safeValue(response, 'data', {});
497
+ const data = this.safeDict(response, 'data', {});
454
498
  const timestamp = this.safeInteger(data, 'date');
455
499
  const tickers = this.omit(data, 'date');
456
500
  const currencyIds = Object.keys(tickers);
@@ -835,7 +879,7 @@ export default class bithumb extends Exchange {
835
879
  // }
836
880
  //
837
881
  const timestamp = this.safeIntegerProduct(order, 'order_date', 0.001);
838
- const sideProperty = this.safeValue2(order, 'type', 'side');
882
+ const sideProperty = this.safeString2(order, 'type', 'side');
839
883
  const side = (sideProperty === 'bid') ? 'buy' : 'sell';
840
884
  const status = this.parseOrderStatus(this.safeString(order, 'order_status'));
841
885
  const price = this.safeString2(order, 'order_price', 'price');
@@ -866,7 +910,7 @@ export default class bithumb extends Exchange {
866
910
  symbol = market['symbol'];
867
911
  }
868
912
  const id = this.safeString(order, 'order_id');
869
- const rawTrades = this.safeValue(order, 'contract', []);
913
+ const rawTrades = this.safeList(order, 'contract', []);
870
914
  return this.safeOrder({
871
915
  'info': order,
872
916
  'id': id,
@@ -43,7 +43,7 @@ export default class bitget extends bitgetRest {
43
43
  handleAuthenticate(client: Client, message: any): void;
44
44
  handleErrorMessage(client: Client, message: any): boolean;
45
45
  handleMessage(client: Client, message: any): void;
46
- ping(client: any): string;
46
+ ping(client: Client): string;
47
47
  handlePong(client: Client, message: any): any;
48
48
  handleSubscriptionStatus(client: Client, message: any): any;
49
49
  }
@@ -46,7 +46,7 @@ export default class bybit extends bybitRest {
46
46
  authenticate(url: any, params?: {}): Promise<any>;
47
47
  handleErrorMessage(client: Client, message: any): boolean;
48
48
  handleMessage(client: Client, message: any): void;
49
- ping(client: any): {
49
+ ping(client: Client): {
50
50
  req_id: any;
51
51
  op: string;
52
52
  };
@@ -14,7 +14,7 @@ export default class coinone extends coinoneRest {
14
14
  parseWsTrade(trade: Dict, market?: Market): Trade;
15
15
  handleErrorMessage(client: Client, message: any): boolean;
16
16
  handleMessage(client: Client, message: any): void;
17
- ping(client: any): {
17
+ ping(client: Client): {
18
18
  request_type: string;
19
19
  };
20
20
  handlePong(client: Client, message: any): any;
@@ -3,7 +3,7 @@ import type { Int, OrderBook, Trade, Ticker, OHLCV, Balances } from '../base/typ
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class currencycom extends currencycomRest {
5
5
  describe(): any;
6
- ping(client: any): {
6
+ ping(client: Client): {
7
7
  destination: string;
8
8
  correlationId: any;
9
9
  payload: {};
@@ -17,7 +17,7 @@ export default class hollaex extends hollaexRest {
17
17
  watchPrivate(messageHash: any, params?: {}): Promise<any>;
18
18
  handleErrorMessage(client: Client, message: any): any;
19
19
  handleMessage(client: Client, message: any): void;
20
- ping(client: any): {
20
+ ping(client: Client): {
21
21
  op: string;
22
22
  };
23
23
  handlePong(client: Client, message: any): any;
@@ -19,7 +19,7 @@ export default class hyperliquid extends hyperliquidRest {
19
19
  handleOrder(client: Client, message: any): void;
20
20
  handleErrorMessage(client: Client, message: any): boolean;
21
21
  handleMessage(client: Client, message: any): void;
22
- ping(client: any): {
22
+ ping(client: Client): {
23
23
  method: string;
24
24
  };
25
25
  handlePong(client: Client, message: any): any;
@@ -39,7 +39,7 @@ export default class kucoin extends kucoinRest {
39
39
  watchBalance(params?: {}): Promise<Balances>;
40
40
  handleBalance(client: Client, message: any): void;
41
41
  handleSubject(client: Client, message: any): void;
42
- ping(client: any): {
42
+ ping(client: Client): {
43
43
  id: any;
44
44
  type: string;
45
45
  };
@@ -42,7 +42,7 @@ export default class kucoinfutures extends kucoinfuturesRest {
42
42
  fetchBalanceSnapshot(client: any, message: any): Promise<void>;
43
43
  handleSubject(client: Client, message: any): void;
44
44
  getMessageHash(elementName: string, symbol?: Str): string;
45
- ping(client: any): {
45
+ ping(client: Client): {
46
46
  id: any;
47
47
  type: string;
48
48
  };
@@ -37,7 +37,7 @@ export default class mexc extends mexcRest {
37
37
  handlePong(client: Client, message: any): any;
38
38
  handleSubscriptionStatus(client: Client, message: any): void;
39
39
  handleMessage(client: Client, message: any): void;
40
- ping(client: any): {
40
+ ping(client: Client): {
41
41
  method: string;
42
42
  };
43
43
  }
@@ -23,7 +23,7 @@ export default class okcoin extends okcoinRest {
23
23
  handleBalance(client: Client, message: any): void;
24
24
  handleSubscriptionStatus(client: Client, message: any): any;
25
25
  handleAuthenticate(client: Client, message: any): any;
26
- ping(client: any): string;
26
+ ping(client: Client): string;
27
27
  handlePong(client: Client, message: any): any;
28
28
  handleErrorMessage(client: Client, message: any): any;
29
29
  handleMessage(client: Client, message: any): void;
@@ -28,7 +28,7 @@ export default class okx extends okxRest {
28
28
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
29
29
  handleDelta(bookside: any, delta: any): void;
30
30
  handleDeltas(bookside: any, deltas: any): void;
31
- handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any): any;
31
+ handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any, market?: any): any;
32
32
  handleOrderBook(client: Client, message: any): any;
33
33
  authenticate(params?: {}): Promise<any>;
34
34
  watchBalance(params?: {}): Promise<Balances>;
@@ -50,7 +50,7 @@ export default class okx extends okxRest {
50
50
  handleCancelAllOrders(client: Client, message: any): void;
51
51
  handleSubscriptionStatus(client: Client, message: any): any;
52
52
  handleAuthenticate(client: Client, message: any): void;
53
- ping(client: any): string;
53
+ ping(client: Client): string;
54
54
  handlePong(client: Client, message: any): any;
55
55
  handleErrorMessage(client: Client, message: any): any;
56
56
  handleMessage(client: Client, message: any): void;
package/js/src/pro/okx.js CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import okxRest from '../okx.js';
9
- import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError } from '../base/errors.js';
9
+ import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError, InvalidNonce } from '../base/errors.js';
10
10
  import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
11
11
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
12
12
  // ---------------------------------------------------------------------------
@@ -897,7 +897,7 @@ export default class okx extends okxRest {
897
897
  this.handleDelta(bookside, deltas[i]);
898
898
  }
899
899
  }
900
- handleOrderBookMessage(client, message, orderbook, messageHash) {
900
+ handleOrderBookMessage(client, message, orderbook, messageHash, market = undefined) {
901
901
  //
902
902
  // {
903
903
  // "asks": [
@@ -912,6 +912,9 @@ export default class okx extends okxRest {
912
912
  // ],
913
913
  // "instId": "BTC-USDT",
914
914
  // "ts": "1626537446491"
915
+ // "checksum": -855196043,
916
+ // "prevSeqId": 123456,
917
+ // "seqId": 123457
915
918
  // }
916
919
  //
917
920
  const asks = this.safeValue(message, 'asks', []);
@@ -921,9 +924,12 @@ export default class okx extends okxRest {
921
924
  this.handleDeltas(storedAsks, asks);
922
925
  this.handleDeltas(storedBids, bids);
923
926
  const marketId = this.safeString(message, 'instId');
924
- const symbol = this.safeSymbol(marketId);
927
+ const symbol = this.safeSymbol(marketId, market);
925
928
  const checksum = this.handleOption('watchOrderBook', 'checksum', true);
929
+ const seqId = this.safeInteger(message, 'seqId');
926
930
  if (checksum) {
931
+ const prevSeqId = this.safeInteger(message, 'prevSeqId');
932
+ const nonce = orderbook['nonce'];
927
933
  const asksLength = storedAsks.length;
928
934
  const bidsLength = storedBids.length;
929
935
  const payloadArray = [];
@@ -940,14 +946,21 @@ export default class okx extends okxRest {
940
946
  const payload = payloadArray.join(':');
941
947
  const responseChecksum = this.safeInteger(message, 'checksum');
942
948
  const localChecksum = this.crc32(payload, true);
949
+ let error = undefined;
950
+ if (prevSeqId !== -1 && nonce !== prevSeqId) {
951
+ error = new InvalidNonce(this.id + ' watchOrderBook received invalid nonce');
952
+ }
943
953
  if (responseChecksum !== localChecksum) {
944
- const error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
954
+ error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
955
+ }
956
+ if (error !== undefined) {
945
957
  delete client.subscriptions[messageHash];
946
958
  delete this.orderbooks[symbol];
947
959
  client.reject(error, messageHash);
948
960
  }
949
961
  }
950
962
  const timestamp = this.safeInteger(message, 'ts');
963
+ orderbook['nonce'] = seqId;
951
964
  orderbook['timestamp'] = timestamp;
952
965
  orderbook['datetime'] = this.iso8601(timestamp);
953
966
  return orderbook;
@@ -1069,7 +1082,7 @@ export default class okx extends okxRest {
1069
1082
  const orderbook = this.orderbooks[symbol];
1070
1083
  for (let i = 0; i < data.length; i++) {
1071
1084
  const update = data[i];
1072
- this.handleOrderBookMessage(client, update, orderbook, messageHash);
1085
+ this.handleOrderBookMessage(client, update, orderbook, messageHash, market);
1073
1086
  client.resolve(orderbook, messageHash);
1074
1087
  }
1075
1088
  }
@@ -32,7 +32,7 @@ export default class oxfun extends oxfunRest {
32
32
  cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
33
33
  authenticate(params?: {}): Promise<any>;
34
34
  handleAuthenticationMessage(client: Client, message: any): void;
35
- ping(client: any): string;
35
+ ping(client: Client): string;
36
36
  handlePong(client: Client, message: any): any;
37
37
  handleMessage(client: Client, message: any): void;
38
38
  }
@@ -14,7 +14,7 @@ export default class p2b extends p2bRest {
14
14
  handleOrderBook(client: Client, message: any): void;
15
15
  handleMessage(client: Client, message: any): void;
16
16
  handleErrorMessage(client: Client, message: any): boolean;
17
- ping(client: any): {
17
+ ping(client: Client): {
18
18
  method: string;
19
19
  params: any[];
20
20
  id: number;
@@ -36,7 +36,7 @@ export default class poloniex extends poloniexRest {
36
36
  handleMessage(client: Client, message: any): void;
37
37
  handleErrorMessage(client: Client, message: any): boolean;
38
38
  handleAuthenticate(client: Client, message: any): any;
39
- ping(client: any): {
39
+ ping(client: Client): {
40
40
  event: string;
41
41
  };
42
42
  }
@@ -31,7 +31,7 @@ export default class whitebit extends whitebitRest {
31
31
  handleMessage(client: Client, message: any): void;
32
32
  handleSubscriptionStatus(client: Client, message: any, id: any): void;
33
33
  handlePong(client: Client, message: any): any;
34
- ping(client: any): {
34
+ ping(client: Client): {
35
35
  id: number;
36
36
  method: string;
37
37
  params: any[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.3.66",
3
+ "version": "4.3.67",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",
@@ -1,9 +0,0 @@
1
- 'use strict';
2
-
3
- var Exchange$1 = require('../base/Exchange.js');
4
-
5
- // -------------------------------------------------------------------------------
6
- class Exchange extends Exchange$1["default"] {
7
- }
8
-
9
- module.exports = Exchange;