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
@@ -508,8 +508,8 @@ class mexc extends mexc$1 {
508
508
  return;
509
509
  }
510
510
  orderbook['nonce'] = deltaNonce;
511
- const asks = this.safeValue(delta, 'asks', []);
512
- const bids = this.safeValue(delta, 'bids', []);
511
+ const asks = this.safeList(delta, 'asks', []);
512
+ const bids = this.safeList(delta, 'bids', []);
513
513
  const asksOrderSide = orderbook['asks'];
514
514
  const bidsOrderSide = orderbook['bids'];
515
515
  this.handleBooksideDelta(asksOrderSide, asks);
@@ -1470,7 +1470,7 @@ class whitebit extends whitebit$1 {
1470
1470
  const balance = response[id];
1471
1471
  if (typeof balance === 'object' && balance !== undefined) {
1472
1472
  const account = this.account();
1473
- account['free'] = this.safeString(balance, 'available');
1473
+ account['free'] = this.safeString2(balance, 'available', 'main_balance');
1474
1474
  account['used'] = this.safeString(balance, 'freeze');
1475
1475
  account['total'] = this.safeString(balance, 'main_balance');
1476
1476
  result[code] = account;
package/js/ccxt.d.ts CHANGED
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
4
4
  import * as errors from './src/base/errors.js';
5
5
  import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks, Leverage, Leverages, Option, OptionChain, Conversion } from './src/base/types.js';
6
6
  import { BaseError, ExchangeError, AuthenticationError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, OperationRejected, NoChange, MarginModeAlreadySet, MarketClosed, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, AddressPending, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, ContractUnavailable, NotSupported, ProxyError, ExchangeClosedByUser, OperationFailed, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout } from './src/base/errors.js';
7
- declare const version = "4.3.27";
7
+ declare const version = "4.3.28";
8
8
  import ace from './src/ace.js';
9
9
  import alpaca from './src/alpaca.js';
10
10
  import ascendex from './src/ascendex.js';
package/js/ccxt.js CHANGED
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
38
38
  import { BaseError, ExchangeError, AuthenticationError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, OperationRejected, NoChange, MarginModeAlreadySet, MarketClosed, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, AddressPending, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, ContractUnavailable, NotSupported, ProxyError, ExchangeClosedByUser, OperationFailed, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout } from './src/base/errors.js';
39
39
  //-----------------------------------------------------------------------------
40
40
  // this is updated by vss.js when building
41
- const version = '4.3.28';
41
+ const version = '4.3.29';
42
42
  Exchange.ccxtVersion = version;
43
43
  //-----------------------------------------------------------------------------
44
44
  import ace from './src/ace.js';
@@ -7,6 +7,8 @@ interface Exchange {
7
7
  spotV1PublicGetMarketDepth(params?: {}): Promise<implicitReturnType>;
8
8
  spotV1PublicGetMarketKline(params?: {}): Promise<implicitReturnType>;
9
9
  spotV1PublicGetTicker24hr(params?: {}): Promise<implicitReturnType>;
10
+ spotV1PublicGetTickerPrice(params?: {}): Promise<implicitReturnType>;
11
+ spotV1PublicGetTickerBookTicker(params?: {}): Promise<implicitReturnType>;
10
12
  spotV1PrivateGetTradeQuery(params?: {}): Promise<implicitReturnType>;
11
13
  spotV1PrivateGetTradeOpenOrders(params?: {}): Promise<implicitReturnType>;
12
14
  spotV1PrivateGetTradeHistoryOrders(params?: {}): Promise<implicitReturnType>;
@@ -20,12 +22,15 @@ interface Exchange {
20
22
  spotV1PrivatePostTradeCancelOrders(params?: {}): Promise<implicitReturnType>;
21
23
  spotV1PrivatePostTradeCancelOpenOrders(params?: {}): Promise<implicitReturnType>;
22
24
  spotV1PrivatePostTradeCancelAllAfter(params?: {}): Promise<implicitReturnType>;
25
+ spotV2PublicGetMarketDepth(params?: {}): Promise<implicitReturnType>;
26
+ spotV2PublicGetMarketKline(params?: {}): Promise<implicitReturnType>;
23
27
  spotV3PrivateGetGetAssetTransfer(params?: {}): Promise<implicitReturnType>;
24
28
  spotV3PrivateGetAssetTransfer(params?: {}): Promise<implicitReturnType>;
25
29
  spotV3PrivateGetCapitalDepositHisrec(params?: {}): Promise<implicitReturnType>;
26
30
  spotV3PrivateGetCapitalWithdrawHistory(params?: {}): Promise<implicitReturnType>;
27
31
  spotV3PrivatePostPostAssetTransfer(params?: {}): Promise<implicitReturnType>;
28
32
  swapV1PublicGetTickerPrice(params?: {}): Promise<implicitReturnType>;
33
+ swapV1PublicGetMarketHistoricalTrades(params?: {}): Promise<implicitReturnType>;
29
34
  swapV1PrivateGetPositionSideDual(params?: {}): Promise<implicitReturnType>;
30
35
  swapV1PrivateGetMarketMarkPriceKlines(params?: {}): Promise<implicitReturnType>;
31
36
  swapV1PrivateGetTradeBatchCancelReplace(params?: {}): Promise<implicitReturnType>;
@@ -79,6 +84,7 @@ interface Exchange {
79
84
  walletsV1PrivateGetCapitalSubAccountDepositAddress(params?: {}): Promise<implicitReturnType>;
80
85
  walletsV1PrivateGetCapitalDepositSubHisrec(params?: {}): Promise<implicitReturnType>;
81
86
  walletsV1PrivateGetCapitalSubAccountInnerTransferRecords(params?: {}): Promise<implicitReturnType>;
87
+ walletsV1PrivateGetCapitalDepositRiskRecords(params?: {}): Promise<implicitReturnType>;
82
88
  walletsV1PrivatePostCapitalWithdrawApply(params?: {}): Promise<implicitReturnType>;
83
89
  walletsV1PrivatePostCapitalInnerTransferApply(params?: {}): Promise<implicitReturnType>;
84
90
  walletsV1PrivatePostCapitalSubAccountInnerTransferApply(params?: {}): Promise<implicitReturnType>;
@@ -95,6 +101,7 @@ interface Exchange {
95
101
  accountV1PrivatePostInnerTransferAuthorizeSubAccount(params?: {}): Promise<implicitReturnType>;
96
102
  userAuthPrivatePostUserDataStream(params?: {}): Promise<implicitReturnType>;
97
103
  userAuthPrivatePutUserDataStream(params?: {}): Promise<implicitReturnType>;
104
+ userAuthPrivateDeleteUserDataStream(params?: {}): Promise<implicitReturnType>;
98
105
  copyTradingV1PrivateGetSwapTraceCurrentTrack(params?: {}): Promise<implicitReturnType>;
99
106
  copyTradingV1PrivatePostSwapTraceCloseTrackOrder(params?: {}): Promise<implicitReturnType>;
100
107
  copyTradingV1PrivatePostSwapTraceSetTPSL(params?: {}): Promise<implicitReturnType>;
@@ -80,6 +80,7 @@ interface Exchange {
80
80
  privatePostSpotV4QueryTrades(params?: {}): Promise<implicitReturnType>;
81
81
  privatePostSpotV4QueryOrderTrades(params?: {}): Promise<implicitReturnType>;
82
82
  privatePostSpotV4CancelOrders(params?: {}): Promise<implicitReturnType>;
83
+ privatePostSpotV4BatchOrders(params?: {}): Promise<implicitReturnType>;
83
84
  privatePostSpotV3CancelOrder(params?: {}): Promise<implicitReturnType>;
84
85
  privatePostSpotV2BatchOrders(params?: {}): Promise<implicitReturnType>;
85
86
  privatePostSpotV2SubmitOrder(params?: {}): Promise<implicitReturnType>;
@@ -1,4 +1,4 @@
1
- interface CustomArray extends Array {
1
+ interface CustomArray extends Array<any> {
2
2
  hashmap: object;
3
3
  }
4
4
  declare class BaseCache extends Array {
@@ -1,22 +1,21 @@
1
1
  interface IOrderBookSide<T> extends Array<T> {
2
2
  store(price: any, size: any): any;
3
- store(price: any, size: any, index: any): any;
4
3
  storeArray(array: any[]): any;
5
4
  limit(): any;
6
5
  }
7
- declare class OrderBookSide extends Array implements IOrderBookSide {
6
+ declare class OrderBookSide extends Array implements IOrderBookSide<any> {
8
7
  constructor(deltas?: any[], depth?: any);
9
8
  storeArray(delta: any): void;
10
9
  store(price: any, size: any): void;
11
10
  limit(): void;
12
11
  }
13
12
  declare class CountedOrderBookSide extends OrderBookSide {
14
- store(price: any, size: any, count: any): void;
13
+ store(price: any, size: any): void;
15
14
  storeArray(delta: any): void;
16
15
  }
17
- declare class IndexedOrderBookSide extends Array implements IOrderBookSide {
16
+ declare class IndexedOrderBookSide extends Array implements IOrderBookSide<any> {
18
17
  constructor(deltas?: any[], depth?: number);
19
- store(price: any, size: any, id: any): void;
18
+ store(price: any, size: any): void;
20
19
  storeArray(delta: any): void;
21
20
  limit(): void;
22
21
  }
@@ -101,8 +101,8 @@ class OrderBookSide extends Array {
101
101
  // or deletes price levels based on order counts (3rd value in a bidask delta)
102
102
  // this class stores vector arrays of values indexed by price
103
103
  class CountedOrderBookSide extends OrderBookSide {
104
- store(price, size, count) {
105
- this.storeArray([price, size, count]);
104
+ store(price, size) {
105
+ throw new Error('CountedOrderBookSide.store() is not supported, use storeArray([price, size, count]) instead');
106
106
  }
107
107
  storeArray(delta) {
108
108
  const price = delta[0];
@@ -166,8 +166,8 @@ class IndexedOrderBookSide extends Array {
166
166
  this.storeArray(deltas[i].slice()); // slice is muy importante
167
167
  }
168
168
  }
169
- store(price, size, id) {
170
- this.storeArray([price, size, id]);
169
+ store(price, size) {
170
+ throw new Error('IndexedOrderBook.store() is not supported, use storeArray([price, size, id]) instead');
171
171
  }
172
172
  storeArray(delta) {
173
173
  const price = delta[0];
package/js/src/bingx.js CHANGED
@@ -21,8 +21,7 @@ export default class bingx extends Exchange {
21
21
  'id': 'bingx',
22
22
  'name': 'BingX',
23
23
  'countries': ['US'],
24
- // cheapest is 60 requests a minute = 1 requests per second on average => ( 1000ms / 1) = 1000 ms between requests on average
25
- 'rateLimit': 1000,
24
+ 'rateLimit': 100,
26
25
  'version': 'v1',
27
26
  'certified': true,
28
27
  'pro': true,
@@ -135,44 +134,54 @@ export default class bingx extends Exchange {
135
134
  'v1': {
136
135
  'public': {
137
136
  'get': {
138
- 'server/time': 3,
139
- 'common/symbols': 3,
140
- 'market/trades': 3,
141
- 'market/depth': 3,
142
- 'market/kline': 3,
137
+ 'server/time': 1,
138
+ 'common/symbols': 1,
139
+ 'market/trades': 1,
140
+ 'market/depth': 1,
141
+ 'market/kline': 1,
143
142
  'ticker/24hr': 1,
143
+ 'ticker/price': 1,
144
+ 'ticker/bookTicker': 1,
144
145
  },
145
146
  },
146
147
  'private': {
147
148
  'get': {
148
- 'trade/query': 3,
149
- 'trade/openOrders': 3,
150
- 'trade/historyOrders': 3,
151
- 'trade/myTrades': 3,
152
- 'user/commissionRate': 3,
153
- 'account/balance': 3,
149
+ 'trade/query': 1,
150
+ 'trade/openOrders': 1,
151
+ 'trade/historyOrders': 1,
152
+ 'trade/myTrades': 2,
153
+ 'user/commissionRate': 5,
154
+ 'account/balance': 2,
154
155
  },
155
156
  'post': {
156
- 'trade/order': 3,
157
- 'trade/cancel': 3,
158
- 'trade/batchOrders': 3,
159
- 'trade/order/cancelReplace': 3,
160
- 'trade/cancelOrders': 3,
161
- 'trade/cancelOpenOrders': 3,
162
- 'trade/cancelAllAfter': 1,
157
+ 'trade/order': 2,
158
+ 'trade/cancel': 2,
159
+ 'trade/batchOrders': 5,
160
+ 'trade/order/cancelReplace': 5,
161
+ 'trade/cancelOrders': 5,
162
+ 'trade/cancelOpenOrders': 5,
163
+ 'trade/cancelAllAfter': 5,
164
+ },
165
+ },
166
+ },
167
+ 'v2': {
168
+ 'public': {
169
+ 'get': {
170
+ 'market/depth': 1,
171
+ 'market/kline': 1,
163
172
  },
164
173
  },
165
174
  },
166
175
  'v3': {
167
176
  'private': {
168
177
  'get': {
169
- 'get/asset/transfer': 3,
170
- 'asset/transfer': 3,
171
- 'capital/deposit/hisrec': 3,
172
- 'capital/withdraw/history': 3,
178
+ 'get/asset/transfer': 1,
179
+ 'asset/transfer': 1,
180
+ 'capital/deposit/hisrec': 1,
181
+ 'capital/withdraw/history': 1,
173
182
  },
174
183
  'post': {
175
- 'post/asset/transfer': 3,
184
+ 'post/asset/transfer': 5,
176
185
  },
177
186
  },
178
187
  },
@@ -182,26 +191,27 @@ export default class bingx extends Exchange {
182
191
  'public': {
183
192
  'get': {
184
193
  'ticker/price': 1,
194
+ 'market/historicalTrades': 1,
185
195
  },
186
196
  },
187
197
  'private': {
188
198
  'get': {
189
- 'positionSide/dual': 1,
199
+ 'positionSide/dual': 5,
190
200
  'market/markPriceKlines': 1,
191
- 'trade/batchCancelReplace': 1,
192
- 'trade/fullOrder': 1,
201
+ 'trade/batchCancelReplace': 5,
202
+ 'trade/fullOrder': 2,
193
203
  },
194
204
  'post': {
195
- 'trade/cancelReplace': 1,
196
- 'positionSide/dual': 1,
197
- 'trade/closePosition': 1,
205
+ 'trade/cancelReplace': 2,
206
+ 'positionSide/dual': 5,
207
+ 'trade/closePosition': 2,
198
208
  },
199
209
  },
200
210
  },
201
211
  'v2': {
202
212
  'public': {
203
213
  'get': {
204
- 'server/time': 3,
214
+ 'server/time': 1,
205
215
  'quote/contracts': 1,
206
216
  'quote/price': 1,
207
217
  'quote/depth': 1,
@@ -216,35 +226,35 @@ export default class bingx extends Exchange {
216
226
  },
217
227
  'private': {
218
228
  'get': {
219
- 'user/balance': 3,
220
- 'user/positions': 3,
221
- 'user/income': 3,
222
- 'trade/openOrders': 3,
223
- 'trade/openOrder': 3,
224
- 'trade/order': 3,
225
- 'trade/marginType': 3,
226
- 'trade/leverage': 3,
227
- 'trade/forceOrders': 3,
228
- 'trade/allOrders': 3,
229
- 'trade/allFillOrders': 3,
230
- 'user/income/export': 3,
231
- 'user/commissionRate': 3,
232
- 'quote/bookTicker': 3,
229
+ 'user/balance': 2,
230
+ 'user/positions': 2,
231
+ 'user/income': 2,
232
+ 'trade/openOrders': 2,
233
+ 'trade/openOrder': 2,
234
+ 'trade/order': 2,
235
+ 'trade/marginType': 5,
236
+ 'trade/leverage': 2,
237
+ 'trade/forceOrders': 1,
238
+ 'trade/allOrders': 2,
239
+ 'trade/allFillOrders': 2,
240
+ 'user/income/export': 2,
241
+ 'user/commissionRate': 2,
242
+ 'quote/bookTicker': 1,
233
243
  },
234
244
  'post': {
235
- 'trade/order': 3,
236
- 'trade/batchOrders': 3,
237
- 'trade/closeAllPositions': 3,
238
- 'trade/cancelAllAfter': 3,
239
- 'trade/marginType': 3,
240
- 'trade/leverage': 3,
241
- 'trade/positionMargin': 3,
242
- 'trade/order/test': 3,
245
+ 'trade/order': 2,
246
+ 'trade/batchOrders': 2,
247
+ 'trade/closeAllPositions': 2,
248
+ 'trade/cancelAllAfter': 5,
249
+ 'trade/marginType': 5,
250
+ 'trade/leverage': 5,
251
+ 'trade/positionMargin': 5,
252
+ 'trade/order/test': 2,
243
253
  },
244
254
  'delete': {
245
- 'trade/order': 3,
246
- 'trade/batchOrders': 3,
247
- 'trade/allOpenOrders': 3,
255
+ 'trade/order': 2,
256
+ 'trade/batchOrders': 2,
257
+ 'trade/allOpenOrders': 2,
248
258
  },
249
259
  },
250
260
  },
@@ -260,9 +270,9 @@ export default class bingx extends Exchange {
260
270
  'v1': {
261
271
  'private': {
262
272
  'get': {
263
- 'allPosition': 3,
264
- 'allOrders': 3,
265
- 'balance': 3,
273
+ 'allPosition': 2,
274
+ 'allOrders': 2,
275
+ 'balance': 2,
266
276
  },
267
277
  },
268
278
  },
@@ -271,18 +281,19 @@ export default class bingx extends Exchange {
271
281
  'v1': {
272
282
  'private': {
273
283
  'get': {
274
- 'capital/config/getall': 3,
275
- 'capital/deposit/address': 1,
284
+ 'capital/config/getall': 5,
285
+ 'capital/deposit/address': 5,
276
286
  'capital/innerTransfer/records': 1,
277
- 'capital/subAccount/deposit/address': 1,
278
- 'capital/deposit/subHisrec': 1,
287
+ 'capital/subAccount/deposit/address': 5,
288
+ 'capital/deposit/subHisrec': 2,
279
289
  'capital/subAccount/innerTransfer/records': 1,
290
+ 'capital/deposit/riskRecords': 5,
280
291
  },
281
292
  'post': {
282
- 'capital/withdraw/apply': 3,
283
- 'capital/innerTransfer/apply': 3,
284
- 'capital/subAccountInnerTransfer/apply': 3,
285
- 'capital/deposit/createSubAddress': 1,
293
+ 'capital/withdraw/apply': 5,
294
+ 'capital/innerTransfer/apply': 5,
295
+ 'capital/subAccountInnerTransfer/apply': 2,
296
+ 'capital/deposit/createSubAddress': 2,
286
297
  },
287
298
  },
288
299
  },
@@ -291,15 +302,15 @@ export default class bingx extends Exchange {
291
302
  'v1': {
292
303
  'private': {
293
304
  'get': {
294
- 'list': 3,
295
- 'assets': 3,
305
+ 'list': 10,
306
+ 'assets': 2,
296
307
  },
297
308
  'post': {
298
- 'create': 3,
299
- 'apiKey/create': 3,
300
- 'apiKey/edit': 3,
301
- 'apiKey/del': 3,
302
- 'updateStatus': 3,
309
+ 'create': 10,
310
+ 'apiKey/create': 2,
311
+ 'apiKey/edit': 2,
312
+ 'apiKey/del': 2,
313
+ 'updateStatus': 10,
303
314
  },
304
315
  },
305
316
  },
@@ -309,10 +320,10 @@ export default class bingx extends Exchange {
309
320
  'private': {
310
321
  'get': {
311
322
  'uid': 1,
312
- 'apiKey/query': 1,
323
+ 'apiKey/query': 2,
313
324
  },
314
325
  'post': {
315
- 'innerTransfer/authorizeSubAccount': 3,
326
+ 'innerTransfer/authorizeSubAccount': 1,
316
327
  },
317
328
  },
318
329
  },
@@ -321,10 +332,13 @@ export default class bingx extends Exchange {
321
332
  'auth': {
322
333
  'private': {
323
334
  'post': {
324
- 'userDataStream': 1,
335
+ 'userDataStream': 2,
325
336
  },
326
337
  'put': {
327
- 'userDataStream': 1,
338
+ 'userDataStream': 2,
339
+ },
340
+ 'delete': {
341
+ 'userDataStream': 2,
328
342
  },
329
343
  },
330
344
  },
@@ -333,12 +347,12 @@ export default class bingx extends Exchange {
333
347
  'v1': {
334
348
  'private': {
335
349
  'get': {
336
- 'swap/trace/currentTrack': 1,
350
+ 'swap/trace/currentTrack': 2,
337
351
  },
338
352
  'post': {
339
- 'swap/trace/closeTrackOrder': 1,
340
- 'swap/trace/setTPSL': 1,
341
- 'spot/trader/sellOrder': 1,
353
+ 'swap/trace/closeTrackOrder': 2,
354
+ 'swap/trace/setTPSL': 2,
355
+ 'spot/trader/sellOrder': 10,
342
356
  },
343
357
  },
344
358
  },
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitmart.js';
2
- import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, TransferEntries } from './base/types.js';
2
+ import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, TransferEntries, OrderRequest } from './base/types.js';
3
3
  /**
4
4
  * @class bitmart
5
5
  * @augments Exchange
@@ -56,6 +56,7 @@ export default class bitmart extends Exchange {
56
56
  parseOrderStatusByType(type: any, status: any): string;
57
57
  createMarketBuyOrderWithCost(symbol: string, cost: number, params?: {}): Promise<Order>;
58
58
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
59
+ createOrders(orders: OrderRequest[], params?: {}): Promise<Order[]>;
59
60
  createSwapOrderRequest(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): any;
60
61
  createSpotOrderRequest(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): any;
61
62
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
package/js/src/bitmart.js CHANGED
@@ -43,6 +43,7 @@ export default class bitmart extends Exchange {
43
43
  'createMarketOrderWithCost': false,
44
44
  'createMarketSellOrderWithCost': false,
45
45
  'createOrder': true,
46
+ 'createOrders': true,
46
47
  'createPostOnlyOrder': true,
47
48
  'createStopLimitOrder': false,
48
49
  'createStopMarketOrder': false,
@@ -227,6 +228,7 @@ export default class bitmart extends Exchange {
227
228
  'spot/v4/query/trades': 5,
228
229
  'spot/v4/query/order-trades': 5,
229
230
  'spot/v4/cancel_orders': 3,
231
+ 'spot/v4/batch_orders': 3,
230
232
  // newer endpoint
231
233
  'spot/v3/cancel_order': 1,
232
234
  'spot/v2/batch_orders': 1,
@@ -2394,6 +2396,76 @@ export default class bitmart extends Exchange {
2394
2396
  order['price'] = price;
2395
2397
  return order;
2396
2398
  }
2399
+ async createOrders(orders, params = {}) {
2400
+ /**
2401
+ * @method
2402
+ * @name bitmart#createOrders
2403
+ * @description create a list of trade orders
2404
+ * @see https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2405
+ * @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
2406
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2407
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2408
+ */
2409
+ await this.loadMarkets();
2410
+ const ordersRequests = [];
2411
+ let symbol = undefined;
2412
+ let market = undefined;
2413
+ for (let i = 0; i < orders.length; i++) {
2414
+ const rawOrder = orders[i];
2415
+ const marketId = this.safeString(rawOrder, 'symbol');
2416
+ market = this.market(marketId);
2417
+ if (!market['spot']) {
2418
+ throw new NotSupported(this.id + ' createOrders() supports spot orders only');
2419
+ }
2420
+ if (symbol === undefined) {
2421
+ symbol = marketId;
2422
+ }
2423
+ else {
2424
+ if (symbol !== marketId) {
2425
+ throw new BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
2426
+ }
2427
+ }
2428
+ const type = this.safeString(rawOrder, 'type');
2429
+ const side = this.safeString(rawOrder, 'side');
2430
+ const amount = this.safeValue(rawOrder, 'amount');
2431
+ const price = this.safeValue(rawOrder, 'price');
2432
+ const orderParams = this.safeDict(rawOrder, 'params', {});
2433
+ let orderRequest = this.createSpotOrderRequest(marketId, type, side, amount, price, orderParams);
2434
+ orderRequest = this.omit(orderRequest, ['symbol']); // not needed because it goes in the outter object
2435
+ ordersRequests.push(orderRequest);
2436
+ }
2437
+ const request = {
2438
+ 'symbol': market['id'],
2439
+ 'orderParams': ordersRequests,
2440
+ };
2441
+ const response = await this.privatePostSpotV4BatchOrders(request);
2442
+ //
2443
+ // {
2444
+ // "message": "OK",
2445
+ // "code": 1000,
2446
+ // "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2447
+ // "data": {
2448
+ // "code": 0,
2449
+ // "msg": "success",
2450
+ // "data": {
2451
+ // "orderIds": [
2452
+ // "212751308355553320"
2453
+ // ]
2454
+ // }
2455
+ // }
2456
+ // }
2457
+ //
2458
+ const data = this.safeDict(response, 'data', {});
2459
+ const innderData = this.safeDict(data, 'data', {});
2460
+ const orderIds = this.safeList(innderData, 'orderIds', []);
2461
+ const parsedOrders = [];
2462
+ for (let i = 0; i < orderIds.length; i++) {
2463
+ const orderId = orderIds[i];
2464
+ const order = this.safeOrder({ 'id': orderId }, market);
2465
+ parsedOrders.push(order);
2466
+ }
2467
+ return parsedOrders;
2468
+ }
2397
2469
  createSwapOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
2398
2470
  /**
2399
2471
  * @method
package/js/src/kucoin.js CHANGED
@@ -430,6 +430,7 @@ export default class kucoin extends Exchange {
430
430
  'The withdrawal amount is below the minimum requirement.': ExchangeError,
431
431
  'Unsuccessful! Exceeded the max. funds out-transfer limit': InsufficientFunds,
432
432
  'The amount increment is invalid.': BadRequest,
433
+ 'The quantity is below the minimum requirement.': InvalidOrder,
433
434
  '400': BadRequest,
434
435
  '401': AuthenticationError,
435
436
  '403': NotSupported,
@@ -328,7 +328,7 @@ export default class bitfinex extends bitfinexRest {
328
328
  const size = (delta2Value < 0) ? -delta2Value : delta2Value;
329
329
  const side = (delta2Value < 0) ? 'asks' : 'bids';
330
330
  const bookside = orderbook[side];
331
- bookside.store(price, size, id);
331
+ bookside.storeArray([price, size, id]);
332
332
  }
333
333
  }
334
334
  else {
@@ -339,7 +339,7 @@ export default class bitfinex extends bitfinexRest {
339
339
  const size = (delta2 < 0) ? -delta2 : delta2;
340
340
  const side = (delta2 < 0) ? 'asks' : 'bids';
341
341
  const countedBookSide = orderbook[side];
342
- countedBookSide.store(delta[0], size, delta[1]);
342
+ countedBookSide.storeArray([delta[0], size, delta[1]]);
343
343
  }
344
344
  }
345
345
  client.resolve(orderbook, messageHash);
@@ -355,14 +355,14 @@ export default class bitfinex extends bitfinexRest {
355
355
  const bookside = orderbook[side];
356
356
  // price = 0 means that you have to remove the order from your book
357
357
  const amount = Precise.stringGt(price, '0') ? size : '0';
358
- bookside.store(this.parseNumber(price), this.parseNumber(amount), id);
358
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(amount), id]);
359
359
  }
360
360
  else {
361
361
  const message3Value = message[3];
362
362
  const size = (message3Value < 0) ? -message3Value : message3Value;
363
363
  const side = (message3Value < 0) ? 'asks' : 'bids';
364
364
  const countedBookSide = orderbook[side];
365
- countedBookSide.store(message[1], size, message[2]);
365
+ countedBookSide.storeArray([message[1], size, message[2]]);
366
366
  }
367
367
  client.resolve(orderbook, messageHash);
368
368
  }
@@ -633,7 +633,7 @@ export default class bitfinex2 extends bitfinex2Rest {
633
633
  // price = 0 means that you have to remove the order from your book
634
634
  const amount = Precise.stringGt(price, '0') ? size : '0';
635
635
  const idString = this.safeString(deltas, 0);
636
- bookside.store(this.parseNumber(price), this.parseNumber(amount), idString);
636
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(amount), idString]);
637
637
  }
638
638
  else {
639
639
  const amount = this.safeString(deltas, 2);
@@ -642,7 +642,7 @@ export default class bitfinex2 extends bitfinex2Rest {
642
642
  const size = Precise.stringLt(amount, '0') ? Precise.stringNeg(amount) : amount;
643
643
  const side = Precise.stringLt(amount, '0') ? 'asks' : 'bids';
644
644
  const bookside = orderbookItem[side];
645
- bookside.store(this.parseNumber(price), this.parseNumber(size), this.parseNumber(counter));
645
+ bookside.storeArray([this.parseNumber(price), this.parseNumber(size), this.parseNumber(counter)]);
646
646
  }
647
647
  client.resolve(orderbook, messageHash);
648
648
  }