ccxt 4.1.13 → 4.1.14

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 (89) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/CONTRIBUTING.md +1 -0
  3. package/README.md +3 -3
  4. package/dist/ccxt.browser.js +296 -106
  5. package/dist/ccxt.browser.min.js +3 -3
  6. package/dist/cjs/ccxt.js +1 -1
  7. package/dist/cjs/src/ascendex.js +1 -0
  8. package/dist/cjs/src/binance.js +6 -2
  9. package/dist/cjs/src/bingx.js +4 -2
  10. package/dist/cjs/src/bitget.js +192 -1
  11. package/dist/cjs/src/bitmart.js +2 -0
  12. package/dist/cjs/src/bittrex.js +6 -0
  13. package/dist/cjs/src/cex.js +1 -0
  14. package/dist/cjs/src/coinbase.js +1 -0
  15. package/dist/cjs/src/coinbasepro.js +1 -0
  16. package/dist/cjs/src/coinex.js +2 -0
  17. package/dist/cjs/src/coinfalcon.js +1 -0
  18. package/dist/cjs/src/coinmate.js +1 -0
  19. package/dist/cjs/src/coinone.js +2 -1
  20. package/dist/cjs/src/cryptocom.js +25 -87
  21. package/dist/cjs/src/currencycom.js +1 -0
  22. package/dist/cjs/src/delta.js +1 -0
  23. package/dist/cjs/src/deribit.js +1 -0
  24. package/dist/cjs/src/digifinex.js +1 -0
  25. package/dist/cjs/src/exmo.js +1 -0
  26. package/dist/cjs/src/gate.js +3 -0
  27. package/dist/cjs/src/gemini.js +1 -0
  28. package/dist/cjs/src/hitbtc.js +1 -0
  29. package/dist/cjs/src/hollaex.js +1 -0
  30. package/dist/cjs/src/huobijp.js +1 -0
  31. package/dist/cjs/src/idex.js +1 -0
  32. package/dist/cjs/src/independentreserve.js +1 -0
  33. package/dist/cjs/src/indodax.js +1 -0
  34. package/dist/cjs/src/kraken.js +9 -0
  35. package/dist/cjs/src/krakenfutures.js +1 -0
  36. package/dist/cjs/src/latoken.js +1 -0
  37. package/dist/cjs/src/poloniex.js +1 -0
  38. package/dist/cjs/src/poloniexfutures.js +8 -2
  39. package/dist/cjs/src/pro/krakenfutures.js +14 -10
  40. package/dist/cjs/src/woo.js +1 -0
  41. package/js/ccxt.d.ts +1 -1
  42. package/js/ccxt.js +1 -1
  43. package/js/src/abstract/binance.d.ts +4 -0
  44. package/js/src/abstract/binancecoinm.d.ts +4 -0
  45. package/js/src/abstract/binanceus.d.ts +4 -0
  46. package/js/src/abstract/binanceusdm.d.ts +4 -0
  47. package/js/src/abstract/kraken.d.ts +8 -0
  48. package/js/src/abstract/poloniexfutures.d.ts +6 -1
  49. package/js/src/ascendex.js +1 -0
  50. package/js/src/binance.js +6 -2
  51. package/js/src/bingx.js +4 -2
  52. package/js/src/bitget.d.ts +28 -0
  53. package/js/src/bitget.js +192 -1
  54. package/js/src/bitmart.js +2 -0
  55. package/js/src/bittrex.d.ts +2 -2
  56. package/js/src/bittrex.js +6 -0
  57. package/js/src/cex.js +1 -0
  58. package/js/src/coinbase.js +1 -0
  59. package/js/src/coinbasepro.js +1 -0
  60. package/js/src/coinex.js +2 -0
  61. package/js/src/coinfalcon.js +1 -0
  62. package/js/src/coinmate.js +1 -0
  63. package/js/src/coinone.js +2 -1
  64. package/js/src/cryptocom.d.ts +0 -2
  65. package/js/src/cryptocom.js +25 -87
  66. package/js/src/currencycom.js +1 -0
  67. package/js/src/delta.js +1 -0
  68. package/js/src/deribit.js +1 -0
  69. package/js/src/digifinex.js +1 -0
  70. package/js/src/exmo.js +1 -0
  71. package/js/src/gate.d.ts +1 -0
  72. package/js/src/gate.js +3 -0
  73. package/js/src/gemini.d.ts +1 -0
  74. package/js/src/gemini.js +1 -0
  75. package/js/src/hitbtc.js +1 -0
  76. package/js/src/hollaex.js +1 -0
  77. package/js/src/huobijp.js +1 -0
  78. package/js/src/idex.js +1 -0
  79. package/js/src/independentreserve.js +1 -0
  80. package/js/src/indodax.js +1 -0
  81. package/js/src/kraken.js +9 -0
  82. package/js/src/krakenfutures.js +1 -0
  83. package/js/src/latoken.js +1 -0
  84. package/js/src/poloniex.js +1 -0
  85. package/js/src/poloniexfutures.js +8 -2
  86. package/js/src/pro/krakenfutures.js +14 -10
  87. package/js/src/woo.js +1 -0
  88. package/package.json +1 -1
  89. package/skip-tests.json +33 -7
package/js/src/bitget.js CHANGED
@@ -28,11 +28,12 @@ export default class bitget extends Exchange {
28
28
  'has': {
29
29
  'CORS': undefined,
30
30
  'spot': true,
31
- 'margin': false,
31
+ 'margin': undefined,
32
32
  'swap': true,
33
33
  'future': true,
34
34
  'option': false,
35
35
  'addMargin': true,
36
+ 'borrowMargin': true,
36
37
  'cancelAllOrders': true,
37
38
  'cancelOrder': true,
38
39
  'cancelOrders': true,
@@ -91,6 +92,7 @@ export default class bitget extends Exchange {
91
92
  'fetchWithdrawal': false,
92
93
  'fetchWithdrawals': true,
93
94
  'reduceMargin': true,
95
+ 'repayMargin': true,
94
96
  'setLeverage': true,
95
97
  'setMarginMode': true,
96
98
  'setPositionMode': true,
@@ -1295,6 +1297,7 @@ export default class bitget extends Exchange {
1295
1297
  'max': undefined,
1296
1298
  },
1297
1299
  },
1300
+ 'created': undefined,
1298
1301
  'info': market,
1299
1302
  };
1300
1303
  }
@@ -5201,6 +5204,194 @@ export default class bitget extends Exchange {
5201
5204
  'info': interest,
5202
5205
  }, market);
5203
5206
  }
5207
+ async borrowMargin(code, amount, symbol = undefined, params = {}) {
5208
+ /**
5209
+ * @method
5210
+ * @name bitget#borrowMargin
5211
+ * @description create a loan to borrow margin
5212
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-borrow
5213
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-borrow
5214
+ * @param {string} code unified currency code of the currency to borrow
5215
+ * @param {string} amount the amount to borrow
5216
+ * @param {string} [symbol] unified market symbol
5217
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5218
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5219
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5220
+ */
5221
+ await this.loadMarkets();
5222
+ const currency = this.currency(code);
5223
+ const request = {
5224
+ 'coin': currency['info']['coinName'],
5225
+ 'borrowAmount': this.currencyToPrecision(code, amount),
5226
+ };
5227
+ let response = undefined;
5228
+ let marginMode = undefined;
5229
+ [marginMode, params] = this.handleMarginModeAndParams('borrowMargin', params);
5230
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5231
+ this.checkRequiredSymbol('borrowMargin', symbol);
5232
+ const market = this.market(symbol);
5233
+ const marketId = market['id'];
5234
+ const parts = marketId.split('_');
5235
+ const marginMarketId = this.safeStringUpper(parts, 0);
5236
+ request['symbol'] = marginMarketId;
5237
+ response = await this.privateMarginPostIsolatedAccountBorrow(this.extend(request, params));
5238
+ }
5239
+ else {
5240
+ response = await this.privateMarginPostCrossAccountBorrow(this.extend(request, params));
5241
+ }
5242
+ //
5243
+ // isolated
5244
+ //
5245
+ // {
5246
+ // "code": "00000",
5247
+ // "msg": "success",
5248
+ // "requestTime": 1697250952516,
5249
+ // "data": {
5250
+ // "clientOid": null,
5251
+ // "symbol": "BTCUSDT",
5252
+ // "coin": "BTC",
5253
+ // "borrowAmount": "0.001"
5254
+ // }
5255
+ // }
5256
+ //
5257
+ // cross
5258
+ //
5259
+ // {
5260
+ // "code": "00000",
5261
+ // "msg": "success",
5262
+ // "requestTime": 1697251314271,
5263
+ // "data": {
5264
+ // "clientOid": null,
5265
+ // "coin": "BTC",
5266
+ // "borrowAmount": "0.0001"
5267
+ // }
5268
+ // }
5269
+ //
5270
+ const data = this.safeValue(response, 'data', {});
5271
+ return this.parseMarginLoan(data, currency);
5272
+ }
5273
+ async repayMargin(code, amount, symbol = undefined, params = {}) {
5274
+ /**
5275
+ * @method
5276
+ * @name bitget#repayMargin
5277
+ * @description repay borrowed margin and interest
5278
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-repay
5279
+ * @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-repay
5280
+ * @param {string} code unified currency code of the currency to repay
5281
+ * @param {string} amount the amount to repay
5282
+ * @param {string} [symbol] unified market symbol
5283
+ * @param {object} [params] extra parameters specific to the bitget api endpoint
5284
+ * @param {string} [params.marginMode] 'isolated' or 'cross', symbol is required for 'isolated'
5285
+ * @returns {object} a [margin loan structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#margin-loan-structure}
5286
+ */
5287
+ await this.loadMarkets();
5288
+ const currency = this.currency(code);
5289
+ const request = {
5290
+ 'coin': currency['info']['coinName'],
5291
+ 'repayAmount': this.currencyToPrecision(code, amount),
5292
+ };
5293
+ let response = undefined;
5294
+ let marginMode = undefined;
5295
+ [marginMode, params] = this.handleMarginModeAndParams('repayMargin', params);
5296
+ if ((symbol !== undefined) || (marginMode === 'isolated')) {
5297
+ this.checkRequiredSymbol('repayMargin', symbol);
5298
+ const market = this.market(symbol);
5299
+ const marketId = market['id'];
5300
+ const parts = marketId.split('_');
5301
+ const marginMarketId = this.safeStringUpper(parts, 0);
5302
+ request['symbol'] = marginMarketId;
5303
+ response = await this.privateMarginPostIsolatedAccountRepay(this.extend(request, params));
5304
+ }
5305
+ else {
5306
+ response = await this.privateMarginPostCrossAccountRepay(this.extend(request, params));
5307
+ }
5308
+ //
5309
+ // isolated
5310
+ //
5311
+ // {
5312
+ // "code": "00000",
5313
+ // "msg": "success",
5314
+ // "requestTime": 1697251988593,
5315
+ // "data": {
5316
+ // "remainDebtAmount": "0",
5317
+ // "clientOid": null,
5318
+ // "symbol": "BTCUSDT",
5319
+ // "coin": "BTC",
5320
+ // "repayAmount": "0.00100001"
5321
+ // }
5322
+ // }
5323
+ //
5324
+ // cross
5325
+ //
5326
+ // {
5327
+ // "code": "00000",
5328
+ // "msg": "success",
5329
+ // "requestTime": 1697252151042,
5330
+ // "data": {
5331
+ // "remainDebtAmount": "0",
5332
+ // "clientOid": null,
5333
+ // "coin": "BTC",
5334
+ // "repayAmount": "0.00010001"
5335
+ // }
5336
+ // }
5337
+ //
5338
+ const data = this.safeValue(response, 'data', {});
5339
+ return this.parseMarginLoan(data, currency);
5340
+ }
5341
+ parseMarginLoan(info, currency = undefined) {
5342
+ //
5343
+ // isolated: borrowMargin
5344
+ //
5345
+ // {
5346
+ // "clientOid": null,
5347
+ // "symbol": "BTCUSDT",
5348
+ // "coin": "BTC",
5349
+ // "borrowAmount": "0.001"
5350
+ // }
5351
+ //
5352
+ // cross: borrowMargin
5353
+ //
5354
+ // {
5355
+ // "clientOid": null,
5356
+ // "coin": "BTC",
5357
+ // "borrowAmount": "0.0001"
5358
+ // }
5359
+ //
5360
+ // isolated: repayMargin
5361
+ //
5362
+ // {
5363
+ // "remainDebtAmount": "0",
5364
+ // "clientOid": null,
5365
+ // "symbol": "BTCUSDT",
5366
+ // "coin": "BTC",
5367
+ // "repayAmount": "0.00100001"
5368
+ // }
5369
+ //
5370
+ // cross: repayMargin
5371
+ //
5372
+ // {
5373
+ // "remainDebtAmount": "0",
5374
+ // "clientOid": null,
5375
+ // "coin": "BTC",
5376
+ // "repayAmount": "0.00010001"
5377
+ // }
5378
+ //
5379
+ const currencyId = this.safeString(info, 'coin');
5380
+ const marketId = this.safeString(info, 'symbol');
5381
+ let symbol = undefined;
5382
+ if (marketId !== undefined) {
5383
+ symbol = this.safeSymbol(marketId);
5384
+ }
5385
+ return {
5386
+ 'id': this.safeString(info, 'clientOid'),
5387
+ 'currency': this.safeCurrencyCode(currencyId, currency),
5388
+ 'amount': this.safeNumber2(info, 'borrowAmount', 'repayAmount'),
5389
+ 'symbol': symbol,
5390
+ 'timestamp': undefined,
5391
+ 'datetime': undefined,
5392
+ 'info': info,
5393
+ };
5394
+ }
5204
5395
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
5205
5396
  if (!response) {
5206
5397
  return undefined; // fallback to default error handler
package/js/src/bitmart.js CHANGED
@@ -760,6 +760,7 @@ export default class bitmart extends Exchange {
760
760
  'max': undefined,
761
761
  },
762
762
  },
763
+ 'created': undefined,
763
764
  'info': market,
764
765
  });
765
766
  }
@@ -866,6 +867,7 @@ export default class bitmart extends Exchange {
866
867
  'max': undefined,
867
868
  },
868
869
  },
870
+ 'created': this.safeInteger(market, 'open_timestamp'),
869
871
  'info': market,
870
872
  });
871
873
  }
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bittrex.js';
2
- import { Int, OrderSide, OrderType } from './base/types.js';
2
+ import { Int, OrderSide, OrderType, OHLCV } from './base/types.js';
3
3
  /**
4
4
  * @class bittrex
5
5
  * @extends Exchange
@@ -38,7 +38,7 @@ export default class bittrex extends Exchange {
38
38
  info: any;
39
39
  };
40
40
  parseOHLCV(ohlcv: any, market?: any): number[];
41
- fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").OHLCV[]>;
41
+ fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
42
42
  fetchOpenOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Order[]>;
43
43
  fetchOrderTrades(id: string, symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Trade[]>;
44
44
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<import("./base/types.js").Order>;
package/js/src/bittrex.js CHANGED
@@ -908,8 +908,14 @@ export default class bittrex extends Exchange {
908
908
  * @param {int} [since] timestamp in ms of the earliest candle to fetch
909
909
  * @param {int} [limit] the maximum amount of candles to fetch
910
910
  * @param {object} [params] extra parameters specific to the bittrex api endpoint
911
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
911
912
  * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
912
913
  */
914
+ let paginate = false;
915
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'paginate', false);
916
+ if (paginate) {
917
+ return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 1440);
918
+ }
913
919
  await this.loadMarkets();
914
920
  const market = this.market(symbol);
915
921
  const reverseId = market['baseId'] + '-' + market['quoteId'];
package/js/src/cex.js CHANGED
@@ -439,6 +439,7 @@ export default class cex extends Exchange {
439
439
  'max': undefined,
440
440
  },
441
441
  },
442
+ 'created': undefined,
442
443
  'info': market,
443
444
  });
444
445
  }
@@ -1076,6 +1076,7 @@ export default class coinbase extends Exchange {
1076
1076
  'max': this.safeNumber(market, 'quote_max_size'),
1077
1077
  },
1078
1078
  },
1079
+ 'created': undefined,
1079
1080
  'info': market,
1080
1081
  });
1081
1082
  }
@@ -413,6 +413,7 @@ export default class coinbasepro extends Exchange {
413
413
  'max': undefined,
414
414
  },
415
415
  },
416
+ 'created': undefined,
416
417
  'info': market,
417
418
  }));
418
419
  }
package/js/src/coinex.js CHANGED
@@ -536,6 +536,7 @@ export default class coinex extends Exchange {
536
536
  'max': undefined,
537
537
  },
538
538
  },
539
+ 'created': undefined,
539
540
  'info': market,
540
541
  });
541
542
  }
@@ -632,6 +633,7 @@ export default class coinex extends Exchange {
632
633
  'max': undefined,
633
634
  },
634
635
  },
636
+ 'created': undefined,
635
637
  'info': entry,
636
638
  });
637
639
  }
@@ -216,6 +216,7 @@ export default class coinfalcon extends Exchange {
216
216
  'max': undefined,
217
217
  },
218
218
  },
219
+ 'created': undefined,
219
220
  'info': market,
220
221
  });
221
222
  }
@@ -291,6 +291,7 @@ export default class coinmate extends Exchange {
291
291
  'max': undefined,
292
292
  },
293
293
  },
294
+ 'created': undefined,
294
295
  'info': market,
295
296
  });
296
297
  }
package/js/src/coinone.js CHANGED
@@ -232,6 +232,7 @@ export default class coinone extends Exchange {
232
232
  'max': undefined,
233
233
  },
234
234
  },
235
+ 'created': undefined,
235
236
  'info': ticker,
236
237
  });
237
238
  }
@@ -889,7 +890,7 @@ export default class coinone extends Exchange {
889
890
  const payload = this.stringToBase64(json);
890
891
  body = payload;
891
892
  const secret = this.secret.toUpperCase();
892
- const signature = this.hmac(payload, this.encode(secret), sha512);
893
+ const signature = this.hmac(this.encode(payload), this.encode(secret), sha512);
893
894
  headers = {
894
895
  'Content-Type': 'application/json',
895
896
  'X-COINONE-PAYLOAD': payload,
@@ -113,7 +113,6 @@ export default class cryptocom extends Exchange {
113
113
  datetime: any;
114
114
  info: any;
115
115
  };
116
- fetchBorrowInterest(code?: string, symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<any>;
117
116
  parseBorrowInterest(info: any, market?: any): {
118
117
  symbol: any;
119
118
  marginMode: any;
@@ -125,7 +124,6 @@ export default class cryptocom extends Exchange {
125
124
  datetime: string;
126
125
  info: any;
127
126
  };
128
- fetchBorrowRates(params?: {}): Promise<any[]>;
129
127
  parseBorrowRates(info: any, codeKey: any): any[];
130
128
  customHandleMarginModeAndParams(methodName: any, params?: {}): any[];
131
129
  parseDepositWithdrawFee(fee: any, currency?: any): {
@@ -39,11 +39,11 @@ export default class cryptocom extends Exchange {
39
39
  'fetchAccounts': true,
40
40
  'fetchBalance': true,
41
41
  'fetchBidsAsks': false,
42
- 'fetchBorrowInterest': true,
42
+ 'fetchBorrowInterest': false,
43
43
  'fetchBorrowRate': false,
44
44
  'fetchBorrowRateHistories': false,
45
45
  'fetchBorrowRateHistory': false,
46
- 'fetchBorrowRates': true,
46
+ 'fetchBorrowRates': false,
47
47
  'fetchClosedOrders': 'emulated',
48
48
  'fetchCurrencies': false,
49
49
  'fetchDepositAddress': true,
@@ -337,6 +337,7 @@ export default class cryptocom extends Exchange {
337
337
  'precisionMode': TICK_SIZE,
338
338
  'exceptions': {
339
339
  'exact': {
340
+ '219': InvalidOrder,
340
341
  '10001': ExchangeError,
341
342
  '10002': PermissionDenied,
342
343
  '10003': PermissionDenied,
@@ -566,6 +567,7 @@ export default class cryptocom extends Exchange {
566
567
  'max': undefined,
567
568
  },
568
569
  },
570
+ 'created': undefined,
569
571
  'info': market,
570
572
  });
571
573
  }
@@ -1058,7 +1060,7 @@ export default class cryptocom extends Exchange {
1058
1060
  }
1059
1061
  const postOnly = this.safeValue(params, 'postOnly', false);
1060
1062
  if ((postOnly) || (timeInForce === 'PO')) {
1061
- request['exec_inst'] = 'POST_ONLY';
1063
+ request['exec_inst'] = ['POST_ONLY'];
1062
1064
  request['time_in_force'] = 'GOOD_TILL_CANCEL';
1063
1065
  }
1064
1066
  const triggerPrice = this.safeStringN(params, ['stopPrice', 'triggerPrice', 'ref_price']);
@@ -1866,8 +1868,8 @@ export default class cryptocom extends Exchange {
1866
1868
  'close': last,
1867
1869
  'last': last,
1868
1870
  'previousClose': undefined,
1869
- 'change': this.safeString(ticker, 'c'),
1870
- 'percentage': undefined,
1871
+ 'change': undefined,
1872
+ 'percentage': this.safeString(ticker, 'c'),
1871
1873
  'average': undefined,
1872
1874
  'baseVolume': this.safeString(ticker, 'v'),
1873
1875
  'quoteVolume': this.safeString(ticker, 'vv'),
@@ -2011,10 +2013,16 @@ export default class cryptocom extends Exchange {
2011
2013
  const created = this.safeInteger(order, 'create_time');
2012
2014
  const marketId = this.safeString(order, 'instrument_name');
2013
2015
  const symbol = this.safeSymbol(marketId, market);
2014
- const execInst = this.safeString(order, 'exec_inst');
2015
- let postOnly = undefined;
2016
+ const execInst = this.safeValue(order, 'exec_inst');
2017
+ let postOnly = false;
2016
2018
  if (execInst !== undefined) {
2017
- postOnly = (execInst === 'POST_ONLY');
2019
+ for (let i = 0; i < execInst.length; i++) {
2020
+ const inst = execInst[i];
2021
+ if (inst === 'POST_ONLY') {
2022
+ postOnly = true;
2023
+ break;
2024
+ }
2025
+ }
2018
2026
  }
2019
2027
  const feeCurrency = this.safeString(order, 'fee_instrument_name');
2020
2028
  return this.safeOrder({
@@ -2247,52 +2255,6 @@ export default class cryptocom extends Exchange {
2247
2255
  'info': info,
2248
2256
  };
2249
2257
  }
2250
- async fetchBorrowInterest(code = undefined, symbol = undefined, since = undefined, limit = undefined, params = {}) {
2251
- await this.loadMarkets();
2252
- const request = {};
2253
- let market = undefined;
2254
- let currency = undefined;
2255
- if (symbol !== undefined) {
2256
- market = this.market(symbol);
2257
- }
2258
- if (code !== undefined) {
2259
- currency = this.currency(code);
2260
- request['currency'] = currency['id'];
2261
- }
2262
- if (since !== undefined) {
2263
- request['start_ts'] = since;
2264
- }
2265
- if (limit !== undefined) {
2266
- request['page_size'] = limit;
2267
- }
2268
- const response = await this.v2PrivatePostPrivateMarginGetInterestHistory(this.extend(request, params));
2269
- //
2270
- // {
2271
- // "id": 1656705829020,
2272
- // "method": "private/margin/get-interest-history",
2273
- // "code": 0,
2274
- // "result": {
2275
- // "list": [
2276
- // {
2277
- // "loan_id": "2643528867803765921",
2278
- // "currency": "USDT",
2279
- // "interest": 0.00000004,
2280
- // "time": 1656702899559,
2281
- // "stake_amount": 6,
2282
- // "interest_rate": 0.000025
2283
- // },
2284
- // ]
2285
- // }
2286
- // }
2287
- //
2288
- const data = this.safeValue(response, 'result', {});
2289
- const rows = this.safeValue(data, 'list', []);
2290
- let interest = undefined;
2291
- for (let i = 0; i < rows.length; i++) {
2292
- interest = this.parseBorrowInterests(rows, market);
2293
- }
2294
- return this.filterByCurrencySinceLimit(interest, code, since, limit);
2295
- }
2296
2258
  parseBorrowInterest(info, market = undefined) {
2297
2259
  //
2298
2260
  // {
@@ -2321,38 +2283,6 @@ export default class cryptocom extends Exchange {
2321
2283
  'info': info,
2322
2284
  };
2323
2285
  }
2324
- async fetchBorrowRates(params = {}) {
2325
- /**
2326
- * @method
2327
- * @name cryptocom#fetchBorrowRates
2328
- * @description fetch the borrow interest rates of all currencies
2329
- * @param {object} [params] extra parameters specific to the cryptocom api endpoint
2330
- * @returns {object} a list of [borrow rate structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure}
2331
- */
2332
- await this.loadMarkets();
2333
- const response = await this.v2PrivatePostPrivateMarginGetUserConfig(params);
2334
- //
2335
- // {
2336
- // "id": 1656707947456,
2337
- // "method": "private/margin/get-user-config",
2338
- // "code": 0,
2339
- // "result": {
2340
- // "stake_amount": 6,
2341
- // "currency_configs": [
2342
- // {
2343
- // "currency": "AGLD",
2344
- // "hourly_rate": 0.00003334,
2345
- // "max_borrow_limit": 342.4032393,
2346
- // "min_borrow_limit": 30
2347
- // },
2348
- // ]
2349
- // }
2350
- // }
2351
- //
2352
- const data = this.safeValue(response, 'result', {});
2353
- const rates = this.safeValue(data, 'currency_configs', []);
2354
- return this.parseBorrowRates(rates, 'currency');
2355
- }
2356
2286
  parseBorrowRates(info, codeKey) {
2357
2287
  //
2358
2288
  // {
@@ -3025,7 +2955,15 @@ export default class cryptocom extends Exchange {
3025
2955
  const paramsKeys = Object.keys(keysorted);
3026
2956
  let strSortKey = '';
3027
2957
  for (let i = 0; i < paramsKeys.length; i++) {
3028
- strSortKey = strSortKey + paramsKeys[i].toString() + requestParams[paramsKeys[i]].toString();
2958
+ const key = paramsKeys[i].toString();
2959
+ let value = requestParams[paramsKeys[i]];
2960
+ if (Array.isArray(value)) {
2961
+ value = value.join(',');
2962
+ }
2963
+ else {
2964
+ value = value.toString();
2965
+ }
2966
+ strSortKey = strSortKey + key + value;
3029
2967
  }
3030
2968
  const payload = path + nonce + this.apiKey + strSortKey + nonce;
3031
2969
  const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha256);
@@ -570,6 +570,7 @@ export default class currencycom extends Exchange {
570
570
  'max': undefined,
571
571
  },
572
572
  },
573
+ 'created': undefined,
573
574
  'info': market,
574
575
  });
575
576
  }
package/js/src/delta.js CHANGED
@@ -822,6 +822,7 @@ export default class delta extends Exchange {
822
822
  'max': undefined,
823
823
  },
824
824
  },
825
+ 'created': this.parse8601(this.safeString(market, 'launch_time')),
825
826
  'info': market,
826
827
  });
827
828
  }
package/js/src/deribit.js CHANGED
@@ -814,6 +814,7 @@ export default class deribit extends Exchange {
814
814
  'max': undefined,
815
815
  },
816
816
  },
817
+ 'created': this.safeInteger(market, 'creation_timestamp'),
817
818
  'info': market,
818
819
  });
819
820
  }
@@ -656,6 +656,7 @@ export default class digifinex extends Exchange {
656
656
  'max': undefined,
657
657
  },
658
658
  },
659
+ 'created': undefined,
659
660
  'info': market,
660
661
  });
661
662
  }
package/js/src/exmo.js CHANGED
@@ -829,6 +829,7 @@ export default class exmo extends Exchange {
829
829
  'max': this.safeNumber(market, 'max_amount'),
830
830
  },
831
831
  },
832
+ 'created': undefined,
832
833
  'info': market,
833
834
  });
834
835
  }
package/js/src/gate.d.ts CHANGED
@@ -105,6 +105,7 @@ export default class gate extends Exchange {
105
105
  max: any;
106
106
  };
107
107
  };
108
+ created: any;
108
109
  info: any;
109
110
  };
110
111
  fetchOptionMarkets(params?: {}): Promise<any[]>;
package/js/src/gate.js CHANGED
@@ -1098,6 +1098,7 @@ export default class gate extends Exchange {
1098
1098
  'max': margin ? this.safeNumber(market, 'max_quote_amount') : undefined,
1099
1099
  },
1100
1100
  },
1101
+ 'created': undefined,
1101
1102
  'info': market,
1102
1103
  });
1103
1104
  }
@@ -1295,6 +1296,7 @@ export default class gate extends Exchange {
1295
1296
  'max': undefined,
1296
1297
  },
1297
1298
  },
1299
+ 'created': undefined,
1298
1300
  'info': market,
1299
1301
  };
1300
1302
  }
@@ -1415,6 +1417,7 @@ export default class gate extends Exchange {
1415
1417
  'max': undefined,
1416
1418
  },
1417
1419
  },
1420
+ 'created': this.safeIntegerProduct(market, 'create_time', 1000),
1418
1421
  'info': market,
1419
1422
  });
1420
1423
  }
@@ -59,6 +59,7 @@ export default class gemini extends Exchange {
59
59
  max: any;
60
60
  };
61
61
  };
62
+ created: any;
62
63
  info: any;
63
64
  };
64
65
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<import("./base/types.js").OrderBook>;
package/js/src/gemini.js CHANGED
@@ -645,6 +645,7 @@ export default class gemini extends Exchange {
645
645
  'max': undefined,
646
646
  },
647
647
  },
648
+ 'created': undefined,
648
649
  'info': response,
649
650
  };
650
651
  }
package/js/src/hitbtc.js CHANGED
@@ -737,6 +737,7 @@ export default class hitbtc extends Exchange {
737
737
  'max': undefined,
738
738
  },
739
739
  },
740
+ 'created': undefined,
740
741
  'info': market,
741
742
  });
742
743
  }
package/js/src/hollaex.js CHANGED
@@ -315,6 +315,7 @@ export default class hollaex extends Exchange {
315
315
  'max': undefined,
316
316
  },
317
317
  },
318
+ 'created': this.parse8601(this.safeString(market, 'created_at')),
318
319
  'info': market,
319
320
  });
320
321
  }