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
@@ -1,5 +1,5 @@
1
1
  import coinbaseinternationalRest from '../coinbaseinternational.js';
2
- import { Ticker, Int, Trade, OrderBook, Market, Dict, Strings, FundingRate, FundingRates } from '../base/types.js';
2
+ import { Ticker, Int, Trade, OrderBook, Market, Dict, Strings, FundingRate, FundingRates, Tickers, OHLCV } from '../base/types.js';
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class coinbaseinternational extends coinbaseinternationalRest {
5
5
  describe(): any;
@@ -8,10 +8,14 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
8
8
  watchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
9
9
  watchFundingRates(symbols: string[], params?: {}): Promise<FundingRates>;
10
10
  watchTicker(symbol: string, params?: {}): Promise<Ticker>;
11
+ getActiveSymbols(): any[];
12
+ watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
11
13
  handleInstrument(client: Client, message: any): void;
12
14
  parseWsInstrument(ticker: Dict, market?: any): Ticker;
13
15
  handleTicker(client: Client, message: any): void;
14
16
  parseWsTicker(ticker: object, market?: Market): Ticker;
17
+ watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
18
+ handleOHLCV(client: Client, message: any): void;
15
19
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
16
20
  watchTradesForSymbols(symbols: string[], since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
17
21
  handleTrade(client: any, message: any): any;
@@ -8,7 +8,7 @@
8
8
  import coinbaseinternationalRest from '../coinbaseinternational.js';
9
9
  import { AuthenticationError, ExchangeError, NotSupported } from '../base/errors.js';
10
10
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
11
- import { ArrayCache } from '../base/ws/Cache.js';
11
+ import { ArrayCache, ArrayCacheByTimestamp } from '../base/ws/Cache.js';
12
12
  // ---------------------------------------------------------------------------
13
13
  export default class coinbaseinternational extends coinbaseinternationalRest {
14
14
  describe() {
@@ -22,12 +22,12 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
22
22
  'watchTicker': true,
23
23
  'watchBalance': false,
24
24
  'watchMyTrades': false,
25
- 'watchOHLCV': false,
25
+ 'watchOHLCV': true,
26
26
  'watchOHLCVForSymbols': false,
27
27
  'watchOrders': false,
28
28
  'watchOrdersForSymbols': false,
29
29
  'watchPositions': false,
30
- 'watchTickers': false,
30
+ 'watchTickers': true,
31
31
  'createOrderWs': false,
32
32
  'editOrderWs': false,
33
33
  'cancelOrderWs': false,
@@ -53,6 +53,14 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
53
53
  'tradesLimit': 1000,
54
54
  'ordersLimit': 1000,
55
55
  'myTradesLimit': 1000,
56
+ 'timeframes': {
57
+ '1m': 'CANDLES_ONE_MINUTE',
58
+ '5m': 'CANDLES_FIVE_MINUTES',
59
+ '30m': 'CANDLES_THIRTY_MINUTES',
60
+ '1h': 'CANDLES_ONE_HOUR',
61
+ '2h': 'CANDLES_TWO_HOURS',
62
+ '1d': 'CANDLES_ONE_DAY',
63
+ },
56
64
  },
57
65
  'exceptions': {
58
66
  'exact': {
@@ -76,16 +84,20 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
76
84
  this.checkRequiredCredentials();
77
85
  let market = undefined;
78
86
  let messageHash = name;
79
- let productIds = [];
87
+ let productIds = undefined;
80
88
  if (symbols === undefined) {
81
- symbols = this.symbols;
89
+ symbols = this.getActiveSymbols();
82
90
  }
83
91
  const symbolsLength = symbols.length;
92
+ const messageHashes = [];
84
93
  if (symbolsLength > 1) {
85
94
  const parsedSymbols = this.marketSymbols(symbols);
86
95
  const marketIds = this.marketIds(parsedSymbols);
87
96
  productIds = marketIds;
88
- messageHash = messageHash + '::' + parsedSymbols.join(',');
97
+ for (let i = 0; i < parsedSymbols.length; i++) {
98
+ messageHashes.push(name + '::' + parsedSymbols[i]);
99
+ }
100
+ // messageHash = messageHash + '::' + parsedSymbols.join (',');
89
101
  }
90
102
  else if (symbolsLength === 1) {
91
103
  market = this.market(symbols[0]);
@@ -101,13 +113,19 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
101
113
  const signature = this.hmac(this.encode(auth), this.base64ToBinary(this.secret), sha256, 'base64');
102
114
  const subscribe = {
103
115
  'type': 'SUBSCRIBE',
104
- 'product_ids': productIds,
116
+ // 'product_ids': productIds,
105
117
  'channels': [name],
106
118
  'time': timestamp,
107
119
  'key': this.apiKey,
108
120
  'passphrase': this.password,
109
121
  'signature': signature,
110
122
  };
123
+ if (productIds !== undefined) {
124
+ subscribe['product_ids'] = productIds;
125
+ }
126
+ if (symbolsLength > 1) {
127
+ return await this.watchMultiple(url, messageHashes, this.extend(subscribe, params), messageHashes);
128
+ }
111
129
  return await this.watch(url, messageHash, this.extend(subscribe, params), messageHash);
112
130
  }
113
131
  async subscribeMultiple(name, symbols = undefined, params = {}) {
@@ -196,6 +214,7 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
196
214
  * @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#instruments-channel
197
215
  * @param {string} [symbol] unified symbol of the market to fetch the ticker for
198
216
  * @param {object} [params] extra parameters specific to the exchange API endpoint
217
+ * @param {string} [params.channel] the channel to watch, 'LEVEL1' or 'INSTRUMENTS', default is 'LEVEL1'
199
218
  * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
200
219
  */
201
220
  await this.loadMarkets();
@@ -203,6 +222,40 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
203
222
  [channel, params] = this.handleOptionAndParams(params, 'watchTicker', 'channel', 'LEVEL1');
204
223
  return await this.subscribe(channel, [symbol], params);
205
224
  }
225
+ getActiveSymbols() {
226
+ const symbols = this.symbols;
227
+ const output = [];
228
+ for (let i = 0; i < symbols.length; i++) {
229
+ const symbol = symbols[i];
230
+ const market = this.markets[symbol];
231
+ if (market['active']) {
232
+ output.push(symbol);
233
+ }
234
+ }
235
+ return output;
236
+ }
237
+ async watchTickers(symbols = undefined, params = {}) {
238
+ /**
239
+ * @method
240
+ * @name coinbaseinternational#watchTickers
241
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
242
+ * @see https://docs.cloud.coinbase.com/intx/docs/websocket-channels#instruments-channel
243
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
244
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
245
+ * @param {string} [params.channel] the channel to watch, 'LEVEL1' or 'INSTRUMENTS', default is 'INSTLEVEL1UMENTS'
246
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
247
+ */
248
+ await this.loadMarkets();
249
+ let channel = undefined;
250
+ [channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'LEVEL1');
251
+ const ticker = await this.subscribe(channel, symbols, params);
252
+ if (this.newUpdates) {
253
+ const result = {};
254
+ result[ticker['symbol']] = ticker;
255
+ return result;
256
+ }
257
+ return this.filterByArray(this.tickers, 'symbol', symbols);
258
+ }
206
259
  handleInstrument(client, message) {
207
260
  //
208
261
  // {
@@ -260,6 +313,33 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
260
313
  // "channel":"INSTRUMENTS",
261
314
  // "type":"SNAPSHOT"
262
315
  // }
316
+ // instruments
317
+ // {
318
+ // sequence: 0,
319
+ // instrument_type: 'PERP',
320
+ // instrument_mode: 'standard',
321
+ // base_asset_name: 'BTC',
322
+ // quote_asset_name: 'USDC',
323
+ // base_increment: '0.0001',
324
+ // quote_increment: '0.1',
325
+ // avg_daily_quantity: '502.8845',
326
+ // avg_daily_volume: '3.1495242961566668E7',
327
+ // total30_day_quantity: '15086.535',
328
+ // total30_day_volume: '9.44857288847E8',
329
+ // total24_hour_quantity: '5.0',
330
+ // total24_hour_volume: '337016.5',
331
+ // base_imf: '0.1',
332
+ // min_quantity: '0.0001',
333
+ // position_size_limit: '800',
334
+ // funding_interval: '3600000000000',
335
+ // trading_state: 'trading',
336
+ // last_updated_time: '2024-07-30T15:00:00Z',
337
+ // default_initial_margin: '0.2',
338
+ // base_asset_multiplier: '1.0',
339
+ // channel: 'INSTRUMENTS',
340
+ // type: 'SNAPSHOT',
341
+ // time: '2024-07-30T15:26:56.766Z',
342
+ // }
263
343
  //
264
344
  const marketId = this.safeString(ticker, 'product_id');
265
345
  const datetime = this.safeString(ticker, 'time');
@@ -282,8 +362,8 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
282
362
  'change': undefined,
283
363
  'percentage': undefined,
284
364
  'average': undefined,
285
- 'baseVolume': this.safeString(ticker, 'total_24_hour_quantity'),
286
- 'quoteVolume': this.safeString(ticker, 'total_24_hour_volume'),
365
+ 'baseVolume': this.safeString2(ticker, 'total_24_hour_quantity', 'total24_hour_quantity'),
366
+ 'quoteVolume': this.safeString2(ticker, 'total_24_hour_volume', 'total24_hour_volume'),
287
367
  });
288
368
  }
289
369
  handleTicker(client, message) {
@@ -355,6 +435,68 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
355
435
  'previousClose': undefined,
356
436
  });
357
437
  }
438
+ async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
439
+ /**
440
+ * @method
441
+ * @name coinbaseinternational#watchOHLCV
442
+ * @description watches historical candlestick data containing the open, high, low, close price, and the volume of a market
443
+ * @see https://docs.cdp.coinbase.com/intx/docs/websocket-channels#candles-channel
444
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
445
+ * @param {string} timeframe the length of time each candle represents
446
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
447
+ * @param {int} [limit] the maximum amount of candles to fetch
448
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
449
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
450
+ */
451
+ await this.loadMarkets();
452
+ const market = this.market(symbol);
453
+ symbol = market['symbol'];
454
+ const options = this.safeDict(this.options, 'timeframes', {});
455
+ const interval = this.safeString(options, timeframe, timeframe);
456
+ const ohlcv = await this.subscribe(interval, [symbol], params);
457
+ if (this.newUpdates) {
458
+ limit = ohlcv.getLimit(symbol, limit);
459
+ }
460
+ return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
461
+ }
462
+ handleOHLCV(client, message) {
463
+ //
464
+ // {
465
+ // "sequence": 0,
466
+ // "product_id": "BTC-PERP",
467
+ // "channel": "CANDLES_ONE_MINUTE",
468
+ // "type": "SNAPSHOT",
469
+ // "candles": [
470
+ // {
471
+ // "time": "2023-05-10T14:58:47.000Z",
472
+ // "low": "28787.8",
473
+ // "high": "28788.8",
474
+ // "open": "28788.8",
475
+ // "close": "28787.8",
476
+ // "volume": "0.466"
477
+ // },
478
+ // ]
479
+ // }
480
+ //
481
+ const messageHash = this.safeString(message, 'channel');
482
+ const marketId = this.safeString(message, 'product_id');
483
+ const market = this.safeMarket(marketId);
484
+ const symbol = market['symbol'];
485
+ const timeframe = this.findTimeframe(messageHash);
486
+ this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
487
+ if (this.safeValue(this.ohlcvs[symbol], timeframe) === undefined) {
488
+ const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
489
+ this.ohlcvs[symbol][timeframe] = new ArrayCacheByTimestamp(limit);
490
+ }
491
+ const stored = this.ohlcvs[symbol][timeframe];
492
+ const data = this.safeList(message, 'candles', []);
493
+ for (let i = 0; i < data.length; i++) {
494
+ const tick = data[i];
495
+ const parsed = this.parseOHLCV(tick, market);
496
+ stored.append(parsed);
497
+ }
498
+ client.resolve(stored, messageHash + '::' + symbol);
499
+ }
358
500
  async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
359
501
  /**
360
502
  * @method
@@ -636,7 +778,7 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
636
778
  if (this.handleErrorMessage(client, message)) {
637
779
  return;
638
780
  }
639
- const channel = this.safeString(message, 'channel');
781
+ const channel = this.safeString(message, 'channel', '');
640
782
  const methods = {
641
783
  'SUBSCRIPTIONS': this.handleSubscriptionStatus,
642
784
  'INSTRUMENTS': this.handleInstrument,
@@ -651,6 +793,9 @@ export default class coinbaseinternational extends coinbaseinternationalRest {
651
793
  const errorMessage = this.safeString(message, 'message');
652
794
  throw new ExchangeError(errorMessage);
653
795
  }
796
+ if (channel.indexOf('CANDLES') > -1) {
797
+ this.handleOHLCV(client, message);
798
+ }
654
799
  const method = this.safeValue(methods, channel);
655
800
  if (method !== undefined) {
656
801
  method.call(this, client, message);
@@ -6,7 +6,7 @@
6
6
 
7
7
  // ---------------------------------------------------------------------------
8
8
  import cryptocomRest from '../cryptocom.js';
9
- import { AuthenticationError, ChecksumError, NetworkError } from '../base/errors.js';
9
+ import { AuthenticationError, ChecksumError, ExchangeError, NetworkError } from '../base/errors.js';
10
10
  import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
11
11
  import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
12
12
  // ---------------------------------------------------------------------------
@@ -889,6 +889,7 @@ export default class cryptocom extends cryptocomRest {
889
889
  // "message": "invalid channel {"channels":["trade.BTCUSD-PERP"]}"
890
890
  // }
891
891
  //
892
+ const id = this.safeString(message, 'id');
892
893
  const errorCode = this.safeString(message, 'code');
893
894
  try {
894
895
  if (errorCode && errorCode !== '0') {
@@ -898,6 +899,7 @@ export default class cryptocom extends cryptocomRest {
898
899
  if (messageString !== undefined) {
899
900
  this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
900
901
  }
902
+ throw new ExchangeError(feedback);
901
903
  }
902
904
  return false;
903
905
  }
@@ -910,7 +912,7 @@ export default class cryptocom extends cryptocomRest {
910
912
  }
911
913
  }
912
914
  else {
913
- client.reject(e);
915
+ client.reject(e, id);
914
916
  }
915
917
  return true;
916
918
  }
@@ -38,5 +38,5 @@ export default class hitbtc extends hitbtcRest {
38
38
  handleOrderRequest(client: Client, message: any): any;
39
39
  handleMessage(client: Client, message: any): void;
40
40
  handleAuthenticate(client: Client, message: any): any;
41
- handleError(client: Client, message: any): any;
41
+ handleError(client: Client, message: any): boolean;
42
42
  }
@@ -1215,7 +1215,9 @@ export default class hitbtc extends hitbtcRest {
1215
1215
  return message;
1216
1216
  }
1217
1217
  handleMessage(client, message) {
1218
- this.handleError(client, message);
1218
+ if (this.handleError(client, message)) {
1219
+ return;
1220
+ }
1219
1221
  let channel = this.safeString2(message, 'ch', 'method');
1220
1222
  if (channel !== undefined) {
1221
1223
  const splitChannel = channel.split('/');
@@ -1294,13 +1296,29 @@ export default class hitbtc extends hitbtcRest {
1294
1296
  //
1295
1297
  const error = this.safeValue(message, 'error');
1296
1298
  if (error !== undefined) {
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 ExchangeError(feedback); // unknown message
1299
+ try {
1300
+ const code = this.safeValue(error, 'code');
1301
+ const errorMessage = this.safeString(error, 'message');
1302
+ const description = this.safeString(error, 'description');
1303
+ const feedback = this.id + ' ' + description;
1304
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
1305
+ this.throwBroadlyMatchedException(this.exceptions['broad'], errorMessage, feedback);
1306
+ throw new ExchangeError(feedback); // unknown message
1307
+ }
1308
+ catch (e) {
1309
+ if (e instanceof AuthenticationError) {
1310
+ const messageHash = 'authenticated';
1311
+ client.reject(e, messageHash);
1312
+ if (messageHash in client.subscriptions) {
1313
+ delete client.subscriptions[messageHash];
1314
+ }
1315
+ }
1316
+ else {
1317
+ const id = this.safeString(message, 'id');
1318
+ client.reject(e, id);
1319
+ }
1320
+ return true;
1321
+ }
1304
1322
  }
1305
1323
  return undefined;
1306
1324
  }
package/js/src/pro/okx.js CHANGED
@@ -1899,6 +1899,13 @@ export default class okx extends okxRest {
1899
1899
  }
1900
1900
  }
1901
1901
  catch (e) {
1902
+ // if the message contains an id, it means it is a response to a request
1903
+ // so we only reject that promise, instead of deleting all futures, destroying the authentication future
1904
+ const id = this.safeString(message, 'id');
1905
+ if (id !== undefined) {
1906
+ client.reject(e, id);
1907
+ return false;
1908
+ }
1902
1909
  client.reject(e);
1903
1910
  return false;
1904
1911
  }
@@ -0,0 +1,15 @@
1
+ import paradexRest from '../paradex.js';
2
+ import type { Int, Trade, OrderBook, Ticker, Strings, Tickers } from '../base/types.js';
3
+ import Client from '../base/ws/Client.js';
4
+ export default class paradex extends paradexRest {
5
+ describe(): any;
6
+ watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
7
+ handleTrade(client: Client, message: any): any;
8
+ watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
9
+ handleOrderBook(client: Client, message: any): void;
10
+ watchTicker(symbol: string, params?: {}): Promise<Ticker>;
11
+ watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
12
+ handleTicker(client: Client, message: any): any;
13
+ handleErrorMessage(client: Client, message: any): boolean;
14
+ handleMessage(client: Client, message: any): void;
15
+ }