ccxt 4.2.76 → 4.2.77

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 (65) hide show
  1. package/README.md +3 -3
  2. package/build.sh +1 -1
  3. package/dist/ccxt.browser.js +966 -597
  4. package/dist/ccxt.browser.min.js +7 -7
  5. package/dist/cjs/ccxt.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +6 -0
  7. package/dist/cjs/src/binance.js +502 -443
  8. package/dist/cjs/src/bingx.js +1 -1
  9. package/dist/cjs/src/blofin.js +14 -2
  10. package/dist/cjs/src/bybit.js +100 -58
  11. package/dist/cjs/src/coinbase.js +1 -1
  12. package/dist/cjs/src/delta.js +66 -49
  13. package/dist/cjs/src/hyperliquid.js +1 -1
  14. package/dist/cjs/src/kraken.js +8 -8
  15. package/dist/cjs/src/kucoin.js +152 -5
  16. package/dist/cjs/src/pro/ascendex.js +1 -1
  17. package/dist/cjs/src/pro/bitvavo.js +1 -1
  18. package/dist/cjs/src/pro/coinex.js +20 -14
  19. package/dist/cjs/src/pro/deribit.js +1 -1
  20. package/dist/cjs/src/pro/exmo.js +1 -1
  21. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  22. package/dist/cjs/src/pro/phemex.js +1 -1
  23. package/dist/cjs/src/pro/poloniex.js +1 -1
  24. package/dist/cjs/src/pro/probit.js +1 -1
  25. package/dist/cjs/src/pro/woo.js +61 -6
  26. package/dist/cjs/src/woo.js +25 -0
  27. package/js/ccxt.d.ts +1 -1
  28. package/js/ccxt.js +1 -1
  29. package/js/src/abstract/kucoin.d.ts +1 -0
  30. package/js/src/abstract/kucoinfutures.d.ts +1 -0
  31. package/js/src/base/Exchange.d.ts +3 -3
  32. package/js/src/base/Exchange.js +6 -0
  33. package/js/src/base/types.d.ts +1 -1
  34. package/js/src/binance.d.ts +2 -2
  35. package/js/src/binance.js +502 -443
  36. package/js/src/bingx.js +1 -1
  37. package/js/src/bitflyer.d.ts +2 -2
  38. package/js/src/bithumb.d.ts +2 -2
  39. package/js/src/blofin.js +14 -2
  40. package/js/src/bybit.d.ts +1 -1
  41. package/js/src/bybit.js +100 -58
  42. package/js/src/coinbase.js +1 -1
  43. package/js/src/delta.d.ts +2 -1
  44. package/js/src/delta.js +66 -49
  45. package/js/src/deribit.d.ts +1 -1
  46. package/js/src/gate.d.ts +1 -1
  47. package/js/src/hyperliquid.js +1 -1
  48. package/js/src/kraken.js +8 -8
  49. package/js/src/kucoin.d.ts +4 -1
  50. package/js/src/kucoin.js +152 -5
  51. package/js/src/okx.d.ts +1 -1
  52. package/js/src/pro/ascendex.js +1 -1
  53. package/js/src/pro/bitvavo.js +1 -1
  54. package/js/src/pro/coinex.js +20 -14
  55. package/js/src/pro/deribit.js +1 -1
  56. package/js/src/pro/exmo.js +1 -1
  57. package/js/src/pro/krakenfutures.js +1 -1
  58. package/js/src/pro/phemex.js +1 -1
  59. package/js/src/pro/poloniex.js +1 -1
  60. package/js/src/pro/probit.js +1 -1
  61. package/js/src/pro/woo.d.ts +1 -0
  62. package/js/src/pro/woo.js +61 -6
  63. package/js/src/woo.js +25 -0
  64. package/package.json +1 -1
  65. package/skip-tests.json +1 -2
package/js/src/kucoin.js CHANGED
@@ -55,8 +55,8 @@ export default class kucoin extends Exchange {
55
55
  'fetchAccounts': true,
56
56
  'fetchBalance': true,
57
57
  'fetchBorrowInterest': true,
58
- 'fetchBorrowRateHistories': false,
59
- 'fetchBorrowRateHistory': false,
58
+ 'fetchBorrowRateHistories': true,
59
+ 'fetchBorrowRateHistory': true,
60
60
  'fetchClosedOrders': true,
61
61
  'fetchCrossBorrowRate': false,
62
62
  'fetchCrossBorrowRates': false,
@@ -230,6 +230,7 @@ export default class kucoin extends Exchange {
230
230
  'isolated/account/{symbol}': 50,
231
231
  'margin/borrow': 15,
232
232
  'margin/repay': 15,
233
+ 'margin/interest': 20,
233
234
  'project/list': 10,
234
235
  'project/marketInterestRate': 7.5,
235
236
  'redeem/orders': 10,
@@ -591,6 +592,7 @@ export default class kucoin extends Exchange {
591
592
  'margin/currencies': 'v3',
592
593
  'margin/borrow': 'v3',
593
594
  'margin/repay': 'v3',
595
+ 'margin/interest': 'v3',
594
596
  'project/list': 'v3',
595
597
  'project/marketInterestRate': 'v3',
596
598
  'redeem/orders': 'v3',
@@ -4045,12 +4047,19 @@ export default class kucoin extends Exchange {
4045
4047
  // "timestamp": 1658531274508488480
4046
4048
  // },
4047
4049
  //
4048
- const timestampId = this.safeString(info, 'timestamp');
4049
- const timestamp = Precise.stringMul(timestampId, '0.000001');
4050
+ // {
4051
+ // "createdAt": 1697783812257,
4052
+ // "currency": "XMR",
4053
+ // "interestAmount": "0.1",
4054
+ // "dayRatio": "0.001"
4055
+ // }
4056
+ //
4057
+ const timestampId = this.safeString2(info, 'createdAt', 'timestamp');
4058
+ const timestamp = this.parseToInt(timestampId.slice(0, 13));
4050
4059
  const currencyId = this.safeString(info, 'currency');
4051
4060
  return {
4052
4061
  'currency': this.safeCurrencyCode(currencyId, currency),
4053
- 'rate': this.safeNumber(info, 'dailyIntRate'),
4062
+ 'rate': this.safeNumber2(info, 'dailyIntRate', 'dayRatio'),
4054
4063
  'period': 86400000,
4055
4064
  'timestamp': timestamp,
4056
4065
  'datetime': this.iso8601(timestamp),
@@ -4234,6 +4243,144 @@ export default class kucoin extends Exchange {
4234
4243
  'info': info,
4235
4244
  };
4236
4245
  }
4246
+ async fetchBorrowRateHistories(codes = undefined, since = undefined, limit = undefined, params = {}) {
4247
+ /**
4248
+ * @method
4249
+ * @name kucoin#fetchBorrowRateHistories
4250
+ * @description retrieves a history of a multiple currencies borrow interest rate at specific time slots, returns all currencies if no symbols passed, default is undefined
4251
+ * @see https://www.kucoin.com/docs/rest/margin-trading/margin-trading-v3-/get-cross-isolated-margin-interest-records
4252
+ * @param {string[]|undefined} codes list of unified currency codes, default is undefined
4253
+ * @param {int} [since] timestamp in ms of the earliest borrowRate, default is undefined
4254
+ * @param {int} [limit] max number of borrow rate prices to return, default is undefined
4255
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
4256
+ * @param {string} [params.marginMode] 'cross' or 'isolated' default is 'cross'
4257
+ * @param {int} [params.until] the latest time in ms to fetch entries for
4258
+ * @returns {object} a dictionary of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} indexed by the market symbol
4259
+ */
4260
+ await this.loadMarkets();
4261
+ const marginResult = this.handleMarginModeAndParams('fetchBorrowRateHistories', params);
4262
+ const marginMode = this.safeString(marginResult, 0, 'cross');
4263
+ const isIsolated = (marginMode === 'isolated'); // true-isolated, false-cross
4264
+ let request = {
4265
+ 'isIsolated': isIsolated,
4266
+ };
4267
+ if (since !== undefined) {
4268
+ request['startTime'] = since;
4269
+ }
4270
+ [request, params] = this.handleUntilOption('endTime', request, params);
4271
+ if (limit !== undefined) {
4272
+ request['pageSize'] = limit; // default:50, min:10, max:500
4273
+ }
4274
+ const response = await this.privateGetMarginInterest(this.extend(request, params));
4275
+ //
4276
+ // {
4277
+ // "code": "200000",
4278
+ // "data": {
4279
+ // "timestamp": 1710829939673,
4280
+ // "currentPage": 1,
4281
+ // "pageSize": 50,
4282
+ // "totalNum": 0,
4283
+ // "totalPage": 0,
4284
+ // "items": [
4285
+ // {
4286
+ // "createdAt": 1697783812257,
4287
+ // "currency": "XMR",
4288
+ // "interestAmount": "0.1",
4289
+ // "dayRatio": "0.001"
4290
+ // }
4291
+ // ]
4292
+ // }
4293
+ // }
4294
+ //
4295
+ const data = this.safeDict(response, 'data');
4296
+ const rows = this.safeList(data, 'items');
4297
+ return this.parseBorrowRateHistories(rows, codes, since, limit);
4298
+ }
4299
+ async fetchBorrowRateHistory(code, since = undefined, limit = undefined, params = {}) {
4300
+ /**
4301
+ * @method
4302
+ * @name kucoin#fetchBorrowRateHistory
4303
+ * @description retrieves a history of a currencies borrow interest rate at specific time slots
4304
+ * @see https://www.kucoin.com/docs/rest/margin-trading/margin-trading-v3-/get-cross-isolated-margin-interest-records
4305
+ * @param {string} code unified currency code
4306
+ * @param {int} [since] timestamp for the earliest borrow rate
4307
+ * @param {int} [limit] the maximum number of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} to retrieve
4308
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
4309
+ * @param {string} [params.marginMode] 'cross' or 'isolated' default is 'cross'
4310
+ * @param {int} [params.until] the latest time in ms to fetch entries for
4311
+ * @returns {object[]} an array of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure}
4312
+ */
4313
+ await this.loadMarkets();
4314
+ const marginResult = this.handleMarginModeAndParams('fetchBorrowRateHistories', params);
4315
+ const marginMode = this.safeString(marginResult, 0, 'cross');
4316
+ const isIsolated = (marginMode === 'isolated'); // true-isolated, false-cross
4317
+ const currency = this.currency(code);
4318
+ let request = {
4319
+ 'isIsolated': isIsolated,
4320
+ 'currency': currency['id'],
4321
+ };
4322
+ if (since !== undefined) {
4323
+ request['startTime'] = since;
4324
+ }
4325
+ [request, params] = this.handleUntilOption('endTime', request, params);
4326
+ if (limit !== undefined) {
4327
+ request['pageSize'] = limit; // default:50, min:10, max:500
4328
+ }
4329
+ const response = await this.privateGetMarginInterest(this.extend(request, params));
4330
+ //
4331
+ // {
4332
+ // "code": "200000",
4333
+ // "data": {
4334
+ // "timestamp": 1710829939673,
4335
+ // "currentPage": 1,
4336
+ // "pageSize": 50,
4337
+ // "totalNum": 0,
4338
+ // "totalPage": 0,
4339
+ // "items": [
4340
+ // {
4341
+ // "createdAt": 1697783812257,
4342
+ // "currency": "XMR",
4343
+ // "interestAmount": "0.1",
4344
+ // "dayRatio": "0.001"
4345
+ // }
4346
+ // ]
4347
+ // }
4348
+ // }
4349
+ //
4350
+ const data = this.safeDict(response, 'data');
4351
+ const rows = this.safeList(data, 'items');
4352
+ return this.parseBorrowRateHistory(rows, code, since, limit);
4353
+ }
4354
+ parseBorrowRateHistories(response, codes, since, limit) {
4355
+ //
4356
+ // [
4357
+ // {
4358
+ // "createdAt": 1697783812257,
4359
+ // "currency": "XMR",
4360
+ // "interestAmount": "0.1",
4361
+ // "dayRatio": "0.001"
4362
+ // }
4363
+ // ]
4364
+ //
4365
+ const borrowRateHistories = {};
4366
+ for (let i = 0; i < response.length; i++) {
4367
+ const item = response[i];
4368
+ const code = this.safeCurrencyCode(this.safeString(item, 'currency'));
4369
+ if (codes === undefined || this.inArray(code, codes)) {
4370
+ if (!(code in borrowRateHistories)) {
4371
+ borrowRateHistories[code] = [];
4372
+ }
4373
+ const borrowRateStructure = this.parseBorrowRate(item);
4374
+ borrowRateHistories[code].push(borrowRateStructure);
4375
+ }
4376
+ }
4377
+ const keys = Object.keys(borrowRateHistories);
4378
+ for (let i = 0; i < keys.length; i++) {
4379
+ const code = keys[i];
4380
+ borrowRateHistories[code] = this.filterByCurrencySinceLimit(borrowRateHistories[code], code, since, limit);
4381
+ }
4382
+ return borrowRateHistories;
4383
+ }
4237
4384
  async borrowCrossMargin(code, amount, params = {}) {
4238
4385
  /**
4239
4386
  * @method
package/js/src/okx.d.ts CHANGED
@@ -10,7 +10,7 @@ export default class okx extends Exchange {
10
10
  convertToInstrumentType(type: any): string;
11
11
  convertExpireDate(date: any): string;
12
12
  createExpiredOptionMarket(symbol: string): MarketInterface;
13
- safeMarket(marketId?: any, market?: any, delimiter?: any, marketType?: any): MarketInterface;
13
+ safeMarket(marketId?: Str, market?: Market, delimiter?: Str, marketType?: Str): MarketInterface;
14
14
  fetchStatus(params?: {}): Promise<{
15
15
  updated: any;
16
16
  status: string;
@@ -964,7 +964,7 @@ export default class ascendex extends ascendexRest {
964
964
  'key': this.apiKey,
965
965
  'sig': signature,
966
966
  };
967
- future = this.watch(url, messageHash, this.extend(request, params));
967
+ future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
968
968
  client.subscriptions[messageHash] = future;
969
969
  }
970
970
  return future;
@@ -1215,7 +1215,7 @@ export default class bitvavo extends bitvavoRest {
1215
1215
  'timestamp': timestamp,
1216
1216
  };
1217
1217
  const message = this.extend(request, params);
1218
- future = this.watch(url, messageHash, message);
1218
+ future = await this.watch(url, messageHash, message, messageHash);
1219
1219
  client.subscriptions[messageHash] = future;
1220
1220
  }
1221
1221
  return future;
@@ -1019,8 +1019,12 @@ export default class coinex extends coinexRest {
1019
1019
  //
1020
1020
  const messageHashSpot = 'authenticated:spot';
1021
1021
  const messageHashSwap = 'authenticated:swap';
1022
- client.resolve(message, messageHashSpot);
1023
- client.resolve(message, messageHashSwap);
1022
+ // client.resolve (message, messageHashSpot);
1023
+ // client.resolve (message, messageHashSwap);
1024
+ const spotFuture = this.safeValue(client.futures, messageHashSpot);
1025
+ spotFuture.resolve(true);
1026
+ const swapFutures = this.safeValue(client.futures, messageHashSwap);
1027
+ swapFutures.resolve(true);
1024
1028
  return message;
1025
1029
  }
1026
1030
  handleSubscriptionStatus(client, message) {
@@ -1045,16 +1049,20 @@ export default class coinex extends coinexRest {
1045
1049
  const url = this.urls['api']['ws'][type];
1046
1050
  const client = this.client(url);
1047
1051
  const time = this.milliseconds();
1052
+ const isSpot = (type === 'spot');
1053
+ const spotMessageHash = 'authenticated:spot';
1054
+ const swapMessageHash = 'authenticated:swap';
1055
+ const messageHash = isSpot ? spotMessageHash : swapMessageHash;
1056
+ const future = client.future(messageHash);
1057
+ const authenticated = this.safeValue(client.subscriptions, messageHash);
1048
1058
  if (type === 'spot') {
1049
- const messageHash = 'authenticated:spot';
1050
- let future = this.safeValue(client.subscriptions, messageHash);
1051
- if (future !== undefined) {
1059
+ if (authenticated !== undefined) {
1052
1060
  return await future;
1053
1061
  }
1054
1062
  const requestId = this.requestId();
1055
1063
  const subscribe = {
1056
1064
  'id': requestId,
1057
- 'future': 'authenticated:spot',
1065
+ 'future': spotMessageHash,
1058
1066
  };
1059
1067
  const signData = 'access_id=' + this.apiKey + '&tonce=' + this.numberToString(time) + '&secret_key=' + this.secret;
1060
1068
  const hash = this.hash(this.encode(signData), md5);
@@ -1067,20 +1075,18 @@ export default class coinex extends coinexRest {
1067
1075
  ],
1068
1076
  'id': requestId,
1069
1077
  };
1070
- future = this.watch(url, messageHash, request, requestId, subscribe);
1071
- client.subscriptions[messageHash] = future;
1078
+ this.watch(url, messageHash, request, requestId, subscribe);
1079
+ client.subscriptions[messageHash] = true;
1072
1080
  return await future;
1073
1081
  }
1074
1082
  else {
1075
- const messageHash = 'authenticated:swap';
1076
- let future = this.safeValue(client.subscriptions, messageHash);
1077
- if (future !== undefined) {
1083
+ if (authenticated !== undefined) {
1078
1084
  return await future;
1079
1085
  }
1080
1086
  const requestId = this.requestId();
1081
1087
  const subscribe = {
1082
1088
  'id': requestId,
1083
- 'future': 'authenticated:swap',
1089
+ 'future': swapMessageHash,
1084
1090
  };
1085
1091
  const signData = 'access_id=' + this.apiKey + '&timestamp=' + this.numberToString(time) + '&secret_key=' + this.secret;
1086
1092
  const hash = this.hash(this.encode(signData), sha256, 'hex');
@@ -1093,8 +1099,8 @@ export default class coinex extends coinexRest {
1093
1099
  ],
1094
1100
  'id': requestId,
1095
1101
  };
1096
- future = this.watch(url, messageHash, request, requestId, subscribe);
1097
- client.subscriptions[messageHash] = future;
1102
+ this.watch(url, messageHash, request, requestId, subscribe);
1103
+ client.subscriptions[messageHash] = true;
1098
1104
  return await future;
1099
1105
  }
1100
1106
  }
@@ -937,7 +937,7 @@ export default class deribit extends deribitRest {
937
937
  'data': '',
938
938
  },
939
939
  };
940
- future = this.watch(url, messageHash, this.extend(request, params));
940
+ future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
941
941
  client.subscriptions[messageHash] = future;
942
942
  }
943
943
  return future;
@@ -653,7 +653,7 @@ export default class exmo extends exmoRest {
653
653
  'nonce': time,
654
654
  };
655
655
  const message = this.extend(request, query);
656
- future = this.watch(url, messageHash, message);
656
+ future = await this.watch(url, messageHash, message, messageHash);
657
657
  client.subscriptions[messageHash] = future;
658
658
  }
659
659
  return future;
@@ -89,7 +89,7 @@ export default class krakenfutures extends krakenfuturesRest {
89
89
  'api_key': this.apiKey,
90
90
  };
91
91
  const message = this.extend(request, params);
92
- future = await this.watch(url, messageHash, message);
92
+ future = await this.watch(url, messageHash, message, messageHash);
93
93
  client.subscriptions[messageHash] = future;
94
94
  }
95
95
  return future;
@@ -1509,7 +1509,7 @@ export default class phemex extends phemexRest {
1509
1509
  if (!(messageHash in client.subscriptions)) {
1510
1510
  client.subscriptions[subscriptionHash] = this.handleAuthenticate;
1511
1511
  }
1512
- future = this.watch(url, messageHash, message);
1512
+ future = await this.watch(url, messageHash, message, messageHash);
1513
1513
  client.subscriptions[messageHash] = future;
1514
1514
  }
1515
1515
  return future;
@@ -106,7 +106,7 @@ export default class poloniex extends poloniexRest {
106
106
  },
107
107
  };
108
108
  const message = this.extend(request, params);
109
- future = await this.watch(url, messageHash, message);
109
+ future = await this.watch(url, messageHash, message, messageHash);
110
110
  //
111
111
  // {
112
112
  // "data": {
@@ -583,7 +583,7 @@ export default class probit extends probitRest {
583
583
  'type': 'authorization',
584
584
  'token': accessToken,
585
585
  };
586
- future = this.watch(url, messageHash, this.extend(request, params));
586
+ future = await this.watch(url, messageHash, this.extend(request, params), messageHash);
587
587
  client.subscriptions[messageHash] = future;
588
588
  }
589
589
  return future;
@@ -30,6 +30,7 @@ export default class woo extends wooRest {
30
30
  handlePositions(client: any, message: any): void;
31
31
  watchBalance(params?: {}): Promise<Balances>;
32
32
  handleBalance(client: any, message: any): void;
33
+ handleErrorMessage(client: Client, message: any): boolean;
33
34
  handleMessage(client: Client, message: any): void;
34
35
  ping(client: Client): {
35
36
  event: string;
package/js/src/pro/woo.js CHANGED
@@ -58,6 +58,13 @@ export default class woo extends wooRest {
58
58
  'ping': this.ping,
59
59
  'keepAlive': 10000,
60
60
  },
61
+ 'exceptions': {
62
+ 'ws': {
63
+ 'exact': {
64
+ 'Auth is needed.': AuthenticationError,
65
+ },
66
+ },
67
+ },
61
68
  });
62
69
  }
63
70
  requestId(url) {
@@ -419,8 +426,9 @@ export default class woo extends wooRest {
419
426
  const client = this.client(url);
420
427
  const messageHash = 'authenticated';
421
428
  const event = 'auth';
422
- let future = this.safeValue(client.subscriptions, messageHash);
423
- if (future === undefined) {
429
+ const future = client.future(messageHash);
430
+ const authenticated = this.safeValue(client.subscriptions, messageHash);
431
+ if (authenticated === undefined) {
424
432
  const ts = this.nonce().toString();
425
433
  const auth = '|' + ts;
426
434
  const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256);
@@ -433,10 +441,9 @@ export default class woo extends wooRest {
433
441
  },
434
442
  };
435
443
  const message = this.extend(request, params);
436
- future = this.watch(url, messageHash, message);
437
- client.subscriptions[messageHash] = future;
444
+ this.watch(url, messageHash, message, messageHash);
438
445
  }
439
- return future;
446
+ return await future;
440
447
  }
441
448
  async watchPrivate(messageHash, message, params = {}) {
442
449
  await this.authenticate(params);
@@ -449,6 +456,16 @@ export default class woo extends wooRest {
449
456
  return await this.watch(url, messageHash, request, messageHash, subscribe);
450
457
  }
451
458
  async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
459
+ /**
460
+ * @method
461
+ * @name woo#watchOrders
462
+ * @description watches information on multiple orders made by the user
463
+ * @param {string} symbol unified market symbol of the market orders were made in
464
+ * @param {int} [since] the earliest time in ms to fetch orders for
465
+ * @param {int} [limit] the maximum number of order structures to retrieve
466
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
467
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
468
+ */
452
469
  await this.loadMarkets();
453
470
  const topic = 'executionreport';
454
471
  let messageHash = topic;
@@ -801,7 +818,43 @@ export default class woo extends wooRest {
801
818
  this.balance = this.safeBalance(this.balance);
802
819
  client.resolve(this.balance, 'balance');
803
820
  }
821
+ handleErrorMessage(client, message) {
822
+ //
823
+ // {"id":"1","event":"subscribe","success":false,"ts":1710780997216,"errorMsg":"Auth is needed."}
824
+ //
825
+ if (!('success' in message)) {
826
+ return false;
827
+ }
828
+ const success = this.safeBool(message, 'success');
829
+ if (success) {
830
+ return false;
831
+ }
832
+ const errorMessage = this.safeString(message, 'errorMsg');
833
+ try {
834
+ if (errorMessage !== undefined) {
835
+ const feedback = this.id + ' ' + this.json(message);
836
+ this.throwExactlyMatchedException(this.exceptions['exact'], errorMessage, feedback);
837
+ }
838
+ return false;
839
+ }
840
+ catch (error) {
841
+ if (error instanceof AuthenticationError) {
842
+ const messageHash = 'authenticated';
843
+ client.reject(error, messageHash);
844
+ if (messageHash in client.subscriptions) {
845
+ delete client.subscriptions[messageHash];
846
+ }
847
+ }
848
+ else {
849
+ client.reject(error);
850
+ }
851
+ return true;
852
+ }
853
+ }
804
854
  handleMessage(client, message) {
855
+ if (this.handleErrorMessage(client, message)) {
856
+ return;
857
+ }
805
858
  const methods = {
806
859
  'ping': this.handlePing,
807
860
  'pong': this.handlePong,
@@ -884,7 +937,9 @@ export default class woo extends wooRest {
884
937
  const messageHash = 'authenticated';
885
938
  const success = this.safeValue(message, 'success');
886
939
  if (success) {
887
- client.resolve(message, messageHash);
940
+ // client.resolve (message, messageHash);
941
+ const future = this.safeValue(client.futures, 'authenticated');
942
+ future.resolve(true);
888
943
  }
889
944
  else {
890
945
  const error = new AuthenticationError(this.json(message));
package/js/src/woo.js CHANGED
@@ -1370,9 +1370,15 @@ export default class woo extends Exchange {
1370
1370
  * @param {boolean} [params.isTriggered] whether the order has been triggered (false by default)
1371
1371
  * @param {string} [params.side] 'buy' or 'sell'
1372
1372
  * @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
1373
+ * @param {boolean} [params.paginate] set to true if you want to fetch orders with pagination
1373
1374
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1374
1375
  */
1375
1376
  await this.loadMarkets();
1377
+ let paginate = false;
1378
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOrders', 'paginate');
1379
+ if (paginate) {
1380
+ return await this.fetchPaginatedCallIncremental('fetchOrders', symbol, since, limit, params, 'page', 500);
1381
+ }
1376
1382
  const request = {};
1377
1383
  let market = undefined;
1378
1384
  const stop = this.safeBool2(params, 'stop', 'trigger');
@@ -1390,6 +1396,12 @@ export default class woo extends Exchange {
1390
1396
  request['start_t'] = since;
1391
1397
  }
1392
1398
  }
1399
+ if (limit !== undefined) {
1400
+ request['size'] = limit;
1401
+ }
1402
+ else {
1403
+ request['size'] = 500;
1404
+ }
1393
1405
  if (stop) {
1394
1406
  request['algoType'] = 'stop';
1395
1407
  }
@@ -1755,14 +1767,21 @@ export default class woo extends Exchange {
1755
1767
  /**
1756
1768
  * @method
1757
1769
  * @name woo#fetchMyTrades
1770
+ * @see https://docs.woo.org/#get-trades
1758
1771
  * @description fetch all trades made by the user
1759
1772
  * @param {string} symbol unified market symbol
1760
1773
  * @param {int} [since] the earliest time in ms to fetch trades for
1761
1774
  * @param {int} [limit] the maximum number of trades structures to retrieve
1762
1775
  * @param {object} [params] extra parameters specific to the exchange API endpoint
1776
+ * @param {boolean} [params.paginate] set to true if you want to fetch trades with pagination
1763
1777
  * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1764
1778
  */
1765
1779
  await this.loadMarkets();
1780
+ let paginate = false;
1781
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'paginate');
1782
+ if (paginate) {
1783
+ return await this.fetchPaginatedCallIncremental('fetchMyTrades', symbol, since, limit, params, 'page', 500);
1784
+ }
1766
1785
  const request = {};
1767
1786
  let market = undefined;
1768
1787
  if (symbol !== undefined) {
@@ -1772,6 +1791,12 @@ export default class woo extends Exchange {
1772
1791
  if (since !== undefined) {
1773
1792
  request['start_t'] = since;
1774
1793
  }
1794
+ if (limit !== undefined) {
1795
+ request['size'] = limit;
1796
+ }
1797
+ else {
1798
+ request['size'] = 500;
1799
+ }
1775
1800
  const response = await this.v1PrivateGetClientTrades(this.extend(request, params));
1776
1801
  // {
1777
1802
  // "success": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.2.76",
3
+ "version": "4.2.77",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.js",
6
6
  "type": "module",
package/skip-tests.json CHANGED
@@ -719,8 +719,7 @@
719
719
  }
720
720
  },
721
721
  "delta": {
722
- "skip": "frequent timeouts https://app.travis-ci.com/github/ccxt/ccxt/builds/269273148#L4301",
723
- "until": "2024-03-19",
722
+ "skipCSharp": "frequent timeouts https://app.travis-ci.com/github/ccxt/ccxt/builds/269273148#L4301 https://app.travis-ci.com/github/ccxt/ccxt/builds/269533613#L3622",
724
723
  "skipMethods": {
725
724
  "loadMarkets": "expiryDatetime must be equal to expiry in iso8601 format",
726
725
  "orderBook": {