ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.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.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3104 -880
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +557 -323
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1633 -268
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3104 -880
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +557 -323
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1632 -268
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/hitbtc.py CHANGED
@@ -10,8 +10,8 @@ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, Ord
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
- from ccxt.base.errors import NotSupported
14
13
  from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import NotSupported
15
15
 
16
16
 
17
17
  class hitbtc(ccxt.async_support.hitbtc):
@@ -22,7 +22,9 @@ class hitbtc(ccxt.async_support.hitbtc):
22
22
  'ws': True,
23
23
  'watchTicker': True,
24
24
  'watchTickers': True,
25
+ 'watchBidsAsks': True,
25
26
  'watchTrades': True,
27
+ 'watchTradesForSymbols': False,
26
28
  'watchOrderBook': True,
27
29
  'watchBalance': True,
28
30
  'watchOrders': True,
@@ -55,8 +57,11 @@ class hitbtc(ccxt.async_support.hitbtc):
55
57
  'watchTickers': {
56
58
  'method': 'ticker/{speed}', # 'ticker/{speed}','ticker/price/{speed}', 'ticker/{speed}/batch', or 'ticker/{speed}/price/batch''
57
59
  },
60
+ 'watchBidsAsks': {
61
+ 'method': 'orderbook/top/{speed}', # 'orderbook/top/{speed}', 'orderbook/top/{speed}/batch'
62
+ },
58
63
  'watchOrderBook': {
59
- 'method': 'orderbook/full', # 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch', 'orderbook/top/{speed}', or 'orderbook/top/{speed}/batch'
64
+ 'method': 'orderbook/full', # 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
60
65
  },
61
66
  },
62
67
  'timeframes': {
@@ -78,9 +83,11 @@ class hitbtc(ccxt.async_support.hitbtc):
78
83
 
79
84
  async def authenticate(self):
80
85
  """
81
- * @ignore
86
+ @ignore
82
87
  authenticates the user to access private web socket channels
83
- :see: https://api.hitbtc.com/#socket-authentication
88
+
89
+ https://api.hitbtc.com/#socket-authentication
90
+
84
91
  :returns dict: response from exchange
85
92
  """
86
93
  self.check_required_credentials()
@@ -92,7 +99,7 @@ class hitbtc(ccxt.async_support.hitbtc):
92
99
  if authenticated is None:
93
100
  timestamp = self.milliseconds()
94
101
  signature = self.hmac(self.encode(self.number_to_string(timestamp)), self.encode(self.secret), hashlib.sha256, 'hex')
95
- request = {
102
+ request: dict = {
96
103
  'method': 'login',
97
104
  'params': {
98
105
  'type': 'HS256',
@@ -119,31 +126,37 @@ class hitbtc(ccxt.async_support.hitbtc):
119
126
  # }
120
127
  # }
121
128
  #
122
- return future
129
+ return await future
123
130
 
124
131
  async def subscribe_public(self, name: str, messageHashPrefix: str, symbols: Strings = None, params={}):
125
132
  """
126
- * @ignore
133
+ @ignore
127
134
  :param str name: websocket endpoint name
135
+ :param str messageHashPrefix: prefix for the message hash
128
136
  :param str[] [symbols]: unified CCXT symbol(s)
129
137
  :param dict [params]: extra parameters specific to the hitbtc api
130
138
  """
131
139
  await self.load_markets()
140
+ symbols = self.market_symbols(symbols)
141
+ isBatch = name.find('batch') >= 0
132
142
  url = self.urls['api']['ws']['public']
133
- messageHash = messageHashPrefix
134
- if symbols is not None:
135
- messageHash = messageHash + '::' + ','.join(symbols)
136
- subscribe = {
143
+ messageHashes = []
144
+ if symbols is not None and not isBatch:
145
+ for i in range(0, len(symbols)):
146
+ messageHashes.append(messageHashPrefix + '::' + symbols[i])
147
+ else:
148
+ messageHashes.append(messageHashPrefix)
149
+ subscribe: dict = {
137
150
  'method': 'subscribe',
138
151
  'id': self.nonce(),
139
152
  'ch': name,
140
153
  }
141
154
  request = self.extend(subscribe, params)
142
- return await self.watch(url, messageHash, request, messageHash)
155
+ return await self.watch_multiple(url, messageHashes, request, messageHashes)
143
156
 
144
157
  async def subscribe_private(self, name: str, symbol: Str = None, params={}):
145
158
  """
146
- * @ignore
159
+ @ignore
147
160
  :param str name: websocket endpoint name
148
161
  :param str [symbol]: unified CCXT symbol
149
162
  :param dict [params]: extra parameters specific to the hitbtc api
@@ -155,7 +168,7 @@ class hitbtc(ccxt.async_support.hitbtc):
155
168
  messageHash = self.safe_string(splitName, 0)
156
169
  if symbol is not None:
157
170
  messageHash = messageHash + '::' + symbol
158
- subscribe = {
171
+ subscribe: dict = {
159
172
  'method': name,
160
173
  'params': params,
161
174
  'id': self.nonce(),
@@ -164,16 +177,15 @@ class hitbtc(ccxt.async_support.hitbtc):
164
177
 
165
178
  async def trade_request(self, name: str, params={}):
166
179
  """
167
- * @ignore
180
+ @ignore
168
181
  :param str name: websocket endpoint name
169
- :param str [symbol]: unified CCXT symbol
170
182
  :param dict [params]: extra parameters specific to the hitbtc api
171
183
  """
172
184
  await self.load_markets()
173
185
  await self.authenticate()
174
186
  url = self.urls['api']['ws']['private']
175
187
  messageHash = str(self.nonce())
176
- subscribe = {
188
+ subscribe: dict = {
177
189
  'method': name,
178
190
  'params': params,
179
191
  'id': messageHash,
@@ -183,15 +195,17 @@ class hitbtc(ccxt.async_support.hitbtc):
183
195
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
184
196
  """
185
197
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
186
- :see: https://api.hitbtc.com/#subscribe-to-full-order-book
187
- :see: https://api.hitbtc.com/#subscribe-to-partial-order-book
188
- :see: https://api.hitbtc.com/#subscribe-to-partial-order-book-in-batches
189
- :see: https://api.hitbtc.com/#subscribe-to-top-of-book
190
- :see: https://api.hitbtc.com/#subscribe-to-top-of-book-in-batches
198
+
199
+ https://api.hitbtc.com/#subscribe-to-full-order-book
200
+ https://api.hitbtc.com/#subscribe-to-partial-order-book
201
+ https://api.hitbtc.com/#subscribe-to-partial-order-book-in-batches
202
+ https://api.hitbtc.com/#subscribe-to-top-of-book
203
+ https://api.hitbtc.com/#subscribe-to-top-of-book-in-batches
204
+
191
205
  :param str symbol: unified symbol of the market to fetch the order book for
192
206
  :param int [limit]: the maximum amount of order book entries to return
193
207
  :param dict [params]: extra parameters specific to the exchange API endpoint
194
- :param str [params.method]: 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch', 'orderbook/top/{speed}', or 'orderbook/top/{speed}/batch'
208
+ :param str [params.method]: 'orderbook/full', 'orderbook/{depth}/{speed}', 'orderbook/{depth}/{speed}/batch'
195
209
  :param int [params.depth]: 5 , 10, or 20(default)
196
210
  :param int [params.speed]: 100(default), 500, or 1000
197
211
  :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
@@ -205,12 +219,8 @@ class hitbtc(ccxt.async_support.hitbtc):
205
219
  name = 'orderbook/D' + depth + '/' + speed + 'ms'
206
220
  elif name == 'orderbook/{depth}/{speed}/batch':
207
221
  name = 'orderbook/D' + depth + '/' + speed + 'ms/batch'
208
- elif name == 'orderbook/top/{speed}':
209
- name = 'orderbook/top/' + speed + 'ms'
210
- elif name == 'orderbook/top/{speed}/batch':
211
- name = 'orderbook/top/' + speed + 'ms/batch'
212
222
  market = self.market(symbol)
213
- request = {
223
+ request: dict = {
214
224
  'params': {
215
225
  'symbols': [market['id']],
216
226
  },
@@ -287,43 +297,34 @@ class hitbtc(ccxt.async_support.hitbtc):
287
297
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
288
298
  """
289
299
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
290
- :see: https://api.hitbtc.com/#subscribe-to-ticker
291
- :see: https://api.hitbtc.com/#subscribe-to-ticker-in-batches
292
- :see: https://api.hitbtc.com/#subscribe-to-mini-ticker
293
- :see: https://api.hitbtc.com/#subscribe-to-mini-ticker-in-batches
300
+
301
+ https://api.hitbtc.com/#subscribe-to-ticker
302
+ https://api.hitbtc.com/#subscribe-to-ticker-in-batches
303
+ https://api.hitbtc.com/#subscribe-to-mini-ticker
304
+ https://api.hitbtc.com/#subscribe-to-mini-ticker-in-batches
305
+
294
306
  :param str symbol: unified symbol of the market to fetch the ticker for
295
307
  :param dict [params]: extra parameters specific to the exchange API endpoint
296
308
  :param str [params.method]: 'ticker/{speed}'(default), or 'ticker/price/{speed}'
297
309
  :param str [params.speed]: '1s'(default), or '3s'
298
310
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
299
311
  """
300
- options = self.safe_value(self.options, 'watchTicker')
301
- defaultMethod = self.safe_string(options, 'method', 'ticker/{speed}')
302
- method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
303
- speed = self.safe_string(params, 'speed', '1s')
304
- name = self.implode_params(method, {'speed': speed})
305
- params = self.omit(params, ['method', 'speed'])
306
- market = self.market(symbol)
307
- request = {
308
- 'params': {
309
- 'symbols': [market['id']],
310
- },
311
- }
312
- result = await self.subscribe_public(name, 'tickers', [symbol], self.deep_extend(request, params))
313
- return self.safe_value(result, symbol)
312
+ ticker = await self.watch_tickers([symbol], params)
313
+ return self.safe_value(ticker, symbol)
314
314
 
315
315
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
316
316
  """
317
317
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
318
- :param str symbol: unified symbol of the market to fetch the ticker for
318
+ :param str[] [symbols]:
319
319
  :param dict params: extra parameters specific to the exchange API endpoint
320
- :param str params['method']: 'ticker/{speed}'(default),'ticker/price/{speed}', 'ticker/{speed}/batch', or 'ticker/{speed}/price/batch''
320
+ :param str params['method']: 'ticker/{speed}' ,'ticker/price/{speed}', 'ticker/{speed}/batch'(default), or 'ticker/{speed}/price/batch''
321
321
  :param str params['speed']: '1s'(default), or '3s'
322
322
  :returns dict: a `ticker structure <https://docs.ccxt.com/en/latest/manual.html#ticker-structure>`
323
323
  """
324
324
  await self.load_markets()
325
+ symbols = self.market_symbols(symbols)
325
326
  options = self.safe_value(self.options, 'watchTicker')
326
- defaultMethod = self.safe_string(options, 'method', 'ticker/{speed}')
327
+ defaultMethod = self.safe_string(options, 'method', 'ticker/{speed}/batch')
327
328
  method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
328
329
  speed = self.safe_string(params, 'speed', '1s')
329
330
  name = self.implode_params(method, {'speed': speed})
@@ -335,15 +336,18 @@ class hitbtc(ccxt.async_support.hitbtc):
335
336
  for i in range(0, len(symbols)):
336
337
  marketId = self.market_id(symbols[i])
337
338
  marketIds.append(marketId)
338
- request = {
339
+ request: dict = {
339
340
  'params': {
340
341
  'symbols': marketIds,
341
342
  },
342
343
  }
343
- tickers = await self.subscribe_public(name, 'tickers', symbols, self.deep_extend(request, params))
344
+ newTickers = await self.subscribe_public(name, 'tickers', symbols, self.deep_extend(request, params))
344
345
  if self.newUpdates:
345
- return tickers
346
- return self.filter_by_array(self.tickers, 'symbol', symbols)
346
+ if not isinstance(newTickers, list):
347
+ tickers: dict = {}
348
+ tickers[newTickers['symbol']] = newTickers
349
+ return tickers
350
+ return self.filter_by_array(newTickers, 'symbol', symbols)
347
351
 
348
352
  def handle_ticker(self, client: Client, message):
349
353
  #
@@ -386,27 +390,18 @@ class hitbtc(ccxt.async_support.hitbtc):
386
390
  #
387
391
  data = self.safe_value(message, 'data', {})
388
392
  marketIds = list(data.keys())
389
- newTickers = {}
393
+ result = []
394
+ topic = 'tickers'
390
395
  for i in range(0, len(marketIds)):
391
396
  marketId = marketIds[i]
392
397
  market = self.safe_market(marketId)
393
398
  symbol = market['symbol']
394
399
  ticker = self.parse_ws_ticker(data[marketId], market)
395
400
  self.tickers[symbol] = ticker
396
- newTickers[symbol] = ticker
397
- client.resolve(newTickers, 'tickers')
398
- messageHashes = self.find_message_hashes(client, 'tickers::')
399
- for i in range(0, len(messageHashes)):
400
- messageHash = messageHashes[i]
401
- parts = messageHash.split('::')
402
- symbolsString = parts[1]
403
- symbols = symbolsString.split(',')
404
- tickers = self.filter_by_array(newTickers, 'symbol', symbols)
405
- tickersSymbols = list(tickers.keys())
406
- numTickers = len(tickersSymbols)
407
- if numTickers > 0:
408
- client.resolve(tickers, messageHash)
409
- return message
401
+ result.append(ticker)
402
+ messageHash = topic + '::' + symbol
403
+ client.resolve(ticker, messageHash)
404
+ client.resolve(result, topic)
410
405
 
411
406
  def parse_ws_ticker(self, ticker, market=None):
412
407
  #
@@ -463,10 +458,89 @@ class hitbtc(ccxt.async_support.hitbtc):
463
458
  'info': ticker,
464
459
  }, market)
465
460
 
461
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
462
+ """
463
+ watches best bid & ask for symbols
464
+
465
+ https://api.hitbtc.com/#subscribe-to-top-of-book
466
+
467
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
468
+ :param dict [params]: extra parameters specific to the exchange API endpoint
469
+ :param str [params.method]: 'orderbook/top/{speed}' or 'orderbook/top/{speed}/batch(default)'
470
+ :param str [params.speed]: '100ms'(default) or '500ms' or '1000ms'
471
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
472
+ """
473
+ await self.load_markets()
474
+ symbols = self.market_symbols(symbols, None, False)
475
+ options = self.safe_value(self.options, 'watchBidsAsks')
476
+ defaultMethod = self.safe_string(options, 'method', 'orderbook/top/{speed}/batch')
477
+ method = self.safe_string_2(params, 'method', 'defaultMethod', defaultMethod)
478
+ speed = self.safe_string(params, 'speed', '100ms')
479
+ name = self.implode_params(method, {'speed': speed})
480
+ params = self.omit(params, ['method', 'speed'])
481
+ marketIds = self.market_ids(symbols)
482
+ request: dict = {
483
+ 'params': {
484
+ 'symbols': marketIds,
485
+ },
486
+ }
487
+ newTickers = await self.subscribe_public(name, 'bidask', symbols, self.deep_extend(request, params))
488
+ if self.newUpdates:
489
+ if not isinstance(newTickers, list):
490
+ tickers: dict = {}
491
+ tickers[newTickers['symbol']] = newTickers
492
+ return tickers
493
+ return self.filter_by_array(newTickers, 'symbol', symbols)
494
+
495
+ def handle_bid_ask(self, client: Client, message):
496
+ #
497
+ # {
498
+ # "ch": "orderbook/top/100ms", # or 'orderbook/top/100ms/batch'
499
+ # "data": {
500
+ # "BTCUSDT": {
501
+ # "t": 1727276919771,
502
+ # "a": "63931.45",
503
+ # "A": "0.02879",
504
+ # "b": "63926.97",
505
+ # "B": "0.00100"
506
+ # }
507
+ # }
508
+ # }
509
+ #
510
+ data = self.safe_dict(message, 'data', {})
511
+ marketIds = list(data.keys())
512
+ result = []
513
+ topic = 'bidask'
514
+ for i in range(0, len(marketIds)):
515
+ marketId = marketIds[i]
516
+ market = self.safe_market(marketId)
517
+ symbol = market['symbol']
518
+ ticker = self.parse_ws_bid_ask(data[marketId], market)
519
+ self.bidsasks[symbol] = ticker
520
+ result.append(ticker)
521
+ messageHash = topic + '::' + symbol
522
+ client.resolve(ticker, messageHash)
523
+ client.resolve(result, topic)
524
+
525
+ def parse_ws_bid_ask(self, ticker, market=None):
526
+ timestamp = self.safe_integer(ticker, 't')
527
+ return self.safe_ticker({
528
+ 'symbol': market['symbol'],
529
+ 'timestamp': timestamp,
530
+ 'datetime': self.iso8601(timestamp),
531
+ 'ask': self.safe_string(ticker, 'a'),
532
+ 'askVolume': self.safe_string(ticker, 'A'),
533
+ 'bid': self.safe_string(ticker, 'b'),
534
+ 'bidVolume': self.safe_string(ticker, 'B'),
535
+ 'info': ticker,
536
+ }, market)
537
+
466
538
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
467
539
  """
468
540
  get the list of most recent trades for a particular symbol
469
- :see: https://api.hitbtc.com/#subscribe-to-trades
541
+
542
+ https://api.hitbtc.com/#subscribe-to-trades
543
+
470
544
  :param str symbol: unified symbol of the market to fetch trades for
471
545
  :param int [since]: timestamp in ms of the earliest trade to fetch
472
546
  :param int [limit]: the maximum amount of trades to fetch
@@ -475,7 +549,7 @@ class hitbtc(ccxt.async_support.hitbtc):
475
549
  """
476
550
  await self.load_markets()
477
551
  market = self.market(symbol)
478
- request = {
552
+ request: dict = {
479
553
  'params': {
480
554
  'symbols': [market['id']],
481
555
  },
@@ -586,7 +660,9 @@ class hitbtc(ccxt.async_support.hitbtc):
586
660
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
587
661
  """
588
662
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
589
- :see: https://api.hitbtc.com/#subscribe-to-candles
663
+
664
+ https://api.hitbtc.com/#subscribe-to-candles
665
+
590
666
  :param str symbol: unified symbol of the market to fetch OHLCV data for
591
667
  :param str [timeframe]: the length of time each candle represents
592
668
  :param int [since]: not used by hitbtc watchOHLCV
@@ -597,7 +673,7 @@ class hitbtc(ccxt.async_support.hitbtc):
597
673
  period = self.safe_string(self.timeframes, timeframe, timeframe)
598
674
  name = 'candles/' + period
599
675
  market = self.market(symbol)
600
- request = {
676
+ request: dict = {
601
677
  'params': {
602
678
  'symbols': [market['id']],
603
679
  },
@@ -690,9 +766,11 @@ class hitbtc(ccxt.async_support.hitbtc):
690
766
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
691
767
  """
692
768
  watches information on multiple orders made by the user
693
- :see: https://api.hitbtc.com/#subscribe-to-reports
694
- :see: https://api.hitbtc.com/#subscribe-to-reports-2
695
- :see: https://api.hitbtc.com/#subscribe-to-reports-3
769
+
770
+ https://api.hitbtc.com/#subscribe-to-reports
771
+ https://api.hitbtc.com/#subscribe-to-reports-2
772
+ https://api.hitbtc.com/#subscribe-to-reports-3
773
+
696
774
  :param str [symbol]: unified CCXT market symbol
697
775
  :param int [since]: timestamp in ms of the earliest order to fetch
698
776
  :param int [limit]: the maximum amount of orders to fetch
@@ -920,12 +998,14 @@ class hitbtc(ccxt.async_support.hitbtc):
920
998
  async def watch_balance(self, params={}) -> Balances:
921
999
  """
922
1000
  watches balance updates, cannot subscribe to margin account balances
923
- :see: https://api.hitbtc.com/#subscribe-to-spot-balances
924
- :see: https://api.hitbtc.com/#subscribe-to-futures-balances
1001
+
1002
+ https://api.hitbtc.com/#subscribe-to-spot-balances
1003
+ https://api.hitbtc.com/#subscribe-to-futures-balances
1004
+
925
1005
  :param dict [params]: extra parameters specific to the exchange API endpoint
926
1006
  :param str [params.type]: 'spot', 'swap', or 'future'
927
- *
928
- * EXCHANGE SPECIFIC PARAMETERS
1007
+
1008
+ EXCHANGE SPECIFIC PARAMETERS
929
1009
  :param str [params.mode]: 'updates' or 'batches'(default), 'updates' = messages arrive after balance updates, 'batches' = messages arrive at equal intervals if there were any updates
930
1010
  :returns dict[]: a list of `balance structures <https://docs.ccxt.com/#/?id=balance-structure>`
931
1011
  """
@@ -939,7 +1019,7 @@ class hitbtc(ccxt.async_support.hitbtc):
939
1019
  })
940
1020
  mode = self.safe_string(params, 'mode', 'batches')
941
1021
  params = self.omit(params, 'mode')
942
- request = {
1022
+ request: dict = {
943
1023
  'mode': mode,
944
1024
  }
945
1025
  return await self.subscribe_private(name, None, self.extend(request, params))
@@ -947,14 +1027,16 @@ class hitbtc(ccxt.async_support.hitbtc):
947
1027
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
948
1028
  """
949
1029
  create a trade order
950
- :see: https://api.hitbtc.com/#create-new-spot-order
951
- :see: https://api.hitbtc.com/#create-margin-order
952
- :see: https://api.hitbtc.com/#create-futures-order
1030
+
1031
+ https://api.hitbtc.com/#create-new-spot-order
1032
+ https://api.hitbtc.com/#create-margin-order
1033
+ https://api.hitbtc.com/#create-futures-order
1034
+
953
1035
  :param str symbol: unified symbol of the market to create an order in
954
1036
  :param str type: 'market' or 'limit'
955
1037
  :param str side: 'buy' or 'sell'
956
1038
  :param float amount: how much of currency you want to trade in units of base currency
957
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1039
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
958
1040
  :param dict [params]: extra parameters specific to the exchange API endpoint
959
1041
  :param str [params.marginMode]: 'cross' or 'isolated' only 'isolated' is supported for spot-margin, swap supports both, default is 'cross'
960
1042
  :param bool [params.margin]: True for creating a margin order
@@ -981,9 +1063,11 @@ class hitbtc(ccxt.async_support.hitbtc):
981
1063
 
982
1064
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
983
1065
  """
984
- :see: https://api.hitbtc.com/#cancel-spot-order-2
985
- :see: https://api.hitbtc.com/#cancel-futures-order-2
986
- :see: https://api.hitbtc.com/#cancel-margin-order-2
1066
+
1067
+ https://api.hitbtc.com/#cancel-spot-order-2
1068
+ https://api.hitbtc.com/#cancel-futures-order-2
1069
+ https://api.hitbtc.com/#cancel-margin-order-2
1070
+
987
1071
  cancels an open order
988
1072
  :param str id: order id
989
1073
  :param str symbol: unified symbol of the market the order was made in
@@ -1012,8 +1096,10 @@ class hitbtc(ccxt.async_support.hitbtc):
1012
1096
 
1013
1097
  async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
1014
1098
  """
1015
- :see: https://api.hitbtc.com/#cancel-spot-orders
1016
- :see: https://api.hitbtc.com/#cancel-futures-order-3
1099
+
1100
+ https://api.hitbtc.com/#cancel-spot-orders
1101
+ https://api.hitbtc.com/#cancel-futures-order-3
1102
+
1017
1103
  cancel all open orders
1018
1104
  :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
1019
1105
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1038,9 +1124,11 @@ class hitbtc(ccxt.async_support.hitbtc):
1038
1124
 
1039
1125
  async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1040
1126
  """
1041
- :see: https://api.hitbtc.com/#get-active-futures-orders-2
1042
- :see: https://api.hitbtc.com/#get-margin-orders
1043
- :see: https://api.hitbtc.com/#get-active-spot-orders
1127
+
1128
+ https://api.hitbtc.com/#get-active-futures-orders-2
1129
+ https://api.hitbtc.com/#get-margin-orders
1130
+ https://api.hitbtc.com/#get-active-spot-orders
1131
+
1044
1132
  fetch all unfilled currently open orders
1045
1133
  :param str symbol: unified market symbol
1046
1134
  :param int [since]: the earliest time in ms to fetch open orders for
@@ -1052,7 +1140,7 @@ class hitbtc(ccxt.async_support.hitbtc):
1052
1140
  """
1053
1141
  await self.load_markets()
1054
1142
  market = None
1055
- request = {}
1143
+ request: dict = {}
1056
1144
  if symbol is not None:
1057
1145
  market = self.market(symbol)
1058
1146
  request['symbol'] = market['id']
@@ -1123,7 +1211,7 @@ class hitbtc(ccxt.async_support.hitbtc):
1123
1211
  # "id": 1700233093414
1124
1212
  # }
1125
1213
  #
1126
- messageHash = self.safe_integer(message, 'id')
1214
+ messageHash = self.safe_string(message, 'id')
1127
1215
  result = self.safe_value(message, 'result', {})
1128
1216
  if isinstance(result, list):
1129
1217
  parsedOrders = []
@@ -1137,16 +1225,22 @@ class hitbtc(ccxt.async_support.hitbtc):
1137
1225
  return message
1138
1226
 
1139
1227
  def handle_message(self, client: Client, message):
1140
- self.handle_error(client, message)
1228
+ if self.handle_error(client, message):
1229
+ return
1141
1230
  channel = self.safe_string_2(message, 'ch', 'method')
1142
1231
  if channel is not None:
1143
1232
  splitChannel = channel.split('/')
1144
1233
  channel = self.safe_string(splitChannel, 0)
1145
- methods = {
1234
+ if channel == 'orderbook':
1235
+ channel2 = self.safe_string(splitChannel, 1)
1236
+ if channel2 is not None and channel2 == 'top':
1237
+ channel = 'orderbook/top'
1238
+ methods: dict = {
1146
1239
  'candles': self.handle_ohlcv,
1147
1240
  'ticker': self.handle_ticker,
1148
1241
  'trades': self.handle_trades,
1149
1242
  'orderbook': self.handle_order_book,
1243
+ 'orderbook/top': self.handle_bid_ask,
1150
1244
  'spot_order': self.handle_order,
1151
1245
  'spot_orders': self.handle_order,
1152
1246
  'margin_order': self.handle_order,
@@ -1206,11 +1300,22 @@ class hitbtc(ccxt.async_support.hitbtc):
1206
1300
  #
1207
1301
  error = self.safe_value(message, 'error')
1208
1302
  if error is not None:
1209
- code = self.safe_value(error, 'code')
1210
- errorMessage = self.safe_string(error, 'message')
1211
- description = self.safe_string(error, 'description')
1212
- feedback = self.id + ' ' + description
1213
- self.throw_exactly_matched_exception(self.exceptions['exact'], code, feedback)
1214
- self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
1215
- raise ExchangeError(feedback) # unknown message
1303
+ try:
1304
+ code = self.safe_value(error, 'code')
1305
+ errorMessage = self.safe_string(error, 'message')
1306
+ description = self.safe_string(error, 'description')
1307
+ feedback = self.id + ' ' + description
1308
+ self.throw_exactly_matched_exception(self.exceptions['exact'], code, feedback)
1309
+ self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
1310
+ raise ExchangeError(feedback) # unknown message
1311
+ except Exception as e:
1312
+ if isinstance(e, AuthenticationError):
1313
+ messageHash = 'authenticated'
1314
+ client.reject(e, messageHash)
1315
+ if messageHash in client.subscriptions:
1316
+ del client.subscriptions[messageHash]
1317
+ else:
1318
+ id = self.safe_string(message, 'id')
1319
+ client.reject(e, id)
1320
+ return True
1216
1321
  return None