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/mexc.py CHANGED
@@ -6,10 +6,12 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, 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 AuthenticationError
13
+ from ccxt.base.errors import ArgumentsRequired
14
+ from ccxt.base.errors import NotSupported
13
15
 
14
16
 
15
17
  class mexc(ccxt.async_support.mexc):
@@ -33,14 +35,16 @@ class mexc(ccxt.async_support.mexc):
33
35
  'watchOrderBook': True,
34
36
  'watchOrders': True,
35
37
  'watchTicker': True,
36
- 'watchTickers': False,
38
+ 'watchTickers': True,
39
+ 'watchBidsAsks': True,
37
40
  'watchTrades': True,
41
+ 'watchTradesForSymbols': False,
38
42
  },
39
43
  'urls': {
40
44
  'api': {
41
45
  'ws': {
42
46
  'spot': 'wss://wbs.mexc.com/ws',
43
- 'swap': 'wss://contract.mexc.com/ws',
47
+ 'swap': 'wss://contract.mexc.com/edge',
44
48
  },
45
49
  },
46
50
  },
@@ -67,7 +71,7 @@ class mexc(ccxt.async_support.mexc):
67
71
  },
68
72
  'streaming': {
69
73
  'ping': self.ping,
70
- 'keepAlive': 10000,
74
+ 'keepAlive': 8000,
71
75
  },
72
76
  'exceptions': {
73
77
  },
@@ -76,24 +80,68 @@ class mexc(ccxt.async_support.mexc):
76
80
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
77
81
  """
78
82
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
83
+
84
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
85
+ https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
86
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#miniticker
87
+
79
88
  :param str symbol: unified symbol of the market to fetch the ticker for
80
89
  :param dict [params]: extra parameters specific to the exchange API endpoint
90
+ :param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
81
91
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
82
92
  """
83
93
  await self.load_markets()
84
94
  market = self.market(symbol)
85
95
  messageHash = 'ticker:' + market['symbol']
86
96
  if market['spot']:
87
- channel = 'spot@public.bookTicker.v3.api@' + market['id']
97
+ miniTicker = False
98
+ miniTicker, params = self.handle_option_and_params(params, 'watchTicker', 'miniTicker')
99
+ channel = None
100
+ if miniTicker:
101
+ channel = 'spot@public.miniTicker.v3.api@' + market['id'] + '@UTC+8'
102
+ else:
103
+ channel = 'spot@public.bookTicker.v3.api@' + market['id']
88
104
  return await self.watch_spot_public(channel, messageHash, params)
89
105
  else:
90
106
  channel = 'sub.ticker'
91
- requestParams = {
107
+ requestParams: dict = {
92
108
  'symbol': market['id'],
93
109
  }
94
110
  return await self.watch_swap_public(channel, messageHash, requestParams, params)
95
111
 
96
112
  def handle_ticker(self, client: Client, message):
113
+ #
114
+ # swap
115
+ #
116
+ # {
117
+ # "symbol": "BTC_USDT",
118
+ # "data": {
119
+ # "symbol": "BTC_USDT",
120
+ # "lastPrice": 76376.2,
121
+ # "riseFallRate": -0.0006,
122
+ # "fairPrice": 76374.4,
123
+ # "indexPrice": 76385.8,
124
+ # "volume24": 962062810,
125
+ # "amount24": 7344207079.96768,
126
+ # "maxBidPrice": 84024.3,
127
+ # "minAskPrice": 68747.2,
128
+ # "lower24Price": 75620.2,
129
+ # "high24Price": 77210,
130
+ # "timestamp": 1731137509138,
131
+ # "bid1": 76376.2,
132
+ # "ask1": 76376.3,
133
+ # "holdVol": 95479623,
134
+ # "riseFallValue": -46.5,
135
+ # "fundingRate": 0.0001,
136
+ # "zone": "UTC+8",
137
+ # "riseFallRates": [-0.0006, 0.1008, 0.2262, 0.2628, 0.2439, 1.0564],
138
+ # "riseFallRatesOfTimezone": [0.0065, -0.0013, -0.0006]
139
+ # },
140
+ # "channel": "push.ticker",
141
+ # "ts": 1731137509138
142
+ # }
143
+ #
144
+ # spot
97
145
  #
98
146
  # {
99
147
  # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
@@ -107,7 +155,30 @@ class mexc(ccxt.async_support.mexc):
107
155
  # "t": 1678643605721
108
156
  # }
109
157
  #
110
- rawTicker = self.safe_value_2(message, 'd', 'data')
158
+ # spot miniTicker
159
+ #
160
+ # {
161
+ # "d": {
162
+ # "s": "BTCUSDT",
163
+ # "p": "76522",
164
+ # "r": "0.0012",
165
+ # "tr": "0.0012",
166
+ # "h": "77196.3",
167
+ # "l": "75630.77",
168
+ # "v": "584664223.92",
169
+ # "q": "7666.720258",
170
+ # "lastRT": "-1",
171
+ # "MT": "0",
172
+ # "NV": "--",
173
+ # "t": "1731135533126"
174
+ # },
175
+ # "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
176
+ # "t": 1731135533126,
177
+ # "s": "BTCUSDT"
178
+ # }
179
+ #
180
+ self.handle_bid_ask(client, message)
181
+ rawTicker = self.safe_dict_2(message, 'd', 'data')
111
182
  marketId = self.safe_string_2(message, 's', 'symbol')
112
183
  timestamp = self.safe_integer(message, 't')
113
184
  market = self.safe_market(marketId)
@@ -123,24 +194,191 @@ class mexc(ccxt.async_support.mexc):
123
194
  messageHash = 'ticker:' + symbol
124
195
  client.resolve(ticker, messageHash)
125
196
 
126
- def parse_ws_ticker(self, ticker, market=None):
197
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
198
+ """
199
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
200
+
201
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
202
+ https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
203
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#minitickers
204
+
205
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
206
+ :param dict [params]: extra parameters specific to the exchange API endpoint
207
+ :param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
208
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
209
+ """
210
+ await self.load_markets()
211
+ symbols = self.market_symbols(symbols, None)
212
+ messageHashes = []
213
+ firstSymbol = self.safe_string(symbols, 0)
214
+ market = None
215
+ if firstSymbol is not None:
216
+ market = self.market(firstSymbol)
217
+ type = None
218
+ type, params = self.handle_market_type_and_params('watchTickers', market, params)
219
+ isSpot = (type == 'spot')
220
+ url = self.urls['api']['ws']['spot'] if (isSpot) else self.urls['api']['ws']['swap']
221
+ request: dict = {}
222
+ if isSpot:
223
+ miniTicker = False
224
+ miniTicker, params = self.handle_option_and_params(params, 'watchTickers', 'miniTicker')
225
+ topics = []
226
+ if not miniTicker:
227
+ if symbols is None:
228
+ raise ArgumentsRequired(self.id + 'watchTickers required symbols argument for the bookTicker channel')
229
+ marketIds = self.market_ids(symbols)
230
+ for i in range(0, len(marketIds)):
231
+ marketId = marketIds[i]
232
+ messageHashes.append('ticker:' + symbols[i])
233
+ channel = 'spot@public.bookTicker.v3.api@' + marketId
234
+ topics.append(channel)
235
+ else:
236
+ topics.append('spot@public.miniTickers.v3.api@UTC+8')
237
+ if symbols is None:
238
+ messageHashes.append('spot:ticker')
239
+ else:
240
+ for i in range(0, len(symbols)):
241
+ messageHashes.append('ticker:' + symbols[i])
242
+ request['method'] = 'SUBSCRIPTION'
243
+ request['params'] = topics
244
+ else:
245
+ request['method'] = 'sub.tickers'
246
+ request['params'] = {}
247
+ messageHashes.append('ticker')
248
+ ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
249
+ if isSpot and self.newUpdates:
250
+ result: dict = {}
251
+ result[ticker['symbol']] = ticker
252
+ return result
253
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
254
+
255
+ def handle_tickers(self, client: Client, message):
256
+ #
257
+ # swap
258
+ #
259
+ # {
260
+ # "channel": "push.tickers",
261
+ # "data": [
262
+ # {
263
+ # "symbol": "ETH_USDT",
264
+ # "lastPrice": 2324.5,
265
+ # "riseFallRate": 0.0356,
266
+ # "fairPrice": 2324.32,
267
+ # "indexPrice": 2325.44,
268
+ # "volume24": 25868309,
269
+ # "amount24": 591752573.9792,
270
+ # "maxBidPrice": 2557.98,
271
+ # "minAskPrice": 2092.89,
272
+ # "lower24Price": 2239.39,
273
+ # "high24Price": 2332.59,
274
+ # "timestamp": 1725872514111
275
+ # }
276
+ # ],
277
+ # "ts": 1725872514111
278
+ # }
127
279
  #
128
280
  # spot
281
+ #
129
282
  # {
130
- # "A": "4.70432",
131
- # "B": "6.714863",
132
- # "a": "20744.54",
133
- # "b": "20744.17"
283
+ # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
284
+ # "d": {
285
+ # "A": "4.70432",
286
+ # "B": "6.714863",
287
+ # "a": "20744.54",
288
+ # "b": "20744.17"
289
+ # },
290
+ # "s": "BTCUSDT",
291
+ # "t": 1678643605721
134
292
  # }
135
293
  #
294
+ # spot miniTicker
295
+ #
296
+ # {
297
+ # "d": {
298
+ # "s": "BTCUSDT",
299
+ # "p": "76522",
300
+ # "r": "0.0012",
301
+ # "tr": "0.0012",
302
+ # "h": "77196.3",
303
+ # "l": "75630.77",
304
+ # "v": "584664223.92",
305
+ # "q": "7666.720258",
306
+ # "lastRT": "-1",
307
+ # "MT": "0",
308
+ # "NV": "--",
309
+ # "t": "1731135533126"
310
+ # },
311
+ # "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
312
+ # "t": 1731135533126,
313
+ # "s": "BTCUSDT"
314
+ # }
315
+ #
316
+ data = self.safe_list_2(message, 'data', 'd')
317
+ channel = self.safe_string(message, 'c', '')
318
+ marketId = self.safe_string(message, 's')
319
+ market = self.safe_market(marketId)
320
+ channelStartsWithSpot = channel.startswith('spot')
321
+ marketIdIsUndefined = marketId is None
322
+ isSpot = channelStartsWithSpot if marketIdIsUndefined else market['spot']
323
+ spotPrefix = 'spot:'
324
+ messageHashPrefix = spotPrefix if isSpot else ''
325
+ topic = messageHashPrefix + 'ticker'
326
+ result = []
327
+ for i in range(0, len(data)):
328
+ entry = data[i]
329
+ ticker = None
330
+ if isSpot:
331
+ ticker = self.parse_ws_ticker(entry, market)
332
+ else:
333
+ ticker = self.parse_ticker(entry)
334
+ symbol = ticker['symbol']
335
+ self.tickers[symbol] = ticker
336
+ result.append(ticker)
337
+ messageHash = 'ticker:' + symbol
338
+ client.resolve(ticker, messageHash)
339
+ client.resolve(result, topic)
340
+
341
+ def parse_ws_ticker(self, ticker, market=None):
342
+ #
343
+ # spot
344
+ #
345
+ # {
346
+ # "A": "4.70432",
347
+ # "B": "6.714863",
348
+ # "a": "20744.54",
349
+ # "b": "20744.17"
350
+ # }
351
+ #
352
+ # spot miniTicker
353
+ #
354
+ # {
355
+ # "s": "BTCUSDT",
356
+ # "p": "76522",
357
+ # "r": "0.0012",
358
+ # "tr": "0.0012",
359
+ # "h": "77196.3",
360
+ # "l": "75630.77",
361
+ # "v": "584664223.92",
362
+ # "q": "7666.720258",
363
+ # "lastRT": "-1",
364
+ # "MT": "0",
365
+ # "NV": "--",
366
+ # "t": "1731135533126"
367
+ # }
368
+ #
369
+ marketId = self.safe_string(ticker, 's')
370
+ timestamp = self.safe_integer(ticker, 't')
371
+ price = self.safe_string(ticker, 'p')
136
372
  return self.safe_ticker({
137
- 'symbol': self.safe_symbol(None, market),
138
- 'timestamp': None,
139
- 'datetime': None,
373
+ 'info': ticker,
374
+ 'symbol': self.safe_symbol(marketId, market),
375
+ 'timestamp': timestamp,
376
+ 'datetime': self.iso8601(timestamp),
140
377
  'open': None,
141
- 'high': None,
142
- 'low': None,
143
- 'close': None,
378
+ 'high': self.safe_number(ticker, 'h'),
379
+ 'low': self.safe_number(ticker, 'l'),
380
+ 'close': price,
381
+ 'last': price,
144
382
  'bid': self.safe_number(ticker, 'b'),
145
383
  'bidVolume': self.safe_number(ticker, 'B'),
146
384
  'ask': self.safe_number(ticker, 'a'),
@@ -148,16 +386,91 @@ class mexc(ccxt.async_support.mexc):
148
386
  'vwap': None,
149
387
  'previousClose': None,
150
388
  'change': None,
151
- 'percentage': None,
389
+ 'percentage': self.safe_number(ticker, 'tr'),
152
390
  'average': None,
153
- 'baseVolume': None,
154
- 'quoteVolume': None,
391
+ 'baseVolume': self.safe_number(ticker, 'v'),
392
+ 'quoteVolume': self.safe_number(ticker, 'q'),
393
+ }, market)
394
+
395
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
396
+ """
397
+
398
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
399
+
400
+ watches best bid & ask for symbols
401
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
402
+ :param dict [params]: extra parameters specific to the exchange API endpoint
403
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
404
+ """
405
+ await self.load_markets()
406
+ symbols = self.market_symbols(symbols, None, True, False, True)
407
+ marketType = None
408
+ if symbols is None:
409
+ raise ArgumentsRequired(self.id + 'watchBidsAsks required symbols argument')
410
+ markets = self.markets_for_symbols(symbols)
411
+ marketType, params = self.handle_market_type_and_params('watchBidsAsks', markets[0], params)
412
+ isSpot = marketType == 'spot'
413
+ if not isSpot:
414
+ raise NotSupported(self.id + 'watchBidsAsks only support spot market')
415
+ messageHashes = []
416
+ topics = []
417
+ for i in range(0, len(symbols)):
418
+ if isSpot:
419
+ market = self.market(symbols[i])
420
+ topics.append('spot@public.bookTicker.v3.api@' + market['id'])
421
+ messageHashes.append('bidask:' + symbols[i])
422
+ url = self.urls['api']['ws']['spot']
423
+ request: dict = {
424
+ 'method': 'SUBSCRIPTION',
425
+ 'params': topics,
426
+ }
427
+ ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
428
+ if self.newUpdates:
429
+ tickers: dict = {}
430
+ tickers[ticker['symbol']] = ticker
431
+ return tickers
432
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
433
+
434
+ def handle_bid_ask(self, client: Client, message):
435
+ #
436
+ # {
437
+ # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
438
+ # "d": {
439
+ # "A": "4.70432",
440
+ # "B": "6.714863",
441
+ # "a": "20744.54",
442
+ # "b": "20744.17"
443
+ # },
444
+ # "s": "BTCUSDT",
445
+ # "t": 1678643605721
446
+ # }
447
+ #
448
+ parsedTicker = self.parse_ws_bid_ask(message)
449
+ symbol = parsedTicker['symbol']
450
+ self.bidsasks[symbol] = parsedTicker
451
+ messageHash = 'bidask:' + symbol
452
+ client.resolve(parsedTicker, messageHash)
453
+
454
+ def parse_ws_bid_ask(self, ticker, market=None):
455
+ data = self.safe_dict(ticker, 'd')
456
+ marketId = self.safe_string(ticker, 's')
457
+ market = self.safe_market(marketId, market)
458
+ symbol = self.safe_string(market, 'symbol')
459
+ timestamp = self.safe_integer(ticker, 't')
460
+ return self.safe_ticker({
461
+ 'symbol': symbol,
462
+ 'timestamp': timestamp,
463
+ 'datetime': self.iso8601(timestamp),
464
+ 'ask': self.safe_number(data, 'a'),
465
+ 'askVolume': self.safe_number(data, 'A'),
466
+ 'bid': self.safe_number(data, 'b'),
467
+ 'bidVolume': self.safe_number(data, 'B'),
155
468
  'info': ticker,
156
469
  }, market)
157
470
 
158
471
  async def watch_spot_public(self, channel, messageHash, params={}):
159
472
  url = self.urls['api']['ws']['spot']
160
- request = {
473
+ request: dict = {
161
474
  'method': 'SUBSCRIPTION',
162
475
  'params': [channel],
163
476
  }
@@ -167,7 +480,7 @@ class mexc(ccxt.async_support.mexc):
167
480
  self.check_required_credentials()
168
481
  listenKey = await self.authenticate(channel)
169
482
  url = self.urls['api']['ws']['spot'] + '?listenKey=' + listenKey
170
- request = {
483
+ request: dict = {
171
484
  'method': 'SUBSCRIPTION',
172
485
  'params': [channel],
173
486
  }
@@ -175,7 +488,7 @@ class mexc(ccxt.async_support.mexc):
175
488
 
176
489
  async def watch_swap_public(self, channel, messageHash, requestParams, params={}):
177
490
  url = self.urls['api']['ws']['swap']
178
- request = {
491
+ request: dict = {
179
492
  'method': channel,
180
493
  'param': requestParams,
181
494
  }
@@ -189,7 +502,7 @@ class mexc(ccxt.async_support.mexc):
189
502
  timestamp = str(self.milliseconds())
190
503
  payload = self.apiKey + timestamp
191
504
  signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha256)
192
- request = {
505
+ request: dict = {
193
506
  'method': channel,
194
507
  'param': {
195
508
  'apiKey': self.apiKey,
@@ -202,7 +515,9 @@ class mexc(ccxt.async_support.mexc):
202
515
 
203
516
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
204
517
  """
205
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#kline-streams
518
+
519
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#kline-streams
520
+
206
521
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
207
522
  :param str symbol: unified symbol of the market to fetch OHLCV data for
208
523
  :param str timeframe: the length of time each candle represents
@@ -223,7 +538,7 @@ class mexc(ccxt.async_support.mexc):
223
538
  ohlcv = await self.watch_spot_public(channel, messageHash, params)
224
539
  else:
225
540
  channel = 'sub.kline'
226
- requestParams = {
541
+ requestParams: dict = {
227
542
  'symbol': market['id'],
228
543
  'interval': timeframeId,
229
544
  }
@@ -342,7 +657,10 @@ class mexc(ccxt.async_support.mexc):
342
657
 
343
658
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
344
659
  """
345
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#diff-depth-stream
660
+
661
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#diff-depth-stream
662
+ https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
663
+
346
664
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
347
665
  :param str symbol: unified symbol of the market to fetch the order book for
348
666
  :param int [limit]: the maximum amount of order book entries to return
@@ -359,7 +677,7 @@ class mexc(ccxt.async_support.mexc):
359
677
  orderbook = await self.watch_spot_public(channel, messageHash, params)
360
678
  else:
361
679
  channel = 'sub.depth'
362
- requestParams = {
680
+ requestParams: dict = {
363
681
  'symbol': market['id'],
364
682
  }
365
683
  orderbook = await self.watch_swap_public(channel, messageHash, requestParams, params)
@@ -487,8 +805,8 @@ class mexc(ccxt.async_support.mexc):
487
805
  # so, we just skip old updates
488
806
  return
489
807
  orderbook['nonce'] = deltaNonce
490
- asks = self.safe_value(delta, 'asks', [])
491
- bids = self.safe_value(delta, 'bids', [])
808
+ asks = self.safe_list(delta, 'asks', [])
809
+ bids = self.safe_list(delta, 'bids', [])
492
810
  asksOrderSide = orderbook['asks']
493
811
  bidsOrderSide = orderbook['bids']
494
812
  self.handle_bookside_delta(asksOrderSide, asks)
@@ -496,7 +814,10 @@ class mexc(ccxt.async_support.mexc):
496
814
 
497
815
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
498
816
  """
499
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#trade-streams
817
+
818
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#trade-streams
819
+ https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
820
+
500
821
  get the list of most recent trades for a particular symbol
501
822
  :param str symbol: unified symbol of the market to fetch trades for
502
823
  :param int [since]: timestamp in ms of the earliest trade to fetch
@@ -514,7 +835,7 @@ class mexc(ccxt.async_support.mexc):
514
835
  trades = await self.watch_spot_public(channel, messageHash, params)
515
836
  else:
516
837
  channel = 'sub.deal'
517
- requestParams = {
838
+ requestParams: dict = {
518
839
  'symbol': market['id'],
519
840
  }
520
841
  trades = await self.watch_swap_public(channel, messageHash, requestParams, params)
@@ -576,13 +897,16 @@ class mexc(ccxt.async_support.mexc):
576
897
 
577
898
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
578
899
  """
579
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#spot-account-deals
900
+
901
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-deals
902
+ https://mexcdevelop.github.io/apidocs/contract_v1_en/#private-channels
903
+
580
904
  watches information on multiple trades made by the user
581
905
  :param str symbol: unified market symbol of the market trades were made in
582
906
  :param int [since]: the earliest time in ms to fetch trades for
583
907
  :param int [limit]: the maximum number of trade structures to retrieve
584
908
  :param dict [params]: extra parameters specific to the exchange API endpoint
585
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
909
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
586
910
  """
587
911
  await self.load_markets()
588
912
  messageHash = 'myTrades'
@@ -665,6 +989,21 @@ class mexc(ccxt.async_support.mexc):
665
989
  # "v": "5"
666
990
  # }
667
991
  #
992
+ #
993
+ # d: {
994
+ # p: '1.0005',
995
+ # v: '5.71',
996
+ # a: '5.712855',
997
+ # S: 1,
998
+ # T: 1714325698237,
999
+ # t: 'edafcd9fdc2f426e82443d114691f724',
1000
+ # c: '',
1001
+ # i: 'C02__413321238354677760043',
1002
+ # m: 0,
1003
+ # st: 0,
1004
+ # n: '0.005712855',
1005
+ # N: 'USDT'
1006
+ # }
668
1007
  timestamp = self.safe_integer(trade, 'T')
669
1008
  tradeId = self.safe_string(trade, 't')
670
1009
  if timestamp is None:
@@ -675,6 +1014,8 @@ class mexc(ccxt.async_support.mexc):
675
1014
  rawSide = self.safe_string(trade, 'S')
676
1015
  side = 'buy' if (rawSide == '1') else 'sell'
677
1016
  isMaker = self.safe_integer(trade, 'm')
1017
+ feeAmount = self.safe_number(trade, 'n')
1018
+ feeCurrencyId = self.safe_string(trade, 'N')
678
1019
  return self.safe_trade({
679
1020
  'info': trade,
680
1021
  'id': tradeId,
@@ -688,13 +1029,18 @@ class mexc(ccxt.async_support.mexc):
688
1029
  'price': priceString,
689
1030
  'amount': amountString,
690
1031
  'cost': None,
691
- 'fee': None,
1032
+ 'fee': {
1033
+ 'cost': feeAmount,
1034
+ 'currency': self.safe_currency_code(feeCurrencyId),
1035
+ },
692
1036
  }, market)
693
1037
 
694
1038
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
695
1039
  """
696
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#spot-account-orders
697
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#margin-account-orders
1040
+
1041
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-orders
1042
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#margin-account-orders
1043
+
698
1044
  watches information on multiple orders made by the user
699
1045
  :param str symbol: unified market symbol of the market orders were made in
700
1046
  :param int [since]: the earliest time in ms to fetch orders for
@@ -897,13 +1243,12 @@ class mexc(ccxt.async_support.mexc):
897
1243
  }, market)
898
1244
 
899
1245
  def parse_ws_order_status(self, status, market=None):
900
- statuses = {
1246
+ statuses: dict = {
901
1247
  '1': 'open', # new order
902
1248
  '2': 'closed', # filled
903
1249
  '3': 'open', # partially filled
904
1250
  '4': 'canceled', # canceled
905
- '5': 'open', # order partially filled
906
- '6': 'closed', # partially filled then canceled
1251
+ '5': 'closed', # partially filled then canceled
907
1252
  'NEW': 'open',
908
1253
  'CANCELED': 'canceled',
909
1254
  'EXECUTED': 'closed',
@@ -912,7 +1257,7 @@ class mexc(ccxt.async_support.mexc):
912
1257
  return self.safe_string(statuses, status, status)
913
1258
 
914
1259
  def parse_ws_order_type(self, type):
915
- types = {
1260
+ types: dict = {
916
1261
  '1': 'limit', # LIMIT_ORDER
917
1262
  '2': None, # POST_ONLY
918
1263
  '3': None, # IMMEDIATE_OR_CANCEL
@@ -923,7 +1268,7 @@ class mexc(ccxt.async_support.mexc):
923
1268
  return self.safe_string(types, type)
924
1269
 
925
1270
  def parse_ws_time_in_force(self, timeInForce):
926
- timeInForceIds = {
1271
+ timeInForceIds: dict = {
927
1272
  '1': 'GTC', # LIMIT_ORDER
928
1273
  '2': 'PO', # POST_ONLY
929
1274
  '3': 'IOC', # IMMEDIATE_OR_CANCEL
@@ -935,7 +1280,9 @@ class mexc(ccxt.async_support.mexc):
935
1280
 
936
1281
  async def watch_balance(self, params={}) -> Balances:
937
1282
  """
938
- :see: https://mxcdevelop.github.io/apidocs/spot_v3_en/#spot-account-upadte
1283
+
1284
+ https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-upadte
1285
+
939
1286
  watch balance and get the amount of funds available for trading or funds locked in orders
940
1287
  :param dict [params]: extra parameters specific to the exchange API endpoint
941
1288
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
@@ -1022,7 +1369,7 @@ class mexc(ccxt.async_support.mexc):
1022
1369
  async def keep_alive_listen_key(self, listenKey, params={}):
1023
1370
  if listenKey is None:
1024
1371
  return
1025
- request = {
1372
+ request: dict = {
1026
1373
  'listenKey': listenKey,
1027
1374
  }
1028
1375
  try:
@@ -1047,14 +1394,14 @@ class mexc(ccxt.async_support.mexc):
1047
1394
  # "code": 0,
1048
1395
  # "msg": "spot@public.increase.depth.v3.api@BTCUSDT"
1049
1396
  # }
1050
- #
1051
- msg = self.safe_string(message, 'msg')
1397
+ # Set the default to an empty string if the message is empty during the test.
1398
+ msg = self.safe_string(message, 'msg', '')
1052
1399
  if msg == 'PONG':
1053
1400
  self.handle_pong(client, message)
1054
1401
  elif msg.find('@') > -1:
1055
1402
  parts = msg.split('@')
1056
1403
  channel = self.safe_string(parts, 1)
1057
- methods = {
1404
+ methods: dict = {
1058
1405
  'public.increase.depth.v3.api': self.handle_order_book_subscription,
1059
1406
  }
1060
1407
  method = self.safe_value(methods, channel)
@@ -1077,13 +1424,16 @@ class mexc(ccxt.async_support.mexc):
1077
1424
  else:
1078
1425
  parts = c.split('@')
1079
1426
  channel = self.safe_string(parts, 1)
1080
- methods = {
1427
+ methods: dict = {
1081
1428
  'public.deals.v3.api': self.handle_trades,
1082
1429
  'push.deal': self.handle_trades,
1083
1430
  'public.kline.v3.api': self.handle_ohlcv,
1084
1431
  'push.kline': self.handle_ohlcv,
1085
1432
  'public.bookTicker.v3.api': self.handle_ticker,
1433
+ 'public.miniTicker.v3.api': self.handle_ticker,
1434
+ 'public.miniTickers.v3.api': self.handle_tickers,
1086
1435
  'push.ticker': self.handle_ticker,
1436
+ 'push.tickers': self.handle_tickers,
1087
1437
  'public.increase.depth.v3.api': self.handle_order_book,
1088
1438
  'push.depth': self.handle_order_book,
1089
1439
  'private.orders.v3.api': self.handle_order,
@@ -1098,5 +1448,5 @@ class mexc(ccxt.async_support.mexc):
1098
1448
  method = methods[channel]
1099
1449
  method(client, message)
1100
1450
 
1101
- def ping(self, client):
1451
+ def ping(self, client: Client):
1102
1452
  return {'method': 'ping'}