ccxt 4.3.69 → 4.3.71

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 (187) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +13 -10
  3. package/dist/cjs/ccxt.js +8 -1
  4. package/dist/cjs/src/abstract/paradex.js +9 -0
  5. package/dist/cjs/src/ascendex.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +55 -0
  7. package/dist/cjs/src/binance.js +1 -1
  8. package/dist/cjs/src/blofin.js +63 -6
  9. package/dist/cjs/src/bybit.js +1 -1
  10. package/dist/cjs/src/coinbaseinternational.js +168 -2
  11. package/dist/cjs/src/cryptocom.js +9 -1
  12. package/dist/cjs/src/hitbtc.js +1 -1
  13. package/dist/cjs/src/paradex.js +2075 -0
  14. package/dist/cjs/src/poloniex.js +1 -0
  15. package/dist/cjs/src/pro/bequant.js +4 -0
  16. package/dist/cjs/src/pro/blofin.js +665 -0
  17. package/dist/cjs/src/pro/coinbaseinternational.js +154 -9
  18. package/dist/cjs/src/pro/cryptocom.js +3 -1
  19. package/dist/cjs/src/pro/hitbtc.js +26 -8
  20. package/dist/cjs/src/pro/okx.js +7 -0
  21. package/dist/cjs/src/pro/paradex.js +365 -0
  22. package/dist/cjs/src/pro/poloniex.js +37 -12
  23. package/dist/cjs/src/pro/woo.js +5 -4
  24. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +100 -0
  25. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -0
  26. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +284 -0
  27. package/dist/cjs/src/static_dependencies/starknet/constants.js +60 -0
  28. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +26 -0
  29. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +8 -0
  30. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +13 -0
  31. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +56 -0
  32. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +19 -0
  33. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +15 -0
  34. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +44 -0
  35. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +122 -0
  36. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +137 -0
  37. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +61 -0
  38. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +218 -0
  39. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  40. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  41. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  42. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +66 -0
  43. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +281 -0
  44. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +33 -0
  45. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +37 -0
  46. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  47. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +156 -0
  48. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +250 -0
  49. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +215 -0
  50. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +112 -0
  51. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +206 -0
  52. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +58 -0
  53. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +57 -0
  54. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +76 -0
  55. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +92 -0
  56. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +48 -0
  57. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +101 -0
  58. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +334 -0
  59. package/dist/cjs/src/woo.js +4 -2
  60. package/js/ccxt.d.ts +11 -2
  61. package/js/ccxt.js +8 -2
  62. package/js/src/abstract/coinbaseinternational.d.ts +1 -1
  63. package/js/src/abstract/paradex.d.ts +43 -0
  64. package/js/src/abstract/paradex.js +11 -0
  65. package/js/src/ascendex.js +1 -1
  66. package/js/src/base/Exchange.d.ts +8 -0
  67. package/js/src/base/Exchange.js +51 -0
  68. package/js/src/binance.js +1 -1
  69. package/js/src/blofin.d.ts +1 -1
  70. package/js/src/blofin.js +63 -6
  71. package/js/src/bybit.js +1 -1
  72. package/js/src/coinbaseinternational.d.ts +6 -1
  73. package/js/src/coinbaseinternational.js +168 -2
  74. package/js/src/cryptocom.js +10 -2
  75. package/js/src/hitbtc.js +1 -1
  76. package/js/src/paradex.d.ts +76 -0
  77. package/js/src/paradex.js +2075 -0
  78. package/js/src/poloniex.js +1 -0
  79. package/js/src/pro/bequant.js +4 -0
  80. package/js/src/pro/blofin.d.ts +39 -0
  81. package/js/src/pro/blofin.js +668 -0
  82. package/js/src/pro/coinbaseinternational.d.ts +5 -1
  83. package/js/src/pro/coinbaseinternational.js +155 -10
  84. package/js/src/pro/cryptocom.js +4 -2
  85. package/js/src/pro/hitbtc.d.ts +1 -1
  86. package/js/src/pro/hitbtc.js +26 -8
  87. package/js/src/pro/okx.js +7 -0
  88. package/js/src/pro/paradex.d.ts +15 -0
  89. package/js/src/pro/paradex.js +366 -0
  90. package/js/src/pro/poloniex.js +37 -12
  91. package/js/src/pro/woo.js +5 -4
  92. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +24 -0
  93. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  94. package/js/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  95. package/js/src/static_dependencies/scure-starknet/index.js +323 -0
  96. package/js/src/static_dependencies/starknet/constants.d.ts +61 -0
  97. package/js/src/static_dependencies/starknet/constants.js +67 -0
  98. package/js/src/static_dependencies/starknet/index.d.ts +7 -0
  99. package/js/src/static_dependencies/starknet/index.js +50 -0
  100. package/js/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  101. package/js/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  102. package/js/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  103. package/js/src/static_dependencies/starknet/types/calldata.js +28 -0
  104. package/js/src/static_dependencies/starknet/types/index.d.ts +13 -0
  105. package/js/src/static_dependencies/starknet/types/index.js +16 -0
  106. package/js/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  107. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  108. package/js/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  109. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  110. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  111. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  112. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  113. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  114. package/js/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  115. package/js/src/static_dependencies/starknet/types/lib/index.js +52 -0
  116. package/js/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  117. package/js/src/static_dependencies/starknet/types/typedData.js +19 -0
  118. package/js/src/static_dependencies/starknet/utils/address.d.ts +53 -0
  119. package/js/src/static_dependencies/starknet/utils/address.js +89 -0
  120. package/js/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  121. package/js/src/static_dependencies/starknet/utils/assert.js +17 -0
  122. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  123. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  124. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  125. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  126. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  127. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  128. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  129. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  130. package/js/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  131. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  132. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  133. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  134. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  135. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  136. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  137. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  138. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  139. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  140. package/js/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  141. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  142. package/js/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  143. package/js/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  144. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  145. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  146. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  147. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  148. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  149. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  150. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  151. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  152. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  153. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  154. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  155. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  156. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  157. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  158. package/js/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  159. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  160. package/js/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  161. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  162. package/js/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  163. package/js/src/static_dependencies/starknet/utils/encode.js +282 -0
  164. package/js/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  165. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +224 -0
  166. package/js/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  167. package/js/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  168. package/js/src/static_dependencies/starknet/utils/json.d.ts +24 -0
  169. package/js/src/static_dependencies/starknet/utils/json.js +43 -0
  170. package/js/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  171. package/js/src/static_dependencies/starknet/utils/merkle.js +84 -0
  172. package/js/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  173. package/js/src/static_dependencies/starknet/utils/num.js +244 -0
  174. package/js/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  175. package/js/src/static_dependencies/starknet/utils/selector.js +85 -0
  176. package/js/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  177. package/js/src/static_dependencies/starknet/utils/shortString.js +96 -0
  178. package/js/src/static_dependencies/starknet/utils/starknetId.d.ts +113 -0
  179. package/js/src/static_dependencies/starknet/utils/starknetId.js +265 -0
  180. package/js/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  181. package/js/src/static_dependencies/starknet/utils/typedData.js +321 -0
  182. package/js/src/static_dependencies/starknet/utils/uint256.d.ts +21 -0
  183. package/js/src/static_dependencies/starknet/utils/uint256.js +32 -0
  184. package/js/src/static_dependencies/starknet/utils/url.d.ts +29 -0
  185. package/js/src/static_dependencies/starknet/utils/url.js +70 -0
  186. package/js/src/woo.js +4 -2
  187. package/package.json +1 -1
@@ -19,12 +19,12 @@ class coinbaseinternational extends coinbaseinternational$1 {
19
19
  'watchTicker': true,
20
20
  'watchBalance': false,
21
21
  'watchMyTrades': false,
22
- 'watchOHLCV': false,
22
+ 'watchOHLCV': true,
23
23
  'watchOHLCVForSymbols': false,
24
24
  'watchOrders': false,
25
25
  'watchOrdersForSymbols': false,
26
26
  'watchPositions': false,
27
- 'watchTickers': false,
27
+ 'watchTickers': true,
28
28
  'createOrderWs': false,
29
29
  'editOrderWs': false,
30
30
  'cancelOrderWs': false,
@@ -50,6 +50,14 @@ class coinbaseinternational extends coinbaseinternational$1 {
50
50
  'tradesLimit': 1000,
51
51
  'ordersLimit': 1000,
52
52
  'myTradesLimit': 1000,
53
+ 'timeframes': {
54
+ '1m': 'CANDLES_ONE_MINUTE',
55
+ '5m': 'CANDLES_FIVE_MINUTES',
56
+ '30m': 'CANDLES_THIRTY_MINUTES',
57
+ '1h': 'CANDLES_ONE_HOUR',
58
+ '2h': 'CANDLES_TWO_HOURS',
59
+ '1d': 'CANDLES_ONE_DAY',
60
+ },
53
61
  },
54
62
  'exceptions': {
55
63
  'exact': {
@@ -73,16 +81,20 @@ class coinbaseinternational extends coinbaseinternational$1 {
73
81
  this.checkRequiredCredentials();
74
82
  let market = undefined;
75
83
  let messageHash = name;
76
- let productIds = [];
84
+ let productIds = undefined;
77
85
  if (symbols === undefined) {
78
- symbols = this.symbols;
86
+ symbols = this.getActiveSymbols();
79
87
  }
80
88
  const symbolsLength = symbols.length;
89
+ const messageHashes = [];
81
90
  if (symbolsLength > 1) {
82
91
  const parsedSymbols = this.marketSymbols(symbols);
83
92
  const marketIds = this.marketIds(parsedSymbols);
84
93
  productIds = marketIds;
85
- messageHash = messageHash + '::' + parsedSymbols.join(',');
94
+ for (let i = 0; i < parsedSymbols.length; i++) {
95
+ messageHashes.push(name + '::' + parsedSymbols[i]);
96
+ }
97
+ // messageHash = messageHash + '::' + parsedSymbols.join (',');
86
98
  }
87
99
  else if (symbolsLength === 1) {
88
100
  market = this.market(symbols[0]);
@@ -98,13 +110,19 @@ class coinbaseinternational extends coinbaseinternational$1 {
98
110
  const signature = this.hmac(this.encode(auth), this.base64ToBinary(this.secret), sha256.sha256, 'base64');
99
111
  const subscribe = {
100
112
  'type': 'SUBSCRIBE',
101
- 'product_ids': productIds,
113
+ // 'product_ids': productIds,
102
114
  'channels': [name],
103
115
  'time': timestamp,
104
116
  'key': this.apiKey,
105
117
  'passphrase': this.password,
106
118
  'signature': signature,
107
119
  };
120
+ if (productIds !== undefined) {
121
+ subscribe['product_ids'] = productIds;
122
+ }
123
+ if (symbolsLength > 1) {
124
+ return await this.watchMultiple(url, messageHashes, this.extend(subscribe, params), messageHashes);
125
+ }
108
126
  return await this.watch(url, messageHash, this.extend(subscribe, params), messageHash);
109
127
  }
110
128
  async subscribeMultiple(name, symbols = undefined, params = {}) {
@@ -193,6 +211,7 @@ class coinbaseinternational extends coinbaseinternational$1 {
193
211
  * @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#instruments-channel
194
212
  * @param {string} [symbol] unified symbol of the market to fetch the ticker for
195
213
  * @param {object} [params] extra parameters specific to the exchange API endpoint
214
+ * @param {string} [params.channel] the channel to watch, 'LEVEL1' or 'INSTRUMENTS', default is 'LEVEL1'
196
215
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
197
216
  */
198
217
  await this.loadMarkets();
@@ -200,6 +219,40 @@ class coinbaseinternational extends coinbaseinternational$1 {
200
219
  [channel, params] = this.handleOptionAndParams(params, 'watchTicker', 'channel', 'LEVEL1');
201
220
  return await this.subscribe(channel, [symbol], params);
202
221
  }
222
+ getActiveSymbols() {
223
+ const symbols = this.symbols;
224
+ const output = [];
225
+ for (let i = 0; i < symbols.length; i++) {
226
+ const symbol = symbols[i];
227
+ const market = this.markets[symbol];
228
+ if (market['active']) {
229
+ output.push(symbol);
230
+ }
231
+ }
232
+ return output;
233
+ }
234
+ async watchTickers(symbols = undefined, params = {}) {
235
+ /**
236
+ * @method
237
+ * @name coinbaseinternational#watchTickers
238
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
239
+ * @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#instruments-channel
240
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
241
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
242
+ * @param {string} [params.channel] the channel to watch, 'LEVEL1' or 'INSTRUMENTS', default is 'INSTLEVEL1UMENTS'
243
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
244
+ */
245
+ await this.loadMarkets();
246
+ let channel = undefined;
247
+ [channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'LEVEL1');
248
+ const ticker = await this.subscribe(channel, symbols, params);
249
+ if (this.newUpdates) {
250
+ const result = {};
251
+ result[ticker['symbol']] = ticker;
252
+ return result;
253
+ }
254
+ return this.filterByArray(this.tickers, 'symbol', symbols);
255
+ }
203
256
  handleInstrument(client, message) {
204
257
  //
205
258
  // {
@@ -257,6 +310,33 @@ class coinbaseinternational extends coinbaseinternational$1 {
257
310
  // "channel":"INSTRUMENTS",
258
311
  // "type":"SNAPSHOT"
259
312
  // }
313
+ // instruments
314
+ // {
315
+ // sequence: 0,
316
+ // instrument_type: 'PERP',
317
+ // instrument_mode: 'standard',
318
+ // base_asset_name: 'BTC',
319
+ // quote_asset_name: 'USDC',
320
+ // base_increment: '0.0001',
321
+ // quote_increment: '0.1',
322
+ // avg_daily_quantity: '502.8845',
323
+ // avg_daily_volume: '3.1495242961566668E7',
324
+ // total30_day_quantity: '15086.535',
325
+ // total30_day_volume: '9.44857288847E8',
326
+ // total24_hour_quantity: '5.0',
327
+ // total24_hour_volume: '337016.5',
328
+ // base_imf: '0.1',
329
+ // min_quantity: '0.0001',
330
+ // position_size_limit: '800',
331
+ // funding_interval: '3600000000000',
332
+ // trading_state: 'trading',
333
+ // last_updated_time: '2024-07-30T15:00:00Z',
334
+ // default_initial_margin: '0.2',
335
+ // base_asset_multiplier: '1.0',
336
+ // channel: 'INSTRUMENTS',
337
+ // type: 'SNAPSHOT',
338
+ // time: '2024-07-30T15:26:56.766Z',
339
+ // }
260
340
  //
261
341
  const marketId = this.safeString(ticker, 'product_id');
262
342
  const datetime = this.safeString(ticker, 'time');
@@ -279,8 +359,8 @@ class coinbaseinternational extends coinbaseinternational$1 {
279
359
  'change': undefined,
280
360
  'percentage': undefined,
281
361
  'average': undefined,
282
- 'baseVolume': this.safeString(ticker, 'total_24_hour_quantity'),
283
- 'quoteVolume': this.safeString(ticker, 'total_24_hour_volume'),
362
+ 'baseVolume': this.safeString2(ticker, 'total_24_hour_quantity', 'total24_hour_quantity'),
363
+ 'quoteVolume': this.safeString2(ticker, 'total_24_hour_volume', 'total24_hour_volume'),
284
364
  });
285
365
  }
286
366
  handleTicker(client, message) {
@@ -352,6 +432,68 @@ class coinbaseinternational extends coinbaseinternational$1 {
352
432
  'previousClose': undefined,
353
433
  });
354
434
  }
435
+ async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
436
+ /**
437
+ * @method
438
+ * @name coinbaseinternational#watchOHLCV
439
+ * @description watches historical candlestick data containing the open, high, low, close price, and the volume of a market
440
+ * @see https://docs.cdp.coinbase.com/intx/docs/websocket-channels#candles-channel
441
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
442
+ * @param {string} timeframe the length of time each candle represents
443
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
444
+ * @param {int} [limit] the maximum amount of candles to fetch
445
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
446
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
447
+ */
448
+ await this.loadMarkets();
449
+ const market = this.market(symbol);
450
+ symbol = market['symbol'];
451
+ const options = this.safeDict(this.options, 'timeframes', {});
452
+ const interval = this.safeString(options, timeframe, timeframe);
453
+ const ohlcv = await this.subscribe(interval, [symbol], params);
454
+ if (this.newUpdates) {
455
+ limit = ohlcv.getLimit(symbol, limit);
456
+ }
457
+ return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
458
+ }
459
+ handleOHLCV(client, message) {
460
+ //
461
+ // {
462
+ // "sequence": 0,
463
+ // "product_id": "BTC-PERP",
464
+ // "channel": "CANDLES_ONE_MINUTE",
465
+ // "type": "SNAPSHOT",
466
+ // "candles": [
467
+ // {
468
+ // "time": "2023-05-10T14:58:47.000Z",
469
+ // "low": "28787.8",
470
+ // "high": "28788.8",
471
+ // "open": "28788.8",
472
+ // "close": "28787.8",
473
+ // "volume": "0.466"
474
+ // },
475
+ // ]
476
+ // }
477
+ //
478
+ const messageHash = this.safeString(message, 'channel');
479
+ const marketId = this.safeString(message, 'product_id');
480
+ const market = this.safeMarket(marketId);
481
+ const symbol = market['symbol'];
482
+ const timeframe = this.findTimeframe(messageHash);
483
+ this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
484
+ if (this.safeValue(this.ohlcvs[symbol], timeframe) === undefined) {
485
+ const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
486
+ this.ohlcvs[symbol][timeframe] = new Cache.ArrayCacheByTimestamp(limit);
487
+ }
488
+ const stored = this.ohlcvs[symbol][timeframe];
489
+ const data = this.safeList(message, 'candles', []);
490
+ for (let i = 0; i < data.length; i++) {
491
+ const tick = data[i];
492
+ const parsed = this.parseOHLCV(tick, market);
493
+ stored.append(parsed);
494
+ }
495
+ client.resolve(stored, messageHash + '::' + symbol);
496
+ }
355
497
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
356
498
  /**
357
499
  * @method
@@ -633,7 +775,7 @@ class coinbaseinternational extends coinbaseinternational$1 {
633
775
  if (this.handleErrorMessage(client, message)) {
634
776
  return;
635
777
  }
636
- const channel = this.safeString(message, 'channel');
778
+ const channel = this.safeString(message, 'channel', '');
637
779
  const methods = {
638
780
  'SUBSCRIPTIONS': this.handleSubscriptionStatus,
639
781
  'INSTRUMENTS': this.handleInstrument,
@@ -648,6 +790,9 @@ class coinbaseinternational extends coinbaseinternational$1 {
648
790
  const errorMessage = this.safeString(message, 'message');
649
791
  throw new errors.ExchangeError(errorMessage);
650
792
  }
793
+ if (channel.indexOf('CANDLES') > -1) {
794
+ this.handleOHLCV(client, message);
795
+ }
651
796
  const method = this.safeValue(methods, channel);
652
797
  if (method !== undefined) {
653
798
  method.call(this, client, message);
@@ -886,6 +886,7 @@ class cryptocom extends cryptocom$1 {
886
886
  // "message": "invalid channel {"channels":["trade.BTCUSD-PERP"]}"
887
887
  // }
888
888
  //
889
+ const id = this.safeString(message, 'id');
889
890
  const errorCode = this.safeString(message, 'code');
890
891
  try {
891
892
  if (errorCode && errorCode !== '0') {
@@ -895,6 +896,7 @@ class cryptocom extends cryptocom$1 {
895
896
  if (messageString !== undefined) {
896
897
  this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
897
898
  }
899
+ throw new errors.ExchangeError(feedback);
898
900
  }
899
901
  return false;
900
902
  }
@@ -907,7 +909,7 @@ class cryptocom extends cryptocom$1 {
907
909
  }
908
910
  }
909
911
  else {
910
- client.reject(e);
912
+ client.reject(e, id);
911
913
  }
912
914
  return true;
913
915
  }
@@ -1212,7 +1212,9 @@ class hitbtc extends hitbtc$1 {
1212
1212
  return message;
1213
1213
  }
1214
1214
  handleMessage(client, message) {
1215
- this.handleError(client, message);
1215
+ if (this.handleError(client, message)) {
1216
+ return;
1217
+ }
1216
1218
  let channel = this.safeString2(message, 'ch', 'method');
1217
1219
  if (channel !== undefined) {
1218
1220
  const splitChannel = channel.split('/');
@@ -1291,13 +1293,29 @@ class hitbtc extends hitbtc$1 {
1291
1293
  //
1292
1294
  const error = this.safeValue(message, 'error');
1293
1295
  if (error !== undefined) {
1294
- const code = this.safeValue(error, 'code');
1295
- const errorMessage = this.safeString(error, 'message');
1296
- const description = this.safeString(error, 'description');
1297
- const feedback = this.id + ' ' + description;
1298
- this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
1299
- this.throwBroadlyMatchedException(this.exceptions['broad'], errorMessage, feedback);
1300
- throw new errors.ExchangeError(feedback); // unknown message
1296
+ try {
1297
+ const code = this.safeValue(error, 'code');
1298
+ const errorMessage = this.safeString(error, 'message');
1299
+ const description = this.safeString(error, 'description');
1300
+ const feedback = this.id + ' ' + description;
1301
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
1302
+ this.throwBroadlyMatchedException(this.exceptions['broad'], errorMessage, feedback);
1303
+ throw new errors.ExchangeError(feedback); // unknown message
1304
+ }
1305
+ catch (e) {
1306
+ if (e instanceof errors.AuthenticationError) {
1307
+ const messageHash = 'authenticated';
1308
+ client.reject(e, messageHash);
1309
+ if (messageHash in client.subscriptions) {
1310
+ delete client.subscriptions[messageHash];
1311
+ }
1312
+ }
1313
+ else {
1314
+ const id = this.safeString(message, 'id');
1315
+ client.reject(e, id);
1316
+ }
1317
+ return true;
1318
+ }
1301
1319
  }
1302
1320
  return undefined;
1303
1321
  }
@@ -1896,6 +1896,13 @@ class okx extends okx$1 {
1896
1896
  }
1897
1897
  }
1898
1898
  catch (e) {
1899
+ // if the message contains an id, it means it is a response to a request
1900
+ // so we only reject that promise, instead of deleting all futures, destroying the authentication future
1901
+ const id = this.safeString(message, 'id');
1902
+ if (id !== undefined) {
1903
+ client.reject(e, id);
1904
+ return false;
1905
+ }
1899
1906
  client.reject(e);
1900
1907
  return false;
1901
1908
  }