ccxt 4.4.50 → 4.4.57

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 (277) hide show
  1. package/README.md +227 -142
  2. package/dist/ccxt.browser.min.js +8 -8
  3. package/dist/cjs/ccxt.js +1 -4
  4. package/dist/cjs/src/ace.js +3 -0
  5. package/dist/cjs/src/alpaca.js +6 -1
  6. package/dist/cjs/src/ascendex.js +2 -1
  7. package/dist/cjs/src/base/Exchange.js +151 -59
  8. package/dist/cjs/src/bigone.js +5 -0
  9. package/dist/cjs/src/binance.js +87 -68
  10. package/dist/cjs/src/bingx.js +27 -30
  11. package/dist/cjs/src/bit2c.js +3 -0
  12. package/dist/cjs/src/bitbank.js +3 -0
  13. package/dist/cjs/src/bitbns.js +3 -0
  14. package/dist/cjs/src/bitfinex.js +7 -2
  15. package/dist/cjs/src/bitflyer.js +5 -0
  16. package/dist/cjs/src/bitget.js +9 -5
  17. package/dist/cjs/src/bithumb.js +2 -0
  18. package/dist/cjs/src/bitmart.js +20 -8
  19. package/dist/cjs/src/bitmex.js +99 -93
  20. package/dist/cjs/src/bitopro.js +5 -0
  21. package/dist/cjs/src/bitrue.js +4 -0
  22. package/dist/cjs/src/bitso.js +3 -0
  23. package/dist/cjs/src/bitstamp.js +3 -0
  24. package/dist/cjs/src/bitteam.js +5 -0
  25. package/dist/cjs/src/bitvavo.js +4 -0
  26. package/dist/cjs/src/blockchaincom.js +5 -1
  27. package/dist/cjs/src/blofin.js +7 -0
  28. package/dist/cjs/src/btcalpha.js +5 -0
  29. package/dist/cjs/src/btcbox.js +3 -3
  30. package/dist/cjs/src/btcmarkets.js +5 -0
  31. package/dist/cjs/src/btcturk.js +3 -0
  32. package/dist/cjs/src/bybit.js +12 -2
  33. package/dist/cjs/src/cex.js +2 -0
  34. package/dist/cjs/src/coinbase.js +16 -8
  35. package/dist/cjs/src/coinbaseexchange.js +5 -0
  36. package/dist/cjs/src/coinbaseinternational.js +7 -3
  37. package/dist/cjs/src/coincatch.js +4 -1
  38. package/dist/cjs/src/coincheck.js +2 -0
  39. package/dist/cjs/src/coinex.js +6 -2
  40. package/dist/cjs/src/coinlist.js +5 -0
  41. package/dist/cjs/src/coinmate.js +5 -1
  42. package/dist/cjs/src/coinmetro.js +29 -8
  43. package/dist/cjs/src/coinone.js +4 -1
  44. package/dist/cjs/src/coinsph.js +5 -1
  45. package/dist/cjs/src/coinspot.js +2 -1
  46. package/dist/cjs/src/cryptocom.js +5 -0
  47. package/dist/cjs/src/currencycom.js +4 -1
  48. package/dist/cjs/src/defx.js +5 -0
  49. package/dist/cjs/src/delta.js +3 -0
  50. package/dist/cjs/src/deribit.js +37 -36
  51. package/dist/cjs/src/digifinex.js +10 -5
  52. package/dist/cjs/src/ellipx.js +9 -5
  53. package/dist/cjs/src/exmo.js +5 -2
  54. package/dist/cjs/src/gate.js +5 -1
  55. package/dist/cjs/src/gemini.js +3 -0
  56. package/dist/cjs/src/hashkey.js +5 -4
  57. package/dist/cjs/src/hitbtc.js +4 -0
  58. package/dist/cjs/src/hollaex.js +8 -2
  59. package/dist/cjs/src/htx.js +15 -5
  60. package/dist/cjs/src/huobijp.js +5 -0
  61. package/dist/cjs/src/hyperliquid.js +9 -4
  62. package/dist/cjs/src/idex.js +6 -2
  63. package/dist/cjs/src/independentreserve.js +4 -0
  64. package/dist/cjs/src/indodax.js +3 -0
  65. package/dist/cjs/src/kraken.js +7 -5
  66. package/dist/cjs/src/krakenfutures.js +5 -2
  67. package/dist/cjs/src/kucoin.js +18 -10
  68. package/dist/cjs/src/kucoinfutures.js +5 -1
  69. package/dist/cjs/src/kuna.js +3 -0
  70. package/dist/cjs/src/latoken.js +4 -0
  71. package/dist/cjs/src/lbank.js +6 -1
  72. package/dist/cjs/src/luno.js +7 -2
  73. package/dist/cjs/src/mercado.js +5 -1
  74. package/dist/cjs/src/mexc.js +36 -15
  75. package/dist/cjs/src/ndax.js +7 -2
  76. package/dist/cjs/src/novadax.js +6 -1
  77. package/dist/cjs/src/oceanex.js +4 -0
  78. package/dist/cjs/src/okcoin.js +6 -2
  79. package/dist/cjs/src/okx.js +18 -4
  80. package/dist/cjs/src/onetrading.js +6 -2
  81. package/dist/cjs/src/oxfun.js +3 -0
  82. package/dist/cjs/src/p2b.js +3 -0
  83. package/dist/cjs/src/paradex.js +10 -4
  84. package/dist/cjs/src/phemex.js +12 -5
  85. package/dist/cjs/src/poloniex.js +6 -3
  86. package/dist/cjs/src/poloniexfutures.js +5 -1
  87. package/dist/cjs/src/pro/binance.js +4 -2
  88. package/dist/cjs/src/pro/bitcoincom.js +1 -4
  89. package/dist/cjs/src/pro/bitget.js +3 -3
  90. package/dist/cjs/src/pro/bitopro.js +1 -1
  91. package/dist/cjs/src/pro/blofin.js +8 -0
  92. package/dist/cjs/src/pro/bybit.js +10 -2
  93. package/dist/cjs/src/pro/cex.js +1 -1
  94. package/dist/cjs/src/pro/coincatch.js +3 -3
  95. package/dist/cjs/src/pro/coinex.js +4 -1
  96. package/dist/cjs/src/pro/htx.js +8 -8
  97. package/dist/cjs/src/pro/mexc.js +3 -3
  98. package/dist/cjs/src/pro/okx.js +1 -1
  99. package/dist/cjs/src/probit.js +14 -9
  100. package/dist/cjs/src/timex.js +5 -1
  101. package/dist/cjs/src/tokocrypto.js +6 -1
  102. package/dist/cjs/src/tradeogre.js +2 -0
  103. package/dist/cjs/src/upbit.js +3 -0
  104. package/dist/cjs/src/vertex.js +71 -4
  105. package/dist/cjs/src/wavesexchange.js +96 -3
  106. package/dist/cjs/src/wazirx.js +61 -3
  107. package/dist/cjs/src/whitebit.js +74 -4
  108. package/dist/cjs/src/woo.js +15 -5
  109. package/dist/cjs/src/woofipro.js +25 -9
  110. package/dist/cjs/src/xt.js +117 -0
  111. package/dist/cjs/src/yobit.js +59 -0
  112. package/dist/cjs/src/zaif.js +57 -0
  113. package/dist/cjs/src/zonda.js +58 -0
  114. package/js/ccxt.d.ts +3 -6
  115. package/js/ccxt.js +2 -4
  116. package/js/src/abstract/binance.d.ts +0 -1
  117. package/js/src/abstract/binancecoinm.d.ts +0 -1
  118. package/js/src/abstract/binanceus.d.ts +0 -1
  119. package/js/src/abstract/binanceusdm.d.ts +0 -1
  120. package/js/src/ace.js +3 -0
  121. package/js/src/alpaca.js +6 -1
  122. package/js/src/ascendex.js +2 -1
  123. package/js/src/base/Exchange.d.ts +9 -3
  124. package/js/src/base/Exchange.js +151 -59
  125. package/js/src/base/types.d.ts +2 -0
  126. package/js/src/bigone.d.ts +1 -1
  127. package/js/src/bigone.js +5 -0
  128. package/js/src/binance.d.ts +33 -33
  129. package/js/src/binance.js +87 -68
  130. package/js/src/bingx.d.ts +1 -1
  131. package/js/src/bingx.js +27 -30
  132. package/js/src/bit2c.js +3 -0
  133. package/js/src/bitbank.js +3 -0
  134. package/js/src/bitbns.js +3 -0
  135. package/js/src/bitfinex.js +7 -2
  136. package/js/src/bitflyer.js +5 -0
  137. package/js/src/bitget.js +9 -5
  138. package/js/src/bithumb.js +2 -0
  139. package/js/src/bitmart.d.ts +5 -5
  140. package/js/src/bitmart.js +20 -8
  141. package/js/src/bitmex.js +99 -93
  142. package/js/src/bitopro.d.ts +2 -2
  143. package/js/src/bitopro.js +5 -0
  144. package/js/src/bitrue.js +4 -0
  145. package/js/src/bitso.d.ts +2 -2
  146. package/js/src/bitso.js +3 -0
  147. package/js/src/bitstamp.js +3 -0
  148. package/js/src/bitteam.js +5 -0
  149. package/js/src/bitvavo.js +4 -0
  150. package/js/src/blockchaincom.js +5 -1
  151. package/js/src/blofin.js +7 -0
  152. package/js/src/btcalpha.js +5 -0
  153. package/js/src/btcbox.js +3 -3
  154. package/js/src/btcmarkets.js +5 -0
  155. package/js/src/btcturk.js +3 -0
  156. package/js/src/bybit.d.ts +3 -3
  157. package/js/src/bybit.js +12 -2
  158. package/js/src/cex.js +2 -0
  159. package/js/src/coinbase.d.ts +4 -4
  160. package/js/src/coinbase.js +16 -8
  161. package/js/src/coinbaseexchange.js +5 -0
  162. package/js/src/coinbaseinternational.d.ts +1 -1
  163. package/js/src/coinbaseinternational.js +7 -3
  164. package/js/src/coincatch.js +4 -1
  165. package/js/src/coincheck.js +2 -0
  166. package/js/src/coinex.d.ts +1 -1
  167. package/js/src/coinex.js +6 -2
  168. package/js/src/coinlist.js +5 -0
  169. package/js/src/coinmate.js +5 -1
  170. package/js/src/coinmetro.js +29 -8
  171. package/js/src/coinone.js +4 -1
  172. package/js/src/coinsph.js +5 -1
  173. package/js/src/coinspot.js +2 -1
  174. package/js/src/cryptocom.js +5 -0
  175. package/js/src/currencycom.js +4 -1
  176. package/js/src/defx.js +5 -0
  177. package/js/src/delta.js +3 -0
  178. package/js/src/deribit.d.ts +5 -3
  179. package/js/src/deribit.js +37 -36
  180. package/js/src/digifinex.js +10 -5
  181. package/js/src/ellipx.d.ts +1 -1
  182. package/js/src/ellipx.js +9 -5
  183. package/js/src/exmo.d.ts +3 -3
  184. package/js/src/exmo.js +5 -2
  185. package/js/src/gate.js +5 -1
  186. package/js/src/gemini.js +3 -0
  187. package/js/src/hashkey.js +5 -4
  188. package/js/src/hitbtc.d.ts +2 -2
  189. package/js/src/hitbtc.js +4 -0
  190. package/js/src/hollaex.d.ts +2 -2
  191. package/js/src/hollaex.js +8 -2
  192. package/js/src/htx.d.ts +1 -1
  193. package/js/src/htx.js +15 -5
  194. package/js/src/huobijp.js +5 -0
  195. package/js/src/hyperliquid.d.ts +1 -1
  196. package/js/src/hyperliquid.js +9 -4
  197. package/js/src/idex.d.ts +1 -1
  198. package/js/src/idex.js +6 -2
  199. package/js/src/independentreserve.js +4 -0
  200. package/js/src/indodax.js +3 -0
  201. package/js/src/kraken.js +7 -5
  202. package/js/src/krakenfutures.js +5 -2
  203. package/js/src/kucoin.d.ts +2 -1
  204. package/js/src/kucoin.js +18 -10
  205. package/js/src/kucoinfutures.d.ts +1 -1
  206. package/js/src/kucoinfutures.js +5 -1
  207. package/js/src/kuna.js +3 -0
  208. package/js/src/latoken.js +4 -0
  209. package/js/src/lbank.js +6 -1
  210. package/js/src/luno.d.ts +1 -1
  211. package/js/src/luno.js +7 -2
  212. package/js/src/mercado.js +5 -1
  213. package/js/src/mexc.d.ts +1 -1
  214. package/js/src/mexc.js +36 -15
  215. package/js/src/ndax.js +7 -2
  216. package/js/src/novadax.js +6 -1
  217. package/js/src/oceanex.d.ts +2 -2
  218. package/js/src/oceanex.js +4 -0
  219. package/js/src/okcoin.js +6 -2
  220. package/js/src/okx.js +18 -4
  221. package/js/src/onetrading.d.ts +1 -1
  222. package/js/src/onetrading.js +6 -2
  223. package/js/src/oxfun.js +3 -0
  224. package/js/src/p2b.js +3 -0
  225. package/js/src/paradex.js +10 -4
  226. package/js/src/phemex.d.ts +1 -1
  227. package/js/src/phemex.js +12 -5
  228. package/js/src/poloniex.js +6 -3
  229. package/js/src/poloniexfutures.d.ts +1 -1
  230. package/js/src/poloniexfutures.js +5 -1
  231. package/js/src/pro/binance.js +4 -2
  232. package/js/src/pro/bitcoincom.js +1 -4
  233. package/js/src/pro/bitget.js +3 -3
  234. package/js/src/pro/bitopro.js +1 -1
  235. package/js/src/pro/blofin.js +8 -0
  236. package/js/src/pro/bybit.js +10 -2
  237. package/js/src/pro/cex.js +1 -1
  238. package/js/src/pro/coincatch.js +3 -3
  239. package/js/src/pro/coinex.js +4 -1
  240. package/js/src/pro/htx.d.ts +8 -8
  241. package/js/src/pro/htx.js +8 -8
  242. package/js/src/pro/mexc.js +3 -3
  243. package/js/src/pro/okx.js +1 -1
  244. package/js/src/probit.d.ts +1 -0
  245. package/js/src/probit.js +14 -9
  246. package/js/src/static_dependencies/node-fetch/headers.d.ts +5 -0
  247. package/js/src/static_dependencies/proxies/agent-base/helpers.d.ts +1 -0
  248. package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +1 -0
  249. package/js/src/timex.js +5 -1
  250. package/js/src/tokocrypto.js +6 -1
  251. package/js/src/tradeogre.js +2 -0
  252. package/js/src/upbit.d.ts +2 -2
  253. package/js/src/upbit.js +3 -0
  254. package/js/src/vertex.js +71 -4
  255. package/js/src/wavesexchange.d.ts +2 -1
  256. package/js/src/wavesexchange.js +96 -3
  257. package/js/src/wazirx.js +61 -3
  258. package/js/src/whitebit.js +74 -4
  259. package/js/src/woo.d.ts +1 -1
  260. package/js/src/woo.js +15 -5
  261. package/js/src/woofipro.d.ts +1 -1
  262. package/js/src/woofipro.js +25 -9
  263. package/js/src/xt.js +117 -0
  264. package/js/src/yobit.d.ts +2 -2
  265. package/js/src/yobit.js +59 -0
  266. package/js/src/zaif.js +57 -0
  267. package/js/src/zonda.d.ts +1 -0
  268. package/js/src/zonda.js +58 -0
  269. package/package.json +25 -7
  270. package/dist/cjs/src/abstract/lykke.js +0 -9
  271. package/dist/cjs/src/lykke.js +0 -1401
  272. package/js/src/abstract/lykke.d.ts +0 -32
  273. package/js/src/abstract/lykke.js +0 -11
  274. package/js/src/hitbtc3.d.ts +0 -8
  275. package/js/src/hitbtc3.js +0 -20
  276. package/js/src/lykke.d.ts +0 -212
  277. package/js/src/lykke.js +0 -1402
@@ -314,17 +314,20 @@ class deribit extends deribit$1 {
314
314
  'limit': 100,
315
315
  'daysBack': 100000,
316
316
  'untilDays': 100000,
317
+ 'symbolRequired': true, // todo
317
318
  },
318
319
  'fetchOrder': {
319
320
  'marginMode': false,
320
321
  'trigger': false,
321
322
  'trailing': false,
323
+ 'symbolRequired': true, // todo
322
324
  },
323
325
  'fetchOpenOrders': {
324
326
  'marginMode': false,
325
327
  'limit': undefined,
326
328
  'trigger': false,
327
329
  'trailing': false,
330
+ 'symbolRequired': true, // todo
328
331
  },
329
332
  'fetchOrders': undefined,
330
333
  'fetchClosedOrders': {
@@ -335,6 +338,7 @@ class deribit extends deribit$1 {
335
338
  'untilDays': 100000,
336
339
  'trigger': false,
337
340
  'trailing': false,
341
+ 'symbolRequired': true, // todo
338
342
  },
339
343
  'fetchOHLCV': {
340
344
  'limit': 1000, // todo: recheck
@@ -481,9 +485,6 @@ class deribit extends deribit$1 {
481
485
  'fetchBalance': {
482
486
  'code': 'BTC',
483
487
  },
484
- 'fetchPositions': {
485
- 'code': 'BTC',
486
- },
487
488
  'transfer': {
488
489
  'method': 'privateGetSubmitTransferToSubaccount', // or 'privateGetSubmitTransferToUser'
489
490
  },
@@ -755,7 +756,7 @@ class deribit extends deribit$1 {
755
756
  const result = this.safeValue(response, 'result', []);
756
757
  return this.parseAccounts(result);
757
758
  }
758
- parseAccount(account, currency = undefined) {
759
+ parseAccount(account) {
759
760
  //
760
761
  // {
761
762
  // "username": "someusername_1",
@@ -774,7 +775,7 @@ class deribit extends deribit$1 {
774
775
  'info': account,
775
776
  'id': this.safeString(account, 'id'),
776
777
  'type': this.safeString(account, 'type'),
777
- 'code': this.safeCurrencyCode(undefined, currency),
778
+ 'code': undefined,
778
779
  };
779
780
  }
780
781
  /**
@@ -2744,38 +2745,19 @@ class deribit extends deribit$1 {
2744
2745
  * @see https://docs.deribit.com/#private-get_positions
2745
2746
  * @param {string[]|undefined} symbols list of unified market symbols
2746
2747
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2748
+ * @param {string} [params.currency] currency code filter for positions
2747
2749
  * @param {string} [params.kind] market type filter for positions 'future', 'option', 'spot', 'future_combo' or 'option_combo'
2750
+ * @param {int} [params.subaccount_id] the user id for the subaccount
2748
2751
  * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
2749
2752
  */
2750
2753
  async fetchPositions(symbols = undefined, params = {}) {
2751
2754
  await this.loadMarkets();
2752
- let kind = this.safeString(params, 'kind');
2753
- let code = undefined;
2754
- if (symbols === undefined) {
2755
- code = this.codeFromOptions('fetchPositions', params);
2756
- }
2757
- else if (typeof symbols === 'string') {
2758
- code = symbols;
2759
- symbols = undefined; // fix https://github.com/ccxt/ccxt/issues/13961
2760
- }
2761
- else {
2762
- if (Array.isArray(symbols)) {
2763
- const length = symbols.length;
2764
- if (length !== 1) {
2765
- throw new errors.BadRequest(this.id + ' fetchPositions() symbols argument cannot contain more than 1 symbol');
2766
- }
2767
- const market = this.market(symbols[0]);
2768
- const settle = market['settle'];
2769
- code = (settle !== undefined) ? settle : market['base'];
2770
- kind = market['info']['kind'];
2771
- }
2772
- }
2773
- const currency = this.currency(code);
2774
- const request = {
2775
- 'currency': currency['id'],
2776
- };
2777
- if (kind !== undefined) {
2778
- request['kind'] = kind;
2755
+ const code = this.safeString(params, 'currency');
2756
+ const request = {};
2757
+ if (code !== undefined) {
2758
+ params = this.omit(params, 'currency');
2759
+ const currency = this.currency(code);
2760
+ request['currency'] = currency['id'];
2779
2761
  }
2780
2762
  const response = await this.privateGetGetPositions(this.extend(request, params));
2781
2763
  //
@@ -3161,7 +3143,7 @@ class deribit extends deribit$1 {
3161
3143
  * @param {int} [since] the earliest time in ms to fetch funding rate history for
3162
3144
  * @param {int} [limit] the maximum number of entries to retrieve
3163
3145
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3164
- * @param {int} [params.end_timestamp] fetch funding rate ending at this timestamp
3146
+ * @param {int} [params.until] fetch funding rate ending at this timestamp
3165
3147
  * @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)
3166
3148
  * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
3167
3149
  */
@@ -3170,19 +3152,38 @@ class deribit extends deribit$1 {
3170
3152
  const market = this.market(symbol);
3171
3153
  let paginate = false;
3172
3154
  [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
3155
+ const maxEntriesPerRequest = 744; // seems exchange returns max 744 items per request
3156
+ const eachItemDuration = '1h';
3173
3157
  if (paginate) {
3174
- return await this.fetchPaginatedCallDeterministic('fetchFundingRateHistory', symbol, since, limit, '8h', params, 720);
3158
+ // fix for: https://github.com/ccxt/ccxt/issues/25040
3159
+ return await this.fetchPaginatedCallDeterministic('fetchFundingRateHistory', symbol, since, limit, eachItemDuration, this.extend(params, { 'isDeribitPaginationCall': true }), maxEntriesPerRequest);
3175
3160
  }
3176
- const time = this.milliseconds();
3161
+ const duration = this.parseTimeframe(eachItemDuration) * 1000;
3162
+ let time = this.milliseconds();
3177
3163
  const month = 30 * 24 * 60 * 60 * 1000;
3178
3164
  if (since === undefined) {
3179
3165
  since = time - month;
3180
3166
  }
3167
+ else {
3168
+ time = since + month;
3169
+ }
3181
3170
  const request = {
3182
3171
  'instrument_name': market['id'],
3183
3172
  'start_timestamp': since - 1,
3184
- 'end_timestamp': time,
3185
3173
  };
3174
+ const until = this.safeInteger2(params, 'until', 'end_timestamp');
3175
+ if (until !== undefined) {
3176
+ params = this.omit(params, ['until']);
3177
+ request['end_timestamp'] = until;
3178
+ }
3179
+ else {
3180
+ request['end_timestamp'] = time;
3181
+ }
3182
+ if ('isDeribitPaginationCall' in params) {
3183
+ params = this.omit(params, 'isDeribitPaginationCall');
3184
+ const maxUntil = this.sum(since, limit * duration);
3185
+ request['end_timestamp'] = Math.min(request['end_timestamp'], maxUntil);
3186
+ }
3186
3187
  const response = await this.publicGetGetFundingRateHistory(this.extend(request, params));
3187
3188
  //
3188
3189
  // {
@@ -261,25 +261,27 @@ class digifinex extends digifinex$1 {
261
261
  },
262
262
  'createOrders': {
263
263
  'max': 10,
264
- 'marginMode': true,
265
264
  },
266
265
  'fetchMyTrades': {
267
266
  'marginMode': true,
268
267
  'limit': 500,
269
268
  'daysBack': 100000,
270
269
  'untilDays': 30,
270
+ 'symbolRequired': false,
271
271
  },
272
272
  'fetchOrder': {
273
273
  'marginMode': true,
274
274
  'trigger': false,
275
275
  'trailing': false,
276
276
  'marketType': true,
277
+ 'symbolRequired': true,
277
278
  },
278
279
  'fetchOpenOrders': {
279
280
  'marginMode': true,
280
281
  'limit': undefined,
281
282
  'trigger': false,
282
283
  'trailing': false,
284
+ 'symbolRequired': false,
283
285
  },
284
286
  'fetchOrders': {
285
287
  'marginMode': true,
@@ -288,6 +290,7 @@ class digifinex extends digifinex$1 {
288
290
  'untilDays': 30,
289
291
  'trigger': false,
290
292
  'trailing': false,
293
+ 'symbolRequired': false,
291
294
  },
292
295
  'fetchClosedOrders': undefined,
293
296
  'fetchOHLCV': {
@@ -549,11 +552,12 @@ class digifinex extends digifinex$1 {
549
552
  },
550
553
  };
551
554
  if (code in result) {
552
- if (Array.isArray(result[code]['info'])) {
553
- result[code]['info'].push(currency);
555
+ let resultCodeInfo = result[code]['info'];
556
+ if (Array.isArray(resultCodeInfo)) {
557
+ resultCodeInfo.push(currency);
554
558
  }
555
559
  else {
556
- result[code]['info'] = [result[code]['info'], currency];
560
+ resultCodeInfo = [resultCodeInfo, currency];
557
561
  }
558
562
  if (withdraw) {
559
563
  result[code]['withdraw'] = true;
@@ -4225,7 +4229,8 @@ class digifinex extends digifinex$1 {
4225
4229
  depositWithdrawFees[code] = this.depositWithdrawFee({});
4226
4230
  depositWithdrawFees[code]['info'] = [];
4227
4231
  }
4228
- depositWithdrawFees[code]['info'].push(entry);
4232
+ const depositWithdrawInfo = depositWithdrawFees[code]['info'];
4233
+ depositWithdrawInfo.push(entry);
4229
4234
  const networkId = this.safeString(entry, 'chain');
4230
4235
  const withdrawFee = this.safeValue(entry, 'min_withdraw_fee');
4231
4236
  const withdrawResult = {
@@ -261,12 +261,14 @@ class ellipx extends ellipx$1 {
261
261
  'marginMode': false,
262
262
  'trigger': false,
263
263
  'trailing': false,
264
+ 'symbolRequired': false,
264
265
  },
265
266
  'fetchOpenOrders': {
266
267
  'marginMode': false,
267
268
  'limit': undefined,
268
269
  'trigger': false,
269
270
  'trailing': false,
271
+ 'symbolRequired': true,
270
272
  },
271
273
  'fetchOrders': {
272
274
  'marginMode': false,
@@ -275,6 +277,7 @@ class ellipx extends ellipx$1 {
275
277
  'untilDays': undefined,
276
278
  'trigger': false,
277
279
  'trailing': false,
280
+ 'symbolRequired': true,
278
281
  },
279
282
  'fetchClosedOrders': undefined,
280
283
  'fetchOHLCV': {
@@ -1674,7 +1677,7 @@ class ellipx extends ellipx$1 {
1674
1677
  * 'tierBased': false, // indicates fees do not vary by volume tiers
1675
1678
  * }
1676
1679
  */
1677
- async fetchTradingFee(symbol = undefined, params = {}) {
1680
+ async fetchTradingFee(symbol, params = {}) {
1678
1681
  await this.loadMarkets();
1679
1682
  const response = await this.privateGetMarketTradeFeeQuery(params);
1680
1683
  //
@@ -1894,10 +1897,11 @@ class ellipx extends ellipx$1 {
1894
1897
  if (v === undefined || e === undefined) {
1895
1898
  return undefined;
1896
1899
  }
1897
- const preciseAmount = new Precise["default"](v);
1898
- preciseAmount.decimals = e;
1899
- preciseAmount.reduce();
1900
- return preciseAmount.toString();
1900
+ const precise = new Precise["default"](v);
1901
+ precise.decimals = e;
1902
+ precise.reduce();
1903
+ const amountString = precise.toString();
1904
+ return amountString;
1901
1905
  }
1902
1906
  toAmount(amount, precision) {
1903
1907
  const v = amount.toString();
@@ -239,17 +239,20 @@ class exmo extends exmo$1 {
239
239
  'limit': 100,
240
240
  'daysBack': undefined,
241
241
  'untilDays': undefined,
242
+ 'symbolRequired': true,
242
243
  },
243
244
  'fetchOrder': {
244
245
  'marginMode': false,
245
246
  'trigger': false,
246
247
  'trailing': false,
248
+ 'symbolRequired': false,
247
249
  },
248
250
  'fetchOpenOrders': {
249
251
  'marginMode': false,
250
252
  'limit': undefined,
251
253
  'trigger': false,
252
254
  'trailing': false,
255
+ 'symbolRequired': false,
253
256
  },
254
257
  'fetchOrders': undefined,
255
258
  'fetchClosedOrders': undefined,
@@ -1396,7 +1399,7 @@ class exmo extends exmo$1 {
1396
1399
  let marginMode = undefined;
1397
1400
  [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
1398
1401
  if (marginMode === 'cross') {
1399
- throw new errors.BadRequest(this.id + 'only isolated margin is supported');
1402
+ throw new errors.BadRequest(this.id + ' only isolated margin is supported');
1400
1403
  }
1401
1404
  await this.loadMarkets();
1402
1405
  const market = this.market(symbol);
@@ -2624,7 +2627,7 @@ class exmo extends exmo$1 {
2624
2627
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2625
2628
  * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2626
2629
  */
2627
- async fetchDeposit(id = undefined, code = undefined, params = {}) {
2630
+ async fetchDeposit(id, code = undefined, params = {}) {
2628
2631
  await this.loadMarkets();
2629
2632
  let currency = undefined;
2630
2633
  const request = {
@@ -739,17 +739,20 @@ class gate extends gate$1 {
739
739
  'limit': 1000,
740
740
  'daysBack': undefined,
741
741
  'untilDays': 30,
742
+ 'symbolRequired': false,
742
743
  },
743
744
  'fetchOrder': {
744
745
  'marginMode': false,
745
746
  'trigger': true,
746
747
  'trailing': false,
748
+ 'symbolRequired': true,
747
749
  },
748
750
  'fetchOpenOrders': {
749
751
  'marginMode': true,
750
752
  'trigger': true,
751
753
  'trailing': false,
752
754
  'limit': 100,
755
+ 'symbolRequired': false,
753
756
  },
754
757
  'fetchOrders': undefined,
755
758
  'fetchClosedOrders': {
@@ -760,6 +763,7 @@ class gate extends gate$1 {
760
763
  'untilDays': 30,
761
764
  'daysBack': undefined,
762
765
  'daysBackCanceled': undefined,
766
+ 'symbolRequired': false,
763
767
  },
764
768
  'fetchOHLCV': {
765
769
  'limit': 1000,
@@ -1821,7 +1825,7 @@ class gate extends gate$1 {
1821
1825
  const active = listed && tradeEnabled && withdrawEnabled && depositEnabled;
1822
1826
  if (this.safeValue(result, code) === undefined) {
1823
1827
  result[code] = {
1824
- 'id': code.toLowerCase(),
1828
+ 'id': currency,
1825
1829
  'code': code,
1826
1830
  'info': undefined,
1827
1831
  'name': undefined,
@@ -327,17 +327,20 @@ class gemini extends gemini$1 {
327
327
  'limit': 500,
328
328
  'daysBack': undefined,
329
329
  'untilDays': undefined,
330
+ 'symbolRequired': true,
330
331
  },
331
332
  'fetchOrder': {
332
333
  'marginMode': false,
333
334
  'trigger': false,
334
335
  'trailing': false,
336
+ 'symbolRequired': false,
335
337
  },
336
338
  'fetchOpenOrders': {
337
339
  'marginMode': false,
338
340
  'limit': undefined,
339
341
  'trigger': false,
340
342
  'trailing': false,
343
+ 'symbolRequired': false,
341
344
  },
342
345
  'fetchOrders': undefined,
343
346
  'fetchClosedOrders': undefined,
@@ -369,17 +369,20 @@ class hashkey extends hashkey$1 {
369
369
  'limit': 1000,
370
370
  'daysBack': 30,
371
371
  'untilDays': 30,
372
+ 'symbolRequired': false,
372
373
  },
373
374
  'fetchOrder': {
374
375
  'marginMode': false,
375
376
  'trigger': false,
376
377
  'trailing': false,
378
+ 'symbolRequired': false,
377
379
  },
378
380
  'fetchOpenOrders': {
379
381
  'marginMode': false,
380
382
  'limit': 1000,
381
383
  'trigger': false,
382
384
  'trailing': false,
385
+ 'symbolRequired': false,
383
386
  },
384
387
  'fetchOrders': undefined,
385
388
  'fetchClosedOrders': undefined,
@@ -2441,10 +2444,8 @@ class hashkey extends hashkey$1 {
2441
2444
  if (!market['spot']) {
2442
2445
  throw new errors.NotSupported(this.id + ' createMarketBuyOrderWithCost() is supported for spot markets only');
2443
2446
  }
2444
- const req = {
2445
- 'cost': cost,
2446
- };
2447
- return await this.createOrder(symbol, 'market', 'buy', cost, undefined, this.extend(req, params));
2447
+ params['cost'] = cost;
2448
+ return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
2448
2449
  }
2449
2450
  /**
2450
2451
  * @method
@@ -319,12 +319,14 @@ class hitbtc extends hitbtc$1 {
319
319
  'limit': 1000,
320
320
  'daysBack': 100000,
321
321
  'untilDays': 100000,
322
+ 'symbolRequired': false,
322
323
  'marketType': true,
323
324
  },
324
325
  'fetchOrder': {
325
326
  'marginMode': true,
326
327
  'trigger': false,
327
328
  'trailing': false,
329
+ 'symbolRequired': false,
328
330
  'marketType': true,
329
331
  },
330
332
  'fetchOpenOrders': {
@@ -332,6 +334,7 @@ class hitbtc extends hitbtc$1 {
332
334
  'limit': 1000,
333
335
  'trigger': false,
334
336
  'trailing': false,
337
+ 'symbolRequired': false,
335
338
  'marketType': true,
336
339
  },
337
340
  'fetchOrders': undefined,
@@ -343,6 +346,7 @@ class hitbtc extends hitbtc$1 {
343
346
  'untilDays': 100000,
344
347
  'trigger': false,
345
348
  'trailing': false,
349
+ 'symbolRequired': false,
346
350
  'marketType': true,
347
351
  },
348
352
  'fetchOHLCV': {
@@ -196,18 +196,21 @@ class hollaex extends hollaex$1 {
196
196
  'marginMode': false,
197
197
  'limit': 100,
198
198
  'daysBack': 100000,
199
- 'untilDays': 100000, // todo implement
199
+ 'untilDays': 100000,
200
+ 'symbolRequired': false,
200
201
  },
201
202
  'fetchOrder': {
202
203
  'marginMode': false,
203
204
  'trigger': false,
204
205
  'trailing': false,
206
+ 'symbolRequired': false,
205
207
  },
206
208
  'fetchOpenOrders': {
207
209
  'marginMode': false,
208
210
  'limit': 100,
209
211
  'trigger': false,
210
212
  'trailing': false,
213
+ 'symbolRequired': false,
211
214
  },
212
215
  'fetchOrders': {
213
216
  'marginMode': false,
@@ -216,6 +219,7 @@ class hollaex extends hollaex$1 {
216
219
  'untilDays': 100000,
217
220
  'trigger': false,
218
221
  'trailing': false,
222
+ 'symbolRequired': false,
219
223
  },
220
224
  'fetchClosedOrders': {
221
225
  'marginMode': false,
@@ -225,6 +229,7 @@ class hollaex extends hollaex$1 {
225
229
  'untilDays': 100000,
226
230
  'trigger': false,
227
231
  'trailing': false,
232
+ 'symbolRequired': false,
228
233
  },
229
234
  'fetchOHLCV': {
230
235
  'limit': 1000, // todo: no limit in request
@@ -1950,6 +1955,7 @@ class hollaex extends hollaex$1 {
1950
1955
  return { 'url': url, 'method': method, 'body': body, 'headers': headers };
1951
1956
  }
1952
1957
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
1958
+ // { "message": "Invalid token" }
1953
1959
  if (response === undefined) {
1954
1960
  return undefined;
1955
1961
  }
@@ -1957,7 +1963,7 @@ class hollaex extends hollaex$1 {
1957
1963
  //
1958
1964
  // { "message": "Invalid token" }
1959
1965
  //
1960
- // different errors return the same code eg:
1966
+ // different errors return the same code eg
1961
1967
  //
1962
1968
  // { "message":"Error 1001 - Order rejected. Order could not be submitted as this order was set to a post only order." }
1963
1969
  //
@@ -9,7 +9,7 @@ var sha256 = require('./static_dependencies/noble-hashes/sha256.js');
9
9
  // ----------------------------------------------------------------------------
10
10
  // ---------------------------------------------------------------------------
11
11
  /**
12
- * @class huobi
12
+ * @class htx
13
13
  * @augments Exchange
14
14
  */
15
15
  class htx extends htx$1 {
@@ -1268,17 +1268,20 @@ class htx extends htx$1 {
1268
1268
  'limit': 500,
1269
1269
  'daysBack': 120,
1270
1270
  'untilDays': 2,
1271
+ 'symbolRequired': false,
1271
1272
  },
1272
1273
  'fetchOrder': {
1273
1274
  'marginMode': false,
1274
1275
  'trigger': false,
1275
1276
  'trailing': false,
1277
+ 'symbolRequired': false,
1276
1278
  },
1277
1279
  'fetchOpenOrders': {
1278
1280
  'marginMode': false,
1279
1281
  'trigger': true,
1280
1282
  'trailing': false,
1281
1283
  'limit': 500,
1284
+ 'symbolRequired': false,
1282
1285
  },
1283
1286
  'fetchOrders': {
1284
1287
  'marginMode': false,
@@ -1287,6 +1290,7 @@ class htx extends htx$1 {
1287
1290
  'limit': 500,
1288
1291
  'untilDays': 2,
1289
1292
  'daysBack': 180,
1293
+ 'symbolRequired': false,
1290
1294
  },
1291
1295
  'fetchClosedOrders': {
1292
1296
  'marginMode': false,
@@ -1296,6 +1300,7 @@ class htx extends htx$1 {
1296
1300
  'limit': 500,
1297
1301
  'daysBack': 180,
1298
1302
  'daysBackCanceled': 1 / 12,
1303
+ 'symbolRequired': false,
1299
1304
  },
1300
1305
  'fetchOHLCV': {
1301
1306
  'limit': 1000, // 2000 for non-historical
@@ -3360,7 +3365,10 @@ class htx extends htx$1 {
3360
3365
  type = 'margin';
3361
3366
  }
3362
3367
  }
3363
- const marketId = (symbol === undefined) ? undefined : this.marketId(symbol);
3368
+ let marketId = undefined;
3369
+ if (symbol !== undefined) {
3370
+ marketId = this.marketId(symbol);
3371
+ }
3364
3372
  for (let i = 0; i < accounts.length; i++) {
3365
3373
  const account = accounts[i];
3366
3374
  const info = this.safeValue(account, 'info');
@@ -7557,11 +7565,13 @@ class htx extends htx$1 {
7557
7565
  'AccessKeyId': this.apiKey,
7558
7566
  'Timestamp': timestamp,
7559
7567
  };
7568
+ // sorting needs such flow exactly, before urlencoding (more at: https://github.com/ccxt/ccxt/issues/24930 )
7569
+ request = this.keysort(request);
7560
7570
  if (method !== 'POST') {
7561
- request = this.extend(request, query);
7571
+ const sortedQuery = this.keysort(query);
7572
+ request = this.extend(request, sortedQuery);
7562
7573
  }
7563
- request = this.keysort(request);
7564
- let auth = this.urlencode(request);
7574
+ let auth = this.urlencode(request).replace('%2c', '%2C'); // in c# it manually needs to be uppercased
7565
7575
  // unfortunately, PHP demands double quotes for the escaped newline symbol
7566
7576
  const payload = [method, hostname, url, auth].join("\n"); // eslint-disable-line quotes
7567
7577
  const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha256.sha256, 'base64');
@@ -280,17 +280,20 @@ class huobijp extends huobijp$1 {
280
280
  'limit': 100,
281
281
  'daysBack': 120,
282
282
  'untilDays': 2,
283
+ 'symbolRequired': false,
283
284
  },
284
285
  'fetchOrder': {
285
286
  'marginMode': false,
286
287
  'trigger': false,
287
288
  'trailing': false,
289
+ 'symbolRequired': false,
288
290
  },
289
291
  'fetchOpenOrders': {
290
292
  'marginMode': false,
291
293
  'limit': undefined,
292
294
  'trigger': false,
293
295
  'trailing': false,
296
+ 'symbolRequired': false,
294
297
  },
295
298
  'fetchOrders': {
296
299
  'marginMode': false,
@@ -299,6 +302,7 @@ class huobijp extends huobijp$1 {
299
302
  'untilDays': undefined,
300
303
  'trigger': false,
301
304
  'trailing': false,
305
+ 'symbolRequired': false,
302
306
  },
303
307
  'fetchClosedOrders': {
304
308
  'marginMode': false,
@@ -308,6 +312,7 @@ class huobijp extends huobijp$1 {
308
312
  'untilDays': undefined,
309
313
  'trigger': false,
310
314
  'trailing': false,
315
+ 'symbolRequired': false,
311
316
  },
312
317
  'fetchOHLCV': {
313
318
  'limit': 2000,