ccxt 4.3.28 → 4.3.29

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 (41) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.min.js +30 -0
  3. package/dist/ccxt.browser.min.js.LICENSE.txt +12 -0
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/base/ws/OrderBookSide.js +4 -4
  6. package/dist/cjs/src/bingx.js +97 -83
  7. package/dist/cjs/src/bitmart.js +72 -0
  8. package/dist/cjs/src/kucoin.js +1 -0
  9. package/dist/cjs/src/pro/bitfinex.js +4 -4
  10. package/dist/cjs/src/pro/bitfinex2.js +2 -2
  11. package/dist/cjs/src/pro/bitmex.js +3 -3
  12. package/dist/cjs/src/pro/blockchaincom.js +2 -2
  13. package/dist/cjs/src/pro/cryptocom.js +4 -4
  14. package/dist/cjs/src/pro/deribit.js +9 -9
  15. package/dist/cjs/src/pro/idex.js +1 -1
  16. package/dist/cjs/src/pro/luno.js +4 -5
  17. package/dist/cjs/src/pro/mexc.js +2 -2
  18. package/dist/cjs/src/whitebit.js +1 -1
  19. package/js/ccxt.d.ts +1 -1
  20. package/js/ccxt.js +1 -1
  21. package/js/src/abstract/bingx.d.ts +7 -0
  22. package/js/src/abstract/bitmart.d.ts +1 -0
  23. package/js/src/base/ws/Cache.d.ts +1 -1
  24. package/js/src/base/ws/OrderBookSide.d.ts +4 -5
  25. package/js/src/base/ws/OrderBookSide.js +4 -4
  26. package/js/src/bingx.js +97 -83
  27. package/js/src/bitmart.d.ts +2 -1
  28. package/js/src/bitmart.js +72 -0
  29. package/js/src/kucoin.js +1 -0
  30. package/js/src/pro/bitfinex.js +4 -4
  31. package/js/src/pro/bitfinex2.js +2 -2
  32. package/js/src/pro/bitmex.js +3 -3
  33. package/js/src/pro/blockchaincom.js +2 -2
  34. package/js/src/pro/cryptocom.js +4 -4
  35. package/js/src/pro/deribit.js +9 -9
  36. package/js/src/pro/idex.js +1 -1
  37. package/js/src/pro/luno.js +4 -5
  38. package/js/src/pro/mexc.js +2 -2
  39. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +1 -1
  40. package/js/src/whitebit.js +1 -1
  41. package/package.json +2 -2
@@ -0,0 +1,12 @@
1
+ /*!
2
+ Copyright (c) 2011, Yahoo! Inc. All rights reserved.
3
+ Code licensed under the BSD License:
4
+ http://developer.yahoo.com/yui/license.html
5
+ version: 2.9.0
6
+ */
7
+
8
+ /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
9
+
10
+ /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
11
+
12
+ /*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
package/dist/cjs/ccxt.js CHANGED
@@ -185,7 +185,7 @@ var woofipro$1 = require('./src/pro/woofipro.js');
185
185
 
186
186
  //-----------------------------------------------------------------------------
187
187
  // this is updated by vss.js when building
188
- const version = '4.3.28';
188
+ const version = '4.3.29';
189
189
  Exchange["default"].ccxtVersion = version;
190
190
  const exchanges = {
191
191
  'ace': ace,
@@ -99,8 +99,8 @@ class OrderBookSide extends Array {
99
99
  // or deletes price levels based on order counts (3rd value in a bidask delta)
100
100
  // this class stores vector arrays of values indexed by price
101
101
  class CountedOrderBookSide extends OrderBookSide {
102
- store(price, size, count) {
103
- this.storeArray([price, size, count]);
102
+ store(price, size) {
103
+ throw new Error('CountedOrderBookSide.store() is not supported, use storeArray([price, size, count]) instead');
104
104
  }
105
105
  storeArray(delta) {
106
106
  const price = delta[0];
@@ -164,8 +164,8 @@ class IndexedOrderBookSide extends Array {
164
164
  this.storeArray(deltas[i].slice()); // slice is muy importante
165
165
  }
166
166
  }
167
- store(price, size, id) {
168
- this.storeArray([price, size, id]);
167
+ store(price, size) {
168
+ throw new Error('IndexedOrderBook.store() is not supported, use storeArray([price, size, id]) instead');
169
169
  }
170
170
  storeArray(delta) {
171
171
  const price = delta[0];
@@ -18,8 +18,7 @@ class bingx extends bingx$1 {
18
18
  'id': 'bingx',
19
19
  'name': 'BingX',
20
20
  'countries': ['US'],
21
- // cheapest is 60 requests a minute = 1 requests per second on average => ( 1000ms / 1) = 1000 ms between requests on average
22
- 'rateLimit': 1000,
21
+ 'rateLimit': 100,
23
22
  'version': 'v1',
24
23
  'certified': true,
25
24
  'pro': true,
@@ -132,44 +131,54 @@ class bingx extends bingx$1 {
132
131
  'v1': {
133
132
  'public': {
134
133
  'get': {
135
- 'server/time': 3,
136
- 'common/symbols': 3,
137
- 'market/trades': 3,
138
- 'market/depth': 3,
139
- 'market/kline': 3,
134
+ 'server/time': 1,
135
+ 'common/symbols': 1,
136
+ 'market/trades': 1,
137
+ 'market/depth': 1,
138
+ 'market/kline': 1,
140
139
  'ticker/24hr': 1,
140
+ 'ticker/price': 1,
141
+ 'ticker/bookTicker': 1,
141
142
  },
142
143
  },
143
144
  'private': {
144
145
  'get': {
145
- 'trade/query': 3,
146
- 'trade/openOrders': 3,
147
- 'trade/historyOrders': 3,
148
- 'trade/myTrades': 3,
149
- 'user/commissionRate': 3,
150
- 'account/balance': 3,
146
+ 'trade/query': 1,
147
+ 'trade/openOrders': 1,
148
+ 'trade/historyOrders': 1,
149
+ 'trade/myTrades': 2,
150
+ 'user/commissionRate': 5,
151
+ 'account/balance': 2,
151
152
  },
152
153
  'post': {
153
- 'trade/order': 3,
154
- 'trade/cancel': 3,
155
- 'trade/batchOrders': 3,
156
- 'trade/order/cancelReplace': 3,
157
- 'trade/cancelOrders': 3,
158
- 'trade/cancelOpenOrders': 3,
159
- 'trade/cancelAllAfter': 1,
154
+ 'trade/order': 2,
155
+ 'trade/cancel': 2,
156
+ 'trade/batchOrders': 5,
157
+ 'trade/order/cancelReplace': 5,
158
+ 'trade/cancelOrders': 5,
159
+ 'trade/cancelOpenOrders': 5,
160
+ 'trade/cancelAllAfter': 5,
161
+ },
162
+ },
163
+ },
164
+ 'v2': {
165
+ 'public': {
166
+ 'get': {
167
+ 'market/depth': 1,
168
+ 'market/kline': 1,
160
169
  },
161
170
  },
162
171
  },
163
172
  'v3': {
164
173
  'private': {
165
174
  'get': {
166
- 'get/asset/transfer': 3,
167
- 'asset/transfer': 3,
168
- 'capital/deposit/hisrec': 3,
169
- 'capital/withdraw/history': 3,
175
+ 'get/asset/transfer': 1,
176
+ 'asset/transfer': 1,
177
+ 'capital/deposit/hisrec': 1,
178
+ 'capital/withdraw/history': 1,
170
179
  },
171
180
  'post': {
172
- 'post/asset/transfer': 3,
181
+ 'post/asset/transfer': 5,
173
182
  },
174
183
  },
175
184
  },
@@ -179,26 +188,27 @@ class bingx extends bingx$1 {
179
188
  'public': {
180
189
  'get': {
181
190
  'ticker/price': 1,
191
+ 'market/historicalTrades': 1,
182
192
  },
183
193
  },
184
194
  'private': {
185
195
  'get': {
186
- 'positionSide/dual': 1,
196
+ 'positionSide/dual': 5,
187
197
  'market/markPriceKlines': 1,
188
- 'trade/batchCancelReplace': 1,
189
- 'trade/fullOrder': 1,
198
+ 'trade/batchCancelReplace': 5,
199
+ 'trade/fullOrder': 2,
190
200
  },
191
201
  'post': {
192
- 'trade/cancelReplace': 1,
193
- 'positionSide/dual': 1,
194
- 'trade/closePosition': 1,
202
+ 'trade/cancelReplace': 2,
203
+ 'positionSide/dual': 5,
204
+ 'trade/closePosition': 2,
195
205
  },
196
206
  },
197
207
  },
198
208
  'v2': {
199
209
  'public': {
200
210
  'get': {
201
- 'server/time': 3,
211
+ 'server/time': 1,
202
212
  'quote/contracts': 1,
203
213
  'quote/price': 1,
204
214
  'quote/depth': 1,
@@ -213,35 +223,35 @@ class bingx extends bingx$1 {
213
223
  },
214
224
  'private': {
215
225
  'get': {
216
- 'user/balance': 3,
217
- 'user/positions': 3,
218
- 'user/income': 3,
219
- 'trade/openOrders': 3,
220
- 'trade/openOrder': 3,
221
- 'trade/order': 3,
222
- 'trade/marginType': 3,
223
- 'trade/leverage': 3,
224
- 'trade/forceOrders': 3,
225
- 'trade/allOrders': 3,
226
- 'trade/allFillOrders': 3,
227
- 'user/income/export': 3,
228
- 'user/commissionRate': 3,
229
- 'quote/bookTicker': 3,
226
+ 'user/balance': 2,
227
+ 'user/positions': 2,
228
+ 'user/income': 2,
229
+ 'trade/openOrders': 2,
230
+ 'trade/openOrder': 2,
231
+ 'trade/order': 2,
232
+ 'trade/marginType': 5,
233
+ 'trade/leverage': 2,
234
+ 'trade/forceOrders': 1,
235
+ 'trade/allOrders': 2,
236
+ 'trade/allFillOrders': 2,
237
+ 'user/income/export': 2,
238
+ 'user/commissionRate': 2,
239
+ 'quote/bookTicker': 1,
230
240
  },
231
241
  'post': {
232
- 'trade/order': 3,
233
- 'trade/batchOrders': 3,
234
- 'trade/closeAllPositions': 3,
235
- 'trade/cancelAllAfter': 3,
236
- 'trade/marginType': 3,
237
- 'trade/leverage': 3,
238
- 'trade/positionMargin': 3,
239
- 'trade/order/test': 3,
242
+ 'trade/order': 2,
243
+ 'trade/batchOrders': 2,
244
+ 'trade/closeAllPositions': 2,
245
+ 'trade/cancelAllAfter': 5,
246
+ 'trade/marginType': 5,
247
+ 'trade/leverage': 5,
248
+ 'trade/positionMargin': 5,
249
+ 'trade/order/test': 2,
240
250
  },
241
251
  'delete': {
242
- 'trade/order': 3,
243
- 'trade/batchOrders': 3,
244
- 'trade/allOpenOrders': 3,
252
+ 'trade/order': 2,
253
+ 'trade/batchOrders': 2,
254
+ 'trade/allOpenOrders': 2,
245
255
  },
246
256
  },
247
257
  },
@@ -257,9 +267,9 @@ class bingx extends bingx$1 {
257
267
  'v1': {
258
268
  'private': {
259
269
  'get': {
260
- 'allPosition': 3,
261
- 'allOrders': 3,
262
- 'balance': 3,
270
+ 'allPosition': 2,
271
+ 'allOrders': 2,
272
+ 'balance': 2,
263
273
  },
264
274
  },
265
275
  },
@@ -268,18 +278,19 @@ class bingx extends bingx$1 {
268
278
  'v1': {
269
279
  'private': {
270
280
  'get': {
271
- 'capital/config/getall': 3,
272
- 'capital/deposit/address': 1,
281
+ 'capital/config/getall': 5,
282
+ 'capital/deposit/address': 5,
273
283
  'capital/innerTransfer/records': 1,
274
- 'capital/subAccount/deposit/address': 1,
275
- 'capital/deposit/subHisrec': 1,
284
+ 'capital/subAccount/deposit/address': 5,
285
+ 'capital/deposit/subHisrec': 2,
276
286
  'capital/subAccount/innerTransfer/records': 1,
287
+ 'capital/deposit/riskRecords': 5,
277
288
  },
278
289
  'post': {
279
- 'capital/withdraw/apply': 3,
280
- 'capital/innerTransfer/apply': 3,
281
- 'capital/subAccountInnerTransfer/apply': 3,
282
- 'capital/deposit/createSubAddress': 1,
290
+ 'capital/withdraw/apply': 5,
291
+ 'capital/innerTransfer/apply': 5,
292
+ 'capital/subAccountInnerTransfer/apply': 2,
293
+ 'capital/deposit/createSubAddress': 2,
283
294
  },
284
295
  },
285
296
  },
@@ -288,15 +299,15 @@ class bingx extends bingx$1 {
288
299
  'v1': {
289
300
  'private': {
290
301
  'get': {
291
- 'list': 3,
292
- 'assets': 3,
302
+ 'list': 10,
303
+ 'assets': 2,
293
304
  },
294
305
  'post': {
295
- 'create': 3,
296
- 'apiKey/create': 3,
297
- 'apiKey/edit': 3,
298
- 'apiKey/del': 3,
299
- 'updateStatus': 3,
306
+ 'create': 10,
307
+ 'apiKey/create': 2,
308
+ 'apiKey/edit': 2,
309
+ 'apiKey/del': 2,
310
+ 'updateStatus': 10,
300
311
  },
301
312
  },
302
313
  },
@@ -306,10 +317,10 @@ class bingx extends bingx$1 {
306
317
  'private': {
307
318
  'get': {
308
319
  'uid': 1,
309
- 'apiKey/query': 1,
320
+ 'apiKey/query': 2,
310
321
  },
311
322
  'post': {
312
- 'innerTransfer/authorizeSubAccount': 3,
323
+ 'innerTransfer/authorizeSubAccount': 1,
313
324
  },
314
325
  },
315
326
  },
@@ -318,10 +329,13 @@ class bingx extends bingx$1 {
318
329
  'auth': {
319
330
  'private': {
320
331
  'post': {
321
- 'userDataStream': 1,
332
+ 'userDataStream': 2,
322
333
  },
323
334
  'put': {
324
- 'userDataStream': 1,
335
+ 'userDataStream': 2,
336
+ },
337
+ 'delete': {
338
+ 'userDataStream': 2,
325
339
  },
326
340
  },
327
341
  },
@@ -330,12 +344,12 @@ class bingx extends bingx$1 {
330
344
  'v1': {
331
345
  'private': {
332
346
  'get': {
333
- 'swap/trace/currentTrack': 1,
347
+ 'swap/trace/currentTrack': 2,
334
348
  },
335
349
  'post': {
336
- 'swap/trace/closeTrackOrder': 1,
337
- 'swap/trace/setTPSL': 1,
338
- 'spot/trader/sellOrder': 1,
350
+ 'swap/trace/closeTrackOrder': 2,
351
+ 'swap/trace/setTPSL': 2,
352
+ 'spot/trader/sellOrder': 10,
339
353
  },
340
354
  },
341
355
  },
@@ -40,6 +40,7 @@ class bitmart extends bitmart$1 {
40
40
  'createMarketOrderWithCost': false,
41
41
  'createMarketSellOrderWithCost': false,
42
42
  'createOrder': true,
43
+ 'createOrders': true,
43
44
  'createPostOnlyOrder': true,
44
45
  'createStopLimitOrder': false,
45
46
  'createStopMarketOrder': false,
@@ -224,6 +225,7 @@ class bitmart extends bitmart$1 {
224
225
  'spot/v4/query/trades': 5,
225
226
  'spot/v4/query/order-trades': 5,
226
227
  'spot/v4/cancel_orders': 3,
228
+ 'spot/v4/batch_orders': 3,
227
229
  // newer endpoint
228
230
  'spot/v3/cancel_order': 1,
229
231
  'spot/v2/batch_orders': 1,
@@ -2391,6 +2393,76 @@ class bitmart extends bitmart$1 {
2391
2393
  order['price'] = price;
2392
2394
  return order;
2393
2395
  }
2396
+ async createOrders(orders, params = {}) {
2397
+ /**
2398
+ * @method
2399
+ * @name bitmart#createOrders
2400
+ * @description create a list of trade orders
2401
+ * @see https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2402
+ * @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
2403
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2404
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2405
+ */
2406
+ await this.loadMarkets();
2407
+ const ordersRequests = [];
2408
+ let symbol = undefined;
2409
+ let market = undefined;
2410
+ for (let i = 0; i < orders.length; i++) {
2411
+ const rawOrder = orders[i];
2412
+ const marketId = this.safeString(rawOrder, 'symbol');
2413
+ market = this.market(marketId);
2414
+ if (!market['spot']) {
2415
+ throw new errors.NotSupported(this.id + ' createOrders() supports spot orders only');
2416
+ }
2417
+ if (symbol === undefined) {
2418
+ symbol = marketId;
2419
+ }
2420
+ else {
2421
+ if (symbol !== marketId) {
2422
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
2423
+ }
2424
+ }
2425
+ const type = this.safeString(rawOrder, 'type');
2426
+ const side = this.safeString(rawOrder, 'side');
2427
+ const amount = this.safeValue(rawOrder, 'amount');
2428
+ const price = this.safeValue(rawOrder, 'price');
2429
+ const orderParams = this.safeDict(rawOrder, 'params', {});
2430
+ let orderRequest = this.createSpotOrderRequest(marketId, type, side, amount, price, orderParams);
2431
+ orderRequest = this.omit(orderRequest, ['symbol']); // not needed because it goes in the outter object
2432
+ ordersRequests.push(orderRequest);
2433
+ }
2434
+ const request = {
2435
+ 'symbol': market['id'],
2436
+ 'orderParams': ordersRequests,
2437
+ };
2438
+ const response = await this.privatePostSpotV4BatchOrders(request);
2439
+ //
2440
+ // {
2441
+ // "message": "OK",
2442
+ // "code": 1000,
2443
+ // "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2444
+ // "data": {
2445
+ // "code": 0,
2446
+ // "msg": "success",
2447
+ // "data": {
2448
+ // "orderIds": [
2449
+ // "212751308355553320"
2450
+ // ]
2451
+ // }
2452
+ // }
2453
+ // }
2454
+ //
2455
+ const data = this.safeDict(response, 'data', {});
2456
+ const innderData = this.safeDict(data, 'data', {});
2457
+ const orderIds = this.safeList(innderData, 'orderIds', []);
2458
+ const parsedOrders = [];
2459
+ for (let i = 0; i < orderIds.length; i++) {
2460
+ const orderId = orderIds[i];
2461
+ const order = this.safeOrder({ 'id': orderId }, market);
2462
+ parsedOrders.push(order);
2463
+ }
2464
+ return parsedOrders;
2465
+ }
2394
2466
  createSwapOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
2395
2467
  /**
2396
2468
  * @method
@@ -427,6 +427,7 @@ class kucoin extends kucoin$1 {
427
427
  'The withdrawal amount is below the minimum requirement.': errors.ExchangeError,
428
428
  'Unsuccessful! Exceeded the max. funds out-transfer limit': errors.InsufficientFunds,
429
429
  'The amount increment is invalid.': errors.BadRequest,
430
+ 'The quantity is below the minimum requirement.': errors.InvalidOrder,
430
431
  '400': errors.BadRequest,
431
432
  '401': errors.AuthenticationError,
432
433
  '403': errors.NotSupported,
@@ -325,7 +325,7 @@ class bitfinex extends bitfinex$1 {
325
325
  const size = (delta2Value < 0) ? -delta2Value : delta2Value;
326
326
  const side = (delta2Value < 0) ? 'asks' : 'bids';
327
327
  const bookside = orderbook[side];
328
- bookside.store(price, size, id);
328
+ bookside.storeArray([price, size, id]);
329
329
  }
330
330
  }
331
331
  else {
@@ -336,7 +336,7 @@ class bitfinex extends bitfinex$1 {
336
336
  const size = (delta2 < 0) ? -delta2 : delta2;
337
337
  const side = (delta2 < 0) ? 'asks' : 'bids';
338
338
  const countedBookSide = orderbook[side];
339
- countedBookSide.store(delta[0], size, delta[1]);
339
+ countedBookSide.storeArray([delta[0], size, delta[1]]);
340
340
  }
341
341
  }
342
342
  client.resolve(orderbook, messageHash);
@@ -352,14 +352,14 @@ class bitfinex extends bitfinex$1 {
352
352
  const bookside = orderbook[side];
353
353
  // price = 0 means that you have to remove the order from your book
354
354
  const amount = Precise["default"].stringGt(price, '0') ? size : '0';
355
- bookside.store(this.parseNumber(price), this.parseNumber(amount), id);
355
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(amount), id]);
356
356
  }
357
357
  else {
358
358
  const message3Value = message[3];
359
359
  const size = (message3Value < 0) ? -message3Value : message3Value;
360
360
  const side = (message3Value < 0) ? 'asks' : 'bids';
361
361
  const countedBookSide = orderbook[side];
362
- countedBookSide.store(message[1], size, message[2]);
362
+ countedBookSide.storeArray([message[1], size, message[2]]);
363
363
  }
364
364
  client.resolve(orderbook, messageHash);
365
365
  }
@@ -630,7 +630,7 @@ class bitfinex2 extends bitfinex2$1 {
630
630
  // price = 0 means that you have to remove the order from your book
631
631
  const amount = Precise["default"].stringGt(price, '0') ? size : '0';
632
632
  const idString = this.safeString(deltas, 0);
633
- bookside.store(this.parseNumber(price), this.parseNumber(amount), idString);
633
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(amount), idString]);
634
634
  }
635
635
  else {
636
636
  const amount = this.safeString(deltas, 2);
@@ -639,7 +639,7 @@ class bitfinex2 extends bitfinex2$1 {
639
639
  const size = Precise["default"].stringLt(amount, '0') ? Precise["default"].stringNeg(amount) : amount;
640
640
  const side = Precise["default"].stringLt(amount, '0') ? 'asks' : 'bids';
641
641
  const bookside = orderbookItem[side];
642
- bookside.store(this.parseNumber(price), this.parseNumber(size), this.parseNumber(counter));
642
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(size), this.parseNumber(counter)]);
643
643
  }
644
644
  client.resolve(orderbook, messageHash);
645
645
  }
@@ -1430,7 +1430,7 @@ class bitmex extends bitmex$1 {
1430
1430
  const data = this.safeValue(message, 'data', []);
1431
1431
  // if it's an initial snapshot
1432
1432
  if (action === 'partial') {
1433
- const filter = this.safeValue(message, 'filter', {});
1433
+ const filter = this.safeDict(message, 'filter', {});
1434
1434
  const marketId = this.safeValue(filter, 'symbol');
1435
1435
  const market = this.safeMarket(marketId);
1436
1436
  const symbol = market['symbol'];
@@ -1452,7 +1452,7 @@ class bitmex extends bitmex$1 {
1452
1452
  let side = this.safeString(data[i], 'side');
1453
1453
  side = (side === 'Buy') ? 'bids' : 'asks';
1454
1454
  const bookside = orderbook[side];
1455
- bookside.store(price, size, id);
1455
+ bookside.storeArray([price, size, id]);
1456
1456
  const datetime = this.safeString(data[i], 'timestamp');
1457
1457
  orderbook['timestamp'] = this.parse8601(datetime);
1458
1458
  orderbook['datetime'] = datetime;
@@ -1477,7 +1477,7 @@ class bitmex extends bitmex$1 {
1477
1477
  let side = this.safeString(data[i], 'side');
1478
1478
  side = (side === 'Buy') ? 'bids' : 'asks';
1479
1479
  const bookside = orderbook[side];
1480
- bookside.store(price, size, id);
1480
+ bookside.storeArray([price, size, id]);
1481
1481
  const datetime = this.safeString(data[i], 'timestamp');
1482
1482
  orderbook['timestamp'] = this.parse8601(datetime);
1483
1483
  orderbook['datetime'] = datetime;
@@ -695,8 +695,8 @@ class blockchaincom extends blockchaincom$1 {
695
695
  orderbook.reset(snapshot);
696
696
  }
697
697
  else if (event === 'updated') {
698
- const asks = this.safeValue(message, 'asks', []);
699
- const bids = this.safeValue(message, 'bids', []);
698
+ const asks = this.safeList(message, 'asks', []);
699
+ const bids = this.safeList(message, 'bids', []);
700
700
  this.handleDeltas(orderbook['asks'], asks);
701
701
  this.handleDeltas(orderbook['bids'], bids);
702
702
  orderbook['timestamp'] = timestamp;
@@ -128,7 +128,7 @@ class cryptocom extends cryptocom$1 {
128
128
  const price = this.safeFloat(delta, 0);
129
129
  const amount = this.safeFloat(delta, 1);
130
130
  const count = this.safeInteger(delta, 2);
131
- bookside.store(price, amount, count);
131
+ bookside.storeArray([price, amount, count]);
132
132
  }
133
133
  handleDeltas(bookside, deltas) {
134
134
  for (let i = 0; i < deltas.length; i++) {
@@ -197,11 +197,11 @@ class cryptocom extends cryptocom$1 {
197
197
  let data = this.safeValue(message, 'data');
198
198
  data = this.safeValue(data, 0);
199
199
  const timestamp = this.safeInteger(data, 't');
200
- let orderbook = this.safeValue(this.orderbooks, symbol);
201
- if (orderbook === undefined) {
200
+ if (!(symbol in this.orderbooks)) {
202
201
  const limit = this.safeInteger(message, 'depth');
203
- orderbook = this.countedOrderBook({}, limit);
202
+ this.orderbooks[symbol] = this.countedOrderBook({}, limit);
204
203
  }
204
+ const orderbook = this.orderbooks[symbol];
205
205
  const channel = this.safeString(message, 'channel');
206
206
  const nonce = this.safeInteger2(data, 'u', 's');
207
207
  let books = data;
@@ -505,12 +505,12 @@ class deribit extends deribit$1 {
505
505
  const marketId = this.safeString(data, 'instrument_name');
506
506
  const symbol = this.safeSymbol(marketId);
507
507
  const timestamp = this.safeInteger(data, 'timestamp');
508
- let storedOrderBook = this.safeValue(this.orderbooks, symbol);
509
- if (storedOrderBook === undefined) {
510
- storedOrderBook = this.countedOrderBook();
508
+ if (!(symbol in this.orderbooks)) {
509
+ this.orderbooks[symbol] = this.countedOrderBook();
511
510
  }
512
- const asks = this.safeValue(data, 'asks', []);
513
- const bids = this.safeValue(data, 'bids', []);
511
+ const storedOrderBook = this.orderbooks[symbol];
512
+ const asks = this.safeList(data, 'asks', []);
513
+ const bids = this.safeList(data, 'bids', []);
514
514
  this.handleDeltas(storedOrderBook['asks'], asks);
515
515
  this.handleDeltas(storedOrderBook['bids'], bids);
516
516
  storedOrderBook['nonce'] = timestamp;
@@ -522,8 +522,8 @@ class deribit extends deribit$1 {
522
522
  client.resolve(storedOrderBook, messageHash);
523
523
  }
524
524
  cleanOrderBook(data) {
525
- const bids = this.safeValue(data, 'bids', []);
526
- const asks = this.safeValue(data, 'asks', []);
525
+ const bids = this.safeList(data, 'bids', []);
526
+ const asks = this.safeList(data, 'asks', []);
527
527
  const cleanedBids = [];
528
528
  for (let i = 0; i < bids.length; i++) {
529
529
  cleanedBids.push([bids[i][1], bids[i][2]]);
@@ -540,10 +540,10 @@ class deribit extends deribit$1 {
540
540
  const price = delta[1];
541
541
  const amount = delta[2];
542
542
  if (delta[0] === 'new' || delta[0] === 'change') {
543
- bookside.store(price, amount, 1);
543
+ bookside.storeArray([price, amount, 1]);
544
544
  }
545
545
  else if (delta[0] === 'delete') {
546
- bookside.store(price, amount, 0);
546
+ bookside.storeArray([price, amount, 0]);
547
547
  }
548
548
  }
549
549
  handleDeltas(bookside, deltas) {
@@ -481,7 +481,7 @@ class idex extends idex$1 {
481
481
  const price = this.safeFloat(delta, 0);
482
482
  const amount = this.safeFloat(delta, 1);
483
483
  const count = this.safeInteger(delta, 2);
484
- bookside.store(price, amount, count);
484
+ bookside.storeArray([price, amount, count]);
485
485
  }
486
486
  handleDeltas(bookside, deltas) {
487
487
  for (let i = 0; i < deltas.length; i++) {
@@ -190,12 +190,11 @@ class luno extends luno$1 {
190
190
  //
191
191
  const symbol = subscription['symbol'];
192
192
  const messageHash = 'orderbook:' + symbol;
193
- const timestamp = this.safeString(message, 'timestamp');
194
- let orderbook = this.safeValue(this.orderbooks, symbol);
195
- if (orderbook === undefined) {
196
- orderbook = this.indexedOrderBook({});
197
- this.orderbooks[symbol] = orderbook;
193
+ const timestamp = this.safeInteger(message, 'timestamp');
194
+ if (!(symbol in this.orderbooks)) {
195
+ this.orderbooks[symbol] = this.indexedOrderBook({});
198
196
  }
197
+ const orderbook = this.orderbooks[symbol];
199
198
  const asks = this.safeValue(message, 'asks');
200
199
  if (asks !== undefined) {
201
200
  const snapshot = this.customParseOrderBook(message, symbol, timestamp, 'bids', 'asks', 'price', 'volume', 'id');