ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__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 +3205 -937
  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 +1525 -573
  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 +223 -97
  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 +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -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 +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -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 +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -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 +3205 -937
  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 +1525 -573
  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 +223 -97
  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 +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -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 +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -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 +143 -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.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.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.49.dist-info}/top_level.txt +0 -0
ccxt/pro/probit.py CHANGED
@@ -22,6 +22,7 @@ class probit(ccxt.async_support.probit):
22
22
  'watchTicker': True,
23
23
  'watchTickers': False,
24
24
  'watchTrades': True,
25
+ 'watchTradesForSymbols': False,
25
26
  'watchMyTrades': True,
26
27
  'watchOrders': True,
27
28
  'watchOrderBook': True,
@@ -40,38 +41,23 @@ class probit(ccxt.async_support.probit):
40
41
  'filter': 'order_books_l2',
41
42
  'interval': 100, # or 500
42
43
  },
43
- 'watchTrades': {
44
- 'filter': 'recent_trades',
45
- },
46
- 'watchTicker': {
47
- 'filter': 'ticker',
48
- },
49
- 'watchOrders': {
50
- 'channel': 'open_order',
51
- },
52
44
  },
53
45
  'streaming': {
54
46
  },
55
- 'exceptions': {
56
- },
57
47
  })
58
48
 
59
49
  async def watch_balance(self, params={}) -> Balances:
60
50
  """
61
51
  watch balance and get the amount of funds available for trading or funds locked in orders
62
- :see: https://docs-en.probit.com/reference/balance-1
52
+
53
+ https://docs-en.probit.com/reference/balance-1
54
+
63
55
  :param dict [params]: extra parameters specific to the exchange API endpoint
64
56
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
65
57
  """
66
58
  await self.authenticate(params)
67
59
  messageHash = 'balance'
68
- url = self.urls['api']['ws']
69
- subscribe = {
70
- 'type': 'subscribe',
71
- 'channel': 'balance',
72
- }
73
- request = self.extend(subscribe, params)
74
- return await self.watch(url, messageHash, request, messageHash)
60
+ return await self.subscribe_private(messageHash, 'balance', params)
75
61
 
76
62
  def handle_balance(self, client: Client, message):
77
63
  #
@@ -121,15 +107,16 @@ class probit(ccxt.async_support.probit):
121
107
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
122
108
  """
123
109
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
124
- :see: https://docs-en.probit.com/reference/marketdata
110
+
111
+ https://docs-en.probit.com/reference/marketdata
112
+
125
113
  :param str symbol: unified symbol of the market to fetch the ticker for
126
114
  :param dict [params]: extra parameters specific to the exchange API endpoint
127
115
  :param int [params.interval]: Unit time to synchronize market information(ms). Available units: 100, 500
128
116
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
129
117
  """
130
- filter = None
131
- filter, params = self.handle_option_and_params(params, 'watchTicker', 'filter', 'ticker')
132
- return await self.subscribe_order_book(symbol, 'ticker', filter, params)
118
+ channel = 'ticker'
119
+ return await self.subscribe_public('watchTicker', symbol, 'ticker', channel, params)
133
120
 
134
121
  def handle_ticker(self, client: Client, message):
135
122
  #
@@ -162,7 +149,9 @@ class probit(ccxt.async_support.probit):
162
149
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
163
150
  """
164
151
  get the list of most recent trades for a particular symbol
165
- :see: https://docs-en.probit.com/reference/trade_history
152
+
153
+ https://docs-en.probit.com/reference/trade_history
154
+
166
155
  :param str symbol: unified symbol of the market to fetch trades for
167
156
  :param int [since]: timestamp in ms of the earliest trade to fetch
168
157
  :param int [limit]: the maximum amount of trades to fetch
@@ -170,9 +159,9 @@ class probit(ccxt.async_support.probit):
170
159
  :param int [params.interval]: Unit time to synchronize market information(ms). Available units: 100, 500
171
160
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
172
161
  """
173
- filter = None
174
- filter, params = self.handle_option_and_params(params, 'watchTrades', 'filter', 'recent_trades')
175
- trades = await self.subscribe_order_book(symbol, 'trades', filter, params)
162
+ channel = 'recent_trades'
163
+ symbol = self.safe_symbol(symbol)
164
+ trades = await self.subscribe_public('watchTrades', symbol, 'trades', channel, params)
176
165
  if self.newUpdates:
177
166
  limit = trades.getLimit(symbol, limit)
178
167
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
@@ -202,10 +191,11 @@ class probit(ccxt.async_support.probit):
202
191
  symbol = self.safe_symbol(marketId)
203
192
  market = self.safe_market(marketId)
204
193
  trades = self.safe_value(message, 'recent_trades', [])
205
- reset = self.safe_bool(message, 'reset', False)
194
+ if self.safe_bool(message, 'reset', False):
195
+ return # see comment in handleMessage
206
196
  messageHash = 'trades:' + symbol
207
197
  stored = self.safe_value(self.trades, symbol)
208
- if stored is None or reset:
198
+ if stored is None:
209
199
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
210
200
  stored = ArrayCache(limit)
211
201
  self.trades[symbol] = stored
@@ -219,6 +209,9 @@ class probit(ccxt.async_support.probit):
219
209
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
220
210
  """
221
211
  get the list of trades associated with the user
212
+
213
+ https://docs-en.probit.com/reference/trade_history
214
+
222
215
  :param str symbol: unified symbol of the market to fetch trades for
223
216
  :param int [since]: timestamp in ms of the earliest trade to fetch
224
217
  :param int [limit]: the maximum amount of trades to fetch
@@ -227,19 +220,11 @@ class probit(ccxt.async_support.probit):
227
220
  """
228
221
  await self.load_markets()
229
222
  await self.authenticate(params)
230
- messageHash = 'myTrades'
223
+ messageHash = 'trades'
231
224
  if symbol is not None:
232
- market = self.market(symbol)
233
- symbol = market['symbol']
225
+ symbol = self.safe_symbol(symbol)
234
226
  messageHash = messageHash + ':' + symbol
235
- url = self.urls['api']['ws']
236
- channel = 'trade_history'
237
- message = {
238
- 'type': 'subscribe',
239
- 'channel': channel,
240
- }
241
- request = self.extend(message, params)
242
- trades = await self.watch(url, messageHash, request, channel)
227
+ trades = await self.subscribe_private(messageHash, 'trade_history', params)
243
228
  if self.newUpdates:
244
229
  limit = trades.getLimit(symbol, limit)
245
230
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
@@ -268,20 +253,27 @@ class probit(ccxt.async_support.probit):
268
253
  length = len(rawTrades)
269
254
  if length == 0:
270
255
  return
271
- reset = self.safe_bool(message, 'reset', False)
272
- messageHash = 'myTrades'
256
+ if self.safe_bool(message, 'reset', False):
257
+ return # see comment in handleMessage
258
+ messageHash = 'trades'
273
259
  stored = self.myTrades
274
- if (stored is None) or reset:
260
+ if stored is None:
275
261
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
276
262
  stored = ArrayCacheBySymbolById(limit)
277
263
  self.myTrades = stored
278
264
  trades = self.parse_trades(rawTrades)
279
- tradeSymbols = {}
265
+ tradeSymbols: dict = {}
280
266
  for j in range(0, len(trades)):
281
267
  trade = trades[j]
268
+ # don't include 'executed' state, because it's just blanket state of the trade, emited before actual trade event
269
+ if self.safe_string(trade['info'], 'status') == 'executed':
270
+ continue
282
271
  tradeSymbols[trade['symbol']] = True
283
272
  stored.append(trade)
284
273
  unique = list(tradeSymbols.keys())
274
+ uniqueLength = len(unique)
275
+ if uniqueLength == 0:
276
+ return
285
277
  for i in range(0, len(unique)):
286
278
  symbol = unique[i]
287
279
  symbolSpecificMessageHash = messageHash + ':' + symbol
@@ -291,7 +283,9 @@ class probit(ccxt.async_support.probit):
291
283
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
292
284
  """
293
285
  watches information on an order made by the user
294
- :see: https://docs-en.probit.com/reference/open_order
286
+
287
+ https://docs-en.probit.com/reference/open_order
288
+
295
289
  :param str symbol: unified symbol of the market the order was made in
296
290
  :param int [since]: timestamp in ms of the earliest order to watch
297
291
  :param int [limit]: the maximum amount of orders to watch
@@ -300,20 +294,11 @@ class probit(ccxt.async_support.probit):
300
294
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
301
295
  """
302
296
  await self.authenticate(params)
303
- url = self.urls['api']['ws']
304
297
  messageHash = 'orders'
305
298
  if symbol is not None:
306
- market = self.market(symbol)
307
- symbol = market['symbol']
299
+ symbol = self.safe_symbol(symbol)
308
300
  messageHash = messageHash + ':' + symbol
309
- channel = None
310
- channel, params = self.handle_option_and_params(params, 'watchOrders', 'channel', 'open_order')
311
- subscribe = {
312
- 'type': 'subscribe',
313
- 'channel': channel,
314
- }
315
- request = self.extend(subscribe, params)
316
- orders = await self.watch(url, messageHash, request, channel)
301
+ orders = await self.subscribe_private(messageHash, 'open_order', params)
317
302
  if self.newUpdates:
318
303
  limit = orders.getLimit(symbol, limit)
319
304
  return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
@@ -354,7 +339,7 @@ class probit(ccxt.async_support.probit):
354
339
  limit = self.safe_integer(self.options, 'ordersLimit', 1000)
355
340
  stored = ArrayCacheBySymbolById(limit)
356
341
  self.orders = stored
357
- orderSymbols = {}
342
+ orderSymbols: dict = {}
358
343
  for i in range(0, len(rawOrders)):
359
344
  rawOrder = rawOrders[i]
360
345
  order = self.parse_order(rawOrder)
@@ -370,45 +355,57 @@ class probit(ccxt.async_support.probit):
370
355
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
371
356
  """
372
357
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
373
- :see: https://docs-en.probit.com/reference/marketdata
358
+
359
+ https://docs-en.probit.com/reference/marketdata
360
+
374
361
  :param str symbol: unified symbol of the market to fetch the order book for
375
362
  :param int [limit]: the maximum amount of order book entries to return
376
363
  :param dict [params]: extra parameters specific to the exchange API endpoint
377
364
  :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
378
365
  """
379
- filter = None
380
- filter, params = self.handle_option_and_params(params, 'watchOrderBook', 'filter', 'order_books')
381
- orderbook = await self.subscribe_order_book(symbol, 'orderbook', filter, params)
366
+ channel = None
367
+ channel, params = self.handle_option_and_params(params, 'watchOrderBook', 'filter', 'order_books')
368
+ orderbook = await self.subscribe_public('watchOrderBook', symbol, 'orderbook', channel, params)
382
369
  return orderbook.limit()
383
370
 
384
- async def subscribe_order_book(self, symbol: str, messageHash, filter, params={}):
371
+ async def subscribe_private(self, messageHash, channel, params):
372
+ url = self.urls['api']['ws']
373
+ subscribe: dict = {
374
+ 'type': 'subscribe',
375
+ 'channel': channel,
376
+ }
377
+ request = self.extend(subscribe, params)
378
+ subscribeHash = messageHash
379
+ return await self.watch(url, messageHash, request, subscribeHash)
380
+
381
+ async def subscribe_public(self, methodName: str, symbol: str, dataType, filter, params={}):
385
382
  await self.load_markets()
386
383
  market = self.market(symbol)
387
384
  symbol = market['symbol']
388
385
  url = self.urls['api']['ws']
389
386
  client = self.client(url)
390
- interval = None
391
- interval, params = self.handle_option_and_params(params, 'watchOrderBook', 'interval', 100)
392
- subscriptionHash = 'marketdata:' + symbol
393
- messageHash = messageHash + ':' + symbol
387
+ subscribeHash = 'marketdata:' + symbol
388
+ messageHash = dataType + ':' + symbol
394
389
  filters = {}
395
- if subscriptionHash in client.subscriptions:
390
+ if subscribeHash in client.subscriptions:
396
391
  # already subscribed
397
- filters = client.subscriptions[subscriptionHash]
392
+ filters = client.subscriptions[subscribeHash]
398
393
  if not (filter in filters):
399
394
  # resubscribe
400
- del client.subscriptions[subscriptionHash]
395
+ del client.subscriptions[subscribeHash]
401
396
  filters[filter] = True
402
397
  keys = list(filters.keys())
403
- message = {
398
+ interval = None
399
+ interval, params = self.handle_option_and_params(params, methodName, 'interval', 100)
400
+ request: dict = {
401
+ 'type': 'subscribe',
404
402
  'channel': 'marketdata',
405
- 'interval': interval,
406
403
  'market_id': market['id'],
407
- 'type': 'subscribe',
408
404
  'filter': keys,
405
+ 'interval': interval,
409
406
  }
410
- request = self.extend(message, params)
411
- return await self.watch(url, messageHash, request, messageHash, filters)
407
+ request = self.extend(request, params)
408
+ return await self.watch(url, messageHash, request, subscribeHash, filters)
412
409
 
413
410
  def handle_order_book(self, client: Client, message, orderBook):
414
411
  #
@@ -428,10 +425,10 @@ class probit(ccxt.async_support.probit):
428
425
  symbol = self.safe_symbol(marketId)
429
426
  dataBySide = self.group_by(orderBook, 'side')
430
427
  messageHash = 'orderbook:' + symbol
431
- orderbook = self.safe_value(self.orderbooks, symbol)
432
- if orderbook is None:
433
- orderbook = self.order_book({})
434
- self.orderbooks[symbol] = orderbook
428
+ # orderbook = self.safe_value(self.orderbooks, symbol)
429
+ if not (symbol in self.orderbooks):
430
+ self.orderbooks[symbol] = self.order_book({})
431
+ orderbook = self.orderbooks[symbol]
435
432
  reset = self.safe_bool(message, 'reset', False)
436
433
  if reset:
437
434
  snapshot = self.parse_order_book(dataBySide, symbol, None, 'buy', 'sell', 'price', 'quantity')
@@ -467,8 +464,12 @@ class probit(ccxt.async_support.probit):
467
464
  code = self.safe_string(message, 'errorCode')
468
465
  errMessage = self.safe_string(message, 'message', '')
469
466
  details = self.safe_value(message, 'details')
470
- # todo - raise properly here
471
- raise ExchangeError(self.id + ' ' + code + ' ' + errMessage + ' ' + self.json(details))
467
+ feedback = self.id + ' ' + code + ' ' + errMessage + ' ' + self.json(details)
468
+ if 'exact' in self.exceptions:
469
+ self.throw_exactly_matched_exception(self.exceptions['exact'], code, feedback)
470
+ if 'broad' in self.exceptions:
471
+ self.throw_broadly_matched_exception(self.exceptions['broad'], errMessage, feedback)
472
+ raise ExchangeError(feedback)
472
473
 
473
474
  def handle_authenticate(self, client: Client, message):
474
475
  #
@@ -477,7 +478,8 @@ class probit(ccxt.async_support.probit):
477
478
  result = self.safe_string(message, 'result')
478
479
  future = client.subscriptions['authenticated']
479
480
  if result == 'ok':
480
- future.resolve(True)
481
+ messageHash = 'authenticated'
482
+ client.resolve(message, messageHash)
481
483
  else:
482
484
  future.reject(message)
483
485
  del client.subscriptions['authenticated']
@@ -487,10 +489,12 @@ class probit(ccxt.async_support.probit):
487
489
  if ticker is not None:
488
490
  self.handle_ticker(client, message)
489
491
  trades = self.safe_value(message, 'recent_trades', [])
490
- if len(trades):
492
+ tradesLength = len(trades)
493
+ if tradesLength:
491
494
  self.handle_trades(client, message)
492
495
  orderBook = self.safe_value_n(message, ['order_books', 'order_books_l1', 'order_books_l2', 'order_books_l3', 'order_books_l4'], [])
493
- if len(orderBook):
496
+ orderBookLength = len(orderBook)
497
+ if orderBookLength:
494
498
  self.handle_order_book(client, message, orderBook)
495
499
 
496
500
  def handle_message(self, client: Client, message):
@@ -503,6 +507,9 @@ class probit(ccxt.async_support.probit):
503
507
  # }
504
508
  # }
505
509
  #
510
+ # Note about 'reset' field
511
+ # 'reset': True field - it happens once after initial subscription, which just returns old items by the moment of subscription(like "fetchMyTrades" does)
512
+ #
506
513
  errorCode = self.safe_string(message, 'errorCode')
507
514
  if errorCode is not None:
508
515
  self.handle_error_message(client, message)
@@ -511,7 +518,7 @@ class probit(ccxt.async_support.probit):
511
518
  if type == 'authorization':
512
519
  self.handle_authenticate(client, message)
513
520
  return
514
- handlers = {
521
+ handlers: dict = {
515
522
  'marketdata': self.handle_market_data,
516
523
  'balance': self.handle_balance,
517
524
  'trade_history': self.handle_my_trades,
@@ -542,7 +549,7 @@ class probit(ccxt.async_support.probit):
542
549
  # }
543
550
  #
544
551
  accessToken = self.safe_string(response, 'access_token')
545
- request = {
552
+ request: dict = {
546
553
  'type': 'authorization',
547
554
  'token': accessToken,
548
555
  }