ccxt 4.3.28 → 4.3.30

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 (46) 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/Exchange.js +6 -0
  6. package/dist/cjs/src/base/ws/OrderBookSide.js +4 -4
  7. package/dist/cjs/src/bingx.js +98 -84
  8. package/dist/cjs/src/bitmart.js +72 -0
  9. package/dist/cjs/src/coinex.js +260 -311
  10. package/dist/cjs/src/kucoin.js +1 -0
  11. package/dist/cjs/src/pro/bitfinex.js +4 -4
  12. package/dist/cjs/src/pro/bitfinex2.js +2 -2
  13. package/dist/cjs/src/pro/bitmex.js +3 -3
  14. package/dist/cjs/src/pro/blockchaincom.js +2 -2
  15. package/dist/cjs/src/pro/cryptocom.js +4 -4
  16. package/dist/cjs/src/pro/deribit.js +9 -9
  17. package/dist/cjs/src/pro/idex.js +1 -1
  18. package/dist/cjs/src/pro/luno.js +4 -5
  19. package/dist/cjs/src/pro/mexc.js +2 -2
  20. package/dist/cjs/src/whitebit.js +55 -5
  21. package/js/ccxt.d.ts +1 -1
  22. package/js/ccxt.js +1 -1
  23. package/js/src/abstract/bingx.d.ts +7 -0
  24. package/js/src/abstract/bitmart.d.ts +1 -0
  25. package/js/src/base/Exchange.js +6 -0
  26. package/js/src/base/ws/Cache.d.ts +1 -1
  27. package/js/src/base/ws/OrderBookSide.d.ts +4 -5
  28. package/js/src/base/ws/OrderBookSide.js +4 -4
  29. package/js/src/bingx.js +98 -84
  30. package/js/src/bitmart.d.ts +2 -1
  31. package/js/src/bitmart.js +72 -0
  32. package/js/src/coinex.d.ts +5 -6
  33. package/js/src/coinex.js +260 -311
  34. package/js/src/kucoin.js +1 -0
  35. package/js/src/pro/bitfinex.js +4 -4
  36. package/js/src/pro/bitfinex2.js +2 -2
  37. package/js/src/pro/bitmex.js +3 -3
  38. package/js/src/pro/blockchaincom.js +2 -2
  39. package/js/src/pro/cryptocom.js +4 -4
  40. package/js/src/pro/deribit.js +9 -9
  41. package/js/src/pro/idex.js +1 -1
  42. package/js/src/pro/luno.js +4 -5
  43. package/js/src/pro/mexc.js +2 -2
  44. package/js/src/whitebit.d.ts +2 -0
  45. package/js/src/whitebit.js +55 -5
  46. package/package.json +4 -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.30';
189
189
  Exchange["default"].ccxtVersion = version;
190
190
  const exchanges = {
191
191
  'ace': ace,
@@ -6126,6 +6126,9 @@ class Exchange {
6126
6126
  }
6127
6127
  parseMarginModes(response, symbols = undefined, symbolKey = undefined, marketType = undefined) {
6128
6128
  const marginModeStructures = {};
6129
+ if (marketType === undefined) {
6130
+ marketType = 'swap'; // default to swap
6131
+ }
6129
6132
  for (let i = 0; i < response.length; i++) {
6130
6133
  const info = response[i];
6131
6134
  const marketId = this.safeString(info, symbolKey);
@@ -6141,6 +6144,9 @@ class Exchange {
6141
6144
  }
6142
6145
  parseLeverages(response, symbols = undefined, symbolKey = undefined, marketType = undefined) {
6143
6146
  const leverageStructures = {};
6147
+ if (marketType === undefined) {
6148
+ marketType = 'swap'; // default to swap
6149
+ }
6144
6150
  for (let i = 0; i < response.length; i++) {
6145
6151
  const info = response[i];
6146
6152
  const marketId = this.safeString(info, symbolKey);
@@ -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
  },
@@ -2527,7 +2541,7 @@ class bingx extends bingx$1 {
2527
2541
  'stopLossPrice': stopLossPrice,
2528
2542
  'takeProfitPrice': takeProfitPrice,
2529
2543
  'average': this.safeString2(order, 'avgPrice', 'ap'),
2530
- 'cost': undefined,
2544
+ 'cost': this.safeString(order, 'cummulativeQuoteQty'),
2531
2545
  'amount': this.safeStringN(order, ['origQty', 'q', 'quantity']),
2532
2546
  'filled': this.safeString2(order, 'executedQty', 'z'),
2533
2547
  'remaining': undefined,
@@ -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