ccxt 4.3.65 → 4.3.67

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 (48) hide show
  1. package/README.md +4 -3
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/base/Exchange.js +2 -2
  5. package/dist/cjs/src/bingx.js +151 -19
  6. package/dist/cjs/src/bithumb.js +61 -17
  7. package/dist/cjs/src/hyperliquid.js +63 -7
  8. package/dist/cjs/src/independentreserve.js +0 -1
  9. package/dist/cjs/src/kraken.js +27 -0
  10. package/dist/cjs/src/pro/hyperliquid.js +103 -1
  11. package/dist/cjs/src/pro/okx.js +22 -9
  12. package/js/ccxt.d.ts +1 -1
  13. package/js/ccxt.js +1 -1
  14. package/js/src/abstract/bingx.d.ts +7 -0
  15. package/js/src/base/Exchange.d.ts +14 -13
  16. package/js/src/base/Exchange.js +2 -2
  17. package/js/src/bingx.js +151 -19
  18. package/js/src/bithumb.js +61 -17
  19. package/js/src/hyperliquid.d.ts +3 -1
  20. package/js/src/hyperliquid.js +63 -7
  21. package/js/src/independentreserve.js +1 -1
  22. package/js/src/kraken.d.ts +7 -0
  23. package/js/src/kraken.js +27 -0
  24. package/js/src/pro/bitget.d.ts +1 -1
  25. package/js/src/pro/bybit.d.ts +1 -1
  26. package/js/src/pro/coinone.d.ts +1 -1
  27. package/js/src/pro/currencycom.d.ts +1 -1
  28. package/js/src/pro/hollaex.d.ts +1 -1
  29. package/js/src/pro/hyperliquid.d.ts +5 -2
  30. package/js/src/pro/hyperliquid.js +103 -1
  31. package/js/src/pro/kucoin.d.ts +1 -1
  32. package/js/src/pro/kucoinfutures.d.ts +1 -1
  33. package/js/src/pro/mexc.d.ts +1 -1
  34. package/js/src/pro/okcoin.d.ts +1 -1
  35. package/js/src/pro/okx.d.ts +2 -2
  36. package/js/src/pro/okx.js +23 -10
  37. package/js/src/pro/oxfun.d.ts +1 -1
  38. package/js/src/pro/p2b.d.ts +1 -1
  39. package/js/src/pro/poloniex.d.ts +1 -1
  40. package/js/src/pro/whitebit.d.ts +1 -1
  41. package/package.json +1 -1
  42. package/dist/cjs/src/abstract/bittrex.js +0 -9
  43. package/dist/cjs/src/bittrex.js +0 -2308
  44. package/dist/cjs/src/pro/bittrex.js +0 -959
  45. package/js/src/bittrex.d.ts +0 -97
  46. package/js/src/bittrex.js +0 -2309
  47. package/js/src/pro/bittrex.d.ts +0 -69
  48. package/js/src/pro/bittrex.js +0 -960
package/js/src/bithumb.js CHANGED
@@ -206,17 +206,57 @@ export default class bithumb extends Exchange {
206
206
  * @returns {object[]} an array of objects representing market data
207
207
  */
208
208
  const result = [];
209
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
209
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
210
210
  const quotes = Object.keys(quoteCurrencies);
211
+ const promises = [];
211
212
  for (let i = 0; i < quotes.length; i++) {
212
- const quote = quotes[i];
213
- const quoteId = quote;
214
- const extension = this.safeValue(quoteCurrencies, quote, {});
215
213
  const request = {
216
- 'quoteId': quoteId,
214
+ 'quoteId': quotes[i],
217
215
  };
218
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
219
- const data = this.safeValue(response, 'data');
216
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
217
+ //
218
+ // {
219
+ // "status": "0000",
220
+ // "data": {
221
+ // "ETH": {
222
+ // "opening_price": "0.05153399",
223
+ // "closing_price": "0.05145144",
224
+ // "min_price": "0.05145144",
225
+ // "max_price": "0.05160781",
226
+ // "units_traded": "6.541124172077830855",
227
+ // "acc_trade_value": "0.33705472498492329997697755",
228
+ // "prev_closing_price": "0.0515943",
229
+ // "units_traded_24H": "43.368879902677400513",
230
+ // "acc_trade_value_24H": "2.24165339555398079994373342",
231
+ // "fluctate_24H": "-0.00018203",
232
+ // "fluctate_rate_24H": "-0.35"
233
+ // },
234
+ // "XRP": {
235
+ // "opening_price": "0.00000918",
236
+ // "closing_price": "0.0000092",
237
+ // "min_price": "0.00000918",
238
+ // "max_price": "0.0000092",
239
+ // "units_traded": "6516.949363",
240
+ // "acc_trade_value": "0.0598792533602796",
241
+ // "prev_closing_price": "0.00000916",
242
+ // "units_traded_24H": "229161.50354738",
243
+ // "acc_trade_value_24H": "2.0446589371637117",
244
+ // "fluctate_24H": "0.00000049",
245
+ // "fluctate_rate_24H": "5.63"
246
+ // },
247
+ // ...
248
+ // "date": "1721675913145"
249
+ // }
250
+ // }
251
+ //
252
+ }
253
+ const results = await Promise.all(promises);
254
+ for (let i = 0; i < quotes.length; i++) {
255
+ const quote = quotes[i];
256
+ const quoteId = quote;
257
+ const response = results[i];
258
+ const data = this.safeDict(response, 'data');
259
+ const extension = this.safeDict(quoteCurrencies, quote, {});
220
260
  const currencyIds = Object.keys(data);
221
261
  for (let j = 0; j < currencyIds.length; j++) {
222
262
  const currencyId = currencyIds[j];
@@ -285,7 +325,7 @@ export default class bithumb extends Exchange {
285
325
  }
286
326
  parseBalance(response) {
287
327
  const result = { 'info': response };
288
- const balances = this.safeValue(response, 'data');
328
+ const balances = this.safeDict(response, 'data');
289
329
  const codes = Object.keys(this.currencies);
290
330
  for (let i = 0; i < codes.length; i++) {
291
331
  const code = codes[i];
@@ -356,7 +396,7 @@ export default class bithumb extends Exchange {
356
396
  // }
357
397
  // }
358
398
  //
359
- const data = this.safeValue(response, 'data', {});
399
+ const data = this.safeDict(response, 'data', {});
360
400
  const timestamp = this.safeInteger(data, 'timestamp');
361
401
  return this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks', 'price', 'quantity');
362
402
  }
@@ -420,15 +460,19 @@ export default class bithumb extends Exchange {
420
460
  */
421
461
  await this.loadMarkets();
422
462
  const result = {};
423
- const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
463
+ const quoteCurrencies = this.safeDict(this.options, 'quoteCurrencies', {});
424
464
  const quotes = Object.keys(quoteCurrencies);
465
+ const promises = [];
425
466
  for (let i = 0; i < quotes.length; i++) {
426
- const quote = quotes[i];
427
- const quoteId = quote;
428
467
  const request = {
429
- 'quoteId': quoteId,
468
+ 'quoteId': quotes[i],
430
469
  };
431
- const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
470
+ promises.push(this.publicGetTickerALLQuoteId(this.extend(request, params)));
471
+ }
472
+ const responses = await Promise.all(promises);
473
+ for (let i = 0; i < quotes.length; i++) {
474
+ const quote = quotes[i];
475
+ const response = responses[i];
432
476
  //
433
477
  // {
434
478
  // "status":"0000",
@@ -450,7 +494,7 @@ export default class bithumb extends Exchange {
450
494
  // }
451
495
  // }
452
496
  //
453
- const data = this.safeValue(response, 'data', {});
497
+ const data = this.safeDict(response, 'data', {});
454
498
  const timestamp = this.safeInteger(data, 'date');
455
499
  const tickers = this.omit(data, 'date');
456
500
  const currencyIds = Object.keys(tickers);
@@ -835,7 +879,7 @@ export default class bithumb extends Exchange {
835
879
  // }
836
880
  //
837
881
  const timestamp = this.safeIntegerProduct(order, 'order_date', 0.001);
838
- const sideProperty = this.safeValue2(order, 'type', 'side');
882
+ const sideProperty = this.safeString2(order, 'type', 'side');
839
883
  const side = (sideProperty === 'bid') ? 'buy' : 'sell';
840
884
  const status = this.parseOrderStatus(this.safeString(order, 'order_status'));
841
885
  const price = this.safeString2(order, 'order_price', 'price');
@@ -866,7 +910,7 @@ export default class bithumb extends Exchange {
866
910
  symbol = market['symbol'];
867
911
  }
868
912
  const id = this.safeString(order, 'order_id');
869
- const rawTrades = this.safeValue(order, 'contract', []);
913
+ const rawTrades = this.safeList(order, 'contract', []);
870
914
  return this.safeOrder({
871
915
  'info': order,
872
916
  'id': id,
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/hyperliquid.js';
2
- import type { Market, TransferEntry, Balances, Int, OrderBook, OHLCV, Str, FundingRateHistory, Order, OrderType, OrderSide, Trade, Strings, Position, OrderRequest, Dict, Num, MarginModification, Currencies, CancellationRequest, int, Transaction, Currency, TradingFeeInterface } from './base/types.js';
2
+ import type { Market, TransferEntry, Balances, Int, OrderBook, OHLCV, Str, FundingRateHistory, Order, OrderType, OrderSide, Trade, Strings, Position, OrderRequest, Dict, Num, MarginModification, Currencies, CancellationRequest, int, Transaction, Currency, TradingFeeInterface, Ticker, Tickers } from './base/types.js';
3
3
  /**
4
4
  * @class hyperliquid
5
5
  * @augments Exchange
@@ -14,6 +14,8 @@ export default class hyperliquid extends Exchange {
14
14
  parseMarket(market: Dict): Market;
15
15
  fetchBalance(params?: {}): Promise<Balances>;
16
16
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
17
+ fetchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
18
+ parseTicker(ticker: Dict, market?: Market): Ticker;
17
19
  fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
18
20
  parseOHLCV(ohlcv: any, market?: Market): OHLCV;
19
21
  fetchTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
@@ -97,8 +97,8 @@ export default class hyperliquid extends Exchange {
97
97
  'fetchPositions': true,
98
98
  'fetchPositionsRisk': false,
99
99
  'fetchPremiumIndexOHLCV': false,
100
- 'fetchTicker': false,
101
- 'fetchTickers': false,
100
+ 'fetchTicker': 'emulated',
101
+ 'fetchTickers': true,
102
102
  'fetchTime': false,
103
103
  'fetchTrades': true,
104
104
  'fetchTradingFee': true,
@@ -327,12 +327,12 @@ export default class hyperliquid extends Exchange {
327
327
  // ]
328
328
  //
329
329
  //
330
- let meta = this.safeDict(response, 0, {});
331
- meta = this.safeList(meta, 'universe', []);
330
+ const meta = this.safeDict(response, 0, {});
331
+ const universe = this.safeList(meta, 'universe', []);
332
332
  const assetCtxs = this.safeDict(response, 1, {});
333
333
  const result = [];
334
- for (let i = 0; i < meta.length; i++) {
335
- const data = this.extend(this.safeDict(meta, i, {}), this.safeDict(assetCtxs, i, {}));
334
+ for (let i = 0; i < universe.length; i++) {
335
+ const data = this.extend(this.safeDict(universe, i, {}), this.safeDict(assetCtxs, i, {}));
336
336
  data['baseId'] = i;
337
337
  result.push(data);
338
338
  }
@@ -447,11 +447,13 @@ export default class hyperliquid extends Exchange {
447
447
  //
448
448
  // response differs depending on the environment (mainnet vs sandbox)
449
449
  const first = this.safeDict(response, 0, {});
450
+ const second = this.safeList(response, 1, []);
450
451
  const meta = this.safeList2(first, 'universe', 'spot_infos', []);
451
452
  const tokens = this.safeList2(first, 'tokens', 'token_infos', []);
452
453
  const markets = [];
453
454
  for (let i = 0; i < meta.length; i++) {
454
455
  const market = this.safeDict(meta, i, {});
456
+ const extraData = this.safeDict(second, i, {});
455
457
  const marketName = this.safeString(market, 'name');
456
458
  // if (marketName.indexOf ('/') < 0) {
457
459
  // // there are some weird spot markets in testnet, eg @2
@@ -528,7 +530,7 @@ export default class hyperliquid extends Exchange {
528
530
  },
529
531
  },
530
532
  'created': undefined,
531
- 'info': market,
533
+ 'info': this.extend(extraData, market),
532
534
  }));
533
535
  }
534
536
  return markets;
@@ -756,6 +758,60 @@ export default class hyperliquid extends Exchange {
756
758
  const timestamp = this.safeInteger(response, 'time');
757
759
  return this.parseOrderBook(result, market['symbol'], timestamp, 'bids', 'asks', 'px', 'sz');
758
760
  }
761
+ async fetchTickers(symbols = undefined, params = {}) {
762
+ /**
763
+ * @method
764
+ * @name hyperliquid#fetchTickers
765
+ * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
766
+ * @see https://www.bitmex.com/api/explorer/#!/Instrument/Instrument_getActiveAndIndices
767
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
768
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
769
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
770
+ */
771
+ await this.loadMarkets();
772
+ symbols = this.marketSymbols(symbols);
773
+ // at this stage, to get tickers data, we use fetchMarkets endpoints
774
+ const response = await this.fetchMarkets(params);
775
+ // same response as under "fetchMarkets"
776
+ const result = {};
777
+ for (let i = 0; i < response.length; i++) {
778
+ const market = response[i];
779
+ const info = market['info'];
780
+ const ticker = this.parseTicker(info, market);
781
+ const symbol = this.safeString(ticker, 'symbol');
782
+ result[symbol] = ticker;
783
+ }
784
+ return this.filterByArrayTickers(result, 'symbol', symbols);
785
+ }
786
+ parseTicker(ticker, market = undefined) {
787
+ //
788
+ // {
789
+ // "prevDayPx": "3400.5",
790
+ // "dayNtlVlm": "511297257.47936022",
791
+ // "markPx": "3464.7",
792
+ // "midPx": "3465.05",
793
+ // "oraclePx": "3460.1", // only in swap
794
+ // "openInterest": "64638.1108", // only in swap
795
+ // "premium": "0.00141614", // only in swap
796
+ // "funding": "0.00008727", // only in swap
797
+ // "impactPxs": [ "3465.0", "3465.1" ], // only in swap
798
+ // "coin": "PURR", // only in spot
799
+ // "circulatingSupply": "998949190.03400207", // only in spot
800
+ // },
801
+ //
802
+ const bidAsk = this.safeList(ticker, 'impactPxs');
803
+ return this.safeTicker({
804
+ 'symbol': market['symbol'],
805
+ 'timestamp': undefined,
806
+ 'datetime': undefined,
807
+ 'previousClose': this.safeNumber(ticker, 'prevDayPx'),
808
+ 'close': this.safeNumber(ticker, 'midPx'),
809
+ 'bid': this.safeNumber(bidAsk, 0),
810
+ 'ask': this.safeNumber(bidAsk, 1),
811
+ 'quoteVolume': this.safeNumber(ticker, 'dayNtlVlm'),
812
+ 'info': ticker,
813
+ }, market);
814
+ }
759
815
  async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
760
816
  /**
761
817
  * @method
@@ -9,7 +9,7 @@ import Exchange from './abstract/independentreserve.js';
9
9
  import { Precise } from './base/Precise.js';
10
10
  import { TICK_SIZE } from './base/functions/number.js';
11
11
  import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
12
- import { BadRequest } from '../ccxt.js';
12
+ import { BadRequest } from './base/errors.js';
13
13
  // ---------------------------------------------------------------------------
14
14
  /**
15
15
  * @class independentreserve
@@ -11,6 +11,13 @@ export default class kraken extends Exchange {
11
11
  fetchMarkets(params?: {}): Promise<Market[]>;
12
12
  safeCurrency(currencyId: any, currency?: Currency): import("./base/types.js").CurrencyInterface;
13
13
  appendInactiveMarkets(result: any): any;
14
+ fetchStatus(params?: {}): Promise<{
15
+ status: string;
16
+ updated: any;
17
+ eta: any;
18
+ url: any;
19
+ info: any;
20
+ }>;
14
21
  fetchCurrencies(params?: {}): Promise<Currencies>;
15
22
  fetchTradingFee(symbol: string, params?: {}): Promise<TradingFeeInterface>;
16
23
  parseTradingFee(response: any, market: any): {
package/js/src/kraken.js CHANGED
@@ -83,6 +83,7 @@ export default class kraken extends Exchange {
83
83
  'fetchOrderTrades': 'emulated',
84
84
  'fetchPositions': true,
85
85
  'fetchPremiumIndexOHLCV': false,
86
+ 'fetchStatus': true,
86
87
  'fetchTicker': true,
87
88
  'fetchTickers': true,
88
89
  'fetchTime': true,
@@ -640,6 +641,32 @@ export default class kraken extends Exchange {
640
641
  }
641
642
  return result;
642
643
  }
644
+ async fetchStatus(params = {}) {
645
+ /**
646
+ * @method
647
+ * @name kraken#fetchStatus
648
+ * @description the latest known information on the availability of the exchange API
649
+ * @see https://docs.kraken.com/api/docs/rest-api/get-system-status/
650
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
651
+ * @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
652
+ */
653
+ const response = await this.publicGetSystemStatus(params);
654
+ //
655
+ // {
656
+ // error: [],
657
+ // result: { status: 'online', timestamp: '2024-07-22T16:34:44Z' }
658
+ // }
659
+ //
660
+ const result = this.safeDict(response, 'result');
661
+ const statusRaw = this.safeString(result, 'status');
662
+ return {
663
+ 'status': (statusRaw === 'online') ? 'ok' : 'maintenance',
664
+ 'updated': undefined,
665
+ 'eta': undefined,
666
+ 'url': undefined,
667
+ 'info': response,
668
+ };
669
+ }
643
670
  async fetchCurrencies(params = {}) {
644
671
  /**
645
672
  * @method
@@ -43,7 +43,7 @@ export default class bitget extends bitgetRest {
43
43
  handleAuthenticate(client: Client, message: any): void;
44
44
  handleErrorMessage(client: Client, message: any): boolean;
45
45
  handleMessage(client: Client, message: any): void;
46
- ping(client: any): string;
46
+ ping(client: Client): string;
47
47
  handlePong(client: Client, message: any): any;
48
48
  handleSubscriptionStatus(client: Client, message: any): any;
49
49
  }
@@ -46,7 +46,7 @@ export default class bybit extends bybitRest {
46
46
  authenticate(url: any, params?: {}): Promise<any>;
47
47
  handleErrorMessage(client: Client, message: any): boolean;
48
48
  handleMessage(client: Client, message: any): void;
49
- ping(client: any): {
49
+ ping(client: Client): {
50
50
  req_id: any;
51
51
  op: string;
52
52
  };
@@ -14,7 +14,7 @@ export default class coinone extends coinoneRest {
14
14
  parseWsTrade(trade: Dict, market?: Market): Trade;
15
15
  handleErrorMessage(client: Client, message: any): boolean;
16
16
  handleMessage(client: Client, message: any): void;
17
- ping(client: any): {
17
+ ping(client: Client): {
18
18
  request_type: string;
19
19
  };
20
20
  handlePong(client: Client, message: any): any;
@@ -3,7 +3,7 @@ import type { Int, OrderBook, Trade, Ticker, OHLCV, Balances } from '../base/typ
3
3
  import Client from '../base/ws/Client.js';
4
4
  export default class currencycom extends currencycomRest {
5
5
  describe(): any;
6
- ping(client: any): {
6
+ ping(client: Client): {
7
7
  destination: string;
8
8
  correlationId: any;
9
9
  payload: {};
@@ -17,7 +17,7 @@ export default class hollaex extends hollaexRest {
17
17
  watchPrivate(messageHash: any, params?: {}): Promise<any>;
18
18
  handleErrorMessage(client: Client, message: any): any;
19
19
  handleMessage(client: Client, message: any): void;
20
- ping(client: any): {
20
+ ping(client: Client): {
21
21
  op: string;
22
22
  };
23
23
  handlePong(client: Client, message: any): any;
@@ -1,11 +1,14 @@
1
1
  import hyperliquidRest from '../hyperliquid.js';
2
2
  import Client from '../base/ws/Client.js';
3
- import { Int, Str, Market, OrderBook, Trade, OHLCV, Order, Dict } from '../base/types.js';
3
+ import { Int, Str, Market, OrderBook, Trade, OHLCV, Order, Dict, Strings, Ticker, Tickers } from '../base/types.js';
4
4
  export default class hyperliquid extends hyperliquidRest {
5
5
  describe(): any;
6
6
  watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
7
7
  handleOrderBook(client: any, message: any): void;
8
+ watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
8
9
  watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
10
+ handleWsTickers(client: Client, message: any): void;
11
+ parseWsTicker(rawTicker: any, market?: Market): Ticker;
9
12
  handleMyTrades(client: Client, message: any): void;
10
13
  watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
11
14
  handleTrades(client: Client, message: any): void;
@@ -16,7 +19,7 @@ export default class hyperliquid extends hyperliquidRest {
16
19
  handleOrder(client: Client, message: any): void;
17
20
  handleErrorMessage(client: Client, message: any): boolean;
18
21
  handleMessage(client: Client, message: any): void;
19
- ping(client: any): {
22
+ ping(client: Client): {
20
23
  method: string;
21
24
  };
22
25
  handlePong(client: Client, message: any): any;
@@ -20,7 +20,7 @@ export default class hyperliquid extends hyperliquidRest {
20
20
  'watchOrderBook': true,
21
21
  'watchOrders': true,
22
22
  'watchTicker': false,
23
- 'watchTickers': false,
23
+ 'watchTickers': true,
24
24
  'watchTrades': true,
25
25
  'watchPosition': false,
26
26
  },
@@ -121,6 +121,32 @@ export default class hyperliquid extends hyperliquidRest {
121
121
  const messageHash = 'orderbook:' + symbol;
122
122
  client.resolve(orderbook, messageHash);
123
123
  }
124
+ async watchTickers(symbols = undefined, params = {}) {
125
+ /**
126
+ * @method
127
+ * @name hyperliquid#watchTickers
128
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
129
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
130
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
131
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
132
+ */
133
+ await this.loadMarkets();
134
+ symbols = this.marketSymbols(symbols, undefined, true);
135
+ const messageHash = 'tickers';
136
+ const url = this.urls['api']['ws']['public'];
137
+ const request = {
138
+ 'method': 'subscribe',
139
+ 'subscription': {
140
+ 'type': 'webData2',
141
+ 'user': '0x0000000000000000000000000000000000000000',
142
+ },
143
+ };
144
+ const tickers = await this.watch(url, messageHash, this.extend(request, params), messageHash);
145
+ if (this.newUpdates) {
146
+ return this.filterByArrayTickers(tickers, 'symbol', symbols);
147
+ }
148
+ return this.tickers;
149
+ }
124
150
  async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
125
151
  /**
126
152
  * @method
@@ -156,6 +182,81 @@ export default class hyperliquid extends hyperliquidRest {
156
182
  }
157
183
  return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
158
184
  }
185
+ handleWsTickers(client, message) {
186
+ //
187
+ // {
188
+ // "channel": "webData2",
189
+ // "data": {
190
+ // "meta": {
191
+ // "universe": [
192
+ // {
193
+ // "szDecimals": 5,
194
+ // "name": "BTC",
195
+ // "maxLeverage": 50,
196
+ // "onlyIsolated": false
197
+ // },
198
+ // ...
199
+ // ],
200
+ // },
201
+ // "assetCtxs": [
202
+ // {
203
+ // "funding": "0.00003005",
204
+ // "openInterest": "2311.50778",
205
+ // "prevDayPx": "63475.0",
206
+ // "dayNtlVlm": "468043329.64289033",
207
+ // "premium": "0.00094264",
208
+ // "oraclePx": "64712.0",
209
+ // "markPx": "64774.0",
210
+ // "midPx": "64773.5",
211
+ // "impactPxs": [
212
+ // "64773.0",
213
+ // "64774.0"
214
+ // ]
215
+ // },
216
+ // ...
217
+ // ],
218
+ // "spotAssetCtxs": [
219
+ // {
220
+ // "prevDayPx": "0.20937",
221
+ // "dayNtlVlm": "11188888.61984999",
222
+ // "markPx": "0.19722",
223
+ // "midPx": "0.197145",
224
+ // "circulatingSupply": "598760557.12072003",
225
+ // "coin": "PURR/USDC"
226
+ // },
227
+ // ...
228
+ // ],
229
+ // }
230
+ // }
231
+ //
232
+ // spot
233
+ const rawData = this.safeDict(message, 'data', {});
234
+ const spotAssets = this.safeList(rawData, 'spotAssetCtxs', []);
235
+ const parsedTickers = [];
236
+ for (let i = 0; i < spotAssets.length; i++) {
237
+ const assetObject = spotAssets[i];
238
+ const marketId = this.safeString(assetObject, 'coin');
239
+ const market = this.safeMarket(marketId, undefined, undefined, 'spot');
240
+ const ticker = this.parseWsTicker(assetObject, market);
241
+ parsedTickers.push(ticker);
242
+ }
243
+ // perpetuals
244
+ const meta = this.safeDict(rawData, 'meta', {});
245
+ const universe = this.safeList(meta, 'universe', []);
246
+ const assetCtxs = this.safeList(rawData, 'assetCtxs', []);
247
+ for (let i = 0; i < universe.length; i++) {
248
+ const data = this.extend(this.safeDict(universe, i, {}), this.safeDict(assetCtxs, i, {}));
249
+ const id = data['name'] + '/USDC:USDC';
250
+ const market = this.safeMarket(id, undefined, undefined, 'swap');
251
+ const ticker = this.parseWsTicker(data, market);
252
+ parsedTickers.push(ticker);
253
+ }
254
+ const tickers = this.indexBy(parsedTickers, 'symbol');
255
+ client.resolve(tickers, 'tickers');
256
+ }
257
+ parseWsTicker(rawTicker, market = undefined) {
258
+ return this.parseTicker(rawTicker, market);
259
+ }
159
260
  handleMyTrades(client, message) {
160
261
  //
161
262
  // {
@@ -525,6 +626,7 @@ export default class hyperliquid extends hyperliquidRest {
525
626
  'candle': this.handleOHLCV,
526
627
  'orderUpdates': this.handleOrder,
527
628
  'userFills': this.handleMyTrades,
629
+ 'webData2': this.handleWsTickers,
528
630
  };
529
631
  const exacMethod = this.safeValue(methods, topic);
530
632
  if (exacMethod !== undefined) {
@@ -39,7 +39,7 @@ export default class kucoin extends kucoinRest {
39
39
  watchBalance(params?: {}): Promise<Balances>;
40
40
  handleBalance(client: Client, message: any): void;
41
41
  handleSubject(client: Client, message: any): void;
42
- ping(client: any): {
42
+ ping(client: Client): {
43
43
  id: any;
44
44
  type: string;
45
45
  };
@@ -42,7 +42,7 @@ export default class kucoinfutures extends kucoinfuturesRest {
42
42
  fetchBalanceSnapshot(client: any, message: any): Promise<void>;
43
43
  handleSubject(client: Client, message: any): void;
44
44
  getMessageHash(elementName: string, symbol?: Str): string;
45
- ping(client: any): {
45
+ ping(client: Client): {
46
46
  id: any;
47
47
  type: string;
48
48
  };
@@ -37,7 +37,7 @@ export default class mexc extends mexcRest {
37
37
  handlePong(client: Client, message: any): any;
38
38
  handleSubscriptionStatus(client: Client, message: any): void;
39
39
  handleMessage(client: Client, message: any): void;
40
- ping(client: any): {
40
+ ping(client: Client): {
41
41
  method: string;
42
42
  };
43
43
  }
@@ -23,7 +23,7 @@ export default class okcoin extends okcoinRest {
23
23
  handleBalance(client: Client, message: any): void;
24
24
  handleSubscriptionStatus(client: Client, message: any): any;
25
25
  handleAuthenticate(client: Client, message: any): any;
26
- ping(client: any): string;
26
+ ping(client: Client): string;
27
27
  handlePong(client: Client, message: any): any;
28
28
  handleErrorMessage(client: Client, message: any): any;
29
29
  handleMessage(client: Client, message: any): void;
@@ -28,7 +28,7 @@ export default class okx extends okxRest {
28
28
  watchOrderBookForSymbols(symbols: string[], limit?: Int, params?: {}): Promise<OrderBook>;
29
29
  handleDelta(bookside: any, delta: any): void;
30
30
  handleDeltas(bookside: any, deltas: any): void;
31
- handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any): any;
31
+ handleOrderBookMessage(client: Client, message: any, orderbook: any, messageHash: any, market?: any): any;
32
32
  handleOrderBook(client: Client, message: any): any;
33
33
  authenticate(params?: {}): Promise<any>;
34
34
  watchBalance(params?: {}): Promise<Balances>;
@@ -50,7 +50,7 @@ export default class okx extends okxRest {
50
50
  handleCancelAllOrders(client: Client, message: any): void;
51
51
  handleSubscriptionStatus(client: Client, message: any): any;
52
52
  handleAuthenticate(client: Client, message: any): void;
53
- ping(client: any): string;
53
+ ping(client: Client): string;
54
54
  handlePong(client: Client, message: any): any;
55
55
  handleErrorMessage(client: Client, message: any): any;
56
56
  handleMessage(client: Client, message: any): void;