ccxt 4.2.76__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 +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -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 +3513 -1511
  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 +3105 -881
  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 +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  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 +403 -150
  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 +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  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 +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  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 +1473 -464
  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 +1634 -269
  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 +1050 -355
  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 +1777 -455
  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 +1155 -295
  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 +1729 -482
  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 +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  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 +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  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 +403 -150
  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 +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  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 +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  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 +1633 -269
  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 +1050 -355
  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 +1777 -455
  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 +63 -15
  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 +204 -82
  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 +967 -661
  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 +168 -32
  309. ccxt/pro/exmo.py +253 -21
  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 +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  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 +486 -70
  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} +465 -407
  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} +465 -409
  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 +1155 -295
  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.76.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.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/krakenfutures.py CHANGED
@@ -10,8 +10,8 @@ from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Stri
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 ArgumentsRequired
14
13
  from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import ArgumentsRequired
15
15
  from ccxt.base.precise import Precise
16
16
 
17
17
 
@@ -32,9 +32,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
32
32
  'fetchTradesWs': False,
33
33
  'watchOHLCV': False,
34
34
  'watchOrderBook': True,
35
+ 'watchOrderBookForSymbols': True,
35
36
  'watchTicker': True,
36
37
  'watchTickers': True,
38
+ 'watchBidsAsks': True,
37
39
  'watchTrades': True,
40
+ 'watchTradesForSymbols': True,
38
41
  'watchBalance': True,
39
42
  # 'watchStatus': True, # https://docs.futures.kraken.com/#websocket-api-public-feeds-heartbeat
40
43
  'watchOrders': True,
@@ -55,12 +58,6 @@ class krakenfutures(ccxt.async_support.krakenfutures):
55
58
  'OHLCVLimit': 1000,
56
59
  'connectionLimit': 100, # https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-subscriptions-limits
57
60
  'requestLimit': 100, # per second
58
- 'watchTicker': {
59
- 'method': 'ticker', # or ticker_lite
60
- },
61
- 'watchTickers': {
62
- 'method': 'ticker', # or ticker_lite
63
- },
64
61
  'fetchBalance': {
65
62
  'type': None,
66
63
  },
@@ -72,9 +69,11 @@ class krakenfutures(ccxt.async_support.krakenfutures):
72
69
 
73
70
  async def authenticate(self, params={}):
74
71
  """
75
- * @ignore
72
+ @ignore
76
73
  authenticates the user to access private web socket channels
77
- :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
74
+
75
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
76
+
78
77
  :returns dict: response from exchange
79
78
  """
80
79
  self.check_required_credentials()
@@ -85,20 +84,34 @@ class krakenfutures(ccxt.async_support.krakenfutures):
85
84
  url = self.urls['api']['ws']
86
85
  messageHash = 'challenge'
87
86
  client = self.client(url)
88
- future = self.safe_value(client.subscriptions, messageHash)
89
- if future is None:
90
- request = {
87
+ future = client.future(messageHash)
88
+ authenticated = self.safe_value(client.subscriptions, messageHash)
89
+ if authenticated is None:
90
+ request: dict = {
91
91
  'event': 'challenge',
92
92
  'api_key': self.apiKey,
93
93
  }
94
94
  message = self.extend(request, params)
95
- future = await self.watch(url, messageHash, message)
96
- client.subscriptions[messageHash] = future
97
- return future
95
+ self.watch(url, messageHash, message, messageHash)
96
+ return await future
97
+
98
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
99
+ """
100
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
101
+
102
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
103
+
104
+ :param str[] symbols: unified array of symbols
105
+ :param int [limit]: the maximum amount of order book entries to return
106
+ :param dict [params]: extra parameters specific to the exchange API endpoint
107
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
108
+ """
109
+ orderbook = await self.watch_multi_helper('orderbook', 'book', symbols, {'limit': limit}, params)
110
+ return orderbook.limit()
98
111
 
99
112
  async def subscribe_public(self, name: str, symbols: List[str], params={}):
100
113
  """
101
- * @ignore
114
+ @ignore
102
115
  Connects to a websocket channel
103
116
  :param str name: name of the channel
104
117
  :param str[] symbols: CCXT market symbols
@@ -107,7 +120,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
107
120
  """
108
121
  await self.load_markets()
109
122
  url = self.urls['api']['ws']
110
- subscribe = {
123
+ subscribe: dict = {
111
124
  'event': 'subscribe',
112
125
  'feed': name,
113
126
  }
@@ -128,17 +141,17 @@ class krakenfutures(ccxt.async_support.krakenfutures):
128
141
 
129
142
  async def subscribe_private(self, name: str, messageHash: str, params={}):
130
143
  """
131
- * @ignore
144
+ @ignore
132
145
  Connects to a websocket channel
133
146
  :param str name: name of the channel
134
- :param str[] symbols: CCXT market symbols
147
+ :param str messageHash: unique identifier for the message
135
148
  :param dict [params]: extra parameters specific to the krakenfutures api
136
149
  :returns dict: data from the websocket stream
137
150
  """
138
151
  await self.load_markets()
139
152
  await self.authenticate()
140
153
  url = self.urls['api']['ws']
141
- subscribe = {
154
+ subscribe: dict = {
142
155
  'event': 'subscribe',
143
156
  'feed': name,
144
157
  'api_key': self.apiKey,
@@ -151,70 +164,109 @@ class krakenfutures(ccxt.async_support.krakenfutures):
151
164
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
152
165
  """
153
166
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
154
- :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
167
+
168
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
169
+
155
170
  :param str symbol: unified symbol of the market to fetch the ticker for
156
171
  :param dict [params]: extra parameters specific to the exchange API endpoint
157
172
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
158
173
  """
159
- options = self.safe_value(self.options, 'watchTicker')
160
- method = self.safe_string(options, 'method', 'ticker') # or ticker_lite
161
- name = self.safe_string(params, 'method', method)
162
- params = self.omit(params, ['method'])
163
- return await self.subscribe_public(name, [symbol], params)
174
+ await self.load_markets()
175
+ symbol = self.symbol(symbol)
176
+ tickers = await self.watch_tickers([symbol], params)
177
+ return tickers[symbol]
164
178
 
165
179
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
166
180
  """
167
181
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
168
- :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker-lite
169
- :param str symbol: unified symbol of the market to fetch the ticker for
182
+
183
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
184
+
185
+ :param str[] symbols: unified symbols of the markets to fetch the ticker for
170
186
  :param dict [params]: extra parameters specific to the exchange API endpoint
171
187
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
172
188
  """
173
- method = self.safe_string(self.options, 'watchTickerMethod', 'ticker') # or ticker_lite
174
- name = self.safe_string_2(params, 'method', 'watchTickerMethod', method)
175
- params = self.omit(params, ['watchTickerMethod', 'method'])
189
+ await self.load_markets()
176
190
  symbols = self.market_symbols(symbols, None, False)
177
- ticker = await self.subscribe_public(name, symbols, params)
191
+ ticker = await self.watch_multi_helper('ticker', 'ticker', symbols, None, params)
178
192
  if self.newUpdates:
179
- tickers = {}
180
- tickers[ticker['symbol']] = ticker
181
- return tickers
193
+ result: dict = {}
194
+ result[ticker['symbol']] = ticker
195
+ return result
182
196
  return self.filter_by_array(self.tickers, 'symbol', symbols)
183
197
 
198
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
199
+ """
200
+
201
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker-lite
202
+
203
+ watches best bid & ask for symbols
204
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
205
+ :param dict [params]: extra parameters specific to the exchange API endpoint
206
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
207
+ """
208
+ ticker = await self.watch_multi_helper('bidask', 'ticker_lite', symbols, None, params)
209
+ if self.newUpdates:
210
+ result: dict = {}
211
+ result[ticker['symbol']] = ticker
212
+ return result
213
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
214
+
184
215
  async def watch_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
185
216
  """
186
217
  get the list of most recent trades for a particular symbol
187
- :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
218
+
219
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
220
+
188
221
  :param str symbol: unified symbol of the market to fetch trades for
189
222
  :param int [since]: timestamp in ms of the earliest trade to fetch
190
223
  :param int [limit]: the maximum amount of trades to fetch
191
224
  :param dict [params]: extra parameters specific to the exchange API endpoint
192
225
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
193
226
  """
194
- await self.load_markets()
195
- name = 'trade'
196
- trades = await self.subscribe_public(name, [symbol], params)
227
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
228
+
229
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
230
+ """
231
+
232
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
233
+
234
+ get the list of most recent trades for a list of symbols
235
+ :param str[] symbols: unified symbol of the market to fetch trades for
236
+ :param int [since]: timestamp in ms of the earliest trade to fetch
237
+ :param int [limit]: the maximum amount of trades to fetch
238
+ :param dict [params]: extra parameters specific to the exchange API endpoint
239
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
240
+ """
241
+ trades = await self.watch_multi_helper('trade', 'trade', symbols, None, params)
197
242
  if self.newUpdates:
198
- limit = trades.getLimit(symbol, limit)
243
+ first = self.safe_list(trades, 0)
244
+ tradeSymbol = self.safe_string(first, 'symbol')
245
+ limit = trades.getLimit(tradeSymbol, limit)
199
246
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
200
247
 
201
248
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
202
249
  """
203
250
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
204
- :see: https://docs.futures.kraken.com/#websocket-api-public-feeds-book
251
+
252
+ https://docs.futures.kraken.com/#websocket-api-public-feeds-book
253
+
205
254
  :param str symbol: unified symbol of the market to fetch the order book for
206
255
  :param int [limit]: not used by krakenfutures watchOrderBook
207
256
  :param dict [params]: extra parameters specific to the exchange API endpoint
208
257
  :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
209
258
  """
210
- orderbook = await self.subscribe_public('book', [symbol], params)
211
- return orderbook.limit()
259
+ return await self.watch_order_book_for_symbols([symbol], limit, params)
212
260
 
213
261
  async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
214
262
  """
215
- :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions
263
+
264
+ https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions
265
+
216
266
  watch all open positions
217
267
  :param str[]|None symbols: list of unified market symbols
268
+ @param since
269
+ @param limit
218
270
  :param dict params: extra parameters specific to the exchange API endpoint
219
271
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
220
272
  """
@@ -332,8 +384,10 @@ class krakenfutures(ccxt.async_support.krakenfutures):
332
384
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
333
385
  """
334
386
  watches information on multiple orders made by the user
335
- :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
336
- :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders-verbose
387
+
388
+ https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
389
+ https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders-verbose
390
+
337
391
  :param str symbol: not used by krakenfutures watchOrders
338
392
  :param int [since]: not used by krakenfutures watchOrders
339
393
  :param int [limit]: not used by krakenfutures watchOrders
@@ -354,7 +408,9 @@ class krakenfutures(ccxt.async_support.krakenfutures):
354
408
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
355
409
  """
356
410
  watches information on multiple trades made by the user
357
- :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-fills
411
+
412
+ https://docs.futures.kraken.com/#websocket-api-private-feeds-fills
413
+
358
414
  :param str symbol: unified market symbol of the market orders were made in
359
415
  :param int [since]: the earliest time in ms to fetch orders for
360
416
  :param int [limit]: the maximum number of order structures to retrieve
@@ -374,11 +430,10 @@ class krakenfutures(ccxt.async_support.krakenfutures):
374
430
 
375
431
  async def watch_balance(self, params={}) -> Balances:
376
432
  """
377
- watches information on multiple orders made by the user
378
- :see: https://docs.futures.kraken.com/#websocket-api-private-feeds-balances
379
- :param str symbol: not used by krakenfutures watchBalance
380
- :param int [since]: not used by krakenfutures watchBalance
381
- :param int [limit]: not used by krakenfutures watchBalance
433
+ watches information on the user's account balance
434
+
435
+ https://docs.futures.kraken.com/#websocket-api-private-feeds-balances
436
+
382
437
  :param dict [params]: extra parameters specific to the exchange API endpoint
383
438
  :param str [params.account]: can be either 'futures' or 'flex_futures'
384
439
  :returns dict} a object of wallet types each with a balance structure {@link https://docs.ccxt.com/#/?id=balance-structure:
@@ -436,7 +491,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
436
491
  if marketId is not None:
437
492
  market = self.market(marketId)
438
493
  symbol = market['symbol']
439
- messageHash = 'trade:' + symbol
494
+ messageHash = self.get_message_hash('trade', None, symbol)
440
495
  if self.safe_list(self.trades, symbol) is None:
441
496
  tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
442
497
  self.trades[symbol] = ArrayCache(tradesLimit)
@@ -453,7 +508,6 @@ class krakenfutures(ccxt.async_support.krakenfutures):
453
508
  trade = self.parse_ws_trade(message)
454
509
  tradesArray.append(trade)
455
510
  client.resolve(tradesArray, messageHash)
456
- return message
457
511
 
458
512
  def parse_ws_trade(self, trade, market=None):
459
513
  #
@@ -732,7 +786,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
732
786
  orders = self.safe_value(message, 'orders', [])
733
787
  limit = self.safe_integer(self.options, 'ordersLimit')
734
788
  self.orders = ArrayCacheBySymbolById(limit)
735
- symbols = {}
789
+ symbols: dict = {}
736
790
  cachedOrders = self.orders
737
791
  for i in range(0, len(orders)):
738
792
  order = orders[i]
@@ -859,7 +913,15 @@ class krakenfutures(ccxt.async_support.krakenfutures):
859
913
  # "volumeQuote": 19628180
860
914
  # }
861
915
  #
862
- # ticker_lite
916
+ marketId = self.safe_string(message, 'product_id')
917
+ if marketId is not None:
918
+ ticker = self.parse_ws_ticker(message)
919
+ symbol = ticker['symbol']
920
+ self.tickers[symbol] = ticker
921
+ messageHash = self.get_message_hash('ticker', None, symbol)
922
+ client.resolve(ticker, messageHash)
923
+
924
+ def handle_bid_ask(self, client: Client, message):
863
925
  #
864
926
  # {
865
927
  # "feed": "ticker_lite",
@@ -877,15 +939,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
877
939
  # }
878
940
  #
879
941
  marketId = self.safe_string(message, 'product_id')
880
- feed = self.safe_string(message, 'feed')
881
942
  if marketId is not None:
882
943
  ticker = self.parse_ws_ticker(message)
883
944
  symbol = ticker['symbol']
884
- self.tickers[symbol] = ticker
885
- messageHash = feed + ':' + symbol
945
+ self.bidsasks[symbol] = ticker
946
+ messageHash = self.get_message_hash('bidask', None, symbol)
886
947
  client.resolve(ticker, messageHash)
887
- client.resolve(self.tickers, feed)
888
- return message
889
948
 
890
949
  def parse_ws_ticker(self, ticker, market=None):
891
950
  #
@@ -962,6 +1021,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
962
1021
  'average': None,
963
1022
  'baseVolume': self.safe_string(ticker, 'volume'),
964
1023
  'quoteVolume': self.safe_string(ticker, 'volumeQuote'),
1024
+ 'markPrice': self.safe_string(ticker, 'markPrice'),
1025
+ 'indexPrice': self.safe_string(ticker, 'index'),
965
1026
  })
966
1027
 
967
1028
  def handle_order_book_snapshot(self, client: Client, message):
@@ -997,14 +1058,14 @@ class krakenfutures(ccxt.async_support.krakenfutures):
997
1058
  marketId = self.safe_string(message, 'product_id')
998
1059
  market = self.safe_market(marketId)
999
1060
  symbol = market['symbol']
1000
- messageHash = 'book:' + symbol
1001
- subscription = self.safe_value(client.subscriptions, messageHash, {})
1061
+ messageHash = self.get_message_hash('orderbook', None, symbol)
1062
+ subscription = self.safe_dict(client.subscriptions, messageHash, {})
1002
1063
  limit = self.safe_integer(subscription, 'limit')
1003
1064
  timestamp = self.safe_integer(message, 'timestamp')
1004
1065
  self.orderbooks[symbol] = self.order_book({}, limit)
1005
1066
  orderbook = self.orderbooks[symbol]
1006
- bids = self.safe_value(message, 'bids')
1007
- asks = self.safe_value(message, 'asks')
1067
+ bids = self.safe_list(message, 'bids')
1068
+ asks = self.safe_list(message, 'asks')
1008
1069
  for i in range(0, len(bids)):
1009
1070
  bid = bids[i]
1010
1071
  price = self.safe_number(bid, 'price')
@@ -1037,7 +1098,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1037
1098
  marketId = self.safe_string(message, 'product_id')
1038
1099
  market = self.safe_market(marketId)
1039
1100
  symbol = market['symbol']
1040
- messageHash = 'book:' + symbol
1101
+ messageHash = self.get_message_hash('orderbook', None, symbol)
1041
1102
  orderbook = self.orderbooks[symbol]
1042
1103
  side = self.safe_string(message, 'side')
1043
1104
  price = self.safe_number(message, 'price')
@@ -1206,7 +1267,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1206
1267
  timestamp = self.safe_integer(message, 'timestamp')
1207
1268
  if holding is not None:
1208
1269
  holdingKeys = list(holding.keys()) # cashAccount
1209
- holdingResult = {
1270
+ holdingResult: dict = {
1210
1271
  'info': message,
1211
1272
  'timestamp': timestamp,
1212
1273
  'datetime': self.iso8601(timestamp),
@@ -1222,7 +1283,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1222
1283
  client.resolve(holdingResult, messageHash)
1223
1284
  if futures is not None:
1224
1285
  futuresKeys = list(futures.keys()) # marginAccount
1225
- futuresResult = {
1286
+ futuresResult: dict = {
1226
1287
  'info': message,
1227
1288
  'timestamp': timestamp,
1228
1289
  'datetime': self.iso8601(timestamp),
@@ -1245,7 +1306,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1245
1306
  if flexFutures is not None:
1246
1307
  flexFutureCurrencies = self.safe_value(flexFutures, 'currencies', {})
1247
1308
  flexFuturesKeys = list(flexFutureCurrencies.keys()) # multi-collateral margin account
1248
- flexFuturesResult = {
1309
+ flexFuturesResult: dict = {
1249
1310
  'info': message,
1250
1311
  'timestamp': timestamp,
1251
1312
  'datetime': self.iso8601(timestamp),
@@ -1296,7 +1357,7 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1296
1357
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
1297
1358
  stored = ArrayCacheBySymbolById(limit)
1298
1359
  self.myTrades = stored
1299
- tradeSymbols = {}
1360
+ tradeSymbols: dict = {}
1300
1361
  for i in range(0, len(trades)):
1301
1362
  trade = trades[i]
1302
1363
  parsedTrade = self.parse_ws_my_trade(trade)
@@ -1353,6 +1414,35 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1353
1414
  },
1354
1415
  })
1355
1416
 
1417
+ async def watch_multi_helper(self, unifiedName: str, channelName: str, symbols: Strings = None, subscriptionArgs=None, params={}):
1418
+ await self.load_markets()
1419
+ # symbols are required
1420
+ symbols = self.market_symbols(symbols, None, False, True, False)
1421
+ messageHashes = []
1422
+ for i in range(0, len(symbols)):
1423
+ messageHashes.append(self.get_message_hash(unifiedName, None, self.symbol(symbols[i])))
1424
+ marketIds = self.market_ids(symbols)
1425
+ request: dict = {
1426
+ 'event': 'subscribe',
1427
+ 'feed': channelName,
1428
+ 'product_ids': marketIds,
1429
+ }
1430
+ url = self.urls['api']['ws']
1431
+ return await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes, subscriptionArgs)
1432
+
1433
+ def get_message_hash(self, unifiedElementName: str, subChannelName: Str = None, symbol: Str = None):
1434
+ # unifiedElementName can be : orderbook, trade, ticker, bidask ...
1435
+ # subChannelName only applies to channel that needs specific variation(i.e. depth_50, depth_100..) to be selected
1436
+ withSymbol = symbol is not None
1437
+ messageHash = unifiedElementName
1438
+ if not withSymbol:
1439
+ messageHash += 's'
1440
+ else:
1441
+ messageHash += ':' + symbol
1442
+ if subChannelName is not None:
1443
+ messageHash += '#' + subChannelName
1444
+ return messageHash
1445
+
1356
1446
  def handle_error_message(self, client: Client, message):
1357
1447
  #
1358
1448
  # {
@@ -1376,12 +1466,12 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1376
1466
  client.lastPong = self.milliseconds()
1377
1467
  elif event is None:
1378
1468
  feed = self.safe_string(message, 'feed')
1379
- methods = {
1469
+ methods: dict = {
1380
1470
  'ticker': self.handle_ticker,
1471
+ 'ticker_lite': self.handle_bid_ask,
1381
1472
  'trade': self.handle_trade,
1382
1473
  'trade_snapshot': self.handle_trade,
1383
1474
  # 'heartbeat': self.handleStatus,
1384
- 'ticker_lite': self.handle_ticker,
1385
1475
  'book': self.handle_order_book,
1386
1476
  'book_snapshot': self.handle_order_book_snapshot,
1387
1477
  'open_orders_verbose': self.handle_order,
@@ -1400,8 +1490,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1400
1490
 
1401
1491
  def handle_authenticate(self, client: Client, message):
1402
1492
  """
1403
- * @ignore
1404
- :see: https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
1493
+ @ignore
1494
+ https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
1405
1495
  """
1406
1496
  #
1407
1497
  # {
@@ -1418,7 +1508,8 @@ class krakenfutures(ccxt.async_support.krakenfutures):
1418
1508
  signature = self.hmac(hashedChallenge, base64Secret, hashlib.sha512, 'base64')
1419
1509
  self.options['challenge'] = challenge
1420
1510
  self.options['signedChallenge'] = signature
1421
- client.resolve(message, messageHash)
1511
+ future = self.safe_value(client.futures, messageHash)
1512
+ future.resolve(True)
1422
1513
  else:
1423
1514
  error = AuthenticationError(self.id + ' ' + self.json(message))
1424
1515
  client.reject(error, messageHash)