ccxt 4.5.8 → 4.5.9

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 (95) hide show
  1. package/README.md +4 -7
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/base/Exchange.js +111 -17
  5. package/dist/cjs/src/base/ws/Client.js +4 -0
  6. package/dist/cjs/src/bitget.js +59 -72
  7. package/dist/cjs/src/coinbaseexchange.js +15 -0
  8. package/dist/cjs/src/hyperliquid.js +0 -3
  9. package/dist/cjs/src/latoken.js +1 -0
  10. package/dist/cjs/src/phemex.js +15 -6
  11. package/dist/cjs/src/pro/alpaca.js +1 -1
  12. package/dist/cjs/src/pro/apex.js +4 -4
  13. package/dist/cjs/src/pro/binance.js +2 -1
  14. package/dist/cjs/src/pro/bitfinex.js +1 -1
  15. package/dist/cjs/src/pro/bitget.js +1 -1
  16. package/dist/cjs/src/pro/bitmart.js +1 -1
  17. package/dist/cjs/src/pro/bitmex.js +1 -1
  18. package/dist/cjs/src/pro/bitvavo.js +6 -6
  19. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  20. package/dist/cjs/src/pro/bybit.js +2 -1
  21. package/dist/cjs/src/pro/cex.js +2 -2
  22. package/dist/cjs/src/pro/coincatch.js +1 -1
  23. package/dist/cjs/src/pro/coinex.js +3 -3
  24. package/dist/cjs/src/pro/cryptocom.js +1 -1
  25. package/dist/cjs/src/pro/derive.js +1 -1
  26. package/dist/cjs/src/pro/gate.js +1 -1
  27. package/dist/cjs/src/pro/hitbtc.js +1 -1
  28. package/dist/cjs/src/pro/htx.js +2 -2
  29. package/dist/cjs/src/pro/kraken.js +8 -8
  30. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  31. package/dist/cjs/src/pro/kucoin.js +4 -4
  32. package/dist/cjs/src/pro/kucoinfutures.js +4 -4
  33. package/dist/cjs/src/pro/mexc.js +6 -1
  34. package/dist/cjs/src/pro/modetrade.js +2 -2
  35. package/dist/cjs/src/pro/okx.js +4 -2
  36. package/dist/cjs/src/pro/onetrading.js +1 -1
  37. package/dist/cjs/src/pro/oxfun.js +1 -1
  38. package/dist/cjs/src/pro/toobit.js +1 -1
  39. package/dist/cjs/src/pro/whitebit.js +1 -1
  40. package/dist/cjs/src/pro/woo.js +1 -1
  41. package/dist/cjs/src/pro/woofipro.js +2 -2
  42. package/js/ccxt.d.ts +1 -1
  43. package/js/ccxt.js +1 -1
  44. package/js/src/abstract/coinbaseexchange.d.ts +15 -0
  45. package/js/src/base/Exchange.d.ts +13 -5
  46. package/js/src/base/Exchange.js +111 -17
  47. package/js/src/base/ws/Client.d.ts +1 -0
  48. package/js/src/base/ws/Client.js +4 -0
  49. package/js/src/bitget.js +59 -72
  50. package/js/src/coinbaseexchange.js +15 -0
  51. package/js/src/hyperliquid.js +0 -3
  52. package/js/src/latoken.js +1 -0
  53. package/js/src/phemex.js +15 -6
  54. package/js/src/pro/alpaca.js +1 -1
  55. package/js/src/pro/apex.js +4 -4
  56. package/js/src/pro/binance.d.ts +1 -1
  57. package/js/src/pro/binance.js +2 -1
  58. package/js/src/pro/bitfinex.js +1 -1
  59. package/js/src/pro/bitget.js +1 -1
  60. package/js/src/pro/bitmart.js +1 -1
  61. package/js/src/pro/bitmex.js +1 -1
  62. package/js/src/pro/bitvavo.d.ts +3 -3
  63. package/js/src/pro/bitvavo.js +6 -6
  64. package/js/src/pro/blockchaincom.js +1 -1
  65. package/js/src/pro/bybit.js +2 -1
  66. package/js/src/pro/cex.js +2 -2
  67. package/js/src/pro/coincatch.js +1 -1
  68. package/js/src/pro/coinex.js +3 -3
  69. package/js/src/pro/cryptocom.d.ts +1 -1
  70. package/js/src/pro/cryptocom.js +1 -1
  71. package/js/src/pro/derive.js +1 -1
  72. package/js/src/pro/gate.d.ts +1 -1
  73. package/js/src/pro/gate.js +1 -1
  74. package/js/src/pro/hitbtc.d.ts +1 -1
  75. package/js/src/pro/hitbtc.js +1 -1
  76. package/js/src/pro/htx.js +2 -2
  77. package/js/src/pro/hyperliquid.d.ts +1 -1
  78. package/js/src/pro/kraken.d.ts +2 -2
  79. package/js/src/pro/kraken.js +8 -8
  80. package/js/src/pro/krakenfutures.js +1 -1
  81. package/js/src/pro/kucoin.js +4 -4
  82. package/js/src/pro/kucoinfutures.js +4 -4
  83. package/js/src/pro/mexc.js +6 -1
  84. package/js/src/pro/modetrade.js +2 -2
  85. package/js/src/pro/okx.d.ts +2 -2
  86. package/js/src/pro/okx.js +4 -2
  87. package/js/src/pro/onetrading.js +1 -1
  88. package/js/src/pro/oxfun.d.ts +1 -1
  89. package/js/src/pro/oxfun.js +1 -1
  90. package/js/src/pro/poloniex.d.ts +2 -2
  91. package/js/src/pro/toobit.js +1 -1
  92. package/js/src/pro/whitebit.js +1 -1
  93. package/js/src/pro/woo.js +1 -1
  94. package/js/src/pro/woofipro.js +2 -2
  95. package/package.json +21 -10
@@ -47,6 +47,10 @@ export default class Client {
47
47
  // connection-related Future
48
48
  this.connected = Future();
49
49
  }
50
+ reusableFuture(messageHash) {
51
+ // only used in go
52
+ return this.future(messageHash);
53
+ }
50
54
  future(messageHash) {
51
55
  if (!(messageHash in this.futures)) {
52
56
  this.futures[messageHash] = Future();
package/js/src/bitget.js CHANGED
@@ -4358,10 +4358,53 @@ export default class bitget extends Exchange {
4358
4358
  response = await this.privateMixGetV2MixAccountAccounts(this.extend(request, params));
4359
4359
  }
4360
4360
  else if (marginMode === 'isolated') {
4361
- response = await this.privateMarginGetMarginV1IsolatedAccountAssets(this.extend(request, params));
4361
+ response = await this.privateMarginGetV2MarginIsolatedAccountAssets(this.extend(request, params));
4362
+ //
4363
+ // {
4364
+ // "code": "00000",
4365
+ // "msg": "success",
4366
+ // "requestTime": "1759829170717",
4367
+ // "data": [
4368
+ // {
4369
+ // "symbol": "BTCUSDT",
4370
+ // "coin": "USDT",
4371
+ // "totalAmount": "0.000001",
4372
+ // "available": "0.000001",
4373
+ // "frozen": "0",
4374
+ // "borrow": "0",
4375
+ // "interest": "0",
4376
+ // "net": "0.000001",
4377
+ // "coupon": "0",
4378
+ // "cTime": "1759826434145",
4379
+ // "uTime": "1759826434146"
4380
+ // },
4381
+ // ]
4382
+ // }
4383
+ //
4362
4384
  }
4363
4385
  else if (marginMode === 'cross') {
4364
- response = await this.privateMarginGetMarginV1CrossAccountAssets(this.extend(request, params));
4386
+ response = await this.privateMarginGetV2MarginCrossedAccountAssets(this.extend(request, params));
4387
+ //
4388
+ // {
4389
+ // "code": "00000",
4390
+ // "msg": "success",
4391
+ // "requestTime": "1759828519501",
4392
+ // "data": [
4393
+ // {
4394
+ // "coin": "USDT",
4395
+ // "totalAmount": "0.01",
4396
+ // "available": "0.01",
4397
+ // "frozen": "0",
4398
+ // "borrow": "0",
4399
+ // "interest": "0",
4400
+ // "net": "0.01",
4401
+ // "coupon": "0",
4402
+ // "cTime": "1759828511592",
4403
+ // "uTime": "1759828511592"
4404
+ // }
4405
+ // ]
4406
+ // }
4407
+ //
4365
4408
  }
4366
4409
  else if (marketType === 'spot') {
4367
4410
  response = await this.privateSpotGetV2SpotAccountAssets(this.extend(request, params));
@@ -4413,49 +4456,6 @@ export default class bitget extends Exchange {
4413
4456
  // ]
4414
4457
  // }
4415
4458
  //
4416
- // isolated margin
4417
- //
4418
- // {
4419
- // "code": "00000",
4420
- // "msg": "success",
4421
- // "requestTime": 1697501436571,
4422
- // "data": [
4423
- // {
4424
- // "symbol": "BTCUSDT",
4425
- // "coin": "BTC",
4426
- // "totalAmount": "0.00021654",
4427
- // "available": "0.00021654",
4428
- // "transferable": "0.00021654",
4429
- // "frozen": "0",
4430
- // "borrow": "0",
4431
- // "interest": "0",
4432
- // "net": "0.00021654",
4433
- // "ctime": "1697248128071"
4434
- // },
4435
- // ]
4436
- // }
4437
- //
4438
- // cross margin
4439
- //
4440
- // {
4441
- // "code": "00000",
4442
- // "msg": "success",
4443
- // "requestTime": 1697515463804,
4444
- // "data": [
4445
- // {
4446
- // "coin": "BTC",
4447
- // "totalAmount": "0.00024996",
4448
- // "available": "0.00024996",
4449
- // "transferable": "0.00004994",
4450
- // "frozen": "0",
4451
- // "borrow": "0.0001",
4452
- // "interest": "0.00000001",
4453
- // "net": "0.00014995",
4454
- // "ctime": "1697251265504"
4455
- // },
4456
- // ]
4457
- // }
4458
- //
4459
4459
  // uta
4460
4460
  //
4461
4461
  // {
@@ -4550,34 +4550,21 @@ export default class bitget extends Exchange {
4550
4550
  // "isolatedUnrealizedPL": null
4551
4551
  // }
4552
4552
  //
4553
- // isolated margin
4554
- //
4555
- // {
4556
- // "symbol": "BTCUSDT",
4557
- // "coin": "BTC",
4558
- // "totalAmount": "0.00021654",
4559
- // "available": "0.00021654",
4560
- // "transferable": "0.00021654",
4561
- // "frozen": "0",
4562
- // "borrow": "0",
4563
- // "interest": "0",
4564
- // "net": "0.00021654",
4565
- // "ctime": "1697248128071"
4566
- // }
4567
- //
4568
- // cross margin
4553
+ // cross & isolated margin
4569
4554
  //
4570
- // {
4571
- // "coin": "BTC",
4572
- // "totalAmount": "0.00024995",
4573
- // "available": "0.00024995",
4574
- // "transferable": "0.00004993",
4575
- // "frozen": "0",
4576
- // "borrow": "0.0001",
4577
- // "interest": "0.00000001",
4578
- // "net": "0.00014994",
4579
- // "ctime": "1697251265504"
4580
- // }
4555
+ // {
4556
+ // "coin": "USDT",
4557
+ // "totalAmount": "0.01",
4558
+ // "available": "0.01",
4559
+ // "frozen": "0",
4560
+ // "borrow": "0",
4561
+ // "interest": "0",
4562
+ // "net": "0.01",
4563
+ // "coupon": "0",
4564
+ // "cTime": "1759828511592",
4565
+ // "uTime": "1759828511592"
4566
+ // // "symbol": "BTCUSDT" // only for isolated margin
4567
+ // }
4581
4568
  //
4582
4569
  for (let i = 0; i < balance.length; i++) {
4583
4570
  const entry = balance[i];
@@ -214,7 +214,19 @@ export default class coinbaseexchange extends Exchange {
214
214
  'users/self/trailing-volume',
215
215
  'withdrawals/fee-estimate',
216
216
  'conversions/{conversion_id}',
217
+ 'conversions',
217
218
  'conversions/fees',
219
+ 'loans/lending-overview',
220
+ 'loans/lending-overview-xm',
221
+ 'loans/loan-preview',
222
+ 'loans/loan-preview-xm',
223
+ 'loans/repayment-preview',
224
+ 'loans/repayment-preview-xm',
225
+ 'loans/interest/{loan_id}',
226
+ 'loans/interest/history/{loan_id}',
227
+ 'loans/interest',
228
+ 'loans/assets',
229
+ 'loans',
218
230
  ],
219
231
  'post': [
220
232
  'conversions',
@@ -231,6 +243,9 @@ export default class coinbaseexchange extends Exchange {
231
243
  'withdrawals/coinbase-account',
232
244
  'withdrawals/crypto',
233
245
  'withdrawals/payment-method',
246
+ 'loans/open',
247
+ 'loans/repay-interest',
248
+ 'loans/repay-principal',
234
249
  ],
235
250
  'delete': [
236
251
  'orders',
@@ -3147,9 +3147,6 @@ export default class hyperliquid extends Exchange {
3147
3147
  'nonce': nonce,
3148
3148
  'signature': transferSig,
3149
3149
  };
3150
- if (vaultAddress !== undefined) {
3151
- transferRequest['vaultAddress'] = vaultAddress;
3152
- }
3153
3150
  const transferResponse = await this.privatePostExchange(transferRequest);
3154
3151
  return transferResponse;
3155
3152
  }
package/js/src/latoken.js CHANGED
@@ -1606,6 +1606,7 @@ export default class latoken extends Exchange {
1606
1606
  'TRANSACTION_STATUS_EXECUTED': 'ok',
1607
1607
  'TRANSACTION_STATUS_CHECKING': 'pending',
1608
1608
  'TRANSACTION_STATUS_CANCELLED': 'canceled',
1609
+ 'TRANSACTION_STATUS_FAILED': 'failed',
1609
1610
  };
1610
1611
  return this.safeString(statuses, status, status);
1611
1612
  }
package/js/src/phemex.js CHANGED
@@ -4385,13 +4385,25 @@ export default class phemex extends Exchange {
4385
4385
  }
4386
4386
  await this.loadMarkets();
4387
4387
  const market = this.market(symbol);
4388
- if (!market['swap'] || market['settle'] === 'USDT' || market['settle'] === 'USDC') {
4389
- throw new BadSymbol(this.id + ' setMarginMode() supports swap (non USDT/USDC based) contracts only');
4388
+ if (!market['swap']) {
4389
+ throw new BadSymbol(this.id + ' setMarginMode() supports swap contracts only');
4390
4390
  }
4391
4391
  marginMode = marginMode.toLowerCase();
4392
4392
  if (marginMode !== 'isolated' && marginMode !== 'cross') {
4393
4393
  throw new BadRequest(this.id + ' setMarginMode() marginMode argument should be isolated or cross');
4394
4394
  }
4395
+ const request = {
4396
+ 'symbol': market['id'],
4397
+ };
4398
+ const isCross = marginMode === 'cross';
4399
+ if (this.inArray(market['settle'], ['USDT', 'USDC'])) {
4400
+ const currentLeverage = this.safeString(params, 'leverage');
4401
+ if (currentLeverage === undefined) {
4402
+ throw new ArgumentsRequired(this.id + ' setMarginMode() requires a "leverage" parameter for USDT markets');
4403
+ }
4404
+ request['leverageRr'] = isCross ? Precise.stringNeg(Precise.stringAbs(currentLeverage)) : Precise.stringAbs(currentLeverage);
4405
+ return await this.privatePutGPositionsLeverage(this.extend(request, params));
4406
+ }
4395
4407
  let leverage = this.safeInteger(params, 'leverage');
4396
4408
  if (marginMode === 'cross') {
4397
4409
  leverage = 0;
@@ -4399,10 +4411,7 @@ export default class phemex extends Exchange {
4399
4411
  if (leverage === undefined) {
4400
4412
  throw new ArgumentsRequired(this.id + ' setMarginMode() requires a leverage parameter');
4401
4413
  }
4402
- const request = {
4403
- 'symbol': market['id'],
4404
- 'leverage': leverage,
4405
- };
4414
+ request['leverage'] = leverage;
4406
4415
  return await this.privatePutPositionsLeverage(this.extend(request, params));
4407
4416
  }
4408
4417
  /**
@@ -571,7 +571,7 @@ export default class alpaca extends alpacaRest {
571
571
  this.checkRequiredCredentials();
572
572
  const messageHash = 'authenticated';
573
573
  const client = this.client(url);
574
- const future = client.future(messageHash);
574
+ const future = client.reusableFuture(messageHash);
575
575
  const authenticated = this.safeValue(client.subscriptions, messageHash);
576
576
  if (authenticated === undefined) {
577
577
  let request = {
@@ -824,7 +824,7 @@ export default class apex extends apexRest {
824
824
  const signature = this.hmac(this.encode(messageString), this.encode(this.stringToBase64(this.secret)), sha256, 'base64');
825
825
  const messageHash = 'authenticated';
826
826
  const client = this.client(url);
827
- const future = client.future(messageHash);
827
+ const future = client.reusableFuture(messageHash);
828
828
  const authenticated = this.safeValue(client.subscriptions, messageHash);
829
829
  if (authenticated === undefined) {
830
830
  // auth sign
@@ -967,10 +967,10 @@ export default class apex extends apexRest {
967
967
  }
968
968
  }
969
969
  ping(client) {
970
- const timeStamp = this.milliseconds().toString();
971
- client.lastPong = timeStamp; // server won't send a pong, so we set it here
970
+ const timeStamp = this.milliseconds();
971
+ client.lastPong = timeStamp;
972
972
  return {
973
- 'args': [timeStamp],
973
+ 'args': [timeStamp.toString()],
974
974
  'op': 'ping',
975
975
  };
976
976
  }
@@ -681,7 +681,7 @@ export default class binance extends binanceRest {
681
681
  * @param {object} [params] extra parameters specific to the exchange API endpoint
682
682
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
683
683
  */
684
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
684
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
685
685
  /**
686
686
  * @method
687
687
  * @name binance#fetchOrderWs
@@ -1479,7 +1479,8 @@ export default class binance extends binanceRest {
1479
1479
  'id': requestId,
1480
1480
  };
1481
1481
  params = this.omit(params, 'callerMethodName');
1482
- const [symbol, timeframe, candles] = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscribe);
1482
+ const res = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscribe);
1483
+ const [symbol, timeframe, candles] = res;
1483
1484
  if (this.newUpdates) {
1484
1485
  limit = candles.getLimit(symbol, limit);
1485
1486
  }
@@ -992,7 +992,7 @@ export default class bitfinex extends bitfinexRest {
992
992
  const url = this.urls['api']['ws']['private'];
993
993
  const client = this.client(url);
994
994
  const messageHash = 'authenticated';
995
- const future = client.future(messageHash);
995
+ const future = client.reusableFuture(messageHash);
996
996
  const authenticated = this.safeValue(client.subscriptions, messageHash);
997
997
  if (authenticated === undefined) {
998
998
  const nonce = this.milliseconds();
@@ -2483,7 +2483,7 @@ export default class bitget extends bitgetRest {
2483
2483
  const url = this.safeString(params, 'url');
2484
2484
  const client = this.client(url);
2485
2485
  const messageHash = 'authenticated';
2486
- const future = client.future(messageHash);
2486
+ const future = client.reusableFuture(messageHash);
2487
2487
  const authenticated = this.safeValue(client.subscriptions, messageHash);
2488
2488
  if (authenticated === undefined) {
2489
2489
  const timestamp = this.seconds().toString();
@@ -1503,7 +1503,7 @@ export default class bitmart extends bitmartRest {
1503
1503
  const url = this.implodeHostname(this.urls['api']['ws'][type]['private']);
1504
1504
  const messageHash = 'authenticated';
1505
1505
  const client = this.client(url);
1506
- const future = client.future(messageHash);
1506
+ const future = client.reusableFuture(messageHash);
1507
1507
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1508
1508
  if (authenticated === undefined) {
1509
1509
  const timestamp = this.milliseconds().toString();
@@ -689,7 +689,7 @@ export default class bitmex extends bitmexRest {
689
689
  const url = this.urls['api']['ws'];
690
690
  const client = this.client(url);
691
691
  const messageHash = 'authenticated';
692
- const future = client.future(messageHash);
692
+ const future = client.reusableFuture(messageHash);
693
693
  const authenticated = this.safeValue(client.subscriptions, messageHash);
694
694
  if (authenticated === undefined) {
695
695
  this.checkRequiredCredentials();
@@ -154,7 +154,7 @@ export default class bitvavo extends bitvavoRest {
154
154
  * @param {object} [params] extra parameters specific to the bitvavo api endpoint
155
155
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
156
156
  */
157
- cancelOrderWs(id: string, symbol?: Str, params?: {}): Promise<any>;
157
+ cancelOrderWs(id: string, symbol?: Str, params?: {}): Promise<Order>;
158
158
  /**
159
159
  * @method
160
160
  * @name bitvavo#cancelAllOrdersWs
@@ -164,7 +164,7 @@ export default class bitvavo extends bitvavoRest {
164
164
  * @param {object} [params] extra parameters specific to the bitvavo api endpoint
165
165
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
166
166
  */
167
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
167
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
168
168
  handleMultipleOrders(client: Client, message: any): void;
169
169
  /**
170
170
  * @method
@@ -226,7 +226,7 @@ export default class bitvavo extends bitvavoRest {
226
226
  * @param {object} [params] extra parameters specific to the bitvavo api endpoint
227
227
  * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
228
228
  */
229
- withdrawWs(code: string, amount: any, address: any, tag?: any, params?: {}): Promise<any>;
229
+ withdrawWs(code: string, amount: number, address: string, tag?: Str, params?: {}): Promise<any>;
230
230
  handleWithdraw(client: Client, message: any): void;
231
231
  /**
232
232
  * @method
@@ -34,18 +34,18 @@ export default class bitvavo extends bitvavoRest {
34
34
  'editOrderWs': true,
35
35
  'fetchBalanceWs': true,
36
36
  'fetchCurrenciesWS': true,
37
- 'fetchDepositAddressWs': true,
37
+ 'fetchDepositAddressWs': false,
38
38
  'fetchDepositsWs': true,
39
- 'fetchDepositWithdrawFeesWs': true,
39
+ 'fetchDepositWithdrawFeesWs': false,
40
40
  'fetchMyTradesWs': true,
41
41
  'fetchOHLCVWs': true,
42
42
  'fetchOpenOrdersWs': true,
43
43
  'fetchOrderWs': true,
44
- 'fetchOrderBookWs': true,
44
+ 'fetchOrderBookWs': false,
45
45
  'fetchOrdersWs': true,
46
- 'fetchTickerWs': true,
47
- 'fetchTickersWs': true,
48
- 'fetchTimeWs': true,
46
+ 'fetchTickerWs': false,
47
+ 'fetchTickersWs': false,
48
+ 'fetchTimeWs': false,
49
49
  'fetchTradingFeesWs': true,
50
50
  'fetchWithdrawalsWs': true,
51
51
  'withdrawWs': true,
@@ -761,7 +761,7 @@ export default class blockchaincom extends blockchaincomRest {
761
761
  const url = this.urls['api']['ws'];
762
762
  const client = this.client(url);
763
763
  const messageHash = 'authenticated';
764
- const future = client.future(messageHash);
764
+ const future = client.reusableFuture(messageHash);
765
765
  const isAuthenticated = this.safeValue(client.subscriptions, messageHash);
766
766
  if (isAuthenticated === undefined) {
767
767
  this.checkRequiredCredentials();
@@ -994,6 +994,7 @@ export default class bybit extends bybitRest {
994
994
  this.orderbooks[symbol] = this.orderBook();
995
995
  }
996
996
  const orderbook = this.orderbooks[symbol];
997
+ orderbook['symbol'] = symbol;
997
998
  if (isSnapshot) {
998
999
  const snapshot = this.parseOrderBook(data, symbol, timestamp, 'b', 'a');
999
1000
  orderbook.reset(snapshot);
@@ -2282,7 +2283,7 @@ export default class bybit extends bybitRest {
2282
2283
  this.checkRequiredCredentials();
2283
2284
  const messageHash = 'authenticated';
2284
2285
  const client = this.client(url);
2285
- const future = client.future(messageHash);
2286
+ const future = client.reusableFuture(messageHash);
2286
2287
  const authenticated = this.safeValue(client.subscriptions, messageHash);
2287
2288
  if (authenticated === undefined) {
2288
2289
  const expiresInt = this.milliseconds() + 10000;
package/js/src/pro/cex.js CHANGED
@@ -1514,7 +1514,7 @@ export default class cex extends cexRest {
1514
1514
  const url = this.urls['api']['ws'];
1515
1515
  const client = this.client(url);
1516
1516
  const messageHash = 'authenticated';
1517
- const future = client.future('authenticated');
1517
+ const future = client.reusableFuture('authenticated');
1518
1518
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1519
1519
  if (authenticated === undefined) {
1520
1520
  this.checkRequiredCredentials();
@@ -1529,7 +1529,7 @@ export default class cex extends cexRest {
1529
1529
  'timestamp': nonce,
1530
1530
  },
1531
1531
  };
1532
- await this.watch(url, messageHash, this.extend(request, params), messageHash);
1532
+ this.watch(url, messageHash, this.extend(request, params), messageHash);
1533
1533
  }
1534
1534
  return await future;
1535
1535
  }
@@ -102,7 +102,7 @@ export default class coincatch extends coincatchRest {
102
102
  const url = this.urls['api']['ws']['private'];
103
103
  const client = this.client(url);
104
104
  const messageHash = 'authenticated';
105
- const future = client.future(messageHash);
105
+ const future = client.reusableFuture(messageHash);
106
106
  const authenticated = this.safeValue(client.subscriptions, messageHash);
107
107
  if (authenticated === undefined) {
108
108
  const timestamp = this.seconds().toString();
@@ -151,7 +151,7 @@ export default class coinex extends coinexRest {
151
151
  const defaultType = this.safeString(this.options, 'defaultType');
152
152
  const data = this.safeDict(message, 'data', {});
153
153
  const rawTickers = this.safeList(data, 'state_list', []);
154
- const newTickers = [];
154
+ const newTickers = {};
155
155
  for (let i = 0; i < rawTickers.length; i++) {
156
156
  const entry = rawTickers[i];
157
157
  const marketId = this.safeString(entry, 'market');
@@ -159,7 +159,7 @@ export default class coinex extends coinexRest {
159
159
  const market = this.safeMarket(marketId, undefined, undefined, defaultType);
160
160
  const parsedTicker = this.parseWSTicker(entry, market);
161
161
  this.tickers[symbol] = parsedTicker;
162
- newTickers.push(parsedTicker);
162
+ newTickers[symbol] = parsedTicker;
163
163
  }
164
164
  const messageHashes = this.findMessageHashes(client, 'tickers::');
165
165
  for (let i = 0; i < messageHashes.length; i++) {
@@ -1399,7 +1399,7 @@ export default class coinex extends coinexRest {
1399
1399
  const time = this.milliseconds();
1400
1400
  const timestamp = time.toString();
1401
1401
  const messageHash = 'authenticated';
1402
- const future = client.future(messageHash);
1402
+ const future = client.reusableFuture(messageHash);
1403
1403
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1404
1404
  if (authenticated !== undefined) {
1405
1405
  return await future;
@@ -283,7 +283,7 @@ export default class cryptocom extends cryptocomRest {
283
283
  * @param {object} [params] extra parameters specific to the exchange API endpoint
284
284
  * @returns {object} Returns exchange raw message {@link https://docs.ccxt.com/#/?id=order-structure}
285
285
  */
286
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
286
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
287
287
  handleCancelAllOrders(client: Client, message: any): void;
288
288
  watchPublic(messageHash: any, params?: {}): Promise<any>;
289
289
  watchPublicMultiple(messageHashes: any, topics: any, params?: {}): Promise<any>;
@@ -1356,7 +1356,7 @@ export default class cryptocom extends cryptocomRest {
1356
1356
  const url = this.urls['api']['ws']['private'];
1357
1357
  const client = this.client(url);
1358
1358
  const messageHash = 'authenticated';
1359
- const future = client.future(messageHash);
1359
+ const future = client.reusableFuture(messageHash);
1360
1360
  const authenticated = this.safeValue(client.subscriptions, messageHash);
1361
1361
  if (authenticated === undefined) {
1362
1362
  const method = 'public/auth';
@@ -424,7 +424,7 @@ export default class derive extends deriveRest {
424
424
  const url = this.urls['api']['ws'];
425
425
  const client = this.client(url);
426
426
  const messageHash = 'authenticated';
427
- const future = client.future(messageHash);
427
+ const future = client.reusableFuture(messageHash);
428
428
  const authenticated = this.safeValue(client.subscriptions, messageHash);
429
429
  if (authenticated === undefined) {
430
430
  const requestId = this.requestId(url);
@@ -138,7 +138,7 @@ export default class gate extends gateRest {
138
138
  * @param {int} [params.limit] the maximum number of order structures to retrieve
139
139
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
140
140
  */
141
- fetchOrdersByStatusWs(status: string, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
141
+ fetchOrdersByStatusWs(status: string, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
142
142
  /**
143
143
  * @method
144
144
  * @name gate#watchOrderBook
@@ -2026,7 +2026,7 @@ export default class gate extends gateRest {
2026
2026
  const channel = messageType + '.login';
2027
2027
  const client = this.client(url);
2028
2028
  const messageHash = 'authenticated';
2029
- const future = client.future(messageHash);
2029
+ const future = client.reusableFuture(messageHash);
2030
2030
  const authenticated = this.safeValue(client.subscriptions, messageHash);
2031
2031
  if (authenticated === undefined) {
2032
2032
  return await this.requestPrivate(url, {}, channel, messageHash);
@@ -209,7 +209,7 @@ export default class hitbtc extends hitbtcRest {
209
209
  * @param {bool} [params.margin] true for canceling margin orders
210
210
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
211
211
  */
212
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
212
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
213
213
  /**
214
214
  * @method
215
215
  * @name hitbtc#fetchOpenOrdersWs
@@ -88,7 +88,7 @@ export default class hitbtc extends hitbtcRest {
88
88
  const url = this.urls['api']['ws']['private'];
89
89
  const messageHash = 'authenticated';
90
90
  const client = this.client(url);
91
- const future = client.future(messageHash);
91
+ const future = client.reusableFuture(messageHash);
92
92
  const authenticated = this.safeValue(client.subscriptions, messageHash);
93
93
  if (authenticated === undefined) {
94
94
  const timestamp = this.milliseconds();
package/js/src/pro/htx.js CHANGED
@@ -2493,7 +2493,7 @@ export default class htx extends htxRest {
2493
2493
  const messageHash = 'auth';
2494
2494
  const relativePath = url.replace('wss://' + hostname, '');
2495
2495
  const client = this.client(url);
2496
- const future = client.future(messageHash);
2496
+ const future = client.reusableFuture(messageHash);
2497
2497
  const authenticated = this.safeValue(client.subscriptions, messageHash);
2498
2498
  if (authenticated === undefined) {
2499
2499
  const timestamp = this.ymdhms(this.milliseconds(), 'T');
@@ -2515,7 +2515,7 @@ export default class htx extends htxRest {
2515
2515
  };
2516
2516
  }
2517
2517
  signatureParams = this.keysort(signatureParams);
2518
- const auth = this.urlencode(signatureParams);
2518
+ const auth = this.urlencode(signatureParams, true); // true required in go
2519
2519
  const payload = ['GET', hostname, relativePath, auth].join("\n"); // eslint-disable-line quotes
2520
2520
  const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha256, 'base64');
2521
2521
  let request = undefined;
@@ -67,7 +67,7 @@ export default class hyperliquid extends hyperliquidRest {
67
67
  * @param {string} [params.vaultAddress] the vault address for order cancellation
68
68
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
69
69
  */
70
- cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any[]>;
70
+ cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
71
71
  /**
72
72
  * @method
73
73
  * @name hyperliquid#cancelOrderWs
@@ -44,7 +44,7 @@ export default class kraken extends krakenRest {
44
44
  * @param {object} [params] extra parameters specific to the exchange API endpoint
45
45
  * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
46
46
  */
47
- cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<any>;
47
+ cancelOrdersWs(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
48
48
  /**
49
49
  * @method
50
50
  * @name kraken#cancelOrderWs
@@ -66,7 +66,7 @@ export default class kraken extends krakenRest {
66
66
  * @param {object} [params] extra parameters specific to the exchange API endpoint
67
67
  * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
68
68
  */
69
- cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<any>;
69
+ cancelAllOrdersWs(symbol?: Str, params?: {}): Promise<Order[]>;
70
70
  handleCancelAllOrders(client: any, message: any): void;
71
71
  handleTicker(client: any, message: any): void;
72
72
  handleTrades(client: Client, message: any): void;