ccxt-ir 4.10.0 → 4.11.0

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 (1047) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +4 -1
  4. package/dist/cjs/src/abstract/bidarz.js +11 -0
  5. package/dist/cjs/src/bidarz.js +337 -0
  6. package/dist/cjs/src/bit24.js +4 -3
  7. package/js/ccxt.d.ts +5 -2
  8. package/js/ccxt.js +4 -2
  9. package/js/src/abstract/bidarz.d.ts +9 -0
  10. package/js/src/abstract/bidarz.js +11 -0
  11. package/js/src/bidarz.d.ts +22 -0
  12. package/js/src/bidarz.js +336 -0
  13. package/js/src/bit24.js +4 -3
  14. package/js/src/src/abantether.d.ts +21 -0
  15. package/js/src/src/abantether.js +353 -0
  16. package/js/src/src/abstract/abantether.d.ts +8 -0
  17. package/js/src/src/abstract/abantether.js +11 -0
  18. package/js/src/src/abstract/afratether.d.ts +9 -0
  19. package/js/src/src/abstract/afratether.js +11 -0
  20. package/js/src/src/abstract/alpaca.d.ts +77 -0
  21. package/js/src/src/abstract/alpaca.js +11 -0
  22. package/js/src/src/abstract/apex.d.ts +34 -0
  23. package/js/src/src/abstract/apex.js +11 -0
  24. package/js/src/src/abstract/arzinja.d.ts +8 -0
  25. package/js/src/src/abstract/arzinja.js +11 -0
  26. package/js/src/src/abstract/arzplus.d.ts +11 -0
  27. package/js/src/src/abstract/arzplus.js +11 -0
  28. package/js/src/src/abstract/ascendex.d.ts +80 -0
  29. package/js/src/src/abstract/ascendex.js +11 -0
  30. package/js/src/src/abstract/asretether.d.ts +8 -0
  31. package/js/src/src/abstract/asretether.js +11 -0
  32. package/js/src/src/abstract/bidarz.d.ts +9 -0
  33. package/js/src/src/abstract/bidarz.js +11 -0
  34. package/js/src/src/abstract/bigone.d.ts +48 -0
  35. package/js/src/src/abstract/bigone.js +11 -0
  36. package/js/src/src/abstract/binance.d.ts +773 -0
  37. package/js/src/src/abstract/binance.js +11 -0
  38. package/js/src/src/abstract/bingx.d.ts +165 -0
  39. package/js/src/src/abstract/bingx.js +11 -0
  40. package/js/src/src/abstract/bit24.d.ts +9 -0
  41. package/js/src/src/abstract/bit24.js +11 -0
  42. package/js/src/src/abstract/bit2c.d.ts +30 -0
  43. package/js/src/src/abstract/bit2c.js +11 -0
  44. package/js/src/src/abstract/bitbank.d.ts +35 -0
  45. package/js/src/src/abstract/bitbank.js +11 -0
  46. package/js/src/src/abstract/bitbarg.d.ts +8 -0
  47. package/js/src/src/abstract/bitbarg.js +11 -0
  48. package/js/src/src/abstract/bitbns.d.ts +43 -0
  49. package/js/src/src/abstract/bitbns.js +11 -0
  50. package/js/src/src/abstract/bitfinex.d.ts +143 -0
  51. package/js/src/src/abstract/bitfinex.js +11 -0
  52. package/js/src/src/abstract/bitflyer.d.ts +42 -0
  53. package/js/src/src/abstract/bitflyer.js +11 -0
  54. package/js/src/src/abstract/bitget.d.ts +578 -0
  55. package/js/src/src/abstract/bitget.js +11 -0
  56. package/js/src/src/abstract/bithumb.d.ts +35 -0
  57. package/js/src/src/abstract/bithumb.js +11 -0
  58. package/js/src/src/abstract/bitimen.d.ts +10 -0
  59. package/js/src/src/abstract/bitimen.js +11 -0
  60. package/js/src/src/abstract/bitir.d.ts +10 -0
  61. package/js/src/src/abstract/bitir.js +11 -0
  62. package/js/src/src/abstract/bitmart.d.ts +120 -0
  63. package/js/src/src/abstract/bitmart.js +11 -0
  64. package/js/src/src/abstract/bitmex.d.ts +100 -0
  65. package/js/src/src/abstract/bitmex.js +11 -0
  66. package/js/src/src/abstract/bitopro.d.ts +33 -0
  67. package/js/src/src/abstract/bitopro.js +11 -0
  68. package/js/src/src/abstract/bitpin.d.ts +11 -0
  69. package/js/src/src/abstract/bitpin.js +11 -0
  70. package/js/src/src/abstract/bitrue.d.ts +75 -0
  71. package/js/src/src/abstract/bitrue.js +11 -0
  72. package/js/src/src/abstract/bitso.d.ts +46 -0
  73. package/js/src/src/abstract/bitso.js +11 -0
  74. package/js/src/src/abstract/bitstamp.d.ts +262 -0
  75. package/js/src/src/abstract/bitstamp.js +11 -0
  76. package/js/src/src/abstract/bitteam.d.ts +32 -0
  77. package/js/src/src/abstract/bitteam.js +11 -0
  78. package/js/src/src/abstract/bittrade.d.ts +117 -0
  79. package/js/src/src/abstract/bittrade.js +11 -0
  80. package/js/src/src/abstract/bitunix.d.ts +9 -0
  81. package/js/src/src/abstract/bitunix.js +11 -0
  82. package/js/src/src/abstract/bitvavo.d.ts +30 -0
  83. package/js/src/src/abstract/bitvavo.js +11 -0
  84. package/js/src/src/abstract/blockchaincom.d.ts +31 -0
  85. package/js/src/src/abstract/blockchaincom.js +11 -0
  86. package/js/src/src/abstract/blofin.d.ts +70 -0
  87. package/js/src/src/abstract/blofin.js +11 -0
  88. package/js/src/src/abstract/btcalpha.d.ts +21 -0
  89. package/js/src/src/abstract/btcalpha.js +11 -0
  90. package/js/src/src/abstract/btcbox.d.ts +18 -0
  91. package/js/src/src/abstract/btcbox.js +11 -0
  92. package/js/src/src/abstract/btcmarkets.d.ts +42 -0
  93. package/js/src/src/abstract/btcmarkets.js +11 -0
  94. package/js/src/src/abstract/btcturk.d.ts +23 -0
  95. package/js/src/src/abstract/btcturk.js +11 -0
  96. package/js/src/src/abstract/bybit.d.ts +316 -0
  97. package/js/src/src/abstract/bybit.js +11 -0
  98. package/js/src/src/abstract/bydfi.d.ts +11 -0
  99. package/js/src/src/abstract/bydfi.js +11 -0
  100. package/js/src/src/abstract/cafearz.d.ts +8 -0
  101. package/js/src/src/abstract/cafearz.js +11 -0
  102. package/js/src/src/abstract/cex.d.ts +35 -0
  103. package/js/src/src/abstract/cex.js +11 -0
  104. package/js/src/src/abstract/coinbase.d.ts +97 -0
  105. package/js/src/src/abstract/coinbase.js +11 -0
  106. package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
  107. package/js/src/src/abstract/coinbaseexchange.js +11 -0
  108. package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
  109. package/js/src/src/abstract/coinbaseinternational.js +11 -0
  110. package/js/src/src/abstract/coincatch.d.ts +97 -0
  111. package/js/src/src/abstract/coincatch.js +11 -0
  112. package/js/src/src/abstract/coincheck.d.ts +36 -0
  113. package/js/src/src/abstract/coincheck.js +11 -0
  114. package/js/src/src/abstract/coinex.d.ts +240 -0
  115. package/js/src/src/abstract/coinex.js +11 -0
  116. package/js/src/src/abstract/coinmate.d.ts +65 -0
  117. package/js/src/src/abstract/coinmate.js +11 -0
  118. package/js/src/src/abstract/coinmetro.d.ts +37 -0
  119. package/js/src/src/abstract/coinmetro.js +11 -0
  120. package/js/src/src/abstract/coinone.d.ts +70 -0
  121. package/js/src/src/abstract/coinone.js +11 -0
  122. package/js/src/src/abstract/coinsph.d.ts +57 -0
  123. package/js/src/src/abstract/coinsph.js +11 -0
  124. package/js/src/src/abstract/coinspot.d.ts +31 -0
  125. package/js/src/src/abstract/coinspot.js +11 -0
  126. package/js/src/src/abstract/cryptocom.d.ts +126 -0
  127. package/js/src/src/abstract/cryptocom.js +11 -0
  128. package/js/src/src/abstract/cryptomus.d.ts +23 -0
  129. package/js/src/src/abstract/cryptomus.js +11 -0
  130. package/js/src/src/abstract/defx.d.ts +72 -0
  131. package/js/src/src/abstract/defx.js +11 -0
  132. package/js/src/src/abstract/delta.d.ts +53 -0
  133. package/js/src/src/abstract/delta.js +11 -0
  134. package/js/src/src/abstract/deribit.d.ts +129 -0
  135. package/js/src/src/abstract/deribit.js +11 -0
  136. package/js/src/src/abstract/derive.d.ts +120 -0
  137. package/js/src/src/abstract/derive.js +11 -0
  138. package/js/src/src/abstract/digifinex.d.ts +95 -0
  139. package/js/src/src/abstract/digifinex.js +11 -0
  140. package/js/src/src/abstract/ellipx.d.ts +28 -0
  141. package/js/src/src/abstract/ellipx.js +11 -0
  142. package/js/src/src/abstract/eterex.d.ts +8 -0
  143. package/js/src/src/abstract/eterex.js +11 -0
  144. package/js/src/src/abstract/excoino.d.ts +10 -0
  145. package/js/src/src/abstract/excoino.js +11 -0
  146. package/js/src/src/abstract/exir.d.ts +11 -0
  147. package/js/src/src/abstract/exir.js +11 -0
  148. package/js/src/src/abstract/exmo.d.ts +58 -0
  149. package/js/src/src/abstract/exmo.js +11 -0
  150. package/js/src/src/abstract/exnovin.d.ts +9 -0
  151. package/js/src/src/abstract/exnovin.js +11 -0
  152. package/js/src/src/abstract/farhadexchange.d.ts +8 -0
  153. package/js/src/src/abstract/farhadexchange.js +11 -0
  154. package/js/src/src/abstract/foxbit.d.ts +29 -0
  155. package/js/src/src/abstract/foxbit.js +11 -0
  156. package/js/src/src/abstract/gate.d.ts +287 -0
  157. package/js/src/src/abstract/gate.js +11 -0
  158. package/js/src/src/abstract/gemini.d.ts +62 -0
  159. package/js/src/src/abstract/gemini.js +11 -0
  160. package/js/src/src/abstract/hamtapay.d.ts +9 -0
  161. package/js/src/src/abstract/hamtapay.js +11 -0
  162. package/js/src/src/abstract/hashkey.d.ts +70 -0
  163. package/js/src/src/abstract/hashkey.js +11 -0
  164. package/js/src/src/abstract/hibachi.d.ts +29 -0
  165. package/js/src/src/abstract/hibachi.js +11 -0
  166. package/js/src/src/abstract/hitbtc.d.ts +118 -0
  167. package/js/src/src/abstract/hitbtc.js +11 -0
  168. package/js/src/src/abstract/hitobit.d.ts +11 -0
  169. package/js/src/src/abstract/hitobit.js +11 -0
  170. package/js/src/src/abstract/hollaex.d.ts +36 -0
  171. package/js/src/src/abstract/hollaex.js +11 -0
  172. package/js/src/src/abstract/htx.d.ts +551 -0
  173. package/js/src/src/abstract/htx.js +11 -0
  174. package/js/src/src/abstract/hyperliquid.d.ts +9 -0
  175. package/js/src/src/abstract/hyperliquid.js +11 -0
  176. package/js/src/src/abstract/independentreserve.d.ts +46 -0
  177. package/js/src/src/abstract/independentreserve.js +11 -0
  178. package/js/src/src/abstract/indodax.d.ts +29 -0
  179. package/js/src/src/abstract/indodax.js +11 -0
  180. package/js/src/src/abstract/iranexchange.d.ts +9 -0
  181. package/js/src/src/abstract/iranexchange.js +11 -0
  182. package/js/src/src/abstract/jibitex.d.ts +10 -0
  183. package/js/src/src/abstract/jibitex.js +11 -0
  184. package/js/src/src/abstract/kcex.d.ts +10 -0
  185. package/js/src/src/abstract/kcex.js +11 -0
  186. package/js/src/src/abstract/kifpoolme.d.ts +9 -0
  187. package/js/src/src/abstract/kifpoolme.js +11 -0
  188. package/js/src/src/abstract/kraken.d.ts +61 -0
  189. package/js/src/src/abstract/kraken.js +11 -0
  190. package/js/src/src/abstract/krakenfutures.d.ts +45 -0
  191. package/js/src/src/abstract/krakenfutures.js +11 -0
  192. package/js/src/src/abstract/kucoin.d.ts +227 -0
  193. package/js/src/src/abstract/kucoin.js +11 -0
  194. package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
  195. package/js/src/src/abstract/kucoinfutures.js +11 -0
  196. package/js/src/src/abstract/latoken.d.ts +59 -0
  197. package/js/src/src/abstract/latoken.js +11 -0
  198. package/js/src/src/abstract/lbank.d.ts +65 -0
  199. package/js/src/src/abstract/lbank.js +11 -0
  200. package/js/src/src/abstract/luno.d.ts +41 -0
  201. package/js/src/src/abstract/luno.js +11 -0
  202. package/js/src/src/abstract/mazdax.d.ts +11 -0
  203. package/js/src/src/abstract/mazdax.js +11 -0
  204. package/js/src/src/abstract/mercado.d.ts +28 -0
  205. package/js/src/src/abstract/mercado.js +11 -0
  206. package/js/src/src/abstract/mexc.d.ts +183 -0
  207. package/js/src/src/abstract/mexc.js +11 -0
  208. package/js/src/src/abstract/modetrade.d.ts +122 -0
  209. package/js/src/src/abstract/modetrade.js +11 -0
  210. package/js/src/src/abstract/ndax.d.ts +100 -0
  211. package/js/src/src/abstract/ndax.js +11 -0
  212. package/js/src/src/abstract/nobitex.d.ts +10 -0
  213. package/js/src/src/abstract/nobitex.js +11 -0
  214. package/js/src/src/abstract/novadax.d.ts +32 -0
  215. package/js/src/src/abstract/novadax.js +11 -0
  216. package/js/src/src/abstract/oceanex.d.ts +30 -0
  217. package/js/src/src/abstract/oceanex.js +11 -0
  218. package/js/src/src/abstract/okcoin.d.ts +77 -0
  219. package/js/src/src/abstract/okcoin.js +11 -0
  220. package/js/src/src/abstract/okexchange.d.ts +11 -0
  221. package/js/src/src/abstract/okexchange.js +11 -0
  222. package/js/src/src/abstract/okx.d.ts +352 -0
  223. package/js/src/src/abstract/okx.js +11 -0
  224. package/js/src/src/abstract/ompfinex.d.ts +10 -0
  225. package/js/src/src/abstract/ompfinex.js +11 -0
  226. package/js/src/src/abstract/onetrading.d.ts +26 -0
  227. package/js/src/src/abstract/onetrading.js +11 -0
  228. package/js/src/src/abstract/oxfun.d.ts +37 -0
  229. package/js/src/src/abstract/oxfun.js +11 -0
  230. package/js/src/src/abstract/p2b.d.ts +25 -0
  231. package/js/src/src/abstract/p2b.js +11 -0
  232. package/js/src/src/abstract/paradex.d.ts +66 -0
  233. package/js/src/src/abstract/paradex.js +11 -0
  234. package/js/src/src/abstract/paymium.d.ts +31 -0
  235. package/js/src/src/abstract/paymium.js +11 -0
  236. package/js/src/src/abstract/phemex.d.ts +120 -0
  237. package/js/src/src/abstract/phemex.js +11 -0
  238. package/js/src/src/abstract/pingi.d.ts +9 -0
  239. package/js/src/src/abstract/pingi.js +11 -0
  240. package/js/src/src/abstract/poloniex.d.ts +108 -0
  241. package/js/src/src/abstract/poloniex.js +11 -0
  242. package/js/src/src/abstract/pooleno.d.ts +8 -0
  243. package/js/src/src/abstract/pooleno.js +11 -0
  244. package/js/src/src/abstract/probit.d.ts +26 -0
  245. package/js/src/src/abstract/probit.js +11 -0
  246. package/js/src/src/abstract/raastin.d.ts +11 -0
  247. package/js/src/src/abstract/raastin.js +11 -0
  248. package/js/src/src/abstract/ramzinex.d.ts +10 -0
  249. package/js/src/src/abstract/ramzinex.js +11 -0
  250. package/js/src/src/abstract/sarmayex.d.ts +8 -0
  251. package/js/src/src/abstract/sarmayex.js +11 -0
  252. package/js/src/src/abstract/sarrafex.d.ts +10 -0
  253. package/js/src/src/abstract/sarrafex.js +11 -0
  254. package/js/src/src/abstract/tabdeal.d.ts +10 -0
  255. package/js/src/src/abstract/tabdeal.js +11 -0
  256. package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
  257. package/js/src/src/abstract/tehran_exchange.js +11 -0
  258. package/js/src/src/abstract/tetherland.d.ts +8 -0
  259. package/js/src/src/abstract/tetherland.js +11 -0
  260. package/js/src/src/abstract/timex.d.ts +65 -0
  261. package/js/src/src/abstract/timex.js +11 -0
  262. package/js/src/src/abstract/tokocrypto.d.ts +40 -0
  263. package/js/src/src/abstract/tokocrypto.js +11 -0
  264. package/js/src/src/abstract/toobit.d.ts +10 -0
  265. package/js/src/src/abstract/toobit.js +11 -0
  266. package/js/src/src/abstract/tradeogre.d.ts +21 -0
  267. package/js/src/src/abstract/tradeogre.js +11 -0
  268. package/js/src/src/abstract/twox.d.ts +8 -0
  269. package/js/src/src/abstract/twox.js +11 -0
  270. package/js/src/src/abstract/ubitex.d.ts +10 -0
  271. package/js/src/src/abstract/ubitex.js +11 -0
  272. package/js/src/src/abstract/upbit.d.ts +58 -0
  273. package/js/src/src/abstract/upbit.js +11 -0
  274. package/js/src/src/abstract/vertex.d.ts +22 -0
  275. package/js/src/src/abstract/vertex.js +11 -0
  276. package/js/src/src/abstract/wallex.d.ts +11 -0
  277. package/js/src/src/abstract/wallex.js +11 -0
  278. package/js/src/src/abstract/wavesexchange.d.ts +157 -0
  279. package/js/src/src/abstract/wavesexchange.js +11 -0
  280. package/js/src/src/abstract/whitebit.d.ts +117 -0
  281. package/js/src/src/abstract/whitebit.js +11 -0
  282. package/js/src/src/abstract/woo.d.ts +144 -0
  283. package/js/src/src/abstract/woo.js +11 -0
  284. package/js/src/src/abstract/woofipro.d.ts +122 -0
  285. package/js/src/src/abstract/woofipro.js +11 -0
  286. package/js/src/src/abstract/xt.d.ts +160 -0
  287. package/js/src/src/abstract/xt.js +11 -0
  288. package/js/src/src/abstract/yobit.d.ts +19 -0
  289. package/js/src/src/abstract/yobit.js +11 -0
  290. package/js/src/src/abstract/zaif.d.ts +41 -0
  291. package/js/src/src/abstract/zaif.js +11 -0
  292. package/js/src/src/abstract/zonda.d.ts +56 -0
  293. package/js/src/src/abstract/zonda.js +11 -0
  294. package/js/src/src/afratether.d.ts +21 -0
  295. package/js/src/src/afratether.js +356 -0
  296. package/js/src/src/alpaca.d.ts +332 -0
  297. package/js/src/src/alpaca.js +1908 -0
  298. package/js/src/src/apex.d.ts +333 -0
  299. package/js/src/src/apex.js +1942 -0
  300. package/js/src/src/arzinja.d.ts +21 -0
  301. package/js/src/src/arzinja.js +298 -0
  302. package/js/src/src/arzplus.d.ts +26 -0
  303. package/js/src/src/arzplus.js +581 -0
  304. package/js/src/src/ascendex.d.ts +424 -0
  305. package/js/src/src/ascendex.js +3699 -0
  306. package/js/src/src/asretether.d.ts +21 -0
  307. package/js/src/src/asretether.js +324 -0
  308. package/js/src/src/base/Exchange.d.ts +926 -0
  309. package/js/src/src/base/Exchange.js +7399 -0
  310. package/js/src/src/base/Precise.d.ts +42 -0
  311. package/js/src/src/base/Precise.js +275 -0
  312. package/js/src/src/base/errors.d.ts +168 -0
  313. package/js/src/src/base/errors.js +255 -0
  314. package/js/src/src/base/functions/crypto.d.ts +16 -0
  315. package/js/src/src/base/functions/crypto.js +131 -0
  316. package/js/src/src/base/functions/encode.d.ts +4 -0
  317. package/js/src/src/base/functions/encode.js +32 -0
  318. package/js/src/src/base/functions/generic.d.ts +29 -0
  319. package/js/src/src/base/functions/generic.js +203 -0
  320. package/js/src/src/base/functions/misc.d.ts +9 -0
  321. package/js/src/src/base/functions/misc.js +101 -0
  322. package/js/src/src/base/functions/number.d.ts +27 -0
  323. package/js/src/src/base/functions/number.js +313 -0
  324. package/js/src/src/base/functions/platform.d.ts +7 -0
  325. package/js/src/src/base/functions/platform.js +27 -0
  326. package/js/src/src/base/functions/rsa.d.ts +5 -0
  327. package/js/src/src/base/functions/rsa.js +49 -0
  328. package/js/src/src/base/functions/string.d.ts +7 -0
  329. package/js/src/src/base/functions/string.js +44 -0
  330. package/js/src/src/base/functions/throttle.d.ts +6 -0
  331. package/js/src/src/base/functions/throttle.js +67 -0
  332. package/js/src/src/base/functions/time.d.ts +21 -0
  333. package/js/src/src/base/functions/time.js +171 -0
  334. package/js/src/src/base/functions/totp.d.ts +3 -0
  335. package/js/src/src/base/functions/totp.js +25 -0
  336. package/js/src/src/base/functions/type.d.ts +37 -0
  337. package/js/src/src/base/functions/type.js +179 -0
  338. package/js/src/src/base/functions.d.ts +10 -0
  339. package/js/src/src/base/functions.js +18 -0
  340. package/js/src/src/base/types.d.ts +586 -0
  341. package/js/src/src/base/types.js +7 -0
  342. package/js/src/src/base/ws/Cache.d.ts +27 -0
  343. package/js/src/src/base/ws/Cache.js +260 -0
  344. package/js/src/src/base/ws/Client.d.ts +53 -0
  345. package/js/src/src/base/ws/Client.js +307 -0
  346. package/js/src/src/base/ws/Future.d.ts +8 -0
  347. package/js/src/src/base/ws/Future.js +35 -0
  348. package/js/src/src/base/ws/OrderBook.d.ts +25 -0
  349. package/js/src/src/base/ws/OrderBook.js +130 -0
  350. package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
  351. package/js/src/src/base/ws/OrderBookSide.js +286 -0
  352. package/js/src/src/base/ws/WsClient.d.ts +11 -0
  353. package/js/src/src/base/ws/WsClient.js +69 -0
  354. package/js/src/src/bequant.d.ts +4 -0
  355. package/js/src/src/bequant.js +35 -0
  356. package/js/src/src/bidarz.d.ts +16 -0
  357. package/js/src/src/bidarz.js +327 -0
  358. package/js/src/src/bigone.d.ts +296 -0
  359. package/js/src/src/bigone.js +2340 -0
  360. package/js/src/src/binance.d.ts +1667 -0
  361. package/js/src/src/binance.js +14400 -0
  362. package/js/src/src/binancecoinm.d.ts +6 -0
  363. package/js/src/src/binancecoinm.js +51 -0
  364. package/js/src/src/binanceus.d.ts +4 -0
  365. package/js/src/src/binanceus.js +225 -0
  366. package/js/src/src/binanceusdm.d.ts +6 -0
  367. package/js/src/src/binanceusdm.js +63 -0
  368. package/js/src/src/bingx.d.ts +778 -0
  369. package/js/src/src/bingx.js +6705 -0
  370. package/js/src/src/bit24.d.ts +24 -0
  371. package/js/src/src/bit24.js +520 -0
  372. package/js/src/src/bit2c.d.ts +146 -0
  373. package/js/src/src/bit2c.js +1029 -0
  374. package/js/src/src/bitbank.d.ts +181 -0
  375. package/js/src/src/bitbank.js +1146 -0
  376. package/js/src/src/bitbarg.d.ts +21 -0
  377. package/js/src/src/bitbarg.js +312 -0
  378. package/js/src/src/bitbns.d.ts +184 -0
  379. package/js/src/src/bitbns.js +1288 -0
  380. package/js/src/src/bitfinex.d.ts +516 -0
  381. package/js/src/src/bitfinex.js +3951 -0
  382. package/js/src/src/bitflyer.d.ts +229 -0
  383. package/js/src/src/bitflyer.js +1209 -0
  384. package/js/src/src/bitget.d.ts +1109 -0
  385. package/js/src/src/bitget.js +11033 -0
  386. package/js/src/src/bithumb.d.ts +165 -0
  387. package/js/src/src/bithumb.js +1257 -0
  388. package/js/src/src/bitimen.d.ts +23 -0
  389. package/js/src/src/bitimen.js +424 -0
  390. package/js/src/src/bitir.d.ts +23 -0
  391. package/js/src/src/bitir.js +521 -0
  392. package/js/src/src/bitmart.d.ts +736 -0
  393. package/js/src/src/bitmart.js +5639 -0
  394. package/js/src/src/bitmex.d.ts +395 -0
  395. package/js/src/src/bitmex.js +3088 -0
  396. package/js/src/src/bitopro.d.ts +295 -0
  397. package/js/src/src/bitopro.js +1892 -0
  398. package/js/src/src/bitpin.d.ts +23 -0
  399. package/js/src/src/bitpin.js +487 -0
  400. package/js/src/src/bitrue.d.ts +384 -0
  401. package/js/src/src/bitrue.js +3382 -0
  402. package/js/src/src/bitso.d.ts +270 -0
  403. package/js/src/src/bitso.js +1881 -0
  404. package/js/src/src/bitstamp.d.ts +355 -0
  405. package/js/src/src/bitstamp.js +2445 -0
  406. package/js/src/src/bitteam.d.ts +229 -0
  407. package/js/src/src/bitteam.js +2420 -0
  408. package/js/src/src/bittrade.d.ts +298 -0
  409. package/js/src/src/bittrade.js +2050 -0
  410. package/js/src/src/bitunix.d.ts +21 -0
  411. package/js/src/src/bitunix.js +326 -0
  412. package/js/src/src/bitvavo.d.ts +311 -0
  413. package/js/src/src/bitvavo.js +2204 -0
  414. package/js/src/src/blockchaincom.d.ts +256 -0
  415. package/js/src/src/blockchaincom.js +1259 -0
  416. package/js/src/src/blofin.d.ts +439 -0
  417. package/js/src/src/blofin.js +2576 -0
  418. package/js/src/src/btcalpha.d.ts +209 -0
  419. package/js/src/src/btcalpha.js +1056 -0
  420. package/js/src/src/btcbox.d.ts +144 -0
  421. package/js/src/src/btcbox.js +834 -0
  422. package/js/src/src/btcmarkets.d.ts +253 -0
  423. package/js/src/src/btcmarkets.js +1418 -0
  424. package/js/src/src/btcturk.d.ts +161 -0
  425. package/js/src/src/btcturk.js +1058 -0
  426. package/js/src/src/bybit.d.ts +1097 -0
  427. package/js/src/src/bybit.js +9382 -0
  428. package/js/src/src/bydfi.d.ts +23 -0
  429. package/js/src/src/bydfi.js +434 -0
  430. package/js/src/src/cafearz.d.ts +21 -0
  431. package/js/src/src/cafearz.js +346 -0
  432. package/js/src/src/cex.d.ts +286 -0
  433. package/js/src/src/cex.js +1799 -0
  434. package/js/src/src/coinbase.d.ts +623 -0
  435. package/js/src/src/coinbase.js +5220 -0
  436. package/js/src/src/coinbaseadvanced.d.ts +4 -0
  437. package/js/src/src/coinbaseadvanced.js +18 -0
  438. package/js/src/src/coinbaseexchange.d.ts +334 -0
  439. package/js/src/src/coinbaseexchange.js +2127 -0
  440. package/js/src/src/coinbaseinternational.d.ts +443 -0
  441. package/js/src/src/coinbaseinternational.js +2336 -0
  442. package/js/src/src/coincatch.d.ts +786 -0
  443. package/js/src/src/coincatch.js +5492 -0
  444. package/js/src/src/coincheck.d.ts +147 -0
  445. package/js/src/src/coincheck.js +962 -0
  446. package/js/src/src/coinex.d.ts +719 -0
  447. package/js/src/src/coinex.js +6166 -0
  448. package/js/src/src/coinmate.d.ts +202 -0
  449. package/js/src/src/coinmate.js +1215 -0
  450. package/js/src/src/coinmetro.d.ts +244 -0
  451. package/js/src/src/coinmetro.js +2024 -0
  452. package/js/src/src/coinone.d.ts +158 -0
  453. package/js/src/src/coinone.js +1278 -0
  454. package/js/src/src/coinsph.d.ts +310 -0
  455. package/js/src/src/coinsph.js +2203 -0
  456. package/js/src/src/coinspot.d.ts +108 -0
  457. package/js/src/src/coinspot.js +653 -0
  458. package/js/src/src/cryptocom.d.ts +463 -0
  459. package/js/src/src/cryptocom.js +3549 -0
  460. package/js/src/src/cryptomus.d.ts +158 -0
  461. package/js/src/src/cryptomus.js +1169 -0
  462. package/js/src/src/defx.d.ts +348 -0
  463. package/js/src/src/defx.js +2139 -0
  464. package/js/src/src/delta.d.ts +407 -0
  465. package/js/src/src/delta.js +3654 -0
  466. package/js/src/src/deribit.d.ts +516 -0
  467. package/js/src/src/deribit.js +3790 -0
  468. package/js/src/src/derive.d.ts +324 -0
  469. package/js/src/src/derive.js +2655 -0
  470. package/js/src/src/digifinex.d.ts +544 -0
  471. package/js/src/src/digifinex.js +4453 -0
  472. package/js/src/src/ellipx.d.ts +237 -0
  473. package/js/src/src/ellipx.js +2071 -0
  474. package/js/src/src/eterex.d.ts +21 -0
  475. package/js/src/src/eterex.js +299 -0
  476. package/js/src/src/excoino.d.ts +23 -0
  477. package/js/src/src/excoino.js +426 -0
  478. package/js/src/src/exir.d.ts +23 -0
  479. package/js/src/src/exir.js +403 -0
  480. package/js/src/src/exmo.d.ts +426 -0
  481. package/js/src/src/exmo.js +2825 -0
  482. package/js/src/src/exnovin.d.ts +22 -0
  483. package/js/src/src/exnovin.js +378 -0
  484. package/js/src/src/farhadexchange.d.ts +21 -0
  485. package/js/src/src/farhadexchange.js +280 -0
  486. package/js/src/src/fmfwio.d.ts +4 -0
  487. package/js/src/src/fmfwio.js +35 -0
  488. package/js/src/src/foxbit.d.ts +352 -0
  489. package/js/src/src/foxbit.js +2016 -0
  490. package/js/src/src/gate.d.ts +1071 -0
  491. package/js/src/src/gate.js +8282 -0
  492. package/js/src/src/gateio.d.ts +4 -0
  493. package/js/src/src/gateio.js +17 -0
  494. package/js/src/src/gemini.d.ts +257 -0
  495. package/js/src/src/gemini.js +2006 -0
  496. package/js/src/src/hamtapay.d.ts +21 -0
  497. package/js/src/src/hamtapay.js +303 -0
  498. package/js/src/src/hashkey.d.ts +628 -0
  499. package/js/src/src/hashkey.js +4363 -0
  500. package/js/src/src/hibachi.d.ts +346 -0
  501. package/js/src/src/hibachi.js +2137 -0
  502. package/js/src/src/hitbtc.d.ts +558 -0
  503. package/js/src/src/hitbtc.js +3847 -0
  504. package/js/src/src/hitobit.d.ts +23 -0
  505. package/js/src/src/hitobit.js +412 -0
  506. package/js/src/src/hollaex.d.ts +305 -0
  507. package/js/src/src/hollaex.js +2046 -0
  508. package/js/src/src/htx.d.ts +961 -0
  509. package/js/src/src/htx.js +9668 -0
  510. package/js/src/src/huobi.d.ts +4 -0
  511. package/js/src/src/huobi.js +17 -0
  512. package/js/src/src/hyperliquid.d.ts +651 -0
  513. package/js/src/src/hyperliquid.js +3937 -0
  514. package/js/src/src/independentreserve.d.ts +169 -0
  515. package/js/src/src/independentreserve.js +1115 -0
  516. package/js/src/src/indodax.d.ts +217 -0
  517. package/js/src/src/indodax.js +1454 -0
  518. package/js/src/src/iranexchange.d.ts +21 -0
  519. package/js/src/src/iranexchange.js +399 -0
  520. package/js/src/src/jibitex.d.ts +23 -0
  521. package/js/src/src/jibitex.js +416 -0
  522. package/js/src/src/kcex.d.ts +21 -0
  523. package/js/src/src/kcex.js +335 -0
  524. package/js/src/src/kifpoolme.d.ts +23 -0
  525. package/js/src/src/kifpoolme.js +410 -0
  526. package/js/src/src/kraken.d.ts +484 -0
  527. package/js/src/src/kraken.js +3518 -0
  528. package/js/src/src/krakenfutures.d.ts +362 -0
  529. package/js/src/src/krakenfutures.js +2885 -0
  530. package/js/src/src/kucoin.d.ts +759 -0
  531. package/js/src/src/kucoin.js +5153 -0
  532. package/js/src/src/kucoinfutures.d.ts +521 -0
  533. package/js/src/src/kucoinfutures.js +3381 -0
  534. package/js/src/src/latoken.d.ts +274 -0
  535. package/js/src/src/latoken.js +1824 -0
  536. package/js/src/src/lbank.d.ts +350 -0
  537. package/js/src/src/lbank.js +3146 -0
  538. package/js/src/src/luno.d.ts +252 -0
  539. package/js/src/src/luno.js +1479 -0
  540. package/js/src/src/mazdax.d.ts +23 -0
  541. package/js/src/src/mazdax.js +534 -0
  542. package/js/src/src/mercado.d.ts +160 -0
  543. package/js/src/src/mercado.js +1011 -0
  544. package/js/src/src/mexc.d.ts +768 -0
  545. package/js/src/src/mexc.js +6102 -0
  546. package/js/src/src/modetrade.d.ts +496 -0
  547. package/js/src/src/modetrade.js +2936 -0
  548. package/js/src/src/myokx.d.ts +4 -0
  549. package/js/src/src/myokx.js +54 -0
  550. package/js/src/src/ndax.d.ts +285 -0
  551. package/js/src/src/ndax.js +2598 -0
  552. package/js/src/src/nobitex.d.ts +23 -0
  553. package/js/src/src/nobitex.js +454 -0
  554. package/js/src/src/novadax.d.ts +279 -0
  555. package/js/src/src/novadax.js +1676 -0
  556. package/js/src/src/oceanex.d.ts +231 -0
  557. package/js/src/src/oceanex.js +1123 -0
  558. package/js/src/src/okcoin.d.ts +346 -0
  559. package/js/src/src/okcoin.js +3211 -0
  560. package/js/src/src/okexchange.d.ts +23 -0
  561. package/js/src/src/okexchange.js +373 -0
  562. package/js/src/src/okx.d.ts +1125 -0
  563. package/js/src/src/okx.js +9009 -0
  564. package/js/src/src/okxus.d.ts +4 -0
  565. package/js/src/src/okxus.js +54 -0
  566. package/js/src/src/ompfinex.d.ts +23 -0
  567. package/js/src/src/ompfinex.js +510 -0
  568. package/js/src/src/onetrading.d.ts +228 -0
  569. package/js/src/src/onetrading.js +1769 -0
  570. package/js/src/src/oxfun.d.ts +442 -0
  571. package/js/src/src/oxfun.js +2920 -0
  572. package/js/src/src/p2b.d.ts +189 -0
  573. package/js/src/src/p2b.js +1344 -0
  574. package/js/src/src/paradex.d.ts +389 -0
  575. package/js/src/src/paradex.js +2607 -0
  576. package/js/src/src/paymium.d.ts +133 -0
  577. package/js/src/src/paymium.js +644 -0
  578. package/js/src/src/phemex.d.ts +497 -0
  579. package/js/src/src/phemex.js +5333 -0
  580. package/js/src/src/pingi.d.ts +22 -0
  581. package/js/src/src/pingi.js +446 -0
  582. package/js/src/src/poloniex.d.ts +441 -0
  583. package/js/src/src/poloniex.js +3681 -0
  584. package/js/src/src/pooleno.d.ts +21 -0
  585. package/js/src/src/pooleno.js +347 -0
  586. package/js/src/src/pro/alpaca.d.ts +95 -0
  587. package/js/src/src/pro/alpaca.js +724 -0
  588. package/js/src/src/pro/apex.d.ts +160 -0
  589. package/js/src/src/pro/apex.js +1044 -0
  590. package/js/src/src/pro/ascendex.d.ts +99 -0
  591. package/js/src/src/pro/ascendex.js +1012 -0
  592. package/js/src/src/pro/bequant.d.ts +4 -0
  593. package/js/src/src/pro/bequant.js +42 -0
  594. package/js/src/src/pro/binance.d.ts +796 -0
  595. package/js/src/src/pro/binance.js +4373 -0
  596. package/js/src/src/pro/binancecoinm.d.ts +4 -0
  597. package/js/src/src/pro/binancecoinm.js +32 -0
  598. package/js/src/src/pro/binanceus.d.ts +4 -0
  599. package/js/src/src/pro/binanceus.js +52 -0
  600. package/js/src/src/pro/binanceusdm.d.ts +4 -0
  601. package/js/src/src/pro/binanceusdm.js +37 -0
  602. package/js/src/src/pro/bingx.d.ts +151 -0
  603. package/js/src/src/pro/bingx.js +1568 -0
  604. package/js/src/src/pro/bitfinex.d.ts +99 -0
  605. package/js/src/src/pro/bitfinex.js +1165 -0
  606. package/js/src/src/pro/bitget.d.ts +257 -0
  607. package/js/src/src/pro/bitget.js +2327 -0
  608. package/js/src/src/pro/bithumb.d.ts +59 -0
  609. package/js/src/src/pro/bithumb.js +395 -0
  610. package/js/src/src/pro/bitmart.d.ts +168 -0
  611. package/js/src/src/pro/bitmart.js +1686 -0
  612. package/js/src/src/pro/bitmex.d.ts +170 -0
  613. package/js/src/src/pro/bitmex.js +1760 -0
  614. package/js/src/src/pro/bitopro.d.ts +69 -0
  615. package/js/src/src/pro/bitopro.js +477 -0
  616. package/js/src/src/pro/bitrue.d.ts +40 -0
  617. package/js/src/src/pro/bitrue.js +461 -0
  618. package/js/src/src/pro/bitstamp.d.ts +53 -0
  619. package/js/src/src/pro/bitstamp.js +587 -0
  620. package/js/src/src/pro/bittrade.d.ts +66 -0
  621. package/js/src/src/pro/bittrade.js +606 -0
  622. package/js/src/src/pro/bitvavo.d.ts +321 -0
  623. package/js/src/src/pro/bitvavo.js +1451 -0
  624. package/js/src/src/pro/blockchaincom.d.ts +89 -0
  625. package/js/src/src/pro/blockchaincom.js +777 -0
  626. package/js/src/src/pro/blofin.d.ts +174 -0
  627. package/js/src/src/pro/blofin.js +743 -0
  628. package/js/src/src/pro/bybit.d.ts +397 -0
  629. package/js/src/src/pro/bybit.js +2519 -0
  630. package/js/src/src/pro/cex.d.ts +220 -0
  631. package/js/src/src/pro/cex.js +1535 -0
  632. package/js/src/src/pro/coinbase.d.ts +119 -0
  633. package/js/src/src/pro/coinbase.js +736 -0
  634. package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
  635. package/js/src/src/pro/coinbaseadvanced.js +18 -0
  636. package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
  637. package/js/src/src/pro/coinbaseexchange.js +969 -0
  638. package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
  639. package/js/src/src/pro/coinbaseinternational.js +804 -0
  640. package/js/src/src/pro/coincatch.d.ts +207 -0
  641. package/js/src/src/pro/coincatch.js +1562 -0
  642. package/js/src/src/pro/coincheck.d.ts +33 -0
  643. package/js/src/src/pro/coincheck.js +210 -0
  644. package/js/src/src/pro/coinex.d.ts +147 -0
  645. package/js/src/src/pro/coinex.js +1426 -0
  646. package/js/src/src/pro/coinone.d.ts +51 -0
  647. package/js/src/src/pro/coinone.js +413 -0
  648. package/js/src/src/pro/cryptocom.d.ts +300 -0
  649. package/js/src/src/pro/cryptocom.js +1414 -0
  650. package/js/src/src/pro/defx.d.ts +236 -0
  651. package/js/src/src/pro/defx.js +865 -0
  652. package/js/src/src/pro/deribit.d.ts +163 -0
  653. package/js/src/src/pro/deribit.js +1066 -0
  654. package/js/src/src/pro/derive.d.ts +100 -0
  655. package/js/src/src/pro/derive.js +753 -0
  656. package/js/src/src/pro/exmo.d.ts +97 -0
  657. package/js/src/src/pro/exmo.js +903 -0
  658. package/js/src/src/pro/gate.d.ts +360 -0
  659. package/js/src/src/pro/gate.js +2119 -0
  660. package/js/src/src/pro/gateio.d.ts +4 -0
  661. package/js/src/src/pro/gateio.js +17 -0
  662. package/js/src/src/pro/gemini.d.ts +106 -0
  663. package/js/src/src/pro/gemini.js +932 -0
  664. package/js/src/src/pro/hashkey.d.ts +121 -0
  665. package/js/src/src/pro/hashkey.js +843 -0
  666. package/js/src/src/pro/hitbtc.d.ts +235 -0
  667. package/js/src/src/pro/hitbtc.js +1400 -0
  668. package/js/src/src/pro/hollaex.d.ts +77 -0
  669. package/js/src/src/pro/hollaex.js +604 -0
  670. package/js/src/src/pro/htx.d.ts +141 -0
  671. package/js/src/src/pro/htx.js +2415 -0
  672. package/js/src/src/pro/huobi.d.ts +4 -0
  673. package/js/src/src/pro/huobi.js +17 -0
  674. package/js/src/src/pro/hyperliquid.d.ts +218 -0
  675. package/js/src/src/pro/hyperliquid.js +1126 -0
  676. package/js/src/src/pro/independentreserve.d.ts +36 -0
  677. package/js/src/src/pro/independentreserve.js +287 -0
  678. package/js/src/src/pro/kraken.d.ts +233 -0
  679. package/js/src/src/pro/kraken.js +1785 -0
  680. package/js/src/src/pro/krakenfutures.d.ts +178 -0
  681. package/js/src/src/pro/krakenfutures.js +1592 -0
  682. package/js/src/src/pro/kucoin.d.ts +221 -0
  683. package/js/src/src/pro/kucoin.js +1430 -0
  684. package/js/src/src/pro/kucoinfutures.d.ts +205 -0
  685. package/js/src/src/pro/kucoinfutures.js +1295 -0
  686. package/js/src/src/pro/lbank.d.ts +134 -0
  687. package/js/src/src/pro/lbank.js +950 -0
  688. package/js/src/src/pro/luno.d.ts +44 -0
  689. package/js/src/src/pro/luno.js +322 -0
  690. package/js/src/src/pro/mexc.d.ts +210 -0
  691. package/js/src/src/pro/mexc.js +2009 -0
  692. package/js/src/src/pro/modetrade.d.ts +155 -0
  693. package/js/src/src/pro/modetrade.js +1335 -0
  694. package/js/src/src/pro/myokx.d.ts +4 -0
  695. package/js/src/src/pro/myokx.js +39 -0
  696. package/js/src/src/pro/ndax.d.ts +60 -0
  697. package/js/src/src/pro/ndax.js +545 -0
  698. package/js/src/src/pro/okcoin.d.ts +91 -0
  699. package/js/src/src/pro/okcoin.js +763 -0
  700. package/js/src/src/pro/okx.d.ts +408 -0
  701. package/js/src/src/pro/okx.js +2479 -0
  702. package/js/src/src/pro/okxus.d.ts +4 -0
  703. package/js/src/src/pro/okxus.js +39 -0
  704. package/js/src/src/pro/onetrading.d.ts +107 -0
  705. package/js/src/src/pro/onetrading.js +1343 -0
  706. package/js/src/src/pro/oxfun.d.ts +234 -0
  707. package/js/src/src/pro/oxfun.js +1112 -0
  708. package/js/src/src/pro/p2b.d.ts +104 -0
  709. package/js/src/src/pro/p2b.js +506 -0
  710. package/js/src/src/pro/paradex.d.ts +54 -0
  711. package/js/src/src/pro/paradex.js +370 -0
  712. package/js/src/src/pro/phemex.d.ts +129 -0
  713. package/js/src/src/pro/phemex.js +1569 -0
  714. package/js/src/src/pro/poloniex.d.ts +214 -0
  715. package/js/src/src/pro/poloniex.js +1318 -0
  716. package/js/src/src/pro/probit.d.ts +91 -0
  717. package/js/src/src/pro/probit.js +593 -0
  718. package/js/src/src/pro/tradeogre.d.ts +49 -0
  719. package/js/src/src/pro/tradeogre.js +284 -0
  720. package/js/src/src/pro/upbit.d.ts +124 -0
  721. package/js/src/src/pro/upbit.js +689 -0
  722. package/js/src/src/pro/vertex.d.ts +104 -0
  723. package/js/src/src/pro/vertex.js +999 -0
  724. package/js/src/src/pro/whitebit.d.ts +123 -0
  725. package/js/src/src/pro/whitebit.js +971 -0
  726. package/js/src/src/pro/woo.d.ts +161 -0
  727. package/js/src/src/pro/woo.js +1351 -0
  728. package/js/src/src/pro/woofipro.d.ts +155 -0
  729. package/js/src/src/pro/woofipro.js +1335 -0
  730. package/js/src/src/pro/xt.d.ts +165 -0
  731. package/js/src/src/pro/xt.js +1230 -0
  732. package/js/src/src/probit.d.ts +283 -0
  733. package/js/src/src/probit.js +1935 -0
  734. package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
  735. package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
  736. package/js/src/src/raastin.d.ts +24 -0
  737. package/js/src/src/raastin.js +494 -0
  738. package/js/src/src/ramzinex.d.ts +23 -0
  739. package/js/src/src/ramzinex.js +510 -0
  740. package/js/src/src/sarmayex.d.ts +21 -0
  741. package/js/src/src/sarmayex.js +376 -0
  742. package/js/src/src/sarrafex.d.ts +23 -0
  743. package/js/src/src/sarrafex.js +501 -0
  744. package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
  745. package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
  746. package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
  747. package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
  748. package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
  749. package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
  750. package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
  751. package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
  752. package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
  753. package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
  754. package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
  755. package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
  756. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
  757. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
  758. package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
  759. package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
  760. package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
  761. package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
  762. package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
  763. package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
  764. package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
  765. package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
  766. package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
  767. package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
  768. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
  769. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
  770. package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
  771. package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
  772. package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
  773. package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
  774. package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
  775. package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
  776. package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
  777. package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
  778. package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
  779. package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
  780. package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
  781. package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
  782. package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
  783. package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
  784. package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
  785. package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
  786. package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
  787. package/js/src/src/static_dependencies/ethers/index.js +22 -0
  788. package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
  789. package/js/src/src/static_dependencies/ethers/interface.js +990 -0
  790. package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
  791. package/js/src/src/static_dependencies/ethers/typed.js +608 -0
  792. package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
  793. package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
  794. package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
  795. package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
  796. package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
  797. package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
  798. package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
  799. package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
  800. package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
  801. package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
  802. package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
  803. package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
  804. package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
  805. package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
  806. package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
  807. package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
  808. package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
  809. package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
  810. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
  811. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
  812. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
  813. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
  814. package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
  815. package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
  816. package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
  817. package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
  818. package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
  819. package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
  820. package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
  821. package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
  822. package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
  823. package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
  824. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
  825. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
  826. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
  827. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
  828. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
  829. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
  830. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
  831. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
  832. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
  833. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
  834. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
  835. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
  836. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
  837. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
  838. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
  839. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
  840. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
  841. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
  842. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
  843. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
  844. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
  845. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
  846. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
  847. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
  848. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
  849. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
  850. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
  851. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
  852. package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
  853. package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
  854. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
  855. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
  856. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
  857. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
  858. package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
  859. package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
  860. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
  861. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
  862. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
  863. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
  864. package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
  865. package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
  866. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
  867. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
  868. package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
  869. package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
  870. package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
  871. package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
  872. package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
  873. package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
  874. package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
  875. package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
  876. package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
  877. package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
  878. package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
  879. package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
  880. package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
  881. package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
  882. package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
  883. package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
  884. package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
  885. package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
  886. package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
  887. package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
  888. package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
  889. package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
  890. package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
  891. package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
  892. package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
  893. package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
  894. package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
  895. package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
  896. package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
  897. package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
  898. package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
  899. package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
  900. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
  901. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
  902. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
  903. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
  904. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
  905. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
  906. package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
  907. package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
  908. package/js/src/src/static_dependencies/qs/index.cjs +15 -0
  909. package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
  910. package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
  911. package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
  912. package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
  913. package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
  914. package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
  915. package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
  916. package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
  917. package/js/src/src/static_dependencies/scure-base/index.js +420 -0
  918. package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  919. package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
  920. package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
  921. package/js/src/src/static_dependencies/starknet/constants.js +67 -0
  922. package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
  923. package/js/src/src/static_dependencies/starknet/index.js +9 -0
  924. package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  925. package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  926. package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  927. package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
  928. package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
  929. package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
  930. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  931. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  932. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  933. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  934. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  935. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  936. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  937. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  938. package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  939. package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
  940. package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  941. package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
  942. package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  943. package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
  944. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  945. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  946. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  947. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  948. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  949. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  950. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  951. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  952. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  953. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  954. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  955. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  956. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  957. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  958. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  959. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  960. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  961. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  962. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  963. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  964. package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  965. package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  966. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  967. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  968. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  969. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  970. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  971. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  972. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  973. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  974. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  975. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  976. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  977. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  978. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  979. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  980. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  981. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  982. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  983. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  984. package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  985. package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
  986. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  987. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
  988. package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  989. package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  990. package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  991. package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
  992. package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  993. package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
  994. package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  995. package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
  996. package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  997. package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
  998. package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  999. package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
  1000. package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
  1001. package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
  1002. package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
  1003. package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
  1004. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
  1005. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
  1006. package/js/src/src/tabdeal.d.ts +23 -0
  1007. package/js/src/src/tabdeal.js +387 -0
  1008. package/js/src/src/tehran_exchange.d.ts +21 -0
  1009. package/js/src/src/tehran_exchange.js +333 -0
  1010. package/js/src/src/tetherland.d.ts +21 -0
  1011. package/js/src/src/tetherland.js +367 -0
  1012. package/js/src/src/timex.d.ts +247 -0
  1013. package/js/src/src/timex.js +1792 -0
  1014. package/js/src/src/tokocrypto.d.ts +261 -0
  1015. package/js/src/src/tokocrypto.js +2641 -0
  1016. package/js/src/src/toobit.d.ts +22 -0
  1017. package/js/src/src/toobit.js +445 -0
  1018. package/js/src/src/tradeogre.d.ts +149 -0
  1019. package/js/src/src/tradeogre.js +878 -0
  1020. package/js/src/src/twox.d.ts +21 -0
  1021. package/js/src/src/twox.js +371 -0
  1022. package/js/src/src/ubitex.d.ts +23 -0
  1023. package/js/src/src/ubitex.js +433 -0
  1024. package/js/src/src/upbit.d.ts +377 -0
  1025. package/js/src/src/upbit.js +2340 -0
  1026. package/js/src/src/vertex.d.ts +346 -0
  1027. package/js/src/src/vertex.js +3146 -0
  1028. package/js/src/src/wallex.d.ts +23 -0
  1029. package/js/src/src/wallex.js +467 -0
  1030. package/js/src/src/wavesexchange.d.ts +244 -0
  1031. package/js/src/src/wavesexchange.js +2747 -0
  1032. package/js/src/src/whitebit.d.ts +571 -0
  1033. package/js/src/src/whitebit.js +3437 -0
  1034. package/js/src/src/woo.d.ts +727 -0
  1035. package/js/src/src/woo.js +4183 -0
  1036. package/js/src/src/woofipro.d.ts +497 -0
  1037. package/js/src/src/woofipro.js +2941 -0
  1038. package/js/src/src/xt.d.ts +568 -0
  1039. package/js/src/src/xt.js +5184 -0
  1040. package/js/src/src/yobit.d.ts +197 -0
  1041. package/js/src/src/yobit.js +1453 -0
  1042. package/js/src/src/zaif.d.ts +136 -0
  1043. package/js/src/src/zaif.js +821 -0
  1044. package/js/src/src/zonda.d.ts +214 -0
  1045. package/js/src/src/zonda.js +1984 -0
  1046. package/js/test.js +3 -3
  1047. package/package.json +1 -1
@@ -0,0 +1,3937 @@
1
+ // ----------------------------------------------------------------------------
2
+
3
+ // PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ // https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+ // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
+
7
+ // ---------------------------------------------------------------------------
8
+ import Exchange from './abstract/hyperliquid.js';
9
+ import { ExchangeError, ArgumentsRequired, NotSupported, InvalidOrder, OrderNotFound, BadRequest, InsufficientFunds } from './base/errors.js';
10
+ import { Precise } from './base/Precise.js';
11
+ import { ROUND, SIGNIFICANT_DIGITS, DECIMAL_PLACES, TICK_SIZE } from './base/functions/number.js';
12
+ import { keccak_256 as keccak } from './static_dependencies/noble-hashes/sha3.js';
13
+ import { secp256k1 } from './static_dependencies/noble-curves/secp256k1.js';
14
+ import { ecdsa } from './base/functions/crypto.js';
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * @class hyperliquid
18
+ * @augments Exchange
19
+ */
20
+ export default class hyperliquid extends Exchange {
21
+ describe() {
22
+ return this.deepExtend(super.describe(), {
23
+ 'id': 'hyperliquid',
24
+ 'name': 'Hyperliquid',
25
+ 'countries': [],
26
+ 'version': 'v1',
27
+ 'rateLimit': 50,
28
+ 'certified': true,
29
+ 'pro': true,
30
+ 'dex': true,
31
+ 'has': {
32
+ 'CORS': undefined,
33
+ 'spot': true,
34
+ 'margin': false,
35
+ 'swap': true,
36
+ 'future': true,
37
+ 'option': false,
38
+ 'addMargin': true,
39
+ 'borrowCrossMargin': false,
40
+ 'borrowIsolatedMargin': false,
41
+ 'cancelAllOrders': false,
42
+ 'cancelAllOrdersAfter': true,
43
+ 'cancelOrder': true,
44
+ 'cancelOrders': true,
45
+ 'cancelOrdersForSymbols': true,
46
+ 'closeAllPositions': false,
47
+ 'closePosition': false,
48
+ 'createMarketBuyOrderWithCost': false,
49
+ 'createMarketOrderWithCost': false,
50
+ 'createMarketSellOrderWithCost': false,
51
+ 'createOrder': true,
52
+ 'createOrders': true,
53
+ 'createOrderWithTakeProfitAndStopLoss': true,
54
+ 'createReduceOnlyOrder': true,
55
+ 'createStopOrder': true,
56
+ 'createTriggerOrder': true,
57
+ 'editOrder': true,
58
+ 'editOrders': true,
59
+ 'fetchAccounts': false,
60
+ 'fetchBalance': true,
61
+ 'fetchBorrowInterest': false,
62
+ 'fetchBorrowRateHistories': false,
63
+ 'fetchBorrowRateHistory': false,
64
+ 'fetchCanceledAndClosedOrders': true,
65
+ 'fetchCanceledOrders': true,
66
+ 'fetchClosedOrders': true,
67
+ 'fetchCrossBorrowRate': false,
68
+ 'fetchCrossBorrowRates': false,
69
+ 'fetchCurrencies': true,
70
+ 'fetchDepositAddress': false,
71
+ 'fetchDepositAddresses': false,
72
+ 'fetchDeposits': true,
73
+ 'fetchDepositWithdrawFee': 'emulated',
74
+ 'fetchDepositWithdrawFees': false,
75
+ 'fetchFundingHistory': true,
76
+ 'fetchFundingRate': false,
77
+ 'fetchFundingRateHistory': true,
78
+ 'fetchFundingRates': true,
79
+ 'fetchIndexOHLCV': false,
80
+ 'fetchIsolatedBorrowRate': false,
81
+ 'fetchIsolatedBorrowRates': false,
82
+ 'fetchLedger': true,
83
+ 'fetchLeverage': false,
84
+ 'fetchLeverageTiers': false,
85
+ 'fetchLiquidations': false,
86
+ 'fetchMarginMode': undefined,
87
+ 'fetchMarketLeverageTiers': false,
88
+ 'fetchMarkets': true,
89
+ 'fetchMarkOHLCV': false,
90
+ 'fetchMyLiquidations': false,
91
+ 'fetchMyTrades': true,
92
+ 'fetchOHLCV': true,
93
+ 'fetchOpenInterest': true,
94
+ 'fetchOpenInterestHistory': false,
95
+ 'fetchOpenInterests': true,
96
+ 'fetchOpenOrders': true,
97
+ 'fetchOrder': true,
98
+ 'fetchOrderBook': true,
99
+ 'fetchOrders': true,
100
+ 'fetchOrderTrades': false,
101
+ 'fetchPosition': true,
102
+ 'fetchPositionMode': false,
103
+ 'fetchPositions': true,
104
+ 'fetchPositionsRisk': false,
105
+ 'fetchPremiumIndexOHLCV': false,
106
+ 'fetchTicker': 'emulated',
107
+ 'fetchTickers': true,
108
+ 'fetchTime': false,
109
+ 'fetchTrades': true,
110
+ 'fetchTradingFee': true,
111
+ 'fetchTradingFees': false,
112
+ 'fetchTransfer': false,
113
+ 'fetchTransfers': false,
114
+ 'fetchWithdrawal': false,
115
+ 'fetchWithdrawals': true,
116
+ 'reduceMargin': true,
117
+ 'repayCrossMargin': false,
118
+ 'repayIsolatedMargin': false,
119
+ 'sandbox': true,
120
+ 'setLeverage': true,
121
+ 'setMarginMode': true,
122
+ 'setPositionMode': false,
123
+ 'transfer': true,
124
+ 'withdraw': true,
125
+ },
126
+ 'timeframes': {
127
+ '1m': '1m',
128
+ '3m': '3m',
129
+ '5m': '5m',
130
+ '15m': '15m',
131
+ '30m': '30m',
132
+ '1h': '1h',
133
+ '2h': '2h',
134
+ '4h': '4h',
135
+ '8h': '8h',
136
+ '12h': '12h',
137
+ '1d': '1d',
138
+ '3d': '3d',
139
+ '1w': '1w',
140
+ '1M': '1M',
141
+ },
142
+ 'hostname': 'hyperliquid.xyz',
143
+ 'urls': {
144
+ 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/b371bc6c-4a8c-489f-87f4-20a913dd8d4b',
145
+ 'api': {
146
+ 'public': 'https://api.{hostname}',
147
+ 'private': 'https://api.{hostname}',
148
+ },
149
+ 'test': {
150
+ 'public': 'https://api.hyperliquid-testnet.xyz',
151
+ 'private': 'https://api.hyperliquid-testnet.xyz',
152
+ },
153
+ 'www': 'https://hyperliquid.xyz',
154
+ 'doc': 'https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api',
155
+ 'fees': 'https://hyperliquid.gitbook.io/hyperliquid-docs/trading/fees',
156
+ 'referral': 'https://app.hyperliquid.xyz/',
157
+ },
158
+ 'api': {
159
+ 'public': {
160
+ 'post': {
161
+ 'info': {
162
+ 'cost': 20,
163
+ 'byType': {
164
+ 'l2Book': 2,
165
+ 'allMids': 2,
166
+ 'clearinghouseState': 2,
167
+ 'orderStatus': 2,
168
+ 'spotClearinghouseState': 2,
169
+ 'exchangeStatus': 2,
170
+ 'candleSnapshot': 4,
171
+ },
172
+ },
173
+ },
174
+ },
175
+ 'private': {
176
+ 'post': {
177
+ 'exchange': 1,
178
+ },
179
+ },
180
+ },
181
+ 'fees': {
182
+ 'swap': {
183
+ 'taker': this.parseNumber('0.00045'),
184
+ 'maker': this.parseNumber('0.00015'),
185
+ },
186
+ 'spot': {
187
+ 'taker': this.parseNumber('0.0007'),
188
+ 'maker': this.parseNumber('0.0004'),
189
+ },
190
+ },
191
+ 'requiredCredentials': {
192
+ 'apiKey': false,
193
+ 'secret': false,
194
+ 'walletAddress': true,
195
+ 'privateKey': true,
196
+ },
197
+ 'exceptions': {
198
+ 'exact': {},
199
+ 'broad': {
200
+ 'Price must be divisible by tick size.': InvalidOrder,
201
+ 'Order must have minimum value of $10': InvalidOrder,
202
+ 'Insufficient margin to place order.': InsufficientFunds,
203
+ 'Reduce only order would increase position.': InvalidOrder,
204
+ 'Post only order would have immediately matched,': InvalidOrder,
205
+ 'Order could not immediately match against any resting orders.': InvalidOrder,
206
+ 'Invalid TP/SL price.': InvalidOrder,
207
+ 'No liquidity available for market order.': InvalidOrder,
208
+ 'Order was never placed, already canceled, or filled.': OrderNotFound,
209
+ 'User or API Wallet ': InvalidOrder,
210
+ 'Order has invalid size': InvalidOrder,
211
+ 'Order price cannot be more than 80% away from the reference price': InvalidOrder,
212
+ 'Order has zero size.': InvalidOrder,
213
+ 'Insufficient spot balance asset': InsufficientFunds,
214
+ 'Insufficient balance for withdrawal': InsufficientFunds,
215
+ 'Insufficient balance for token transfer': InsufficientFunds,
216
+ },
217
+ },
218
+ 'precisionMode': TICK_SIZE,
219
+ 'commonCurrencies': {},
220
+ 'options': {
221
+ 'defaultType': 'swap',
222
+ 'sandboxMode': false,
223
+ 'defaultSlippage': 0.05,
224
+ 'zeroAddress': '0x0000000000000000000000000000000000000000',
225
+ },
226
+ 'features': {
227
+ 'default': {
228
+ 'sandbox': true,
229
+ 'createOrder': {
230
+ 'marginMode': false,
231
+ 'triggerPrice': false,
232
+ 'triggerPriceType': undefined,
233
+ 'triggerDirection': false,
234
+ 'stopLossPrice': false,
235
+ 'takeProfitPrice': false,
236
+ 'attachedStopLossTakeProfit': {
237
+ 'triggerPriceType': {
238
+ 'last': false,
239
+ 'mark': false,
240
+ 'index': false,
241
+ },
242
+ 'triggerPrice': true,
243
+ 'type': true,
244
+ 'price': true,
245
+ },
246
+ 'timeInForce': {
247
+ 'IOC': true,
248
+ 'FOK': false,
249
+ 'PO': true,
250
+ 'GTD': false,
251
+ },
252
+ 'hedged': false,
253
+ 'trailing': false,
254
+ 'leverage': false,
255
+ 'marketBuyByCost': false,
256
+ 'marketBuyRequiresPrice': false,
257
+ 'selfTradePrevention': false,
258
+ 'iceberg': false,
259
+ },
260
+ 'createOrders': {
261
+ 'max': 1000,
262
+ },
263
+ 'fetchMyTrades': {
264
+ 'marginMode': false,
265
+ 'limit': 2000,
266
+ 'daysBack': undefined,
267
+ 'untilDays': undefined,
268
+ 'symbolRequired': true,
269
+ },
270
+ 'fetchOrder': {
271
+ 'marginMode': false,
272
+ 'trigger': false,
273
+ 'trailing': false,
274
+ 'symbolRequired': true,
275
+ },
276
+ 'fetchOpenOrders': {
277
+ 'marginMode': false,
278
+ 'limit': 2000,
279
+ 'trigger': false,
280
+ 'trailing': false,
281
+ 'symbolRequired': true,
282
+ },
283
+ 'fetchOrders': {
284
+ 'marginMode': false,
285
+ 'limit': 2000,
286
+ 'daysBack': undefined,
287
+ 'untilDays': undefined,
288
+ 'trigger': false,
289
+ 'trailing': false,
290
+ 'symbolRequired': true,
291
+ },
292
+ 'fetchClosedOrders': {
293
+ 'marginMode': false,
294
+ 'limit': 2000,
295
+ 'daysBack': undefined,
296
+ 'daysBackCanceled': undefined,
297
+ 'untilDays': undefined,
298
+ 'trigger': false,
299
+ 'trailing': false,
300
+ 'symbolRequired': true,
301
+ },
302
+ 'fetchOHLCV': {
303
+ 'limit': 5000,
304
+ },
305
+ },
306
+ 'spot': {
307
+ 'extends': 'default',
308
+ },
309
+ 'forPerps': {
310
+ 'extends': 'default',
311
+ 'createOrder': {
312
+ 'stopLossPrice': true,
313
+ 'takeProfitPrice': true,
314
+ 'attachedStopLossTakeProfit': undefined, // todo, in two orders
315
+ },
316
+ },
317
+ 'swap': {
318
+ 'linear': {
319
+ 'extends': 'forPerps',
320
+ },
321
+ 'inverse': {
322
+ 'extends': 'forPerps',
323
+ },
324
+ },
325
+ 'future': {
326
+ 'linear': {
327
+ 'extends': 'forPerps',
328
+ },
329
+ 'inverse': {
330
+ 'extends': 'forPerps',
331
+ },
332
+ },
333
+ },
334
+ });
335
+ }
336
+ setSandboxMode(enabled) {
337
+ super.setSandboxMode(enabled);
338
+ this.options['sandboxMode'] = enabled;
339
+ }
340
+ /**
341
+ * @method
342
+ * @name hyperliquid#fetchCurrencies
343
+ * @description fetches all available currencies on an exchange
344
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-metadata
345
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
346
+ * @returns {object} an associative dictionary of currencies
347
+ */
348
+ async fetchCurrencies(params = {}) {
349
+ if (this.checkRequiredCredentials(false)) {
350
+ await this.handleBuilderFeeApproval();
351
+ }
352
+ const request = {
353
+ 'type': 'meta',
354
+ };
355
+ const response = await this.publicPostInfo(this.extend(request, params));
356
+ //
357
+ // [
358
+ // {
359
+ // "universe": [
360
+ // {
361
+ // "maxLeverage": 50,
362
+ // "name": "SOL",
363
+ // "onlyIsolated": false,
364
+ // "szDecimals": 2
365
+ // }
366
+ // ]
367
+ // }
368
+ // ]
369
+ //
370
+ const meta = this.safeList(response, 'universe', []);
371
+ const result = {};
372
+ for (let i = 0; i < meta.length; i++) {
373
+ const data = this.safeDict(meta, i, {});
374
+ const id = i;
375
+ const name = this.safeString(data, 'name');
376
+ const code = this.safeCurrencyCode(name);
377
+ result[code] = this.safeCurrencyStructure({
378
+ 'id': id,
379
+ 'name': name,
380
+ 'code': code,
381
+ 'precision': undefined,
382
+ 'info': data,
383
+ 'active': undefined,
384
+ 'deposit': undefined,
385
+ 'withdraw': undefined,
386
+ 'networks': undefined,
387
+ 'fee': undefined,
388
+ 'type': 'crypto',
389
+ 'limits': {
390
+ 'amount': {
391
+ 'min': undefined,
392
+ 'max': undefined,
393
+ },
394
+ 'withdraw': {
395
+ 'min': undefined,
396
+ 'max': undefined,
397
+ },
398
+ },
399
+ });
400
+ }
401
+ return result;
402
+ }
403
+ /**
404
+ * @method
405
+ * @name hyperliquid#fetchMarkets
406
+ * @description retrieves data on all markets for hyperliquid
407
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc
408
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-asset-contexts
409
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
410
+ * @returns {object[]} an array of objects representing market data
411
+ */
412
+ async fetchMarkets(params = {}) {
413
+ const rawPromises = [
414
+ this.fetchSwapMarkets(params),
415
+ this.fetchSpotMarkets(params),
416
+ ];
417
+ const promises = await Promise.all(rawPromises);
418
+ const swapMarkets = promises[0];
419
+ const spotMarkets = promises[1];
420
+ return this.arrayConcat(swapMarkets, spotMarkets);
421
+ }
422
+ /**
423
+ * @method
424
+ * @name hyperliquid#fetchSwapMarkets
425
+ * @description retrieves data on all swap markets for hyperliquid
426
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc
427
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
428
+ * @returns {object[]} an array of objects representing market data
429
+ */
430
+ async fetchSwapMarkets(params = {}) {
431
+ const request = {
432
+ 'type': 'metaAndAssetCtxs',
433
+ };
434
+ const response = await this.publicPostInfo(this.extend(request, params));
435
+ //
436
+ // [
437
+ // {
438
+ // "universe": [
439
+ // {
440
+ // "maxLeverage": 50,
441
+ // "name": "SOL",
442
+ // "onlyIsolated": false,
443
+ // "szDecimals": 2
444
+ // }
445
+ // ]
446
+ // },
447
+ // [
448
+ // {
449
+ // "dayNtlVlm": "9450588.2273",
450
+ // "funding": "0.0000198",
451
+ // "impactPxs": [
452
+ // "108.04",
453
+ // "108.06"
454
+ // ],
455
+ // "markPx": "108.04",
456
+ // "midPx": "108.05",
457
+ // "openInterest": "10764.48",
458
+ // "oraclePx": "107.99",
459
+ // "premium": "0.00055561",
460
+ // "prevDayPx": "111.81"
461
+ // }
462
+ // ]
463
+ // ]
464
+ //
465
+ //
466
+ const meta = this.safeDict(response, 0, {});
467
+ const universe = this.safeList(meta, 'universe', []);
468
+ const assetCtxs = this.safeList(response, 1, []);
469
+ const result = [];
470
+ for (let i = 0; i < universe.length; i++) {
471
+ const data = this.extend(this.safeDict(universe, i, {}), this.safeDict(assetCtxs, i, {}));
472
+ data['baseId'] = i;
473
+ result.push(data);
474
+ }
475
+ return this.parseMarkets(result);
476
+ }
477
+ /**
478
+ * @method
479
+ * @name hyperliquid#calculatePricePrecision
480
+ * @description Helper function to calculate the Hyperliquid DECIMAL_PLACES price precision
481
+ * @param {float} price the price to use in the calculation
482
+ * @param {int} amountPrecision the amountPrecision to use in the calculation
483
+ * @param {int} maxDecimals the maxDecimals to use in the calculation
484
+ * @returns {int} The calculated price precision
485
+ */
486
+ calculatePricePrecision(price, amountPrecision, maxDecimals) {
487
+ let pricePrecision = 0;
488
+ const priceStr = this.numberToString(price);
489
+ if (priceStr === undefined) {
490
+ return 0;
491
+ }
492
+ const priceSplitted = priceStr.split('.');
493
+ if (Precise.stringEq(priceStr, '0')) {
494
+ // Significant digits is always 5 in this case
495
+ const significantDigits = 5;
496
+ // Integer digits is always 0 in this case (0 doesn't count)
497
+ const integerDigits = 0;
498
+ // Calculate the price precision
499
+ pricePrecision = Math.min(maxDecimals - amountPrecision, significantDigits - integerDigits);
500
+ }
501
+ else if (Precise.stringGt(priceStr, '0') && Precise.stringLt(priceStr, '1')) {
502
+ // Significant digits, always 5 in this case
503
+ const significantDigits = 5;
504
+ // Get the part after the decimal separator
505
+ const decimalPart = this.safeString(priceSplitted, 1, '');
506
+ // Count the number of leading zeros in the decimal part
507
+ let leadingZeros = 0;
508
+ while ((leadingZeros <= decimalPart.length) && (decimalPart[leadingZeros] === '0')) {
509
+ leadingZeros = leadingZeros + 1;
510
+ }
511
+ // Calculate price precision based on leading zeros and significant digits
512
+ pricePrecision = leadingZeros + significantDigits;
513
+ // Calculate the price precision based on maxDecimals - szDecimals and the calculated price precision from the previous step
514
+ pricePrecision = Math.min(maxDecimals - amountPrecision, pricePrecision);
515
+ }
516
+ else {
517
+ // Count the numbers before the decimal separator
518
+ const integerPart = this.safeString(priceSplitted, 0, '');
519
+ // Get significant digits, take the max() of 5 and the integer digits count
520
+ const significantDigits = Math.max(5, integerPart.length);
521
+ // Calculate price precision based on maxDecimals - szDecimals and significantDigits - integerPart.length
522
+ pricePrecision = Math.min(maxDecimals - amountPrecision, significantDigits - integerPart.length);
523
+ }
524
+ return this.parseToInt(pricePrecision);
525
+ }
526
+ /**
527
+ * @method
528
+ * @name hyperliquid#fetchSpotMarkets
529
+ * @description retrieves data on all spot markets for hyperliquid
530
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-asset-contexts
531
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
532
+ * @returns {object[]} an array of objects representing market data
533
+ */
534
+ async fetchSpotMarkets(params = {}) {
535
+ const request = {
536
+ 'type': 'spotMetaAndAssetCtxs',
537
+ };
538
+ const response = await this.publicPostInfo(this.extend(request, params));
539
+ //
540
+ // [
541
+ // {
542
+ // "tokens": [
543
+ // {
544
+ // "name": "USDC",
545
+ // "szDecimals": 8,
546
+ // "weiDecimals" 8,
547
+ // "index": 0,
548
+ // "tokenId": "0x6d1e7cde53ba9467b783cb7c530ce054",
549
+ // "isCanonical": true,
550
+ // "evmContract":null,
551
+ // "fullName":null
552
+ // },
553
+ // {
554
+ // "name": "PURR",
555
+ // "szDecimals": 0,
556
+ // "weiDecimals": 5,
557
+ // "index": 1,
558
+ // "tokenId": "0xc1fb593aeffbeb02f85e0308e9956a90",
559
+ // "isCanonical": true,
560
+ // "evmContract":null,
561
+ // "fullName":null
562
+ // }
563
+ // ],
564
+ // "universe": [
565
+ // {
566
+ // "name": "PURR/USDC",
567
+ // "tokens": [1, 0],
568
+ // "index": 0,
569
+ // "isCanonical": true
570
+ // }
571
+ // ]
572
+ // },
573
+ // [
574
+ // {
575
+ // "dayNtlVlm":"8906.0",
576
+ // "markPx":"0.14",
577
+ // "midPx":"0.209265",
578
+ // "prevDayPx":"0.20432"
579
+ // }
580
+ // ]
581
+ // ]
582
+ //
583
+ const first = this.safeDict(response, 0, {});
584
+ const second = this.safeList(response, 1, []);
585
+ const meta = this.safeList(first, 'universe', []);
586
+ const tokens = this.safeList(first, 'tokens', []);
587
+ const markets = [];
588
+ for (let i = 0; i < meta.length; i++) {
589
+ const market = this.safeDict(meta, i, {});
590
+ const index = this.safeInteger(market, 'index');
591
+ const extraData = this.safeDict(second, index, {});
592
+ const marketName = this.safeString(market, 'name');
593
+ // if (marketName.indexOf ('/') < 0) {
594
+ // // there are some weird spot markets in testnet, eg @2
595
+ // continue;
596
+ // }
597
+ // const marketParts = marketName.split ('/');
598
+ // const baseName = this.safeString (marketParts, 0);
599
+ // const quoteId = this.safeString (marketParts, 1);
600
+ const fees = this.safeDict(this.fees, 'spot', {});
601
+ const taker = this.safeNumber(fees, 'taker');
602
+ const maker = this.safeNumber(fees, 'maker');
603
+ const tokensPos = this.safeList(market, 'tokens', []);
604
+ const baseTokenPos = this.safeInteger(tokensPos, 0);
605
+ const quoteTokenPos = this.safeInteger(tokensPos, 1);
606
+ const baseTokenInfo = this.safeDict(tokens, baseTokenPos, {});
607
+ const quoteTokenInfo = this.safeDict(tokens, quoteTokenPos, {});
608
+ const baseName = this.safeString(baseTokenInfo, 'name');
609
+ const quoteId = this.safeString(quoteTokenInfo, 'name');
610
+ const base = this.safeCurrencyCode(baseName);
611
+ const quote = this.safeCurrencyCode(quoteId);
612
+ const symbol = base + '/' + quote;
613
+ const innerBaseTokenInfo = this.safeDict(baseTokenInfo, 'spec', baseTokenInfo);
614
+ // const innerQuoteTokenInfo = this.safeDict (quoteTokenInfo, 'spec', quoteTokenInfo);
615
+ const amountPrecisionStr = this.safeString(innerBaseTokenInfo, 'szDecimals');
616
+ const amountPrecision = parseInt(amountPrecisionStr);
617
+ const price = this.safeNumber(extraData, 'midPx');
618
+ let pricePrecision = 0;
619
+ if (price !== undefined) {
620
+ pricePrecision = this.calculatePricePrecision(price, amountPrecision, 8);
621
+ }
622
+ const pricePrecisionStr = this.numberToString(pricePrecision);
623
+ // const quotePrecision = this.parseNumber (this.parsePrecision (this.safeString (innerQuoteTokenInfo, 'szDecimals')));
624
+ const baseId = this.numberToString(index + 10000);
625
+ markets.push(this.safeMarketStructure({
626
+ 'id': marketName,
627
+ 'symbol': symbol,
628
+ 'base': base,
629
+ 'quote': quote,
630
+ 'settle': undefined,
631
+ 'baseId': baseId,
632
+ 'baseName': baseName,
633
+ 'quoteId': quoteId,
634
+ 'settleId': undefined,
635
+ 'type': 'spot',
636
+ 'spot': true,
637
+ 'subType': undefined,
638
+ 'margin': undefined,
639
+ 'swap': false,
640
+ 'future': false,
641
+ 'option': false,
642
+ 'active': true,
643
+ 'contract': false,
644
+ 'linear': undefined,
645
+ 'inverse': undefined,
646
+ 'taker': taker,
647
+ 'maker': maker,
648
+ 'contractSize': undefined,
649
+ 'expiry': undefined,
650
+ 'expiryDatetime': undefined,
651
+ 'strike': undefined,
652
+ 'optionType': undefined,
653
+ 'precision': {
654
+ 'amount': this.parseNumber(this.parsePrecision(amountPrecisionStr)),
655
+ 'price': this.parseNumber(this.parsePrecision(pricePrecisionStr)),
656
+ },
657
+ 'limits': {
658
+ 'leverage': {
659
+ 'min': undefined,
660
+ 'max': undefined,
661
+ },
662
+ 'amount': {
663
+ 'min': undefined,
664
+ 'max': undefined,
665
+ },
666
+ 'price': {
667
+ 'min': undefined,
668
+ 'max': undefined,
669
+ },
670
+ 'cost': {
671
+ 'min': this.parseNumber('10'),
672
+ 'max': undefined,
673
+ },
674
+ },
675
+ 'created': undefined,
676
+ 'info': this.extend(extraData, market),
677
+ }));
678
+ }
679
+ return markets;
680
+ }
681
+ parseMarket(market) {
682
+ //
683
+ // {
684
+ // "maxLeverage": "50",
685
+ // "name": "ETH",
686
+ // "onlyIsolated": false,
687
+ // "szDecimals": "4",
688
+ // "dayNtlVlm": "1709813.11535",
689
+ // "funding": "0.00004807",
690
+ // "impactPxs": [
691
+ // "2369.3",
692
+ // "2369.6"
693
+ // ],
694
+ // "markPx": "2369.6",
695
+ // "midPx": "2369.45",
696
+ // "openInterest": "1815.4712",
697
+ // "oraclePx": "2367.3",
698
+ // "premium": "0.00090821",
699
+ // "prevDayPx": "2381.5"
700
+ // }
701
+ //
702
+ const quoteId = 'USDC';
703
+ const baseName = this.safeString(market, 'name');
704
+ const base = this.safeCurrencyCode(baseName);
705
+ const quote = this.safeCurrencyCode(quoteId);
706
+ const baseId = this.safeString(market, 'baseId');
707
+ const settleId = 'USDC';
708
+ const settle = this.safeCurrencyCode(settleId);
709
+ let symbol = base + '/' + quote;
710
+ const contract = true;
711
+ const swap = true;
712
+ if (contract) {
713
+ if (swap) {
714
+ symbol = symbol + ':' + settle;
715
+ }
716
+ }
717
+ const fees = this.safeDict(this.fees, 'swap', {});
718
+ const taker = this.safeNumber(fees, 'taker');
719
+ const maker = this.safeNumber(fees, 'maker');
720
+ const amountPrecisionStr = this.safeString(market, 'szDecimals');
721
+ const amountPrecision = parseInt(amountPrecisionStr);
722
+ const price = this.safeNumber(market, 'markPx', 0);
723
+ let pricePrecision = 0;
724
+ if (price !== undefined) {
725
+ pricePrecision = this.calculatePricePrecision(price, amountPrecision, 6);
726
+ }
727
+ const pricePrecisionStr = this.numberToString(pricePrecision);
728
+ const isDelisted = this.safeBool(market, 'isDelisted');
729
+ let active = true;
730
+ if (isDelisted !== undefined) {
731
+ active = !isDelisted;
732
+ }
733
+ return this.safeMarketStructure({
734
+ 'id': baseId,
735
+ 'symbol': symbol,
736
+ 'base': base,
737
+ 'quote': quote,
738
+ 'settle': settle,
739
+ 'baseId': baseId,
740
+ 'baseName': baseName,
741
+ 'quoteId': quoteId,
742
+ 'settleId': settleId,
743
+ 'type': 'swap',
744
+ 'spot': false,
745
+ 'margin': undefined,
746
+ 'swap': swap,
747
+ 'future': false,
748
+ 'option': false,
749
+ 'active': active,
750
+ 'contract': contract,
751
+ 'linear': true,
752
+ 'inverse': false,
753
+ 'taker': taker,
754
+ 'maker': maker,
755
+ 'contractSize': this.parseNumber('1'),
756
+ 'expiry': undefined,
757
+ 'expiryDatetime': undefined,
758
+ 'strike': undefined,
759
+ 'optionType': undefined,
760
+ 'precision': {
761
+ 'amount': this.parseNumber(this.parsePrecision(amountPrecisionStr)),
762
+ 'price': this.parseNumber(this.parsePrecision(pricePrecisionStr)),
763
+ },
764
+ 'limits': {
765
+ 'leverage': {
766
+ 'min': undefined,
767
+ 'max': this.safeInteger(market, 'maxLeverage'),
768
+ },
769
+ 'amount': {
770
+ 'min': undefined,
771
+ 'max': undefined,
772
+ },
773
+ 'price': {
774
+ 'min': undefined,
775
+ 'max': undefined,
776
+ },
777
+ 'cost': {
778
+ 'min': this.parseNumber('10'),
779
+ 'max': undefined,
780
+ },
781
+ },
782
+ 'created': undefined,
783
+ 'info': market,
784
+ });
785
+ }
786
+ /**
787
+ * @method
788
+ * @name hyperliquid#fetchBalance
789
+ * @description query for balance and get the amount of funds available for trading or funds locked in orders
790
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-a-users-token-balances
791
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary
792
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
793
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
794
+ * @param {string} [params.type] wallet type, ['spot', 'swap'], defaults to swap
795
+ * @param {string} [params.marginMode] 'cross' or 'isolated', for margin trading, uses this.options.defaultMarginMode if not passed, defaults to undefined/None/null
796
+ * @param {string} [params.subAccountAddress] sub account user address
797
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
798
+ */
799
+ async fetchBalance(params = {}) {
800
+ let userAddress = undefined;
801
+ [userAddress, params] = this.handlePublicAddress('fetchBalance', params);
802
+ let type = undefined;
803
+ [type, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
804
+ let marginMode = undefined;
805
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
806
+ const isSpot = (type === 'spot');
807
+ const request = {
808
+ 'type': (isSpot) ? 'spotClearinghouseState' : 'clearinghouseState',
809
+ 'user': userAddress,
810
+ };
811
+ const response = await this.publicPostInfo(this.extend(request, params));
812
+ //
813
+ // {
814
+ // "assetPositions": [],
815
+ // "crossMaintenanceMarginUsed": "0.0",
816
+ // "crossMarginSummary": {
817
+ // "accountValue": "100.0",
818
+ // "totalMarginUsed": "0.0",
819
+ // "totalNtlPos": "0.0",
820
+ // "totalRawUsd": "100.0"
821
+ // },
822
+ // "marginSummary": {
823
+ // "accountValue": "100.0",
824
+ // "totalMarginUsed": "0.0",
825
+ // "totalNtlPos": "0.0",
826
+ // "totalRawUsd": "100.0"
827
+ // },
828
+ // "time": "1704261007014",
829
+ // "withdrawable": "100.0"
830
+ // }
831
+ // spot
832
+ //
833
+ // {
834
+ // "balances":[
835
+ // {
836
+ // "coin":"USDC",
837
+ // "hold":"0.0",
838
+ // "total":"1481.844"
839
+ // },
840
+ // {
841
+ // "coin":"PURR",
842
+ // "hold":"0.0",
843
+ // "total":"999.65004"
844
+ // }
845
+ // }
846
+ //
847
+ const balances = this.safeList(response, 'balances');
848
+ if (balances !== undefined) {
849
+ const spotBalances = { 'info': response };
850
+ for (let i = 0; i < balances.length; i++) {
851
+ const balance = balances[i];
852
+ const code = this.safeCurrencyCode(this.safeString(balance, 'coin'));
853
+ const account = this.account();
854
+ const total = this.safeString(balance, 'total');
855
+ const used = this.safeString(balance, 'hold');
856
+ account['total'] = total;
857
+ account['used'] = used;
858
+ spotBalances[code] = account;
859
+ }
860
+ return this.safeBalance(spotBalances);
861
+ }
862
+ const data = this.safeDict(response, 'marginSummary', {});
863
+ const usdcBalance = {
864
+ 'total': this.safeNumber(data, 'accountValue'),
865
+ };
866
+ if ((marginMode !== undefined) && (marginMode === 'isolated')) {
867
+ usdcBalance['free'] = this.safeNumber(response, 'withdrawable');
868
+ }
869
+ else {
870
+ usdcBalance['used'] = this.safeNumber(data, 'totalMarginUsed');
871
+ }
872
+ const result = {
873
+ 'info': response,
874
+ 'USDC': usdcBalance,
875
+ };
876
+ const timestamp = this.safeInteger(response, 'time');
877
+ result['timestamp'] = timestamp;
878
+ result['datetime'] = this.iso8601(timestamp);
879
+ return this.safeBalance(result);
880
+ }
881
+ /**
882
+ * @method
883
+ * @name hyperliquid#fetchOrderBook
884
+ * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
885
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#l2-book-snapshot
886
+ * @param {string} symbol unified symbol of the market to fetch the order book for
887
+ * @param {int} [limit] the maximum amount of order book entries to return
888
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
889
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
890
+ */
891
+ async fetchOrderBook(symbol, limit = undefined, params = {}) {
892
+ await this.loadMarkets();
893
+ const market = this.market(symbol);
894
+ const request = {
895
+ 'type': 'l2Book',
896
+ 'coin': market['swap'] ? market['baseName'] : market['id'],
897
+ };
898
+ const response = await this.publicPostInfo(this.extend(request, params));
899
+ //
900
+ // {
901
+ // "coin": "ETH",
902
+ // "levels": [
903
+ // [
904
+ // {
905
+ // "n": "2",
906
+ // "px": "2216.2",
907
+ // "sz": "74.0637"
908
+ // }
909
+ // ],
910
+ // [
911
+ // {
912
+ // "n": "2",
913
+ // "px": "2216.5",
914
+ // "sz": "70.5893"
915
+ // }
916
+ // ]
917
+ // ],
918
+ // "time": "1704290104840"
919
+ // }
920
+ //
921
+ const data = this.safeList(response, 'levels', []);
922
+ const result = {
923
+ 'bids': this.safeList(data, 0, []),
924
+ 'asks': this.safeList(data, 1, []),
925
+ };
926
+ const timestamp = this.safeInteger(response, 'time');
927
+ return this.parseOrderBook(result, market['symbol'], timestamp, 'bids', 'asks', 'px', 'sz');
928
+ }
929
+ /**
930
+ * @method
931
+ * @name hyperliquid#fetchTickers
932
+ * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
933
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc
934
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/spot#retrieve-spot-asset-contexts
935
+ * @param {string[]} [symbols] unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
936
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
937
+ * @param {string} [params.type] 'spot' or 'swap', by default fetches both
938
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
939
+ */
940
+ async fetchTickers(symbols = undefined, params = {}) {
941
+ await this.loadMarkets();
942
+ symbols = this.marketSymbols(symbols);
943
+ // at this stage, to get tickers data, we use fetchMarkets endpoints
944
+ let response = [];
945
+ const type = this.safeString(params, 'type');
946
+ params = this.omit(params, 'type');
947
+ if (type === 'spot') {
948
+ response = await this.fetchSpotMarkets(params);
949
+ }
950
+ else if (type === 'swap') {
951
+ response = await this.fetchSwapMarkets(params);
952
+ }
953
+ else {
954
+ response = await this.fetchMarkets(params);
955
+ }
956
+ // same response as under "fetchMarkets"
957
+ const result = {};
958
+ for (let i = 0; i < response.length; i++) {
959
+ const market = response[i];
960
+ const info = market['info'];
961
+ const ticker = this.parseTicker(info, market);
962
+ const symbol = this.safeString(ticker, 'symbol');
963
+ result[symbol] = ticker;
964
+ }
965
+ return this.filterByArrayTickers(result, 'symbol', symbols);
966
+ }
967
+ /**
968
+ * @method
969
+ * @name hyperliquid#fetchFundingRates
970
+ * @description retrieves data on all swap markets for hyperliquid
971
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-perpetuals-asset-contexts-includes-mark-price-current-funding-open-interest-etc
972
+ * @param {string[]} [symbols] list of unified market symbols
973
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
974
+ * @returns {object[]} an array of objects representing market data
975
+ */
976
+ async fetchFundingRates(symbols = undefined, params = {}) {
977
+ const request = {
978
+ 'type': 'metaAndAssetCtxs',
979
+ };
980
+ const response = await this.publicPostInfo(this.extend(request, params));
981
+ //
982
+ // [
983
+ // {
984
+ // "universe": [
985
+ // {
986
+ // "maxLeverage": 50,
987
+ // "name": "SOL",
988
+ // "onlyIsolated": false,
989
+ // "szDecimals": 2
990
+ // }
991
+ // ]
992
+ // },
993
+ // [
994
+ // {
995
+ // "dayNtlVlm": "9450588.2273",
996
+ // "funding": "0.0000198",
997
+ // "impactPxs": [
998
+ // "108.04",
999
+ // "108.06"
1000
+ // ],
1001
+ // "markPx": "108.04",
1002
+ // "midPx": "108.05",
1003
+ // "openInterest": "10764.48",
1004
+ // "oraclePx": "107.99",
1005
+ // "premium": "0.00055561",
1006
+ // "prevDayPx": "111.81"
1007
+ // }
1008
+ // ]
1009
+ // ]
1010
+ //
1011
+ //
1012
+ const meta = this.safeDict(response, 0, {});
1013
+ const universe = this.safeList(meta, 'universe', []);
1014
+ const assetCtxs = this.safeList(response, 1, []);
1015
+ const result = [];
1016
+ for (let i = 0; i < universe.length; i++) {
1017
+ const data = this.extend(this.safeDict(universe, i, {}), this.safeDict(assetCtxs, i, {}));
1018
+ result.push(data);
1019
+ }
1020
+ return this.parseFundingRates(result, symbols);
1021
+ }
1022
+ parseFundingRate(info, market = undefined) {
1023
+ //
1024
+ // {
1025
+ // "maxLeverage": "50",
1026
+ // "name": "ETH",
1027
+ // "onlyIsolated": false,
1028
+ // "szDecimals": "4",
1029
+ // "dayNtlVlm": "1709813.11535",
1030
+ // "funding": "0.00004807",
1031
+ // "impactPxs": [
1032
+ // "2369.3",
1033
+ // "2369.6"
1034
+ // ],
1035
+ // "markPx": "2369.6",
1036
+ // "midPx": "2369.45",
1037
+ // "openInterest": "1815.4712",
1038
+ // "oraclePx": "2367.3",
1039
+ // "premium": "0.00090821",
1040
+ // "prevDayPx": "2381.5"
1041
+ // }
1042
+ //
1043
+ const base = this.safeString(info, 'name');
1044
+ const marketId = this.coinToMarketId(base);
1045
+ const symbol = this.safeSymbol(marketId, market);
1046
+ const funding = this.safeNumber(info, 'funding');
1047
+ const markPx = this.safeNumber(info, 'markPx');
1048
+ const oraclePx = this.safeNumber(info, 'oraclePx');
1049
+ const fundingTimestamp = (Math.floor(this.milliseconds() / 60 / 60 / 1000) + 1) * 60 * 60 * 1000;
1050
+ return {
1051
+ 'info': info,
1052
+ 'symbol': symbol,
1053
+ 'markPrice': markPx,
1054
+ 'indexPrice': oraclePx,
1055
+ 'interestRate': undefined,
1056
+ 'estimatedSettlePrice': undefined,
1057
+ 'timestamp': undefined,
1058
+ 'datetime': undefined,
1059
+ 'fundingRate': funding,
1060
+ 'fundingTimestamp': fundingTimestamp,
1061
+ 'fundingDatetime': this.iso8601(fundingTimestamp),
1062
+ 'nextFundingRate': undefined,
1063
+ 'nextFundingTimestamp': undefined,
1064
+ 'nextFundingDatetime': undefined,
1065
+ 'previousFundingRate': undefined,
1066
+ 'previousFundingTimestamp': undefined,
1067
+ 'previousFundingDatetime': undefined,
1068
+ 'interval': '1h',
1069
+ };
1070
+ }
1071
+ parseTicker(ticker, market = undefined) {
1072
+ //
1073
+ // {
1074
+ // "prevDayPx": "3400.5",
1075
+ // "dayNtlVlm": "511297257.47936022",
1076
+ // "markPx": "3464.7",
1077
+ // "midPx": "3465.05",
1078
+ // "oraclePx": "3460.1", // only in swap
1079
+ // "openInterest": "64638.1108", // only in swap
1080
+ // "premium": "0.00141614", // only in swap
1081
+ // "funding": "0.00008727", // only in swap
1082
+ // "impactPxs": [ "3465.0", "3465.1" ], // only in swap
1083
+ // "coin": "PURR", // only in spot
1084
+ // "circulatingSupply": "998949190.03400207", // only in spot
1085
+ // },
1086
+ //
1087
+ const bidAsk = this.safeList(ticker, 'impactPxs');
1088
+ return this.safeTicker({
1089
+ 'symbol': market['symbol'],
1090
+ 'timestamp': undefined,
1091
+ 'datetime': undefined,
1092
+ 'previousClose': this.safeNumber(ticker, 'prevDayPx'),
1093
+ 'close': this.safeNumber(ticker, 'midPx'),
1094
+ 'bid': this.safeNumber(bidAsk, 0),
1095
+ 'ask': this.safeNumber(bidAsk, 1),
1096
+ 'quoteVolume': this.safeNumber(ticker, 'dayNtlVlm'),
1097
+ 'info': ticker,
1098
+ }, market);
1099
+ }
1100
+ /**
1101
+ * @method
1102
+ * @name hyperliquid#fetchOHLCV
1103
+ * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1104
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#candle-snapshot
1105
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
1106
+ * @param {string} timeframe the length of time each candle represents, support '1m', '15m', '1h', '1d'
1107
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
1108
+ * @param {int} [limit] the maximum amount of candles to fetch
1109
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1110
+ * @param {int} [params.until] timestamp in ms of the latest candle to fetch
1111
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
1112
+ */
1113
+ async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1114
+ await this.loadMarkets();
1115
+ const market = this.market(symbol);
1116
+ const until = this.safeInteger(params, 'until', this.milliseconds());
1117
+ let useTail = since === undefined;
1118
+ const originalSince = since;
1119
+ if (since === undefined) {
1120
+ if (limit !== undefined) {
1121
+ // optimization if limit is provided
1122
+ const timeframeInMilliseconds = this.parseTimeframe(timeframe) * 1000;
1123
+ since = this.sum(until, timeframeInMilliseconds * limit * -1);
1124
+ useTail = false;
1125
+ }
1126
+ else {
1127
+ since = 0;
1128
+ }
1129
+ }
1130
+ params = this.omit(params, ['until']);
1131
+ const request = {
1132
+ 'type': 'candleSnapshot',
1133
+ 'req': {
1134
+ 'coin': market['swap'] ? market['baseName'] : market['id'],
1135
+ 'interval': this.safeString(this.timeframes, timeframe, timeframe),
1136
+ 'startTime': since,
1137
+ 'endTime': until,
1138
+ },
1139
+ };
1140
+ const response = await this.publicPostInfo(this.extend(request, params));
1141
+ //
1142
+ // [
1143
+ // {
1144
+ // "T": 1704287699999,
1145
+ // "c": "2226.4",
1146
+ // "h": "2247.9",
1147
+ // "i": "15m",
1148
+ // "l": "2224.6",
1149
+ // "n": 46,
1150
+ // "o": "2247.9",
1151
+ // "s": "ETH",
1152
+ // "t": 1704286800000,
1153
+ // "v": "591.6427"
1154
+ // }
1155
+ // ]
1156
+ //
1157
+ return this.parseOHLCVs(response, market, timeframe, originalSince, limit, useTail);
1158
+ }
1159
+ parseOHLCV(ohlcv, market = undefined) {
1160
+ //
1161
+ // {
1162
+ // "T": 1704287699999,
1163
+ // "c": "2226.4",
1164
+ // "h": "2247.9",
1165
+ // "i": "15m",
1166
+ // "l": "2224.6",
1167
+ // "n": 46,
1168
+ // "o": "2247.9",
1169
+ // "s": "ETH",
1170
+ // "t": 1704286800000,
1171
+ // "v": "591.6427"
1172
+ // }
1173
+ //
1174
+ return [
1175
+ this.safeInteger(ohlcv, 't'),
1176
+ this.safeNumber(ohlcv, 'o'),
1177
+ this.safeNumber(ohlcv, 'h'),
1178
+ this.safeNumber(ohlcv, 'l'),
1179
+ this.safeNumber(ohlcv, 'c'),
1180
+ this.safeNumber(ohlcv, 'v'),
1181
+ ];
1182
+ }
1183
+ /**
1184
+ * @method
1185
+ * @name hyperliquid#fetchTrades
1186
+ * @description get the list of most recent trades for a particular symbol
1187
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills
1188
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills-by-time
1189
+ * @param {string} symbol unified market symbol
1190
+ * @param {int} [since] the earliest time in ms to fetch trades for
1191
+ * @param {int} [limit] the maximum number of trades structures to retrieve
1192
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1193
+ * @param {int} [params.until] timestamp in ms of the latest trade
1194
+ * @param {string} [params.address] wallet address that made trades
1195
+ * @param {string} [params.user] wallet address that made trades
1196
+ * @param {string} [params.subAccountAddress] sub account user address
1197
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1198
+ */
1199
+ async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
1200
+ let userAddress = undefined;
1201
+ [userAddress, params] = this.handlePublicAddress('fetchTrades', params);
1202
+ await this.loadMarkets();
1203
+ const market = this.safeMarket(symbol);
1204
+ const request = {
1205
+ 'user': userAddress,
1206
+ };
1207
+ if (since !== undefined) {
1208
+ request['type'] = 'userFillsByTime';
1209
+ request['startTime'] = since;
1210
+ }
1211
+ else {
1212
+ request['type'] = 'userFills';
1213
+ }
1214
+ const until = this.safeInteger(params, 'until');
1215
+ params = this.omit(params, 'until');
1216
+ if (until !== undefined) {
1217
+ request['endTime'] = until;
1218
+ }
1219
+ const response = await this.publicPostInfo(this.extend(request, params));
1220
+ //
1221
+ // [
1222
+ // {
1223
+ // "closedPnl": "0.19343",
1224
+ // "coin": "ETH",
1225
+ // "crossed": true,
1226
+ // "dir": "Close Long",
1227
+ // "fee": "0.050062",
1228
+ // "hash": "0x09d77c96791e98b5775a04092584ab010d009445119c71e4005c0d634ea322bc",
1229
+ // "liquidationMarkPx": null,
1230
+ // "oid": 3929354691,
1231
+ // "px": "2381.1",
1232
+ // "side": "A",
1233
+ // "startPosition": "0.0841",
1234
+ // "sz": "0.0841",
1235
+ // "tid": 128423918764978,
1236
+ // "time": 1704262888911
1237
+ // }
1238
+ // ]
1239
+ //
1240
+ return this.parseTrades(response, market, since, limit);
1241
+ }
1242
+ amountToPrecision(symbol, amount) {
1243
+ const market = this.market(symbol);
1244
+ return this.decimalToPrecision(amount, ROUND, market['precision']['amount'], this.precisionMode, this.paddingMode);
1245
+ }
1246
+ priceToPrecision(symbol, price) {
1247
+ const market = this.market(symbol);
1248
+ const priceStr = this.numberToString(price);
1249
+ const integerPart = priceStr.split('.')[0];
1250
+ const significantDigits = Math.max(5, integerPart.length);
1251
+ const result = this.decimalToPrecision(price, ROUND, significantDigits, SIGNIFICANT_DIGITS, this.paddingMode);
1252
+ const maxDecimals = market['spot'] ? 8 : 6;
1253
+ const subtractedValue = maxDecimals - this.precisionFromString(this.safeString(market['precision'], 'amount'));
1254
+ return this.decimalToPrecision(result, ROUND, subtractedValue, DECIMAL_PLACES, this.paddingMode);
1255
+ }
1256
+ hashMessage(message) {
1257
+ return '0x' + this.hash(message, keccak, 'hex');
1258
+ }
1259
+ signHash(hash, privateKey) {
1260
+ const signature = ecdsa(hash.slice(-64), privateKey.slice(-64), secp256k1, undefined);
1261
+ return {
1262
+ 'r': '0x' + signature['r'],
1263
+ 's': '0x' + signature['s'],
1264
+ 'v': this.sum(27, signature['v']),
1265
+ };
1266
+ }
1267
+ signMessage(message, privateKey) {
1268
+ return this.signHash(this.hashMessage(message), privateKey.slice(-64));
1269
+ }
1270
+ constructPhantomAgent(hash, isTestnet = true) {
1271
+ const source = (isTestnet) ? 'b' : 'a';
1272
+ return {
1273
+ 'source': source,
1274
+ 'connectionId': hash,
1275
+ };
1276
+ }
1277
+ actionHash(action, vaultAddress, nonce) {
1278
+ const dataBinary = this.packb(action);
1279
+ const dataHex = this.binaryToBase16(dataBinary);
1280
+ let data = dataHex;
1281
+ data += '00000' + this.intToBase16(nonce);
1282
+ if (vaultAddress === undefined) {
1283
+ data += '00';
1284
+ }
1285
+ else {
1286
+ data += '01';
1287
+ data += vaultAddress;
1288
+ }
1289
+ return this.hash(this.base16ToBinary(data), keccak, 'binary');
1290
+ }
1291
+ signL1Action(action, nonce, vaultAdress = undefined) {
1292
+ const hash = this.actionHash(action, vaultAdress, nonce);
1293
+ const isTestnet = this.safeBool(this.options, 'sandboxMode', false);
1294
+ const phantomAgent = this.constructPhantomAgent(hash, isTestnet);
1295
+ // const data: Dict = {
1296
+ // 'domain': {
1297
+ // 'chainId': 1337,
1298
+ // 'name': 'Exchange',
1299
+ // 'verifyingContract': '0x0000000000000000000000000000000000000000',
1300
+ // 'version': '1',
1301
+ // },
1302
+ // 'types': {
1303
+ // 'Agent': [
1304
+ // { 'name': 'source', 'type': 'string' },
1305
+ // { 'name': 'connectionId', 'type': 'bytes32' },
1306
+ // ],
1307
+ // 'EIP712Domain': [
1308
+ // { 'name': 'name', 'type': 'string' },
1309
+ // { 'name': 'version', 'type': 'string' },
1310
+ // { 'name': 'chainId', 'type': 'uint256' },
1311
+ // { 'name': 'verifyingContract', 'type': 'address' },
1312
+ // ],
1313
+ // },
1314
+ // 'primaryType': 'Agent',
1315
+ // 'message': phantomAgent,
1316
+ // };
1317
+ const zeroAddress = this.safeString(this.options, 'zeroAddress');
1318
+ const chainId = 1337; // check this out
1319
+ const domain = {
1320
+ 'chainId': chainId,
1321
+ 'name': 'Exchange',
1322
+ 'verifyingContract': zeroAddress,
1323
+ 'version': '1',
1324
+ };
1325
+ const messageTypes = {
1326
+ 'Agent': [
1327
+ { 'name': 'source', 'type': 'string' },
1328
+ { 'name': 'connectionId', 'type': 'bytes32' },
1329
+ ],
1330
+ };
1331
+ const msg = this.ethEncodeStructuredData(domain, messageTypes, phantomAgent);
1332
+ const signature = this.signMessage(msg, this.privateKey);
1333
+ return signature;
1334
+ }
1335
+ signUserSignedAction(messageTypes, message) {
1336
+ const zeroAddress = this.safeString(this.options, 'zeroAddress');
1337
+ const chainId = 421614; // check this out
1338
+ const domain = {
1339
+ 'chainId': chainId,
1340
+ 'name': 'HyperliquidSignTransaction',
1341
+ 'verifyingContract': zeroAddress,
1342
+ 'version': '1',
1343
+ };
1344
+ const msg = this.ethEncodeStructuredData(domain, messageTypes, message);
1345
+ const signature = this.signMessage(msg, this.privateKey);
1346
+ return signature;
1347
+ }
1348
+ buildUsdSendSig(message) {
1349
+ const messageTypes = {
1350
+ 'HyperliquidTransaction:UsdSend': [
1351
+ { 'name': 'hyperliquidChain', 'type': 'string' },
1352
+ { 'name': 'destination', 'type': 'string' },
1353
+ { 'name': 'amount', 'type': 'string' },
1354
+ { 'name': 'time', 'type': 'uint64' },
1355
+ ],
1356
+ };
1357
+ return this.signUserSignedAction(messageTypes, message);
1358
+ }
1359
+ buildUsdClassSendSig(message) {
1360
+ const messageTypes = {
1361
+ 'HyperliquidTransaction:UsdClassTransfer': [
1362
+ { 'name': 'hyperliquidChain', 'type': 'string' },
1363
+ { 'name': 'amount', 'type': 'string' },
1364
+ { 'name': 'toPerp', 'type': 'bool' },
1365
+ { 'name': 'nonce', 'type': 'uint64' },
1366
+ ],
1367
+ };
1368
+ return this.signUserSignedAction(messageTypes, message);
1369
+ }
1370
+ buildWithdrawSig(message) {
1371
+ const messageTypes = {
1372
+ 'HyperliquidTransaction:Withdraw': [
1373
+ { 'name': 'hyperliquidChain', 'type': 'string' },
1374
+ { 'name': 'destination', 'type': 'string' },
1375
+ { 'name': 'amount', 'type': 'string' },
1376
+ { 'name': 'time', 'type': 'uint64' },
1377
+ ],
1378
+ };
1379
+ return this.signUserSignedAction(messageTypes, message);
1380
+ }
1381
+ buildApproveBuilderFeeSig(message) {
1382
+ const messageTypes = {
1383
+ 'HyperliquidTransaction:ApproveBuilderFee': [
1384
+ { 'name': 'hyperliquidChain', 'type': 'string' },
1385
+ { 'name': 'maxFeeRate', 'type': 'string' },
1386
+ { 'name': 'builder', 'type': 'address' },
1387
+ { 'name': 'nonce', 'type': 'uint64' },
1388
+ ],
1389
+ };
1390
+ return this.signUserSignedAction(messageTypes, message);
1391
+ }
1392
+ async approveBuilderFee(builder, maxFeeRate) {
1393
+ const nonce = this.milliseconds();
1394
+ const isSandboxMode = this.safeBool(this.options, 'sandboxMode', false);
1395
+ const payload = {
1396
+ 'hyperliquidChain': isSandboxMode ? 'Testnet' : 'Mainnet',
1397
+ 'maxFeeRate': maxFeeRate,
1398
+ 'builder': builder,
1399
+ 'nonce': nonce,
1400
+ };
1401
+ const sig = this.buildApproveBuilderFeeSig(payload);
1402
+ const action = {
1403
+ 'hyperliquidChain': payload['hyperliquidChain'],
1404
+ 'signatureChainId': '0x66eee',
1405
+ 'maxFeeRate': payload['maxFeeRate'],
1406
+ 'builder': payload['builder'],
1407
+ 'nonce': nonce,
1408
+ 'type': 'approveBuilderFee',
1409
+ };
1410
+ const request = {
1411
+ 'action': action,
1412
+ 'nonce': nonce,
1413
+ 'signature': sig,
1414
+ 'vaultAddress': undefined,
1415
+ };
1416
+ //
1417
+ // {
1418
+ // "status": "ok",
1419
+ // "response": {
1420
+ // "type": "default"
1421
+ // }
1422
+ // }
1423
+ //
1424
+ return await this.privatePostExchange(request);
1425
+ }
1426
+ async handleBuilderFeeApproval() {
1427
+ const buildFee = this.safeBool(this.options, 'builderFee', true);
1428
+ if (!buildFee) {
1429
+ return false; // skip if builder fee is not enabled
1430
+ }
1431
+ const approvedBuilderFee = this.safeBool(this.options, 'approvedBuilderFee', false);
1432
+ if (approvedBuilderFee) {
1433
+ return true; // skip if builder fee is already approved
1434
+ }
1435
+ try {
1436
+ const builder = this.safeString(this.options, 'builder', '0x6530512A6c89C7cfCEbC3BA7fcD9aDa5f30827a6');
1437
+ const maxFeeRate = this.safeString(this.options, 'feeRate', '0.01%');
1438
+ await this.approveBuilderFee(builder, maxFeeRate);
1439
+ this.options['approvedBuilderFee'] = true;
1440
+ }
1441
+ catch (e) {
1442
+ this.options['builderFee'] = false; // disable builder fee if an error occurs
1443
+ }
1444
+ return true;
1445
+ }
1446
+ /**
1447
+ * @method
1448
+ * @name hyperliquid#createOrder
1449
+ * @description create a trade order
1450
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
1451
+ * @param {string} symbol unified symbol of the market to create an order in
1452
+ * @param {string} type 'market' or 'limit'
1453
+ * @param {string} side 'buy' or 'sell'
1454
+ * @param {float} amount how much of currency you want to trade in units of base currency
1455
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1456
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1457
+ * @param {string} [params.timeInForce] 'Gtc', 'Ioc', 'Alo'
1458
+ * @param {bool} [params.postOnly] true or false whether the order is post-only
1459
+ * @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
1460
+ * @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
1461
+ * @param {string} [params.clientOrderId] client order id, (optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
1462
+ * @param {string} [params.slippage] the slippage for market order
1463
+ * @param {string} [params.vaultAddress] the vault address for order
1464
+ * @param {string} [params.subAccountAddress] sub account user address
1465
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1466
+ */
1467
+ async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1468
+ await this.loadMarkets();
1469
+ const [order, globalParams] = this.parseCreateEditOrderArgs(undefined, symbol, type, side, amount, price, params);
1470
+ const orders = await this.createOrders([order], globalParams);
1471
+ return orders[0];
1472
+ }
1473
+ /**
1474
+ * @method
1475
+ * @name hyperliquid#createOrders
1476
+ * @description create a list of trade orders
1477
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
1478
+ * @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
1479
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1480
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1481
+ */
1482
+ async createOrders(orders, params = {}) {
1483
+ await this.loadMarkets();
1484
+ await this.handleBuilderFeeApproval();
1485
+ const request = this.createOrdersRequest(orders, params);
1486
+ const response = await this.privatePostExchange(request);
1487
+ //
1488
+ // {
1489
+ // "status": "ok",
1490
+ // "response": {
1491
+ // "type": "order",
1492
+ // "data": {
1493
+ // "statuses": [
1494
+ // {
1495
+ // "resting": {
1496
+ // "oid": 5063830287
1497
+ // }
1498
+ // }
1499
+ // ]
1500
+ // }
1501
+ // }
1502
+ // }
1503
+ //
1504
+ const responseObj = this.safeDict(response, 'response', {});
1505
+ const data = this.safeDict(responseObj, 'data', {});
1506
+ const statuses = this.safeList(data, 'statuses', []);
1507
+ return this.parseOrders(statuses, undefined);
1508
+ }
1509
+ createOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
1510
+ const market = this.market(symbol);
1511
+ type = type.toUpperCase();
1512
+ side = side.toUpperCase();
1513
+ const isMarket = (type === 'MARKET');
1514
+ const isBuy = (side === 'BUY');
1515
+ const clientOrderId = this.safeString2(params, 'clientOrderId', 'client_id');
1516
+ const slippage = this.safeString(params, 'slippage');
1517
+ let defaultTimeInForce = (isMarket) ? 'ioc' : 'gtc';
1518
+ const postOnly = this.safeBool(params, 'postOnly', false);
1519
+ if (postOnly) {
1520
+ defaultTimeInForce = 'alo';
1521
+ }
1522
+ let timeInForce = this.safeStringLower(params, 'timeInForce', defaultTimeInForce);
1523
+ timeInForce = this.capitalize(timeInForce);
1524
+ let triggerPrice = this.safeString2(params, 'triggerPrice', 'stopPrice');
1525
+ const stopLossPrice = this.safeString(params, 'stopLossPrice', triggerPrice);
1526
+ const takeProfitPrice = this.safeString(params, 'takeProfitPrice');
1527
+ const isTrigger = (stopLossPrice || takeProfitPrice);
1528
+ let px = undefined;
1529
+ if (isMarket) {
1530
+ if (price === undefined) {
1531
+ throw new ArgumentsRequired(this.id + ' market orders require price to calculate the max slippage price. Default slippage can be set in options (default is 5%).');
1532
+ }
1533
+ px = (isBuy) ? Precise.stringMul(price, Precise.stringAdd('1', slippage)) : Precise.stringMul(price, Precise.stringSub('1', slippage));
1534
+ px = this.priceToPrecision(symbol, px); // round after adding slippage
1535
+ }
1536
+ else {
1537
+ px = this.priceToPrecision(symbol, price);
1538
+ }
1539
+ const sz = this.amountToPrecision(symbol, amount);
1540
+ const reduceOnly = this.safeBool(params, 'reduceOnly', false);
1541
+ const orderType = {};
1542
+ if (isTrigger) {
1543
+ let isTp = false;
1544
+ if (takeProfitPrice !== undefined) {
1545
+ triggerPrice = this.priceToPrecision(symbol, takeProfitPrice);
1546
+ isTp = true;
1547
+ }
1548
+ else {
1549
+ triggerPrice = this.priceToPrecision(symbol, stopLossPrice);
1550
+ }
1551
+ orderType['trigger'] = {
1552
+ 'isMarket': isMarket,
1553
+ 'triggerPx': triggerPrice,
1554
+ 'tpsl': (isTp) ? 'tp' : 'sl',
1555
+ };
1556
+ }
1557
+ else {
1558
+ orderType['limit'] = {
1559
+ 'tif': timeInForce,
1560
+ };
1561
+ }
1562
+ params = this.omit(params, ['clientOrderId', 'slippage', 'triggerPrice', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'timeInForce', 'client_id', 'reduceOnly', 'postOnly']);
1563
+ const orderObj = {
1564
+ 'a': this.parseToInt(market['baseId']),
1565
+ 'b': isBuy,
1566
+ 'p': px,
1567
+ 's': sz,
1568
+ 'r': reduceOnly,
1569
+ 't': orderType,
1570
+ // 'c': clientOrderId,
1571
+ };
1572
+ if (clientOrderId !== undefined) {
1573
+ orderObj['c'] = clientOrderId;
1574
+ }
1575
+ return orderObj;
1576
+ }
1577
+ createOrdersRequest(orders, params = {}) {
1578
+ /**
1579
+ * @method
1580
+ * @name hyperliquid#createOrdersRequest
1581
+ * @description create a list of trade orders
1582
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
1583
+ * @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
1584
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1585
+ */
1586
+ this.checkRequiredCredentials();
1587
+ let defaultSlippage = this.safeString(this.options, 'defaultSlippage');
1588
+ defaultSlippage = this.safeString(params, 'slippage', defaultSlippage);
1589
+ let hasClientOrderId = false;
1590
+ for (let i = 0; i < orders.length; i++) {
1591
+ const rawOrder = orders[i];
1592
+ const orderParams = this.safeDict(rawOrder, 'params', {});
1593
+ const clientOrderId = this.safeString2(orderParams, 'clientOrderId', 'client_id');
1594
+ if (clientOrderId !== undefined) {
1595
+ hasClientOrderId = true;
1596
+ }
1597
+ }
1598
+ if (hasClientOrderId) {
1599
+ for (let i = 0; i < orders.length; i++) {
1600
+ const rawOrder = orders[i];
1601
+ const orderParams = this.safeDict(rawOrder, 'params', {});
1602
+ const clientOrderId = this.safeString2(orderParams, 'clientOrderId', 'client_id');
1603
+ if (clientOrderId === undefined) {
1604
+ throw new ArgumentsRequired(this.id + ' createOrders() all orders must have clientOrderId if at least one has a clientOrderId');
1605
+ }
1606
+ }
1607
+ }
1608
+ params = this.omit(params, ['slippage', 'clientOrderId', 'client_id', 'slippage', 'triggerPrice', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'timeInForce']);
1609
+ const nonce = this.milliseconds();
1610
+ const orderReq = [];
1611
+ let grouping = 'na';
1612
+ for (let i = 0; i < orders.length; i++) {
1613
+ const rawOrder = orders[i];
1614
+ const marketId = this.safeString(rawOrder, 'symbol');
1615
+ const market = this.market(marketId);
1616
+ const symbol = market['symbol'];
1617
+ const type = this.safeStringUpper(rawOrder, 'type');
1618
+ const side = this.safeStringUpper(rawOrder, 'side');
1619
+ const amount = this.safeString(rawOrder, 'amount');
1620
+ const price = this.safeString(rawOrder, 'price');
1621
+ let orderParams = this.safeDict(rawOrder, 'params', {});
1622
+ const slippage = this.safeString(orderParams, 'slippage', defaultSlippage);
1623
+ orderParams['slippage'] = slippage;
1624
+ const stopLoss = this.safeValue(orderParams, 'stopLoss');
1625
+ const takeProfit = this.safeValue(orderParams, 'takeProfit');
1626
+ const isTrigger = (stopLoss || takeProfit);
1627
+ orderParams = this.omit(orderParams, ['stopLoss', 'takeProfit']);
1628
+ const mainOrderObj = this.createOrderRequest(symbol, type, side, amount, price, orderParams);
1629
+ orderReq.push(mainOrderObj);
1630
+ if (isTrigger) {
1631
+ // grouping opposed orders for sl/tp
1632
+ const stopLossOrderTriggerPrice = this.safeStringN(stopLoss, ['triggerPrice', 'stopPrice']);
1633
+ const stopLossOrderType = this.safeString(stopLoss, 'type');
1634
+ const stopLossOrderLimitPrice = this.safeStringN(stopLoss, ['price', 'stopLossPrice'], stopLossOrderTriggerPrice);
1635
+ const takeProfitOrderTriggerPrice = this.safeStringN(takeProfit, ['triggerPrice', 'stopPrice']);
1636
+ const takeProfitOrderType = this.safeString(takeProfit, 'type');
1637
+ const takeProfitOrderLimitPrice = this.safeStringN(takeProfit, ['price', 'takeProfitPrice'], takeProfitOrderTriggerPrice);
1638
+ grouping = 'normalTpsl';
1639
+ orderParams = this.omit(orderParams, ['stopLoss', 'takeProfit']);
1640
+ let triggerOrderSide = '';
1641
+ if (side === 'BUY') {
1642
+ triggerOrderSide = 'sell';
1643
+ }
1644
+ else {
1645
+ triggerOrderSide = 'buy';
1646
+ }
1647
+ if (takeProfit !== undefined) {
1648
+ const orderObj = this.createOrderRequest(symbol, takeProfitOrderType, triggerOrderSide, amount, takeProfitOrderLimitPrice, this.extend(orderParams, {
1649
+ 'takeProfitPrice': takeProfitOrderTriggerPrice,
1650
+ 'reduceOnly': true,
1651
+ }));
1652
+ orderReq.push(orderObj);
1653
+ }
1654
+ if (stopLoss !== undefined) {
1655
+ const orderObj = this.createOrderRequest(symbol, stopLossOrderType, triggerOrderSide, amount, stopLossOrderLimitPrice, this.extend(orderParams, {
1656
+ 'stopLossPrice': stopLossOrderTriggerPrice,
1657
+ 'reduceOnly': true,
1658
+ }));
1659
+ orderReq.push(orderObj);
1660
+ }
1661
+ }
1662
+ }
1663
+ let vaultAddress = undefined;
1664
+ [vaultAddress, params] = this.handleOptionAndParams(params, 'createOrder', 'vaultAddress');
1665
+ vaultAddress = this.formatVaultAddress(vaultAddress);
1666
+ const orderAction = {
1667
+ 'type': 'order',
1668
+ 'orders': orderReq,
1669
+ 'grouping': grouping,
1670
+ };
1671
+ if (this.safeBool(this.options, 'approvedBuilderFee', false)) {
1672
+ const wallet = this.safeStringLower(this.options, 'builder', '0x6530512A6c89C7cfCEbC3BA7fcD9aDa5f30827a6');
1673
+ orderAction['builder'] = { 'b': wallet, 'f': this.safeInteger(this.options, 'feeInt', 10) };
1674
+ }
1675
+ const signature = this.signL1Action(orderAction, nonce, vaultAddress);
1676
+ const request = {
1677
+ 'action': orderAction,
1678
+ 'nonce': nonce,
1679
+ 'signature': signature,
1680
+ // 'vaultAddress': vaultAddress,
1681
+ };
1682
+ if (vaultAddress !== undefined) {
1683
+ params = this.omit(params, 'vaultAddress');
1684
+ request['vaultAddress'] = vaultAddress;
1685
+ }
1686
+ return request;
1687
+ }
1688
+ /**
1689
+ * @method
1690
+ * @name hyperliquid#cancelOrder
1691
+ * @description cancels an open order
1692
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s
1693
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
1694
+ * @param {string} id order id
1695
+ * @param {string} symbol unified symbol of the market the order was made in
1696
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1697
+ * @param {string} [params.clientOrderId] client order id, (optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
1698
+ * @param {string} [params.vaultAddress] the vault address for order
1699
+ * @param {string} [params.subAccountAddress] sub account user address
1700
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1701
+ */
1702
+ async cancelOrder(id, symbol = undefined, params = {}) {
1703
+ const orders = await this.cancelOrders([id], symbol, params);
1704
+ return this.safeDict(orders, 0);
1705
+ }
1706
+ /**
1707
+ * @method
1708
+ * @name hyperliquid#cancelOrders
1709
+ * @description cancel multiple orders
1710
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s
1711
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
1712
+ * @param {string[]} ids order ids
1713
+ * @param {string} [symbol] unified market symbol
1714
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1715
+ * @param {string|string[]} [params.clientOrderId] client order ids, (optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
1716
+ * @param {string} [params.vaultAddress] the vault address
1717
+ * @param {string} [params.subAccountAddress] sub account user address
1718
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1719
+ */
1720
+ async cancelOrders(ids, symbol = undefined, params = {}) {
1721
+ this.checkRequiredCredentials();
1722
+ if (symbol === undefined) {
1723
+ throw new ArgumentsRequired(this.id + ' cancelOrders() requires a symbol argument');
1724
+ }
1725
+ await this.loadMarkets();
1726
+ const request = this.cancelOrdersRequest(ids, symbol, params);
1727
+ const response = await this.privatePostExchange(request);
1728
+ //
1729
+ // {
1730
+ // "status":"ok",
1731
+ // "response":{
1732
+ // "type":"cancel",
1733
+ // "data":{
1734
+ // "statuses":[
1735
+ // "success"
1736
+ // ]
1737
+ // }
1738
+ // }
1739
+ // }
1740
+ //
1741
+ const innerResponse = this.safeDict(response, 'response');
1742
+ const data = this.safeDict(innerResponse, 'data');
1743
+ const statuses = this.safeList(data, 'statuses');
1744
+ const orders = [];
1745
+ for (let i = 0; i < statuses.length; i++) {
1746
+ const status = statuses[i];
1747
+ orders.push(this.safeOrder({
1748
+ 'info': status,
1749
+ 'status': status,
1750
+ }));
1751
+ }
1752
+ return orders;
1753
+ }
1754
+ cancelOrdersRequest(ids, symbol = undefined, params = {}) {
1755
+ /**
1756
+ * @method
1757
+ * @name hyperliquid#cancelOrdersRequest
1758
+ * @description build the request payload for cancelling multiple orders
1759
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s
1760
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
1761
+ * @param {string[]} ids order ids
1762
+ * @param {string} symbol unified market symbol
1763
+ * @param {object} [params]
1764
+ * @returns {object} the raw request object to be sent to the exchange
1765
+ */
1766
+ const market = this.market(symbol);
1767
+ let clientOrderId = this.safeValue2(params, 'clientOrderId', 'client_id');
1768
+ params = this.omit(params, ['clientOrderId', 'client_id']);
1769
+ const nonce = this.milliseconds();
1770
+ const request = {
1771
+ 'nonce': nonce,
1772
+ // 'vaultAddress': vaultAddress,
1773
+ };
1774
+ const cancelReq = [];
1775
+ const cancelAction = {
1776
+ 'type': '',
1777
+ 'cancels': [],
1778
+ };
1779
+ const baseId = this.parseToNumeric(market['baseId']);
1780
+ if (clientOrderId !== undefined) {
1781
+ if (!Array.isArray(clientOrderId)) {
1782
+ clientOrderId = [clientOrderId];
1783
+ }
1784
+ cancelAction['type'] = 'cancelByCloid';
1785
+ for (let i = 0; i < clientOrderId.length; i++) {
1786
+ cancelReq.push({
1787
+ 'asset': baseId,
1788
+ 'cloid': clientOrderId[i],
1789
+ });
1790
+ }
1791
+ }
1792
+ else {
1793
+ cancelAction['type'] = 'cancel';
1794
+ for (let i = 0; i < ids.length; i++) {
1795
+ cancelReq.push({
1796
+ 'a': baseId,
1797
+ 'o': this.parseToNumeric(ids[i]),
1798
+ });
1799
+ }
1800
+ }
1801
+ cancelAction['cancels'] = cancelReq;
1802
+ let vaultAddress = undefined;
1803
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'cancelOrders', 'vaultAddress', 'subAccountAddress');
1804
+ vaultAddress = this.formatVaultAddress(vaultAddress);
1805
+ const signature = this.signL1Action(cancelAction, nonce, vaultAddress);
1806
+ request['action'] = cancelAction;
1807
+ request['signature'] = signature;
1808
+ if (vaultAddress !== undefined) {
1809
+ params = this.omit(params, 'vaultAddress');
1810
+ request['vaultAddress'] = vaultAddress;
1811
+ }
1812
+ return request;
1813
+ }
1814
+ /**
1815
+ * @method
1816
+ * @name hyperliquid#cancelOrdersForSymbols
1817
+ * @description cancel multiple orders for multiple symbols
1818
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s
1819
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#cancel-order-s-by-cloid
1820
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
1821
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1822
+ * @param {string} [params.vaultAddress] the vault address
1823
+ * @param {string} [params.subAccountAddress] sub account user address
1824
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1825
+ */
1826
+ async cancelOrdersForSymbols(orders, params = {}) {
1827
+ this.checkRequiredCredentials();
1828
+ await this.loadMarkets();
1829
+ const nonce = this.milliseconds();
1830
+ const request = {
1831
+ 'nonce': nonce,
1832
+ // 'vaultAddress': vaultAddress,
1833
+ };
1834
+ const cancelReq = [];
1835
+ const cancelAction = {
1836
+ 'type': '',
1837
+ 'cancels': [],
1838
+ };
1839
+ let cancelByCloid = false;
1840
+ for (let i = 0; i < orders.length; i++) {
1841
+ const order = orders[i];
1842
+ const clientOrderId = this.safeString(order, 'clientOrderId');
1843
+ if (clientOrderId !== undefined) {
1844
+ cancelByCloid = true;
1845
+ }
1846
+ const id = this.safeString(order, 'id');
1847
+ const symbol = this.safeString(order, 'symbol');
1848
+ if (symbol === undefined) {
1849
+ throw new ArgumentsRequired(this.id + ' cancelOrdersForSymbols() requires a symbol argument in each order');
1850
+ }
1851
+ if (id !== undefined && cancelByCloid) {
1852
+ throw new BadRequest(this.id + ' cancelOrdersForSymbols() all orders must have either id or clientOrderId');
1853
+ }
1854
+ const assetKey = cancelByCloid ? 'asset' : 'a';
1855
+ const idKey = cancelByCloid ? 'cloid' : 'o';
1856
+ const market = this.market(symbol);
1857
+ const cancelObj = {};
1858
+ cancelObj[assetKey] = this.parseToNumeric(market['baseId']);
1859
+ cancelObj[idKey] = cancelByCloid ? clientOrderId : this.parseToNumeric(id);
1860
+ cancelReq.push(cancelObj);
1861
+ }
1862
+ cancelAction['type'] = cancelByCloid ? 'cancelByCloid' : 'cancel';
1863
+ cancelAction['cancels'] = cancelReq;
1864
+ let vaultAddress = undefined;
1865
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'cancelOrdersForSymbols', 'vaultAddress', 'subAccountAddress');
1866
+ vaultAddress = this.formatVaultAddress(vaultAddress);
1867
+ const signature = this.signL1Action(cancelAction, nonce, vaultAddress);
1868
+ request['action'] = cancelAction;
1869
+ request['signature'] = signature;
1870
+ if (vaultAddress !== undefined) {
1871
+ params = this.omit(params, 'vaultAddress');
1872
+ request['vaultAddress'] = vaultAddress;
1873
+ }
1874
+ const response = await this.privatePostExchange(request);
1875
+ //
1876
+ // {
1877
+ // "status":"ok",
1878
+ // "response":{
1879
+ // "type":"cancel",
1880
+ // "data":{
1881
+ // "statuses":[
1882
+ // "success"
1883
+ // ]
1884
+ // }
1885
+ // }
1886
+ // }
1887
+ //
1888
+ return [this.safeOrder({ 'info': response })];
1889
+ }
1890
+ /**
1891
+ * @method
1892
+ * @name hyperliquid#cancelAllOrdersAfter
1893
+ * @description dead man's switch, cancel all orders after the given timeout
1894
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
1895
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1896
+ * @param {string} [params.vaultAddress] the vault address
1897
+ * @param {string} [params.subAccountAddress] sub account user address
1898
+ * @returns {object} the api result
1899
+ */
1900
+ async cancelAllOrdersAfter(timeout, params = {}) {
1901
+ this.checkRequiredCredentials();
1902
+ await this.loadMarkets();
1903
+ params = this.omit(params, ['clientOrderId', 'client_id']);
1904
+ const nonce = this.milliseconds();
1905
+ const request = {
1906
+ 'nonce': nonce,
1907
+ // 'vaultAddress': vaultAddress,
1908
+ };
1909
+ const cancelAction = {
1910
+ 'type': 'scheduleCancel',
1911
+ 'time': nonce + timeout,
1912
+ };
1913
+ let vaultAddress = undefined;
1914
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'cancelAllOrdersAfter', 'vaultAddress', 'subAccountAddress');
1915
+ vaultAddress = this.formatVaultAddress(vaultAddress);
1916
+ const signature = this.signL1Action(cancelAction, nonce, vaultAddress);
1917
+ request['action'] = cancelAction;
1918
+ request['signature'] = signature;
1919
+ if (vaultAddress !== undefined) {
1920
+ params = this.omit(params, 'vaultAddress');
1921
+ request['vaultAddress'] = vaultAddress;
1922
+ }
1923
+ const response = await this.privatePostExchange(request);
1924
+ //
1925
+ // {
1926
+ // "status":"err",
1927
+ // "response":"Cannot set scheduled cancel time until enough volume traded. Required: $1000000. Traded: $373.47205."
1928
+ // }
1929
+ //
1930
+ return response;
1931
+ }
1932
+ editOrdersRequest(orders, params = {}) {
1933
+ this.checkRequiredCredentials();
1934
+ let hasClientOrderId = false;
1935
+ for (let i = 0; i < orders.length; i++) {
1936
+ const rawOrder = orders[i];
1937
+ const orderParams = this.safeDict(rawOrder, 'params', {});
1938
+ const clientOrderId = this.safeString2(orderParams, 'clientOrderId', 'client_id');
1939
+ if (clientOrderId !== undefined) {
1940
+ hasClientOrderId = true;
1941
+ }
1942
+ }
1943
+ if (hasClientOrderId) {
1944
+ for (let i = 0; i < orders.length; i++) {
1945
+ const rawOrder = orders[i];
1946
+ const orderParams = this.safeDict(rawOrder, 'params', {});
1947
+ const clientOrderId = this.safeString2(orderParams, 'clientOrderId', 'client_id');
1948
+ if (clientOrderId === undefined) {
1949
+ throw new ArgumentsRequired(this.id + ' editOrders() all orders must have clientOrderId if at least one has a clientOrderId');
1950
+ }
1951
+ }
1952
+ }
1953
+ params = this.omit(params, ['slippage', 'clientOrderId', 'client_id', 'slippage', 'triggerPrice', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'timeInForce']);
1954
+ const modifies = [];
1955
+ for (let i = 0; i < orders.length; i++) {
1956
+ const rawOrder = orders[i];
1957
+ const id = this.safeString(rawOrder, 'id');
1958
+ const marketId = this.safeString(rawOrder, 'symbol');
1959
+ const market = this.market(marketId);
1960
+ const symbol = market['symbol'];
1961
+ const type = this.safeStringUpper(rawOrder, 'type');
1962
+ const isMarket = (type === 'MARKET');
1963
+ const side = this.safeStringUpper(rawOrder, 'side');
1964
+ const isBuy = (side === 'BUY');
1965
+ const amount = this.safeString(rawOrder, 'amount');
1966
+ const price = this.safeString(rawOrder, 'price');
1967
+ let orderParams = this.safeDict(rawOrder, 'params', {});
1968
+ const defaultSlippage = this.safeString(this.options, 'defaultSlippage');
1969
+ const slippage = this.safeString(orderParams, 'slippage', defaultSlippage);
1970
+ let defaultTimeInForce = (isMarket) ? 'ioc' : 'gtc';
1971
+ const postOnly = this.safeBool(orderParams, 'postOnly', false);
1972
+ if (postOnly) {
1973
+ defaultTimeInForce = 'alo';
1974
+ }
1975
+ let timeInForce = this.safeStringLower(orderParams, 'timeInForce', defaultTimeInForce);
1976
+ timeInForce = this.capitalize(timeInForce);
1977
+ const clientOrderId = this.safeString2(orderParams, 'clientOrderId', 'client_id');
1978
+ let triggerPrice = this.safeString2(orderParams, 'triggerPrice', 'stopPrice');
1979
+ const stopLossPrice = this.safeString(orderParams, 'stopLossPrice', triggerPrice);
1980
+ const takeProfitPrice = this.safeString(orderParams, 'takeProfitPrice');
1981
+ const isTrigger = (stopLossPrice || takeProfitPrice);
1982
+ const reduceOnly = this.safeBool(orderParams, 'reduceOnly', false);
1983
+ orderParams = this.omit(orderParams, ['slippage', 'timeInForce', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice', 'clientOrderId', 'client_id', 'postOnly', 'reduceOnly']);
1984
+ let px = this.numberToString(price);
1985
+ if (isMarket) {
1986
+ px = (isBuy) ? Precise.stringMul(px, Precise.stringAdd('1', slippage)) : Precise.stringMul(px, Precise.stringSub('1', slippage));
1987
+ px = this.priceToPrecision(symbol, px);
1988
+ }
1989
+ else {
1990
+ px = this.priceToPrecision(symbol, px);
1991
+ }
1992
+ const sz = this.amountToPrecision(symbol, amount);
1993
+ const orderType = {};
1994
+ if (isTrigger) {
1995
+ let isTp = false;
1996
+ if (takeProfitPrice !== undefined) {
1997
+ triggerPrice = this.priceToPrecision(symbol, takeProfitPrice);
1998
+ isTp = true;
1999
+ }
2000
+ else {
2001
+ triggerPrice = this.priceToPrecision(symbol, stopLossPrice);
2002
+ }
2003
+ orderType['trigger'] = {
2004
+ 'isMarket': isMarket,
2005
+ 'triggerPx': triggerPrice,
2006
+ 'tpsl': (isTp) ? 'tp' : 'sl',
2007
+ };
2008
+ }
2009
+ else {
2010
+ orderType['limit'] = {
2011
+ 'tif': timeInForce,
2012
+ };
2013
+ }
2014
+ if (triggerPrice === undefined) {
2015
+ triggerPrice = '0';
2016
+ }
2017
+ const orderReq = {
2018
+ 'a': this.parseToInt(market['baseId']),
2019
+ 'b': isBuy,
2020
+ 'p': px,
2021
+ 's': sz,
2022
+ 'r': reduceOnly,
2023
+ 't': orderType,
2024
+ // 'c': clientOrderId,
2025
+ };
2026
+ if (clientOrderId !== undefined) {
2027
+ orderReq['c'] = clientOrderId;
2028
+ }
2029
+ const modifyReq = {
2030
+ 'oid': this.parseToInt(id),
2031
+ 'order': orderReq,
2032
+ };
2033
+ modifies.push(modifyReq);
2034
+ }
2035
+ const nonce = this.milliseconds();
2036
+ const modifyAction = {
2037
+ 'type': 'batchModify',
2038
+ 'modifies': modifies,
2039
+ };
2040
+ let vaultAddress = undefined;
2041
+ [vaultAddress, params] = this.handleOptionAndParams(params, 'editOrder', 'vaultAddress');
2042
+ vaultAddress = this.formatVaultAddress(vaultAddress);
2043
+ const signature = this.signL1Action(modifyAction, nonce, vaultAddress);
2044
+ const request = {
2045
+ 'action': modifyAction,
2046
+ 'nonce': nonce,
2047
+ 'signature': signature,
2048
+ // 'vaultAddress': vaultAddress,
2049
+ };
2050
+ if (vaultAddress !== undefined) {
2051
+ request['vaultAddress'] = vaultAddress;
2052
+ }
2053
+ return request;
2054
+ }
2055
+ /**
2056
+ * @method
2057
+ * @name hyperliquid#editOrder
2058
+ * @description edit a trade order
2059
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders
2060
+ * @param {string} id cancel order id
2061
+ * @param {string} symbol unified symbol of the market to create an order in
2062
+ * @param {string} type 'market' or 'limit'
2063
+ * @param {string} side 'buy' or 'sell'
2064
+ * @param {float} amount how much of currency you want to trade in units of base currency
2065
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
2066
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2067
+ * @param {string} [params.timeInForce] 'Gtc', 'Ioc', 'Alo'
2068
+ * @param {bool} [params.postOnly] true or false whether the order is post-only
2069
+ * @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
2070
+ * @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
2071
+ * @param {string} [params.clientOrderId] client order id, (optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
2072
+ * @param {string} [params.vaultAddress] the vault address for order
2073
+ * @param {string} [params.subAccountAddress] sub account user address
2074
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2075
+ */
2076
+ async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
2077
+ await this.loadMarkets();
2078
+ if (id === undefined) {
2079
+ throw new ArgumentsRequired(this.id + ' editOrder() requires an id argument');
2080
+ }
2081
+ const [order, globalParams] = this.parseCreateEditOrderArgs(id, symbol, type, side, amount, price, params);
2082
+ const orders = await this.editOrders([order], globalParams);
2083
+ return orders[0];
2084
+ }
2085
+ /**
2086
+ * @method
2087
+ * @name hyperliquid#editOrders
2088
+ * @description edit a list of trade orders
2089
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders
2090
+ * @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
2091
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2092
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2093
+ */
2094
+ async editOrders(orders, params = {}) {
2095
+ await this.loadMarkets();
2096
+ const request = this.editOrdersRequest(orders, params);
2097
+ const response = await this.privatePostExchange(request);
2098
+ //
2099
+ // {
2100
+ // "status": "ok",
2101
+ // "response": {
2102
+ // "type": "order",
2103
+ // "data": {
2104
+ // "statuses": [
2105
+ // {
2106
+ // "resting": {
2107
+ // "oid": 5063830287
2108
+ // }
2109
+ // }
2110
+ // ]
2111
+ // }
2112
+ // }
2113
+ // }
2114
+ // when the order is filled immediately
2115
+ // {
2116
+ // "status":"ok",
2117
+ // "response":{
2118
+ // "type":"order",
2119
+ // "data":{
2120
+ // "statuses":[
2121
+ // {
2122
+ // "filled":{
2123
+ // "totalSz":"0.1",
2124
+ // "avgPx":"100.84",
2125
+ // "oid":6195281425
2126
+ // }
2127
+ // }
2128
+ // ]
2129
+ // }
2130
+ // }
2131
+ // }
2132
+ //
2133
+ const responseObject = this.safeDict(response, 'response', {});
2134
+ const dataObject = this.safeDict(responseObject, 'data', {});
2135
+ const statuses = this.safeList(dataObject, 'statuses', []);
2136
+ return this.parseOrders(statuses);
2137
+ }
2138
+ /**
2139
+ * @method
2140
+ * @name hyperliquid#createVault
2141
+ * @description creates a value
2142
+ * @param {string} name The name of the vault
2143
+ * @param {string} description The description of the vault
2144
+ * @param {number} initialUsd The initialUsd of the vault
2145
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2146
+ * @returns {object} the api result
2147
+ */
2148
+ async createVault(name, description, initialUsd, params = {}) {
2149
+ this.checkRequiredCredentials();
2150
+ await this.loadMarkets();
2151
+ const nonce = this.milliseconds();
2152
+ const request = {
2153
+ 'nonce': nonce,
2154
+ };
2155
+ const usd = this.parseToInt(Precise.stringMul(this.numberToString(initialUsd), '1000000'));
2156
+ const action = {
2157
+ 'type': 'createVault',
2158
+ 'name': name,
2159
+ 'description': description,
2160
+ 'initialUsd': usd,
2161
+ 'nonce': nonce,
2162
+ };
2163
+ const signature = this.signL1Action(action, nonce);
2164
+ request['action'] = action;
2165
+ request['signature'] = signature;
2166
+ const response = await this.privatePostExchange(this.extend(request, params));
2167
+ //
2168
+ // {
2169
+ // "status": "ok",
2170
+ // "response": {
2171
+ // "type": "createVault",
2172
+ // "data": "0x04fddcbc9ce80219301bd16f18491bedf2a8c2b8"
2173
+ // }
2174
+ // }
2175
+ //
2176
+ return response;
2177
+ }
2178
+ /**
2179
+ * @method
2180
+ * @name hyperliquid#fetchFundingRateHistory
2181
+ * @description fetches historical funding rate prices
2182
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-historical-funding-rates
2183
+ * @param {string} symbol unified symbol of the market to fetch the funding rate history for
2184
+ * @param {int} [since] timestamp in ms of the earliest funding rate to fetch
2185
+ * @param {int} [limit] the maximum amount of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure} to fetch
2186
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2187
+ * @param {int} [params.until] timestamp in ms of the latest funding rate
2188
+ * @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
2189
+ */
2190
+ async fetchFundingRateHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2191
+ await this.loadMarkets();
2192
+ if (symbol === undefined) {
2193
+ throw new ArgumentsRequired(this.id + ' fetchFundingRateHistory() requires a symbol argument');
2194
+ }
2195
+ const market = this.market(symbol);
2196
+ const request = {
2197
+ 'type': 'fundingHistory',
2198
+ 'coin': market['baseName'],
2199
+ };
2200
+ if (since !== undefined) {
2201
+ request['startTime'] = since;
2202
+ }
2203
+ else {
2204
+ const maxLimit = (limit === undefined) ? 500 : limit;
2205
+ request['startTime'] = this.milliseconds() - maxLimit * 60 * 60 * 1000;
2206
+ }
2207
+ const until = this.safeInteger(params, 'until');
2208
+ params = this.omit(params, 'until');
2209
+ if (until !== undefined) {
2210
+ request['endTime'] = until;
2211
+ }
2212
+ const response = await this.publicPostInfo(this.extend(request, params));
2213
+ //
2214
+ // [
2215
+ // {
2216
+ // "coin": "ETH",
2217
+ // "fundingRate": "0.0000125",
2218
+ // "premium": "0.00057962",
2219
+ // "time": 1704290400031
2220
+ // }
2221
+ // ]
2222
+ //
2223
+ const result = [];
2224
+ for (let i = 0; i < response.length; i++) {
2225
+ const entry = response[i];
2226
+ const timestamp = this.safeInteger(entry, 'time');
2227
+ result.push({
2228
+ 'info': entry,
2229
+ 'symbol': this.safeSymbol(undefined, market),
2230
+ 'fundingRate': this.safeNumber(entry, 'fundingRate'),
2231
+ 'timestamp': timestamp,
2232
+ 'datetime': this.iso8601(timestamp),
2233
+ });
2234
+ }
2235
+ const sorted = this.sortBy(result, 'timestamp');
2236
+ return this.filterBySymbolSinceLimit(sorted, symbol, since, limit);
2237
+ }
2238
+ /**
2239
+ * @method
2240
+ * @name hyperliquid#fetchOpenOrders
2241
+ * @description fetch all unfilled currently open orders
2242
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-open-orders
2243
+ * @param {string} symbol unified market symbol
2244
+ * @param {int} [since] the earliest time in ms to fetch open orders for
2245
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
2246
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2247
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2248
+ * @param {string} [params.method] 'openOrders' or 'frontendOpenOrders' default is 'frontendOpenOrders'
2249
+ * @param {string} [params.subAccountAddress] sub account user address
2250
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2251
+ */
2252
+ async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2253
+ let userAddress = undefined;
2254
+ [userAddress, params] = this.handlePublicAddress('fetchOpenOrders', params);
2255
+ let method = undefined;
2256
+ [method, params] = this.handleOptionAndParams(params, 'fetchOpenOrders', 'method', 'frontendOpenOrders');
2257
+ await this.loadMarkets();
2258
+ const market = this.safeMarket(symbol);
2259
+ const request = {
2260
+ 'type': method,
2261
+ 'user': userAddress,
2262
+ };
2263
+ const response = await this.publicPostInfo(this.extend(request, params));
2264
+ //
2265
+ // [
2266
+ // {
2267
+ // "coin": "ETH",
2268
+ // "limitPx": "2000.0",
2269
+ // "oid": 3991946565,
2270
+ // "origSz": "0.1",
2271
+ // "side": "B",
2272
+ // "sz": "0.1",
2273
+ // "timestamp": 1704346468838
2274
+ // }
2275
+ // ]
2276
+ //
2277
+ const orderWithStatus = [];
2278
+ for (let i = 0; i < response.length; i++) {
2279
+ const order = response[i];
2280
+ const extendOrder = {};
2281
+ if (this.safeString(order, 'status') === undefined) {
2282
+ extendOrder['ccxtStatus'] = 'open';
2283
+ }
2284
+ orderWithStatus.push(this.extend(order, extendOrder));
2285
+ }
2286
+ return this.parseOrders(orderWithStatus, market, since, limit);
2287
+ }
2288
+ /**
2289
+ * @method
2290
+ * @name hyperliquid#fetchClosedOrders
2291
+ * @description fetch all unfilled currently closed orders
2292
+ * @param {string} symbol unified market symbol
2293
+ * @param {int} [since] the earliest time in ms to fetch open orders for
2294
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
2295
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2296
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2297
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2298
+ */
2299
+ async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2300
+ await this.loadMarkets();
2301
+ const orders = await this.fetchOrders(symbol, undefined, undefined, params); // don't filter here because we don't want to catch open orders
2302
+ const closedOrders = this.filterByArray(orders, 'status', ['closed'], false);
2303
+ return this.filterBySymbolSinceLimit(closedOrders, symbol, since, limit);
2304
+ }
2305
+ /**
2306
+ * @method
2307
+ * @name hyperliquid#fetchCanceledOrders
2308
+ * @description fetch all canceled orders
2309
+ * @param {string} symbol unified market symbol
2310
+ * @param {int} [since] the earliest time in ms to fetch open orders for
2311
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
2312
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2313
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2314
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2315
+ */
2316
+ async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2317
+ await this.loadMarkets();
2318
+ const orders = await this.fetchOrders(symbol, undefined, undefined, params); // don't filter here because we don't want to catch open orders
2319
+ const closedOrders = this.filterByArray(orders, 'status', ['canceled'], false);
2320
+ return this.filterBySymbolSinceLimit(closedOrders, symbol, since, limit);
2321
+ }
2322
+ /**
2323
+ * @method
2324
+ * @name hyperliquid#fetchCanceledAndClosedOrders
2325
+ * @description fetch all closed and canceled orders
2326
+ * @param {string} symbol unified market symbol
2327
+ * @param {int} [since] the earliest time in ms to fetch open orders for
2328
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
2329
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2330
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2331
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2332
+ */
2333
+ async fetchCanceledAndClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2334
+ await this.loadMarkets();
2335
+ const orders = await this.fetchOrders(symbol, undefined, undefined, params); // don't filter here because we don't want to catch open orders
2336
+ const closedOrders = this.filterByArray(orders, 'status', ['canceled', 'closed', 'rejected'], false);
2337
+ return this.filterBySymbolSinceLimit(closedOrders, symbol, since, limit);
2338
+ }
2339
+ /**
2340
+ * @method
2341
+ * @name hyperliquid#fetchOrders
2342
+ * @description fetch all orders
2343
+ * @param {string} symbol unified market symbol
2344
+ * @param {int} [since] the earliest time in ms to fetch open orders for
2345
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
2346
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2347
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2348
+ * @param {string} [params.subAccountAddress] sub account user address
2349
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2350
+ */
2351
+ async fetchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2352
+ let userAddress = undefined;
2353
+ [userAddress, params] = this.handlePublicAddress('fetchOrders', params);
2354
+ await this.loadMarkets();
2355
+ const market = this.safeMarket(symbol);
2356
+ const request = {
2357
+ 'type': 'historicalOrders',
2358
+ 'user': userAddress,
2359
+ };
2360
+ const response = await this.publicPostInfo(this.extend(request, params));
2361
+ //
2362
+ // [
2363
+ // {
2364
+ // "coin": "ETH",
2365
+ // "limitPx": "2000.0",
2366
+ // "oid": 3991946565,
2367
+ // "origSz": "0.1",
2368
+ // "side": "B",
2369
+ // "sz": "0.1",
2370
+ // "timestamp": 1704346468838
2371
+ // }
2372
+ // ]
2373
+ //
2374
+ return this.parseOrders(response, market, since, limit);
2375
+ }
2376
+ /**
2377
+ * @method
2378
+ * @name hyperliquid#fetchOrder
2379
+ * @description fetches information on an order made by the user
2380
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#query-order-status-by-oid-or-cloid
2381
+ * @param {string} id order id
2382
+ * @param {string} symbol unified symbol of the market the order was made in
2383
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2384
+ * @param {string} [params.clientOrderId] client order id, (optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
2385
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2386
+ * @param {string} [params.subAccountAddress] sub account user address
2387
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2388
+ */
2389
+ async fetchOrder(id, symbol = undefined, params = {}) {
2390
+ let userAddress = undefined;
2391
+ [userAddress, params] = this.handlePublicAddress('fetchOrder', params);
2392
+ await this.loadMarkets();
2393
+ const market = this.safeMarket(symbol);
2394
+ const clientOrderId = this.safeString(params, 'clientOrderId');
2395
+ const request = {
2396
+ 'type': 'orderStatus',
2397
+ // 'oid': isClientOrderId ? id : this.parseToNumeric (id),
2398
+ 'user': userAddress,
2399
+ };
2400
+ if (clientOrderId !== undefined) {
2401
+ params = this.omit(params, 'clientOrderId');
2402
+ request['oid'] = clientOrderId;
2403
+ }
2404
+ else {
2405
+ const isClientOrderId = id.length >= 34;
2406
+ request['oid'] = isClientOrderId ? id : this.parseToNumeric(id);
2407
+ }
2408
+ const response = await this.publicPostInfo(this.extend(request, params));
2409
+ //
2410
+ // {
2411
+ // "order": {
2412
+ // "order": {
2413
+ // "children": [],
2414
+ // "cloid": null,
2415
+ // "coin": "ETH",
2416
+ // "isPositionTpsl": false,
2417
+ // "isTrigger": false,
2418
+ // "limitPx": "2000.0",
2419
+ // "oid": "3991946565",
2420
+ // "orderType": "Limit",
2421
+ // "origSz": "0.1",
2422
+ // "reduceOnly": false,
2423
+ // "side": "B",
2424
+ // "sz": "0.1",
2425
+ // "tif": "Gtc",
2426
+ // "timestamp": "1704346468838",
2427
+ // "triggerCondition": "N/A",
2428
+ // "triggerPx": "0.0"
2429
+ // },
2430
+ // "status": "open",
2431
+ // "statusTimestamp": "1704346468838"
2432
+ // },
2433
+ // "status": "order"
2434
+ // }
2435
+ //
2436
+ const data = this.safeDict(response, 'order');
2437
+ return this.parseOrder(data, market);
2438
+ }
2439
+ parseOrder(order, market = undefined) {
2440
+ //
2441
+ // createOrdersWs error
2442
+ //
2443
+ // {error: 'Insufficient margin to place order. asset=159'}
2444
+ //
2445
+ // fetchOpenOrders
2446
+ //
2447
+ // {
2448
+ // "coin": "ETH",
2449
+ // "limitPx": "2000.0",
2450
+ // "oid": 3991946565,
2451
+ // "origSz": "0.1",
2452
+ // "side": "B",
2453
+ // "sz": "0.1",
2454
+ // "timestamp": 1704346468838
2455
+ // }
2456
+ // fetchClosedorders
2457
+ // {
2458
+ // "cloid": null,
2459
+ // "closedPnl": "0.0",
2460
+ // "coin": "SOL",
2461
+ // "crossed": true,
2462
+ // "dir": "Open Long",
2463
+ // "fee": "0.003879",
2464
+ // "hash": "0x4a2647998682b7f07bc5040ab531e1011400f9a51bfa0346a0b41ebe510e8875",
2465
+ // "liquidationMarkPx": null,
2466
+ // "oid": "6463280784",
2467
+ // "px": "110.83",
2468
+ // "side": "B",
2469
+ // "startPosition": "1.64",
2470
+ // "sz": "0.1",
2471
+ // "tid": "232174667018988",
2472
+ // "time": "1709142268394"
2473
+ // }
2474
+ //
2475
+ // fetchOrder
2476
+ //
2477
+ // {
2478
+ // "order": {
2479
+ // "children": [],
2480
+ // "cloid": null,
2481
+ // "coin": "ETH",
2482
+ // "isPositionTpsl": false,
2483
+ // "isTrigger": false,
2484
+ // "limitPx": "2000.0",
2485
+ // "oid": "3991946565",
2486
+ // "orderType": "Limit",
2487
+ // "origSz": "0.1",
2488
+ // "reduceOnly": false,
2489
+ // "side": "B",
2490
+ // "sz": "0.1",
2491
+ // "tif": "Gtc",
2492
+ // "timestamp": "1704346468838",
2493
+ // "triggerCondition": "N/A",
2494
+ // "triggerPx": "0.0"
2495
+ // },
2496
+ // "status": "open",
2497
+ // "statusTimestamp": "1704346468838"
2498
+ // }
2499
+ //
2500
+ // createOrder
2501
+ //
2502
+ // {
2503
+ // "resting": {
2504
+ // "oid": 5063830287
2505
+ // }
2506
+ // }
2507
+ //
2508
+ // {
2509
+ // "filled":{
2510
+ // "totalSz":"0.1",
2511
+ // "avgPx":"100.84",
2512
+ // "oid":6195281425
2513
+ // }
2514
+ // }
2515
+ // frontendOrder
2516
+ // {
2517
+ // "children": [],
2518
+ // "cloid": null,
2519
+ // "coin": "BLUR",
2520
+ // "isPositionTpsl": false,
2521
+ // "isTrigger": true,
2522
+ // "limitPx": "0.5",
2523
+ // "oid": 8670487141,
2524
+ // "orderType": "Stop Limit",
2525
+ // "origSz": "20.0",
2526
+ // "reduceOnly": false,
2527
+ // "side": "B",
2528
+ // "sz": "20.0",
2529
+ // "tif": null,
2530
+ // "timestamp": 1715523663687,
2531
+ // "triggerCondition": "Price above 0.6",
2532
+ // "triggerPx": "0.6"
2533
+ // }
2534
+ //
2535
+ const error = this.safeString(order, 'error');
2536
+ if (error !== undefined) {
2537
+ return this.safeOrder({
2538
+ 'info': order,
2539
+ 'status': 'rejected',
2540
+ });
2541
+ }
2542
+ let entry = this.safeDictN(order, ['order', 'resting', 'filled']);
2543
+ if (entry === undefined) {
2544
+ entry = order;
2545
+ }
2546
+ const coin = this.safeString(entry, 'coin');
2547
+ let marketId = undefined;
2548
+ if (coin !== undefined) {
2549
+ marketId = this.coinToMarketId(coin);
2550
+ }
2551
+ if (this.safeString(entry, 'id') === undefined) {
2552
+ market = this.safeMarket(marketId, undefined);
2553
+ }
2554
+ else {
2555
+ market = this.safeMarket(marketId, market);
2556
+ }
2557
+ const symbol = market['symbol'];
2558
+ const timestamp = this.safeInteger(entry, 'timestamp');
2559
+ const status = this.safeString2(order, 'status', 'ccxtStatus');
2560
+ order = this.omit(order, ['ccxtStatus']);
2561
+ let side = this.safeString(entry, 'side');
2562
+ if (side !== undefined) {
2563
+ side = (side === 'A') ? 'sell' : 'buy';
2564
+ }
2565
+ const totalAmount = this.safeString2(entry, 'origSz', 'totalSz');
2566
+ const remaining = this.safeString(entry, 'sz');
2567
+ const tif = this.safeStringUpper(entry, 'tif');
2568
+ let postOnly = undefined;
2569
+ if (tif !== undefined) {
2570
+ postOnly = (tif === 'ALO');
2571
+ }
2572
+ return this.safeOrder({
2573
+ 'info': order,
2574
+ 'id': this.safeString(entry, 'oid'),
2575
+ 'clientOrderId': this.safeString(entry, 'cloid'),
2576
+ 'timestamp': timestamp,
2577
+ 'datetime': this.iso8601(timestamp),
2578
+ 'lastTradeTimestamp': undefined,
2579
+ 'lastUpdateTimestamp': this.safeInteger(order, 'statusTimestamp'),
2580
+ 'symbol': symbol,
2581
+ 'type': this.parseOrderType(this.safeStringLower(entry, 'orderType')),
2582
+ 'timeInForce': tif,
2583
+ 'postOnly': postOnly,
2584
+ 'reduceOnly': this.safeBool(entry, 'reduceOnly'),
2585
+ 'side': side,
2586
+ 'price': this.safeString(entry, 'limitPx'),
2587
+ 'triggerPrice': this.safeBool(entry, 'isTrigger') ? this.safeNumber(entry, 'triggerPx') : undefined,
2588
+ 'amount': totalAmount,
2589
+ 'cost': undefined,
2590
+ 'average': this.safeString(entry, 'avgPx'),
2591
+ 'filled': Precise.stringSub(totalAmount, remaining),
2592
+ 'remaining': remaining,
2593
+ 'status': this.parseOrderStatus(status),
2594
+ 'fee': undefined,
2595
+ 'trades': undefined,
2596
+ }, market);
2597
+ }
2598
+ parseOrderStatus(status) {
2599
+ if (status === undefined) {
2600
+ return undefined;
2601
+ }
2602
+ const statuses = {
2603
+ 'triggered': 'open',
2604
+ 'filled': 'closed',
2605
+ 'open': 'open',
2606
+ 'canceled': 'canceled',
2607
+ 'rejected': 'rejected',
2608
+ 'marginCanceled': 'canceled',
2609
+ };
2610
+ if (status.endsWith('Rejected')) {
2611
+ return 'rejected';
2612
+ }
2613
+ if (status.endsWith('Canceled')) {
2614
+ return 'canceled';
2615
+ }
2616
+ return this.safeString(statuses, status, status);
2617
+ }
2618
+ parseOrderType(status) {
2619
+ const statuses = {
2620
+ 'stop limit': 'limit',
2621
+ 'stop market': 'market',
2622
+ };
2623
+ return this.safeString(statuses, status, status);
2624
+ }
2625
+ /**
2626
+ * @method
2627
+ * @name hyperliquid#fetchMyTrades
2628
+ * @description fetch all trades made by the user
2629
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills
2630
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint#retrieve-a-users-fills-by-time
2631
+ * @param {string} symbol unified market symbol
2632
+ * @param {int} [since] the earliest time in ms to fetch trades for
2633
+ * @param {int} [limit] the maximum number of trades structures to retrieve
2634
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2635
+ * @param {int} [params.until] timestamp in ms of the latest trade
2636
+ * @param {string} [params.subAccountAddress] sub account user address
2637
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
2638
+ */
2639
+ async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2640
+ let userAddress = undefined;
2641
+ [userAddress, params] = this.handlePublicAddress('fetchMyTrades', params);
2642
+ await this.loadMarkets();
2643
+ const market = this.safeMarket(symbol);
2644
+ const request = {
2645
+ 'user': userAddress,
2646
+ };
2647
+ if (since !== undefined) {
2648
+ request['type'] = 'userFillsByTime';
2649
+ request['startTime'] = since;
2650
+ }
2651
+ else {
2652
+ request['type'] = 'userFills';
2653
+ }
2654
+ const until = this.safeInteger(params, 'until');
2655
+ params = this.omit(params, 'until');
2656
+ if (until !== undefined) {
2657
+ request['endTime'] = until;
2658
+ }
2659
+ const response = await this.publicPostInfo(this.extend(request, params));
2660
+ //
2661
+ // [
2662
+ // {
2663
+ // "closedPnl": "0.19343",
2664
+ // "coin": "ETH",
2665
+ // "crossed": true,
2666
+ // "dir": "Close Long",
2667
+ // "fee": "0.050062",
2668
+ // "feeToken": "USDC",
2669
+ // "hash": "0x09d77c96791e98b5775a04092584ab010d009445119c71e4005c0d634ea322bc",
2670
+ // "liquidationMarkPx": null,
2671
+ // "oid": 3929354691,
2672
+ // "px": "2381.1",
2673
+ // "side": "A",
2674
+ // "startPosition": "0.0841",
2675
+ // "sz": "0.0841",
2676
+ // "tid": 128423918764978,
2677
+ // "time": 1704262888911
2678
+ // }
2679
+ // ]
2680
+ //
2681
+ return this.parseTrades(response, market, since, limit);
2682
+ }
2683
+ parseTrade(trade, market = undefined) {
2684
+ //
2685
+ // {
2686
+ // "closedPnl": "0.19343",
2687
+ // "coin": "ETH",
2688
+ // "crossed": true,
2689
+ // "dir": "Close Long",
2690
+ // "fee": "0.050062",
2691
+ // "hash": "0x09d77c96791e98b5775a04092584ab010d009445119c71e4005c0d634ea322bc",
2692
+ // "liquidationMarkPx": null,
2693
+ // "oid": 3929354691,
2694
+ // "px": "2381.1",
2695
+ // "side": "A",
2696
+ // "startPosition": "0.0841",
2697
+ // "sz": "0.0841",
2698
+ // "tid": 128423918764978,
2699
+ // "time": 1704262888911
2700
+ // }
2701
+ //
2702
+ const timestamp = this.safeInteger(trade, 'time');
2703
+ const price = this.safeString(trade, 'px');
2704
+ const amount = this.safeString(trade, 'sz');
2705
+ const coin = this.safeString(trade, 'coin');
2706
+ const marketId = this.coinToMarketId(coin);
2707
+ market = this.safeMarket(marketId, undefined);
2708
+ const symbol = market['symbol'];
2709
+ const id = this.safeString(trade, 'tid');
2710
+ let side = this.safeString(trade, 'side');
2711
+ if (side !== undefined) {
2712
+ side = (side === 'A') ? 'sell' : 'buy';
2713
+ }
2714
+ const fee = this.safeString(trade, 'fee');
2715
+ let takerOrMaker = undefined;
2716
+ const crossed = this.safeBool(trade, 'crossed');
2717
+ if (crossed !== undefined) {
2718
+ takerOrMaker = crossed ? 'taker' : 'maker';
2719
+ }
2720
+ return this.safeTrade({
2721
+ 'info': trade,
2722
+ 'timestamp': timestamp,
2723
+ 'datetime': this.iso8601(timestamp),
2724
+ 'symbol': symbol,
2725
+ 'id': id,
2726
+ 'order': this.safeString(trade, 'oid'),
2727
+ 'type': undefined,
2728
+ 'side': side,
2729
+ 'takerOrMaker': takerOrMaker,
2730
+ 'price': price,
2731
+ 'amount': amount,
2732
+ 'cost': undefined,
2733
+ 'fee': {
2734
+ 'cost': fee,
2735
+ 'currency': this.safeString(trade, 'feeToken'),
2736
+ 'rate': undefined,
2737
+ },
2738
+ }, market);
2739
+ }
2740
+ /**
2741
+ * @method
2742
+ * @name hyperliquid#fetchPosition
2743
+ * @description fetch data on an open position
2744
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary
2745
+ * @param {string} symbol unified market symbol of the market the position is held in
2746
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2747
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2748
+ * @returns {object} a [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
2749
+ */
2750
+ async fetchPosition(symbol, params = {}) {
2751
+ const positions = await this.fetchPositions([symbol], params);
2752
+ return this.safeDict(positions, 0, {});
2753
+ }
2754
+ /**
2755
+ * @method
2756
+ * @name hyperliquid#fetchPositions
2757
+ * @description fetch all open positions
2758
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/info-endpoint/perpetuals#retrieve-users-perpetuals-account-summary
2759
+ * @param {string[]} [symbols] list of unified market symbols
2760
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2761
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
2762
+ * @param {string} [params.subAccountAddress] sub account user address
2763
+ * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
2764
+ */
2765
+ async fetchPositions(symbols = undefined, params = {}) {
2766
+ await this.loadMarkets();
2767
+ let userAddress = undefined;
2768
+ [userAddress, params] = this.handlePublicAddress('fetchPositions', params);
2769
+ symbols = this.marketSymbols(symbols);
2770
+ const request = {
2771
+ 'type': 'clearinghouseState',
2772
+ 'user': userAddress,
2773
+ };
2774
+ const response = await this.publicPostInfo(this.extend(request, params));
2775
+ //
2776
+ // {
2777
+ // "assetPositions": [
2778
+ // {
2779
+ // "position": {
2780
+ // "coin": "ETH",
2781
+ // "cumFunding": {
2782
+ // "allTime": "0.0",
2783
+ // "sinceChange": "0.0",
2784
+ // "sinceOpen": "0.0"
2785
+ // },
2786
+ // "entryPx": "2213.9",
2787
+ // "leverage": {
2788
+ // "rawUsd": "-475.23904",
2789
+ // "type": "isolated",
2790
+ // "value": "20"
2791
+ // },
2792
+ // "liquidationPx": "2125.00856238",
2793
+ // "marginUsed": "24.88097",
2794
+ // "maxLeverage": "50",
2795
+ // "positionValue": "500.12001",
2796
+ // "returnOnEquity": "0.0",
2797
+ // "szi": "0.2259",
2798
+ // "unrealizedPnl": "0.0"
2799
+ // },
2800
+ // "type": "oneWay"
2801
+ // }
2802
+ // ],
2803
+ // "crossMaintenanceMarginUsed": "0.0",
2804
+ // "crossMarginSummary": {
2805
+ // "accountValue": "100.0",
2806
+ // "totalMarginUsed": "0.0",
2807
+ // "totalNtlPos": "0.0",
2808
+ // "totalRawUsd": "100.0"
2809
+ // },
2810
+ // "marginSummary": {
2811
+ // "accountValue": "100.0",
2812
+ // "totalMarginUsed": "0.0",
2813
+ // "totalNtlPos": "0.0",
2814
+ // "totalRawUsd": "100.0"
2815
+ // },
2816
+ // "time": "1704261007014",
2817
+ // "withdrawable": "100.0"
2818
+ // }
2819
+ //
2820
+ const data = this.safeList(response, 'assetPositions', []);
2821
+ const result = [];
2822
+ for (let i = 0; i < data.length; i++) {
2823
+ result.push(this.parsePosition(data[i], undefined));
2824
+ }
2825
+ return this.filterByArrayPositions(result, 'symbol', symbols, false);
2826
+ }
2827
+ parsePosition(position, market = undefined) {
2828
+ //
2829
+ // {
2830
+ // "position": {
2831
+ // "coin": "ETH",
2832
+ // "cumFunding": {
2833
+ // "allTime": "0.0",
2834
+ // "sinceChange": "0.0",
2835
+ // "sinceOpen": "0.0"
2836
+ // },
2837
+ // "entryPx": "2213.9",
2838
+ // "leverage": {
2839
+ // "rawUsd": "-475.23904",
2840
+ // "type": "isolated",
2841
+ // "value": "20"
2842
+ // },
2843
+ // "liquidationPx": "2125.00856238",
2844
+ // "marginUsed": "24.88097",
2845
+ // "maxLeverage": "50",
2846
+ // "positionValue": "500.12001",
2847
+ // "returnOnEquity": "0.0",
2848
+ // "szi": "0.2259",
2849
+ // "unrealizedPnl": "0.0"
2850
+ // },
2851
+ // "type": "oneWay"
2852
+ // }
2853
+ //
2854
+ const entry = this.safeDict(position, 'position', {});
2855
+ const coin = this.safeString(entry, 'coin');
2856
+ const marketId = this.coinToMarketId(coin);
2857
+ market = this.safeMarket(marketId, undefined);
2858
+ const symbol = market['symbol'];
2859
+ const leverage = this.safeDict(entry, 'leverage', {});
2860
+ const marginMode = this.safeString(leverage, 'type');
2861
+ const isIsolated = (marginMode === 'isolated');
2862
+ const rawSize = this.safeString(entry, 'szi');
2863
+ let size = rawSize;
2864
+ let side = undefined;
2865
+ if (size !== undefined) {
2866
+ side = Precise.stringGt(rawSize, '0') ? 'long' : 'short';
2867
+ size = Precise.stringAbs(size);
2868
+ }
2869
+ const rawUnrealizedPnl = this.safeString(entry, 'unrealizedPnl');
2870
+ const absRawUnrealizedPnl = Precise.stringAbs(rawUnrealizedPnl);
2871
+ const initialMargin = this.safeString(entry, 'marginUsed');
2872
+ const percentage = Precise.stringMul(Precise.stringDiv(absRawUnrealizedPnl, initialMargin), '100');
2873
+ return this.safePosition({
2874
+ 'info': position,
2875
+ 'id': undefined,
2876
+ 'symbol': symbol,
2877
+ 'timestamp': undefined,
2878
+ 'datetime': undefined,
2879
+ 'isolated': isIsolated,
2880
+ 'hedged': undefined,
2881
+ 'side': side,
2882
+ 'contracts': this.parseNumber(size),
2883
+ 'contractSize': undefined,
2884
+ 'entryPrice': this.safeNumber(entry, 'entryPx'),
2885
+ 'markPrice': undefined,
2886
+ 'notional': this.safeNumber(entry, 'positionValue'),
2887
+ 'leverage': this.safeNumber(leverage, 'value'),
2888
+ 'collateral': this.safeNumber(entry, 'marginUsed'),
2889
+ 'initialMargin': this.parseNumber(initialMargin),
2890
+ 'maintenanceMargin': undefined,
2891
+ 'initialMarginPercentage': undefined,
2892
+ 'maintenanceMarginPercentage': undefined,
2893
+ 'unrealizedPnl': this.parseNumber(rawUnrealizedPnl),
2894
+ 'liquidationPrice': this.safeNumber(entry, 'liquidationPx'),
2895
+ 'marginMode': marginMode,
2896
+ 'percentage': this.parseNumber(percentage),
2897
+ });
2898
+ }
2899
+ /**
2900
+ * @method
2901
+ * @name hyperliquid#setMarginMode
2902
+ * @description set margin mode (symbol)
2903
+ * @param {string} marginMode margin mode must be either [isolated, cross]
2904
+ * @param {string} symbol unified market symbol of the market the position is held in, default is undefined
2905
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2906
+ * @param {string} [params.leverage] the rate of leverage, is required if setting trade mode (symbol)
2907
+ * @param {string} [params.vaultAddress] the vault address
2908
+ * @param {string} [params.subAccountAddress] sub account user address
2909
+ * @returns {object} response from the exchange
2910
+ */
2911
+ async setMarginMode(marginMode, symbol = undefined, params = {}) {
2912
+ if (symbol === undefined) {
2913
+ throw new ArgumentsRequired(this.id + ' setMarginMode() requires a symbol argument');
2914
+ }
2915
+ await this.loadMarkets();
2916
+ const market = this.market(symbol);
2917
+ const leverage = this.safeInteger(params, 'leverage');
2918
+ if (leverage === undefined) {
2919
+ throw new ArgumentsRequired(this.id + ' setMarginMode() requires a leverage parameter');
2920
+ }
2921
+ const asset = this.parseToInt(market['baseId']);
2922
+ const isCross = (marginMode === 'cross');
2923
+ const nonce = this.milliseconds();
2924
+ params = this.omit(params, ['leverage']);
2925
+ const updateAction = {
2926
+ 'type': 'updateLeverage',
2927
+ 'asset': asset,
2928
+ 'isCross': isCross,
2929
+ 'leverage': leverage,
2930
+ };
2931
+ let vaultAddress = undefined;
2932
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'setMarginMode', 'vaultAddress', 'subAccountAddress');
2933
+ if (vaultAddress !== undefined) {
2934
+ if (vaultAddress.startsWith('0x')) {
2935
+ vaultAddress = vaultAddress.replace('0x', '');
2936
+ }
2937
+ }
2938
+ const signature = this.signL1Action(updateAction, nonce, vaultAddress);
2939
+ const request = {
2940
+ 'action': updateAction,
2941
+ 'nonce': nonce,
2942
+ 'signature': signature,
2943
+ // 'vaultAddress': vaultAddress,
2944
+ };
2945
+ if (vaultAddress !== undefined) {
2946
+ request['vaultAddress'] = vaultAddress;
2947
+ }
2948
+ const response = await this.privatePostExchange(request);
2949
+ //
2950
+ // {
2951
+ // 'response': {
2952
+ // 'type': 'default'
2953
+ // },
2954
+ // 'status': 'ok'
2955
+ // }
2956
+ //
2957
+ return response;
2958
+ }
2959
+ /**
2960
+ * @method
2961
+ * @name hyperliquid#setLeverage
2962
+ * @description set the level of leverage for a market
2963
+ * @param {float} leverage the rate of leverage
2964
+ * @param {string} symbol unified market symbol
2965
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2966
+ * @param {string} [params.marginMode] margin mode must be either [isolated, cross], default is cross
2967
+ * @returns {object} response from the exchange
2968
+ */
2969
+ async setLeverage(leverage, symbol = undefined, params = {}) {
2970
+ if (symbol === undefined) {
2971
+ throw new ArgumentsRequired(this.id + ' setLeverage() requires a symbol argument');
2972
+ }
2973
+ await this.loadMarkets();
2974
+ const market = this.market(symbol);
2975
+ const marginMode = this.safeString(params, 'marginMode', 'cross');
2976
+ const isCross = (marginMode === 'cross');
2977
+ const asset = this.parseToInt(market['baseId']);
2978
+ const nonce = this.milliseconds();
2979
+ params = this.omit(params, 'marginMode');
2980
+ const updateAction = {
2981
+ 'type': 'updateLeverage',
2982
+ 'asset': asset,
2983
+ 'isCross': isCross,
2984
+ 'leverage': leverage,
2985
+ };
2986
+ let vaultAddress = undefined;
2987
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'setLeverage', 'vaultAddress', 'subAccountAddress');
2988
+ vaultAddress = this.formatVaultAddress(vaultAddress);
2989
+ const signature = this.signL1Action(updateAction, nonce, vaultAddress);
2990
+ const request = {
2991
+ 'action': updateAction,
2992
+ 'nonce': nonce,
2993
+ 'signature': signature,
2994
+ // 'vaultAddress': vaultAddress,
2995
+ };
2996
+ if (vaultAddress !== undefined) {
2997
+ params = this.omit(params, 'vaultAddress');
2998
+ request['vaultAddress'] = vaultAddress;
2999
+ }
3000
+ const response = await this.privatePostExchange(request);
3001
+ //
3002
+ // {
3003
+ // 'response': {
3004
+ // 'type': 'default'
3005
+ // },
3006
+ // 'status': 'ok'
3007
+ // }
3008
+ //
3009
+ return response;
3010
+ }
3011
+ /**
3012
+ * @method
3013
+ * @name hyperliquid#addMargin
3014
+ * @description add margin
3015
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin
3016
+ * @param {string} symbol unified market symbol
3017
+ * @param {float} amount amount of margin to add
3018
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3019
+ * @param {string} [params.vaultAddress] the vault address
3020
+ * @param {string} [params.subAccountAddress] sub account user address
3021
+ * @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=add-margin-structure}
3022
+ */
3023
+ async addMargin(symbol, amount, params = {}) {
3024
+ return await this.modifyMarginHelper(symbol, amount, 'add', params);
3025
+ }
3026
+ /**
3027
+ * @method
3028
+ * @name hyperliquid#reduceMargin
3029
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#update-isolated-margin
3030
+ * @description remove margin from a position
3031
+ * @param {string} symbol unified market symbol
3032
+ * @param {float} amount the amount of margin to remove
3033
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3034
+ * @param {string} [params.vaultAddress] the vault address
3035
+ * @param {string} [params.subAccountAddress] sub account user address
3036
+ * @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=reduce-margin-structure}
3037
+ */
3038
+ async reduceMargin(symbol, amount, params = {}) {
3039
+ return await this.modifyMarginHelper(symbol, amount, 'reduce', params);
3040
+ }
3041
+ async modifyMarginHelper(symbol, amount, type, params = {}) {
3042
+ await this.loadMarkets();
3043
+ const market = this.market(symbol);
3044
+ const asset = this.parseToInt(market['baseId']);
3045
+ let sz = this.parseToInt(Precise.stringMul(this.amountToPrecision(symbol, amount), '1000000'));
3046
+ if (type === 'reduce') {
3047
+ sz = -sz;
3048
+ }
3049
+ const nonce = this.milliseconds();
3050
+ const updateAction = {
3051
+ 'type': 'updateIsolatedMargin',
3052
+ 'asset': asset,
3053
+ 'isBuy': true,
3054
+ 'ntli': sz,
3055
+ };
3056
+ let vaultAddress = undefined;
3057
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'modifyMargin', 'vaultAddress', 'subAccountAddress');
3058
+ vaultAddress = this.formatVaultAddress(vaultAddress);
3059
+ const signature = this.signL1Action(updateAction, nonce, vaultAddress);
3060
+ const request = {
3061
+ 'action': updateAction,
3062
+ 'nonce': nonce,
3063
+ 'signature': signature,
3064
+ // 'vaultAddress': vaultAddress,
3065
+ };
3066
+ if (vaultAddress !== undefined) {
3067
+ request['vaultAddress'] = vaultAddress;
3068
+ }
3069
+ const response = await this.privatePostExchange(request);
3070
+ //
3071
+ // {
3072
+ // 'response': {
3073
+ // 'type': 'default'
3074
+ // },
3075
+ // 'status': 'ok'
3076
+ // }
3077
+ //
3078
+ return this.extend(this.parseMarginModification(response, market), {
3079
+ 'code': this.safeString(response, 'status'),
3080
+ });
3081
+ }
3082
+ parseMarginModification(data, market = undefined) {
3083
+ //
3084
+ // {
3085
+ // 'type': 'default'
3086
+ // }
3087
+ //
3088
+ return {
3089
+ 'info': data,
3090
+ 'symbol': this.safeSymbol(undefined, market),
3091
+ 'type': undefined,
3092
+ 'marginMode': 'isolated',
3093
+ 'amount': undefined,
3094
+ 'total': undefined,
3095
+ 'code': this.safeString(market, 'settle'),
3096
+ 'status': undefined,
3097
+ 'timestamp': undefined,
3098
+ 'datetime': undefined,
3099
+ };
3100
+ }
3101
+ /**
3102
+ * @method
3103
+ * @name hyperliquid#transfer
3104
+ * @description transfer currency internally between wallets on the same account
3105
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#l1-usdc-transfer
3106
+ * @param {string} code unified currency code
3107
+ * @param {float} amount amount to transfer
3108
+ * @param {string} fromAccount account to transfer from *spot, swap*
3109
+ * @param {string} toAccount account to transfer to *swap, spot or address*
3110
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3111
+ * @param {string} [params.vaultAddress] the vault address for order
3112
+ * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
3113
+ */
3114
+ async transfer(code, amount, fromAccount, toAccount, params = {}) {
3115
+ this.checkRequiredCredentials();
3116
+ await this.loadMarkets();
3117
+ const isSandboxMode = this.safeBool(this.options, 'sandboxMode');
3118
+ const nonce = this.milliseconds();
3119
+ if (this.inArray(fromAccount, ['spot', 'swap', 'perp'])) {
3120
+ // handle swap <> spot account transfer
3121
+ if (!this.inArray(toAccount, ['spot', 'swap', 'perp'])) {
3122
+ throw new NotSupported(this.id + ' transfer() only support spot <> swap transfer');
3123
+ }
3124
+ let strAmount = this.numberToString(amount);
3125
+ let vaultAddress = this.safeString2(params, 'vaultAddress', 'subAccountAddress');
3126
+ if (vaultAddress !== undefined) {
3127
+ vaultAddress = this.formatVaultAddress(vaultAddress);
3128
+ strAmount = strAmount + ' subaccount:' + vaultAddress;
3129
+ }
3130
+ const toPerp = (toAccount === 'perp') || (toAccount === 'swap');
3131
+ const transferPayload = {
3132
+ 'hyperliquidChain': isSandboxMode ? 'Testnet' : 'Mainnet',
3133
+ 'amount': strAmount,
3134
+ 'toPerp': toPerp,
3135
+ 'nonce': nonce,
3136
+ };
3137
+ const transferSig = this.buildUsdClassSendSig(transferPayload);
3138
+ const transferRequest = {
3139
+ 'action': {
3140
+ 'hyperliquidChain': transferPayload['hyperliquidChain'],
3141
+ 'signatureChainId': '0x66eee',
3142
+ 'type': 'usdClassTransfer',
3143
+ 'amount': strAmount,
3144
+ 'toPerp': toPerp,
3145
+ 'nonce': nonce,
3146
+ },
3147
+ 'nonce': nonce,
3148
+ 'signature': transferSig,
3149
+ };
3150
+ if (vaultAddress !== undefined) {
3151
+ transferRequest['vaultAddress'] = vaultAddress;
3152
+ }
3153
+ const transferResponse = await this.privatePostExchange(transferRequest);
3154
+ return transferResponse;
3155
+ }
3156
+ // transfer between main account and subaccount
3157
+ let isDeposit = false;
3158
+ let subAccountAddress = undefined;
3159
+ if (fromAccount === 'main') {
3160
+ subAccountAddress = toAccount;
3161
+ isDeposit = true;
3162
+ }
3163
+ else if (toAccount === 'main') {
3164
+ subAccountAddress = fromAccount;
3165
+ }
3166
+ else {
3167
+ throw new NotSupported(this.id + ' transfer() only support main <> subaccount transfer');
3168
+ }
3169
+ this.checkAddress(subAccountAddress);
3170
+ if (code === undefined || code.toUpperCase() === 'USDC') {
3171
+ // Transfer USDC with subAccountTransfer
3172
+ const usd = this.parseToInt(Precise.stringMul(this.numberToString(amount), '1000000'));
3173
+ const action = {
3174
+ 'type': 'subAccountTransfer',
3175
+ 'subAccountUser': subAccountAddress,
3176
+ 'isDeposit': isDeposit,
3177
+ 'usd': usd,
3178
+ };
3179
+ const sig = this.signL1Action(action, nonce);
3180
+ const request = {
3181
+ 'action': action,
3182
+ 'nonce': nonce,
3183
+ 'signature': sig,
3184
+ };
3185
+ const response = await this.privatePostExchange(request);
3186
+ //
3187
+ // {'response': {'type': 'default'}, 'status': 'ok'}
3188
+ //
3189
+ return this.parseTransfer(response);
3190
+ }
3191
+ else {
3192
+ // Transfer non-USDC with subAccountSpotTransfer
3193
+ const symbol = this.symbol(code);
3194
+ const action = {
3195
+ 'type': 'subAccountSpotTransfer',
3196
+ 'subAccountUser': subAccountAddress,
3197
+ 'isDeposit': isDeposit,
3198
+ 'token': symbol,
3199
+ 'amount': this.numberToString(amount),
3200
+ };
3201
+ const sig = this.signL1Action(action, nonce);
3202
+ const request = {
3203
+ 'action': action,
3204
+ 'nonce': nonce,
3205
+ 'signature': sig,
3206
+ };
3207
+ const response = await this.privatePostExchange(request);
3208
+ return this.parseTransfer(response);
3209
+ }
3210
+ }
3211
+ parseTransfer(transfer, currency = undefined) {
3212
+ //
3213
+ // {'response': {'type': 'default'}, 'status': 'ok'}
3214
+ //
3215
+ return {
3216
+ 'info': transfer,
3217
+ 'id': undefined,
3218
+ 'timestamp': undefined,
3219
+ 'datetime': undefined,
3220
+ 'currency': undefined,
3221
+ 'amount': undefined,
3222
+ 'fromAccount': undefined,
3223
+ 'toAccount': undefined,
3224
+ 'status': 'ok',
3225
+ };
3226
+ }
3227
+ /**
3228
+ * @method
3229
+ * @name hyperliquid#withdraw
3230
+ * @description make a withdrawal (only support USDC)
3231
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#initiate-a-withdrawal-request
3232
+ * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#deposit-or-withdraw-from-a-vault
3233
+ * @param {string} code unified currency code
3234
+ * @param {float} amount the amount to withdraw
3235
+ * @param {string} address the address to withdraw to
3236
+ * @param {string} tag
3237
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3238
+ * @param {string} [params.vaultAddress] vault address withdraw from
3239
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
3240
+ */
3241
+ async withdraw(code, amount, address, tag = undefined, params = {}) {
3242
+ this.checkRequiredCredentials();
3243
+ await this.loadMarkets();
3244
+ this.checkAddress(address);
3245
+ if (code !== undefined) {
3246
+ code = code.toUpperCase();
3247
+ if (code !== 'USDC') {
3248
+ throw new NotSupported(this.id + ' withdraw() only support USDC');
3249
+ }
3250
+ }
3251
+ let vaultAddress = undefined;
3252
+ [vaultAddress, params] = this.handleOptionAndParams(params, 'withdraw', 'vaultAddress');
3253
+ vaultAddress = this.formatVaultAddress(vaultAddress);
3254
+ params = this.omit(params, 'vaultAddress');
3255
+ const nonce = this.milliseconds();
3256
+ let action = {};
3257
+ let sig = undefined;
3258
+ if (vaultAddress !== undefined) {
3259
+ action = {
3260
+ 'type': 'vaultTransfer',
3261
+ 'vaultAddress': '0x' + vaultAddress,
3262
+ 'isDeposit': false,
3263
+ 'usd': amount,
3264
+ };
3265
+ sig = this.signL1Action(action, nonce);
3266
+ }
3267
+ else {
3268
+ const isSandboxMode = this.safeBool(this.options, 'sandboxMode', false);
3269
+ const payload = {
3270
+ 'hyperliquidChain': isSandboxMode ? 'Testnet' : 'Mainnet',
3271
+ 'destination': address,
3272
+ 'amount': amount.toString(),
3273
+ 'time': nonce,
3274
+ };
3275
+ sig = this.buildWithdrawSig(payload);
3276
+ action = {
3277
+ 'hyperliquidChain': payload['hyperliquidChain'],
3278
+ 'signatureChainId': '0x66eee',
3279
+ 'destination': address,
3280
+ 'amount': amount.toString(),
3281
+ 'time': nonce,
3282
+ 'type': 'withdraw3',
3283
+ };
3284
+ }
3285
+ const request = {
3286
+ 'action': action,
3287
+ 'nonce': nonce,
3288
+ 'signature': sig,
3289
+ };
3290
+ const response = await this.privatePostExchange(request);
3291
+ return this.parseTransaction(response);
3292
+ }
3293
+ parseTransaction(transaction, currency = undefined) {
3294
+ //
3295
+ // { status: 'ok', response: { type: 'default' } }
3296
+ //
3297
+ // fetchDeposits / fetchWithdrawals
3298
+ // {
3299
+ // "time":1724762307531,
3300
+ // "hash":"0x620a234a7e0eb7930575040f59482a01050058b0802163b4767bfd9033e77781",
3301
+ // "delta":{
3302
+ // "type":"accountClassTransfer",
3303
+ // "usdc":"50.0",
3304
+ // "toPerp":false
3305
+ // }
3306
+ // }
3307
+ //
3308
+ const timestamp = this.safeInteger(transaction, 'time');
3309
+ const delta = this.safeDict(transaction, 'delta', {});
3310
+ let fee = undefined;
3311
+ const feeCost = this.safeInteger(delta, 'fee');
3312
+ if (feeCost !== undefined) {
3313
+ fee = {
3314
+ 'currency': 'USDC',
3315
+ 'cost': feeCost,
3316
+ };
3317
+ }
3318
+ let internal = undefined;
3319
+ const type = this.safeString(delta, 'type');
3320
+ if (type !== undefined) {
3321
+ internal = (type === 'internalTransfer');
3322
+ }
3323
+ return {
3324
+ 'info': transaction,
3325
+ 'id': undefined,
3326
+ 'txid': this.safeString(transaction, 'hash'),
3327
+ 'timestamp': timestamp,
3328
+ 'datetime': this.iso8601(timestamp),
3329
+ 'network': undefined,
3330
+ 'address': undefined,
3331
+ 'addressTo': this.safeString(delta, 'destination'),
3332
+ 'addressFrom': this.safeString(delta, 'user'),
3333
+ 'tag': undefined,
3334
+ 'tagTo': undefined,
3335
+ 'tagFrom': undefined,
3336
+ 'type': undefined,
3337
+ 'amount': this.safeNumber(delta, 'usdc'),
3338
+ 'currency': undefined,
3339
+ 'status': this.safeString(transaction, 'status'),
3340
+ 'updated': undefined,
3341
+ 'comment': undefined,
3342
+ 'internal': internal,
3343
+ 'fee': fee,
3344
+ };
3345
+ }
3346
+ /**
3347
+ * @method
3348
+ * @name hyperliquid#fetchTradingFee
3349
+ * @description fetch the trading fees for a market
3350
+ * @param {string} symbol unified market symbol
3351
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3352
+ * @param {string} [params.user] user address, will default to this.walletAddress if not provided
3353
+ * @param {string} [params.subAccountAddress] sub account user address
3354
+ * @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
3355
+ */
3356
+ async fetchTradingFee(symbol, params = {}) {
3357
+ await this.loadMarkets();
3358
+ let userAddress = undefined;
3359
+ [userAddress, params] = this.handlePublicAddress('fetchTradingFee', params);
3360
+ const market = this.market(symbol);
3361
+ const request = {
3362
+ 'type': 'userFees',
3363
+ 'user': userAddress,
3364
+ };
3365
+ const response = await this.publicPostInfo(this.extend(request, params));
3366
+ //
3367
+ // {
3368
+ // "dailyUserVlm": [
3369
+ // {
3370
+ // "date": "2024-07-08",
3371
+ // "userCross": "0.0",
3372
+ // "userAdd": "0.0",
3373
+ // "exchange": "90597185.23639999"
3374
+ // }
3375
+ // ],
3376
+ // "feeSchedule": {
3377
+ // "cross": "0.00035",
3378
+ // "add": "0.0001",
3379
+ // "tiers": {
3380
+ // "vip": [
3381
+ // {
3382
+ // "ntlCutoff": "5000000.0",
3383
+ // "cross": "0.0003",
3384
+ // "add": "0.00005"
3385
+ // }
3386
+ // ],
3387
+ // "mm": [
3388
+ // {
3389
+ // "makerFractionCutoff": "0.005",
3390
+ // "add": "-0.00001"
3391
+ // }
3392
+ // ]
3393
+ // },
3394
+ // "referralDiscount": "0.04"
3395
+ // },
3396
+ // "userCrossRate": "0.00035",
3397
+ // "userAddRate": "0.0001",
3398
+ // "activeReferralDiscount": "0.0"
3399
+ // }
3400
+ //
3401
+ const data = {
3402
+ 'userCrossRate': this.safeString(response, 'userCrossRate'),
3403
+ 'userAddRate': this.safeString(response, 'userAddRate'),
3404
+ };
3405
+ return this.parseTradingFee(data, market);
3406
+ }
3407
+ parseTradingFee(fee, market = undefined) {
3408
+ //
3409
+ // {
3410
+ // "dailyUserVlm": [
3411
+ // {
3412
+ // "date": "2024-07-08",
3413
+ // "userCross": "0.0",
3414
+ // "userAdd": "0.0",
3415
+ // "exchange": "90597185.23639999"
3416
+ // }
3417
+ // ],
3418
+ // "feeSchedule": {
3419
+ // "cross": "0.00035",
3420
+ // "add": "0.0001",
3421
+ // "tiers": {
3422
+ // "vip": [
3423
+ // {
3424
+ // "ntlCutoff": "5000000.0",
3425
+ // "cross": "0.0003",
3426
+ // "add": "0.00005"
3427
+ // }
3428
+ // ],
3429
+ // "mm": [
3430
+ // {
3431
+ // "makerFractionCutoff": "0.005",
3432
+ // "add": "-0.00001"
3433
+ // }
3434
+ // ]
3435
+ // },
3436
+ // "referralDiscount": "0.04"
3437
+ // },
3438
+ // "userCrossRate": "0.00035",
3439
+ // "userAddRate": "0.0001",
3440
+ // "activeReferralDiscount": "0.0"
3441
+ // }
3442
+ //
3443
+ const symbol = this.safeSymbol(undefined, market);
3444
+ return {
3445
+ 'info': fee,
3446
+ 'symbol': symbol,
3447
+ 'maker': this.safeNumber(fee, 'userAddRate'),
3448
+ 'taker': this.safeNumber(fee, 'userCrossRate'),
3449
+ 'percentage': undefined,
3450
+ 'tierBased': undefined,
3451
+ };
3452
+ }
3453
+ /**
3454
+ * @method
3455
+ * @name hyperliquid#fetchLedger
3456
+ * @description fetch the history of changes, actions done by the user or operations that altered the balance of the user
3457
+ * @param {string} [code] unified currency code
3458
+ * @param {int} [since] timestamp in ms of the earliest ledger entry
3459
+ * @param {int} [limit] max number of ledger entries to return
3460
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3461
+ * @param {int} [params.until] timestamp in ms of the latest ledger entry
3462
+ * @param {string} [params.subAccountAddress] sub account user address
3463
+ * @returns {object} a [ledger structure]{@link https://docs.ccxt.com/#/?id=ledger}
3464
+ */
3465
+ async fetchLedger(code = undefined, since = undefined, limit = undefined, params = {}) {
3466
+ await this.loadMarkets();
3467
+ let userAddress = undefined;
3468
+ [userAddress, params] = this.handlePublicAddress('fetchLedger', params);
3469
+ const request = {
3470
+ 'type': 'userNonFundingLedgerUpdates',
3471
+ 'user': userAddress,
3472
+ };
3473
+ if (since !== undefined) {
3474
+ request['startTime'] = since;
3475
+ }
3476
+ const until = this.safeInteger(params, 'until');
3477
+ if (until !== undefined) {
3478
+ request['endTime'] = until;
3479
+ params = this.omit(params, ['until']);
3480
+ }
3481
+ const response = await this.publicPostInfo(this.extend(request, params));
3482
+ //
3483
+ // [
3484
+ // {
3485
+ // "time":1724762307531,
3486
+ // "hash":"0x620a234a7e0eb7930575040f59482a01050058b0802163b4767bfd9033e77781",
3487
+ // "delta":{
3488
+ // "type":"accountClassTransfer",
3489
+ // "usdc":"50.0",
3490
+ // "toPerp":false
3491
+ // }
3492
+ // }
3493
+ // ]
3494
+ //
3495
+ return this.parseLedger(response, undefined, since, limit);
3496
+ }
3497
+ parseLedgerEntry(item, currency = undefined) {
3498
+ //
3499
+ // {
3500
+ // "time":1724762307531,
3501
+ // "hash":"0x620a234a7e0eb7930575040f59482a01050058b0802163b4767bfd9033e77781",
3502
+ // "delta":{
3503
+ // "type":"accountClassTransfer",
3504
+ // "usdc":"50.0",
3505
+ // "toPerp":false
3506
+ // }
3507
+ // }
3508
+ //
3509
+ const timestamp = this.safeInteger(item, 'time');
3510
+ const delta = this.safeDict(item, 'delta', {});
3511
+ let fee = undefined;
3512
+ const feeCost = this.safeInteger(delta, 'fee');
3513
+ if (feeCost !== undefined) {
3514
+ fee = {
3515
+ 'currency': 'USDC',
3516
+ 'cost': feeCost,
3517
+ };
3518
+ }
3519
+ const type = this.safeString(delta, 'type');
3520
+ const amount = this.safeString(delta, 'usdc');
3521
+ return this.safeLedgerEntry({
3522
+ 'info': item,
3523
+ 'id': this.safeString(item, 'hash'),
3524
+ 'direction': undefined,
3525
+ 'account': undefined,
3526
+ 'referenceAccount': this.safeString(delta, 'user'),
3527
+ 'referenceId': this.safeString(item, 'hash'),
3528
+ 'type': this.parseLedgerEntryType(type),
3529
+ 'currency': undefined,
3530
+ 'amount': this.parseNumber(amount),
3531
+ 'timestamp': timestamp,
3532
+ 'datetime': this.iso8601(timestamp),
3533
+ 'before': undefined,
3534
+ 'after': undefined,
3535
+ 'status': undefined,
3536
+ 'fee': fee,
3537
+ }, currency);
3538
+ }
3539
+ parseLedgerEntryType(type) {
3540
+ const ledgerType = {
3541
+ 'internalTransfer': 'transfer',
3542
+ 'accountClassTransfer': 'transfer',
3543
+ };
3544
+ return this.safeString(ledgerType, type, type);
3545
+ }
3546
+ /**
3547
+ * @method
3548
+ * @name hyperliquid#fetchDeposits
3549
+ * @description fetch all deposits made to an account
3550
+ * @param {string} code unified currency code
3551
+ * @param {int} [since] the earliest time in ms to fetch deposits for
3552
+ * @param {int} [limit] the maximum number of deposits structures to retrieve
3553
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3554
+ * @param {int} [params.until] the latest time in ms to fetch withdrawals for
3555
+ * @param {string} [params.subAccountAddress] sub account user address
3556
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
3557
+ */
3558
+ async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
3559
+ await this.loadMarkets();
3560
+ let userAddress = undefined;
3561
+ [userAddress, params] = this.handlePublicAddress('fetchDepositsWithdrawals', params);
3562
+ const request = {
3563
+ 'type': 'userNonFundingLedgerUpdates',
3564
+ 'user': userAddress,
3565
+ };
3566
+ if (since !== undefined) {
3567
+ request['startTime'] = since;
3568
+ }
3569
+ const until = this.safeInteger(params, 'until');
3570
+ if (until !== undefined) {
3571
+ request['endTime'] = until;
3572
+ params = this.omit(params, ['until']);
3573
+ }
3574
+ const response = await this.publicPostInfo(this.extend(request, params));
3575
+ //
3576
+ // [
3577
+ // {
3578
+ // "time":1724762307531,
3579
+ // "hash":"0x620a234a7e0eb7930575040f59482a01050058b0802163b4767bfd9033e77781",
3580
+ // "delta":{
3581
+ // "type":"accountClassTransfer",
3582
+ // "usdc":"50.0",
3583
+ // "toPerp":false
3584
+ // }
3585
+ // }
3586
+ // ]
3587
+ //
3588
+ const records = this.extractTypeFromDelta(response);
3589
+ const deposits = this.filterByArray(records, 'type', ['deposit'], false);
3590
+ return this.parseTransactions(deposits, undefined, since, limit);
3591
+ }
3592
+ /**
3593
+ * @method
3594
+ * @name hyperliquid#fetchWithdrawals
3595
+ * @description fetch all withdrawals made from an account
3596
+ * @param {string} code unified currency code
3597
+ * @param {int} [since] the earliest time in ms to fetch withdrawals for
3598
+ * @param {int} [limit] the maximum number of withdrawals structures to retrieve
3599
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3600
+ * @param {int} [params.until] the latest time in ms to fetch withdrawals for
3601
+ * @param {string} [params.subAccountAddress] sub account user address
3602
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
3603
+ */
3604
+ async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
3605
+ await this.loadMarkets();
3606
+ let userAddress = undefined;
3607
+ [userAddress, params] = this.handlePublicAddress('fetchDepositsWithdrawals', params);
3608
+ const request = {
3609
+ 'type': 'userNonFundingLedgerUpdates',
3610
+ 'user': userAddress,
3611
+ };
3612
+ if (since !== undefined) {
3613
+ request['startTime'] = since;
3614
+ }
3615
+ const until = this.safeInteger(params, 'until');
3616
+ if (until !== undefined) {
3617
+ request['endTime'] = until;
3618
+ params = this.omit(params, ['until']);
3619
+ }
3620
+ const response = await this.publicPostInfo(this.extend(request, params));
3621
+ //
3622
+ // [
3623
+ // {
3624
+ // "time":1724762307531,
3625
+ // "hash":"0x620a234a7e0eb7930575040f59482a01050058b0802163b4767bfd9033e77781",
3626
+ // "delta":{
3627
+ // "type":"accountClassTransfer",
3628
+ // "usdc":"50.0",
3629
+ // "toPerp":false
3630
+ // }
3631
+ // }
3632
+ // ]
3633
+ //
3634
+ const records = this.extractTypeFromDelta(response);
3635
+ const withdrawals = this.filterByArray(records, 'type', ['withdraw'], false);
3636
+ return this.parseTransactions(withdrawals, undefined, since, limit);
3637
+ }
3638
+ /**
3639
+ * @method
3640
+ * @name hyperliquid#fetchOpenInterests
3641
+ * @description Retrieves the open interest for a list of symbols
3642
+ * @param {string[]} [symbols] Unified CCXT market symbol
3643
+ * @param {object} [params] exchange specific parameters
3644
+ * @returns {object} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure}
3645
+ */
3646
+ async fetchOpenInterests(symbols = undefined, params = {}) {
3647
+ await this.loadMarkets();
3648
+ symbols = this.marketSymbols(symbols);
3649
+ const swapMarkets = await this.fetchSwapMarkets();
3650
+ return this.parseOpenInterests(swapMarkets, symbols);
3651
+ }
3652
+ /**
3653
+ * @method
3654
+ * @name hyperliquid#fetchOpenInterest
3655
+ * @description retrieves the open interest of a contract trading pair
3656
+ * @param {string} symbol unified CCXT market symbol
3657
+ * @param {object} [params] exchange specific parameters
3658
+ * @returns {object} an [open interest structure]{@link https://docs.ccxt.com/#/?id=open-interest-structure}
3659
+ */
3660
+ async fetchOpenInterest(symbol, params = {}) {
3661
+ symbol = this.symbol(symbol);
3662
+ await this.loadMarkets();
3663
+ const ois = await this.fetchOpenInterests([symbol], params);
3664
+ return ois[symbol];
3665
+ }
3666
+ parseOpenInterest(interest, market = undefined) {
3667
+ //
3668
+ // {
3669
+ // szDecimals: '2',
3670
+ // name: 'HYPE',
3671
+ // maxLeverage: '3',
3672
+ // funding: '0.00014735',
3673
+ // openInterest: '14677900.74',
3674
+ // prevDayPx: '26.145',
3675
+ // dayNtlVlm: '299643445.12560016',
3676
+ // premium: '0.00081613',
3677
+ // oraclePx: '27.569',
3678
+ // markPx: '27.63',
3679
+ // midPx: '27.599',
3680
+ // impactPxs: [ '27.5915', '27.6319' ],
3681
+ // dayBaseVlm: '10790652.83',
3682
+ // baseId: 159
3683
+ // }
3684
+ //
3685
+ interest = this.safeDict(interest, 'info', {});
3686
+ const coin = this.safeString(interest, 'name');
3687
+ let marketId = undefined;
3688
+ if (coin !== undefined) {
3689
+ marketId = this.coinToMarketId(coin);
3690
+ }
3691
+ return this.safeOpenInterest({
3692
+ 'symbol': this.safeSymbol(marketId),
3693
+ 'openInterestAmount': this.safeNumber(interest, 'openInterest'),
3694
+ 'openInterestValue': undefined,
3695
+ 'timestamp': undefined,
3696
+ 'datetime': undefined,
3697
+ 'info': interest,
3698
+ }, market);
3699
+ }
3700
+ /**
3701
+ * @method
3702
+ * @name hyperliquid#fetchFundingHistory
3703
+ * @description fetch the history of funding payments paid and received on this account
3704
+ * @param {string} [symbol] unified market symbol
3705
+ * @param {int} [since] the earliest time in ms to fetch funding history for
3706
+ * @param {int} [limit] the maximum number of funding history structures to retrieve
3707
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3708
+ * @param {string} [params.subAccountAddress] sub account user address
3709
+ * @returns {object} a [funding history structure]{@link https://docs.ccxt.com/#/?id=funding-history-structure}
3710
+ */
3711
+ async fetchFundingHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
3712
+ await this.loadMarkets();
3713
+ let market = undefined;
3714
+ if (symbol !== undefined) {
3715
+ market = this.market(symbol);
3716
+ }
3717
+ let userAddress = undefined;
3718
+ [userAddress, params] = this.handlePublicAddress('fetchFundingHistory', params);
3719
+ const request = {
3720
+ 'user': userAddress,
3721
+ 'type': 'userFunding',
3722
+ };
3723
+ if (since !== undefined) {
3724
+ request['startTime'] = since;
3725
+ }
3726
+ const until = this.safeInteger(params, 'until');
3727
+ params = this.omit(params, 'until');
3728
+ if (until !== undefined) {
3729
+ request['endTime'] = until;
3730
+ }
3731
+ const response = await this.publicPostInfo(this.extend(request, params));
3732
+ //
3733
+ // [
3734
+ // {
3735
+ // "time": 1734026400057,
3736
+ // "hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
3737
+ // "delta": {
3738
+ // "type": "funding",
3739
+ // "coin": "SOL",
3740
+ // "usdc": "75.635093",
3741
+ // "szi": "-7375.9",
3742
+ // "fundingRate": "0.00004381",
3743
+ // "nSamples": null
3744
+ // }
3745
+ // }
3746
+ // ]
3747
+ //
3748
+ return this.parseIncomes(response, market, since, limit);
3749
+ }
3750
+ parseIncome(income, market = undefined) {
3751
+ //
3752
+ // {
3753
+ // "time": 1734026400057,
3754
+ // "hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
3755
+ // "delta": {
3756
+ // "type": "funding",
3757
+ // "coin": "SOL",
3758
+ // "usdc": "75.635093",
3759
+ // "szi": "-7375.9",
3760
+ // "fundingRate": "0.00004381",
3761
+ // "nSamples": null
3762
+ // }
3763
+ // }
3764
+ //
3765
+ const id = this.safeString(income, 'hash');
3766
+ const timestamp = this.safeInteger(income, 'time');
3767
+ const delta = this.safeDict(income, 'delta');
3768
+ const baseId = this.safeString(delta, 'coin');
3769
+ const marketSymbol = baseId + '/USDC:USDC';
3770
+ market = this.safeMarket(marketSymbol);
3771
+ const symbol = market['symbol'];
3772
+ const amount = this.safeString(delta, 'usdc');
3773
+ const code = this.safeCurrencyCode('USDC');
3774
+ const rate = this.safeNumber(delta, 'fundingRate');
3775
+ return {
3776
+ 'info': income,
3777
+ 'symbol': symbol,
3778
+ 'code': code,
3779
+ 'timestamp': timestamp,
3780
+ 'datetime': this.iso8601(timestamp),
3781
+ 'id': id,
3782
+ 'amount': this.parseNumber(amount),
3783
+ 'rate': rate,
3784
+ };
3785
+ }
3786
+ /**
3787
+ * @method
3788
+ * @name hyperliquid#reserveRequestWeight
3789
+ * @description Instead of trading to increase the address based rate limits, this action allows reserving additional actions for 0.0005 USDC per request. The cost is paid from the Perps balance.
3790
+ * @param {number} weight the weight to reserve, 1 weight = 1 action, 0.0005 USDC per action
3791
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3792
+ * @returns {object} a response object
3793
+ */
3794
+ async reserveRequestWeight(weight, params = {}) {
3795
+ const nonce = this.milliseconds();
3796
+ const request = {
3797
+ 'nonce': nonce,
3798
+ };
3799
+ const action = {
3800
+ 'type': 'reserveRequestWeight',
3801
+ 'weight': weight,
3802
+ };
3803
+ const signature = this.signL1Action(action, nonce);
3804
+ request['action'] = action;
3805
+ request['signature'] = signature;
3806
+ const response = await this.privatePostExchange(this.extend(request, params));
3807
+ return response;
3808
+ }
3809
+ extractTypeFromDelta(data = []) {
3810
+ const records = [];
3811
+ for (let i = 0; i < data.length; i++) {
3812
+ const record = data[i];
3813
+ record['type'] = record['delta']['type'];
3814
+ records.push(record);
3815
+ }
3816
+ return records;
3817
+ }
3818
+ formatVaultAddress(address = undefined) {
3819
+ if (address === undefined) {
3820
+ return undefined;
3821
+ }
3822
+ if (address.startsWith('0x')) {
3823
+ return address.replace('0x', '');
3824
+ }
3825
+ return address;
3826
+ }
3827
+ handlePublicAddress(methodName, params) {
3828
+ let userAux = undefined;
3829
+ [userAux, params] = this.handleOptionAndParams2(params, methodName, 'user', 'subAccountAddress');
3830
+ let user = userAux;
3831
+ [user, params] = this.handleOptionAndParams(params, methodName, 'address', userAux);
3832
+ if ((user !== undefined) && (user !== '')) {
3833
+ return [user, params];
3834
+ }
3835
+ if ((this.walletAddress !== undefined) && (this.walletAddress !== '')) {
3836
+ return [this.walletAddress, params];
3837
+ }
3838
+ throw new ArgumentsRequired(this.id + ' ' + methodName + '() requires a user parameter inside \'params\' or the wallet address set');
3839
+ }
3840
+ coinToMarketId(coin) {
3841
+ if (coin.indexOf('/') > -1 || coin.indexOf('@') > -1) {
3842
+ return coin; // spot
3843
+ }
3844
+ return this.safeCurrencyCode(coin) + '/USDC:USDC';
3845
+ }
3846
+ handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
3847
+ if (!response) {
3848
+ return undefined; // fallback to default error handler
3849
+ }
3850
+ // {"status":"err","response":"User or API Wallet 0xb8a6f8b26223de27c31938d56e470a5b832703a5 does not exist."}
3851
+ //
3852
+ // {
3853
+ // status: 'ok',
3854
+ // response: { type: 'order', data: { statuses: [ { error: 'Insufficient margin to place order. asset=4' } ] } }
3855
+ // }
3856
+ // {"status":"ok","response":{"type":"order","data":{"statuses":[{"error":"Insufficient margin to place order. asset=84"}]}}}
3857
+ //
3858
+ // {"status":"unknownOid"}
3859
+ //
3860
+ const status = this.safeString(response, 'status', '');
3861
+ const error = this.safeString(response, 'error');
3862
+ let message = undefined;
3863
+ if (status === 'err') {
3864
+ message = this.safeString(response, 'response');
3865
+ }
3866
+ else if (status === 'unknownOid') {
3867
+ throw new OrderNotFound(this.id + ' ' + body); // {"status":"unknownOid"}
3868
+ }
3869
+ else if (error !== undefined) {
3870
+ message = error;
3871
+ }
3872
+ else {
3873
+ const responsePayload = this.safeDict(response, 'response', {});
3874
+ const data = this.safeDict(responsePayload, 'data', {});
3875
+ const statuses = this.safeList(data, 'statuses', []);
3876
+ for (let i = 0; i < statuses.length; i++) {
3877
+ message = this.safeString(statuses[i], 'error');
3878
+ if (message !== undefined) {
3879
+ break;
3880
+ }
3881
+ }
3882
+ }
3883
+ const feedback = this.id + ' ' + body;
3884
+ const nonEmptyMessage = ((message !== undefined) && (message !== ''));
3885
+ if (nonEmptyMessage) {
3886
+ this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
3887
+ this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
3888
+ }
3889
+ if (nonEmptyMessage) {
3890
+ throw new ExchangeError(feedback); // unknown message
3891
+ }
3892
+ return undefined;
3893
+ }
3894
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
3895
+ const url = this.implodeHostname(this.urls['api'][api]) + '/' + path;
3896
+ if (method === 'POST') {
3897
+ headers = {
3898
+ 'Content-Type': 'application/json',
3899
+ };
3900
+ body = this.json(params);
3901
+ }
3902
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
3903
+ }
3904
+ calculateRateLimiterCost(api, method, path, params, config = {}) {
3905
+ if (('byType' in config) && ('type' in params)) {
3906
+ const type = params['type'];
3907
+ const byType = config['byType'];
3908
+ if (type in byType) {
3909
+ return byType[type];
3910
+ }
3911
+ }
3912
+ return this.safeValue(config, 'cost', 1);
3913
+ }
3914
+ parseCreateEditOrderArgs(id, symbol, type, side, amount, price = undefined, params = {}) {
3915
+ const market = this.market(symbol);
3916
+ let vaultAddress = undefined;
3917
+ [vaultAddress, params] = this.handleOptionAndParams2(params, 'createOrder', 'vaultAddress', 'subAccountAddress');
3918
+ vaultAddress = this.formatVaultAddress(vaultAddress);
3919
+ symbol = market['symbol'];
3920
+ const order = {
3921
+ 'symbol': symbol,
3922
+ 'type': type,
3923
+ 'side': side,
3924
+ 'amount': amount,
3925
+ 'price': price,
3926
+ 'params': params,
3927
+ };
3928
+ const globalParams = {};
3929
+ if (vaultAddress !== undefined) {
3930
+ globalParams['vaultAddress'] = vaultAddress;
3931
+ }
3932
+ if (id !== undefined) {
3933
+ order['id'] = id;
3934
+ }
3935
+ return [order, globalParams];
3936
+ }
3937
+ }