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/p2b.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheByTimestamp
8
- from ccxt.base.types import Int, OrderBook, Ticker, Trade
8
+ from ccxt.base.types import Int, OrderBook, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
@@ -34,8 +34,9 @@ class p2b(ccxt.async_support.p2b):
34
34
  'watchOrders': False,
35
35
  # 'watchStatus': True,
36
36
  'watchTicker': True,
37
- 'watchTickers': False, # in the docs but does not return anything when subscribed to
37
+ 'watchTickers': True,
38
38
  'watchTrades': True,
39
+ 'watchTradesForSymbols': True,
39
40
  },
40
41
  'urls': {
41
42
  'api': {
@@ -57,6 +58,7 @@ class p2b(ccxt.async_support.p2b):
57
58
  'watchTickers': {
58
59
  'name': 'state', # or 'price'
59
60
  },
61
+ 'tickerSubs': self.create_safe_dictionary(),
60
62
  },
61
63
  'streaming': {
62
64
  'ping': self.ping,
@@ -65,7 +67,7 @@ class p2b(ccxt.async_support.p2b):
65
67
 
66
68
  async def subscribe(self, name: str, messageHash: str, request, params={}):
67
69
  """
68
- * @ignore
70
+ @ignore
69
71
  Connects to a websocket channel
70
72
  :param str name: name of the channel
71
73
  :param str messageHash: string to look up in handler
@@ -74,7 +76,7 @@ class p2b(ccxt.async_support.p2b):
74
76
  :returns dict: data from the websocket stream
75
77
  """
76
78
  url = self.urls['api']['ws']
77
- subscribe = {
79
+ subscribe: dict = {
78
80
  'method': name,
79
81
  'params': request,
80
82
  'id': self.milliseconds(),
@@ -85,7 +87,9 @@ class p2b(ccxt.async_support.p2b):
85
87
  async def watch_ohlcv(self, symbol: str, timeframe='15m', since: Int = None, limit: Int = None, params={}) -> List[list]:
86
88
  """
87
89
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. Can only subscribe to one timeframe at a time for each symbol
88
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#kline-candlestick
90
+
91
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#kline-candlestick
92
+
89
93
  :param str symbol: unified symbol of the market to fetch OHLCV data for
90
94
  :param str timeframe: 15m, 30m, 1h or 1d
91
95
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -112,49 +116,112 @@ class p2b(ccxt.async_support.p2b):
112
116
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
113
117
  """
114
118
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
115
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#last-price
116
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#market-status
119
+
120
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#last-price
121
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#market-status
122
+
117
123
  :param str symbol: unified symbol of the market to fetch the ticker for
118
124
  :param dict [params]: extra parameters specific to the exchange API endpoint
119
125
  :param dict [params.method]: 'state'(default) or 'price'
120
126
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
121
127
  """
122
128
  await self.load_markets()
123
- watchTickerOptions = self.safe_value(self.options, 'watchTicker')
129
+ watchTickerOptions = self.safe_dict(self.options, 'watchTicker')
124
130
  name = self.safe_string(watchTickerOptions, 'name', 'state') # or price
125
131
  name, params = self.handle_option_and_params(params, 'method', 'name', name)
126
132
  market = self.market(symbol)
127
- request = [
128
- market['id'],
129
- ]
133
+ symbol = market['symbol']
134
+ self.options['tickerSubs'][market['id']] = True # we need to re-subscribe to all tickers upon watching a new ticker
135
+ tickerSubs = self.options['tickerSubs']
136
+ request = list(tickerSubs.keys())
130
137
  messageHash = name + '::' + market['symbol']
131
138
  return await self.subscribe(name + '.subscribe', messageHash, request, params)
132
139
 
140
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
141
+ """
142
+
143
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#last-price
144
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#market-status
145
+
146
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
147
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
148
+ :param dict [params]: extra parameters specific to the exchange API endpoint
149
+ :param dict [params.method]: 'state'(default) or 'price'
150
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
151
+ """
152
+ await self.load_markets()
153
+ symbols = self.market_symbols(symbols, None, False)
154
+ watchTickerOptions = self.safe_dict(self.options, 'watchTicker')
155
+ name = self.safe_string(watchTickerOptions, 'name', 'state') # or price
156
+ name, params = self.handle_option_and_params(params, 'method', 'name', name)
157
+ messageHashes = []
158
+ args = []
159
+ for i in range(0, len(symbols)):
160
+ market = self.market(symbols[i])
161
+ messageHashes.append(name + '::' + market['symbol'])
162
+ args.append(market['id'])
163
+ url = self.urls['api']['ws']
164
+ request: dict = {
165
+ 'method': name + '.subscribe',
166
+ 'params': args,
167
+ 'id': self.milliseconds(),
168
+ }
169
+ await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
170
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
171
+
133
172
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
134
173
  """
135
174
  get the list of most recent trades for a particular symbol
136
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#deals
175
+
176
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#deals
177
+
137
178
  :param str symbol: unified symbol of the market to fetch trades for
138
179
  :param int [since]: timestamp in ms of the earliest trade to fetch
139
180
  :param int [limit]: the maximum amount of trades to fetch
140
181
  :param dict [params]: extra parameters specific to the exchange API endpoint
141
182
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
142
183
  """
184
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
185
+
186
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
187
+ """
188
+ get the list of most recent trades for a list of symbols
189
+
190
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#deals
191
+
192
+ :param str[] symbols: unified symbol of the market to fetch trades for
193
+ :param int [since]: timestamp in ms of the earliest trade to fetch
194
+ :param int [limit]: the maximum amount of trades to fetch
195
+ :param dict [params]: extra parameters specific to the exchange API endpoint
196
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
197
+ """
143
198
  await self.load_markets()
144
- market = self.market(symbol)
145
- request = [
146
- market['id'],
147
- ]
148
- messageHash = 'deals::' + market['symbol']
149
- trades = await self.subscribe('deals.subscribe', messageHash, request, params)
199
+ symbols = self.market_symbols(symbols, None, False, True, True)
200
+ messageHashes = []
201
+ if symbols is not None:
202
+ for i in range(0, len(symbols)):
203
+ messageHashes.append('deals::' + symbols[i])
204
+ marketIds = self.market_ids(symbols)
205
+ url = self.urls['api']['ws']
206
+ subscribe: dict = {
207
+ 'method': 'deals.subscribe',
208
+ 'params': marketIds,
209
+ 'id': self.milliseconds(),
210
+ }
211
+ query = self.extend(subscribe, params)
212
+ trades = await self.watch_multiple(url, messageHashes, query, messageHashes)
150
213
  if self.newUpdates:
151
- limit = trades.getLimit(symbol, limit)
214
+ first = self.safe_value(trades, 0)
215
+ tradeSymbol = self.safe_string(first, 'symbol')
216
+ limit = trades.getLimit(tradeSymbol, limit)
152
217
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
153
218
 
154
219
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
155
220
  """
156
221
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
157
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#depth-of-market
222
+
223
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#depth-of-market
224
+
158
225
  :param str symbol: unified symbol of the market to fetch the order book for
159
226
  :param int [limit]: 1-100, default=100
160
227
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -307,6 +374,7 @@ class p2b(ccxt.async_support.p2b):
307
374
  else:
308
375
  ticker = self.parse_ticker(tickerData, market)
309
376
  symbol = ticker['symbol']
377
+ self.tickers[symbol] = ticker
310
378
  messageHash = messageHashStart + '::' + symbol
311
379
  client.resolve(ticker, messageHash)
312
380
  return message
@@ -369,7 +437,7 @@ class p2b(ccxt.async_support.p2b):
369
437
  self.handle_pong(client, message)
370
438
  return
371
439
  method = self.safe_string(message, 'method')
372
- methods = {
440
+ methods: dict = {
373
441
  'depth.update': self.handle_order_book,
374
442
  'price.update': self.handle_ticker,
375
443
  'kline.update': self.handle_ohlcv,
@@ -386,10 +454,10 @@ class p2b(ccxt.async_support.p2b):
386
454
  raise ExchangeError(self.id + ' error: ' + self.json(error))
387
455
  return False
388
456
 
389
- def ping(self, client):
457
+ def ping(self, client: Client):
390
458
  """
391
- :see: https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#ping
392
- * @param client
459
+ https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#ping
460
+ @param client
393
461
  """
394
462
  return {
395
463
  'method': 'server.ping',
@@ -407,3 +475,11 @@ class p2b(ccxt.async_support.p2b):
407
475
  #
408
476
  client.lastPong = self.safe_integer(message, 'id')
409
477
  return message
478
+
479
+ def on_error(self, client: Client, error):
480
+ self.options['tickerSubs'] = self.create_safe_dictionary()
481
+ self.on_error(client, error)
482
+
483
+ def on_close(self, client: Client, error):
484
+ self.options['tickerSubs'] = self.create_safe_dictionary()
485
+ self.on_close(client, error)
ccxt/pro/paradex.py ADDED
@@ -0,0 +1,352 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ import ccxt.async_support
7
+ from ccxt.async_support.base.ws.cache import ArrayCache
8
+ from ccxt.base.types import Int, OrderBook, Strings, Ticker, Tickers, Trade
9
+ from ccxt.async_support.base.ws.client import Client
10
+ from typing import List
11
+
12
+
13
+ class paradex(ccxt.async_support.paradex):
14
+
15
+ def describe(self):
16
+ return self.deep_extend(super(paradex, self).describe(), {
17
+ 'has': {
18
+ 'ws': True,
19
+ 'watchTicker': True,
20
+ 'watchTickers': True,
21
+ 'watchOrderBook': True,
22
+ 'watchOrders': False,
23
+ 'watchTrades': True,
24
+ 'watchTradesForSymbols': False,
25
+ 'watchBalance': False,
26
+ 'watchOHLCV': False,
27
+ },
28
+ 'urls': {
29
+ 'logo': 'https://x.com/tradeparadex/photo',
30
+ 'api': {
31
+ 'ws': 'wss://ws.api.prod.paradex.trade/v1',
32
+ },
33
+ 'test': {
34
+ 'ws': 'wss://ws.api.testnet.paradex.trade/v1',
35
+ },
36
+ 'www': 'https://www.paradex.trade/',
37
+ 'doc': 'https://docs.api.testnet.paradex.trade/',
38
+ 'fees': 'https://docs.paradex.trade/getting-started/trading-fees',
39
+ 'referral': '',
40
+ },
41
+ 'options': {},
42
+ 'streaming': {},
43
+ })
44
+
45
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
46
+ """
47
+ get the list of most recent trades for a particular symbol
48
+
49
+ https://docs.api.testnet.paradex.trade/#sub-trades-market_symbol-operation
50
+
51
+ :param str symbol: unified symbol of the market to fetch trades for
52
+ :param int [since]: timestamp in ms of the earliest trade to fetch
53
+ :param int [limit]: the maximum amount of trades to fetch
54
+ :param dict [params]: extra parameters specific to the exchange API endpoint
55
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
56
+ """
57
+ await self.load_markets()
58
+ messageHash = 'trades.'
59
+ if symbol is not None:
60
+ market = self.market(symbol)
61
+ messageHash += market['id']
62
+ else:
63
+ messageHash += 'ALL'
64
+ url = self.urls['api']['ws']
65
+ request: dict = {
66
+ 'jsonrpc': '2.0',
67
+ 'method': 'subscribe',
68
+ 'params': {
69
+ 'channel': messageHash,
70
+ },
71
+ }
72
+ trades = await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
73
+ if self.newUpdates:
74
+ limit = trades.getLimit(symbol, limit)
75
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
76
+
77
+ def handle_trade(self, client: Client, message):
78
+ #
79
+ # {
80
+ # "jsonrpc": "2.0",
81
+ # "method": "subscription",
82
+ # "params": {
83
+ # "channel": "trades.ALL",
84
+ # "data": {
85
+ # "id": "1718179273230201709233240002",
86
+ # "market": "kBONK-USD-PERP",
87
+ # "side": "BUY",
88
+ # "size": "34028",
89
+ # "price": "0.028776",
90
+ # "created_at": 1718179273230,
91
+ # "trade_type": "FILL"
92
+ # }
93
+ # }
94
+ # }
95
+ #
96
+ params = self.safe_dict(message, 'params', {})
97
+ data = self.safe_dict(params, 'data', {})
98
+ parsedTrade = self.parse_trade(data)
99
+ symbol = parsedTrade['symbol']
100
+ messageHash = self.safe_string(params, 'channel')
101
+ stored = self.safe_value(self.trades, symbol)
102
+ if stored is None:
103
+ stored = ArrayCache(self.safe_integer(self.options, 'tradesLimit', 1000))
104
+ self.trades[symbol] = stored
105
+ stored.append(parsedTrade)
106
+ client.resolve(stored, messageHash)
107
+ return message
108
+
109
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
110
+ """
111
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
112
+
113
+ https://docs.api.testnet.paradex.trade/#sub-order_book-market_symbol-snapshot-15-refresh_rate-operation
114
+
115
+ :param str symbol: unified symbol of the market to fetch the order book for
116
+ :param int [limit]: the maximum amount of order book entries to return
117
+ :param dict [params]: extra parameters specific to the exchange API endpoint
118
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
119
+ """
120
+ await self.load_markets()
121
+ market = self.market(symbol)
122
+ messageHash = 'order_book.' + market['id'] + '.snapshot@15@100ms'
123
+ url = self.urls['api']['ws']
124
+ request: dict = {
125
+ 'jsonrpc': '2.0',
126
+ 'method': 'subscribe',
127
+ 'params': {
128
+ 'channel': messageHash,
129
+ },
130
+ }
131
+ orderbook = await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
132
+ return orderbook.limit()
133
+
134
+ def handle_order_book(self, client: Client, message):
135
+ #
136
+ # {
137
+ # "jsonrpc": "2.0",
138
+ # "method": "subscription",
139
+ # "params": {
140
+ # "channel": "order_book.BTC-USD-PERP.snapshot@15@50ms",
141
+ # "data": {
142
+ # "seq_no": 14127815,
143
+ # "market": "BTC-USD-PERP",
144
+ # "last_updated_at": 1718267837265,
145
+ # "update_type": "s",
146
+ # "inserts": [
147
+ # {
148
+ # "side": "BUY",
149
+ # "price": "67629.7",
150
+ # "size": "0.992"
151
+ # },
152
+ # {
153
+ # "side": "SELL",
154
+ # "price": "69378.6",
155
+ # "size": "3.137"
156
+ # }
157
+ # ],
158
+ # "updates": [],
159
+ # "deletes": []
160
+ # }
161
+ # }
162
+ # }
163
+ #
164
+ params = self.safe_dict(message, 'params', {})
165
+ data = self.safe_dict(params, 'data', {})
166
+ marketId = self.safe_string(data, 'market')
167
+ market = self.safe_market(marketId)
168
+ timestamp = self.safe_integer(data, 'last_updated_at')
169
+ symbol = market['symbol']
170
+ if not (symbol in self.orderbooks):
171
+ self.orderbooks[symbol] = self.order_book()
172
+ orderbookData = {
173
+ 'bids': [],
174
+ 'asks': [],
175
+ }
176
+ inserts = self.safe_list(data, 'inserts')
177
+ for i in range(0, len(inserts)):
178
+ insert = self.safe_dict(inserts, i)
179
+ side = self.safe_string(insert, 'side')
180
+ price = self.safe_string(insert, 'price')
181
+ size = self.safe_string(insert, 'size')
182
+ if side == 'BUY':
183
+ orderbookData['bids'].append([price, size])
184
+ else:
185
+ orderbookData['asks'].append([price, size])
186
+ orderbook = self.orderbooks[symbol]
187
+ snapshot = self.parse_order_book(orderbookData, symbol, timestamp, 'bids', 'asks')
188
+ snapshot['nonce'] = self.safe_number(data, 'seq_no')
189
+ orderbook.reset(snapshot)
190
+ messageHash = self.safe_string(params, 'channel')
191
+ client.resolve(orderbook, messageHash)
192
+
193
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
194
+ """
195
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
196
+
197
+ https://docs.api.testnet.paradex.trade/#sub-markets_summary-operation
198
+
199
+ :param str symbol: unified symbol of the market to fetch the ticker for
200
+ :param dict [params]: extra parameters specific to the exchange API endpoint
201
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
202
+ """
203
+ await self.load_markets()
204
+ symbol = self.symbol(symbol)
205
+ channel = 'markets_summary'
206
+ url = self.urls['api']['ws']
207
+ request: dict = {
208
+ 'jsonrpc': '2.0',
209
+ 'method': 'subscribe',
210
+ 'params': {
211
+ 'channel': channel,
212
+ },
213
+ }
214
+ messageHash = channel + '.' + symbol
215
+ return await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
216
+
217
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
218
+ """
219
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
220
+
221
+ https://docs.api.testnet.paradex.trade/#sub-markets_summary-operation
222
+
223
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
224
+ :param dict [params]: extra parameters specific to the exchange API endpoint
225
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
226
+ """
227
+ await self.load_markets()
228
+ symbols = self.market_symbols(symbols)
229
+ channel = 'markets_summary'
230
+ url = self.urls['api']['ws']
231
+ request: dict = {
232
+ 'jsonrpc': '2.0',
233
+ 'method': 'subscribe',
234
+ 'params': {
235
+ 'channel': channel,
236
+ },
237
+ }
238
+ messageHashes = []
239
+ if isinstance(symbols, list):
240
+ for i in range(0, len(symbols)):
241
+ messageHash = channel + '.' + symbols[i]
242
+ messageHashes.append(messageHash)
243
+ else:
244
+ messageHashes.append(channel)
245
+ newTickers = await self.watch_multiple(url, messageHashes, self.deep_extend(request, params), messageHashes)
246
+ if self.newUpdates:
247
+ result: dict = {}
248
+ result[newTickers['symbol']] = newTickers
249
+ return result
250
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
251
+
252
+ def handle_ticker(self, client: Client, message):
253
+ #
254
+ # {
255
+ # "jsonrpc": "2.0",
256
+ # "method": "subscription",
257
+ # "params": {
258
+ # "channel": "markets_summary",
259
+ # "data": {
260
+ # "symbol": "ORDI-USD-PERP",
261
+ # "oracle_price": "49.80885481",
262
+ # "mark_price": "49.80885481",
263
+ # "last_traded_price": "62.038",
264
+ # "bid": "49.822",
265
+ # "ask": "58.167",
266
+ # "volume_24h": "0",
267
+ # "total_volume": "54542628.66054200416",
268
+ # "created_at": 1718334307698,
269
+ # "underlying_price": "47.93",
270
+ # "open_interest": "6999.5",
271
+ # "funding_rate": "0.03919997509811",
272
+ # "price_change_rate_24h": ""
273
+ # }
274
+ # }
275
+ # }
276
+ #
277
+ params = self.safe_dict(message, 'params', {})
278
+ data = self.safe_dict(params, 'data', {})
279
+ marketId = self.safe_string(data, 'symbol')
280
+ market = self.safe_market(marketId)
281
+ symbol = market['symbol']
282
+ channel = self.safe_string(params, 'channel')
283
+ messageHash = channel + '.' + symbol
284
+ ticker = self.parse_ticker(data, market)
285
+ self.tickers[symbol] = ticker
286
+ client.resolve(ticker, channel)
287
+ client.resolve(ticker, messageHash)
288
+ return message
289
+
290
+ def handle_error_message(self, client: Client, message):
291
+ #
292
+ # {
293
+ # "jsonrpc": "2.0",
294
+ # "id": 0,
295
+ # "error": {
296
+ # "code": -32600,
297
+ # "message": "invalid subscribe request",
298
+ # "data": "invalid channel"
299
+ # },
300
+ # "usIn": 1718179125962419,
301
+ # "usDiff": 76,
302
+ # "usOut": 1718179125962495
303
+ # }
304
+ #
305
+ error = self.safe_dict(message, 'error')
306
+ if error is None:
307
+ return True
308
+ else:
309
+ errorCode = self.safe_string(error, 'code')
310
+ if errorCode is not None:
311
+ feedback = self.id + ' ' + self.json(error)
312
+ self.throw_exactly_matched_exception(self.exceptions['exact'], '-32600', feedback)
313
+ messageString = self.safe_value(error, 'message')
314
+ if messageString is not None:
315
+ self.throw_broadly_matched_exception(self.exceptions['broad'], messageString, feedback)
316
+ return False
317
+
318
+ def handle_message(self, client: Client, message):
319
+ if not self.handle_error_message(client, message):
320
+ return
321
+ #
322
+ # {
323
+ # "jsonrpc": "2.0",
324
+ # "method": "subscription",
325
+ # "params": {
326
+ # "channel": "trades.ALL",
327
+ # "data": {
328
+ # "id": "1718179273230201709233240002",
329
+ # "market": "kBONK-USD-PERP",
330
+ # "side": "BUY",
331
+ # "size": "34028",
332
+ # "price": "0.028776",
333
+ # "created_at": 1718179273230,
334
+ # "trade_type": "FILL"
335
+ # }
336
+ # }
337
+ # }
338
+ #
339
+ data = self.safe_dict(message, 'params')
340
+ if data is not None:
341
+ channel = self.safe_string(data, 'channel')
342
+ parts = channel.split('.')
343
+ name = self.safe_string(parts, 0)
344
+ methods: dict = {
345
+ 'trades': self.handle_trade,
346
+ 'order_book': self.handle_order_book,
347
+ 'markets_summary': self.handle_ticker,
348
+ # ...
349
+ }
350
+ method = self.safe_value(methods, name)
351
+ if method is not None:
352
+ method(client, message)