ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/hyperliquid.py CHANGED
@@ -5,26 +5,31 @@
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 Any, Bool, 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 ccxt.base.errors import ExchangeError
12
11
 
13
12
 
14
13
  class hyperliquid(ccxt.async_support.hyperliquid):
15
14
 
16
- def describe(self):
15
+ def describe(self) -> Any:
17
16
  return self.deep_extend(super(hyperliquid, self).describe(), {
18
17
  'has': {
19
18
  'ws': True,
19
+ 'cancelOrderWs': True,
20
+ 'cancelOrdersWs': 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,148 @@ 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.parseCreateEditOrderArgs(None, symbol, type, side, amount, price, params)
106
+ orders = await self.create_orders_ws([order], globalParams)
107
+ parsedOrder = orders[0]
108
+ return parsedOrder
109
+
110
+ async def edit_order_ws(self, id: str, symbol: str, type: str, side: str, amount: Num = None, price: Num = None, params={}):
111
+ """
112
+ edit a trade order
113
+
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
+ order, globalParams = self.parseCreateEditOrderArgs(id, symbol, type, side, amount, price, params)
135
+ postRequest = self.editOrdersRequest([order], globalParams)
136
+ wrapped = self.wrap_as_post_action(postRequest)
137
+ request = self.safe_dict(wrapped, 'request', {})
138
+ requestId = self.safe_string(wrapped, 'requestId')
139
+ response = await self.watch(url, requestId, request, requestId)
140
+ # response is the same self.edit_order
141
+ responseObject = self.safe_dict(response, 'response', {})
142
+ dataObject = self.safe_dict(responseObject, 'data', {})
143
+ statuses = self.safe_list(dataObject, 'statuses', [])
144
+ first = self.safe_dict(statuses, 0, {})
145
+ parsedOrder = self.parse_order(first, market)
146
+ return parsedOrder
147
+
148
+ async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
149
+ """
150
+ cancel multiple orders using WebSocket post request
151
+
152
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/post-requests
153
+
154
+ :param str[] ids: list of order ids to cancel
155
+ :param str symbol: unified symbol of the market the orders were made in
156
+ :param dict [params]: extra parameters specific to the exchange API endpoint
157
+ :param str[] [params.clientOrderId]: list of client order ids to cancel instead of order ids
158
+ :param str [params.vaultAddress]: the vault address for order cancellation
159
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
160
+ """
161
+ self.check_required_credentials()
162
+ await self.load_markets()
163
+ request = self.cancelOrdersRequest(ids, symbol, params)
164
+ url = self.urls['api']['ws']['public']
165
+ wrapped = self.wrap_as_post_action(request)
166
+ wsRequest = self.safe_dict(wrapped, 'request', {})
167
+ requestId = self.safe_string(wrapped, 'requestId')
168
+ response = await self.watch(url, requestId, wsRequest, requestId)
169
+ responseObj = self.safe_dict(response, 'response', {})
170
+ data = self.safe_dict(responseObj, 'data', {})
171
+ statuses = self.safe_list(data, 'statuses', [])
172
+ orders = []
173
+ for i in range(0, len(statuses)):
174
+ status = statuses[i]
175
+ orders.append(self.safe_order({
176
+ 'info': status,
177
+ 'status': status,
178
+ }))
179
+ return orders
180
+
181
+ async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
182
+ """
183
+ cancel a single order using WebSocket post request
184
+
185
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/post-requests
186
+
187
+ :param str id: order id to cancel
188
+ :param str symbol: unified symbol of the market the order was made in
189
+ :param dict [params]: extra parameters specific to the exchange API endpoint
190
+ :param str [params.clientOrderId]: client order id to cancel instead of order id
191
+ :param str [params.vaultAddress]: the vault address for order cancellation
192
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
193
+ """
194
+ orders = await self.cancel_orders_ws([id], symbol, params)
195
+ return self.safe_dict(orders, 0)
196
+
56
197
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
57
198
  """
58
199
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
200
+
201
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
202
+
59
203
  :param str symbol: unified symbol of the market to fetch the order book for
60
204
  :param int [limit]: the maximum amount of order book entries to return
61
205
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -70,13 +214,41 @@ class hyperliquid(ccxt.async_support.hyperliquid):
70
214
  'method': 'subscribe',
71
215
  'subscription': {
72
216
  'type': 'l2Book',
73
- 'coin': market['base'] if market['swap'] else market['id'],
217
+ 'coin': market['baseName'] if market['swap'] else market['id'],
74
218
  },
75
219
  }
76
220
  message = self.extend(request, params)
77
221
  orderbook = await self.watch(url, messageHash, message, messageHash)
78
222
  return orderbook.limit()
79
223
 
224
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
225
+ """
226
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
227
+
228
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
229
+
230
+ :param str symbol: unified symbol of the market to fetch the order book for
231
+ :param dict [params]: extra parameters specific to the exchange API endpoint
232
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
233
+ """
234
+ await self.load_markets()
235
+ market = self.market(symbol)
236
+ symbol = market['symbol']
237
+ subMessageHash = 'orderbook:' + symbol
238
+ messageHash = 'unsubscribe:' + subMessageHash
239
+ url = self.urls['api']['ws']['public']
240
+ id = str(self.nonce())
241
+ request: dict = {
242
+ 'id': id,
243
+ 'method': 'unsubscribe',
244
+ 'subscription': {
245
+ 'type': 'l2Book',
246
+ 'coin': market['baseName'] if market['swap'] else market['id'],
247
+ },
248
+ }
249
+ message = self.extend(request, params)
250
+ return await self.watch(url, messageHash, message, messageHash)
251
+
80
252
  def handle_order_book(self, client, message):
81
253
  #
82
254
  # {
@@ -123,15 +295,83 @@ class hyperliquid(ccxt.async_support.hyperliquid):
123
295
  messageHash = 'orderbook:' + symbol
124
296
  client.resolve(orderbook, messageHash)
125
297
 
298
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
299
+ """
300
+
301
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
302
+
303
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
304
+ :param str symbol: unified symbol of the market to fetch the ticker for
305
+ :param dict [params]: extra parameters specific to the exchange API endpoint
306
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
307
+ """
308
+ market = self.market(symbol)
309
+ symbol = market['symbol']
310
+ tickers = await self.watch_tickers([symbol], params)
311
+ return tickers[symbol]
312
+
313
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
314
+ """
315
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
316
+
317
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
318
+
319
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
320
+ :param dict [params]: extra parameters specific to the exchange API endpoint
321
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
322
+ """
323
+ await self.load_markets()
324
+ symbols = self.market_symbols(symbols, None, True)
325
+ messageHash = 'tickers'
326
+ url = self.urls['api']['ws']['public']
327
+ request: dict = {
328
+ 'method': 'subscribe',
329
+ 'subscription': {
330
+ 'type': 'webData2', # allMids
331
+ 'user': '0x0000000000000000000000000000000000000000',
332
+ },
333
+ }
334
+ tickers = await self.watch(url, messageHash, self.extend(request, params), messageHash)
335
+ if self.newUpdates:
336
+ return self.filter_by_array_tickers(tickers, 'symbol', symbols)
337
+ return self.tickers
338
+
339
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
340
+ """
341
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
342
+
343
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
344
+
345
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
346
+ :param dict [params]: extra parameters specific to the exchange API endpoint
347
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
348
+ """
349
+ await self.load_markets()
350
+ symbols = self.market_symbols(symbols, None, True)
351
+ subMessageHash = 'tickers'
352
+ messageHash = 'unsubscribe:' + subMessageHash
353
+ url = self.urls['api']['ws']['public']
354
+ request: dict = {
355
+ 'method': 'unsubscribe',
356
+ 'subscription': {
357
+ 'type': 'webData2', # allMids
358
+ 'user': '0x0000000000000000000000000000000000000000',
359
+ },
360
+ }
361
+ return await self.watch(url, messageHash, self.extend(request, params), messageHash)
362
+
126
363
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
127
364
  """
128
365
  watches information on multiple trades made by the user
366
+
367
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
368
+
129
369
  :param str symbol: unified market symbol of the market orders were made in
130
370
  :param int [since]: the earliest time in ms to fetch orders for
131
371
  :param int [limit]: the maximum number of order structures to retrieve
132
372
  :param dict [params]: extra parameters specific to the exchange API endpoint
133
373
  :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
374
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
135
375
  """
136
376
  userAddress = None
137
377
  userAddress, params = self.handlePublicAddress('watchMyTrades', params)
@@ -154,6 +394,82 @@ class hyperliquid(ccxt.async_support.hyperliquid):
154
394
  limit = trades.getLimit(symbol, limit)
155
395
  return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
156
396
 
397
+ def handle_ws_tickers(self, client: Client, message):
398
+ #
399
+ # {
400
+ # "channel": "webData2",
401
+ # "data": {
402
+ # "meta": {
403
+ # "universe": [
404
+ # {
405
+ # "szDecimals": 5,
406
+ # "name": "BTC",
407
+ # "maxLeverage": 50,
408
+ # "onlyIsolated": False
409
+ # },
410
+ # ...
411
+ # ],
412
+ # },
413
+ # "assetCtxs": [
414
+ # {
415
+ # "funding": "0.00003005",
416
+ # "openInterest": "2311.50778",
417
+ # "prevDayPx": "63475.0",
418
+ # "dayNtlVlm": "468043329.64289033",
419
+ # "premium": "0.00094264",
420
+ # "oraclePx": "64712.0",
421
+ # "markPx": "64774.0",
422
+ # "midPx": "64773.5",
423
+ # "impactPxs": [
424
+ # "64773.0",
425
+ # "64774.0"
426
+ # ]
427
+ # },
428
+ # ...
429
+ # ],
430
+ # "spotAssetCtxs": [
431
+ # {
432
+ # "prevDayPx": "0.20937",
433
+ # "dayNtlVlm": "11188888.61984999",
434
+ # "markPx": "0.19722",
435
+ # "midPx": "0.197145",
436
+ # "circulatingSupply": "598760557.12072003",
437
+ # "coin": "PURR/USDC"
438
+ # },
439
+ # ...
440
+ # ],
441
+ # }
442
+ # }
443
+ #
444
+ # spot
445
+ rawData = self.safe_dict(message, 'data', {})
446
+ spotAssets = self.safe_list(rawData, 'spotAssetCtxs', [])
447
+ parsedTickers = []
448
+ for i in range(0, len(spotAssets)):
449
+ assetObject = spotAssets[i]
450
+ marketId = self.safe_string(assetObject, 'coin')
451
+ market = self.safe_market(marketId, None, None, 'spot')
452
+ ticker = self.parse_ws_ticker(assetObject, market)
453
+ parsedTickers.append(ticker)
454
+ # perpetuals
455
+ meta = self.safe_dict(rawData, 'meta', {})
456
+ universe = self.safe_list(meta, 'universe', [])
457
+ assetCtxs = self.safe_list(rawData, 'assetCtxs', [])
458
+ for i in range(0, len(universe)):
459
+ data = self.extend(
460
+ self.safe_dict(universe, i, {}),
461
+ self.safe_dict(assetCtxs, i, {})
462
+ )
463
+ id = data['name'] + '/USDC:USDC'
464
+ market = self.safe_market(id, None, None, 'swap')
465
+ ticker = self.parse_ws_ticker(data, market)
466
+ parsedTickers.append(ticker)
467
+ tickers = self.index_by(parsedTickers, 'symbol')
468
+ client.resolve(tickers, 'tickers')
469
+
470
+ def parse_ws_ticker(self, rawTicker, market: Market = None) -> Ticker:
471
+ return self.parse_ticker(rawTicker, market)
472
+
157
473
  def handle_my_trades(self, client: Client, message):
158
474
  #
159
475
  # {
@@ -208,14 +524,17 @@ class hyperliquid(ccxt.async_support.hyperliquid):
208
524
  client.resolve(trades, messageHash)
209
525
 
210
526
  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
- """
527
+ # s
528
+ # @method
529
+ # @name hyperliquid#watchTrades
530
+ # @description watches information on multiple trades made in a market
531
+ # @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
532
+ # @param {string} symbol unified market symbol of the market trades were made in
533
+ # @param {int} [since] the earliest time in ms to fetch trades for
534
+ # @param {int} [limit] the maximum number of trade structures to retrieve
535
+ # @param {object} [params] extra parameters specific to the exchange API endpoint
536
+ # @returns {object[]} a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
537
+ #
219
538
  await self.load_markets()
220
539
  market = self.market(symbol)
221
540
  symbol = market['symbol']
@@ -225,7 +544,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
225
544
  'method': 'subscribe',
226
545
  'subscription': {
227
546
  'type': 'trades',
228
- 'coin': market['base'] if market['swap'] else market['id'],
547
+ 'coin': market['baseName'] if market['swap'] else market['id'],
229
548
  },
230
549
  }
231
550
  message = self.extend(request, params)
@@ -234,6 +553,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
234
553
  limit = trades.getLimit(symbol, limit)
235
554
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
236
555
 
556
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
557
+ """
558
+ unWatches information on multiple trades made in a market
559
+
560
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
561
+
562
+ :param str symbol: unified market symbol of the market trades were made in
563
+ :param dict [params]: extra parameters specific to the exchange API endpoint
564
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
565
+ """
566
+ await self.load_markets()
567
+ market = self.market(symbol)
568
+ symbol = market['symbol']
569
+ subMessageHash = 'trade:' + symbol
570
+ messageHash = 'unsubscribe:' + subMessageHash
571
+ url = self.urls['api']['ws']['public']
572
+ request: dict = {
573
+ 'method': 'unsubscribe',
574
+ 'subscription': {
575
+ 'type': 'trades',
576
+ 'coin': market['baseName'] if market['swap'] else market['id'],
577
+ },
578
+ }
579
+ message = self.extend(request, params)
580
+ return await self.watch(url, messageHash, message, messageHash)
581
+
237
582
  def handle_trades(self, client: Client, message):
238
583
  #
239
584
  # {
@@ -269,7 +614,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
269
614
  messageHash = 'trade:' + symbol
270
615
  client.resolve(trades, messageHash)
271
616
 
272
- def parse_ws_trade(self, trade, market: Market = None) -> Trade:
617
+ def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
273
618
  #
274
619
  # fetchMyTrades
275
620
  #
@@ -321,7 +666,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
321
666
  'datetime': self.iso8601(timestamp),
322
667
  'symbol': symbol,
323
668
  'id': id,
324
- 'order': None,
669
+ 'order': self.safe_string(trade, 'oid'),
325
670
  'type': None,
326
671
  'side': side,
327
672
  'takerOrMaker': None,
@@ -334,6 +679,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
334
679
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
335
680
  """
336
681
  watches historical candlestick data containing the open, high, low, close price, and the volume of a market
682
+
683
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
684
+
337
685
  :param str symbol: unified symbol of the market to fetch OHLCV data for
338
686
  :param str timeframe: the length of time each candle represents
339
687
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -349,7 +697,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
349
697
  'method': 'subscribe',
350
698
  'subscription': {
351
699
  'type': 'candle',
352
- 'coin': market['base'] if market['swap'] else market['id'],
700
+ 'coin': market['baseName'] if market['swap'] else market['id'],
353
701
  'interval': timeframe,
354
702
  },
355
703
  }
@@ -360,6 +708,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
360
708
  limit = ohlcv.getLimit(symbol, limit)
361
709
  return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
362
710
 
711
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
712
+ """
713
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
714
+
715
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
716
+
717
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
718
+ :param str timeframe: the length of time each candle represents
719
+ :param dict [params]: extra parameters specific to the exchange API endpoint
720
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
721
+ """
722
+ await self.load_markets()
723
+ market = self.market(symbol)
724
+ symbol = market['symbol']
725
+ url = self.urls['api']['ws']['public']
726
+ request: dict = {
727
+ 'method': 'unsubscribe',
728
+ 'subscription': {
729
+ 'type': 'candle',
730
+ 'coin': market['baseName'] if market['swap'] else market['id'],
731
+ 'interval': timeframe,
732
+ },
733
+ }
734
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
735
+ messagehash = 'unsubscribe:' + subMessageHash
736
+ message = self.extend(request, params)
737
+ return await self.watch(url, messagehash, message, messagehash)
738
+
363
739
  def handle_ohlcv(self, client: Client, message):
364
740
  #
365
741
  # {
@@ -395,15 +771,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
395
771
  messageHash = 'candles:' + timeframe + ':' + symbol
396
772
  client.resolve(ohlcv, messageHash)
397
773
 
774
+ def handle_ws_post(self, client: Client, message: dict):
775
+ # {
776
+ # channel: "post",
777
+ # data: {
778
+ # id: <number>,
779
+ # response: {
780
+ # type: "info" | "action" | "error",
781
+ # payload: {...}
782
+ # }
783
+ # }
784
+ data = self.safe_dict(message, 'data')
785
+ id = self.safe_string(data, 'id')
786
+ response = self.safe_dict(data, 'response')
787
+ payload = self.safe_dict(response, 'payload')
788
+ client.resolve(payload, id)
789
+
398
790
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
399
791
  """
400
792
  watches information on multiple orders made by the user
793
+
794
+ https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
795
+
401
796
  :param str symbol: unified market symbol of the market orders were made in
402
797
  :param int [since]: the earliest time in ms to fetch orders for
403
798
  :param int [limit]: the maximum number of order structures to retrieve
404
799
  :param dict [params]: extra parameters specific to the exchange API endpoint
405
800
  :param str [params.user]: user address, will default to self.walletAddress if not provided
406
- :returns dict[]: a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
801
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
407
802
  """
408
803
  await self.load_markets()
409
804
  userAddress = None
@@ -472,21 +867,168 @@ class hyperliquid(ccxt.async_support.hyperliquid):
472
867
  client.resolve(stored, innerMessageHash)
473
868
  client.resolve(stored, messageHash)
474
869
 
475
- def handle_error_message(self, client: Client, message):
870
+ def handle_error_message(self, client: Client, message) -> Bool:
476
871
  #
477
- # {
872
+ # {
873
+ # "channel": "post",
874
+ # "data": {
875
+ # "id": 1,
876
+ # "response": {
877
+ # "type": "action",
878
+ # "payload": {
879
+ # "status": "ok",
880
+ # "response": {
881
+ # "type": "order",
882
+ # "data": {
883
+ # "statuses": [
884
+ # {
885
+ # "error": "Order price cannot be more than 80% away from the reference price"
886
+ # }
887
+ # ]
888
+ # }
889
+ # }
890
+ # }
891
+ # }
892
+ # }
893
+ # }
894
+ #
895
+ # {
478
896
  # "channel": "error",
479
897
  # "data": "Error parsing JSON into valid websocket request: {\"type\": \"allMids\"}"
480
898
  # }
481
899
  #
482
900
  channel = self.safe_string(message, 'channel', '')
483
- ret_msg = self.safe_string(message, 'data', '')
484
901
  if channel == 'error':
485
- raise ExchangeError(self.id + ' ' + ret_msg)
486
- else:
487
- return False
902
+ ret_msg = self.safe_string(message, 'data', '')
903
+ errorMsg = self.id + ' ' + ret_msg
904
+ client.reject(errorMsg)
905
+ return True
906
+ data = self.safe_dict(message, 'data', {})
907
+ id = self.safe_string(message, 'id')
908
+ response = self.safe_dict(data, 'response', {})
909
+ payload = self.safe_dict(response, 'payload', {})
910
+ status = self.safe_string(payload, 'status')
911
+ if status is not None and status != 'ok':
912
+ errorMsg = self.id + ' ' + self.json(payload)
913
+ client.reject(errorMsg, id)
914
+ return True
915
+ type = self.safe_string(payload, 'type')
916
+ if type == 'error':
917
+ error = self.id + ' ' + self.json(payload)
918
+ client.reject(error, id)
919
+ return True
920
+ try:
921
+ self.handle_errors(0, '', '', '', {}, self.json(payload), payload, {}, {})
922
+ except Exception as e:
923
+ client.reject(e, id)
924
+ return True
925
+ return False
926
+
927
+ def handle_order_book_unsubscription(self, client: Client, subscription: dict):
928
+ #
929
+ # "subscription":{
930
+ # "type":"l2Book",
931
+ # "coin":"BTC",
932
+ # "nSigFigs":5,
933
+ # "mantissa":null
934
+ # }
935
+ #
936
+ coin = self.safe_string(subscription, 'coin')
937
+ marketId = self.coinToMarketId(coin)
938
+ symbol = self.safe_symbol(marketId)
939
+ subMessageHash = 'orderbook:' + symbol
940
+ messageHash = 'unsubscribe:' + subMessageHash
941
+ self.clean_unsubscription(client, subMessageHash, messageHash)
942
+ if symbol in self.orderbooks:
943
+ del self.orderbooks[symbol]
944
+
945
+ def handle_trades_unsubscription(self, client: Client, subscription: dict):
946
+ #
947
+ coin = self.safe_string(subscription, 'coin')
948
+ marketId = self.coinToMarketId(coin)
949
+ symbol = self.safe_symbol(marketId)
950
+ subMessageHash = 'trade:' + symbol
951
+ messageHash = 'unsubscribe:' + subMessageHash
952
+ self.clean_unsubscription(client, subMessageHash, messageHash)
953
+ if symbol in self.trades:
954
+ del self.trades[symbol]
955
+
956
+ def handle_tickers_unsubscription(self, client: Client, subscription: dict):
957
+ #
958
+ subMessageHash = 'tickers'
959
+ messageHash = 'unsubscribe:' + subMessageHash
960
+ self.clean_unsubscription(client, subMessageHash, messageHash)
961
+ symbols = list(self.tickers.keys())
962
+ for i in range(0, len(symbols)):
963
+ del self.tickers[symbols[i]]
964
+
965
+ def handle_ohlcv_unsubscription(self, client: Client, subscription: dict):
966
+ coin = self.safe_string(subscription, 'coin')
967
+ marketId = self.coinToMarketId(coin)
968
+ symbol = self.safe_symbol(marketId)
969
+ interval = self.safe_string(subscription, 'interval')
970
+ timeframe = self.find_timeframe(interval)
971
+ subMessageHash = 'candles:' + timeframe + ':' + symbol
972
+ messageHash = 'unsubscribe:' + subMessageHash
973
+ self.clean_unsubscription(client, subMessageHash, messageHash)
974
+ if symbol in self.ohlcvs:
975
+ if timeframe in self.ohlcvs[symbol]:
976
+ del self.ohlcvs[symbol][timeframe]
977
+
978
+ def handle_subscription_response(self, client: Client, message):
979
+ # {
980
+ # "channel":"subscriptionResponse",
981
+ # "data":{
982
+ # "method":"unsubscribe",
983
+ # "subscription":{
984
+ # "type":"l2Book",
985
+ # "coin":"BTC",
986
+ # "nSigFigs":5,
987
+ # "mantissa":null
988
+ # }
989
+ # }
990
+ # }
991
+ #
992
+ # {
993
+ # "channel":"subscriptionResponse",
994
+ # "data":{
995
+ # "method":"unsubscribe",
996
+ # "subscription":{
997
+ # "type":"trades",
998
+ # "coin":"PURR/USDC"
999
+ # }
1000
+ # }
1001
+ # }
1002
+ #
1003
+ data = self.safe_dict(message, 'data', {})
1004
+ method = self.safe_string(data, 'method')
1005
+ if method == 'unsubscribe':
1006
+ subscription = self.safe_dict(data, 'subscription', {})
1007
+ type = self.safe_string(subscription, 'type')
1008
+ if type == 'l2Book':
1009
+ self.handle_order_book_unsubscription(client, subscription)
1010
+ elif type == 'trades':
1011
+ self.handle_trades_unsubscription(client, subscription)
1012
+ elif type == 'webData2':
1013
+ self.handle_tickers_unsubscription(client, subscription)
1014
+ elif type == 'candle':
1015
+ self.handle_ohlcv_unsubscription(client, subscription)
488
1016
 
489
1017
  def handle_message(self, client: Client, message):
1018
+ #
1019
+ # {
1020
+ # "channel":"subscriptionResponse",
1021
+ # "data":{
1022
+ # "method":"unsubscribe",
1023
+ # "subscription":{
1024
+ # "type":"l2Book",
1025
+ # "coin":"BTC",
1026
+ # "nSigFigs":5,
1027
+ # "mantissa":null
1028
+ # }
1029
+ # }
1030
+ # }
1031
+ #
490
1032
  if self.handle_error_message(client, message):
491
1033
  return
492
1034
  topic = self.safe_string(message, 'channel', '')
@@ -497,6 +1039,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
497
1039
  'candle': self.handle_ohlcv,
498
1040
  'orderUpdates': self.handle_order,
499
1041
  'userFills': self.handle_my_trades,
1042
+ 'webData2': self.handle_ws_tickers,
1043
+ 'post': self.handle_ws_post,
1044
+ 'subscriptionResponse': self.handle_subscription_response,
500
1045
  }
501
1046
  exacMethod = self.safe_value(methods, topic)
502
1047
  if exacMethod is not None:
@@ -510,7 +1055,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
510
1055
  method(client, message)
511
1056
  return
512
1057
 
513
- def ping(self, client):
1058
+ def ping(self, client: Client):
514
1059
  return {
515
1060
  'method': 'ping',
516
1061
  }
@@ -523,3 +1068,22 @@ class hyperliquid(ccxt.async_support.hyperliquid):
523
1068
  #
524
1069
  client.lastPong = self.safe_integer(message, 'pong')
525
1070
  return message
1071
+
1072
+ def request_id(self) -> float:
1073
+ requestId = self.sum(self.safe_integer(self.options, 'requestId', 0), 1)
1074
+ self.options['requestId'] = requestId
1075
+ return requestId
1076
+
1077
+ def wrap_as_post_action(self, request: dict) -> dict:
1078
+ requestId = self.request_id()
1079
+ return {
1080
+ 'requestId': requestId,
1081
+ 'request': {
1082
+ 'method': 'post',
1083
+ 'id': requestId,
1084
+ 'request': {
1085
+ 'type': 'action',
1086
+ 'payload': request,
1087
+ },
1088
+ },
1089
+ }