unicex 0.17.4__py3-none-any.whl → 0.17.6__py3-none-any.whl

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.
@@ -49,7 +49,7 @@ class IUniWebsocketManager(ABC):
49
49
  except Exception as err:
50
50
  self._logger.error(f"Failed to handle adapter error: {e}")
51
51
  raise err from e
52
- self._logger.warning(f"Failed to adapt message: {e}")
52
+ self._logger.error(f"Failed to adapt message: {e}")
53
53
  return
54
54
  if isinstance(adapted, list):
55
55
  for item in adapted:
@@ -36,6 +36,13 @@ class UniWebsocketManager(IUniWebsocketManager):
36
36
  self._websocket_manager = WebsocketManager(self._client, **ws_kwargs) # type: ignore
37
37
  self._adapter = Adapter()
38
38
 
39
+ def _is_service_message(self, raw_msg: Any) -> bool:
40
+ """Дополнительно обрабатывает ошибку адаптации сообщения на случай, если это сервисное сообщение, например `ping` или `subscribe`.
41
+
42
+ Переопределяется в каждом наследнике в связи с разным форматом входящих данных.
43
+ """
44
+ return raw_msg.get("event") == "subscribe"
45
+
39
46
  @overload
40
47
  def klines(
41
48
  self,
@@ -36,6 +36,15 @@ class UniWebsocketManager(IUniWebsocketManager):
36
36
  self._websocket_manager = WebsocketManager(self._client, **ws_kwargs) # type: ignore
37
37
  self._adapter = Adapter()
38
38
 
39
+ def _is_service_message(self, raw_msg: Any) -> bool:
40
+ """Дополнительно обрабатывает ошибку адаптации сообщения на случай, если это сервисное сообщение, например `ping` или `subscribe`.
41
+
42
+ Переопределяется в каждом наследнике в связи с разным форматом входящих данных.
43
+ """
44
+ is_sub_msg = raw_msg.get("event") == "subscribe"
45
+ is_pong_msg = raw_msg.get("event") == "pong"
46
+ return is_sub_msg or is_pong_msg
47
+
39
48
  def _normalize_symbols(
40
49
  self,
41
50
  symbol: str | None,
@@ -41,7 +41,13 @@ class UniWebsocketManager(IUniWebsocketManager):
41
41
 
42
42
  Переопределяется в каждом наследнике в связи с разным форматом входящих данных.
43
43
  """
44
- return raw_msg.get("msg") == "PONG"
44
+ is_sub_msg = raw_msg.get("channel") == "rs.sub.deal" and raw_msg.get("data") == "success"
45
+
46
+ is_pong_1 = raw_msg.get("channel") == "pong"
47
+
48
+ is_pont_2 = raw_msg.get("msg") == "PONG"
49
+
50
+ return any([is_sub_msg, is_pong_1, is_pont_2])
45
51
 
46
52
  @overload
47
53
  def klines(
@@ -36,21 +36,25 @@ class UniWebsocketManager(IUniWebsocketManager):
36
36
  self._websocket_manager = WebsocketManager(self._client, **ws_kwargs) # type: ignore
37
37
  self._adapter = Adapter()
38
38
 
39
+ def _is_service_message(self, raw_msg: Any) -> bool:
40
+ """Дополнительно обрабатывает ошибку адаптации сообщения на случай, если это сервисное сообщение, например `ping` или `subscribe`.
41
+
42
+ Переопределяется в каждом наследнике в связи с разным форматом входящих данных.
43
+ """
44
+ return raw_msg.get("event") == "subscribe"
45
+
39
46
  def _normalize_symbol(
40
47
  self,
41
48
  symbol: str | None,
42
49
  symbols: Sequence[str] | None,
43
- ) -> str:
50
+ ) -> list[str]:
44
51
  """Преобразует параметры symbol/symbols в один тикер."""
45
52
  if symbol and symbols:
46
53
  raise ValueError("Parameters symbol and symbols cannot be used together")
47
54
  if symbol:
48
- return symbol
55
+ return [symbol]
49
56
  if symbols:
50
- normalized = list(symbols)
51
- if len(normalized) != 1:
52
- raise ValueError("OKX websocket поддерживает только один тикер на соединение")
53
- return normalized[0]
57
+ return list(symbols)
54
58
  raise ValueError("Either symbol or symbols must be provided")
55
59
 
56
60
  @overload
@@ -43,6 +43,23 @@ class WebsocketManager:
43
43
  }
44
44
  )
45
45
 
46
+ def _normalize_inst_ids(self, inst_id: str | list[str]) -> list[str]:
47
+ """Нормализует inst_id до списка."""
48
+ if isinstance(inst_id, str):
49
+ return [inst_id]
50
+ if not inst_id:
51
+ raise ValueError("inst_id list cannot be empty")
52
+ return list(inst_id)
53
+
54
+ def _build_inst_id_args(
55
+ self,
56
+ base_args: dict[str, str],
57
+ inst_id: str | list[str],
58
+ ) -> list[dict[str, str]]:
59
+ """Формирует args для списка inst_id."""
60
+ inst_ids = self._normalize_inst_ids(inst_id)
61
+ return [{**base_args, "instId": item} for item in inst_ids]
62
+
46
63
  def instruments(
47
64
  self,
48
65
  callback: CallbackType,
@@ -75,30 +92,23 @@ class WebsocketManager:
75
92
  **self._ws_kwargs,
76
93
  )
77
94
 
78
- def open_interest(
79
- self,
80
- callback: CallbackType,
81
- inst_id: str,
82
- ) -> Websocket:
95
+ def open_interest(self, callback: CallbackType, inst_id: str | list[str]) -> Websocket:
83
96
  """Создает вебсокет для получения данных об открытом интересе.
84
97
 
85
98
  https://www.okx.com/docs-v5/en/#public-data-websocket-open-interest-channel
86
99
 
87
100
  Параметры:
88
101
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
89
- inst_id (`str`): ID инструмента (например, "LTC-USD-SWAP").
102
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "LTC-USD-SWAP").
90
103
 
91
104
  Возвращает:
92
105
  `Websocket`: Объект для управления вебсокет соединением.
93
106
  """
94
- subscription_message = self._build_subscription_message(
95
- [
96
- {
97
- "channel": "open-interest",
98
- "instId": inst_id,
99
- }
100
- ]
107
+ args = self._build_inst_id_args(
108
+ {"channel": "open-interest"},
109
+ inst_id,
101
110
  )
111
+ subscription_message = self._build_subscription_message(args)
102
112
 
103
113
  return Websocket(
104
114
  callback=callback,
@@ -110,7 +120,7 @@ class WebsocketManager:
110
120
  def funding_rate(
111
121
  self,
112
122
  callback: CallbackType,
113
- inst_id: str,
123
+ inst_id: str | list[str],
114
124
  ) -> Websocket:
115
125
  """Создает вебсокет для получения данных о ставке финансирования.
116
126
 
@@ -118,19 +128,16 @@ class WebsocketManager:
118
128
 
119
129
  Параметры:
120
130
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
121
- inst_id (`str`): ID инструмента (например, "BTC-USD-SWAP").
131
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USD-SWAP").
122
132
 
123
133
  Возвращает:
124
134
  `Websocket`: Объект для управления вебсокет соединением.
125
135
  """
126
- subscription_message = self._build_subscription_message(
127
- [
128
- {
129
- "channel": "funding-rate",
130
- "instId": inst_id,
131
- }
132
- ]
136
+ args = self._build_inst_id_args(
137
+ {"channel": "funding-rate"},
138
+ inst_id,
133
139
  )
140
+ subscription_message = self._build_subscription_message(args)
134
141
 
135
142
  return Websocket(
136
143
  callback=callback,
@@ -142,7 +149,7 @@ class WebsocketManager:
142
149
  def price_limit(
143
150
  self,
144
151
  callback: CallbackType,
145
- inst_id: str,
152
+ inst_id: str | list[str],
146
153
  ) -> Websocket:
147
154
  """Создает вебсокет для получения максимальной цены покупки и минимальной цены продажи инструментов.
148
155
 
@@ -150,19 +157,16 @@ class WebsocketManager:
150
157
 
151
158
  Параметры:
152
159
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
153
- inst_id (`str`): ID инструмента (например, "LTC-USD-190628").
160
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "LTC-USD-190628").
154
161
 
155
162
  Возвращает:
156
163
  `Websocket`: Объект для управления вебсокет соединением.
157
164
  """
158
- subscription_message = self._build_subscription_message(
159
- [
160
- {
161
- "channel": "price-limit",
162
- "instId": inst_id,
163
- }
164
- ]
165
+ args = self._build_inst_id_args(
166
+ {"channel": "price-limit"},
167
+ inst_id,
165
168
  )
169
+ subscription_message = self._build_subscription_message(args)
166
170
 
167
171
  return Websocket(
168
172
  callback=callback,
@@ -208,7 +212,7 @@ class WebsocketManager:
208
212
  callback: CallbackType,
209
213
  inst_type: Literal["OPTION", "FUTURES"],
210
214
  inst_family: str | None = None,
211
- inst_id: str | None = None,
215
+ inst_id: str | list[str] | None = None,
212
216
  ) -> Websocket:
213
217
  """Создает вебсокет для получения расчетной цены поставки/исполнения/расчета для FUTURES и OPTION контрактов.
214
218
 
@@ -218,7 +222,7 @@ class WebsocketManager:
218
222
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
219
223
  inst_type (`Literal["OPTION", "FUTURES"]`): Тип инструмента.
220
224
  inst_family (`str | None`): Семейство инструментов (например, "BTC-USD"). Обязателен либо inst_family, либо inst_id.
221
- inst_id (`str | None`): ID инструмента. Обязателен либо inst_family, либо inst_id.
225
+ inst_id (`str | list[str] | None`): ID инструмента или список ID. Обязателен либо inst_family, либо inst_id.
222
226
 
223
227
  Возвращает:
224
228
  `Websocket`: Объект для управления вебсокет соединением.
@@ -228,17 +232,18 @@ class WebsocketManager:
228
232
  if inst_family and inst_id:
229
233
  raise ValueError("Only one of inst_family or inst_id should be provided")
230
234
 
231
- args: dict[str, str] = {
235
+ base_args: dict[str, str] = {
232
236
  "channel": "estimated-price",
233
237
  "instType": inst_type,
234
238
  }
235
239
 
236
240
  if inst_family:
237
- args["instFamily"] = inst_family
238
- if inst_id:
239
- args["instId"] = inst_id
241
+ base_args["instFamily"] = inst_family
242
+ args = [base_args]
243
+ else:
244
+ args = self._build_inst_id_args(base_args, inst_id) # type: ignore
240
245
 
241
- subscription_message = self._build_subscription_message([args])
246
+ subscription_message = self._build_subscription_message(args)
242
247
 
243
248
  return Websocket(
244
249
  callback=callback,
@@ -250,7 +255,7 @@ class WebsocketManager:
250
255
  def mark_price(
251
256
  self,
252
257
  callback: CallbackType,
253
- inst_id: str,
258
+ inst_id: str | list[str],
254
259
  ) -> Websocket:
255
260
  """Создает вебсокет для получения маркировочной цены.
256
261
 
@@ -258,19 +263,18 @@ class WebsocketManager:
258
263
 
259
264
  Параметры:
260
265
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
261
- inst_id (`str`): ID инструмента (например, "LTC-USD-190628").
266
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "LTC-USD-190628").
262
267
 
263
268
  Возвращает:
264
269
  `Websocket`: Объект для управления вебсокет соединением.
265
270
  """
266
- subscription_message = self._build_subscription_message(
267
- [
268
- {
269
- "channel": "mark-price",
270
- "instId": inst_id,
271
- }
272
- ]
271
+ args = self._build_inst_id_args(
272
+ {
273
+ "channel": "mark-price",
274
+ },
275
+ inst_id,
273
276
  )
277
+ subscription_message = self._build_subscription_message(args)
274
278
 
275
279
  return Websocket(
276
280
  callback=callback,
@@ -282,7 +286,7 @@ class WebsocketManager:
282
286
  def index_tickers(
283
287
  self,
284
288
  callback: CallbackType,
285
- inst_id: str,
289
+ inst_id: str | list[str],
286
290
  ) -> Websocket:
287
291
  """Создает вебсокет для получения данных индексных тикеров.
288
292
 
@@ -290,19 +294,18 @@ class WebsocketManager:
290
294
 
291
295
  Параметры:
292
296
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
293
- inst_id (`str`): Индекс с USD, USDT, BTC, USDC в качестве котируемой валюты (например, "BTC-USDT").
297
+ inst_id (`str | list[str]`): Индекс или список индексов (например, "BTC-USDT").
294
298
 
295
299
  Возвращает:
296
300
  `Websocket`: Объект для управления вебсокет соединением.
297
301
  """
298
- subscription_message = self._build_subscription_message(
299
- [
300
- {
301
- "channel": "index-tickers",
302
- "instId": inst_id,
303
- }
304
- ]
302
+ args = self._build_inst_id_args(
303
+ {
304
+ "channel": "index-tickers",
305
+ },
306
+ inst_id,
305
307
  )
308
+ subscription_message = self._build_subscription_message(args)
306
309
 
307
310
  return Websocket(
308
311
  callback=callback,
@@ -343,7 +346,7 @@ class WebsocketManager:
343
346
  "12Hutc",
344
347
  "6Hutc",
345
348
  ],
346
- inst_id: str,
349
+ inst_id: str | list[str],
347
350
  ) -> Websocket:
348
351
  """Создает вебсокет для получения данных свечей маркировочной цены.
349
352
 
@@ -352,20 +355,19 @@ class WebsocketManager:
352
355
  Параметры:
353
356
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
354
357
  interval (`Literal`): Интервал свечей.
355
- inst_id (`str`): ID инструмента (например, "BTC-USD-190628").
358
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USD-190628").
356
359
 
357
360
  Возвращает:
358
361
  `Websocket`: Объект для управления вебсокет соединением.
359
362
  """
360
363
  channel = f"mark-price-candle{interval}"
361
- subscription_message = self._build_subscription_message(
362
- [
363
- {
364
- "channel": channel,
365
- "instId": inst_id,
366
- }
367
- ]
364
+ args = self._build_inst_id_args(
365
+ {
366
+ "channel": channel,
367
+ },
368
+ inst_id,
368
369
  )
370
+ subscription_message = self._build_subscription_message(args)
369
371
 
370
372
  return Websocket(
371
373
  callback=callback,
@@ -405,7 +407,7 @@ class WebsocketManager:
405
407
  "12Hutc",
406
408
  "6Hutc",
407
409
  ],
408
- inst_id: str,
410
+ inst_id: str | list[str],
409
411
  ) -> Websocket:
410
412
  """Создает вебсокет для получения данных свечей индекса.
411
413
 
@@ -414,20 +416,19 @@ class WebsocketManager:
414
416
  Параметры:
415
417
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
416
418
  interval (`Literal`): Интервал свечей.
417
- inst_id (`str`): Индекс (например, "BTC-USD").
419
+ inst_id (`str | list[str]`): Индекс или список индексов (например, "BTC-USD").
418
420
 
419
421
  Возвращает:
420
422
  `Websocket`: Объект для управления вебсокет соединением.
421
423
  """
422
424
  channel = f"index-candle{interval}"
423
- subscription_message = self._build_subscription_message(
424
- [
425
- {
426
- "channel": channel,
427
- "instId": inst_id,
428
- }
429
- ]
425
+ args = self._build_inst_id_args(
426
+ {
427
+ "channel": channel,
428
+ },
429
+ inst_id,
430
430
  )
431
+ subscription_message = self._build_subscription_message(args)
431
432
 
432
433
  return Websocket(
433
434
  callback=callback,
@@ -506,7 +507,7 @@ class WebsocketManager:
506
507
  def tickers(
507
508
  self,
508
509
  callback: CallbackType,
509
- inst_id: str,
510
+ inst_id: str | list[str],
510
511
  ) -> Websocket:
511
512
  """Создает вебсокет для получения последней цены сделки, цены bid, цены ask и 24-часового объема торгов.
512
513
 
@@ -514,19 +515,18 @@ class WebsocketManager:
514
515
 
515
516
  Параметры:
516
517
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
517
- inst_id (`str`): ID инструмента (например, "BTC-USDT").
518
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USDT").
518
519
 
519
520
  Возвращает:
520
521
  `Websocket`: Объект для управления вебсокет соединением.
521
522
  """
522
- subscription_message = self._build_subscription_message(
523
- [
524
- {
525
- "channel": "tickers",
526
- "instId": inst_id,
527
- }
528
- ]
523
+ args = self._build_inst_id_args(
524
+ {
525
+ "channel": "tickers",
526
+ },
527
+ inst_id,
529
528
  )
529
+ subscription_message = self._build_subscription_message(args)
530
530
 
531
531
  return Websocket(
532
532
  callback=callback,
@@ -567,7 +567,7 @@ class WebsocketManager:
567
567
  "12Hutc",
568
568
  "6Hutc",
569
569
  ],
570
- inst_id: str,
570
+ inst_id: str | list[str],
571
571
  ) -> Websocket:
572
572
  """Создает вебсокет для получения данных свечей инструмента.
573
573
 
@@ -576,19 +576,18 @@ class WebsocketManager:
576
576
  Параметры:
577
577
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
578
578
  interval (`Literal`): Интервал свечей.
579
- inst_id (`str`): ID инструмента (например, "BTC-USDT").
579
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USDT").
580
580
 
581
581
  Возвращает:
582
582
  `Websocket`: Объект для управления вебсокет соединением.
583
583
  """
584
- subscription_message = self._build_subscription_message(
585
- [
586
- {
587
- "channel": f"candle{interval}",
588
- "instId": inst_id,
589
- }
590
- ]
584
+ args = self._build_inst_id_args(
585
+ {
586
+ "channel": f"candle{interval}",
587
+ },
588
+ inst_id,
591
589
  )
590
+ subscription_message = self._build_subscription_message(args)
592
591
 
593
592
  return Websocket(
594
593
  callback=callback,
@@ -600,7 +599,7 @@ class WebsocketManager:
600
599
  def trades(
601
600
  self,
602
601
  callback: CallbackType,
603
- inst_id: str,
602
+ inst_id: str | list[str],
604
603
  ) -> Websocket:
605
604
  """Создает вебсокет для получения данных о последних сделках.
606
605
 
@@ -608,19 +607,18 @@ class WebsocketManager:
608
607
 
609
608
  Параметры:
610
609
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
611
- inst_id (`str`): ID инструмента (например, "BTC-USDT").
610
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USDT").
612
611
 
613
612
  Возвращает:
614
613
  `Websocket`: Объект для управления вебсокет соединением.
615
614
  """
616
- subscription_message = self._build_subscription_message(
617
- [
618
- {
619
- "channel": "trades",
620
- "instId": inst_id,
621
- }
622
- ]
615
+ args = self._build_inst_id_args(
616
+ {
617
+ "channel": "trades",
618
+ },
619
+ inst_id,
623
620
  )
621
+ subscription_message = self._build_subscription_message(args)
624
622
 
625
623
  return Websocket(
626
624
  callback=callback,
@@ -632,7 +630,7 @@ class WebsocketManager:
632
630
  def all_trades(
633
631
  self,
634
632
  callback: CallbackType,
635
- inst_id: str,
633
+ inst_id: str | list[str],
636
634
  ) -> Websocket:
637
635
  """Создает вебсокет для получения данных о всех сделках (по одной сделке на обновление).
638
636
 
@@ -640,19 +638,18 @@ class WebsocketManager:
640
638
 
641
639
  Параметры:
642
640
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
643
- inst_id (`str`): ID инструмента (например, "BTC-USDT").
641
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USDT").
644
642
 
645
643
  Возвращает:
646
644
  `Websocket`: Объект для управления вебсокет соединением.
647
645
  """
648
- subscription_message = self._build_subscription_message(
649
- [
650
- {
651
- "channel": "trades-all",
652
- "instId": inst_id,
653
- }
654
- ]
646
+ args = self._build_inst_id_args(
647
+ {
648
+ "channel": "trades-all",
649
+ },
650
+ inst_id,
655
651
  )
652
+ subscription_message = self._build_subscription_message(args)
656
653
 
657
654
  return Websocket(
658
655
  callback=callback,
@@ -665,7 +662,7 @@ class WebsocketManager:
665
662
  self,
666
663
  callback: CallbackType,
667
664
  channel: Literal["books", "books5", "bbo-tbt", "books50-l2-tbt", "books-l2-tbt"],
668
- inst_id: str,
665
+ inst_id: str | list[str],
669
666
  ) -> Websocket:
670
667
  """Создает вебсокет для получения данных ордербука.
671
668
 
@@ -674,19 +671,18 @@ class WebsocketManager:
674
671
  Параметры:
675
672
  callback (`CallbackType`): Асинхронная функция обратного вызова для обработки сообщений.
676
673
  channel (`Literal["books", "books5", "bbo-tbt", "books50-l2-tbt", "books-l2-tbt"]`): Тип канала ордербука.
677
- inst_id (`str`): ID инструмента (например, "BTC-USDT").
674
+ inst_id (`str | list[str]`): ID инструмента или список ID (например, "BTC-USDT").
678
675
 
679
676
  Возвращает:
680
677
  `Websocket`: Объект для управления вебсокет соединением.
681
678
  """
682
- subscription_message = self._build_subscription_message(
683
- [
684
- {
685
- "channel": channel,
686
- "instId": inst_id,
687
- }
688
- ]
679
+ args = self._build_inst_id_args(
680
+ {
681
+ "channel": channel,
682
+ },
683
+ inst_id,
689
684
  )
685
+ subscription_message = self._build_subscription_message(args)
690
686
 
691
687
  return Websocket(
692
688
  callback=callback,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unicex
3
- Version: 0.17.4
3
+ Version: 0.17.6
4
4
  Summary: Unified Crypto Exchange API
5
5
  Author-email: LoveBloodAndDiamonds <ayazshakirzyanov27@gmail.com>
6
6
  License: BSD 3-Clause License
@@ -8,7 +8,7 @@ unicex/utils.py,sha256=1iK-ifZ-hUaU4Z-YCLoZsjAZREfJO7amYsjzG70JEk8,9963
8
8
  unicex/_abc/__init__.py,sha256=fxZjNFJFeFwWTXz8iSDe7eCWwE6xfFwFwAuG6l-TI8A,289
9
9
  unicex/_abc/exchange_info.py,sha256=TP_theOj1JS3Dcx5hqGT1yma1Jed776N4okOKXB7ePw,9537
10
10
  unicex/_abc/uni_client.py,sha256=-kFVA2W2Nm50ZbTzxzrRqbh_To3vSrPNE9IxdfxCCVI,14946
11
- unicex/_abc/uni_websocket_manager.py,sha256=fhZh2e2EDnt7YejCa0Uk3oqmg0OOcL8Kp5Ts0F9tpco,10744
11
+ unicex/_abc/uni_websocket_manager.py,sha256=SmaPWYuHTcFyhPPIHFKqotUfPm9AO5p9afJydQPzuaM,10742
12
12
  unicex/_base/__init__.py,sha256=0TmevATGnRB3qow6tkCR8dQKNZCWKeib6YQjNJ4a1b0,236
13
13
  unicex/_base/client.py,sha256=GuWfNNO6jVLAN-YUNKLmd-W5AfRelJIgKUe7vIQ12Qk,9318
14
14
  unicex/_base/websocket.py,sha256=F6fwFeDkn6GLI0IC0g_SNOrfCJw4RR3Uqo8JMWkCApc,13422
@@ -41,7 +41,7 @@ unicex/bitget/adapter.py,sha256=uxBO9fI_3DPP6BsZHMYO0qIufWSGev2sGoidgOSnves,7747
41
41
  unicex/bitget/client.py,sha256=0NFOixkMb0AcC5e-LytUd4Y1jxCO6Lv6-I4XlOGNtxQ,90618
42
42
  unicex/bitget/exchange_info.py,sha256=_UMvAqP0zcpmv9dkovkFxrXLlol6q8_v7-0sy6FSfrE,1959
43
43
  unicex/bitget/uni_client.py,sha256=MrXAmthTDTEQZ1ZY3LuqkCKL1bw_mKHMdiV4XiRFO-M,8641
44
- unicex/bitget/uni_websocket_manager.py,sha256=BAeH6GwVdYjpxe5xw1K7jrAyH6Lj02xawiv9kXvksLE,11105
44
+ unicex/bitget/uni_websocket_manager.py,sha256=7NV51eC8RysHSBf4CcnIH5irzVzSIMhTfpl2vLKHL1A,11615
45
45
  unicex/bitget/user_websocket.py,sha256=tlkv7Rmsw_FSfCJnEMOK_9jRsXRk2Ah_slqG8C-uhuo,129
46
46
  unicex/bitget/websocket_manager.py,sha256=Tra_E_z1QQ_snFYwqa49FmU-uWISYnbyJK5e7zqb48o,9765
47
47
  unicex/bybit/__init__.py,sha256=SrMBh6K5zUt4JheWUpNUYNb1NCDr2ujTFv4IDguaGZI,926
@@ -57,7 +57,7 @@ unicex/gate/adapter.py,sha256=pPp4Syz99gmfkceoaA5rLcApPNj099SNtQNalFLA-ek,11163
57
57
  unicex/gate/client.py,sha256=Mu8qropad8DTSDuG6mxyn6ZW2hwQK47PZnfb5yOEt2M,53828
58
58
  unicex/gate/exchange_info.py,sha256=ANzfe4mqxtLnj2TBJJxoc31KUosvxdApp1_xYrRNQDs,2300
59
59
  unicex/gate/uni_client.py,sha256=wqYj6mh7htMXW3a7Kl39d2zWObNhBUrfH2_QmsJa9qI,9621
60
- unicex/gate/uni_websocket_manager.py,sha256=dESHYEPf832b5tdMwo_9wdMaE6I_ZOKwEtnhnuofx_c,11285
60
+ unicex/gate/uni_websocket_manager.py,sha256=jZkikzFvADPRatluwlm78UPyHof_wFC8BRekpJbVGvE,11895
61
61
  unicex/gate/user_websocket.py,sha256=4qZX9N2RjlJ-e25Eszz12OeCM17j5DdXVimBVaLj53w,129
62
62
  unicex/gate/websocket_manager.py,sha256=phtHbvAGQD3mtewCUxBuuD1Nj0FXN6oZrd7tnmT7c2c,25832
63
63
  unicex/hyperliquid/__init__.py,sha256=qGTAkwfXLvknvHET_iA7Qml3jkxxxA0moU_98nGTcVU,944
@@ -81,7 +81,7 @@ unicex/mexc/adapter.py,sha256=OGlTAJ0IRg4YVu9cMKDH9orPd6FnIUDqKO8jHa_BpQs,13631
81
81
  unicex/mexc/client.py,sha256=FBUSs4Hu2DExVKPKJG9OawbqidACPFJ1U_1md05E3Mc,31004
82
82
  unicex/mexc/exchange_info.py,sha256=z2bQsVU0ciXV2_DFkueZHo1X35KIK2alD-7ZZjNg5Kc,1763
83
83
  unicex/mexc/uni_client.py,sha256=ldsFyE02x3cHjUDzGXMcWRVNkdiYWhrqrFZt2auas_4,9454
84
- unicex/mexc/uni_websocket_manager.py,sha256=TIaIWsjK1N5bqtBHqOafzEyKpSnb30O3uIx6aCS8lOY,11307
84
+ unicex/mexc/uni_websocket_manager.py,sha256=nsiKCkB3aJbLsz5sj7HTZYAjmEW4webmq2Kmi2cgX6g,11521
85
85
  unicex/mexc/user_websocket.py,sha256=l77-e6i0B2btd7a5IcCytbgswnV171NqOhunTcbaq48,127
86
86
  unicex/mexc/websocket_manager.py,sha256=0VhgXJil4xXm-YLuW2WVT7REv0oaivd9nZ4VI14rUzI,22926
87
87
  unicex/mexc/_spot_ws_proto/PrivateAccountV3Api_pb2.py,sha256=3bP1pGjeO-Norp7DhhdrQ4FcQTEKkCiL2mLagyoJHp8,1879
@@ -107,11 +107,11 @@ unicex/okx/adapter.py,sha256=4MpQh12nzlzB0HbOCHItYoWNFXbFCe9DntVC0smm-PY,7609
107
107
  unicex/okx/client.py,sha256=N7ma49ToMGjYiTvuoV52-NaG-vLx3s087KF67dQCRBs,91079
108
108
  unicex/okx/exchange_info.py,sha256=z2GrMkhZSJLdLsscqIfwQnWlnsX-RWPqGIbVfVbOVg4,1786
109
109
  unicex/okx/uni_client.py,sha256=fQVR4kz_2UvWD6V-MRlVVyAfaNIh2Q3PxpIgJrXY5hc,8702
110
- unicex/okx/uni_websocket_manager.py,sha256=wrROl5RmxCJC8o_k6mc1UufbNsOKTRhIFqq5yinXUBQ,11626
110
+ unicex/okx/uni_websocket_manager.py,sha256=7sDkZgmAyiWj3_3SfEHcPlFSVBhxSOuhOXTZlb0h3eY,11934
111
111
  unicex/okx/user_websocket.py,sha256=8c9kpm-xVa729pW93OKUGLHaE9MY0uzEpjIgNIFRF80,126
112
- unicex/okx/websocket_manager.py,sha256=3sXjN0BJGyj2aK05J4WJ_-hhwaSX9PvzhaZri86OlZg,25038
113
- unicex-0.17.4.dist-info/licenses/LICENSE,sha256=lNNK4Vqak9cXm6qVJLhbqS7iR_BMj6k7fd7XQ6l1k54,1507
114
- unicex-0.17.4.dist-info/METADATA,sha256=t8QiIT1B1ftsjmKVjhiuasZN-F4Shd7Xa0ymmnoyZjY,12090
115
- unicex-0.17.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
116
- unicex-0.17.4.dist-info/top_level.txt,sha256=_7rar-0OENIg4KRy6cgjWiebFYAJhjKEcMggAocGWG4,7
117
- unicex-0.17.4.dist-info/RECORD,,
112
+ unicex/okx/websocket_manager.py,sha256=Rk1GM_zdX5wRa92KCizduHnAGi2shXB9oEZFQJUbeAc,26070
113
+ unicex-0.17.6.dist-info/licenses/LICENSE,sha256=lNNK4Vqak9cXm6qVJLhbqS7iR_BMj6k7fd7XQ6l1k54,1507
114
+ unicex-0.17.6.dist-info/METADATA,sha256=WX88gliaDuaSAeSuGM0iykj70UlSDjFZzUxdQU-t1SM,12090
115
+ unicex-0.17.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
116
+ unicex-0.17.6.dist-info/top_level.txt,sha256=_7rar-0OENIg4KRy6cgjWiebFYAJhjKEcMggAocGWG4,7
117
+ unicex-0.17.6.dist-info/RECORD,,