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
@@ -3008,10 +3008,9 @@ class mexc extends mexc$1["default"] {
3008
3008
  }
3009
3009
  [marketType, params] = this.handleMarketTypeAndParams('fetchOpenOrders', market, params);
3010
3010
  if (marketType === 'spot') {
3011
- if (symbol === undefined) {
3012
- throw new errors.ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument for spot market');
3011
+ if (symbol !== undefined) {
3012
+ request['symbol'] = market['id'];
3013
3013
  }
3014
- request['symbol'] = market['id'];
3015
3014
  const [marginMode, query] = this.handleMarginModeAndParams('fetchOpenOrders', params);
3016
3015
  let response = undefined;
3017
3016
  if (marginMode !== undefined) {
@@ -1888,77 +1888,7 @@ class binance extends binance$1["default"] {
1888
1888
  if (channelName === 'bookTicker') {
1889
1889
  throw new errors.BadRequest(this.id + ' deprecation notice - to subscribe for bids-asks, use watch_bids_asks() method instead');
1890
1890
  }
1891
- await this.loadMarkets();
1892
- const methodName = 'watchTickers';
1893
- symbols = this.marketSymbols(symbols, undefined, true, false, true);
1894
- let firstMarket = undefined;
1895
- let marketType = undefined;
1896
- const symbolsDefined = (symbols !== undefined);
1897
- if (symbolsDefined) {
1898
- firstMarket = this.market(symbols[0]);
1899
- }
1900
- [marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
1901
- let subType = undefined;
1902
- [subType, params] = this.handleSubTypeAndParams(methodName, firstMarket, params);
1903
- let rawMarketType = undefined;
1904
- if (this.isLinear(marketType, subType)) {
1905
- rawMarketType = 'future';
1906
- }
1907
- else if (this.isInverse(marketType, subType)) {
1908
- rawMarketType = 'delivery';
1909
- }
1910
- else if (marketType === 'spot') {
1911
- rawMarketType = marketType;
1912
- }
1913
- else {
1914
- throw new errors.NotSupported(this.id + ' ' + methodName + '() does not support options markets');
1915
- }
1916
- const isBidAsk = (channelName === 'bookTicker');
1917
- const subscriptionArgs = [];
1918
- const subMessageHashes = [];
1919
- const messageHashes = [];
1920
- if (symbolsDefined) {
1921
- for (let i = 0; i < symbols.length; i++) {
1922
- const symbol = symbols[i];
1923
- const market = this.market(symbol);
1924
- subscriptionArgs.push(market['lowercaseId'] + '@' + channelName);
1925
- subMessageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
1926
- messageHashes.push('unsubscribe:ticker:' + symbol);
1927
- }
1928
- }
1929
- else {
1930
- if (isBidAsk) {
1931
- if (marketType === 'spot') {
1932
- throw new errors.ArgumentsRequired(this.id + ' ' + methodName + '() requires symbols for this channel for spot markets');
1933
- }
1934
- subscriptionArgs.push('!' + channelName);
1935
- }
1936
- else {
1937
- subscriptionArgs.push('!' + channelName + '@arr');
1938
- }
1939
- subMessageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
1940
- messageHashes.push('unsubscribe:ticker');
1941
- }
1942
- let streamHash = channelName;
1943
- if (symbolsDefined) {
1944
- streamHash = channelName + '::' + symbols.join(',');
1945
- }
1946
- const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
1947
- const requestId = this.requestId(url);
1948
- const request = {
1949
- 'method': 'UNSUBSCRIBE',
1950
- 'params': subscriptionArgs,
1951
- 'id': requestId,
1952
- };
1953
- const subscription = {
1954
- 'unsubscribe': true,
1955
- 'id': requestId.toString(),
1956
- 'subMessageHashes': subMessageHashes,
1957
- 'messageHashes': messageHashes,
1958
- 'symbols': symbols,
1959
- 'topic': 'ticker',
1960
- };
1961
- return await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscription);
1891
+ return await this.watchMultiTickerHelper('unWatchTickers', channelName, symbols, params, true);
1962
1892
  }
1963
1893
  /**
1964
1894
  * @method
@@ -1973,60 +1903,7 @@ class binance extends binance$1["default"] {
1973
1903
  let channelName = undefined;
1974
1904
  [channelName, params] = this.handleOptionAndParams(params, 'watchMarkPrices', 'name', 'markPrice');
1975
1905
  await this.loadMarkets();
1976
- const use1sFreq = this.safeBool(params, 'use1sFreq', true);
1977
- const suffix = (use1sFreq) ? '@1s' : '';
1978
- const methodName = 'watchMarkPrices';
1979
- symbols = this.marketSymbols(symbols, undefined, true, false, true);
1980
- let firstMarket = undefined;
1981
- let marketType = undefined;
1982
- const symbolsDefined = (symbols !== undefined);
1983
- if (symbolsDefined) {
1984
- firstMarket = this.market(symbols[0]);
1985
- }
1986
- [marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
1987
- if (marketType !== 'swap' && marketType !== 'future') {
1988
- throw new errors.NotSupported(this.id + ' ' + methodName + '() only supports swap markets');
1989
- }
1990
- const rawMarketType = 'future';
1991
- const subscriptionArgs = [];
1992
- const subMessageHashes = [];
1993
- const messageHashes = [];
1994
- if (symbolsDefined) {
1995
- for (let i = 0; i < symbols.length; i++) {
1996
- const symbol = symbols[i];
1997
- const market = this.market(symbol);
1998
- const msgHash = this.getMessageHash(channelName, market['symbol'], false);
1999
- subscriptionArgs.push(market['lowercaseId'] + '@' + channelName + suffix);
2000
- subMessageHashes.push(msgHash);
2001
- messageHashes.push('unsubscribe:' + msgHash);
2002
- }
2003
- }
2004
- else {
2005
- const msgHashNoSymbol = this.getMessageHash(channelName, undefined, false);
2006
- subscriptionArgs.push('!' + channelName + '@arr');
2007
- subMessageHashes.push(msgHashNoSymbol);
2008
- messageHashes.push('unsubscribe:' + msgHashNoSymbol);
2009
- }
2010
- let streamHash = channelName;
2011
- if (symbolsDefined) {
2012
- streamHash = channelName + '::' + symbols.join(',');
2013
- }
2014
- const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
2015
- const requestId = this.requestId(url);
2016
- const request = {
2017
- 'method': 'UNSUBSCRIBE',
2018
- 'params': subscriptionArgs,
2019
- 'id': requestId,
2020
- };
2021
- const subscription = {
2022
- 'unsubscribe': true,
2023
- 'id': requestId.toString(),
2024
- 'subMessageHashes': subMessageHashes,
2025
- 'messageHashes': messageHashes,
2026
- 'symbols': symbols,
2027
- 'topic': 'ticker',
2028
- };
2029
- return await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes, subscription);
1906
+ return await this.watchMultiTickerHelper('unWatchMarkPrices', channelName, symbols, params, true);
2030
1907
  }
2031
1908
  /**
2032
1909
  * @method
@@ -2077,7 +1954,7 @@ class binance extends binance$1["default"] {
2077
1954
  }
2078
1955
  return this.filterByArray(this.bidsasks, 'symbol', symbols);
2079
1956
  }
2080
- async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}) {
1957
+ async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}, isUnsubscribe = false) {
2081
1958
  await this.loadMarkets();
2082
1959
  symbols = this.marketSymbols(symbols, undefined, true, false, true);
2083
1960
  const isBidAsk = (channelName === 'bookTicker');
@@ -2106,18 +1983,35 @@ class binance extends binance$1["default"] {
2106
1983
  else {
2107
1984
  throw new errors.NotSupported(this.id + ' ' + methodName + '() does not support options markets');
2108
1985
  }
1986
+ if (isMarkPrice && !this.inArray(marketType, ['swap', 'future'])) {
1987
+ throw new errors.NotSupported(this.id + ' ' + methodName + '() does not support ' + marketType + ' markets yet');
1988
+ }
2109
1989
  const subscriptionArgs = [];
2110
1990
  const messageHashes = [];
1991
+ const unsubscribeMessageHashes = [];
2111
1992
  let suffix = '';
2112
1993
  if (isMarkPrice) {
2113
1994
  suffix = (use1sFreq) ? '@1s' : '';
2114
1995
  }
1996
+ let unifiedPrefix = undefined;
1997
+ if (isBidAsk) {
1998
+ unifiedPrefix = 'bidask';
1999
+ }
2000
+ else if (isMarkPrice) {
2001
+ unifiedPrefix = 'markPrice';
2002
+ }
2003
+ else {
2004
+ unifiedPrefix = 'ticker';
2005
+ }
2115
2006
  if (symbolsDefined) {
2116
2007
  for (let i = 0; i < symbols.length; i++) {
2117
2008
  const symbol = symbols[i];
2118
2009
  const market = this.market(symbol);
2119
2010
  subscriptionArgs.push(market['lowercaseId'] + '@' + channelName + suffix);
2120
- messageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
2011
+ messageHashes.push(unifiedPrefix + ':' + channelName + '@' + symbol);
2012
+ if (isUnsubscribe) {
2013
+ unsubscribeMessageHashes.push('unsubscribe::' + unifiedPrefix + ':' + channelName + '@' + symbol);
2014
+ }
2121
2015
  }
2122
2016
  }
2123
2017
  else {
@@ -2133,7 +2027,8 @@ class binance extends binance$1["default"] {
2133
2027
  else {
2134
2028
  subscriptionArgs.push('!' + channelName + '@arr');
2135
2029
  }
2136
- messageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
2030
+ messageHashes.push(unifiedPrefix + 's:' + channelName);
2031
+ unsubscribeMessageHashes.push('unsubscribe::' + channelName);
2137
2032
  }
2138
2033
  let streamHash = channelName;
2139
2034
  if (symbolsDefined) {
@@ -2142,14 +2037,29 @@ class binance extends binance$1["default"] {
2142
2037
  const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
2143
2038
  const requestId = this.requestId(url);
2144
2039
  const request = {
2145
- 'method': 'SUBSCRIBE',
2040
+ 'method': isUnsubscribe ? 'UNSUBSCRIBE' : 'SUBSCRIBE',
2146
2041
  'params': subscriptionArgs,
2147
2042
  'id': requestId,
2148
2043
  };
2149
- const subscribe = {
2044
+ let hashes = messageHashes;
2045
+ let subscription = {
2150
2046
  'id': requestId,
2151
2047
  };
2152
- const result = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), subscriptionArgs, subscribe);
2048
+ if (isUnsubscribe) {
2049
+ subscription = {
2050
+ 'unsubscribe': true,
2051
+ 'id': requestId.toString(),
2052
+ 'subMessageHashes': messageHashes,
2053
+ 'messageHashes': unsubscribeMessageHashes,
2054
+ 'symbols': symbols,
2055
+ 'topic': 'ticker',
2056
+ };
2057
+ hashes = unsubscribeMessageHashes;
2058
+ }
2059
+ const result = await this.watchMultiple(url, hashes, this.deepExtend(request, params), hashes, subscription);
2060
+ if (isUnsubscribe) {
2061
+ return result;
2062
+ }
2153
2063
  // for efficiency, we have two type of returned structure here - if symbols array was provided, then individual
2154
2064
  // ticker dict comes in, otherwise all-tickers dict comes in
2155
2065
  if (!symbolsDefined) {
@@ -2360,10 +2270,24 @@ class binance extends binance$1["default"] {
2360
2270
  //
2361
2271
  this.handleTickersAndBidsAsks(client, message, 'tickers');
2362
2272
  }
2273
+ handleMarkPrices(client, message) {
2274
+ this.handleTickersAndBidsAsks(client, message, 'markPrices');
2275
+ }
2363
2276
  handleTickersAndBidsAsks(client, message, methodType) {
2364
2277
  const isSpot = this.isSpotUrl(client);
2365
2278
  const marketType = (isSpot) ? 'spot' : 'contract';
2366
2279
  const isBidAsk = (methodType === 'bidasks');
2280
+ const isMarkPrice = (methodType === 'markPrices');
2281
+ let unifiedPrefix = undefined;
2282
+ if (isBidAsk) {
2283
+ unifiedPrefix = 'bidask';
2284
+ }
2285
+ else if (isMarkPrice) {
2286
+ unifiedPrefix = 'markPrice';
2287
+ }
2288
+ else {
2289
+ unifiedPrefix = 'ticker';
2290
+ }
2367
2291
  let channelName = undefined;
2368
2292
  const resolvedMessageHashes = [];
2369
2293
  let rawTickers = [];
@@ -2393,26 +2317,17 @@ class binance extends binance$1["default"] {
2393
2317
  else {
2394
2318
  this.tickers[symbol] = parsedTicker;
2395
2319
  }
2396
- const messageHash = this.getMessageHash(channelName, symbol, isBidAsk);
2320
+ const messageHash = unifiedPrefix + ':' + channelName + '@' + symbol;
2397
2321
  resolvedMessageHashes.push(messageHash);
2398
2322
  client.resolve(parsedTicker, messageHash);
2399
2323
  }
2400
2324
  // resolve batch endpoint
2401
2325
  const length = resolvedMessageHashes.length;
2402
2326
  if (length > 0) {
2403
- const batchMessageHash = this.getMessageHash(channelName, undefined, isBidAsk);
2327
+ const batchMessageHash = unifiedPrefix + 's:' + channelName;
2404
2328
  client.resolve(newTickers, batchMessageHash);
2405
2329
  }
2406
2330
  }
2407
- getMessageHash(channelName, symbol, isBidAsk) {
2408
- const prefix = isBidAsk ? 'bidask' : 'ticker';
2409
- if (symbol !== undefined) {
2410
- return prefix + ':' + channelName + '@' + symbol;
2411
- }
2412
- else {
2413
- return prefix + 's' + ':' + channelName;
2414
- }
2415
- }
2416
2331
  signParams(params = {}) {
2417
2332
  this.checkRequiredCredentials();
2418
2333
  const defaultRecvWindow = this.safeInteger(this.options, 'recvWindow');
@@ -4561,8 +4476,8 @@ class binance extends binance$1["default"] {
4561
4476
  '1dTicker': this.handleTickers,
4562
4477
  '24hrTicker': this.handleTickers,
4563
4478
  '24hrMiniTicker': this.handleTickers,
4564
- 'markPriceUpdate': this.handleTickers,
4565
- 'markPriceUpdate@arr': this.handleTickers,
4479
+ 'markPriceUpdate': this.handleMarkPrices,
4480
+ 'markPriceUpdate@arr': this.handleMarkPrices,
4566
4481
  'bookTicker': this.handleBidsAsks,
4567
4482
  'outboundAccountPosition': this.handleBalance,
4568
4483
  'balanceUpdate': this.handleBalance,