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/exmo.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, Market, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import NotSupported
@@ -20,10 +20,10 @@ class exmo(ccxt.async_support.exmo):
20
20
  'ws': True,
21
21
  'watchBalance': True,
22
22
  'watchTicker': True,
23
- 'watchTickers': False,
23
+ 'watchTickers': True,
24
24
  'watchTrades': True,
25
25
  'watchMyTrades': True,
26
- 'watchOrders': False, # TODO
26
+ 'watchOrders': True,
27
27
  'watchOrderBook': True,
28
28
  'watchOHLCV': False,
29
29
  },
@@ -59,7 +59,7 @@ class exmo(ccxt.async_support.exmo):
59
59
  type, query = self.handle_market_type_and_params('watchBalance', None, params)
60
60
  messageHash = 'balance:' + type
61
61
  url = self.urls['api']['ws'][type]
62
- subscribe = {
62
+ subscribe: dict = {
63
63
  'method': 'subscribe',
64
64
  'topics': [type + '/wallet'],
65
65
  'id': self.request_id(),
@@ -199,6 +199,9 @@ class exmo(ccxt.async_support.exmo):
199
199
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
200
200
  """
201
201
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
202
+
203
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
204
+
202
205
  :param str symbol: unified symbol of the market to fetch the ticker for
203
206
  :param dict [params]: extra parameters specific to the exchange API endpoint
204
207
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -208,7 +211,7 @@ class exmo(ccxt.async_support.exmo):
208
211
  symbol = market['symbol']
209
212
  url = self.urls['api']['ws']['public']
210
213
  messageHash = 'ticker:' + symbol
211
- message = {
214
+ message: dict = {
212
215
  'method': 'subscribe',
213
216
  'topics': [
214
217
  'spot/ticker:' + market['id'],
@@ -218,6 +221,34 @@ class exmo(ccxt.async_support.exmo):
218
221
  request = self.deep_extend(message, params)
219
222
  return await self.watch(url, messageHash, request, messageHash, request)
220
223
 
224
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
225
+ """
226
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
227
+
228
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
229
+
230
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
231
+ :param dict [params]: extra parameters specific to the exchange API endpoint
232
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
233
+ """
234
+ await self.load_markets()
235
+ symbols = self.market_symbols(symbols, None, False)
236
+ messageHashes = []
237
+ args = []
238
+ for i in range(0, len(symbols)):
239
+ market = self.market(symbols[i])
240
+ messageHashes.append('ticker:' + market['symbol'])
241
+ args.append('spot/ticker:' + market['id'])
242
+ url = self.urls['api']['ws']['public']
243
+ message: dict = {
244
+ 'method': 'subscribe',
245
+ 'topics': args,
246
+ 'id': self.request_id(),
247
+ }
248
+ request = self.deep_extend(message, params)
249
+ await self.watch_multiple(url, messageHashes, request, messageHashes, request)
250
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
251
+
221
252
  def handle_ticker(self, client: Client, message):
222
253
  #
223
254
  # spot
@@ -263,7 +294,7 @@ class exmo(ccxt.async_support.exmo):
263
294
  symbol = market['symbol']
264
295
  url = self.urls['api']['ws']['public']
265
296
  messageHash = 'trades:' + symbol
266
- message = {
297
+ message: dict = {
267
298
  'method': 'subscribe',
268
299
  'topics': [
269
300
  'spot/trades:' + market['id'],
@@ -329,7 +360,7 @@ class exmo(ccxt.async_support.exmo):
329
360
  market = self.market(symbol)
330
361
  symbol = market['symbol']
331
362
  messageHash = 'myTrades:' + market['symbol']
332
- message = {
363
+ message: dict = {
333
364
  'method': 'subscribe',
334
365
  'topics': [
335
366
  type + '/user_trades',
@@ -417,7 +448,7 @@ class exmo(ccxt.async_support.exmo):
417
448
  rawTrade = self.safe_value(message, 'data', {})
418
449
  rawTrades = [rawTrade]
419
450
  trades = self.parse_trades(rawTrades)
420
- symbols = {}
451
+ symbols: dict = {}
421
452
  for j in range(0, len(trades)):
422
453
  trade = trades[j]
423
454
  myTrades.append(trade)
@@ -443,7 +474,7 @@ class exmo(ccxt.async_support.exmo):
443
474
  url = self.urls['api']['ws']['public']
444
475
  messageHash = 'orderbook:' + symbol
445
476
  params = self.omit(params, 'aggregation')
446
- subscribe = {
477
+ subscribe: dict = {
447
478
  'method': 'subscribe',
448
479
  'id': self.request_id(),
449
480
  'topics': [
@@ -495,17 +526,16 @@ class exmo(ccxt.async_support.exmo):
495
526
  orderBook = self.safe_value(message, 'data', {})
496
527
  messageHash = 'orderbook:' + symbol
497
528
  timestamp = self.safe_integer(message, 'ts')
498
- orderbook = self.safe_value(self.orderbooks, symbol)
499
- if orderbook is None:
500
- orderbook = self.order_book({})
501
- self.orderbooks[symbol] = orderbook
529
+ if not (symbol in self.orderbooks):
530
+ self.orderbooks[symbol] = self.order_book({})
531
+ orderbook = self.orderbooks[symbol]
502
532
  event = self.safe_string(message, 'event')
503
533
  if event == 'snapshot':
504
534
  snapshot = self.parse_order_book(orderBook, symbol, timestamp, 'bid', 'ask')
505
535
  orderbook.reset(snapshot)
506
536
  else:
507
- asks = self.safe_value(orderBook, 'ask', [])
508
- bids = self.safe_value(orderBook, 'bid', [])
537
+ asks = self.safe_list(orderBook, 'ask', [])
538
+ bids = self.safe_list(orderBook, 'bid', [])
509
539
  self.handle_deltas(orderbook['asks'], asks)
510
540
  self.handle_deltas(orderbook['bids'], bids)
511
541
  orderbook['timestamp'] = timestamp
@@ -520,6 +550,208 @@ class exmo(ccxt.async_support.exmo):
520
550
  for i in range(0, len(deltas)):
521
551
  self.handle_delta(bookside, deltas[i])
522
552
 
553
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
554
+ """
555
+
556
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#85f7bc03-b1c9-4cd2-bd22-8fd422272825
557
+ https://documenter.getpostman.com/view/10287440/SzYXWKPi#95e4ed18-1791-4e6d-83ad-cbfe9be1051c
558
+
559
+ watches information on multiple orders made by the user
560
+ :param str symbol: unified market symbol of the market orders were made in
561
+ :param int [since]: the earliest time in ms to fetch orders for
562
+ :param int [limit]: the maximum number of order structures to retrieve
563
+ :param dict [params]: extra parameters specific to the exchange API endpoint
564
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
565
+ """
566
+ await self.load_markets()
567
+ await self.authenticate(params)
568
+ type, query = self.handle_market_type_and_params('watchOrders', None, params)
569
+ url = self.urls['api']['ws'][type]
570
+ messageHash = None
571
+ if symbol is None:
572
+ messageHash = 'orders:' + type
573
+ else:
574
+ market = self.market(symbol)
575
+ symbol = market['symbol']
576
+ messageHash = 'orders:' + market['symbol']
577
+ message: dict = {
578
+ 'method': 'subscribe',
579
+ 'topics': [
580
+ type + '/orders',
581
+ ],
582
+ 'id': self.request_id(),
583
+ }
584
+ request = self.deep_extend(message, query)
585
+ orders = await self.watch(url, messageHash, request, messageHash, request)
586
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
587
+
588
+ def handle_orders(self, client: Client, message):
589
+ #
590
+ # spot
591
+ # {
592
+ # "ts": 1574427585174,
593
+ # "event": "snapshot",
594
+ # "topic": "spot/orders",
595
+ # "data": [
596
+ # {
597
+ # "order_id": "14",
598
+ # "client_id":"100500",
599
+ # "created": "1574427585",
600
+ # "pair": "BTC_USD",
601
+ # "price": "7750",
602
+ # "quantity": "0.1",
603
+ # "amount": "775",
604
+ # "original_quantity": "0.1",
605
+ # "original_amount": "775",
606
+ # "type": "sell",
607
+ # "status": "open"
608
+ # }
609
+ # ]
610
+ # }
611
+ #
612
+ # margin
613
+ # {
614
+ # "ts":1624371281773,
615
+ # "event":"snapshot",
616
+ # "topic":"margin/orders",
617
+ # "data":[
618
+ # {
619
+ # "order_id":"692844278081168665",
620
+ # "created":"1624371250919761600",
621
+ # "type":"limit_buy",
622
+ # "previous_type":"limit_buy",
623
+ # "pair":"BTC_USD",
624
+ # "leverage":"2",
625
+ # "price":"10000",
626
+ # "stop_price":"0",
627
+ # "distance":"0",
628
+ # "trigger_price":"10000",
629
+ # "init_quantity":"0.1",
630
+ # "quantity":"0.1",
631
+ # "funding_currency":"USD",
632
+ # "funding_quantity":"1000",
633
+ # "funding_rate":"0",
634
+ # "client_id":"111111",
635
+ # "expire":0,
636
+ # "src":1,
637
+ # "comment":"comment1",
638
+ # "updated":1624371250938136600,
639
+ # "status":"active"
640
+ # }
641
+ # ]
642
+ # }
643
+ #
644
+ topic = self.safe_string(message, 'topic')
645
+ parts = topic.split('/')
646
+ type = self.safe_string(parts, 0)
647
+ messageHash = 'orders:' + type
648
+ event = self.safe_string(message, 'event')
649
+ if self.orders is None:
650
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
651
+ self.orders = ArrayCacheBySymbolById(limit)
652
+ cachedOrders = self.orders
653
+ rawOrders = []
654
+ if event == 'snapshot':
655
+ rawOrders = self.safe_value(message, 'data', [])
656
+ elif event == 'update':
657
+ rawOrder = self.safe_dict(message, 'data', {})
658
+ rawOrders.append(rawOrder)
659
+ symbols: dict = {}
660
+ for j in range(0, len(rawOrders)):
661
+ order = self.parse_ws_order(rawOrders[j])
662
+ cachedOrders.append(order)
663
+ symbols[order['symbol']] = True
664
+ symbolKeys = list(symbols.keys())
665
+ for i in range(0, len(symbolKeys)):
666
+ symbol = symbolKeys[i]
667
+ symbolSpecificMessageHash = 'orders:' + symbol
668
+ client.resolve(cachedOrders, symbolSpecificMessageHash)
669
+ client.resolve(cachedOrders, messageHash)
670
+
671
+ def parse_ws_order(self, order: dict, market: Market = None) -> Order:
672
+ #
673
+ # {
674
+ # order_id: '43226756791',
675
+ # client_id: 0,
676
+ # created: '1730371416',
677
+ # type: 'market_buy',
678
+ # pair: 'TRX_USD',
679
+ # quantity: '0',
680
+ # original_quantity: '30',
681
+ # status: 'cancelled',
682
+ # last_trade_id: '726480870',
683
+ # last_trade_price: '0.17',
684
+ # last_trade_quantity: '30'
685
+ # }
686
+ #
687
+ id = self.safe_string(order, 'order_id')
688
+ timestamp = self.safe_timestamp(order, 'created')
689
+ orderType = self.safe_string(order, 'type')
690
+ side = self.parseSide(orderType)
691
+ marketId = self.safe_string(order, 'pair')
692
+ market = self.safe_market(marketId, market)
693
+ symbol = market['symbol']
694
+ amount = self.safe_string(order, 'quantity')
695
+ if amount is None:
696
+ amountField = 'in_amount' if (side == 'buy') else 'out_amount'
697
+ amount = self.safe_string(order, amountField)
698
+ price = self.safe_string(order, 'price')
699
+ clientOrderId = self.omit_zero(self.safe_string(order, 'client_id'))
700
+ triggerPrice = self.omit_zero(self.safe_string(order, 'stop_price'))
701
+ type = None
702
+ if (orderType != 'buy') and (orderType != 'sell'):
703
+ type = orderType
704
+ trades = None
705
+ if 'last_trade_id' in order:
706
+ trade = self.parse_ws_trade(order, market)
707
+ trades = [trade]
708
+ return self.safe_order({
709
+ 'id': id,
710
+ 'clientOrderId': clientOrderId,
711
+ 'datetime': self.iso8601(timestamp),
712
+ 'timestamp': timestamp,
713
+ 'lastTradeTimestamp': None,
714
+ 'status': self.parseStatus(self.safe_string(order, 'status')),
715
+ 'symbol': symbol,
716
+ 'type': type,
717
+ 'timeInForce': None,
718
+ 'postOnly': None,
719
+ 'side': side,
720
+ 'price': price,
721
+ 'stopPrice': triggerPrice,
722
+ 'triggerPrice': triggerPrice,
723
+ 'cost': None,
724
+ 'amount': self.safe_string(order, 'original_quantity'),
725
+ 'filled': None,
726
+ 'remaining': self.safe_string(order, 'quantity'),
727
+ 'average': None,
728
+ 'trades': trades,
729
+ 'fee': None,
730
+ 'info': order,
731
+ }, market)
732
+
733
+ def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
734
+ id = self.safe_string(trade, 'order_id')
735
+ orderType = self.safe_string(trade, 'type')
736
+ side = self.parseSide(orderType)
737
+ marketId = self.safe_string(trade, 'pair')
738
+ market = self.safe_market(marketId, market)
739
+ symbol = market['symbol']
740
+ type = None
741
+ if (orderType != 'buy') and (orderType != 'sell'):
742
+ type = orderType
743
+ return self.safe_trade({
744
+ 'id': self.safe_string(trade, 'last_trade_id'),
745
+ 'symbol': symbol,
746
+ 'order': id,
747
+ 'type': type,
748
+ 'side': side,
749
+ 'price': self.safe_string(trade, 'last_trade_price'),
750
+ 'amount': self.safe_string(trade, 'last_trade_quantity'),
751
+ 'cost': None,
752
+ 'fee': None,
753
+ }, market)
754
+
523
755
  def handle_message(self, client: Client, message):
524
756
  #
525
757
  # {
@@ -537,7 +769,7 @@ class exmo(ccxt.async_support.exmo):
537
769
  # "topic": "spot/ticker:BTC_USDT"
538
770
  # }
539
771
  event = self.safe_string(message, 'event')
540
- events = {
772
+ events: dict = {
541
773
  'logged_in': self.handle_authentication_message,
542
774
  'info': self.handle_info,
543
775
  'subscribed': self.handle_subscribed,
@@ -551,7 +783,7 @@ class exmo(ccxt.async_support.exmo):
551
783
  if topic is not None:
552
784
  parts = topic.split(':')
553
785
  channel = self.safe_string(parts, 0)
554
- handlers = {
786
+ handlers: dict = {
555
787
  'spot/ticker': self.handle_ticker,
556
788
  'spot/wallet': self.handle_balance,
557
789
  'margin/wallet': self.handle_balance,
@@ -559,8 +791,8 @@ class exmo(ccxt.async_support.exmo):
559
791
  'spot/trades': self.handle_trades,
560
792
  'margin/trades': self.handle_trades,
561
793
  'spot/order_book_updates': self.handle_order_book,
562
- # 'spot/orders': self.handleOrders,
563
- # 'margin/orders': self.handleOrders,
794
+ 'spot/orders': self.handle_orders,
795
+ 'margin/orders': self.handle_orders,
564
796
  'spot/user_trades': self.handle_my_trades,
565
797
  'margin/user_trades': self.handle_my_trades,
566
798
  }
@@ -617,7 +849,7 @@ class exmo(ccxt.async_support.exmo):
617
849
  requestId = self.request_id()
618
850
  signData = self.apiKey + str(time)
619
851
  sign = self.hmac(self.encode(signData), self.encode(self.secret), hashlib.sha512, 'base64')
620
- request = {
852
+ request: dict = {
621
853
  'method': 'login',
622
854
  'id': requestId,
623
855
  'api_key': self.apiKey,
@@ -625,6 +857,6 @@ class exmo(ccxt.async_support.exmo):
625
857
  'nonce': time,
626
858
  }
627
859
  message = self.extend(request, query)
628
- future = self.watch(url, messageHash, message)
860
+ future = await self.watch(url, messageHash, message, messageHash)
629
861
  client.subscriptions[messageHash] = future
630
862
  return future