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.
- package/README.md +4 -4
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +4 -1
- package/dist/cjs/src/abstract/bidarz.js +11 -0
- package/dist/cjs/src/bidarz.js +337 -0
- package/dist/cjs/src/bit24.js +4 -3
- package/js/ccxt.d.ts +5 -2
- package/js/ccxt.js +4 -2
- package/js/src/abstract/bidarz.d.ts +9 -0
- package/js/src/abstract/bidarz.js +11 -0
- package/js/src/bidarz.d.ts +22 -0
- package/js/src/bidarz.js +336 -0
- package/js/src/bit24.js +4 -3
- package/js/src/src/abantether.d.ts +21 -0
- package/js/src/src/abantether.js +353 -0
- package/js/src/src/abstract/abantether.d.ts +8 -0
- package/js/src/src/abstract/abantether.js +11 -0
- package/js/src/src/abstract/afratether.d.ts +9 -0
- package/js/src/src/abstract/afratether.js +11 -0
- package/js/src/src/abstract/alpaca.d.ts +77 -0
- package/js/src/src/abstract/alpaca.js +11 -0
- package/js/src/src/abstract/apex.d.ts +34 -0
- package/js/src/src/abstract/apex.js +11 -0
- package/js/src/src/abstract/arzinja.d.ts +8 -0
- package/js/src/src/abstract/arzinja.js +11 -0
- package/js/src/src/abstract/arzplus.d.ts +11 -0
- package/js/src/src/abstract/arzplus.js +11 -0
- package/js/src/src/abstract/ascendex.d.ts +80 -0
- package/js/src/src/abstract/ascendex.js +11 -0
- package/js/src/src/abstract/asretether.d.ts +8 -0
- package/js/src/src/abstract/asretether.js +11 -0
- package/js/src/src/abstract/bidarz.d.ts +9 -0
- package/js/src/src/abstract/bidarz.js +11 -0
- package/js/src/src/abstract/bigone.d.ts +48 -0
- package/js/src/src/abstract/bigone.js +11 -0
- package/js/src/src/abstract/binance.d.ts +773 -0
- package/js/src/src/abstract/binance.js +11 -0
- package/js/src/src/abstract/bingx.d.ts +165 -0
- package/js/src/src/abstract/bingx.js +11 -0
- package/js/src/src/abstract/bit24.d.ts +9 -0
- package/js/src/src/abstract/bit24.js +11 -0
- package/js/src/src/abstract/bit2c.d.ts +30 -0
- package/js/src/src/abstract/bit2c.js +11 -0
- package/js/src/src/abstract/bitbank.d.ts +35 -0
- package/js/src/src/abstract/bitbank.js +11 -0
- package/js/src/src/abstract/bitbarg.d.ts +8 -0
- package/js/src/src/abstract/bitbarg.js +11 -0
- package/js/src/src/abstract/bitbns.d.ts +43 -0
- package/js/src/src/abstract/bitbns.js +11 -0
- package/js/src/src/abstract/bitfinex.d.ts +143 -0
- package/js/src/src/abstract/bitfinex.js +11 -0
- package/js/src/src/abstract/bitflyer.d.ts +42 -0
- package/js/src/src/abstract/bitflyer.js +11 -0
- package/js/src/src/abstract/bitget.d.ts +578 -0
- package/js/src/src/abstract/bitget.js +11 -0
- package/js/src/src/abstract/bithumb.d.ts +35 -0
- package/js/src/src/abstract/bithumb.js +11 -0
- package/js/src/src/abstract/bitimen.d.ts +10 -0
- package/js/src/src/abstract/bitimen.js +11 -0
- package/js/src/src/abstract/bitir.d.ts +10 -0
- package/js/src/src/abstract/bitir.js +11 -0
- package/js/src/src/abstract/bitmart.d.ts +120 -0
- package/js/src/src/abstract/bitmart.js +11 -0
- package/js/src/src/abstract/bitmex.d.ts +100 -0
- package/js/src/src/abstract/bitmex.js +11 -0
- package/js/src/src/abstract/bitopro.d.ts +33 -0
- package/js/src/src/abstract/bitopro.js +11 -0
- package/js/src/src/abstract/bitpin.d.ts +11 -0
- package/js/src/src/abstract/bitpin.js +11 -0
- package/js/src/src/abstract/bitrue.d.ts +75 -0
- package/js/src/src/abstract/bitrue.js +11 -0
- package/js/src/src/abstract/bitso.d.ts +46 -0
- package/js/src/src/abstract/bitso.js +11 -0
- package/js/src/src/abstract/bitstamp.d.ts +262 -0
- package/js/src/src/abstract/bitstamp.js +11 -0
- package/js/src/src/abstract/bitteam.d.ts +32 -0
- package/js/src/src/abstract/bitteam.js +11 -0
- package/js/src/src/abstract/bittrade.d.ts +117 -0
- package/js/src/src/abstract/bittrade.js +11 -0
- package/js/src/src/abstract/bitunix.d.ts +9 -0
- package/js/src/src/abstract/bitunix.js +11 -0
- package/js/src/src/abstract/bitvavo.d.ts +30 -0
- package/js/src/src/abstract/bitvavo.js +11 -0
- package/js/src/src/abstract/blockchaincom.d.ts +31 -0
- package/js/src/src/abstract/blockchaincom.js +11 -0
- package/js/src/src/abstract/blofin.d.ts +70 -0
- package/js/src/src/abstract/blofin.js +11 -0
- package/js/src/src/abstract/btcalpha.d.ts +21 -0
- package/js/src/src/abstract/btcalpha.js +11 -0
- package/js/src/src/abstract/btcbox.d.ts +18 -0
- package/js/src/src/abstract/btcbox.js +11 -0
- package/js/src/src/abstract/btcmarkets.d.ts +42 -0
- package/js/src/src/abstract/btcmarkets.js +11 -0
- package/js/src/src/abstract/btcturk.d.ts +23 -0
- package/js/src/src/abstract/btcturk.js +11 -0
- package/js/src/src/abstract/bybit.d.ts +316 -0
- package/js/src/src/abstract/bybit.js +11 -0
- package/js/src/src/abstract/bydfi.d.ts +11 -0
- package/js/src/src/abstract/bydfi.js +11 -0
- package/js/src/src/abstract/cafearz.d.ts +8 -0
- package/js/src/src/abstract/cafearz.js +11 -0
- package/js/src/src/abstract/cex.d.ts +35 -0
- package/js/src/src/abstract/cex.js +11 -0
- package/js/src/src/abstract/coinbase.d.ts +97 -0
- package/js/src/src/abstract/coinbase.js +11 -0
- package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
- package/js/src/src/abstract/coinbaseexchange.js +11 -0
- package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
- package/js/src/src/abstract/coinbaseinternational.js +11 -0
- package/js/src/src/abstract/coincatch.d.ts +97 -0
- package/js/src/src/abstract/coincatch.js +11 -0
- package/js/src/src/abstract/coincheck.d.ts +36 -0
- package/js/src/src/abstract/coincheck.js +11 -0
- package/js/src/src/abstract/coinex.d.ts +240 -0
- package/js/src/src/abstract/coinex.js +11 -0
- package/js/src/src/abstract/coinmate.d.ts +65 -0
- package/js/src/src/abstract/coinmate.js +11 -0
- package/js/src/src/abstract/coinmetro.d.ts +37 -0
- package/js/src/src/abstract/coinmetro.js +11 -0
- package/js/src/src/abstract/coinone.d.ts +70 -0
- package/js/src/src/abstract/coinone.js +11 -0
- package/js/src/src/abstract/coinsph.d.ts +57 -0
- package/js/src/src/abstract/coinsph.js +11 -0
- package/js/src/src/abstract/coinspot.d.ts +31 -0
- package/js/src/src/abstract/coinspot.js +11 -0
- package/js/src/src/abstract/cryptocom.d.ts +126 -0
- package/js/src/src/abstract/cryptocom.js +11 -0
- package/js/src/src/abstract/cryptomus.d.ts +23 -0
- package/js/src/src/abstract/cryptomus.js +11 -0
- package/js/src/src/abstract/defx.d.ts +72 -0
- package/js/src/src/abstract/defx.js +11 -0
- package/js/src/src/abstract/delta.d.ts +53 -0
- package/js/src/src/abstract/delta.js +11 -0
- package/js/src/src/abstract/deribit.d.ts +129 -0
- package/js/src/src/abstract/deribit.js +11 -0
- package/js/src/src/abstract/derive.d.ts +120 -0
- package/js/src/src/abstract/derive.js +11 -0
- package/js/src/src/abstract/digifinex.d.ts +95 -0
- package/js/src/src/abstract/digifinex.js +11 -0
- package/js/src/src/abstract/ellipx.d.ts +28 -0
- package/js/src/src/abstract/ellipx.js +11 -0
- package/js/src/src/abstract/eterex.d.ts +8 -0
- package/js/src/src/abstract/eterex.js +11 -0
- package/js/src/src/abstract/excoino.d.ts +10 -0
- package/js/src/src/abstract/excoino.js +11 -0
- package/js/src/src/abstract/exir.d.ts +11 -0
- package/js/src/src/abstract/exir.js +11 -0
- package/js/src/src/abstract/exmo.d.ts +58 -0
- package/js/src/src/abstract/exmo.js +11 -0
- package/js/src/src/abstract/exnovin.d.ts +9 -0
- package/js/src/src/abstract/exnovin.js +11 -0
- package/js/src/src/abstract/farhadexchange.d.ts +8 -0
- package/js/src/src/abstract/farhadexchange.js +11 -0
- package/js/src/src/abstract/foxbit.d.ts +29 -0
- package/js/src/src/abstract/foxbit.js +11 -0
- package/js/src/src/abstract/gate.d.ts +287 -0
- package/js/src/src/abstract/gate.js +11 -0
- package/js/src/src/abstract/gemini.d.ts +62 -0
- package/js/src/src/abstract/gemini.js +11 -0
- package/js/src/src/abstract/hamtapay.d.ts +9 -0
- package/js/src/src/abstract/hamtapay.js +11 -0
- package/js/src/src/abstract/hashkey.d.ts +70 -0
- package/js/src/src/abstract/hashkey.js +11 -0
- package/js/src/src/abstract/hibachi.d.ts +29 -0
- package/js/src/src/abstract/hibachi.js +11 -0
- package/js/src/src/abstract/hitbtc.d.ts +118 -0
- package/js/src/src/abstract/hitbtc.js +11 -0
- package/js/src/src/abstract/hitobit.d.ts +11 -0
- package/js/src/src/abstract/hitobit.js +11 -0
- package/js/src/src/abstract/hollaex.d.ts +36 -0
- package/js/src/src/abstract/hollaex.js +11 -0
- package/js/src/src/abstract/htx.d.ts +551 -0
- package/js/src/src/abstract/htx.js +11 -0
- package/js/src/src/abstract/hyperliquid.d.ts +9 -0
- package/js/src/src/abstract/hyperliquid.js +11 -0
- package/js/src/src/abstract/independentreserve.d.ts +46 -0
- package/js/src/src/abstract/independentreserve.js +11 -0
- package/js/src/src/abstract/indodax.d.ts +29 -0
- package/js/src/src/abstract/indodax.js +11 -0
- package/js/src/src/abstract/iranexchange.d.ts +9 -0
- package/js/src/src/abstract/iranexchange.js +11 -0
- package/js/src/src/abstract/jibitex.d.ts +10 -0
- package/js/src/src/abstract/jibitex.js +11 -0
- package/js/src/src/abstract/kcex.d.ts +10 -0
- package/js/src/src/abstract/kcex.js +11 -0
- package/js/src/src/abstract/kifpoolme.d.ts +9 -0
- package/js/src/src/abstract/kifpoolme.js +11 -0
- package/js/src/src/abstract/kraken.d.ts +61 -0
- package/js/src/src/abstract/kraken.js +11 -0
- package/js/src/src/abstract/krakenfutures.d.ts +45 -0
- package/js/src/src/abstract/krakenfutures.js +11 -0
- package/js/src/src/abstract/kucoin.d.ts +227 -0
- package/js/src/src/abstract/kucoin.js +11 -0
- package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
- package/js/src/src/abstract/kucoinfutures.js +11 -0
- package/js/src/src/abstract/latoken.d.ts +59 -0
- package/js/src/src/abstract/latoken.js +11 -0
- package/js/src/src/abstract/lbank.d.ts +65 -0
- package/js/src/src/abstract/lbank.js +11 -0
- package/js/src/src/abstract/luno.d.ts +41 -0
- package/js/src/src/abstract/luno.js +11 -0
- package/js/src/src/abstract/mazdax.d.ts +11 -0
- package/js/src/src/abstract/mazdax.js +11 -0
- package/js/src/src/abstract/mercado.d.ts +28 -0
- package/js/src/src/abstract/mercado.js +11 -0
- package/js/src/src/abstract/mexc.d.ts +183 -0
- package/js/src/src/abstract/mexc.js +11 -0
- package/js/src/src/abstract/modetrade.d.ts +122 -0
- package/js/src/src/abstract/modetrade.js +11 -0
- package/js/src/src/abstract/ndax.d.ts +100 -0
- package/js/src/src/abstract/ndax.js +11 -0
- package/js/src/src/abstract/nobitex.d.ts +10 -0
- package/js/src/src/abstract/nobitex.js +11 -0
- package/js/src/src/abstract/novadax.d.ts +32 -0
- package/js/src/src/abstract/novadax.js +11 -0
- package/js/src/src/abstract/oceanex.d.ts +30 -0
- package/js/src/src/abstract/oceanex.js +11 -0
- package/js/src/src/abstract/okcoin.d.ts +77 -0
- package/js/src/src/abstract/okcoin.js +11 -0
- package/js/src/src/abstract/okexchange.d.ts +11 -0
- package/js/src/src/abstract/okexchange.js +11 -0
- package/js/src/src/abstract/okx.d.ts +352 -0
- package/js/src/src/abstract/okx.js +11 -0
- package/js/src/src/abstract/ompfinex.d.ts +10 -0
- package/js/src/src/abstract/ompfinex.js +11 -0
- package/js/src/src/abstract/onetrading.d.ts +26 -0
- package/js/src/src/abstract/onetrading.js +11 -0
- package/js/src/src/abstract/oxfun.d.ts +37 -0
- package/js/src/src/abstract/oxfun.js +11 -0
- package/js/src/src/abstract/p2b.d.ts +25 -0
- package/js/src/src/abstract/p2b.js +11 -0
- package/js/src/src/abstract/paradex.d.ts +66 -0
- package/js/src/src/abstract/paradex.js +11 -0
- package/js/src/src/abstract/paymium.d.ts +31 -0
- package/js/src/src/abstract/paymium.js +11 -0
- package/js/src/src/abstract/phemex.d.ts +120 -0
- package/js/src/src/abstract/phemex.js +11 -0
- package/js/src/src/abstract/pingi.d.ts +9 -0
- package/js/src/src/abstract/pingi.js +11 -0
- package/js/src/src/abstract/poloniex.d.ts +108 -0
- package/js/src/src/abstract/poloniex.js +11 -0
- package/js/src/src/abstract/pooleno.d.ts +8 -0
- package/js/src/src/abstract/pooleno.js +11 -0
- package/js/src/src/abstract/probit.d.ts +26 -0
- package/js/src/src/abstract/probit.js +11 -0
- package/js/src/src/abstract/raastin.d.ts +11 -0
- package/js/src/src/abstract/raastin.js +11 -0
- package/js/src/src/abstract/ramzinex.d.ts +10 -0
- package/js/src/src/abstract/ramzinex.js +11 -0
- package/js/src/src/abstract/sarmayex.d.ts +8 -0
- package/js/src/src/abstract/sarmayex.js +11 -0
- package/js/src/src/abstract/sarrafex.d.ts +10 -0
- package/js/src/src/abstract/sarrafex.js +11 -0
- package/js/src/src/abstract/tabdeal.d.ts +10 -0
- package/js/src/src/abstract/tabdeal.js +11 -0
- package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
- package/js/src/src/abstract/tehran_exchange.js +11 -0
- package/js/src/src/abstract/tetherland.d.ts +8 -0
- package/js/src/src/abstract/tetherland.js +11 -0
- package/js/src/src/abstract/timex.d.ts +65 -0
- package/js/src/src/abstract/timex.js +11 -0
- package/js/src/src/abstract/tokocrypto.d.ts +40 -0
- package/js/src/src/abstract/tokocrypto.js +11 -0
- package/js/src/src/abstract/toobit.d.ts +10 -0
- package/js/src/src/abstract/toobit.js +11 -0
- package/js/src/src/abstract/tradeogre.d.ts +21 -0
- package/js/src/src/abstract/tradeogre.js +11 -0
- package/js/src/src/abstract/twox.d.ts +8 -0
- package/js/src/src/abstract/twox.js +11 -0
- package/js/src/src/abstract/ubitex.d.ts +10 -0
- package/js/src/src/abstract/ubitex.js +11 -0
- package/js/src/src/abstract/upbit.d.ts +58 -0
- package/js/src/src/abstract/upbit.js +11 -0
- package/js/src/src/abstract/vertex.d.ts +22 -0
- package/js/src/src/abstract/vertex.js +11 -0
- package/js/src/src/abstract/wallex.d.ts +11 -0
- package/js/src/src/abstract/wallex.js +11 -0
- package/js/src/src/abstract/wavesexchange.d.ts +157 -0
- package/js/src/src/abstract/wavesexchange.js +11 -0
- package/js/src/src/abstract/whitebit.d.ts +117 -0
- package/js/src/src/abstract/whitebit.js +11 -0
- package/js/src/src/abstract/woo.d.ts +144 -0
- package/js/src/src/abstract/woo.js +11 -0
- package/js/src/src/abstract/woofipro.d.ts +122 -0
- package/js/src/src/abstract/woofipro.js +11 -0
- package/js/src/src/abstract/xt.d.ts +160 -0
- package/js/src/src/abstract/xt.js +11 -0
- package/js/src/src/abstract/yobit.d.ts +19 -0
- package/js/src/src/abstract/yobit.js +11 -0
- package/js/src/src/abstract/zaif.d.ts +41 -0
- package/js/src/src/abstract/zaif.js +11 -0
- package/js/src/src/abstract/zonda.d.ts +56 -0
- package/js/src/src/abstract/zonda.js +11 -0
- package/js/src/src/afratether.d.ts +21 -0
- package/js/src/src/afratether.js +356 -0
- package/js/src/src/alpaca.d.ts +332 -0
- package/js/src/src/alpaca.js +1908 -0
- package/js/src/src/apex.d.ts +333 -0
- package/js/src/src/apex.js +1942 -0
- package/js/src/src/arzinja.d.ts +21 -0
- package/js/src/src/arzinja.js +298 -0
- package/js/src/src/arzplus.d.ts +26 -0
- package/js/src/src/arzplus.js +581 -0
- package/js/src/src/ascendex.d.ts +424 -0
- package/js/src/src/ascendex.js +3699 -0
- package/js/src/src/asretether.d.ts +21 -0
- package/js/src/src/asretether.js +324 -0
- package/js/src/src/base/Exchange.d.ts +926 -0
- package/js/src/src/base/Exchange.js +7399 -0
- package/js/src/src/base/Precise.d.ts +42 -0
- package/js/src/src/base/Precise.js +275 -0
- package/js/src/src/base/errors.d.ts +168 -0
- package/js/src/src/base/errors.js +255 -0
- package/js/src/src/base/functions/crypto.d.ts +16 -0
- package/js/src/src/base/functions/crypto.js +131 -0
- package/js/src/src/base/functions/encode.d.ts +4 -0
- package/js/src/src/base/functions/encode.js +32 -0
- package/js/src/src/base/functions/generic.d.ts +29 -0
- package/js/src/src/base/functions/generic.js +203 -0
- package/js/src/src/base/functions/misc.d.ts +9 -0
- package/js/src/src/base/functions/misc.js +101 -0
- package/js/src/src/base/functions/number.d.ts +27 -0
- package/js/src/src/base/functions/number.js +313 -0
- package/js/src/src/base/functions/platform.d.ts +7 -0
- package/js/src/src/base/functions/platform.js +27 -0
- package/js/src/src/base/functions/rsa.d.ts +5 -0
- package/js/src/src/base/functions/rsa.js +49 -0
- package/js/src/src/base/functions/string.d.ts +7 -0
- package/js/src/src/base/functions/string.js +44 -0
- package/js/src/src/base/functions/throttle.d.ts +6 -0
- package/js/src/src/base/functions/throttle.js +67 -0
- package/js/src/src/base/functions/time.d.ts +21 -0
- package/js/src/src/base/functions/time.js +171 -0
- package/js/src/src/base/functions/totp.d.ts +3 -0
- package/js/src/src/base/functions/totp.js +25 -0
- package/js/src/src/base/functions/type.d.ts +37 -0
- package/js/src/src/base/functions/type.js +179 -0
- package/js/src/src/base/functions.d.ts +10 -0
- package/js/src/src/base/functions.js +18 -0
- package/js/src/src/base/types.d.ts +586 -0
- package/js/src/src/base/types.js +7 -0
- package/js/src/src/base/ws/Cache.d.ts +27 -0
- package/js/src/src/base/ws/Cache.js +260 -0
- package/js/src/src/base/ws/Client.d.ts +53 -0
- package/js/src/src/base/ws/Client.js +307 -0
- package/js/src/src/base/ws/Future.d.ts +8 -0
- package/js/src/src/base/ws/Future.js +35 -0
- package/js/src/src/base/ws/OrderBook.d.ts +25 -0
- package/js/src/src/base/ws/OrderBook.js +130 -0
- package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
- package/js/src/src/base/ws/OrderBookSide.js +286 -0
- package/js/src/src/base/ws/WsClient.d.ts +11 -0
- package/js/src/src/base/ws/WsClient.js +69 -0
- package/js/src/src/bequant.d.ts +4 -0
- package/js/src/src/bequant.js +35 -0
- package/js/src/src/bidarz.d.ts +16 -0
- package/js/src/src/bidarz.js +327 -0
- package/js/src/src/bigone.d.ts +296 -0
- package/js/src/src/bigone.js +2340 -0
- package/js/src/src/binance.d.ts +1667 -0
- package/js/src/src/binance.js +14400 -0
- package/js/src/src/binancecoinm.d.ts +6 -0
- package/js/src/src/binancecoinm.js +51 -0
- package/js/src/src/binanceus.d.ts +4 -0
- package/js/src/src/binanceus.js +225 -0
- package/js/src/src/binanceusdm.d.ts +6 -0
- package/js/src/src/binanceusdm.js +63 -0
- package/js/src/src/bingx.d.ts +778 -0
- package/js/src/src/bingx.js +6705 -0
- package/js/src/src/bit24.d.ts +24 -0
- package/js/src/src/bit24.js +520 -0
- package/js/src/src/bit2c.d.ts +146 -0
- package/js/src/src/bit2c.js +1029 -0
- package/js/src/src/bitbank.d.ts +181 -0
- package/js/src/src/bitbank.js +1146 -0
- package/js/src/src/bitbarg.d.ts +21 -0
- package/js/src/src/bitbarg.js +312 -0
- package/js/src/src/bitbns.d.ts +184 -0
- package/js/src/src/bitbns.js +1288 -0
- package/js/src/src/bitfinex.d.ts +516 -0
- package/js/src/src/bitfinex.js +3951 -0
- package/js/src/src/bitflyer.d.ts +229 -0
- package/js/src/src/bitflyer.js +1209 -0
- package/js/src/src/bitget.d.ts +1109 -0
- package/js/src/src/bitget.js +11033 -0
- package/js/src/src/bithumb.d.ts +165 -0
- package/js/src/src/bithumb.js +1257 -0
- package/js/src/src/bitimen.d.ts +23 -0
- package/js/src/src/bitimen.js +424 -0
- package/js/src/src/bitir.d.ts +23 -0
- package/js/src/src/bitir.js +521 -0
- package/js/src/src/bitmart.d.ts +736 -0
- package/js/src/src/bitmart.js +5639 -0
- package/js/src/src/bitmex.d.ts +395 -0
- package/js/src/src/bitmex.js +3088 -0
- package/js/src/src/bitopro.d.ts +295 -0
- package/js/src/src/bitopro.js +1892 -0
- package/js/src/src/bitpin.d.ts +23 -0
- package/js/src/src/bitpin.js +487 -0
- package/js/src/src/bitrue.d.ts +384 -0
- package/js/src/src/bitrue.js +3382 -0
- package/js/src/src/bitso.d.ts +270 -0
- package/js/src/src/bitso.js +1881 -0
- package/js/src/src/bitstamp.d.ts +355 -0
- package/js/src/src/bitstamp.js +2445 -0
- package/js/src/src/bitteam.d.ts +229 -0
- package/js/src/src/bitteam.js +2420 -0
- package/js/src/src/bittrade.d.ts +298 -0
- package/js/src/src/bittrade.js +2050 -0
- package/js/src/src/bitunix.d.ts +21 -0
- package/js/src/src/bitunix.js +326 -0
- package/js/src/src/bitvavo.d.ts +311 -0
- package/js/src/src/bitvavo.js +2204 -0
- package/js/src/src/blockchaincom.d.ts +256 -0
- package/js/src/src/blockchaincom.js +1259 -0
- package/js/src/src/blofin.d.ts +439 -0
- package/js/src/src/blofin.js +2576 -0
- package/js/src/src/btcalpha.d.ts +209 -0
- package/js/src/src/btcalpha.js +1056 -0
- package/js/src/src/btcbox.d.ts +144 -0
- package/js/src/src/btcbox.js +834 -0
- package/js/src/src/btcmarkets.d.ts +253 -0
- package/js/src/src/btcmarkets.js +1418 -0
- package/js/src/src/btcturk.d.ts +161 -0
- package/js/src/src/btcturk.js +1058 -0
- package/js/src/src/bybit.d.ts +1097 -0
- package/js/src/src/bybit.js +9382 -0
- package/js/src/src/bydfi.d.ts +23 -0
- package/js/src/src/bydfi.js +434 -0
- package/js/src/src/cafearz.d.ts +21 -0
- package/js/src/src/cafearz.js +346 -0
- package/js/src/src/cex.d.ts +286 -0
- package/js/src/src/cex.js +1799 -0
- package/js/src/src/coinbase.d.ts +623 -0
- package/js/src/src/coinbase.js +5220 -0
- package/js/src/src/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/coinbaseadvanced.js +18 -0
- package/js/src/src/coinbaseexchange.d.ts +334 -0
- package/js/src/src/coinbaseexchange.js +2127 -0
- package/js/src/src/coinbaseinternational.d.ts +443 -0
- package/js/src/src/coinbaseinternational.js +2336 -0
- package/js/src/src/coincatch.d.ts +786 -0
- package/js/src/src/coincatch.js +5492 -0
- package/js/src/src/coincheck.d.ts +147 -0
- package/js/src/src/coincheck.js +962 -0
- package/js/src/src/coinex.d.ts +719 -0
- package/js/src/src/coinex.js +6166 -0
- package/js/src/src/coinmate.d.ts +202 -0
- package/js/src/src/coinmate.js +1215 -0
- package/js/src/src/coinmetro.d.ts +244 -0
- package/js/src/src/coinmetro.js +2024 -0
- package/js/src/src/coinone.d.ts +158 -0
- package/js/src/src/coinone.js +1278 -0
- package/js/src/src/coinsph.d.ts +310 -0
- package/js/src/src/coinsph.js +2203 -0
- package/js/src/src/coinspot.d.ts +108 -0
- package/js/src/src/coinspot.js +653 -0
- package/js/src/src/cryptocom.d.ts +463 -0
- package/js/src/src/cryptocom.js +3549 -0
- package/js/src/src/cryptomus.d.ts +158 -0
- package/js/src/src/cryptomus.js +1169 -0
- package/js/src/src/defx.d.ts +348 -0
- package/js/src/src/defx.js +2139 -0
- package/js/src/src/delta.d.ts +407 -0
- package/js/src/src/delta.js +3654 -0
- package/js/src/src/deribit.d.ts +516 -0
- package/js/src/src/deribit.js +3790 -0
- package/js/src/src/derive.d.ts +324 -0
- package/js/src/src/derive.js +2655 -0
- package/js/src/src/digifinex.d.ts +544 -0
- package/js/src/src/digifinex.js +4453 -0
- package/js/src/src/ellipx.d.ts +237 -0
- package/js/src/src/ellipx.js +2071 -0
- package/js/src/src/eterex.d.ts +21 -0
- package/js/src/src/eterex.js +299 -0
- package/js/src/src/excoino.d.ts +23 -0
- package/js/src/src/excoino.js +426 -0
- package/js/src/src/exir.d.ts +23 -0
- package/js/src/src/exir.js +403 -0
- package/js/src/src/exmo.d.ts +426 -0
- package/js/src/src/exmo.js +2825 -0
- package/js/src/src/exnovin.d.ts +22 -0
- package/js/src/src/exnovin.js +378 -0
- package/js/src/src/farhadexchange.d.ts +21 -0
- package/js/src/src/farhadexchange.js +280 -0
- package/js/src/src/fmfwio.d.ts +4 -0
- package/js/src/src/fmfwio.js +35 -0
- package/js/src/src/foxbit.d.ts +352 -0
- package/js/src/src/foxbit.js +2016 -0
- package/js/src/src/gate.d.ts +1071 -0
- package/js/src/src/gate.js +8282 -0
- package/js/src/src/gateio.d.ts +4 -0
- package/js/src/src/gateio.js +17 -0
- package/js/src/src/gemini.d.ts +257 -0
- package/js/src/src/gemini.js +2006 -0
- package/js/src/src/hamtapay.d.ts +21 -0
- package/js/src/src/hamtapay.js +303 -0
- package/js/src/src/hashkey.d.ts +628 -0
- package/js/src/src/hashkey.js +4363 -0
- package/js/src/src/hibachi.d.ts +346 -0
- package/js/src/src/hibachi.js +2137 -0
- package/js/src/src/hitbtc.d.ts +558 -0
- package/js/src/src/hitbtc.js +3847 -0
- package/js/src/src/hitobit.d.ts +23 -0
- package/js/src/src/hitobit.js +412 -0
- package/js/src/src/hollaex.d.ts +305 -0
- package/js/src/src/hollaex.js +2046 -0
- package/js/src/src/htx.d.ts +961 -0
- package/js/src/src/htx.js +9668 -0
- package/js/src/src/huobi.d.ts +4 -0
- package/js/src/src/huobi.js +17 -0
- package/js/src/src/hyperliquid.d.ts +651 -0
- package/js/src/src/hyperliquid.js +3937 -0
- package/js/src/src/independentreserve.d.ts +169 -0
- package/js/src/src/independentreserve.js +1115 -0
- package/js/src/src/indodax.d.ts +217 -0
- package/js/src/src/indodax.js +1454 -0
- package/js/src/src/iranexchange.d.ts +21 -0
- package/js/src/src/iranexchange.js +399 -0
- package/js/src/src/jibitex.d.ts +23 -0
- package/js/src/src/jibitex.js +416 -0
- package/js/src/src/kcex.d.ts +21 -0
- package/js/src/src/kcex.js +335 -0
- package/js/src/src/kifpoolme.d.ts +23 -0
- package/js/src/src/kifpoolme.js +410 -0
- package/js/src/src/kraken.d.ts +484 -0
- package/js/src/src/kraken.js +3518 -0
- package/js/src/src/krakenfutures.d.ts +362 -0
- package/js/src/src/krakenfutures.js +2885 -0
- package/js/src/src/kucoin.d.ts +759 -0
- package/js/src/src/kucoin.js +5153 -0
- package/js/src/src/kucoinfutures.d.ts +521 -0
- package/js/src/src/kucoinfutures.js +3381 -0
- package/js/src/src/latoken.d.ts +274 -0
- package/js/src/src/latoken.js +1824 -0
- package/js/src/src/lbank.d.ts +350 -0
- package/js/src/src/lbank.js +3146 -0
- package/js/src/src/luno.d.ts +252 -0
- package/js/src/src/luno.js +1479 -0
- package/js/src/src/mazdax.d.ts +23 -0
- package/js/src/src/mazdax.js +534 -0
- package/js/src/src/mercado.d.ts +160 -0
- package/js/src/src/mercado.js +1011 -0
- package/js/src/src/mexc.d.ts +768 -0
- package/js/src/src/mexc.js +6102 -0
- package/js/src/src/modetrade.d.ts +496 -0
- package/js/src/src/modetrade.js +2936 -0
- package/js/src/src/myokx.d.ts +4 -0
- package/js/src/src/myokx.js +54 -0
- package/js/src/src/ndax.d.ts +285 -0
- package/js/src/src/ndax.js +2598 -0
- package/js/src/src/nobitex.d.ts +23 -0
- package/js/src/src/nobitex.js +454 -0
- package/js/src/src/novadax.d.ts +279 -0
- package/js/src/src/novadax.js +1676 -0
- package/js/src/src/oceanex.d.ts +231 -0
- package/js/src/src/oceanex.js +1123 -0
- package/js/src/src/okcoin.d.ts +346 -0
- package/js/src/src/okcoin.js +3211 -0
- package/js/src/src/okexchange.d.ts +23 -0
- package/js/src/src/okexchange.js +373 -0
- package/js/src/src/okx.d.ts +1125 -0
- package/js/src/src/okx.js +9009 -0
- package/js/src/src/okxus.d.ts +4 -0
- package/js/src/src/okxus.js +54 -0
- package/js/src/src/ompfinex.d.ts +23 -0
- package/js/src/src/ompfinex.js +510 -0
- package/js/src/src/onetrading.d.ts +228 -0
- package/js/src/src/onetrading.js +1769 -0
- package/js/src/src/oxfun.d.ts +442 -0
- package/js/src/src/oxfun.js +2920 -0
- package/js/src/src/p2b.d.ts +189 -0
- package/js/src/src/p2b.js +1344 -0
- package/js/src/src/paradex.d.ts +389 -0
- package/js/src/src/paradex.js +2607 -0
- package/js/src/src/paymium.d.ts +133 -0
- package/js/src/src/paymium.js +644 -0
- package/js/src/src/phemex.d.ts +497 -0
- package/js/src/src/phemex.js +5333 -0
- package/js/src/src/pingi.d.ts +22 -0
- package/js/src/src/pingi.js +446 -0
- package/js/src/src/poloniex.d.ts +441 -0
- package/js/src/src/poloniex.js +3681 -0
- package/js/src/src/pooleno.d.ts +21 -0
- package/js/src/src/pooleno.js +347 -0
- package/js/src/src/pro/alpaca.d.ts +95 -0
- package/js/src/src/pro/alpaca.js +724 -0
- package/js/src/src/pro/apex.d.ts +160 -0
- package/js/src/src/pro/apex.js +1044 -0
- package/js/src/src/pro/ascendex.d.ts +99 -0
- package/js/src/src/pro/ascendex.js +1012 -0
- package/js/src/src/pro/bequant.d.ts +4 -0
- package/js/src/src/pro/bequant.js +42 -0
- package/js/src/src/pro/binance.d.ts +796 -0
- package/js/src/src/pro/binance.js +4373 -0
- package/js/src/src/pro/binancecoinm.d.ts +4 -0
- package/js/src/src/pro/binancecoinm.js +32 -0
- package/js/src/src/pro/binanceus.d.ts +4 -0
- package/js/src/src/pro/binanceus.js +52 -0
- package/js/src/src/pro/binanceusdm.d.ts +4 -0
- package/js/src/src/pro/binanceusdm.js +37 -0
- package/js/src/src/pro/bingx.d.ts +151 -0
- package/js/src/src/pro/bingx.js +1568 -0
- package/js/src/src/pro/bitfinex.d.ts +99 -0
- package/js/src/src/pro/bitfinex.js +1165 -0
- package/js/src/src/pro/bitget.d.ts +257 -0
- package/js/src/src/pro/bitget.js +2327 -0
- package/js/src/src/pro/bithumb.d.ts +59 -0
- package/js/src/src/pro/bithumb.js +395 -0
- package/js/src/src/pro/bitmart.d.ts +168 -0
- package/js/src/src/pro/bitmart.js +1686 -0
- package/js/src/src/pro/bitmex.d.ts +170 -0
- package/js/src/src/pro/bitmex.js +1760 -0
- package/js/src/src/pro/bitopro.d.ts +69 -0
- package/js/src/src/pro/bitopro.js +477 -0
- package/js/src/src/pro/bitrue.d.ts +40 -0
- package/js/src/src/pro/bitrue.js +461 -0
- package/js/src/src/pro/bitstamp.d.ts +53 -0
- package/js/src/src/pro/bitstamp.js +587 -0
- package/js/src/src/pro/bittrade.d.ts +66 -0
- package/js/src/src/pro/bittrade.js +606 -0
- package/js/src/src/pro/bitvavo.d.ts +321 -0
- package/js/src/src/pro/bitvavo.js +1451 -0
- package/js/src/src/pro/blockchaincom.d.ts +89 -0
- package/js/src/src/pro/blockchaincom.js +777 -0
- package/js/src/src/pro/blofin.d.ts +174 -0
- package/js/src/src/pro/blofin.js +743 -0
- package/js/src/src/pro/bybit.d.ts +397 -0
- package/js/src/src/pro/bybit.js +2519 -0
- package/js/src/src/pro/cex.d.ts +220 -0
- package/js/src/src/pro/cex.js +1535 -0
- package/js/src/src/pro/coinbase.d.ts +119 -0
- package/js/src/src/pro/coinbase.js +736 -0
- package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
- package/js/src/src/pro/coinbaseadvanced.js +18 -0
- package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
- package/js/src/src/pro/coinbaseexchange.js +969 -0
- package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
- package/js/src/src/pro/coinbaseinternational.js +804 -0
- package/js/src/src/pro/coincatch.d.ts +207 -0
- package/js/src/src/pro/coincatch.js +1562 -0
- package/js/src/src/pro/coincheck.d.ts +33 -0
- package/js/src/src/pro/coincheck.js +210 -0
- package/js/src/src/pro/coinex.d.ts +147 -0
- package/js/src/src/pro/coinex.js +1426 -0
- package/js/src/src/pro/coinone.d.ts +51 -0
- package/js/src/src/pro/coinone.js +413 -0
- package/js/src/src/pro/cryptocom.d.ts +300 -0
- package/js/src/src/pro/cryptocom.js +1414 -0
- package/js/src/src/pro/defx.d.ts +236 -0
- package/js/src/src/pro/defx.js +865 -0
- package/js/src/src/pro/deribit.d.ts +163 -0
- package/js/src/src/pro/deribit.js +1066 -0
- package/js/src/src/pro/derive.d.ts +100 -0
- package/js/src/src/pro/derive.js +753 -0
- package/js/src/src/pro/exmo.d.ts +97 -0
- package/js/src/src/pro/exmo.js +903 -0
- package/js/src/src/pro/gate.d.ts +360 -0
- package/js/src/src/pro/gate.js +2119 -0
- package/js/src/src/pro/gateio.d.ts +4 -0
- package/js/src/src/pro/gateio.js +17 -0
- package/js/src/src/pro/gemini.d.ts +106 -0
- package/js/src/src/pro/gemini.js +932 -0
- package/js/src/src/pro/hashkey.d.ts +121 -0
- package/js/src/src/pro/hashkey.js +843 -0
- package/js/src/src/pro/hitbtc.d.ts +235 -0
- package/js/src/src/pro/hitbtc.js +1400 -0
- package/js/src/src/pro/hollaex.d.ts +77 -0
- package/js/src/src/pro/hollaex.js +604 -0
- package/js/src/src/pro/htx.d.ts +141 -0
- package/js/src/src/pro/htx.js +2415 -0
- package/js/src/src/pro/huobi.d.ts +4 -0
- package/js/src/src/pro/huobi.js +17 -0
- package/js/src/src/pro/hyperliquid.d.ts +218 -0
- package/js/src/src/pro/hyperliquid.js +1126 -0
- package/js/src/src/pro/independentreserve.d.ts +36 -0
- package/js/src/src/pro/independentreserve.js +287 -0
- package/js/src/src/pro/kraken.d.ts +233 -0
- package/js/src/src/pro/kraken.js +1785 -0
- package/js/src/src/pro/krakenfutures.d.ts +178 -0
- package/js/src/src/pro/krakenfutures.js +1592 -0
- package/js/src/src/pro/kucoin.d.ts +221 -0
- package/js/src/src/pro/kucoin.js +1430 -0
- package/js/src/src/pro/kucoinfutures.d.ts +205 -0
- package/js/src/src/pro/kucoinfutures.js +1295 -0
- package/js/src/src/pro/lbank.d.ts +134 -0
- package/js/src/src/pro/lbank.js +950 -0
- package/js/src/src/pro/luno.d.ts +44 -0
- package/js/src/src/pro/luno.js +322 -0
- package/js/src/src/pro/mexc.d.ts +210 -0
- package/js/src/src/pro/mexc.js +2009 -0
- package/js/src/src/pro/modetrade.d.ts +155 -0
- package/js/src/src/pro/modetrade.js +1335 -0
- package/js/src/src/pro/myokx.d.ts +4 -0
- package/js/src/src/pro/myokx.js +39 -0
- package/js/src/src/pro/ndax.d.ts +60 -0
- package/js/src/src/pro/ndax.js +545 -0
- package/js/src/src/pro/okcoin.d.ts +91 -0
- package/js/src/src/pro/okcoin.js +763 -0
- package/js/src/src/pro/okx.d.ts +408 -0
- package/js/src/src/pro/okx.js +2479 -0
- package/js/src/src/pro/okxus.d.ts +4 -0
- package/js/src/src/pro/okxus.js +39 -0
- package/js/src/src/pro/onetrading.d.ts +107 -0
- package/js/src/src/pro/onetrading.js +1343 -0
- package/js/src/src/pro/oxfun.d.ts +234 -0
- package/js/src/src/pro/oxfun.js +1112 -0
- package/js/src/src/pro/p2b.d.ts +104 -0
- package/js/src/src/pro/p2b.js +506 -0
- package/js/src/src/pro/paradex.d.ts +54 -0
- package/js/src/src/pro/paradex.js +370 -0
- package/js/src/src/pro/phemex.d.ts +129 -0
- package/js/src/src/pro/phemex.js +1569 -0
- package/js/src/src/pro/poloniex.d.ts +214 -0
- package/js/src/src/pro/poloniex.js +1318 -0
- package/js/src/src/pro/probit.d.ts +91 -0
- package/js/src/src/pro/probit.js +593 -0
- package/js/src/src/pro/tradeogre.d.ts +49 -0
- package/js/src/src/pro/tradeogre.js +284 -0
- package/js/src/src/pro/upbit.d.ts +124 -0
- package/js/src/src/pro/upbit.js +689 -0
- package/js/src/src/pro/vertex.d.ts +104 -0
- package/js/src/src/pro/vertex.js +999 -0
- package/js/src/src/pro/whitebit.d.ts +123 -0
- package/js/src/src/pro/whitebit.js +971 -0
- package/js/src/src/pro/woo.d.ts +161 -0
- package/js/src/src/pro/woo.js +1351 -0
- package/js/src/src/pro/woofipro.d.ts +155 -0
- package/js/src/src/pro/woofipro.js +1335 -0
- package/js/src/src/pro/xt.d.ts +165 -0
- package/js/src/src/pro/xt.js +1230 -0
- package/js/src/src/probit.d.ts +283 -0
- package/js/src/src/probit.js +1935 -0
- package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
- package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
- package/js/src/src/raastin.d.ts +24 -0
- package/js/src/src/raastin.js +494 -0
- package/js/src/src/ramzinex.d.ts +23 -0
- package/js/src/src/ramzinex.js +510 -0
- package/js/src/src/sarmayex.d.ts +21 -0
- package/js/src/src/sarmayex.js +376 -0
- package/js/src/src/sarrafex.d.ts +23 -0
- package/js/src/src/sarrafex.js +501 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
- package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
- package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
- package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
- package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
- package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
- package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
- package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
- package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
- package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
- package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
- package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
- package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
- package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
- package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
- package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
- package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
- package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
- package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
- package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
- package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
- package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
- package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
- package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
- package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
- package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
- package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
- package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
- package/js/src/src/static_dependencies/ethers/index.js +22 -0
- package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
- package/js/src/src/static_dependencies/ethers/interface.js +990 -0
- package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
- package/js/src/src/static_dependencies/ethers/typed.js +608 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
- package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
- package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
- package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
- package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
- package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
- package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
- package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
- package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
- package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
- package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
- package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
- package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
- package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
- package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
- package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
- package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
- package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
- package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
- package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
- package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
- package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
- package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
- package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
- package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
- package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
- package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
- package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
- package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
- package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
- package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
- package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
- package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
- package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
- package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
- package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
- package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
- package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
- package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
- package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
- package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
- package/js/src/src/static_dependencies/qs/index.cjs +15 -0
- package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
- package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
- package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
- package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
- package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
- package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
- package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
- package/js/src/src/static_dependencies/scure-base/index.js +420 -0
- package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
- package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
- package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
- package/js/src/src/static_dependencies/starknet/constants.js +67 -0
- package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
- package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
- package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
- package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
- package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
- package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
- package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
- package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
- package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
- package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
- package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
- package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
- package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
- package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
- package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
- package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
- package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
- package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
- package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
- package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
- package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
- package/js/src/src/tabdeal.d.ts +23 -0
- package/js/src/src/tabdeal.js +387 -0
- package/js/src/src/tehran_exchange.d.ts +21 -0
- package/js/src/src/tehran_exchange.js +333 -0
- package/js/src/src/tetherland.d.ts +21 -0
- package/js/src/src/tetherland.js +367 -0
- package/js/src/src/timex.d.ts +247 -0
- package/js/src/src/timex.js +1792 -0
- package/js/src/src/tokocrypto.d.ts +261 -0
- package/js/src/src/tokocrypto.js +2641 -0
- package/js/src/src/toobit.d.ts +22 -0
- package/js/src/src/toobit.js +445 -0
- package/js/src/src/tradeogre.d.ts +149 -0
- package/js/src/src/tradeogre.js +878 -0
- package/js/src/src/twox.d.ts +21 -0
- package/js/src/src/twox.js +371 -0
- package/js/src/src/ubitex.d.ts +23 -0
- package/js/src/src/ubitex.js +433 -0
- package/js/src/src/upbit.d.ts +377 -0
- package/js/src/src/upbit.js +2340 -0
- package/js/src/src/vertex.d.ts +346 -0
- package/js/src/src/vertex.js +3146 -0
- package/js/src/src/wallex.d.ts +23 -0
- package/js/src/src/wallex.js +467 -0
- package/js/src/src/wavesexchange.d.ts +244 -0
- package/js/src/src/wavesexchange.js +2747 -0
- package/js/src/src/whitebit.d.ts +571 -0
- package/js/src/src/whitebit.js +3437 -0
- package/js/src/src/woo.d.ts +727 -0
- package/js/src/src/woo.js +4183 -0
- package/js/src/src/woofipro.d.ts +497 -0
- package/js/src/src/woofipro.js +2941 -0
- package/js/src/src/xt.d.ts +568 -0
- package/js/src/src/xt.js +5184 -0
- package/js/src/src/yobit.d.ts +197 -0
- package/js/src/src/yobit.js +1453 -0
- package/js/src/src/zaif.d.ts +136 -0
- package/js/src/src/zaif.js +821 -0
- package/js/src/src/zonda.d.ts +214 -0
- package/js/src/src/zonda.js +1984 -0
- package/js/test.js +3 -3
- 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
|
+
}
|