ccxt 4.2.57 → 4.2.59

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 (110) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +4 -5
  3. package/build.sh +1 -1
  4. package/cleanup.sh +3 -0
  5. package/dist/ccxt.browser.js +772 -497
  6. package/dist/ccxt.browser.min.js +7 -7
  7. package/dist/cjs/ccxt.js +1 -1
  8. package/dist/cjs/src/alpaca.js +90 -88
  9. package/dist/cjs/src/base/Exchange.js +24 -1
  10. package/dist/cjs/src/binance.js +43 -30
  11. package/dist/cjs/src/bingx.js +15 -4
  12. package/dist/cjs/src/bitget.js +72 -57
  13. package/dist/cjs/src/bitmex.js +13 -29
  14. package/dist/cjs/src/bitrue.js +24 -15
  15. package/dist/cjs/src/blofin.js +25 -2
  16. package/dist/cjs/src/bybit.js +11 -3
  17. package/dist/cjs/src/coinbase.js +24 -14
  18. package/dist/cjs/src/currencycom.js +15 -5
  19. package/dist/cjs/src/delta.js +14 -1
  20. package/dist/cjs/src/gate.js +1 -1
  21. package/dist/cjs/src/hitbtc.js +12 -1
  22. package/dist/cjs/src/krakenfutures.js +22 -7
  23. package/dist/cjs/src/kuna.js +14 -11
  24. package/dist/cjs/src/lbank.js +1 -1
  25. package/dist/cjs/src/mexc.js +20 -20
  26. package/dist/cjs/src/okx.js +32 -2
  27. package/dist/cjs/src/phemex.js +1 -1
  28. package/dist/cjs/src/pro/alpaca.js +1 -1
  29. package/dist/cjs/src/pro/binance.js +1 -1
  30. package/dist/cjs/src/pro/bitfinex2.js +1 -1
  31. package/dist/cjs/src/pro/bitget.js +1 -1
  32. package/dist/cjs/src/pro/bitmart.js +51 -89
  33. package/dist/cjs/src/pro/bitvavo.js +1 -1
  34. package/dist/cjs/src/pro/bybit.js +1 -1
  35. package/dist/cjs/src/pro/coinex.js +1 -1
  36. package/dist/cjs/src/pro/cryptocom.js +1 -1
  37. package/dist/cjs/src/pro/deribit.js +201 -84
  38. package/dist/cjs/src/pro/gate.js +1 -1
  39. package/dist/cjs/src/pro/independentreserve.js +1 -1
  40. package/dist/cjs/src/pro/kraken.js +1 -1
  41. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  42. package/dist/cjs/src/pro/mexc.js +5 -3
  43. package/dist/cjs/src/pro/okx.js +1 -1
  44. package/dist/cjs/src/pro/whitebit.js +4 -6
  45. package/dist/cjs/src/pro/woo.js +1 -1
  46. package/dist/cjs/src/probit.js +1 -1
  47. package/dist/cjs/src/wavesexchange.js +1 -1
  48. package/dist/cjs/src/woo.js +22 -6
  49. package/js/ccxt.d.ts +3 -3
  50. package/js/ccxt.js +1 -1
  51. package/js/src/alpaca.js +90 -88
  52. package/js/src/base/Exchange.d.ts +6 -4
  53. package/js/src/base/Exchange.js +24 -1
  54. package/js/src/base/types.d.ts +9 -0
  55. package/js/src/binance.d.ts +3 -2
  56. package/js/src/binance.js +43 -30
  57. package/js/src/bingx.d.ts +3 -2
  58. package/js/src/bingx.js +15 -4
  59. package/js/src/bitget.d.ts +3 -2
  60. package/js/src/bitget.js +72 -57
  61. package/js/src/bitmex.d.ts +3 -3
  62. package/js/src/bitmex.js +13 -29
  63. package/js/src/bitrue.js +24 -15
  64. package/js/src/blofin.d.ts +3 -2
  65. package/js/src/blofin.js +25 -2
  66. package/js/src/bybit.d.ts +3 -6
  67. package/js/src/bybit.js +11 -3
  68. package/js/src/coinbase.js +24 -14
  69. package/js/src/currencycom.d.ts +3 -2
  70. package/js/src/currencycom.js +15 -5
  71. package/js/src/delta.d.ts +3 -2
  72. package/js/src/delta.js +14 -1
  73. package/js/src/gate.js +1 -1
  74. package/js/src/hitbtc.d.ts +3 -2
  75. package/js/src/hitbtc.js +12 -1
  76. package/js/src/krakenfutures.d.ts +3 -2
  77. package/js/src/krakenfutures.js +22 -7
  78. package/js/src/kuna.js +14 -11
  79. package/js/src/lbank.js +1 -1
  80. package/js/src/mexc.d.ts +3 -13
  81. package/js/src/mexc.js +20 -20
  82. package/js/src/okx.d.ts +3 -2
  83. package/js/src/okx.js +32 -2
  84. package/js/src/phemex.js +1 -1
  85. package/js/src/pro/alpaca.js +1 -1
  86. package/js/src/pro/binance.js +1 -1
  87. package/js/src/pro/bitfinex2.js +1 -1
  88. package/js/src/pro/bitget.js +1 -1
  89. package/js/src/pro/bitmart.d.ts +2 -2
  90. package/js/src/pro/bitmart.js +51 -89
  91. package/js/src/pro/bitvavo.js +1 -1
  92. package/js/src/pro/bybit.js +1 -1
  93. package/js/src/pro/coinex.js +1 -1
  94. package/js/src/pro/cryptocom.js +1 -1
  95. package/js/src/pro/deribit.d.ts +5 -0
  96. package/js/src/pro/deribit.js +202 -85
  97. package/js/src/pro/gate.js +1 -1
  98. package/js/src/pro/independentreserve.js +1 -1
  99. package/js/src/pro/kraken.js +1 -1
  100. package/js/src/pro/kucoinfutures.js +1 -1
  101. package/js/src/pro/mexc.js +6 -4
  102. package/js/src/pro/okx.js +1 -1
  103. package/js/src/pro/whitebit.js +4 -6
  104. package/js/src/pro/woo.js +1 -1
  105. package/js/src/probit.js +1 -1
  106. package/js/src/wavesexchange.js +1 -1
  107. package/js/src/woo.d.ts +3 -5
  108. package/js/src/woo.js +22 -6
  109. package/package.json +1 -1
  110. package/skip-tests.json +8 -3
@@ -3068,10 +3068,12 @@ export default class coinbase extends Exchange {
3068
3068
  * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
3069
3069
  */
3070
3070
  await this.loadMarkets();
3071
+ const maxLimit = 300;
3072
+ limit = (limit === undefined) ? maxLimit : Math.min(limit, maxLimit);
3071
3073
  let paginate = false;
3072
3074
  [paginate, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'paginate', false);
3073
3075
  if (paginate) {
3074
- return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 299);
3076
+ return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, maxLimit - 1);
3075
3077
  }
3076
3078
  const market = this.market(symbol);
3077
3079
  const request = {
@@ -3081,20 +3083,20 @@ export default class coinbase extends Exchange {
3081
3083
  const until = this.safeValueN(params, ['until', 'till', 'end']);
3082
3084
  params = this.omit(params, ['until', 'till']);
3083
3085
  const duration = this.parseTimeframe(timeframe);
3084
- const candles300 = 300 * duration;
3086
+ const requestedDuration = limit * duration;
3085
3087
  let sinceString = undefined;
3086
3088
  if (since !== undefined) {
3087
3089
  sinceString = this.numberToString(this.parseToInt(since / 1000));
3088
3090
  }
3089
3091
  else {
3090
3092
  const now = this.seconds().toString();
3091
- sinceString = Precise.stringSub(now, candles300.toString());
3093
+ sinceString = Precise.stringSub(now, requestedDuration.toString());
3092
3094
  }
3093
3095
  request['start'] = sinceString;
3094
3096
  let endString = this.numberToString(until);
3095
3097
  if (until === undefined) {
3096
3098
  // 300 candles max
3097
- endString = Precise.stringAdd(sinceString, candles300.toString());
3099
+ endString = Precise.stringAdd(sinceString, requestedDuration.toString());
3098
3100
  }
3099
3101
  request['end'] = endString;
3100
3102
  const response = await this.v3PrivateGetBrokerageProductsProductIdCandles(this.extend(request, params));
@@ -3154,8 +3156,19 @@ export default class coinbase extends Exchange {
3154
3156
  const request = {
3155
3157
  'product_id': market['id'],
3156
3158
  };
3159
+ if (since !== undefined) {
3160
+ request['start'] = this.numberToString(this.parseToInt(since / 1000));
3161
+ }
3157
3162
  if (limit !== undefined) {
3158
- request['limit'] = limit;
3163
+ request['limit'] = Math.min(limit, 1000);
3164
+ }
3165
+ let until = undefined;
3166
+ [until, params] = this.handleOptionAndParams(params, 'fetchTrades', 'until');
3167
+ if (until !== undefined) {
3168
+ request['end'] = this.numberToString(this.parseToInt(until / 1000));
3169
+ }
3170
+ else if (since !== undefined) {
3171
+ throw new ArgumentsRequired(this.id + ' fetchTrades() requires a `until` parameter when you use `since` argument');
3159
3172
  }
3160
3173
  const response = await this.v3PrivateGetBrokerageProductsProductIdTicker(this.extend(request, params));
3161
3174
  //
@@ -3289,7 +3302,7 @@ export default class coinbase extends Exchange {
3289
3302
  // }
3290
3303
  // }
3291
3304
  //
3292
- const data = this.safeValue(response, 'pricebook', {});
3305
+ const data = this.safeDict(response, 'pricebook', {});
3293
3306
  const time = this.safeString(data, 'time');
3294
3307
  const timestamp = this.parse8601(time);
3295
3308
  return this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks', 'price', 'size');
@@ -3742,7 +3755,7 @@ export default class coinbase extends Exchange {
3742
3755
  }
3743
3756
  else {
3744
3757
  this.checkRequiredCredentials();
3745
- const nonce = this.nonce().toString();
3758
+ const timestampString = this.seconds().toString();
3746
3759
  let payload = '';
3747
3760
  if (method !== 'GET') {
3748
3761
  if (Object.keys(query).length) {
@@ -3750,17 +3763,14 @@ export default class coinbase extends Exchange {
3750
3763
  payload = body;
3751
3764
  }
3752
3765
  }
3753
- else {
3754
- if (Object.keys(query).length) {
3755
- payload += '?' + this.urlencode(query);
3756
- }
3757
- }
3758
- const auth = nonce + method + savedPath + payload;
3766
+ // 'GET' doesn't need payload in the signature. inside url is enough
3767
+ // https://docs.cloud.coinbase.com/advanced-trade-api/docs/auth#example-request
3768
+ const auth = timestampString + method + savedPath + payload;
3759
3769
  const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256);
3760
3770
  headers = {
3761
3771
  'CB-ACCESS-KEY': this.apiKey,
3762
3772
  'CB-ACCESS-SIGN': signature,
3763
- 'CB-ACCESS-TIMESTAMP': nonce,
3773
+ 'CB-ACCESS-TIMESTAMP': timestampString,
3764
3774
  'Content-Type': 'application/json',
3765
3775
  };
3766
3776
  }
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/currencycom.js';
2
- import type { Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction } from './base/types.js';
2
+ import type { Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class currencycom
5
5
  * @augments Exchange
@@ -59,7 +59,8 @@ export default class currencycom extends Exchange {
59
59
  };
60
60
  parseLedgerEntryStatus(status: any): string;
61
61
  parseLedgerEntryType(type: any): string;
62
- fetchLeverage(symbol: string, params?: {}): Promise<number>;
62
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
63
+ parseLeverage(leverage: any, market?: any): Leverage;
63
64
  fetchDepositAddress(code: string, params?: {}): Promise<{
64
65
  currency: string;
65
66
  address: string;
@@ -1809,12 +1809,22 @@ export default class currencycom extends Exchange {
1809
1809
  };
1810
1810
  const response = await this.privateGetV2LeverageSettings(this.extend(request, params));
1811
1811
  //
1812
- // {
1813
- // "values": [ 1, 2, 5, 10, ],
1814
- // "value": "10",
1815
- // }
1812
+ // {
1813
+ // "values": [ 1, 2, 5, 10, ],
1814
+ // "value": "10",
1815
+ // }
1816
1816
  //
1817
- return this.safeNumber(response, 'value');
1817
+ return this.parseLeverage(response, market);
1818
+ }
1819
+ parseLeverage(leverage, market = undefined) {
1820
+ const leverageValue = this.safeInteger(leverage, 'value');
1821
+ return {
1822
+ 'info': leverage,
1823
+ 'symbol': market['symbol'],
1824
+ 'marginMode': undefined,
1825
+ 'longLeverage': leverageValue,
1826
+ 'shortLeverage': leverageValue,
1827
+ };
1818
1828
  }
1819
1829
  async fetchDepositAddress(code, params = {}) {
1820
1830
  /**
package/js/src/delta.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/delta.js';
2
- import type { Balances, Currency, Greeks, Int, Market, MarketInterface, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Position } from './base/types.js';
2
+ import type { Balances, Currency, Greeks, Int, Market, MarketInterface, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Position, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class delta
5
5
  * @augments Exchange
@@ -153,7 +153,8 @@ export default class delta extends Exchange {
153
153
  };
154
154
  fetchOpenInterest(symbol: string, params?: {}): Promise<import("./base/types.js").OpenInterest>;
155
155
  parseOpenInterest(interest: any, market?: Market): import("./base/types.js").OpenInterest;
156
- fetchLeverage(symbol: string, params?: {}): Promise<any>;
156
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
157
+ parseLeverage(leverage: any, market?: any): Leverage;
157
158
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
158
159
  fetchSettlementHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
159
160
  parseSettlement(settlement: any, market: any): {
package/js/src/delta.js CHANGED
@@ -2814,6 +2814,7 @@ export default class delta extends Exchange {
2814
2814
  const request = {
2815
2815
  'product_id': market['numericId'],
2816
2816
  };
2817
+ const response = await this.privateGetProductsProductIdOrdersLeverage(this.extend(request, params));
2817
2818
  //
2818
2819
  // {
2819
2820
  // "result": {
@@ -2827,7 +2828,19 @@ export default class delta extends Exchange {
2827
2828
  // "success": true
2828
2829
  // }
2829
2830
  //
2830
- return await this.privateGetProductsProductIdOrdersLeverage(this.extend(request, params));
2831
+ const result = this.safeDict(response, 'result', {});
2832
+ return this.parseLeverage(result, market);
2833
+ }
2834
+ parseLeverage(leverage, market = undefined) {
2835
+ const marketId = this.safeString(leverage, 'index_symbol');
2836
+ const leverageValue = this.safeInteger(leverage, 'leverage');
2837
+ return {
2838
+ 'info': leverage,
2839
+ 'symbol': this.safeSymbol(marketId, market),
2840
+ 'marginMode': this.safeStringLower(leverage, 'margin_mode'),
2841
+ 'longLeverage': leverageValue,
2842
+ 'shortLeverage': leverageValue,
2843
+ };
2831
2844
  }
2832
2845
  async setLeverage(leverage, symbol = undefined, params = {}) {
2833
2846
  /**
package/js/src/gate.js CHANGED
@@ -962,7 +962,7 @@ export default class gate extends Exchange {
962
962
  * @param {object} [params] extra parameters specific to the exchange API endpoint
963
963
  * @returns {object[]} an array of objects representing market data
964
964
  */
965
- const sandboxMode = this.safeValue(this.options, 'sandboxMode', false);
965
+ const sandboxMode = this.safeBool(this.options, 'sandboxMode', false);
966
966
  let rawPromises = [
967
967
  this.fetchContractMarkets(params),
968
968
  this.fetchOptionMarkets(params),
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/hitbtc.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, FundingRateHistory, OHLCV, Ticker, Order, OrderBook, Dictionary, Position, Str, Trade, Balances, Transaction, MarginMode, Tickers, Strings, Market, Currency, MarginModes } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, FundingRateHistory, OHLCV, Ticker, Order, OrderBook, Dictionary, Position, Str, Trade, Balances, Transaction, MarginMode, Tickers, Strings, Market, Currency, MarginModes, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class hitbtc
5
5
  * @augments Exchange
@@ -143,7 +143,8 @@ export default class hitbtc extends Exchange {
143
143
  };
144
144
  reduceMargin(symbol: string, amount: any, params?: {}): Promise<any>;
145
145
  addMargin(symbol: string, amount: any, params?: {}): Promise<any>;
146
- fetchLeverage(symbol: string, params?: {}): Promise<number>;
146
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
147
+ parseLeverage(leverage: any, market?: any): Leverage;
147
148
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
148
149
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
149
150
  parseDepositWithdrawFee(fee: any, currency?: Currency): any;
package/js/src/hitbtc.js CHANGED
@@ -3402,7 +3402,18 @@ export default class hitbtc extends Exchange {
3402
3402
  // ]
3403
3403
  // }
3404
3404
  //
3405
- return this.safeNumber(response, 'leverage');
3405
+ return this.parseLeverage(response, market);
3406
+ }
3407
+ parseLeverage(leverage, market = undefined) {
3408
+ const marketId = this.safeString(leverage, 'symbol');
3409
+ const leverageValue = this.safeInteger(leverage, 'leverage');
3410
+ return {
3411
+ 'info': leverage,
3412
+ 'symbol': this.safeSymbol(marketId, market),
3413
+ 'marginMode': this.safeStringLower(leverage, 'type'),
3414
+ 'longLeverage': leverageValue,
3415
+ 'shortLeverage': leverageValue,
3416
+ };
3406
3417
  }
3407
3418
  async setLeverage(leverage, symbol = undefined, params = {}) {
3408
3419
  /**
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/krakenfutures.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, OHLCV, Trade, FundingRateHistory, OrderRequest, Order, Balances, Str, Ticker, OrderBook, Tickers, Strings, Market, Currency } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, OHLCV, Trade, FundingRateHistory, OrderRequest, Order, Balances, Str, Ticker, OrderBook, Tickers, Strings, Market, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class krakenfutures
5
5
  * @augments Exchange
@@ -94,7 +94,8 @@ export default class krakenfutures extends Exchange {
94
94
  transferOut(code: string, amount: any, params?: {}): Promise<TransferEntry>;
95
95
  transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
96
96
  setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
97
- fetchLeverage(symbol?: Str, params?: {}): Promise<any>;
97
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
98
+ parseLeverage(leverage: any, market?: any): Leverage;
98
99
  handleErrors(code: any, reason: any, url: any, method: any, headers: any, body: any, response: any, requestHeaders: any, requestBody: any): any;
99
100
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
100
101
  url: string;
@@ -2459,7 +2459,7 @@ export default class krakenfutures extends Exchange {
2459
2459
  //
2460
2460
  return await this.privatePutLeveragepreferences(this.extend(request, params));
2461
2461
  }
2462
- async fetchLeverage(symbol = undefined, params = {}) {
2462
+ async fetchLeverage(symbol, params = {}) {
2463
2463
  /**
2464
2464
  * @method
2465
2465
  * @name krakenfutures#fetchLeverage
@@ -2473,17 +2473,32 @@ export default class krakenfutures extends Exchange {
2473
2473
  throw new ArgumentsRequired(this.id + ' fetchLeverage() requires a symbol argument');
2474
2474
  }
2475
2475
  await this.loadMarkets();
2476
+ const market = this.market(symbol);
2476
2477
  const request = {
2477
2478
  'symbol': this.marketId(symbol).toUpperCase(),
2478
2479
  };
2480
+ const response = await this.privateGetLeveragepreferences(this.extend(request, params));
2479
2481
  //
2480
- // {
2481
- // "result": "success",
2482
- // "serverTime": "2023-08-01T09:54:08.900Z",
2483
- // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2484
- // }
2482
+ // {
2483
+ // "result": "success",
2484
+ // "serverTime": "2023-08-01T09:54:08.900Z",
2485
+ // "leveragePreferences": [ { symbol: "PF_LTCUSD", maxLeverage: "5.00" } ]
2486
+ // }
2485
2487
  //
2486
- return await this.privateGetLeveragepreferences(this.extend(request, params));
2488
+ const leveragePreferences = this.safeList(response, 'leveragePreferences', []);
2489
+ const data = this.safeDict(leveragePreferences, 0, {});
2490
+ return this.parseLeverage(data, market);
2491
+ }
2492
+ parseLeverage(leverage, market = undefined) {
2493
+ const marketId = this.safeString(leverage, 'symbol');
2494
+ const leverageValue = this.safeInteger(leverage, 'maxLeverage');
2495
+ return {
2496
+ 'info': leverage,
2497
+ 'symbol': this.safeSymbol(marketId, market),
2498
+ 'marginMode': undefined,
2499
+ 'longLeverage': leverageValue,
2500
+ 'shortLeverage': leverageValue,
2501
+ };
2487
2502
  }
2488
2503
  handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2489
2504
  if (response === undefined) {
package/js/src/kuna.js CHANGED
@@ -809,7 +809,7 @@ export default class kuna extends Exchange {
809
809
  await this.loadMarkets();
810
810
  const market = this.market(symbol);
811
811
  const request = {
812
- 'pair': market['id'],
812
+ 'pairs': market['id'],
813
813
  };
814
814
  if (limit !== undefined) {
815
815
  request['limit'] = limit;
@@ -817,18 +817,21 @@ export default class kuna extends Exchange {
817
817
  const response = await this.v4PublicGetTradePublicBookPairs(this.extend(request, params));
818
818
  //
819
819
  // {
820
- // "data": {
821
- // "id": "3e5591ba-2778-4d85-8851-54284045ea44", // Unique identifier of a trade
822
- // "pair": "BTC_USDT", // Market pair that is being traded
823
- // "quoteQuantity": "11528.8118", // Qty of the quote asset, USDT in this example
824
- // "matchPrice": "18649", // Exchange price at the moment of execution
825
- // "matchQuantity": "0.6182", // Qty of the base asset, BTC in this example
826
- // "createdAt": "2022-09-23T14:30:41.486Z", // Date-time of trade execution, UTC
827
- // "side": "Ask" // Trade type: `Ask` or `Bid`. Bid for buying base asset, Ask for selling base asset (e.g. for BTC_USDT trading pair, BTC is the base asset).
828
- // }
820
+ // 'data': [
821
+ // {
822
+ // 'createdAt': '2024-03-02T00:10:49.385Z',
823
+ // 'id': '3b42878a-3688-4bc1-891e-5cc2fc902142',
824
+ // 'matchPrice': '62181.31',
825
+ // 'matchQuantity': '0.00568',
826
+ // 'pair': 'BTC_USDT',
827
+ // 'quoteQuantity': '353.1898408',
828
+ // 'side': 'Bid'
829
+ // },
830
+ // ...
831
+ // ]
829
832
  // }
830
833
  //
831
- const data = this.safeValue(response, 'data', {});
834
+ const data = this.safeList(response, 'data', []);
832
835
  return this.parseTrades(data, market, since, limit);
833
836
  }
834
837
  parseTrade(trade, market = undefined) {
package/js/src/lbank.js CHANGED
@@ -2694,7 +2694,7 @@ export default class lbank extends Exchange {
2694
2694
  const uppercaseHash = hash.toUpperCase();
2695
2695
  let sign = undefined;
2696
2696
  if (signatureMethod === 'RSA') {
2697
- const cacheSecretAsPem = this.safeValue(this.options, 'cacheSecretAsPem', true);
2697
+ const cacheSecretAsPem = this.safeBool(this.options, 'cacheSecretAsPem', true);
2698
2698
  let pem = undefined;
2699
2699
  if (cacheSecretAsPem) {
2700
2700
  pem = this.safeValue(this.options, 'pem');
package/js/src/mexc.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/mexc.js';
2
- import type { TransferEntry, IndexType, Int, OrderSide, Balances, OrderType, OHLCV, FundingRateHistory, Position, OrderBook, OrderRequest, FundingHistory, Order, Str, Trade, Transaction, Ticker, Tickers, Strings, Market, Currency } from './base/types.js';
2
+ import type { TransferEntry, IndexType, Int, OrderSide, Balances, OrderType, OHLCV, FundingRateHistory, Position, OrderBook, OrderRequest, FundingHistory, Order, Str, Trade, Transaction, Ticker, Tickers, Strings, Market, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class mexc
5
5
  * @augments Exchange
@@ -172,18 +172,8 @@ export default class mexc extends Exchange {
172
172
  parseTransactionFee(transaction: any, currency?: Currency): {};
173
173
  fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
174
174
  parseDepositWithdrawFee(fee: any, currency?: Currency): any;
175
- fetchLeverage(symbol: string, params?: {}): Promise<{
176
- info: any;
177
- symbol: string;
178
- leverage: number;
179
- marginMode: any;
180
- }>;
181
- parseLeverage(leverage: any, market?: Market): {
182
- info: any;
183
- symbol: string;
184
- leverage: number;
185
- marginMode: any;
186
- };
175
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
176
+ parseLeverage(leverage: any, market?: any): Leverage;
187
177
  handleMarginModeAndParams(methodName: any, params?: {}, defaultValue?: any): any[];
188
178
  sign(path: any, api?: string, method?: string, params?: {}, headers?: any, body?: any): {
189
179
  url: any;
package/js/src/mexc.js CHANGED
@@ -5426,30 +5426,30 @@ export default class mexc extends Exchange {
5426
5426
  // }
5427
5427
  //
5428
5428
  const data = this.safeList(response, 'data', []);
5429
- const longLeverage = this.safeDict(data, 0);
5430
- return this.parseLeverage(longLeverage, market);
5429
+ return this.parseLeverage(data, market);
5431
5430
  }
5432
5431
  parseLeverage(leverage, market = undefined) {
5433
- //
5434
- // {
5435
- // "level": 1,
5436
- // "maxVol": 463300,
5437
- // "mmr": 0.004,
5438
- // "imr": 0.005,
5439
- // "positionType": 1,
5440
- // "openType": 1,
5441
- // "leverage": 20,
5442
- // "limitBySys": false,
5443
- // "currentMmr": 0.004
5444
- // }
5445
- //
5446
- const marketId = this.safeString(leverage, 'symbol');
5447
- market = this.safeMarket(marketId, market, undefined, 'contract');
5432
+ let marginMode = undefined;
5433
+ let longLeverage = undefined;
5434
+ let shortLeverage = undefined;
5435
+ for (let i = 0; i < leverage.length; i++) {
5436
+ const entry = leverage[i];
5437
+ const openType = this.safeInteger(entry, 'openType');
5438
+ const positionType = this.safeInteger(entry, 'positionType');
5439
+ if (positionType === 1) {
5440
+ longLeverage = this.safeInteger(entry, 'leverage');
5441
+ }
5442
+ else if (positionType === 2) {
5443
+ shortLeverage = this.safeInteger(entry, 'leverage');
5444
+ }
5445
+ marginMode = (openType === 1) ? 'isolated' : 'cross';
5446
+ }
5448
5447
  return {
5449
5448
  'info': leverage,
5450
5449
  'symbol': market['symbol'],
5451
- 'leverage': this.safeInteger(leverage, 'leverage'),
5452
- 'marginMode': undefined,
5450
+ 'marginMode': marginMode,
5451
+ 'longLeverage': longLeverage,
5452
+ 'shortLeverage': shortLeverage,
5453
5453
  };
5454
5454
  }
5455
5455
  handleMarginModeAndParams(methodName, params = {}, defaultValue = undefined) {
@@ -5500,7 +5500,7 @@ export default class mexc extends Exchange {
5500
5500
  'source': this.safeString(this.options, 'broker', 'CCXT'),
5501
5501
  };
5502
5502
  }
5503
- if ((method === 'POST') || (method === 'PUT')) {
5503
+ if ((method === 'POST') || (method === 'PUT') || (method === 'DELETE')) {
5504
5504
  headers['Content-Type'] = 'application/json';
5505
5505
  }
5506
5506
  }
package/js/src/okx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/okx.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage } from './base/types.js';
3
3
  /**
4
4
  * @class okx
5
5
  * @augments Exchange
@@ -104,7 +104,8 @@ export default class okx extends Exchange {
104
104
  fetchWithdrawal(id: string, code?: Str, params?: {}): Promise<Transaction>;
105
105
  parseTransactionStatus(status: any): string;
106
106
  parseTransaction(transaction: any, currency?: Currency): Transaction;
107
- fetchLeverage(symbol: string, params?: {}): Promise<any>;
107
+ fetchLeverage(symbol: string, params?: {}): Promise<Leverage>;
108
+ parseLeverage(leverage: any, market?: any): Leverage;
108
109
  fetchPosition(symbol: string, params?: {}): Promise<import("./base/types.js").Position>;
109
110
  fetchPositions(symbols?: Strings, params?: {}): Promise<import("./base/types.js").Position[]>;
110
111
  fetchPositionsForSymbol(symbol: string, params?: {}): Promise<import("./base/types.js").Position[]>;
package/js/src/okx.js CHANGED
@@ -1560,7 +1560,7 @@ export default class okx extends Exchange {
1560
1560
  // while fetchCurrencies is a public API method by design
1561
1561
  // therefore we check the keys here
1562
1562
  // and fallback to generating the currencies from the markets
1563
- const isSandboxMode = this.safeValue(this.options, 'sandboxMode', false);
1563
+ const isSandboxMode = this.safeBool(this.options, 'sandboxMode', false);
1564
1564
  if (!this.checkRequiredCredentials(false) || isSandboxMode) {
1565
1565
  return undefined;
1566
1566
  }
@@ -5164,7 +5164,37 @@ export default class okx extends Exchange {
5164
5164
  // "msg": ""
5165
5165
  // }
5166
5166
  //
5167
- return response;
5167
+ const data = this.safeList(response, 'data', []);
5168
+ return this.parseLeverage(data, market);
5169
+ }
5170
+ parseLeverage(leverage, market = undefined) {
5171
+ let marketId = undefined;
5172
+ let marginMode = undefined;
5173
+ let longLeverage = undefined;
5174
+ let shortLeverage = undefined;
5175
+ for (let i = 0; i < leverage.length; i++) {
5176
+ const entry = leverage[i];
5177
+ marginMode = this.safeStringLower(entry, 'mgnMode');
5178
+ marketId = this.safeString(entry, 'instId');
5179
+ const positionSide = this.safeStringLower(entry, 'posSide');
5180
+ if (positionSide === 'long') {
5181
+ longLeverage = this.safeInteger(entry, 'lever');
5182
+ }
5183
+ else if (positionSide === 'short') {
5184
+ shortLeverage = this.safeInteger(entry, 'lever');
5185
+ }
5186
+ else {
5187
+ longLeverage = this.safeInteger(entry, 'lever');
5188
+ shortLeverage = this.safeInteger(entry, 'lever');
5189
+ }
5190
+ }
5191
+ return {
5192
+ 'info': leverage,
5193
+ 'symbol': this.safeSymbol(marketId, market),
5194
+ 'marginMode': marginMode,
5195
+ 'longLeverage': longLeverage,
5196
+ 'shortLeverage': shortLeverage,
5197
+ };
5168
5198
  }
5169
5199
  async fetchPosition(symbol, params = {}) {
5170
5200
  /**
package/js/src/phemex.js CHANGED
@@ -2422,7 +2422,7 @@ export default class phemex extends Exchange {
2422
2422
  }
2423
2423
  parseOrder(order, market = undefined) {
2424
2424
  const isSwap = this.safeBool(market, 'swap', false);
2425
- const hasPnl = ('closedPnl' in order);
2425
+ const hasPnl = ('closedPnl' in order) || ('closedPnlRv' in order) || ('totalPnlRv' in order);
2426
2426
  if (isSwap || hasPnl) {
2427
2427
  return this.parseSwapOrder(order, market);
2428
2428
  }
@@ -613,7 +613,7 @@ export default class alpaca extends alpacaRest {
613
613
  for (let i = 0; i < message.length; i++) {
614
614
  const data = message[i];
615
615
  const T = this.safeString(data, 'T');
616
- const msg = this.safeValue(data, 'msg', {});
616
+ const msg = this.safeString(data, 'msg');
617
617
  if (T === 'subscription') {
618
618
  this.handleSubscription(client, data);
619
619
  return;
@@ -2468,7 +2468,7 @@ export default class binance extends binanceRest {
2468
2468
  this.setBalanceCache(client, type, isPortfolioMargin);
2469
2469
  this.setPositionsCache(client, type, symbols, isPortfolioMargin);
2470
2470
  const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', true);
2471
- const awaitPositionsSnapshot = this.safeValue('watchPositions', 'awaitPositionsSnapshot', true);
2471
+ const awaitPositionsSnapshot = this.safeBool('watchPositions', 'awaitPositionsSnapshot', true);
2472
2472
  const cache = this.safeValue(this.positions, type);
2473
2473
  if (fetchPositionsSnapshot && awaitPositionsSnapshot && cache === undefined) {
2474
2474
  const snapshot = await client.future(type + ':fetchPositionsSnapshot');
@@ -56,7 +56,7 @@ export default class bitfinex2 extends bitfinex2Rest {
56
56
  'symbol': marketId,
57
57
  };
58
58
  const result = await this.watch(url, messageHash, this.deepExtend(request, params), messageHash, { 'checksum': false });
59
- const checksum = this.safeValue(this.options, 'checksum', true);
59
+ const checksum = this.safeBool(this.options, 'checksum', true);
60
60
  if (checksum && !client.subscriptions[messageHash]['checksum'] && (channel === 'book')) {
61
61
  client.subscriptions[messageHash]['checksum'] = true;
62
62
  await client.send({
@@ -539,7 +539,7 @@ export default class bitget extends bitgetRest {
539
539
  this.handleDeltas(storedOrderBook['bids'], bids);
540
540
  storedOrderBook['timestamp'] = timestamp;
541
541
  storedOrderBook['datetime'] = this.iso8601(timestamp);
542
- const checksum = this.safeValue(this.options, 'checksum', true);
542
+ const checksum = this.safeBool(this.options, 'checksum', true);
543
543
  const isSnapshot = this.safeString(message, 'action') === 'snapshot'; // snapshot does not have a checksum
544
544
  if (!isSnapshot && checksum) {
545
545
  const storedAsks = storedOrderBook['asks'];
@@ -4,7 +4,7 @@ import Client from '../base/ws/Client.js';
4
4
  export default class bitmart extends bitmartRest {
5
5
  describe(): any;
6
6
  subscribe(channel: any, symbol: any, type: any, params?: {}): Promise<any>;
7
- subscribeMultiple(channel: string, type: string, symbols: string[], params?: {}): Promise<any>;
7
+ subscribeMultiple(channel: string, type: string, symbols?: Strings, params?: {}): Promise<any>;
8
8
  watchBalance(params?: {}): Promise<Balances>;
9
9
  setBalanceCache(client: Client, type: any, subscribeHash: any): void;
10
10
  loadBalanceSnapshot(client: any, messageHash: any, type: any): Promise<void>;
@@ -23,9 +23,9 @@ export default class bitmart extends bitmartRest {
23
23
  handlePositions(client: Client, message: any): void;
24
24
  parseWsPosition(position: any, market?: Market): Position;
25
25
  handleTrade(client: Client, message: any): void;
26
+ handleTradeLoop(entry: any): string;
26
27
  parseWsTrade(trade: any, market?: Market): Trade;
27
28
  handleTicker(client: Client, message: any): void;
28
- resolveMessageHashesForSymbol(client: any, symbol: any, result: any, prexif: any): void;
29
29
  parseWsSwapTicker(ticker: any, market?: Market): Ticker;
30
30
  watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
31
31
  handleOHLCV(client: Client, message: any): void;