ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3104 -880
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +557 -323
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1633 -268
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3104 -880
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +557 -323
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1632 -268
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/kucoin.py CHANGED
@@ -8,6 +8,7 @@ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById,
8
8
  from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
+ from typing import Any
11
12
  from ccxt.base.errors import ExchangeError
12
13
  from ccxt.base.errors import ArgumentsRequired
13
14
 
@@ -25,6 +26,7 @@ class kucoin(ccxt.async_support.kucoin):
25
26
  'cancelOrderWs': False,
26
27
  'cancelOrdersWs': False,
27
28
  'cancelAllOrdersWs': False,
29
+ 'watchBidsAsks': True,
28
30
  'watchOrderBook': True,
29
31
  'watchOrders': True,
30
32
  'watchMyTrades': True,
@@ -46,6 +48,9 @@ class kucoin(ccxt.async_support.kucoin):
46
48
  'snapshotMaxRetries': 3,
47
49
  'method': '/market/level2', # '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50'
48
50
  },
51
+ 'watchMyTrades': {
52
+ 'method': '/spotMarket/tradeOrders', # or '/spot/tradeFills'
53
+ },
49
54
  },
50
55
  'streaming': {
51
56
  # kucoin does not support built-in ws protocol-level ping-pong
@@ -121,7 +126,7 @@ class kucoin(ccxt.async_support.kucoin):
121
126
 
122
127
  async def subscribe(self, url, messageHash, subscriptionHash, params={}, subscription=None):
123
128
  requestId = str(self.request_id())
124
- request = {
129
+ request: dict = {
125
130
  'id': requestId,
126
131
  'type': 'subscribe',
127
132
  'topic': subscriptionHash,
@@ -135,7 +140,7 @@ class kucoin(ccxt.async_support.kucoin):
135
140
 
136
141
  async def subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription=None):
137
142
  requestId = str(self.request_id())
138
- request = {
143
+ request: dict = {
139
144
  'id': requestId,
140
145
  'type': 'subscribe',
141
146
  'topic': topic,
@@ -149,9 +154,30 @@ class kucoin(ccxt.async_support.kucoin):
149
154
  client.subscriptions[requestId] = subscriptionHash
150
155
  return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
151
156
 
157
+ async def un_subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription: dict = None):
158
+ requestId = str(self.request_id())
159
+ request: dict = {
160
+ 'id': requestId,
161
+ 'type': 'unsubscribe',
162
+ 'topic': topic,
163
+ 'response': True,
164
+ }
165
+ message = self.extend(request, params)
166
+ if subscription is not None:
167
+ subscription[requestId] = requestId
168
+ client = self.client(url)
169
+ for i in range(0, len(subscriptionHashes)):
170
+ subscriptionHash = subscriptionHashes[i]
171
+ if not (subscriptionHash in client.subscriptions):
172
+ client.subscriptions[requestId] = subscriptionHash
173
+ return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
174
+
152
175
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
153
176
  """
154
177
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
178
+
179
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/market-snapshot
180
+
155
181
  :param str symbol: unified symbol of the market to fetch the ticker for
156
182
  :param dict [params]: extra parameters specific to the exchange API endpoint
157
183
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -167,21 +193,43 @@ class kucoin(ccxt.async_support.kucoin):
167
193
 
168
194
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
169
195
  """
196
+
197
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/ticker
198
+
170
199
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
171
200
  :param str[] symbols: unified symbol of the market to fetch the ticker for
172
201
  :param dict [params]: extra parameters specific to the exchange API endpoint
202
+ :param str [params.method]: either '/market/snapshot' or '/market/ticker' default is '/market/ticker'
173
203
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
174
204
  """
175
205
  await self.load_markets()
176
206
  symbols = self.market_symbols(symbols)
177
207
  messageHash = 'tickers'
208
+ method = None
209
+ method, params = self.handle_option_and_params(params, 'watchTickers', 'method', '/market/ticker')
210
+ messageHashes = []
211
+ topics = []
178
212
  if symbols is not None:
179
- messageHash = 'tickers::' + ','.join(symbols)
213
+ for i in range(0, len(symbols)):
214
+ symbol = symbols[i]
215
+ messageHashes.append('ticker:' + symbol)
216
+ market = self.market(symbol)
217
+ topics.append(method + ':' + market['id'])
180
218
  url = await self.negotiate(False)
181
- topic = '/market/ticker:all'
182
- tickers = await self.subscribe(url, messageHash, topic, params)
183
- if self.newUpdates:
184
- return tickers
219
+ tickers = None
220
+ if symbols is None:
221
+ allTopic = method + ':all'
222
+ tickers = await self.subscribe(url, messageHash, allTopic, params)
223
+ if self.newUpdates:
224
+ return tickers
225
+ else:
226
+ marketIds = self.market_ids(symbols)
227
+ symbolsTopic = method + ':' + ','.join(marketIds)
228
+ tickers = await self.subscribe_multiple(url, messageHashes, symbolsTopic, topics, params)
229
+ if self.newUpdates:
230
+ newDict: dict = {}
231
+ newDict[tickers['symbol']] = tickers
232
+ return newDict
185
233
  return self.filter_by_array(self.tickers, 'symbol', symbols)
186
234
 
187
235
  def handle_ticker(self, client: Client, message):
@@ -258,24 +306,99 @@ class kucoin(ccxt.async_support.kucoin):
258
306
  messageHash = 'ticker:' + symbol
259
307
  client.resolve(ticker, messageHash)
260
308
  # watchTickers
261
- allTickers = {}
309
+ allTickers: dict = {}
262
310
  allTickers[symbol] = ticker
263
311
  client.resolve(allTickers, 'tickers')
264
- messageHashes = self.find_message_hashes(client, 'tickers::')
265
- for i in range(0, len(messageHashes)):
266
- currentMessageHash = messageHashes[i]
267
- parts = currentMessageHash.split('::')
268
- symbolsString = parts[1]
269
- symbols = symbolsString.split(',')
270
- tickers = self.filter_by_array(self.tickers, 'symbol', symbols)
271
- tickersSymbols = list(tickers.keys())
272
- numTickers = len(tickersSymbols)
273
- if numTickers > 0:
274
- client.resolve(tickers, currentMessageHash)
312
+
313
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
314
+ """
315
+
316
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
317
+
318
+ watches best bid & ask for symbols
319
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
320
+ :param dict [params]: extra parameters specific to the exchange API endpoint
321
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
322
+ """
323
+ ticker = await self.watch_multi_helper('watchBidsAsks', '/spotMarket/level1:', symbols, params)
324
+ if self.newUpdates:
325
+ tickers: dict = {}
326
+ tickers[ticker['symbol']] = ticker
327
+ return tickers
328
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
329
+
330
+ async def watch_multi_helper(self, methodName, channelName: str, symbols: Strings = None, params={}):
331
+ await self.load_markets()
332
+ symbols = self.market_symbols(symbols, None, False, True, False)
333
+ length = len(symbols)
334
+ if length > 100:
335
+ raise ArgumentsRequired(self.id + ' ' + methodName + '() accepts a maximum of 100 symbols')
336
+ messageHashes = []
337
+ for i in range(0, len(symbols)):
338
+ symbol = symbols[i]
339
+ market = self.market(symbol)
340
+ messageHashes.append('bidask@' + market['symbol'])
341
+ url = await self.negotiate(False)
342
+ marketIds = self.market_ids(symbols)
343
+ joined = ','.join(marketIds)
344
+ requestId = str(self.request_id())
345
+ request: dict = {
346
+ 'id': requestId,
347
+ 'type': 'subscribe',
348
+ 'topic': channelName + joined,
349
+ 'response': True,
350
+ }
351
+ message = self.extend(request, params)
352
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
353
+
354
+ def handle_bid_ask(self, client: Client, message):
355
+ #
356
+ # arrives one symbol dict
357
+ #
358
+ # {
359
+ # topic: '/spotMarket/level1:ETH-USDT',
360
+ # type: 'message',
361
+ # data: {
362
+ # asks: ['3347.42', '2.0778387'],
363
+ # bids: ['3347.41', '6.0411697'],
364
+ # timestamp: 1712231142085
365
+ # },
366
+ # subject: 'level1'
367
+ # }
368
+ #
369
+ parsedTicker = self.parse_ws_bid_ask(message)
370
+ symbol = parsedTicker['symbol']
371
+ self.bidsasks[symbol] = parsedTicker
372
+ messageHash = 'bidask@' + symbol
373
+ client.resolve(parsedTicker, messageHash)
374
+
375
+ def parse_ws_bid_ask(self, ticker, market=None):
376
+ topic = self.safe_string(ticker, 'topic')
377
+ parts = topic.split(':')
378
+ marketId = parts[1]
379
+ market = self.safe_market(marketId, market)
380
+ symbol = self.safe_string(market, 'symbol')
381
+ data = self.safe_dict(ticker, 'data', {})
382
+ ask = self.safe_list(data, 'asks', [])
383
+ bid = self.safe_list(data, 'bids', [])
384
+ timestamp = self.safe_integer(data, 'timestamp')
385
+ return self.safe_ticker({
386
+ 'symbol': symbol,
387
+ 'timestamp': timestamp,
388
+ 'datetime': self.iso8601(timestamp),
389
+ 'ask': self.safe_number(ask, 0),
390
+ 'askVolume': self.safe_number(ask, 1),
391
+ 'bid': self.safe_number(bid, 0),
392
+ 'bidVolume': self.safe_number(bid, 1),
393
+ 'info': ticker,
394
+ }, market)
275
395
 
276
396
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
277
397
  """
278
398
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
399
+
400
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/klines
401
+
279
402
  :param str symbol: unified symbol of the market to fetch OHLCV data for
280
403
  :param str timeframe: the length of time each candle represents
281
404
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -340,6 +463,9 @@ class kucoin(ccxt.async_support.kucoin):
340
463
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
341
464
  """
342
465
  get the list of most recent trades for a particular symbol
466
+
467
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
468
+
343
469
  :param str symbol: unified symbol of the market to fetch trades for
344
470
  :param int [since]: timestamp in ms of the earliest trade to fetch
345
471
  :param int [limit]: the maximum amount of trades to fetch
@@ -351,7 +477,10 @@ class kucoin(ccxt.async_support.kucoin):
351
477
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
352
478
  """
353
479
  get the list of most recent trades for a particular symbol
354
- :param str symbol: unified symbol of the market to fetch trades for
480
+
481
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
482
+
483
+ :param str[] symbols:
355
484
  :param int [since]: timestamp in ms of the earliest trade to fetch
356
485
  :param int [limit]: the maximum amount of trades to fetch
357
486
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -379,6 +508,48 @@ class kucoin(ccxt.async_support.kucoin):
379
508
  limit = trades.getLimit(tradeSymbol, limit)
380
509
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
381
510
 
511
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
512
+ """
513
+ unWatches trades stream
514
+
515
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
516
+
517
+ :param str symbols:
518
+ :param dict [params]: extra parameters specific to the exchange API endpoint
519
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
520
+ """
521
+ await self.load_markets()
522
+ symbols = self.market_symbols(symbols, None, False)
523
+ marketIds = self.market_ids(symbols)
524
+ url = await self.negotiate(False)
525
+ messageHashes = []
526
+ subscriptionHashes = []
527
+ topic = '/market/match:' + ','.join(marketIds)
528
+ for i in range(0, len(symbols)):
529
+ symbol = symbols[i]
530
+ messageHashes.append('unsubscribe:trades:' + symbol)
531
+ subscriptionHashes.append('trades:' + symbol)
532
+ subscription = {
533
+ 'messageHashes': messageHashes,
534
+ 'subMessageHashes': subscriptionHashes,
535
+ 'topic': 'trades',
536
+ 'unsubscribe': True,
537
+ 'symbols': symbols,
538
+ }
539
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
540
+
541
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
542
+ """
543
+ unWatches trades stream
544
+
545
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
546
+
547
+ :param str symbol: unified symbol of the market to fetch trades for
548
+ :param dict [params]: extra parameters specific to the exchange API endpoint
549
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
550
+ """
551
+ return await self.un_watch_trades_for_symbols([symbol], params)
552
+
382
553
  def handle_trade(self, client: Client, message):
383
554
  #
384
555
  # {
@@ -413,10 +584,12 @@ class kucoin(ccxt.async_support.kucoin):
413
584
 
414
585
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
415
586
  """
416
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
417
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
418
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
419
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
587
+
588
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
589
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
590
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
591
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
592
+
420
593
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
421
594
  :param str symbol: unified symbol of the market to fetch the order book for
422
595
  :param int [limit]: the maximum amount of order book entries to return
@@ -441,12 +614,30 @@ class kucoin(ccxt.async_support.kucoin):
441
614
  #
442
615
  return await self.watch_order_book_for_symbols([symbol], limit, params)
443
616
 
617
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
618
+ """
619
+
620
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
621
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
622
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
623
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
624
+
625
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
626
+ :param str symbol: unified symbol of the market to fetch the order book for
627
+ :param dict [params]: extra parameters specific to the exchange API endpoint
628
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
629
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
630
+ """
631
+ return await self.un_watch_order_book_for_symbols([symbol], params)
632
+
444
633
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
445
634
  """
446
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
447
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
448
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
449
- :see: https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
635
+
636
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
637
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
638
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
639
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
640
+
450
641
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
451
642
  :param str[] symbols: unified array of symbols
452
643
  :param int [limit]: the maximum amount of order book entries to return
@@ -486,6 +677,46 @@ class kucoin(ccxt.async_support.kucoin):
486
677
  orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, params, subscription)
487
678
  return orderbook.limit()
488
679
 
680
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
681
+ """
682
+
683
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
684
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
685
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
686
+ https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
687
+
688
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
689
+ :param str[] symbols: unified array of symbols
690
+ :param dict [params]: extra parameters specific to the exchange API endpoint
691
+ :param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
692
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
693
+ """
694
+ limit = self.safe_integer(params, 'limit')
695
+ params = self.omit(params, 'limit')
696
+ await self.load_markets()
697
+ symbols = self.market_symbols(symbols, None, False)
698
+ marketIds = self.market_ids(symbols)
699
+ url = await self.negotiate(False)
700
+ method: Str = None
701
+ method, params = self.handle_option_and_params(params, 'watchOrderBook', 'method', '/market/level2')
702
+ if (limit == 5) or (limit == 50):
703
+ method = '/spotMarket/level2Depth' + str(limit)
704
+ topic = method + ':' + ','.join(marketIds)
705
+ messageHashes = []
706
+ subscriptionHashes = []
707
+ for i in range(0, len(symbols)):
708
+ symbol = symbols[i]
709
+ messageHashes.append('unsubscribe:orderbook:' + symbol)
710
+ subscriptionHashes.append('orderbook:' + symbol)
711
+ subscription = {
712
+ 'messageHashes': messageHashes,
713
+ 'symbols': symbols,
714
+ 'unsubscribe': True,
715
+ 'topic': 'orderbook',
716
+ 'subMessageHashes': subscriptionHashes,
717
+ }
718
+ return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
719
+
489
720
  def handle_order_book(self, client: Client, message):
490
721
  #
491
722
  # initial snapshot is fetched with ccxt's fetchOrderBook
@@ -536,14 +767,18 @@ class kucoin(ccxt.async_support.kucoin):
536
767
  marketId = self.safe_string(data, 'symbol', topicSymbol)
537
768
  symbol = self.safe_symbol(marketId, None, '-')
538
769
  messageHash = 'orderbook:' + symbol
539
- orderbook = self.safe_dict(self.orderbooks, symbol)
770
+ # orderbook = self.safe_dict(self.orderbooks, symbol)
540
771
  if subject == 'level2':
541
- if orderbook is None:
542
- orderbook = self.order_book()
772
+ if not (symbol in self.orderbooks):
773
+ self.orderbooks[symbol] = self.order_book()
543
774
  else:
775
+ orderbook = self.orderbooks[symbol]
544
776
  orderbook.reset()
545
- orderbook['symbol'] = symbol
777
+ self.orderbooks[symbol]['symbol'] = symbol
546
778
  else:
779
+ if not (symbol in self.orderbooks):
780
+ self.orderbooks[symbol] = self.order_book()
781
+ orderbook = self.orderbooks[symbol]
547
782
  nonce = self.safe_integer(orderbook, 'nonce')
548
783
  deltaEnd = self.safe_integer_2(data, 'sequenceEnd', 'timestamp')
549
784
  if nonce is None:
@@ -563,8 +798,8 @@ class kucoin(ccxt.async_support.kucoin):
563
798
  return
564
799
  elif nonce >= deltaEnd:
565
800
  return
566
- self.handle_delta(orderbook, data)
567
- client.resolve(orderbook, messageHash)
801
+ self.handle_delta(self.orderbooks[symbol], data)
802
+ client.resolve(self.orderbooks[symbol], messageHash)
568
803
 
569
804
  def get_cache_index(self, orderbook, cache):
570
805
  firstDelta = self.safe_value(cache, 0)
@@ -621,12 +856,23 @@ class kucoin(ccxt.async_support.kucoin):
621
856
  # }
622
857
  #
623
858
  id = self.safe_string(message, 'id')
859
+ if not (id in client.subscriptions):
860
+ return
624
861
  subscriptionHash = self.safe_string(client.subscriptions, id)
625
862
  subscription = self.safe_value(client.subscriptions, subscriptionHash)
626
863
  del client.subscriptions[id]
627
864
  method = self.safe_value(subscription, 'method')
628
865
  if method is not None:
629
866
  method(client, message, subscription)
867
+ isUnSub = self.safe_bool(subscription, 'unsubscribe', False)
868
+ if isUnSub:
869
+ messageHashes = self.safe_list(subscription, 'messageHashes', [])
870
+ subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
871
+ for i in range(0, len(messageHashes)):
872
+ messageHash = messageHashes[i]
873
+ subHash = subMessageHashes[i]
874
+ self.clean_unsubscription(client, subHash, messageHash)
875
+ self.clean_cache(subscription)
630
876
 
631
877
  def handle_system_status(self, client: Client, message):
632
878
  #
@@ -644,19 +890,23 @@ class kucoin(ccxt.async_support.kucoin):
644
890
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
645
891
  """
646
892
  watches information on multiple orders made by the user
893
+
894
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
895
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/stop-order-event
896
+
647
897
  :param str symbol: unified market symbol of the market orders were made in
648
898
  :param int [since]: the earliest time in ms to fetch orders for
649
899
  :param int [limit]: the maximum number of order structures to retrieve
650
900
  :param dict [params]: extra parameters specific to the exchange API endpoint
651
- :param boolean [params.stop]: trigger orders are watched if True
901
+ :param boolean [params.trigger]: trigger orders are watched if True
652
902
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
653
903
  """
654
904
  await self.load_markets()
655
- stop = self.safe_value_2(params, 'stop', 'trigger')
905
+ trigger = self.safe_value_2(params, 'stop', 'trigger')
656
906
  params = self.omit(params, ['stop', 'trigger'])
657
907
  url = await self.negotiate(True)
658
- topic = '/spotMarket/advancedOrders' if stop else '/spotMarket/tradeOrders'
659
- request = {
908
+ topic = '/spotMarket/advancedOrders' if trigger else '/spotMarket/tradeOrders'
909
+ request: dict = {
660
910
  'privateChannel': True,
661
911
  }
662
912
  messageHash = 'orders'
@@ -670,7 +920,7 @@ class kucoin(ccxt.async_support.kucoin):
670
920
  return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
671
921
 
672
922
  def parse_ws_order_status(self, status):
673
- statuses = {
923
+ statuses: dict = {
674
924
  'open': 'open',
675
925
  'filled': 'closed',
676
926
  'match': 'open',
@@ -777,6 +1027,9 @@ class kucoin(ccxt.async_support.kucoin):
777
1027
  #
778
1028
  messageHash = 'orders'
779
1029
  data = self.safe_value(message, 'data')
1030
+ tradeId = self.safe_string(data, 'tradeId')
1031
+ if tradeId is not None:
1032
+ self.handle_my_trade(client, message)
780
1033
  parsed = self.parse_ws_order(data)
781
1034
  symbol = self.safe_string(parsed, 'symbol')
782
1035
  orderId = self.safe_string(parsed, 'id')
@@ -801,16 +1054,21 @@ class kucoin(ccxt.async_support.kucoin):
801
1054
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
802
1055
  """
803
1056
  watches information on multiple trades made by the user
1057
+
1058
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
1059
+
804
1060
  :param str symbol: unified market symbol of the market trades were made in
805
1061
  :param int [since]: the earliest time in ms to fetch trades for
806
1062
  :param int [limit]: the maximum number of trade structures to retrieve
807
1063
  :param dict [params]: extra parameters specific to the exchange API endpoint
808
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
1064
+ :param str [params.method]: '/spotMarket/tradeOrders' or '/spot/tradeFills' default is '/spotMarket/tradeOrders'
1065
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
809
1066
  """
810
1067
  await self.load_markets()
811
1068
  url = await self.negotiate(True)
812
- topic = '/spot/tradeFills'
813
- request = {
1069
+ topic: Str = None
1070
+ topic, params = self.handle_option_and_params(params, 'watchMyTrades', 'method', '/spotMarket/tradeOrders')
1071
+ request: dict = {
814
1072
  'privateChannel': True,
815
1073
  }
816
1074
  messageHash = 'myTrades'
@@ -824,33 +1082,86 @@ class kucoin(ccxt.async_support.kucoin):
824
1082
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
825
1083
 
826
1084
  def handle_my_trade(self, client: Client, message):
827
- trades = self.myTrades
828
- if trades is None:
1085
+ #
1086
+ # {
1087
+ # "type": "message",
1088
+ # "topic": "/spotMarket/tradeOrders",
1089
+ # "subject": "orderChange",
1090
+ # "channelType": "private",
1091
+ # "data": {
1092
+ # "symbol": "KCS-USDT",
1093
+ # "orderType": "limit",
1094
+ # "side": "sell",
1095
+ # "orderId": "5efab07953bdea00089965fa",
1096
+ # "liquidity": "taker",
1097
+ # "type": "match",
1098
+ # "feeType": "takerFee",
1099
+ # "orderTime": 1670329987026,
1100
+ # "size": "0.1",
1101
+ # "filledSize": "0.1",
1102
+ # "price": "0.938",
1103
+ # "matchPrice": "0.96738",
1104
+ # "matchSize": "0.1",
1105
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
1106
+ # "clientOid": "1593487481000313",
1107
+ # "remainSize": "0",
1108
+ # "status": "match",
1109
+ # "ts": 1670329987311000000
1110
+ # }
1111
+ # }
1112
+ #
1113
+ if self.myTrades is None:
829
1114
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
830
- trades = ArrayCacheBySymbolById(limit)
831
- data = self.safe_value(message, 'data')
1115
+ self.myTrades = ArrayCacheBySymbolById(limit)
1116
+ data = self.safe_dict(message, 'data')
832
1117
  parsed = self.parse_ws_trade(data)
833
- trades.append(parsed)
1118
+ myTrades = self.myTrades
1119
+ myTrades.append(parsed)
834
1120
  messageHash = 'myTrades'
835
- client.resolve(trades, messageHash)
1121
+ client.resolve(self.myTrades, messageHash)
836
1122
  symbolSpecificMessageHash = messageHash + ':' + parsed['symbol']
837
- client.resolve(trades, symbolSpecificMessageHash)
1123
+ client.resolve(self.myTrades, symbolSpecificMessageHash)
838
1124
 
839
1125
  def parse_ws_trade(self, trade, market=None):
840
1126
  #
841
- # {
842
- # "fee": 0.00262148,
843
- # "feeCurrency": "USDT",
844
- # "feeRate": 0.001,
845
- # "orderId": "62417436b29df8000183df2f",
846
- # "orderType": "market",
847
- # "price": 131.074,
848
- # "side": "sell",
849
- # "size": 0.02,
850
- # "symbol": "LTC-USDT",
851
- # "time": "1648456758734571745",
852
- # "tradeId": "624174362e113d2f467b3043"
853
- # }
1127
+ # /spotMarket/tradeOrders
1128
+ #
1129
+ # {
1130
+ # "symbol": "KCS-USDT",
1131
+ # "orderType": "limit",
1132
+ # "side": "sell",
1133
+ # "orderId": "5efab07953bdea00089965fa",
1134
+ # "liquidity": "taker",
1135
+ # "type": "match",
1136
+ # "feeType": "takerFee",
1137
+ # "orderTime": 1670329987026,
1138
+ # "size": "0.1",
1139
+ # "filledSize": "0.1",
1140
+ # "price": "0.938",
1141
+ # "matchPrice": "0.96738",
1142
+ # "matchSize": "0.1",
1143
+ # "tradeId": "5efab07a4ee4c7000a82d6d9",
1144
+ # "clientOid": "1593487481000313",
1145
+ # "remainSize": "0",
1146
+ # "status": "match",
1147
+ # "ts": 1670329987311000000
1148
+ # }
1149
+ #
1150
+ # /spot/tradeFills
1151
+ #
1152
+ # {
1153
+ # "fee": 0.00262148,
1154
+ # "feeCurrency": "USDT",
1155
+ # "feeRate": 0.001,
1156
+ # "orderId": "62417436b29df8000183df2f",
1157
+ # "orderType": "market",
1158
+ # "price": 131.074,
1159
+ # "side": "sell",
1160
+ # "size": 0.02,
1161
+ # "symbol": "LTC-USDT",
1162
+ # "time": "1648456758734571745",
1163
+ # "tradeId": "624174362e113d2f467b3043"
1164
+ # }
854
1165
  #
855
1166
  marketId = self.safe_string(trade, 'symbol')
856
1167
  market = self.safe_market(marketId, market, '-')
@@ -858,18 +1169,17 @@ class kucoin(ccxt.async_support.kucoin):
858
1169
  type = self.safe_string(trade, 'orderType')
859
1170
  side = self.safe_string(trade, 'side')
860
1171
  tradeId = self.safe_string(trade, 'tradeId')
861
- price = self.safe_string(trade, 'price')
862
- amount = self.safe_string(trade, 'size')
1172
+ price = self.safe_string(trade, 'matchPrice')
1173
+ amount = self.safe_string(trade, 'matchSize')
1174
+ if price is None:
1175
+ # /spot/tradeFills
1176
+ price = self.safe_string(trade, 'price')
1177
+ amount = self.safe_string(trade, 'size')
863
1178
  order = self.safe_string(trade, 'orderId')
864
- timestamp = self.safe_integer_product(trade, 'time', 0.000001)
1179
+ timestamp = self.safe_integer_product_2(trade, 'ts', 'time', 0.000001)
865
1180
  feeCurrency = market['quote']
866
1181
  feeRate = self.safe_string(trade, 'feeRate')
867
1182
  feeCost = self.safe_string(trade, 'fee')
868
- fee = {
869
- 'cost': feeCost,
870
- 'rate': feeRate,
871
- 'currency': feeCurrency,
872
- }
873
1183
  return self.safe_trade({
874
1184
  'info': trade,
875
1185
  'timestamp': timestamp,
@@ -878,24 +1188,31 @@ class kucoin(ccxt.async_support.kucoin):
878
1188
  'id': tradeId,
879
1189
  'order': order,
880
1190
  'type': type,
881
- 'takerOrMaker': None,
1191
+ 'takerOrMaker': self.safe_string(trade, 'liquidity'),
882
1192
  'side': side,
883
1193
  'price': price,
884
1194
  'amount': amount,
885
1195
  'cost': None,
886
- 'fee': fee,
1196
+ 'fee': {
1197
+ 'cost': feeCost,
1198
+ 'rate': feeRate,
1199
+ 'currency': feeCurrency,
1200
+ },
887
1201
  }, market)
888
1202
 
889
1203
  async def watch_balance(self, params={}) -> Balances:
890
1204
  """
891
1205
  watch balance and get the amount of funds available for trading or funds locked in orders
1206
+
1207
+ https://www.kucoin.com/docs/websocket/spot-trading/private-channels/account-balance-change
1208
+
892
1209
  :param dict [params]: extra parameters specific to the exchange API endpoint
893
1210
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
894
1211
  """
895
1212
  await self.load_markets()
896
1213
  url = await self.negotiate(True)
897
1214
  topic = '/account/balance'
898
- request = {
1215
+ request: dict = {
899
1216
  'privateChannel': True,
900
1217
  }
901
1218
  messageHash = 'balance'
@@ -974,7 +1291,8 @@ class kucoin(ccxt.async_support.kucoin):
974
1291
  self.handle_ticker(client, message)
975
1292
  return
976
1293
  subject = self.safe_string(message, 'subject')
977
- methods = {
1294
+ methods: dict = {
1295
+ 'level1': self.handle_bid_ask,
978
1296
  'level2': self.handle_order_book,
979
1297
  'trade.l2update': self.handle_order_book,
980
1298
  'trade.ticker': self.handle_ticker,
@@ -982,15 +1300,15 @@ class kucoin(ccxt.async_support.kucoin):
982
1300
  'trade.l3match': self.handle_trade,
983
1301
  'trade.candles.update': self.handle_ohlcv,
984
1302
  'account.balance': self.handle_balance,
985
- '/spot/tradeFills': self.handle_my_trade,
986
1303
  'orderChange': self.handle_order,
987
1304
  'stopOrder': self.handle_order,
1305
+ '/spot/tradeFills': self.handle_my_trade,
988
1306
  }
989
1307
  method = self.safe_value(methods, subject)
990
1308
  if method is not None:
991
1309
  method(client, message)
992
1310
 
993
- def ping(self, client):
1311
+ def ping(self, client: Client):
994
1312
  # kucoin does not support built-in ws protocol-level ping-pong
995
1313
  # instead it requires a custom json-based text ping-pong
996
1314
  # https://docs.kucoin.com/#ping
@@ -1023,7 +1341,7 @@ class kucoin(ccxt.async_support.kucoin):
1023
1341
 
1024
1342
  def handle_message(self, client: Client, message):
1025
1343
  type = self.safe_string(message, 'type')
1026
- methods = {
1344
+ methods: dict = {
1027
1345
  # 'heartbeat': self.handleHeartbeat,
1028
1346
  'welcome': self.handle_system_status,
1029
1347
  'ack': self.handle_subscription_status,