ccxt 4.1.23 → 4.1.25

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 (68) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +1249 -232
  3. package/dist/ccxt.browser.min.js +4 -4
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ace.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +7 -3
  7. package/dist/cjs/src/base/functions/crypto.js +11 -2
  8. package/dist/cjs/src/base/functions/generic.js +5 -3
  9. package/dist/cjs/src/base/functions.js +1 -0
  10. package/dist/cjs/src/binance.js +112 -34
  11. package/dist/cjs/src/bitget.js +289 -21
  12. package/dist/cjs/src/bitmart.js +1 -1
  13. package/dist/cjs/src/bybit.js +132 -15
  14. package/dist/cjs/src/cryptocom.js +262 -15
  15. package/dist/cjs/src/gate.js +191 -88
  16. package/dist/cjs/src/krakenfutures.js +158 -22
  17. package/dist/cjs/src/oceanex.js +0 -12
  18. package/dist/cjs/src/okx.js +60 -1
  19. package/dist/cjs/src/pro/bybit.js +1 -1
  20. package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +8 -6
  21. package/dist/cjs/src/wavesexchange.js +6 -6
  22. package/js/ccxt.d.ts +1 -1
  23. package/js/ccxt.js +1 -1
  24. package/js/src/abstract/binance.d.ts +1 -14
  25. package/js/src/abstract/binancecoinm.d.ts +1 -14
  26. package/js/src/abstract/binanceus.d.ts +1 -14
  27. package/js/src/abstract/binanceusdm.d.ts +1 -14
  28. package/js/src/abstract/gate.d.ts +2 -7
  29. package/js/src/abstract/gateio.d.ts +2 -7
  30. package/js/src/ace.js +1 -1
  31. package/js/src/base/Exchange.d.ts +4 -2
  32. package/js/src/base/Exchange.js +7 -3
  33. package/js/src/base/functions/crypto.d.ts +3 -2
  34. package/js/src/base/functions/crypto.js +11 -3
  35. package/js/src/base/functions/generic.d.ts +1 -1
  36. package/js/src/base/functions/generic.js +5 -3
  37. package/js/src/base/types.d.ts +8 -0
  38. package/js/src/binance.d.ts +2 -1
  39. package/js/src/binance.js +112 -34
  40. package/js/src/bitget.d.ts +15 -1
  41. package/js/src/bitget.js +289 -21
  42. package/js/src/bitmart.js +1 -1
  43. package/js/src/bybit.d.ts +4 -2
  44. package/js/src/bybit.js +132 -15
  45. package/js/src/cryptocom.d.ts +4 -1
  46. package/js/src/cryptocom.js +262 -15
  47. package/js/src/gate.d.ts +3 -1
  48. package/js/src/gate.js +191 -88
  49. package/js/src/krakenfutures.d.ts +4 -1
  50. package/js/src/krakenfutures.js +158 -22
  51. package/js/src/oceanex.d.ts +0 -1
  52. package/js/src/oceanex.js +0 -12
  53. package/js/src/okx.d.ts +2 -1
  54. package/js/src/okx.js +60 -1
  55. package/js/src/pro/bybit.js +1 -1
  56. package/js/src/static_dependencies/noble-curves/abstract/edwards.d.ts +1 -0
  57. package/js/src/static_dependencies/noble-curves/abstract/edwards.js +5 -3
  58. package/js/src/wavesexchange.js +7 -7
  59. package/package.json +1 -1
  60. package/skip-tests.json +2 -3
  61. package/js/src/bkex.d.ts +0 -95
  62. package/js/src/bkex.js +0 -1962
  63. package/js/src/pro/btcex.d.ts +0 -32
  64. package/js/src/pro/btcex.js +0 -776
  65. package/js/src/pro/ripio.d.ts +0 -18
  66. package/js/src/pro/ripio.js +0 -296
  67. package/js/src/pro/zb.d.ts +0 -22
  68. package/js/src/pro/zb.js +0 -605
package/js/src/binance.js CHANGED
@@ -11,6 +11,8 @@ import { Precise } from './base/Precise.js';
11
11
  import { TRUNCATE, DECIMAL_PLACES } from './base/functions/number.js';
12
12
  import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
13
13
  import { rsa } from './base/functions/rsa.js';
14
+ import { eddsa } from './base/functions/crypto.js';
15
+ import { ed25519 } from './static_dependencies/noble-curves/ed25519.js';
14
16
  // ---------------------------------------------------------------------------
15
17
  /**
16
18
  * @class binance
@@ -40,6 +42,7 @@ export default class binance extends Exchange {
40
42
  'cancelOrders': true,
41
43
  'createDepositAddress': false,
42
44
  'createOrder': true,
45
+ 'createOrders': true,
43
46
  'createPostOnlyOrder': true,
44
47
  'createReduceOnlyOrder': true,
45
48
  'createStopLimitOrder': true,
@@ -159,7 +162,6 @@ export default class binance extends Exchange {
159
162
  'v1': 'https://testnet.binance.vision/api/v1',
160
163
  },
161
164
  'api': {
162
- 'wapi': 'https://api.binance.com/wapi/v3',
163
165
  'sapi': 'https://api.binance.com/sapi/v1',
164
166
  'sapiV2': 'https://api.binance.com/sapi/v2',
165
167
  'sapiV3': 'https://api.binance.com/sapi/v3',
@@ -603,27 +605,6 @@ export default class binance extends Exchange {
603
605
  'sub-account/assets': 0.40002, // Weight(UID): 60 => cost = 0.006667 * 60 = 0.40002
604
606
  },
605
607
  },
606
- // deprecated
607
- 'wapi': {
608
- 'post': {
609
- 'withdraw': 1,
610
- 'sub-account/transfer': 1,
611
- },
612
- 'get': {
613
- 'depositHistory': 1,
614
- 'withdrawHistory': 1,
615
- 'depositAddress': 1,
616
- 'accountStatus': 1,
617
- 'systemStatus': 1,
618
- 'apiTradingStatus': 1,
619
- 'userAssetDribbletLog': 1,
620
- 'tradeFee': 1,
621
- 'assetDetail': 1,
622
- 'sub-account/list': 1,
623
- 'sub-account/transfer/history': 1,
624
- 'sub-account/assets': 1,
625
- },
626
- },
627
608
  'dapiPublic': {
628
609
  'get': {
629
610
  'ping': 1,
@@ -737,6 +718,7 @@ export default class binance extends Exchange {
737
718
  },
738
719
  'fapiData': {
739
720
  'get': {
721
+ 'delivery-price': 1,
740
722
  'openInterestHist': 1,
741
723
  'topLongShortAccountRatio': 1,
742
724
  'topLongShortPositionRatio': 1,
@@ -4289,7 +4271,17 @@ export default class binance extends Exchange {
4289
4271
  // "lastTrade": {"id":"69","time":"1676084430567","price":"24.9","qty":"1.00"},
4290
4272
  // "mmp": false
4291
4273
  // }
4274
+ // {
4275
+ // cancelOrders/createOrders
4276
+ // "code": -4005,
4277
+ // "msg": "Quantity greater than max quantity."
4278
+ // },
4292
4279
  //
4280
+ const code = this.safeString(order, 'code');
4281
+ if (code !== undefined) {
4282
+ // cancelOrders/createOrders might have a partial success
4283
+ return this.safeOrder({ 'info': order, 'status': 'rejected' }, market);
4284
+ }
4293
4285
  const status = this.parseOrderStatus(this.safeString(order, 'status'));
4294
4286
  const marketId = this.safeString(order, 'symbol');
4295
4287
  const marketType = ('closePosition' in order) ? 'contract' : 'spot';
@@ -4363,6 +4355,85 @@ export default class binance extends Exchange {
4363
4355
  'trades': fills,
4364
4356
  }, market);
4365
4357
  }
4358
+ async createOrders(orders, params = {}) {
4359
+ /**
4360
+ * @method
4361
+ * @name binance#createOrders
4362
+ * @description *contract only* create a list of trade orders
4363
+ * @see https://binance-docs.github.io/apidocs/futures/en/#place-multiple-orders-trade
4364
+ * @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
4365
+ * @returns {object} an [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
4366
+ */
4367
+ await this.loadMarkets();
4368
+ const ordersRequests = [];
4369
+ let orderSymbols = [];
4370
+ for (let i = 0; i < orders.length; i++) {
4371
+ const rawOrder = orders[i];
4372
+ const marketId = this.safeString(rawOrder, 'symbol');
4373
+ orderSymbols.push(marketId);
4374
+ const type = this.safeString(rawOrder, 'type');
4375
+ const side = this.safeString(rawOrder, 'side');
4376
+ const amount = this.safeValue(rawOrder, 'amount');
4377
+ const price = this.safeValue(rawOrder, 'price');
4378
+ const orderParams = this.safeValue(rawOrder, 'params', {});
4379
+ const orderRequest = this.createOrderRequest(marketId, type, side, amount, price, orderParams);
4380
+ ordersRequests.push(orderRequest);
4381
+ }
4382
+ orderSymbols = this.marketSymbols(orderSymbols, undefined, false, true, true);
4383
+ const market = this.market(orderSymbols[0]);
4384
+ if (market['spot']) {
4385
+ throw new NotSupported(this.id + ' createOrders() does not support ' + market['type'] + ' orders');
4386
+ }
4387
+ let response = undefined;
4388
+ let request = {
4389
+ 'batchOrders': ordersRequests,
4390
+ };
4391
+ request = this.extend(request, params);
4392
+ if (market['linear']) {
4393
+ response = await this.fapiPrivatePostBatchOrders(request);
4394
+ }
4395
+ else if (market['option']) {
4396
+ response = await this.eapiPrivatePostBatchOrders(request);
4397
+ }
4398
+ else {
4399
+ response = await this.dapiPrivatePostBatchOrders(request);
4400
+ }
4401
+ //
4402
+ // [
4403
+ // {
4404
+ // "code": -4005,
4405
+ // "msg": "Quantity greater than max quantity."
4406
+ // },
4407
+ // {
4408
+ // "orderId": 650640530,
4409
+ // "symbol": "LTCUSDT",
4410
+ // "status": "NEW",
4411
+ // "clientOrderId": "x-xcKtGhcu32184eb13585491289bbaf",
4412
+ // "price": "54.00",
4413
+ // "avgPrice": "0.00",
4414
+ // "origQty": "0.100",
4415
+ // "executedQty": "0.000",
4416
+ // "cumQty": "0.000",
4417
+ // "cumQuote": "0.00000",
4418
+ // "timeInForce": "GTC",
4419
+ // "type": "LIMIT",
4420
+ // "reduceOnly": false,
4421
+ // "closePosition": false,
4422
+ // "side": "BUY",
4423
+ // "positionSide": "BOTH",
4424
+ // "stopPrice": "0.00",
4425
+ // "workingType": "CONTRACT_PRICE",
4426
+ // "priceProtect": false,
4427
+ // "origType": "LIMIT",
4428
+ // "priceMatch": "NONE",
4429
+ // "selfTradePreventionMode": "NONE",
4430
+ // "goodTillDate": 0,
4431
+ // "updateTime": 1698073926929
4432
+ // }
4433
+ // ]
4434
+ //
4435
+ return this.parseOrders(response);
4436
+ }
4366
4437
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
4367
4438
  /**
4368
4439
  * @method
@@ -8417,9 +8488,6 @@ export default class binance extends Exchange {
8417
8488
  }
8418
8489
  let url = this.urls['api'][api];
8419
8490
  url += '/' + path;
8420
- if (api === 'wapi') {
8421
- url += '.html';
8422
- }
8423
8491
  if (path === 'historicalTrades') {
8424
8492
  if (this.apiKey) {
8425
8493
  headers = {
@@ -8446,7 +8514,7 @@ export default class binance extends Exchange {
8446
8514
  throw new AuthenticationError(this.id + ' userDataStream endpoint requires `apiKey` credential');
8447
8515
  }
8448
8516
  }
8449
- else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === 'wapi' && path !== 'systemStatus') || (api === 'dapiPrivate') || (api === 'dapiPrivateV2') || (api === 'fapiPrivate') || (api === 'fapiPrivateV2') || (api === 'papi')) {
8517
+ else if ((api === 'private') || (api === 'eapiPrivate') || (api === 'sapi' && path !== 'system/status') || (api === 'sapiV2') || (api === 'sapiV3') || (api === 'sapiV4') || (api === 'dapiPrivate') || (api === 'dapiPrivateV2') || (api === 'fapiPrivate') || (api === 'fapiPrivateV2') || (api === 'papi')) {
8450
8518
  this.checkRequiredCredentials();
8451
8519
  if (method === 'POST' && ((path === 'order') || (path === 'sor/order'))) {
8452
8520
  // inject in implicit API calls
@@ -8461,6 +8529,12 @@ export default class binance extends Exchange {
8461
8529
  }
8462
8530
  }
8463
8531
  let query = undefined;
8532
+ // handle batchOrders
8533
+ if ((path === 'batchOrders') && (method === 'POST')) {
8534
+ const batchOrders = this.safeValue(params, 'batchOrders');
8535
+ const queryBatch = (this.json(batchOrders));
8536
+ params['batchOrders'] = queryBatch;
8537
+ }
8464
8538
  const defaultRecvWindow = this.safeInteger(this.options, 'recvWindow');
8465
8539
  let extendedParams = this.extend({
8466
8540
  'timestamp': this.nonce(),
@@ -8499,7 +8573,12 @@ export default class binance extends Exchange {
8499
8573
  }
8500
8574
  let signature = undefined;
8501
8575
  if (this.secret.indexOf('PRIVATE KEY') > -1) {
8502
- signature = this.encodeURIComponent(rsa(query, this.secret, sha256));
8576
+ if (this.secret.length > 120) {
8577
+ signature = this.encodeURIComponent(rsa(query, this.secret, sha256));
8578
+ }
8579
+ else {
8580
+ signature = this.encodeURIComponent(eddsa(this.encode(query), this.secret, ed25519));
8581
+ }
8503
8582
  }
8504
8583
  else {
8505
8584
  signature = this.hmac(this.encode(query), this.encode(this.secret), sha256);
@@ -8508,7 +8587,7 @@ export default class binance extends Exchange {
8508
8587
  headers = {
8509
8588
  'X-MBX-APIKEY': this.apiKey,
8510
8589
  };
8511
- if ((method === 'GET') || (method === 'DELETE') || (api === 'wapi')) {
8590
+ if ((method === 'GET') || (method === 'DELETE')) {
8512
8591
  url += '?' + query;
8513
8592
  }
8514
8593
  else {
@@ -8544,7 +8623,6 @@ export default class binance extends Exchange {
8544
8623
  if (response === undefined) {
8545
8624
  return undefined; // fallback to default error handler
8546
8625
  }
8547
- // check success value for wapi endpoints
8548
8626
  // response in format {'msg': 'The coin does not exist.', 'success': true/false}
8549
8627
  const success = this.safeValue(response, 'success', true);
8550
8628
  if (!success) {
@@ -8599,10 +8677,10 @@ export default class binance extends Exchange {
8599
8677
  }
8600
8678
  if (Array.isArray(response)) {
8601
8679
  // cancelOrders returns an array like this: [{"code":-2011,"msg":"Unknown order sent."}]
8602
- const numElements = response.length;
8603
- if (numElements > 0) {
8604
- const firstElement = response[0];
8605
- const errorCode = this.safeString(firstElement, 'code');
8680
+ const arrayLength = response.length;
8681
+ if (arrayLength === 1) { // when there's a single error we can throw, otherwise we have a partial success
8682
+ const element = response[0];
8683
+ const errorCode = this.safeString(element, 'code');
8606
8684
  if (errorCode !== undefined) {
8607
8685
  this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, this.id + ' ' + body);
8608
8686
  }
@@ -8635,7 +8713,7 @@ export default class binance extends Exchange {
8635
8713
  async request(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined, config = {}, context = {}) {
8636
8714
  const response = await this.fetch2(path, api, method, params, headers, body, config);
8637
8715
  // a workaround for {"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}
8638
- if ((api === 'private') || (api === 'wapi')) {
8716
+ if (api === 'private') {
8639
8717
  this.options['hasAlreadyAuthenticatedSuccessfully'] = true;
8640
8718
  }
8641
8719
  return response;
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitget.js';
2
- import { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory } from './base/types.js';
2
+ import { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest } from './base/types.js';
3
3
  /**
4
4
  * @class bitget
5
5
  * @extends Exchange
@@ -150,6 +150,8 @@ export default class bitget extends Exchange {
150
150
  parseOrderStatus(status: any): string;
151
151
  parseOrder(order: any, market?: any): Order;
152
152
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<Order>;
153
+ createOrderRequest(symbol: any, type: any, side: any, amount: any, price?: any, params?: {}): any;
154
+ createOrders(orders: OrderRequest[], params?: {}): Promise<Order[]>;
153
155
  editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
154
156
  cancelOrder(id: string, symbol?: string, params?: {}): Promise<Order>;
155
157
  cancelOrders(ids: any, symbol?: string, params?: {}): Promise<any>;
@@ -314,6 +316,18 @@ export default class bitget extends Exchange {
314
316
  datetime: any;
315
317
  info: any;
316
318
  };
319
+ fetchMyLiquidations(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Liquidation[]>;
320
+ parseLiquidation(liquidation: any, market?: any): {
321
+ info: any;
322
+ symbol: any;
323
+ contracts: any;
324
+ contractSize: any;
325
+ price: any;
326
+ baseValue: any;
327
+ quoteValue: number;
328
+ timestamp: number;
329
+ datetime: string;
330
+ };
317
331
  handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
318
332
  sign(path: any, api?: any[], method?: string, params?: {}, headers?: any, body?: any): {
319
333
  url: string;