ccxt 4.5.18 → 4.5.20

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 (152) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +40 -16
  3. package/dist/cjs/_virtual/index.cjs.js +1459 -9
  4. package/dist/cjs/ccxt.js +8 -2
  5. package/dist/cjs/src/abstract/dydx.js +11 -0
  6. package/dist/cjs/src/base/Exchange.js +164 -10
  7. package/dist/cjs/src/base/ws/Client.js +3 -1
  8. package/dist/cjs/src/binance.js +8 -1
  9. package/dist/cjs/src/bingx.js +20 -0
  10. package/dist/cjs/src/bitget.js +43 -41
  11. package/dist/cjs/src/bybit.js +21 -23
  12. package/dist/cjs/src/deribit.js +6 -0
  13. package/dist/cjs/src/dydx.js +2454 -0
  14. package/dist/cjs/src/gate.js +4 -4
  15. package/dist/cjs/src/hibachi.js +1 -1
  16. package/dist/cjs/src/hyperliquid.js +207 -9
  17. package/dist/cjs/src/kucoin.js +711 -109
  18. package/dist/cjs/src/mexc.js +2 -3
  19. package/dist/cjs/src/pro/binance.js +59 -144
  20. package/dist/cjs/src/pro/dydx.js +418 -0
  21. package/dist/cjs/src/pro/kraken.js +4 -3
  22. package/dist/cjs/src/pro/xt.js +218 -4
  23. package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +1 -0
  24. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +56 -0
  25. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +56 -0
  26. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +48 -0
  27. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +343 -0
  28. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +717 -0
  29. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +60 -0
  30. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +45 -0
  31. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +380 -0
  32. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +72 -0
  33. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +211 -0
  34. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +195 -0
  35. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +49 -0
  36. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +57 -0
  37. package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +56 -0
  38. package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +79 -0
  39. package/dist/cjs/src/static_dependencies/dydx-v4-client/long/index.cjs.js +9 -0
  40. package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +59 -0
  41. package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +39 -0
  42. package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +69 -0
  43. package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +108 -0
  44. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +50 -1
  45. package/dist/cjs/src/static_dependencies/scure-base/index.js +29 -0
  46. package/dist/cjs/src/static_dependencies/scure-bip32/index.js +278 -0
  47. package/dist/cjs/src/static_dependencies/scure-bip39/index.js +97 -0
  48. package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +2060 -0
  49. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +2 -0
  50. package/dist/cjs/src/toobit.js +2 -1
  51. package/js/ccxt.d.ts +8 -2
  52. package/js/ccxt.js +6 -2
  53. package/js/src/abstract/binance.d.ts +7 -0
  54. package/js/src/abstract/binancecoinm.d.ts +7 -0
  55. package/js/src/abstract/binanceus.d.ts +7 -0
  56. package/js/src/abstract/binanceusdm.d.ts +7 -0
  57. package/js/src/abstract/bitget.d.ts +1 -0
  58. package/js/src/abstract/dydx.d.ts +61 -0
  59. package/js/src/abstract/dydx.js +11 -0
  60. package/js/src/abstract/kucoin.d.ts +1 -1
  61. package/js/src/abstract/kucoinfutures.d.ts +1 -1
  62. package/js/src/base/Exchange.d.ts +7 -0
  63. package/js/src/base/Exchange.js +163 -10
  64. package/js/src/base/ws/Client.js +3 -1
  65. package/js/src/binance.js +8 -1
  66. package/js/src/bingx.js +20 -0
  67. package/js/src/bitget.d.ts +3 -3
  68. package/js/src/bitget.js +43 -41
  69. package/js/src/bybit.d.ts +3 -3
  70. package/js/src/bybit.js +21 -23
  71. package/js/src/deribit.js +6 -0
  72. package/js/src/dydx.d.ts +364 -0
  73. package/js/src/dydx.js +2453 -0
  74. package/js/src/gate.d.ts +2 -2
  75. package/js/src/gate.js +4 -4
  76. package/js/src/hibachi.js +1 -1
  77. package/js/src/hyperliquid.d.ts +17 -0
  78. package/js/src/hyperliquid.js +207 -9
  79. package/js/src/kucoin.d.ts +48 -1
  80. package/js/src/kucoin.js +711 -109
  81. package/js/src/mexc.js +2 -3
  82. package/js/src/pro/binance.d.ts +2 -2
  83. package/js/src/pro/binance.js +59 -144
  84. package/js/src/pro/dydx.d.ts +81 -0
  85. package/js/src/pro/dydx.js +417 -0
  86. package/js/src/pro/kraken.js +4 -3
  87. package/js/src/pro/xt.d.ts +85 -2
  88. package/js/src/pro/xt.js +218 -4
  89. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.d.ts +90 -0
  90. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +163 -0
  91. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.d.ts +26 -0
  92. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +51 -0
  93. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.d.ts +48 -0
  94. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +85 -0
  95. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.d.ts +40 -0
  96. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +77 -0
  97. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.d.ts +162 -0
  98. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +329 -0
  99. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.d.ts +460 -0
  100. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +698 -0
  101. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.d.ts +127 -0
  102. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +286 -0
  103. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.d.ts +66 -0
  104. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +109 -0
  105. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.d.ts +127 -0
  106. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +257 -0
  107. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.d.ts +48 -0
  108. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +93 -0
  109. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.d.ts +23 -0
  110. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +43 -0
  111. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.d.ts +92 -0
  112. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +164 -0
  113. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.d.ts +124 -0
  114. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +196 -0
  115. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.d.ts +159 -0
  116. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +324 -0
  117. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.d.ts +546 -0
  118. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +872 -0
  119. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.d.ts +84 -0
  120. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +181 -0
  121. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.d.ts +397 -0
  122. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +757 -0
  123. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.d.ts +120 -0
  124. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +246 -0
  125. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.d.ts +79 -0
  126. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +147 -0
  127. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.d.ts +32 -0
  128. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +59 -0
  129. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.d.ts +34 -0
  130. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +66 -0
  131. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.d.ts +62 -0
  132. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +111 -0
  133. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.d.ts +207 -0
  134. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +50 -0
  135. package/js/src/static_dependencies/dydx-v4-client/helpers.d.ts +82 -0
  136. package/js/src/static_dependencies/dydx-v4-client/helpers.js +172 -0
  137. package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +1473 -0
  138. package/js/src/static_dependencies/dydx-v4-client/long/index.d.cts +2 -0
  139. package/js/src/static_dependencies/dydx-v4-client/onboarding.d.ts +35 -0
  140. package/js/src/static_dependencies/dydx-v4-client/onboarding.js +56 -0
  141. package/js/src/static_dependencies/dydx-v4-client/registry.d.ts +7 -0
  142. package/js/src/static_dependencies/dydx-v4-client/registry.js +36 -0
  143. package/js/src/static_dependencies/noble-hashes/utils.d.ts +1 -0
  144. package/js/src/static_dependencies/noble-hashes/utils.js +4 -0
  145. package/js/src/static_dependencies/scure-bip32/index.d.ts +49 -0
  146. package/js/src/static_dependencies/scure-bip32/index.js +295 -0
  147. package/js/src/static_dependencies/scure-bip39/index.d.ts +54 -0
  148. package/js/src/static_dependencies/scure-bip39/index.js +140 -0
  149. package/js/src/static_dependencies/scure-bip39/wordlists/english.d.ts +1 -0
  150. package/js/src/static_dependencies/scure-bip39/wordlists/english.js +2054 -0
  151. package/js/src/toobit.js +2 -1
  152. package/package.json +9 -3
package/js/src/mexc.js CHANGED
@@ -3009,10 +3009,9 @@ export default class mexc extends Exchange {
3009
3009
  }
3010
3010
  [marketType, params] = this.handleMarketTypeAndParams('fetchOpenOrders', market, params);
3011
3011
  if (marketType === 'spot') {
3012
- if (symbol === undefined) {
3013
- throw new ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument for spot market');
3012
+ if (symbol !== undefined) {
3013
+ request['symbol'] = market['id'];
3014
3014
  }
3015
- request['symbol'] = market['id'];
3016
3015
  const [marginMode, query] = this.handleMarginModeAndParams('fetchOpenOrders', params);
3017
3016
  let response = undefined;
3018
3017
  if (marginMode !== undefined) {
@@ -580,13 +580,13 @@ export default class binance extends binanceRest {
580
580
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
581
581
  */
582
582
  watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
583
- watchMultiTickerHelper(methodName: any, channelName: string, symbols?: Strings, params?: {}): Promise<any>;
583
+ watchMultiTickerHelper(methodName: any, channelName: string, symbols?: Strings, params?: {}, isUnsubscribe?: boolean): Promise<any>;
584
584
  parseWsTicker(message: any, marketType: any): Ticker;
585
585
  handleTickerWs(client: Client, message: any): void;
586
586
  handleBidsAsks(client: Client, message: any): void;
587
587
  handleTickers(client: Client, message: any): void;
588
+ handleMarkPrices(client: Client, message: any): void;
588
589
  handleTickersAndBidsAsks(client: Client, message: any, methodType: any): void;
589
- getMessageHash(channelName: string, symbol: Str, isBidAsk: boolean): string;
590
590
  signParams(params?: {}): any;
591
591
  /**
592
592
  * @name binance#ensureUserDataStreamWsSubscribeSignature
@@ -1889,77 +1889,7 @@ export default class binance extends binanceRest {
1889
1889
  if (channelName === 'bookTicker') {
1890
1890
  throw new BadRequest(this.id + ' deprecation notice - to subscribe for bids-asks, use watch_bids_asks() method instead');
1891
1891
  }
1892
- await this.loadMarkets();
1893
- const methodName = 'watchTickers';
1894
- symbols = this.marketSymbols(symbols, undefined, true, false, true);
1895
- let firstMarket = undefined;
1896
- let marketType = undefined;
1897
- const symbolsDefined = (symbols !== undefined);
1898
- if (symbolsDefined) {
1899
- firstMarket = this.market(symbols[0]);
1900
- }
1901
- [marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
1902
- let subType = undefined;
1903
- [subType, params] = this.handleSubTypeAndParams(methodName, firstMarket, params);
1904
- let rawMarketType = undefined;
1905
- if (this.isLinear(marketType, subType)) {
1906
- rawMarketType = 'future';
1907
- }
1908
- else if (this.isInverse(marketType, subType)) {
1909
- rawMarketType = 'delivery';
1910
- }
1911
- else if (marketType === 'spot') {
1912
- rawMarketType = marketType;
1913
- }
1914
- else {
1915
- throw new NotSupported(this.id + ' ' + methodName + '() does not support options markets');
1916
- }
1917
- const isBidAsk = (channelName === 'bookTicker');
1918
- const subscriptionArgs = [];
1919
- const subMessageHashes = [];
1920
- const messageHashes = [];
1921
- if (symbolsDefined) {
1922
- for (let i = 0; i < symbols.length; i++) {
1923
- const symbol = symbols[i];
1924
- const market = this.market(symbol);
1925
- subscriptionArgs.push(market['lowercaseId'] + '@' + channelName);
1926
- subMessageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
1927
- messageHashes.push('unsubscribe:ticker:' + symbol);
1928
- }
1929
- }
1930
- else {
1931
- if (isBidAsk) {
1932
- if (marketType === 'spot') {
1933
- throw new ArgumentsRequired(this.id + ' ' + methodName + '() requires symbols for this channel for spot markets');
1934
- }
1935
- subscriptionArgs.push('!' + channelName);
1936
- }
1937
- else {
1938
- subscriptionArgs.push('!' + channelName + '@arr');
1939
- }
1940
- subMessageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
1941
- messageHashes.push('unsubscribe:ticker');
1942
- }
1943
- let streamHash = channelName;
1944
- if (symbolsDefined) {
1945
- streamHash = channelName + '::' + symbols.join(',');
1946
- }
1947
- const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
1948
- const requestId = this.requestId(url);
1949
- const request = {
1950
- 'method': 'UNSUBSCRIBE',
1951
- 'params': subscriptionArgs,
1952
- 'id': requestId,
1953
- };
1954
- const subscription = {
1955
- 'unsubscribe': true,
1956
- 'id': requestId.toString(),
1957
- 'subMessageHashes': subMessageHashes,
1958
- 'messageHashes': messageHashes,
1959
- 'symbols': symbols,
1960
- 'topic': 'ticker',
1961
- };
1962
- return await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscription);
1892
+ return await this.watchMultiTickerHelper('unWatchTickers', channelName, symbols, params, true);
1963
1893
  }
1964
1894
  /**
1965
1895
  * @method
@@ -1974,60 +1904,7 @@ export default class binance extends binanceRest {
1974
1904
  let channelName = undefined;
1975
1905
  [channelName, params] = this.handleOptionAndParams(params, 'watchMarkPrices', 'name', 'markPrice');
1976
1906
  await this.loadMarkets();
1977
- const use1sFreq = this.safeBool(params, 'use1sFreq', true);
1978
- const suffix = (use1sFreq) ? '@1s' : '';
1979
- const methodName = 'watchMarkPrices';
1980
- symbols = this.marketSymbols(symbols, undefined, true, false, true);
1981
- let firstMarket = undefined;
1982
- let marketType = undefined;
1983
- const symbolsDefined = (symbols !== undefined);
1984
- if (symbolsDefined) {
1985
- firstMarket = this.market(symbols[0]);
1986
- }
1987
- [marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
1988
- if (marketType !== 'swap' && marketType !== 'future') {
1989
- throw new NotSupported(this.id + ' ' + methodName + '() only supports swap markets');
1990
- }
1991
- const rawMarketType = 'future';
1992
- const subscriptionArgs = [];
1993
- const subMessageHashes = [];
1994
- const messageHashes = [];
1995
- if (symbolsDefined) {
1996
- for (let i = 0; i < symbols.length; i++) {
1997
- const symbol = symbols[i];
1998
- const market = this.market(symbol);
1999
- const msgHash = this.getMessageHash(channelName, market['symbol'], false);
2000
- subscriptionArgs.push(market['lowercaseId'] + '@' + channelName + suffix);
2001
- subMessageHashes.push(msgHash);
2002
- messageHashes.push('unsubscribe:' + msgHash);
2003
- }
2004
- }
2005
- else {
2006
- const msgHashNoSymbol = this.getMessageHash(channelName, undefined, false);
2007
- subscriptionArgs.push('!' + channelName + '@arr');
2008
- subMessageHashes.push(msgHashNoSymbol);
2009
- messageHashes.push('unsubscribe:' + msgHashNoSymbol);
2010
- }
2011
- let streamHash = channelName;
2012
- if (symbolsDefined) {
2013
- streamHash = channelName + '::' + symbols.join(',');
2014
- }
2015
- const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
2016
- const requestId = this.requestId(url);
2017
- const request = {
2018
- 'method': 'UNSUBSCRIBE',
2019
- 'params': subscriptionArgs,
2020
- 'id': requestId,
2021
- };
2022
- const subscription = {
2023
- 'unsubscribe': true,
2024
- 'id': requestId.toString(),
2025
- 'subMessageHashes': subMessageHashes,
2026
- 'messageHashes': messageHashes,
2027
- 'symbols': symbols,
2028
- 'topic': 'ticker',
2029
- };
2030
- return await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscription);
1907
+ return await this.watchMultiTickerHelper('unWatchMarkPrices', channelName, symbols, params, true);
2031
1908
  }
2032
1909
  /**
2033
1910
  * @method
@@ -2078,7 +1955,7 @@ export default class binance extends binanceRest {
2078
1955
  }
2079
1956
  return this.filterByArray(this.bidsasks, 'symbol', symbols);
2080
1957
  }
2081
- async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}) {
1958
+ async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}, isUnsubscribe = false) {
2082
1959
  await this.loadMarkets();
2083
1960
  symbols = this.marketSymbols(symbols, undefined, true, false, true);
2084
1961
  const isBidAsk = (channelName === 'bookTicker');
@@ -2107,18 +1984,35 @@ export default class binance extends binanceRest {
2107
1984
  else {
2108
1985
  throw new NotSupported(this.id + ' ' + methodName + '() does not support options markets');
2109
1986
  }
1987
+ if (isMarkPrice && !this.inArray(marketType, ['swap', 'future'])) {
1988
+ throw new NotSupported(this.id + ' ' + methodName + '() does not support ' + marketType + ' markets yet');
1989
+ }
2110
1990
  const subscriptionArgs = [];
2111
1991
  const messageHashes = [];
1992
+ const unsubscribeMessageHashes = [];
2112
1993
  let suffix = '';
2113
1994
  if (isMarkPrice) {
2114
1995
  suffix = (use1sFreq) ? '@1s' : '';
2115
1996
  }
1997
+ let unifiedPrefix = undefined;
1998
+ if (isBidAsk) {
1999
+ unifiedPrefix = 'bidask';
2000
+ }
2001
+ else if (isMarkPrice) {
2002
+ unifiedPrefix = 'markPrice';
2003
+ }
2004
+ else {
2005
+ unifiedPrefix = 'ticker';
2006
+ }
2116
2007
  if (symbolsDefined) {
2117
2008
  for (let i = 0; i < symbols.length; i++) {
2118
2009
  const symbol = symbols[i];
2119
2010
  const market = this.market(symbol);
2120
2011
  subscriptionArgs.push(market['lowercaseId'] + '@' + channelName + suffix);
2121
- messageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
2012
+ messageHashes.push(unifiedPrefix + ':' + channelName + '@' + symbol);
2013
+ if (isUnsubscribe) {
2014
+ unsubscribeMessageHashes.push('unsubscribe::' + unifiedPrefix + ':' + channelName + '@' + symbol);
2015
+ }
2122
2016
  }
2123
2017
  }
2124
2018
  else {
@@ -2134,7 +2028,8 @@ export default class binance extends binanceRest {
2134
2028
  else {
2135
2029
  subscriptionArgs.push('!' + channelName + '@arr');
2136
2030
  }
2137
- messageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
2031
+ messageHashes.push(unifiedPrefix + 's:' + channelName);
2032
+ unsubscribeMessageHashes.push('unsubscribe::' + channelName);
2138
2033
  }
2139
2034
  let streamHash = channelName;
2140
2035
  if (symbolsDefined) {
@@ -2143,14 +2038,29 @@ export default class binance extends binanceRest {
2143
2038
  const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
2144
2039
  const requestId = this.requestId(url);
2145
2040
  const request = {
2146
- 'method': 'SUBSCRIBE',
2041
+ 'method': isUnsubscribe ? 'UNSUBSCRIBE' : 'SUBSCRIBE',
2147
2042
  'params': subscriptionArgs,
2148
2043
  'id': requestId,
2149
2044
  };
2150
- const subscribe = {
2045
+ let hashes = messageHashes;
2046
+ let subscription = {
2151
2047
  'id': requestId,
2152
2048
  };
2153
- const result = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), subscriptionArgs, subscribe);
2049
+ if (isUnsubscribe) {
2050
+ subscription = {
2051
+ 'unsubscribe': true,
2052
+ 'id': requestId.toString(),
2053
+ 'subMessageHashes': messageHashes,
2054
+ 'messageHashes': unsubscribeMessageHashes,
2055
+ 'symbols': symbols,
2056
+ 'topic': 'ticker',
2057
+ };
2058
+ hashes = unsubscribeMessageHashes;
2059
+ }
2060
+ const result = await this.watchMultiple(url, hashes, this.deepExtend(request, params), hashes, subscription);
2061
+ if (isUnsubscribe) {
2062
+ return result;
2063
+ }
2154
2064
  // for efficiency, we have two type of returned structure here - if symbols array was provided, then individual
2155
2065
  // ticker dict comes in, otherwise all-tickers dict comes in
2156
2066
  if (!symbolsDefined) {
@@ -2361,10 +2271,24 @@ export default class binance extends binanceRest {
2361
2271
  //
2362
2272
  this.handleTickersAndBidsAsks(client, message, 'tickers');
2363
2273
  }
2274
+ handleMarkPrices(client, message) {
2275
+ this.handleTickersAndBidsAsks(client, message, 'markPrices');
2276
+ }
2364
2277
  handleTickersAndBidsAsks(client, message, methodType) {
2365
2278
  const isSpot = this.isSpotUrl(client);
2366
2279
  const marketType = (isSpot) ? 'spot' : 'contract';
2367
2280
  const isBidAsk = (methodType === 'bidasks');
2281
+ const isMarkPrice = (methodType === 'markPrices');
2282
+ let unifiedPrefix = undefined;
2283
+ if (isBidAsk) {
2284
+ unifiedPrefix = 'bidask';
2285
+ }
2286
+ else if (isMarkPrice) {
2287
+ unifiedPrefix = 'markPrice';
2288
+ }
2289
+ else {
2290
+ unifiedPrefix = 'ticker';
2291
+ }
2368
2292
  let channelName = undefined;
2369
2293
  const resolvedMessageHashes = [];
2370
2294
  let rawTickers = [];
@@ -2394,26 +2318,17 @@ export default class binance extends binanceRest {
2394
2318
  else {
2395
2319
  this.tickers[symbol] = parsedTicker;
2396
2320
  }
2397
- const messageHash = this.getMessageHash(channelName, symbol, isBidAsk);
2321
+ const messageHash = unifiedPrefix + ':' + channelName + '@' + symbol;
2398
2322
  resolvedMessageHashes.push(messageHash);
2399
2323
  client.resolve(parsedTicker, messageHash);
2400
2324
  }
2401
2325
  // resolve batch endpoint
2402
2326
  const length = resolvedMessageHashes.length;
2403
2327
  if (length > 0) {
2404
- const batchMessageHash = this.getMessageHash(channelName, undefined, isBidAsk);
2328
+ const batchMessageHash = unifiedPrefix + 's:' + channelName;
2405
2329
  client.resolve(newTickers, batchMessageHash);
2406
2330
  }
2407
2331
  }
2408
- getMessageHash(channelName, symbol, isBidAsk) {
2409
- const prefix = isBidAsk ? 'bidask' : 'ticker';
2410
- if (symbol !== undefined) {
2411
- return prefix + ':' + channelName + '@' + symbol;
2412
- }
2413
- else {
2414
- return prefix + 's' + ':' + channelName;
2415
- }
2416
- }
2417
2332
  signParams(params = {}) {
2418
2333
  this.checkRequiredCredentials();
2419
2334
  const defaultRecvWindow = this.safeInteger(this.options, 'recvWindow');
@@ -4562,8 +4477,8 @@ export default class binance extends binanceRest {
4562
4477
  '1dTicker': this.handleTickers,
4563
4478
  '24hrTicker': this.handleTickers,
4564
4479
  '24hrMiniTicker': this.handleTickers,
4565
- 'markPriceUpdate': this.handleTickers,
4566
- 'markPriceUpdate@arr': this.handleTickers,
4480
+ 'markPriceUpdate': this.handleMarkPrices,
4481
+ 'markPriceUpdate@arr': this.handleMarkPrices,
4567
4482
  'bookTicker': this.handleBidsAsks,
4568
4483
  'outboundAccountPosition': this.handleBalance,
4569
4484
  'balanceUpdate': this.handleBalance,
@@ -0,0 +1,81 @@
1
+ import dydxRest from '../dydx.js';
2
+ import type { Int, Trade, OrderBook, OHLCV } from '../base/types.js';
3
+ import Client from '../base/ws/Client.js';
4
+ export default class dydx extends dydxRest {
5
+ describe(): any;
6
+ /**
7
+ * @method
8
+ * @name dydx#watchTrades
9
+ * @description get the list of most recent trades for a particular symbol
10
+ * @see https://docs.dydx.xyz/indexer-client/websockets#trades
11
+ * @param {string} symbol unified symbol of the market to fetch trades for
12
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
13
+ * @param {int} [limit] the maximum amount of trades to fetch
14
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
15
+ * @returns {object[]} a list of [trade structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#public-trades}
16
+ */
17
+ watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
18
+ /**
19
+ * @method
20
+ * @name dydx#unWatchTrades
21
+ * @description unsubscribes from the trades channel
22
+ * @see https://docs.dydx.xyz/indexer-client/websockets#trades
23
+ * @param {string} symbol unified symbol of the market to fetch trades for
24
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
25
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
26
+ */
27
+ unWatchTrades(symbol: string, params?: {}): Promise<any>;
28
+ handleTrades(client: any, message: any): void;
29
+ parseWsTrade(trade: any, market?: any): Trade;
30
+ /**
31
+ * @method
32
+ * @name dydx#watchOrderBook
33
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
34
+ * @see https://docs.dydx.xyz/indexer-client/websockets#orders
35
+ * @param {string} symbol unified symbol of the market to fetch the order book for
36
+ * @param {int} [limit] the maximum amount of order book entries to return
37
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
38
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
39
+ */
40
+ watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
41
+ /**
42
+ * @method
43
+ * @name dydx#unWatchOrderBook
44
+ * @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
45
+ * @see https://docs.dydx.xyz/indexer-client/websockets#orders
46
+ * @param {string} symbol unified array of symbols
47
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
48
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
49
+ */
50
+ unWatchOrderBook(symbol: string, params?: {}): Promise<any>;
51
+ handleOrderBook(client: Client, message: any): void;
52
+ handleDelta(bookside: any, delta: any): void;
53
+ /**
54
+ * @method
55
+ * @name dydx#watchOHLCV
56
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
57
+ * @see https://docs.dydx.xyz/indexer-client/websockets#candles
58
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
59
+ * @param {string} timeframe the length of time each candle represents
60
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
61
+ * @param {int} [limit] the maximum amount of candles to fetch
62
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
63
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
64
+ */
65
+ watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
66
+ /**
67
+ * @method
68
+ * @name dydx#unWatchOHLCV
69
+ * @description unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
70
+ * @see https://docs.dydx.xyz/indexer-client/websockets#candles
71
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
72
+ * @param {string} timeframe the length of time each candle represents
73
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
74
+ * @param {object} [params.timezone] if provided, kline intervals are interpreted in that timezone instead of UTC, example '+08:00'
75
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
76
+ */
77
+ unWatchOHLCV(symbol: string, timeframe?: string, params?: {}): Promise<any>;
78
+ handleOHLCV(client: Client, message: any): void;
79
+ handleErrorMessage(client: Client, message: any): boolean;
80
+ handleMessage(client: Client, message: any): void;
81
+ }