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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/poloniex.py CHANGED
@@ -10,9 +10,9 @@ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, Ord
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import BadRequest
14
15
  from ccxt.base.errors import InvalidOrder
15
- from ccxt.base.errors import AuthenticationError
16
16
  from ccxt.base.precise import Precise
17
17
 
18
18
 
@@ -27,6 +27,7 @@ class poloniex(ccxt.async_support.poloniex):
27
27
  'watchTicker': True,
28
28
  'watchTickers': True,
29
29
  'watchTrades': True,
30
+ 'watchTradesForSymbols': True,
30
31
  'watchBalance': True,
31
32
  'watchStatus': False,
32
33
  'watchOrders': True,
@@ -84,9 +85,11 @@ class poloniex(ccxt.async_support.poloniex):
84
85
 
85
86
  async def authenticate(self, params={}):
86
87
  """
87
- * @ignore
88
+ @ignore
88
89
  authenticates the user to access private web socket channels
89
- :see: https://docs.poloniex.com/#authenticated-channels-market-data-authentication
90
+
91
+ https://api-docs.poloniex.com/spot/websocket/authentication
92
+
90
93
  :returns dict: response from exchange
91
94
  """
92
95
  self.check_required_credentials()
@@ -99,7 +102,7 @@ class poloniex(ccxt.async_support.poloniex):
99
102
  accessPath = '/ws'
100
103
  requestString = 'GET\n' + accessPath + '\nsignTimestamp=' + timestamp
101
104
  signature = self.hmac(self.encode(requestString), self.encode(self.secret), hashlib.sha256, 'base64')
102
- request = {
105
+ request: dict = {
103
106
  'event': 'subscribe',
104
107
  'channel': ['auth'],
105
108
  'params': {
@@ -111,7 +114,7 @@ class poloniex(ccxt.async_support.poloniex):
111
114
  },
112
115
  }
113
116
  message = self.extend(request, params)
114
- future = await self.watch(url, messageHash, message)
117
+ future = await self.watch(url, messageHash, message, messageHash)
115
118
  #
116
119
  # {
117
120
  # "data": {
@@ -137,17 +140,18 @@ class poloniex(ccxt.async_support.poloniex):
137
140
 
138
141
  async def subscribe(self, name: str, messageHash: str, isPrivate: bool, symbols: Strings = None, params={}):
139
142
  """
140
- * @ignore
143
+ @ignore
141
144
  Connects to a websocket channel
142
145
  :param str name: name of the channel
146
+ :param str messageHash: unique identifier for the message
143
147
  :param boolean isPrivate: True for the authenticated url, False for the public url
144
- :param str[]|None symbols: CCXT market symbols
148
+ :param str[] [symbols]: CCXT market symbols
145
149
  :param dict [params]: extra parameters specific to the poloniex api
146
150
  :returns dict: data from the websocket stream
147
151
  """
148
152
  publicOrPrivate = 'private' if isPrivate else 'public'
149
153
  url = self.urls['api']['ws'][publicOrPrivate]
150
- subscribe = {
154
+ subscribe: dict = {
151
155
  'event': 'subscribe',
152
156
  'channel': [
153
157
  name,
@@ -166,16 +170,15 @@ class poloniex(ccxt.async_support.poloniex):
166
170
 
167
171
  async def trade_request(self, name: str, params={}):
168
172
  """
169
- * @ignore
173
+ @ignore
170
174
  Connects to a websocket channel
171
175
  :param str name: name of the channel
172
- :param str[]|None symbols: CCXT market symbols
173
176
  :param dict [params]: extra parameters specific to the poloniex api
174
177
  :returns dict: data from the websocket stream
175
178
  """
176
179
  url = self.urls['api']['ws']['private']
177
180
  messageHash = str(self.nonce())
178
- subscribe = {
181
+ subscribe: dict = {
179
182
  'id': messageHash,
180
183
  'event': name,
181
184
  'params': params,
@@ -184,19 +187,21 @@ class poloniex(ccxt.async_support.poloniex):
184
187
 
185
188
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
186
189
  """
187
- :see: https://docs.poloniex.com/#authenticated-channels-trade-requests-create-order
190
+
191
+ https://api-docs.poloniex.com/spot/websocket/trade-request#create-order
192
+
188
193
  create a trade order
189
194
  :param str symbol: unified symbol of the market to create an order in
190
195
  :param str type: 'market' or 'limit'
191
196
  :param str side: 'buy' or 'sell'
192
197
  :param float amount: how much of currency you want to trade in units of base currency
193
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
198
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
194
199
  :param dict [params]: extra parameters specific to the poloniex api endpoint
195
200
  :param str [params.timeInForce]: GTC(default), IOC, FOK
196
201
  :param str [params.clientOrderId]: Maximum 64-character length.*
197
202
  :param float [params.cost]: *spot market buy only* the quote quantity that can be used alternative for the amount
198
- *
199
- * EXCHANGE SPECIFIC PARAMETERS
203
+
204
+ EXCHANGE SPECIFIC PARAMETERS
200
205
  :param str [params.amount]: quote units for the order
201
206
  :param boolean [params.allowBorrow]: allow order to be placed by borrowing funds(Default: False)
202
207
  :param str [params.stpMode]: self-trade prevention, defaults to expire_taker, none: enable self-trade; expire_taker: taker order will be canceled when self-trade happens
@@ -211,7 +216,7 @@ class poloniex(ccxt.async_support.poloniex):
211
216
  isPostOnly = self.is_post_only(uppercaseType == 'MARKET', uppercaseType == 'LIMIT_MAKER', params)
212
217
  if isPostOnly:
213
218
  uppercaseType = 'LIMIT_MAKER'
214
- request = {
219
+ request: dict = {
215
220
  'symbol': market['id'],
216
221
  'side': side.upper(),
217
222
  'type': type.upper(),
@@ -243,7 +248,9 @@ class poloniex(ccxt.async_support.poloniex):
243
248
 
244
249
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
245
250
  """
246
- :see: https://docs.poloniex.com/#authenticated-channels-trade-requests-cancel-multiple-orders
251
+
252
+ https://api-docs.poloniex.com/spot/websocket/trade-request#cancel-multiple-orders
253
+
247
254
  cancel multiple orders
248
255
  :param str id: order id
249
256
  :param str [symbol]: unified market symbol
@@ -259,7 +266,9 @@ class poloniex(ccxt.async_support.poloniex):
259
266
 
260
267
  async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
261
268
  """
262
- :see: https://docs.poloniex.com/#authenticated-channels-trade-requests-cancel-multiple-orders
269
+
270
+ https://api-docs.poloniex.com/spot/websocket/trade-request#cancel-multiple-orders
271
+
263
272
  cancel multiple orders
264
273
  :param str[] ids: order ids
265
274
  :param str symbol: unified market symbol, default is None
@@ -269,14 +278,16 @@ class poloniex(ccxt.async_support.poloniex):
269
278
  """
270
279
  await self.load_markets()
271
280
  await self.authenticate()
272
- request = {
281
+ request: dict = {
273
282
  'orderIds': ids,
274
283
  }
275
284
  return await self.trade_request('cancelOrders', self.extend(request, params))
276
285
 
277
286
  async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
278
287
  """
279
- :see: https://docs.poloniex.com/#authenticated-channels-trade-requests-cancel-all-orders
288
+
289
+ https://api-docs.poloniex.com/spot/websocket/trade-request#cancel-all-orders
290
+
280
291
  cancel all open orders of a type. Only applicable to Option in Portfolio Margin mode, and MMP privilege is required.
281
292
  :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
282
293
  :param dict [params]: extra parameters specific to the poloniex api endpoint
@@ -298,7 +309,7 @@ class poloniex(ccxt.async_support.poloniex):
298
309
  # }]
299
310
  # }
300
311
  #
301
- messageHash = self.safe_integer(message, 'id')
312
+ messageHash = self.safe_string(message, 'id')
302
313
  data = self.safe_value(message, 'data', [])
303
314
  orders = []
304
315
  for i in range(0, len(data)):
@@ -310,7 +321,9 @@ class poloniex(ccxt.async_support.poloniex):
310
321
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
311
322
  """
312
323
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
313
- :see: https://docs.poloniex.com/#public-channels-market-data-candlesticks
324
+
325
+ https://api-docs.poloniex.com/spot/websocket/market-data#candlesticks
326
+
314
327
  :param str symbol: unified symbol of the market to fetch OHLCV data for
315
328
  :param str timeframe: the length of time each candle represents
316
329
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -331,7 +344,9 @@ class poloniex(ccxt.async_support.poloniex):
331
344
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
332
345
  """
333
346
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
334
- :see: https://docs.poloniex.com/#public-channels-market-data-ticker
347
+
348
+ https://api-docs.poloniex.com/spot/websocket/market-data#ticker
349
+
335
350
  :param str symbol: unified symbol of the market to fetch the ticker for
336
351
  :param dict [params]: extra parameters specific to the exchange API endpoint
337
352
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -344,8 +359,10 @@ class poloniex(ccxt.async_support.poloniex):
344
359
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
345
360
  """
346
361
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
347
- :see: https://docs.poloniex.com/#public-channels-market-data-ticker
348
- :param str symbol: unified symbol of the market to fetch the ticker for
362
+
363
+ https://api-docs.poloniex.com/spot/websocket/market-data#ticker
364
+
365
+ :param str[] symbols:
349
366
  :param dict [params]: extra parameters specific to the exchange API endpoint
350
367
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
351
368
  """
@@ -360,25 +377,59 @@ class poloniex(ccxt.async_support.poloniex):
360
377
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
361
378
  """
362
379
  get the list of most recent trades for a particular symbol
363
- :see: https://docs.poloniex.com/#public-channels-market-data-trades
380
+
381
+ https://api-docs.poloniex.com/spot/websocket/market-data#trades
382
+
364
383
  :param str symbol: unified symbol of the market to fetch trades for
365
384
  :param int [since]: timestamp in ms of the earliest trade to fetch
366
385
  :param int [limit]: the maximum amount of trades to fetch
367
386
  :param dict [params]: extra parameters specific to the exchange API endpoint
368
387
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
369
388
  """
389
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
390
+
391
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
392
+ """
393
+ get the list of most recent trades for a list of symbols
394
+
395
+ https://api-docs.poloniex.com/spot/websocket/market-data#trades
396
+
397
+ :param str[] symbols: unified symbol of the market to fetch trades for
398
+ :param int [since]: timestamp in ms of the earliest trade to fetch
399
+ :param int [limit]: the maximum amount of trades to fetch
400
+ :param dict [params]: extra parameters specific to the exchange API endpoint
401
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
402
+ """
370
403
  await self.load_markets()
371
- symbol = self.symbol(symbol)
404
+ symbols = self.market_symbols(symbols, None, False, True, True)
372
405
  name = 'trades'
373
- trades = await self.subscribe(name, name, False, [symbol], params)
406
+ url = self.urls['api']['ws']['public']
407
+ marketIds = self.market_ids(symbols)
408
+ subscribe: dict = {
409
+ 'event': 'subscribe',
410
+ 'channel': [
411
+ name,
412
+ ],
413
+ 'symbols': marketIds,
414
+ }
415
+ request = self.extend(subscribe, params)
416
+ messageHashes = []
417
+ if symbols is not None:
418
+ for i in range(0, len(symbols)):
419
+ messageHashes.append(name + '::' + symbols[i])
420
+ trades = await self.watch_multiple(url, messageHashes, request, messageHashes)
374
421
  if self.newUpdates:
375
- limit = trades.getLimit(symbol, limit)
422
+ first = self.safe_value(trades, 0)
423
+ tradeSymbol = self.safe_string(first, 'symbol')
424
+ limit = trades.getLimit(tradeSymbol, limit)
376
425
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
377
426
 
378
427
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
379
428
  """
380
429
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
381
- :see: https://docs.poloniex.com/#public-channels-market-data-book-level-2
430
+
431
+ https://api-docs.poloniex.com/spot/websocket/market-data#book-level-2
432
+
382
433
  :param str symbol: unified symbol of the market to fetch the order book for
383
434
  :param int [limit]: not used by poloniex watchOrderBook
384
435
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -394,7 +445,9 @@ class poloniex(ccxt.async_support.poloniex):
394
445
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
395
446
  """
396
447
  watches information on multiple orders made by the user
397
- :see: https://docs.poloniex.com/#authenticated-channels-market-data-orders
448
+
449
+ https://api-docs.poloniex.com/spot/websocket/order
450
+
398
451
  :param str symbol: unified market symbol of the market orders were made in
399
452
  :param int [since]: not used by poloniex watchOrders
400
453
  :param int [limit]: not used by poloniex watchOrders
@@ -415,7 +468,9 @@ class poloniex(ccxt.async_support.poloniex):
415
468
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
416
469
  """
417
470
  watches information on multiple trades made by the user using orders stream
418
- :see: https://docs.poloniex.com/#authenticated-channels-market-data-orders
471
+
472
+ https://api-docs.poloniex.com/spot/websocket/order
473
+
419
474
  :param str symbol: unified market symbol of the market orders were made in
420
475
  :param int [since]: not used by poloniex watchMyTrades
421
476
  :param int [limit]: not used by poloniex watchMyTrades
@@ -437,7 +492,9 @@ class poloniex(ccxt.async_support.poloniex):
437
492
  async def watch_balance(self, params={}) -> Balances:
438
493
  """
439
494
  watch balance and get the amount of funds available for trading or funds locked in orders
440
- :see: https://docs.poloniex.com/#authenticated-channels-market-data-balances
495
+
496
+ https://api-docs.poloniex.com/spot/websocket/balance
497
+
441
498
  :param dict [params]: extra parameters specific to the exchange API endpoint
442
499
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
443
500
  """
@@ -606,8 +663,8 @@ class poloniex(ccxt.async_support.poloniex):
606
663
  'type': self.safe_string_lower(trade, 'type'),
607
664
  'side': self.safe_string_lower_2(trade, 'takerSide', 'side'),
608
665
  'takerOrMaker': takerMaker,
609
- 'price': self.omit_zero(self.safe_number_2(trade, 'tradePrice', 'price')),
610
- 'amount': self.omit_zero(self.safe_number_2(trade, 'filledQuantity', 'quantity')),
666
+ 'price': self.omit_zero(self.safe_string_2(trade, 'tradePrice', 'price')),
667
+ 'amount': self.omit_zero(self.safe_string_2(trade, 'filledQuantity', 'quantity')),
611
668
  'cost': self.safe_string_2(trade, 'amount', 'filledAmount'),
612
669
  'fee': {
613
670
  'rate': None,
@@ -617,7 +674,7 @@ class poloniex(ccxt.async_support.poloniex):
617
674
  }, market)
618
675
 
619
676
  def parse_status(self, status):
620
- statuses = {
677
+ statuses: dict = {
621
678
  'NEW': 'open',
622
679
  'PARTIALLY_FILLED': 'open',
623
680
  'FILLED': 'closed',
@@ -880,7 +937,7 @@ class poloniex(ccxt.async_support.poloniex):
880
937
  # }
881
938
  #
882
939
  data = self.safe_value(message, 'data', [])
883
- newTickers = {}
940
+ newTickers: dict = {}
884
941
  for i in range(0, len(data)):
885
942
  item = data[i]
886
943
  marketId = self.safe_string(item, 'symbol')
@@ -1032,7 +1089,7 @@ class poloniex(ccxt.async_support.poloniex):
1032
1089
  #
1033
1090
  firstBalance = self.safe_value(response, 0, {})
1034
1091
  timestamp = self.safe_integer(firstBalance, 'ts')
1035
- result = {
1092
+ result: dict = {
1036
1093
  'info': response,
1037
1094
  'timestamp': timestamp,
1038
1095
  'datetime': self.iso8601(timestamp),
@@ -1070,7 +1127,7 @@ class poloniex(ccxt.async_support.poloniex):
1070
1127
  event = self.safe_string(message, 'event')
1071
1128
  if event == 'pong':
1072
1129
  client.lastPong = self.milliseconds()
1073
- methods = {
1130
+ methods: dict = {
1074
1131
  'candles_minute_1': self.handle_ohlcv,
1075
1132
  'candles_minute_5': self.handle_ohlcv,
1076
1133
  'candles_minute_10': self.handle_ohlcv,
@@ -1100,13 +1157,7 @@ class poloniex(ccxt.async_support.poloniex):
1100
1157
  if type == 'auth':
1101
1158
  self.handle_authenticate(client, message)
1102
1159
  elif type is None:
1103
- data = self.safe_value(message, 'data')
1104
- item = self.safe_value(data, 0)
1105
- orderId = self.safe_string(item, 'orderId')
1106
- if orderId == '0':
1107
- self.handle_error_message(client, item)
1108
- else:
1109
- self.handle_order_request(client, message)
1160
+ self.handle_order_request(client, message)
1110
1161
  else:
1111
1162
  data = self.safe_value(message, 'data', [])
1112
1163
  dataLength = len(data)
@@ -1131,12 +1182,40 @@ class poloniex(ccxt.async_support.poloniex):
1131
1182
  # "event": "error",
1132
1183
  # "message": "Platform in maintenance mode"
1133
1184
  # }
1185
+ # {
1186
+ # "id":"1722386782048",
1187
+ # "data":[
1188
+ # {
1189
+ # "orderId":0,
1190
+ # "clientOrderId":null,
1191
+ # "message":"available insufficient",
1192
+ # "code":21721
1193
+ # }
1194
+ # ]
1195
+ # }
1134
1196
  #
1197
+ id = self.safe_string(message, 'id')
1135
1198
  event = self.safe_string(message, 'event')
1136
- orderId = self.safe_string(message, 'orderId')
1199
+ data = self.safe_list(message, 'data')
1200
+ first = self.safe_dict(data, 0)
1201
+ orderId = self.safe_string(first, 'orderId')
1137
1202
  if (event == 'error') or (orderId == '0'):
1138
- error = self.safe_string(message, 'message')
1139
- raise ExchangeError(self.id + ' error: ' + self.json(error))
1203
+ try:
1204
+ error = self.safe_string(first, 'message')
1205
+ code = self.safe_string(first, 'code')
1206
+ feedback = self.id + ' ' + self.json(message)
1207
+ self.throw_exactly_matched_exception(self.exceptions['exact'], code, feedback)
1208
+ self.throw_broadly_matched_exception(self.exceptions['broad'], error, feedback)
1209
+ raise ExchangeError(feedback)
1210
+ except Exception as e:
1211
+ if isinstance(e, AuthenticationError):
1212
+ messageHash = 'authenticated'
1213
+ client.reject(e, messageHash)
1214
+ if messageHash in client.subscriptions:
1215
+ del client.subscriptions[messageHash]
1216
+ else:
1217
+ client.reject(e, id)
1218
+ return True
1140
1219
  return False
1141
1220
 
1142
1221
  def handle_authenticate(self, client: Client, message):
@@ -1160,7 +1239,7 @@ class poloniex(ccxt.async_support.poloniex):
1160
1239
  del client.subscriptions[messageHash]
1161
1240
  return message
1162
1241
 
1163
- def ping(self, client):
1242
+ def ping(self, client: Client):
1164
1243
  return {
1165
1244
  'event': 'ping',
1166
1245
  }
@@ -8,9 +8,9 @@ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
8
  from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
- from ccxt.base.errors import ExchangeError
12
- from ccxt.base.errors import BadRequest
13
11
  from ccxt.base.errors import AuthenticationError
12
+ from ccxt.base.errors import BadRequest
13
+ from ccxt.base.errors import ChecksumError
14
14
 
15
15
 
16
16
  class poloniexfutures(ccxt.async_support.poloniexfutures):
@@ -33,6 +33,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
33
33
  'watchTicker': True,
34
34
  'watchTickers': False,
35
35
  'watchTrades': True,
36
+ 'watchTradesForSymbols': False,
36
37
  'watchBalance': True,
37
38
  'watchOrders': True,
38
39
  'watchMyTrades': False,
@@ -57,6 +58,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
57
58
  'method': '/contractMarket/level2', # can also be '/contractMarket/level3v2'
58
59
  'snapshotDelay': 5,
59
60
  'snapshotMaxRetries': 3,
61
+ 'checksum': True,
60
62
  },
61
63
  'streamLimit': 5, # called tunnels by poloniexfutures docs
62
64
  'streamBySubscriptionsHash': {},
@@ -135,7 +137,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
135
137
 
136
138
  async def subscribe(self, name: str, isPrivate: bool, symbol: Str = None, subscription=None, params={}):
137
139
  """
138
- * @ignore
140
+ @ignore
139
141
  Connects to a websocket channel
140
142
  :param str name: name of the channel and suscriptionHash
141
143
  :param bool isPrivate: True for the authenticated url, False for the public url
@@ -152,7 +154,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
152
154
  messageHash = name
153
155
  tunnelId = await self.stream(url, messageHash)
154
156
  requestId = self.request_id()
155
- subscribe = {
157
+ subscribe: dict = {
156
158
  'id': requestId,
157
159
  'type': 'subscribe',
158
160
  'topic': name, # Subscribed topic. Some topics support subscribe to the data of multiple trading pairs through ",".
@@ -160,7 +162,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
160
162
  'response': True, # Whether the server needs to return the receipt information of self subscription or not. Set by default.
161
163
  'tunnelId': tunnelId,
162
164
  }
163
- subscriptionRequest = {
165
+ subscriptionRequest: dict = {
164
166
  'id': requestId,
165
167
  }
166
168
  if subscription is None:
@@ -187,13 +189,13 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
187
189
  stream = 'stream-' + streamIndexString
188
190
  self.options['streamBySubscriptionsHash'][subscriptionHash] = stream
189
191
  messageHash = 'tunnel:' + stream
190
- request = {
192
+ request: dict = {
191
193
  'id': messageHash,
192
194
  'type': 'openTunnel',
193
195
  'newTunnelId': stream,
194
196
  'response': True,
195
197
  }
196
- subscription = {
198
+ subscription: dict = {
197
199
  'id': messageHash,
198
200
  'method': self.handle_new_stream,
199
201
  }
@@ -233,7 +235,9 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
233
235
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
234
236
  """
235
237
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
236
- :see: https://futures-docs.poloniex.com/#get-real-time-symbol-ticker
238
+
239
+ https://api-docs.poloniex.com/futures/websocket/public#get-real-time-symbol-ticker
240
+
237
241
  :param str symbol: unified symbol of the market to fetch the ticker for
238
242
  :param dict [params]: extra parameters specific to the exchange API endpoint
239
243
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -246,7 +250,9 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
246
250
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
247
251
  """
248
252
  get the list of most recent trades for a particular symbol
249
- :see: https://futures-docs.poloniex.com/#full-matching-engine-data-level-3
253
+
254
+ https://api-docs.poloniex.com/futures/websocket/public#full-matching-engine-datalevel-3
255
+
250
256
  :param str symbol: unified symbol of the market to fetch trades for
251
257
  :param int [since]: timestamp in ms of the earliest trade to fetch
252
258
  :param int [limit]: the maximum amount of trades to fetch
@@ -266,7 +272,9 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
266
272
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
267
273
  """
268
274
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
269
- :see: https://futures-docs.poloniex.com/#level-2-market-data
275
+
276
+ https://api-docs.poloniex.com/futures/websocket/public#level-2-market-data
277
+
270
278
  :param str symbol: unified symbol of the market to fetch the order book for
271
279
  :param int [limit]: not used by poloniexfutures watchOrderBook
272
280
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -281,7 +289,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
281
289
  if limit != 5 and limit != 50:
282
290
  raise BadRequest(self.id + ' watchOrderBook limit argument must be none, 5 or 50 if using method /contractMarket/level2')
283
291
  name += 'Depth' + self.number_to_string(limit)
284
- subscription = {
292
+ subscription: dict = {
285
293
  'symbol': symbol,
286
294
  'limit': limit,
287
295
  'method': self.handle_order_book_subscription,
@@ -292,7 +300,9 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
292
300
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
293
301
  """
294
302
  watches information on multiple orders made by the user
295
- :see: https://futures-docs.poloniex.com/#private-messages
303
+
304
+ https://api-docs.poloniex.com/futures/websocket/user-messages#private-messages
305
+
296
306
  :param str symbol: filter by unified market symbol of the market orders were made in
297
307
  :param int [since]: the earliest time in ms to fetch orders for
298
308
  :param int [limit]: the maximum number of order structures to retrieve
@@ -315,7 +325,9 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
315
325
  async def watch_balance(self, params={}) -> Balances:
316
326
  """
317
327
  watch balance and get the amount of funds available for trading or funds locked in orders
318
- :see: https://futures-docs.poloniex.com/#account-balance-events
328
+
329
+ https://api-docs.poloniex.com/futures/websocket/user-messages#account-balance-events
330
+
319
331
  :param dict [params]: extra parameters specific to the exchange API endpoint
320
332
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
321
333
  """
@@ -512,19 +524,19 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
512
524
 
513
525
  def parse_order_status(self, status: str, type: str):
514
526
  """
515
- * @ignore
527
+ @ignore
516
528
  :param str status: "match", "open", "done"
517
529
  :param str type: "open", "match", "filled", "canceled", "update"
518
530
  :returns str:
519
531
  """
520
- types = {
532
+ types: dict = {
521
533
  'canceled': 'canceled',
522
534
  'cancel': 'canceled',
523
535
  'filled': 'closed',
524
536
  }
525
537
  parsedStatus = self.safe_string(types, type)
526
538
  if parsedStatus is None:
527
- statuses = {
539
+ statuses: dict = {
528
540
  'open': 'open',
529
541
  'match': 'open',
530
542
  'done': 'closed',
@@ -809,26 +821,35 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
809
821
  def handle_delta(self, orderbook, delta):
810
822
  #
811
823
  # {
812
- # "sequence": 18, # Sequence number which is used to judge the continuity of pushed messages
813
- # "change": "5000.0,sell,83" # Price, side, quantity
814
- # "timestamp": 1551770400000
815
- # }
824
+ # sequence: 123677914,
825
+ # lastSequence: 123677913,
826
+ # change: '80.36,buy,4924',
827
+ # changes: ['80.19,buy,0',"80.15,buy,10794"],
828
+ # timestamp: 1715643483528
829
+ # },
816
830
  #
817
831
  sequence = self.safe_integer(delta, 'sequence')
832
+ lastSequence = self.safe_integer(delta, 'lastSequence')
818
833
  nonce = self.safe_integer(orderbook, 'nonce')
819
- if nonce != sequence - 1:
820
- raise ExchangeError(self.id + ' watchOrderBook received an out-of-order nonce')
821
- change = self.safe_string(delta, 'change')
822
- splitChange = change.split(',')
823
- price = self.safe_number(splitChange, 0)
824
- side = self.safe_string(splitChange, 1)
825
- size = self.safe_number(splitChange, 2)
834
+ if nonce > sequence:
835
+ return
836
+ if nonce != lastSequence:
837
+ checksum = self.handle_option('watchOrderBook', 'checksum', True)
838
+ if checksum:
839
+ raise ChecksumError(self.id + ' ' + self.orderbook_checksum_message(''))
840
+ changes = self.safe_list(delta, 'changes')
841
+ for i in range(0, len(changes)):
842
+ change = changes[i]
843
+ splitChange = change.split(',')
844
+ price = self.safe_number(splitChange, 0)
845
+ side = self.safe_string(splitChange, 1)
846
+ size = self.safe_number(splitChange, 2)
847
+ orderBookSide = orderbook['bids'] if (side == 'buy') else orderbook['asks']
848
+ orderBookSide.store(price, size)
826
849
  timestamp = self.safe_integer(delta, 'timestamp')
827
850
  orderbook['timestamp'] = timestamp
828
851
  orderbook['datetime'] = self.iso8601(timestamp)
829
852
  orderbook['nonce'] = sequence
830
- orderBookSide = orderbook['bids'] if (side == 'buy') else orderbook['asks']
831
- orderBookSide.store(price, size)
832
853
 
833
854
  def handle_balance(self, client: Client, message):
834
855
  #
@@ -884,7 +905,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
884
905
  # }
885
906
  #
886
907
  timestamp = self.safe_integer(response, 'timestamp')
887
- result = {
908
+ result: dict = {
888
909
  'info': response,
889
910
  'timestamp': timestamp,
890
911
  'datetime': self.iso8601(timestamp),
@@ -907,7 +928,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
907
928
 
908
929
  def handle_subject(self, client: Client, message):
909
930
  subject = self.safe_string(message, 'subject')
910
- methods = {
931
+ methods: dict = {
911
932
  'auth': self.handle_authenticate,
912
933
  'received': self.handle_l3_order_book,
913
934
  'open': self.handle_l3_order_book,
@@ -950,7 +971,7 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
950
971
 
951
972
  def handle_message(self, client: Client, message):
952
973
  type = self.safe_string(message, 'type')
953
- methods = {
974
+ methods: dict = {
954
975
  'welcome': self.handle_system_status,
955
976
  'ack': self.handle_subscription_status,
956
977
  'message': self.handle_subject,