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/hyperliquid.py CHANGED
@@ -5,9 +5,10 @@
5
5
 
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- from ccxt.base.types import Int, Market, Order, OrderBook, Str, Trade
8
+ from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
+ from typing import Any
11
12
  from ccxt.base.errors import ExchangeError
12
13
 
13
14
 
@@ -17,14 +18,18 @@ class hyperliquid(ccxt.async_support.hyperliquid):
17
18
  return self.deep_extend(super(hyperliquid, self).describe(), {
18
19
  'has': {
19
20
  'ws': True,
21
+ 'createOrderWs': True,
22
+ 'createOrdersWs': True,
23
+ 'editOrderWs': True,
20
24
  'watchBalance': False,
21
25
  'watchMyTrades': True,
22
26
  'watchOHLCV': True,
23
27
  'watchOrderBook': True,
24
28
  'watchOrders': True,
25
- 'watchTicker': False,
26
- 'watchTickers': False,
29
+ 'watchTicker': True,
30
+ 'watchTickers': True,
27
31
  'watchTrades': True,
32
+ 'watchTradesForSymbols': False,
28
33
  'watchPosition': False,
29
34
  },
30
35
  'urls': {
@@ -53,9 +58,97 @@ class hyperliquid(ccxt.async_support.hyperliquid):
53
58
  },
54
59
  })
55
60
 
61
+ async def create_orders_ws(self, orders: List[OrderRequest], params={}):
62
+ """
63
+ create a list of trade orders using WebSocket post request
64
+
65
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
66
+
67
+ :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
68
+ :param dict [params]: extra parameters specific to the exchange API endpoint
69
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
70
+ """
71
+ await self.load_markets()
72
+ url = self.urls['api']['ws']['public']
73
+ ordersRequest = self.createOrdersRequest(orders, params)
74
+ wrapped = self.wrap_as_post_action(ordersRequest)
75
+ request = self.safe_dict(wrapped, 'request', {})
76
+ requestId = self.safe_string(wrapped, 'requestId')
77
+ response = await self.watch(url, requestId, request, requestId)
78
+ responseOjb = self.safe_dict(response, 'response', {})
79
+ data = self.safe_dict(responseOjb, 'data', {})
80
+ statuses = self.safe_list(data, 'statuses', [])
81
+ return self.parse_orders(statuses, None)
82
+
83
+ async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
84
+ """
85
+ create a trade order using WebSocket post request
86
+
87
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
88
+
89
+ :param str symbol: unified symbol of the market to create an order in
90
+ :param str type: 'market' or 'limit'
91
+ :param str side: 'buy' or 'sell'
92
+ :param float amount: how much of currency you want to trade in units of base currency
93
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
94
+ :param dict [params]: extra parameters specific to the exchange API endpoint
95
+ :param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
96
+ :param bool [params.postOnly]: True or False whether the order is post-only
97
+ :param bool [params.reduceOnly]: True or False whether the order is reduce-only
98
+ :param float [params.triggerPrice]: The price at which a trigger order is triggered at
99
+ :param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
100
+ :param str [params.slippage]: the slippage for market order
101
+ :param str [params.vaultAddress]: the vault address for order
102
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
103
+ """
104
+ await self.load_markets()
105
+ order, globalParams = self.parseCreateOrderArgs(symbol, type, side, amount, price, params)
106
+ orders = await self.create_orders_ws([order], globalParams)
107
+ return orders[0]
108
+
109
+ async def edit_order_ws(self, id: str, symbol: str, type: str, side: str, amount: Num = None, price: Num = None, params={}):
110
+ """
111
+ edit a trade order
112
+
113
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-an-order
114
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders
115
+
116
+ :param str id: cancel order id
117
+ :param str symbol: unified symbol of the market to create an order in
118
+ :param str type: 'market' or 'limit'
119
+ :param str side: 'buy' or 'sell'
120
+ :param float amount: how much of currency you want to trade in units of base currency
121
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
122
+ :param dict [params]: extra parameters specific to the exchange API endpoint
123
+ :param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
124
+ :param bool [params.postOnly]: True or False whether the order is post-only
125
+ :param bool [params.reduceOnly]: True or False whether the order is reduce-only
126
+ :param float [params.triggerPrice]: The price at which a trigger order is triggered at
127
+ :param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
128
+ :param str [params.vaultAddress]: the vault address for order
129
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
130
+ """
131
+ await self.load_markets()
132
+ market = self.market(symbol)
133
+ url = self.urls['api']['ws']['public']
134
+ postRequest = self.edit_order_request(id, symbol, type, side, amount, price, params)
135
+ wrapped = self.wrap_as_post_action(postRequest)
136
+ request = self.safe_dict(wrapped, 'request', {})
137
+ requestId = self.safe_string(wrapped, 'requestId')
138
+ response = await self.watch(url, requestId, request, requestId)
139
+ # response is the same self.edit_order
140
+ responseObject = self.safe_dict(response, 'response', {})
141
+ dataObject = self.safe_dict(responseObject, 'data', {})
142
+ statuses = self.safe_list(dataObject, 'statuses', [])
143
+ first = self.safe_dict(statuses, 0, {})
144
+ return self.parse_order(first, market)
145
+
56
146
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
57
147
  """
58
148
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
149
+
150
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
151
+
59
152
  :param str symbol: unified symbol of the market to fetch the order book for
60
153
  :param int [limit]: the maximum amount of order book entries to return
61
154
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -66,17 +159,45 @@ class hyperliquid(ccxt.async_support.hyperliquid):
66
159
  symbol = market['symbol']
67
160
  messageHash = 'orderbook:' + symbol
68
161
  url = self.urls['api']['ws']['public']
69
- request = {
162
+ request: dict = {
70
163
  'method': 'subscribe',
71
164
  'subscription': {
72
165
  'type': 'l2Book',
73
- 'coin': market['base'],
166
+ 'coin': market['base'] if market['swap'] else market['id'],
74
167
  },
75
168
  }
76
169
  message = self.extend(request, params)
77
170
  orderbook = await self.watch(url, messageHash, message, messageHash)
78
171
  return orderbook.limit()
79
172
 
173
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
174
+ """
175
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
176
+
177
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
178
+
179
+ :param str symbol: unified symbol of the market to fetch the order book for
180
+ :param dict [params]: extra parameters specific to the exchange API endpoint
181
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
182
+ """
183
+ await self.load_markets()
184
+ market = self.market(symbol)
185
+ symbol = market['symbol']
186
+ subMessageHash = 'orderbook:' + symbol
187
+ messageHash = 'unsubscribe:' + subMessageHash
188
+ url = self.urls['api']['ws']['public']
189
+ id = str(self.nonce())
190
+ request: dict = {
191
+ 'id': id,
192
+ 'method': 'unsubscribe',
193
+ 'subscription': {
194
+ 'type': 'l2Book',
195
+ 'coin': market['base'] if market['swap'] else market['id'],
196
+ },
197
+ }
198
+ message = self.extend(request, params)
199
+ return await self.watch(url, messageHash, message, messageHash)
200
+
80
201
  def handle_order_book(self, client, message):
81
202
  #
82
203
  # {
@@ -105,11 +226,11 @@ class hyperliquid(ccxt.async_support.hyperliquid):
105
226
  #
106
227
  entry = self.safe_dict(message, 'data', {})
107
228
  coin = self.safe_string(entry, 'coin')
108
- marketId = coin + '/USDC:USDC'
229
+ marketId = self.coinToMarketId(coin)
109
230
  market = self.market(marketId)
110
231
  symbol = market['symbol']
111
232
  rawData = self.safe_list(entry, 'levels', [])
112
- data = {
233
+ data: dict = {
113
234
  'bids': self.safe_list(rawData, 0, []),
114
235
  'asks': self.safe_list(rawData, 1, []),
115
236
  }
@@ -123,15 +244,83 @@ class hyperliquid(ccxt.async_support.hyperliquid):
123
244
  messageHash = 'orderbook:' + symbol
124
245
  client.resolve(orderbook, messageHash)
125
246
 
247
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
248
+ """
249
+
250
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
251
+
252
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
253
+ :param str symbol: unified symbol of the market to fetch the ticker for
254
+ :param dict [params]: extra parameters specific to the exchange API endpoint
255
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
256
+ """
257
+ market = self.market(symbol)
258
+ symbol = market['symbol']
259
+ tickers = await self.watch_tickers([symbol], params)
260
+ return tickers[symbol]
261
+
262
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
263
+ """
264
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
265
+
266
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
267
+
268
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
269
+ :param dict [params]: extra parameters specific to the exchange API endpoint
270
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
271
+ """
272
+ await self.load_markets()
273
+ symbols = self.market_symbols(symbols, None, True)
274
+ messageHash = 'tickers'
275
+ url = self.urls['api']['ws']['public']
276
+ request: dict = {
277
+ 'method': 'subscribe',
278
+ 'subscription': {
279
+ 'type': 'webData2', # allMids
280
+ 'user': '0x0000000000000000000000000000000000000000',
281
+ },
282
+ }
283
+ tickers = await self.watch(url, messageHash, self.extend(request, params), messageHash)
284
+ if self.newUpdates:
285
+ return self.filter_by_array_tickers(tickers, 'symbol', symbols)
286
+ return self.tickers
287
+
288
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
289
+ """
290
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
291
+
292
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
293
+
294
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
295
+ :param dict [params]: extra parameters specific to the exchange API endpoint
296
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
297
+ """
298
+ await self.load_markets()
299
+ symbols = self.market_symbols(symbols, None, True)
300
+ subMessageHash = 'tickers'
301
+ messageHash = 'unsubscribe:' + subMessageHash
302
+ url = self.urls['api']['ws']['public']
303
+ request: dict = {
304
+ 'method': 'unsubscribe',
305
+ 'subscription': {
306
+ 'type': 'webData2', # allMids
307
+ 'user': '0x0000000000000000000000000000000000000000',
308
+ },
309
+ }
310
+ return await self.watch(url, messageHash, self.extend(request, params), messageHash)
311
+
126
312
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
127
313
  """
128
314
  watches information on multiple trades made by the user
315
+
316
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
317
+
129
318
  :param str symbol: unified market symbol of the market orders were made in
130
319
  :param int [since]: the earliest time in ms to fetch orders for
131
320
  :param int [limit]: the maximum number of order structures to retrieve
132
321
  :param dict [params]: extra parameters specific to the exchange API endpoint
133
322
  :param str [params.user]: user address, will default to self.walletAddress if not provided
134
- :returns dict[]: a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
323
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
135
324
  """
136
325
  userAddress = None
137
326
  userAddress, params = self.handlePublicAddress('watchMyTrades', params)
@@ -141,7 +330,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
141
330
  symbol = self.symbol(symbol)
142
331
  messageHash += ':' + symbol
143
332
  url = self.urls['api']['ws']['public']
144
- request = {
333
+ request: dict = {
145
334
  'method': 'subscribe',
146
335
  'subscription': {
147
336
  'type': 'userFills',
@@ -154,6 +343,82 @@ class hyperliquid(ccxt.async_support.hyperliquid):
154
343
  limit = trades.getLimit(symbol, limit)
155
344
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
156
345
 
346
+ def handle_ws_tickers(self, client: Client, message):
347
+ #
348
+ # {
349
+ # "channel": "webData2",
350
+ # "data": {
351
+ # "meta": {
352
+ # "universe": [
353
+ # {
354
+ # "szDecimals": 5,
355
+ # "name": "BTC",
356
+ # "maxLeverage": 50,
357
+ # "onlyIsolated": False
358
+ # },
359
+ # ...
360
+ # ],
361
+ # },
362
+ # "assetCtxs": [
363
+ # {
364
+ # "funding": "0.00003005",
365
+ # "openInterest": "2311.50778",
366
+ # "prevDayPx": "63475.0",
367
+ # "dayNtlVlm": "468043329.64289033",
368
+ # "premium": "0.00094264",
369
+ # "oraclePx": "64712.0",
370
+ # "markPx": "64774.0",
371
+ # "midPx": "64773.5",
372
+ # "impactPxs": [
373
+ # "64773.0",
374
+ # "64774.0"
375
+ # ]
376
+ # },
377
+ # ...
378
+ # ],
379
+ # "spotAssetCtxs": [
380
+ # {
381
+ # "prevDayPx": "0.20937",
382
+ # "dayNtlVlm": "11188888.61984999",
383
+ # "markPx": "0.19722",
384
+ # "midPx": "0.197145",
385
+ # "circulatingSupply": "598760557.12072003",
386
+ # "coin": "PURR/USDC"
387
+ # },
388
+ # ...
389
+ # ],
390
+ # }
391
+ # }
392
+ #
393
+ # spot
394
+ rawData = self.safe_dict(message, 'data', {})
395
+ spotAssets = self.safe_list(rawData, 'spotAssetCtxs', [])
396
+ parsedTickers = []
397
+ for i in range(0, len(spotAssets)):
398
+ assetObject = spotAssets[i]
399
+ marketId = self.safe_string(assetObject, 'coin')
400
+ market = self.safe_market(marketId, None, None, 'spot')
401
+ ticker = self.parse_ws_ticker(assetObject, market)
402
+ parsedTickers.append(ticker)
403
+ # perpetuals
404
+ meta = self.safe_dict(rawData, 'meta', {})
405
+ universe = self.safe_list(meta, 'universe', [])
406
+ assetCtxs = self.safe_list(rawData, 'assetCtxs', [])
407
+ for i in range(0, len(universe)):
408
+ data = self.extend(
409
+ self.safe_dict(universe, i, {}),
410
+ self.safe_dict(assetCtxs, i, {})
411
+ )
412
+ id = data['name'] + '/USDC:USDC'
413
+ market = self.safe_market(id, None, None, 'swap')
414
+ ticker = self.parse_ws_ticker(data, market)
415
+ parsedTickers.append(ticker)
416
+ tickers = self.index_by(parsedTickers, 'symbol')
417
+ client.resolve(tickers, 'tickers')
418
+
419
+ def parse_ws_ticker(self, rawTicker, market: Market = None) -> Ticker:
420
+ return self.parse_ticker(rawTicker, market)
421
+
157
422
  def handle_my_trades(self, client: Client, message):
158
423
  #
159
424
  # {
@@ -188,7 +453,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
188
453
  limit = self.safe_integer(self.options, 'tradesLimit', 1000)
189
454
  self.myTrades = ArrayCacheBySymbolById(limit)
190
455
  trades = self.myTrades
191
- symbols = {}
456
+ symbols: dict = {}
192
457
  data = self.safe_list(entry, 'fills', [])
193
458
  dataLength = len(data)
194
459
  if dataLength == 0:
@@ -208,24 +473,27 @@ class hyperliquid(ccxt.async_support.hyperliquid):
208
473
  client.resolve(trades, messageHash)
209
474
 
210
475
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
211
- """
212
- watches information on multiple trades made in a market
213
- :param str symbol: unified market symbol of the market trades were made in
214
- :param int [since]: the earliest time in ms to fetch trades for
215
- :param int [limit]: the maximum number of trade structures to retrieve
216
- :param dict [params]: extra parameters specific to the exchange API endpoint
217
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
218
- """
476
+ # s
477
+ # @method
478
+ # @name hyperliquid#watchTrades
479
+ # @description watches information on multiple trades made in a market
480
+ # @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
481
+ # @param {string} symbol unified market symbol of the market trades were made in
482
+ # @param {int} [since] the earliest time in ms to fetch trades for
483
+ # @param {int} [limit] the maximum number of trade structures to retrieve
484
+ # @param {object} [params] extra parameters specific to the exchange API endpoint
485
+ # @returns {object[]} a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
486
+ #
219
487
  await self.load_markets()
220
488
  market = self.market(symbol)
221
489
  symbol = market['symbol']
222
490
  messageHash = 'trade:' + symbol
223
491
  url = self.urls['api']['ws']['public']
224
- request = {
492
+ request: dict = {
225
493
  'method': 'subscribe',
226
494
  'subscription': {
227
495
  'type': 'trades',
228
- 'coin': market['base'],
496
+ 'coin': market['base'] if market['swap'] else market['id'],
229
497
  },
230
498
  }
231
499
  message = self.extend(request, params)
@@ -234,6 +502,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
234
502
  limit = trades.getLimit(symbol, limit)
235
503
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
236
504
 
505
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
506
+ """
507
+ unWatches information on multiple trades made in a market
508
+
509
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
510
+
511
+ :param str symbol: unified market symbol of the market trades were made in
512
+ :param dict [params]: extra parameters specific to the exchange API endpoint
513
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
514
+ """
515
+ await self.load_markets()
516
+ market = self.market(symbol)
517
+ symbol = market['symbol']
518
+ subMessageHash = 'trade:' + symbol
519
+ messageHash = 'unsubscribe:' + subMessageHash
520
+ url = self.urls['api']['ws']['public']
521
+ request: dict = {
522
+ 'method': 'unsubscribe',
523
+ 'subscription': {
524
+ 'type': 'trades',
525
+ 'coin': market['base'] if market['swap'] else market['id'],
526
+ },
527
+ }
528
+ message = self.extend(request, params)
529
+ return await self.watch(url, messageHash, message, messageHash)
530
+
237
531
  def handle_trades(self, client: Client, message):
238
532
  #
239
533
  # {
@@ -254,7 +548,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
254
548
  entry = self.safe_list(message, 'data', [])
255
549
  first = self.safe_dict(entry, 0, {})
256
550
  coin = self.safe_string(first, 'coin')
257
- marketId = coin + '/USDC:USDC'
551
+ marketId = self.coinToMarketId(coin)
258
552
  market = self.market(marketId)
259
553
  symbol = market['symbol']
260
554
  if not (symbol in self.trades):
@@ -269,7 +563,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
269
563
  messageHash = 'trade:' + symbol
270
564
  client.resolve(trades, messageHash)
271
565
 
272
- def parse_ws_trade(self, trade, market: Market = None) -> Trade:
566
+ def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
273
567
  #
274
568
  # fetchMyTrades
275
569
  #
@@ -307,7 +601,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
307
601
  price = self.safe_string(trade, 'px')
308
602
  amount = self.safe_string(trade, 'sz')
309
603
  coin = self.safe_string(trade, 'coin')
310
- marketId = coin + '/USDC:USDC'
604
+ marketId = self.coinToMarketId(coin)
311
605
  market = self.safe_market(marketId, None)
312
606
  symbol = market['symbol']
313
607
  id = self.safe_string(trade, 'tid')
@@ -334,6 +628,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
334
628
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
335
629
  """
336
630
  watches historical candlestick data containing the open, high, low, close price, and the volume of a market
631
+
632
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
633
+
337
634
  :param str symbol: unified symbol of the market to fetch OHLCV data for
338
635
  :param str timeframe: the length of time each candle represents
339
636
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -345,11 +642,11 @@ class hyperliquid(ccxt.async_support.hyperliquid):
345
642
  market = self.market(symbol)
346
643
  symbol = market['symbol']
347
644
  url = self.urls['api']['ws']['public']
348
- request = {
645
+ request: dict = {
349
646
  'method': 'subscribe',
350
647
  'subscription': {
351
648
  'type': 'candle',
352
- 'coin': market['base'],
649
+ 'coin': market['base'] if market['swap'] else market['id'],
353
650
  'interval': timeframe,
354
651
  },
355
652
  }
@@ -360,6 +657,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
360
657
  limit = ohlcv.getLimit(symbol, limit)
361
658
  return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
362
659
 
660
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
661
+ """
662
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
663
+
664
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
665
+
666
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
667
+ :param str timeframe: the length of time each candle represents
668
+ :param dict [params]: extra parameters specific to the exchange API endpoint
669
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
670
+ """
671
+ await self.load_markets()
672
+ market = self.market(symbol)
673
+ symbol = market['symbol']
674
+ url = self.urls['api']['ws']['public']
675
+ request: dict = {
676
+ 'method': 'unsubscribe',
677
+ 'subscription': {
678
+ 'type': 'candle',
679
+ 'coin': market['base'] if market['swap'] else market['id'],
680
+ 'interval': timeframe,
681
+ },
682
+ }
683
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
684
+ messagehash = 'unsubscribe:' + subMessageHash
685
+ message = self.extend(request, params)
686
+ return await self.watch(url, messagehash, message, messagehash)
687
+
363
688
  def handle_ohlcv(self, client: Client, message):
364
689
  #
365
690
  # {
@@ -380,7 +705,8 @@ class hyperliquid(ccxt.async_support.hyperliquid):
380
705
  #
381
706
  data = self.safe_dict(message, 'data', {})
382
707
  base = self.safe_string(data, 's')
383
- symbol = base + '/USDC:USDC'
708
+ marketId = self.coinToMarketId(base)
709
+ symbol = self.safe_symbol(marketId)
384
710
  timeframe = self.safe_string(data, 'i')
385
711
  if not (symbol in self.ohlcvs):
386
712
  self.ohlcvs[symbol] = {}
@@ -394,15 +720,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
394
720
  messageHash = 'candles:' + timeframe + ':' + symbol
395
721
  client.resolve(ohlcv, messageHash)
396
722
 
723
+ def handle_ws_post(self, client: Client, message: dict):
724
+ # {
725
+ # channel: "post",
726
+ # data: {
727
+ # id: <number>,
728
+ # response: {
729
+ # type: "info" | "action" | "error",
730
+ # payload: {...}
731
+ # }
732
+ # }
733
+ data = self.safe_dict(message, 'data')
734
+ id = self.safe_string(data, 'id')
735
+ response = self.safe_dict(data, 'response')
736
+ payload = self.safe_dict(response, 'payload')
737
+ client.resolve(payload, id)
738
+
397
739
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
398
740
  """
399
741
  watches information on multiple orders made by the user
742
+
743
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
744
+
400
745
  :param str symbol: unified market symbol of the market orders were made in
401
746
  :param int [since]: the earliest time in ms to fetch orders for
402
747
  :param int [limit]: the maximum number of order structures to retrieve
403
748
  :param dict [params]: extra parameters specific to the exchange API endpoint
404
749
  :param str [params.user]: user address, will default to self.walletAddress if not provided
405
- :returns dict[]: a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
750
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
406
751
  """
407
752
  await self.load_markets()
408
753
  userAddress = None
@@ -414,7 +759,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
414
759
  symbol = market['symbol']
415
760
  messageHash = messageHash + ':' + symbol
416
761
  url = self.urls['api']['ws']['public']
417
- request = {
762
+ request: dict = {
418
763
  'method': 'subscribe',
419
764
  'subscription': {
420
765
  'type': 'orderUpdates',
@@ -457,7 +802,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
457
802
  return
458
803
  stored = self.orders
459
804
  messageHash = 'order'
460
- marketSymbols = {}
805
+ marketSymbols: dict = {}
461
806
  for i in range(0, len(data)):
462
807
  rawOrder = data[i]
463
808
  order = self.parse_order(rawOrder)
@@ -485,17 +830,124 @@ class hyperliquid(ccxt.async_support.hyperliquid):
485
830
  else:
486
831
  return False
487
832
 
833
+ def handle_order_book_unsubscription(self, client: Client, subscription: dict):
834
+ #
835
+ # "subscription":{
836
+ # "type":"l2Book",
837
+ # "coin":"BTC",
838
+ # "nSigFigs":5,
839
+ # "mantissa":null
840
+ # }
841
+ #
842
+ coin = self.safe_string(subscription, 'coin')
843
+ marketId = self.coinToMarketId(coin)
844
+ symbol = self.safe_symbol(marketId)
845
+ subMessageHash = 'orderbook:' + symbol
846
+ messageHash = 'unsubscribe:' + subMessageHash
847
+ self.clean_unsubscription(client, subMessageHash, messageHash)
848
+ if symbol in self.orderbooks:
849
+ del self.orderbooks[symbol]
850
+
851
+ def handle_trades_unsubscription(self, client: Client, subscription: dict):
852
+ #
853
+ coin = self.safe_string(subscription, 'coin')
854
+ marketId = self.coinToMarketId(coin)
855
+ symbol = self.safe_symbol(marketId)
856
+ subMessageHash = 'trade:' + symbol
857
+ messageHash = 'unsubscribe:' + subMessageHash
858
+ self.clean_unsubscription(client, subMessageHash, messageHash)
859
+ if symbol in self.trades:
860
+ del self.trades[symbol]
861
+
862
+ def handle_tickers_unsubscription(self, client: Client, subscription: dict):
863
+ #
864
+ subMessageHash = 'tickers'
865
+ messageHash = 'unsubscribe:' + subMessageHash
866
+ self.clean_unsubscription(client, subMessageHash, messageHash)
867
+ symbols = list(self.tickers.keys())
868
+ for i in range(0, len(symbols)):
869
+ del self.tickers[symbols[i]]
870
+
871
+ def handle_ohlcv_unsubscription(self, client: Client, subscription: dict):
872
+ coin = self.safe_string(subscription, 'coin')
873
+ marketId = self.coinToMarketId(coin)
874
+ symbol = self.safe_symbol(marketId)
875
+ interval = self.safe_string(subscription, 'interval')
876
+ timeframe = self.find_timeframe(interval)
877
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
878
+ messageHash = 'unsubscribe:' + subMessageHash
879
+ self.clean_unsubscription(client, subMessageHash, messageHash)
880
+ if symbol in self.ohlcvs:
881
+ if timeframe in self.ohlcvs[symbol]:
882
+ del self.ohlcvs[symbol][timeframe]
883
+
884
+ def handle_subscription_response(self, client: Client, message):
885
+ # {
886
+ # "channel":"subscriptionResponse",
887
+ # "data":{
888
+ # "method":"unsubscribe",
889
+ # "subscription":{
890
+ # "type":"l2Book",
891
+ # "coin":"BTC",
892
+ # "nSigFigs":5,
893
+ # "mantissa":null
894
+ # }
895
+ # }
896
+ # }
897
+ #
898
+ # {
899
+ # "channel":"subscriptionResponse",
900
+ # "data":{
901
+ # "method":"unsubscribe",
902
+ # "subscription":{
903
+ # "type":"trades",
904
+ # "coin":"PURR/USDC"
905
+ # }
906
+ # }
907
+ # }
908
+ #
909
+ data = self.safe_dict(message, 'data', {})
910
+ method = self.safe_string(data, 'method')
911
+ if method == 'unsubscribe':
912
+ subscription = self.safe_dict(data, 'subscription', {})
913
+ type = self.safe_string(subscription, 'type')
914
+ if type == 'l2Book':
915
+ self.handle_order_book_unsubscription(client, subscription)
916
+ elif type == 'trades':
917
+ self.handle_trades_unsubscription(client, subscription)
918
+ elif type == 'webData2':
919
+ self.handle_tickers_unsubscription(client, subscription)
920
+ elif type == 'candle':
921
+ self.handle_ohlcv_unsubscription(client, subscription)
922
+
488
923
  def handle_message(self, client: Client, message):
924
+ #
925
+ # {
926
+ # "channel":"subscriptionResponse",
927
+ # "data":{
928
+ # "method":"unsubscribe",
929
+ # "subscription":{
930
+ # "type":"l2Book",
931
+ # "coin":"BTC",
932
+ # "nSigFigs":5,
933
+ # "mantissa":null
934
+ # }
935
+ # }
936
+ # }
937
+ #
489
938
  if self.handle_error_message(client, message):
490
939
  return
491
940
  topic = self.safe_string(message, 'channel', '')
492
- methods = {
941
+ methods: dict = {
493
942
  'pong': self.handle_pong,
494
943
  'trades': self.handle_trades,
495
944
  'l2Book': self.handle_order_book,
496
945
  'candle': self.handle_ohlcv,
497
946
  'orderUpdates': self.handle_order,
498
947
  'userFills': self.handle_my_trades,
948
+ 'webData2': self.handle_ws_tickers,
949
+ 'post': self.handle_ws_post,
950
+ 'subscriptionResponse': self.handle_subscription_response,
499
951
  }
500
952
  exacMethod = self.safe_value(methods, topic)
501
953
  if exacMethod is not None:
@@ -509,7 +961,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
509
961
  method(client, message)
510
962
  return
511
963
 
512
- def ping(self, client):
964
+ def ping(self, client: Client):
513
965
  return {
514
966
  'method': 'ping',
515
967
  }
@@ -522,3 +974,22 @@ class hyperliquid(ccxt.async_support.hyperliquid):
522
974
  #
523
975
  client.lastPong = self.safe_integer(message, 'pong')
524
976
  return message
977
+
978
+ def request_id(self) -> float:
979
+ requestId = self.sum(self.safe_integer(self.options, 'requestId', 0), 1)
980
+ self.options['requestId'] = requestId
981
+ return requestId
982
+
983
+ def wrap_as_post_action(self, request: dict) -> dict:
984
+ requestId = self.request_id()
985
+ return {
986
+ 'requestId': requestId,
987
+ 'request': {
988
+ 'method': 'post',
989
+ 'id': requestId,
990
+ 'request': {
991
+ 'type': 'action',
992
+ 'payload': request,
993
+ },
994
+ },
995
+ }