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,3382 @@
|
|
|
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/bitrue.js';
|
|
9
|
+
import { ExchangeError, ArgumentsRequired, ExchangeNotAvailable, InsufficientFunds, OrderNotFound, InvalidOrder, DDoSProtection, InvalidNonce, AuthenticationError, RateLimitExceeded, PermissionDenied, BadRequest, BadSymbol, AccountSuspended, OrderImmediatelyFillable, OnMaintenance, NotSupported } from './base/errors.js';
|
|
10
|
+
import { Precise } from './base/Precise.js';
|
|
11
|
+
import { TRUNCATE, TICK_SIZE } from './base/functions/number.js';
|
|
12
|
+
import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* @class bitrue
|
|
16
|
+
* @augments Exchange
|
|
17
|
+
*/
|
|
18
|
+
export default class bitrue extends Exchange {
|
|
19
|
+
describe() {
|
|
20
|
+
return this.deepExtend(super.describe(), {
|
|
21
|
+
'id': 'bitrue',
|
|
22
|
+
'name': 'Bitrue',
|
|
23
|
+
'countries': ['SG'],
|
|
24
|
+
'rateLimit': 10,
|
|
25
|
+
'certified': false,
|
|
26
|
+
'version': 'v1',
|
|
27
|
+
'pro': true,
|
|
28
|
+
// new metainfo interface
|
|
29
|
+
'has': {
|
|
30
|
+
'CORS': undefined,
|
|
31
|
+
'spot': true,
|
|
32
|
+
'margin': false,
|
|
33
|
+
'swap': true,
|
|
34
|
+
'future': false,
|
|
35
|
+
'option': false,
|
|
36
|
+
'addMargin': false,
|
|
37
|
+
'borrowCrossMargin': false,
|
|
38
|
+
'borrowIsolatedMargin': false,
|
|
39
|
+
'borrowMargin': false,
|
|
40
|
+
'cancelAllOrders': true,
|
|
41
|
+
'cancelOrder': true,
|
|
42
|
+
'closeAllPositions': false,
|
|
43
|
+
'closePosition': false,
|
|
44
|
+
'createMarketBuyOrderWithCost': true,
|
|
45
|
+
'createMarketOrderWithCost': false,
|
|
46
|
+
'createMarketSellOrderWithCost': false,
|
|
47
|
+
'createOrder': true,
|
|
48
|
+
'createOrderWithTakeProfitAndStopLoss': false,
|
|
49
|
+
'createOrderWithTakeProfitAndStopLossWs': false,
|
|
50
|
+
'createReduceOnlyOrder': true,
|
|
51
|
+
'createStopLimitOrder': true,
|
|
52
|
+
'createStopMarketOrder': true,
|
|
53
|
+
'createStopOrder': true,
|
|
54
|
+
'fetchBalance': true,
|
|
55
|
+
'fetchBidsAsks': true,
|
|
56
|
+
'fetchBorrowInterest': false,
|
|
57
|
+
'fetchBorrowRate': false,
|
|
58
|
+
'fetchBorrowRateHistories': false,
|
|
59
|
+
'fetchBorrowRateHistory': false,
|
|
60
|
+
'fetchBorrowRates': false,
|
|
61
|
+
'fetchBorrowRatesPerSymbol': false,
|
|
62
|
+
'fetchClosedOrders': true,
|
|
63
|
+
'fetchCrossBorrowRate': false,
|
|
64
|
+
'fetchCrossBorrowRates': false,
|
|
65
|
+
'fetchCurrencies': true,
|
|
66
|
+
'fetchDepositAddress': false,
|
|
67
|
+
'fetchDeposits': true,
|
|
68
|
+
'fetchDepositsWithdrawals': false,
|
|
69
|
+
'fetchDepositWithdrawFee': 'emulated',
|
|
70
|
+
'fetchDepositWithdrawFees': true,
|
|
71
|
+
'fetchFundingHistory': false,
|
|
72
|
+
'fetchFundingInterval': false,
|
|
73
|
+
'fetchFundingIntervals': false,
|
|
74
|
+
'fetchFundingRate': false,
|
|
75
|
+
'fetchFundingRateHistory': false,
|
|
76
|
+
'fetchFundingRates': false,
|
|
77
|
+
'fetchGreeks': false,
|
|
78
|
+
'fetchIndexOHLCV': false,
|
|
79
|
+
'fetchIsolatedBorrowRate': false,
|
|
80
|
+
'fetchIsolatedBorrowRates': false,
|
|
81
|
+
'fetchIsolatedPositions': false,
|
|
82
|
+
'fetchLeverage': false,
|
|
83
|
+
'fetchLeverages': false,
|
|
84
|
+
'fetchLeverageTiers': false,
|
|
85
|
+
'fetchLiquidations': false,
|
|
86
|
+
'fetchLongShortRatio': false,
|
|
87
|
+
'fetchLongShortRatioHistory': false,
|
|
88
|
+
'fetchMarginAdjustmentHistory': false,
|
|
89
|
+
'fetchMarginMode': false,
|
|
90
|
+
'fetchMarginModes': false,
|
|
91
|
+
'fetchMarketLeverageTiers': false,
|
|
92
|
+
'fetchMarkets': true,
|
|
93
|
+
'fetchMarkOHLCV': false,
|
|
94
|
+
'fetchMarkPrices': false,
|
|
95
|
+
'fetchMyLiquidations': false,
|
|
96
|
+
'fetchMySettlementHistory': false,
|
|
97
|
+
'fetchMyTrades': true,
|
|
98
|
+
'fetchOHLCV': true,
|
|
99
|
+
'fetchOpenInterest': false,
|
|
100
|
+
'fetchOpenInterestHistory': false,
|
|
101
|
+
'fetchOpenInterests': false,
|
|
102
|
+
'fetchOpenOrders': true,
|
|
103
|
+
'fetchOption': false,
|
|
104
|
+
'fetchOptionChain': false,
|
|
105
|
+
'fetchOrder': true,
|
|
106
|
+
'fetchOrderBook': true,
|
|
107
|
+
'fetchOrders': false,
|
|
108
|
+
'fetchPosition': false,
|
|
109
|
+
'fetchPositionHistory': false,
|
|
110
|
+
'fetchPositionMode': false,
|
|
111
|
+
'fetchPositions': false,
|
|
112
|
+
'fetchPositionsHistory': false,
|
|
113
|
+
'fetchPositionsRisk': false,
|
|
114
|
+
'fetchPremiumIndexOHLCV': false,
|
|
115
|
+
'fetchSettlementHistory': false,
|
|
116
|
+
'fetchStatus': true,
|
|
117
|
+
'fetchTicker': true,
|
|
118
|
+
'fetchTickers': true,
|
|
119
|
+
'fetchTime': true,
|
|
120
|
+
'fetchTrades': true,
|
|
121
|
+
'fetchTradingFee': false,
|
|
122
|
+
'fetchTradingFees': false,
|
|
123
|
+
'fetchTransactionFees': false,
|
|
124
|
+
'fetchTransactions': false,
|
|
125
|
+
'fetchTransfers': true,
|
|
126
|
+
'fetchVolatilityHistory': false,
|
|
127
|
+
'fetchWithdrawals': true,
|
|
128
|
+
'reduceMargin': false,
|
|
129
|
+
'repayCrossMargin': false,
|
|
130
|
+
'repayIsolatedMargin': false,
|
|
131
|
+
'setLeverage': true,
|
|
132
|
+
'setMargin': true,
|
|
133
|
+
'setMarginMode': false,
|
|
134
|
+
'setPositionMode': false,
|
|
135
|
+
'transfer': true,
|
|
136
|
+
'withdraw': true,
|
|
137
|
+
},
|
|
138
|
+
'timeframes': {
|
|
139
|
+
'1m': '1m',
|
|
140
|
+
'5m': '5m',
|
|
141
|
+
'15m': '15m',
|
|
142
|
+
'30m': '30m',
|
|
143
|
+
'1h': '1H',
|
|
144
|
+
'2h': '2H',
|
|
145
|
+
'4h': '4H',
|
|
146
|
+
'1d': '1D',
|
|
147
|
+
'1w': '1W',
|
|
148
|
+
},
|
|
149
|
+
'urls': {
|
|
150
|
+
'logo': 'https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e',
|
|
151
|
+
'api': {
|
|
152
|
+
'spot': 'https://www.bitrue.com/api',
|
|
153
|
+
'fapi': 'https://fapi.bitrue.com/fapi',
|
|
154
|
+
'dapi': 'https://fapi.bitrue.com/dapi',
|
|
155
|
+
'kline': 'https://www.bitrue.com/kline-api',
|
|
156
|
+
},
|
|
157
|
+
'www': 'https://www.bitrue.com',
|
|
158
|
+
'referral': 'https://www.bitrue.com/affiliate/landing?cn=600000&inviteCode=EZWETQE',
|
|
159
|
+
'doc': [
|
|
160
|
+
'https://github.com/Bitrue-exchange/bitrue-official-api-docs',
|
|
161
|
+
'https://www.bitrue.com/api-docs',
|
|
162
|
+
],
|
|
163
|
+
'fees': 'https://bitrue.zendesk.com/hc/en-001/articles/4405479952537',
|
|
164
|
+
},
|
|
165
|
+
// from spotV1PublicGetExchangeInfo:
|
|
166
|
+
// general 25000 weight in 1 minute per IP. = 416.66 per second a weight of 0.24 for 1
|
|
167
|
+
// orders 750 weight in 6 seconds per IP. = 125 per second a weight of 0.8 for 1
|
|
168
|
+
// orders 200 weight in 10 seconds per User. = 20 per second a weight of 5 for 1
|
|
169
|
+
// withdraw 3000 weight in 1 hour per User. = 0.833 per second a weight of 120 for 1
|
|
170
|
+
// withdraw 1000 weight in 1 day per User. = 0.011574 per second a weight of 8640 for 1
|
|
171
|
+
'api': {
|
|
172
|
+
'spot': {
|
|
173
|
+
'kline': {
|
|
174
|
+
'public': {
|
|
175
|
+
'get': {
|
|
176
|
+
'public.json': 0.24,
|
|
177
|
+
'public{currency}.json': 0.24,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
'v1': {
|
|
182
|
+
'public': {
|
|
183
|
+
'get': {
|
|
184
|
+
'ping': 0.24,
|
|
185
|
+
'time': 0.24,
|
|
186
|
+
'exchangeInfo': 0.24,
|
|
187
|
+
'depth': { 'cost': 1, 'byLimit': [[100, 0.24], [500, 1.2], [1000, 2.4]] },
|
|
188
|
+
'trades': 0.24,
|
|
189
|
+
'historicalTrades': 1.2,
|
|
190
|
+
'aggTrades': 0.24,
|
|
191
|
+
'ticker/24hr': { 'cost': 0.24, 'noSymbol': 9.6 },
|
|
192
|
+
'ticker/price': 0.24,
|
|
193
|
+
'ticker/bookTicker': 0.24,
|
|
194
|
+
'market/kline': 0.24,
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
'private': {
|
|
198
|
+
'get': {
|
|
199
|
+
'order': 5,
|
|
200
|
+
'openOrders': 5,
|
|
201
|
+
'allOrders': 25,
|
|
202
|
+
'account': 25,
|
|
203
|
+
'myTrades': 25,
|
|
204
|
+
'etf/net-value/{symbol}': 0.24,
|
|
205
|
+
'withdraw/history': 120,
|
|
206
|
+
'deposit/history': 120,
|
|
207
|
+
},
|
|
208
|
+
'post': {
|
|
209
|
+
'order': 5,
|
|
210
|
+
'withdraw/commit': 120,
|
|
211
|
+
},
|
|
212
|
+
'delete': {
|
|
213
|
+
'order': 5,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
'v2': {
|
|
218
|
+
'private': {
|
|
219
|
+
'get': {
|
|
220
|
+
'myTrades': 1.2,
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
'fapi': {
|
|
226
|
+
'v1': {
|
|
227
|
+
'public': {
|
|
228
|
+
'get': {
|
|
229
|
+
'ping': 0.24,
|
|
230
|
+
'time': 0.24,
|
|
231
|
+
'contracts': 0.24,
|
|
232
|
+
'depth': 0.24,
|
|
233
|
+
'ticker': 0.24,
|
|
234
|
+
'klines': 0.24,
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
'v2': {
|
|
239
|
+
'private': {
|
|
240
|
+
'get': {
|
|
241
|
+
'myTrades': 5,
|
|
242
|
+
'openOrders': 5,
|
|
243
|
+
'order': 5,
|
|
244
|
+
'account': 5,
|
|
245
|
+
'leverageBracket': 5,
|
|
246
|
+
'commissionRate': 5,
|
|
247
|
+
'futures_transfer_history': 5,
|
|
248
|
+
'forceOrdersHistory': 5,
|
|
249
|
+
},
|
|
250
|
+
'post': {
|
|
251
|
+
'positionMargin': 5,
|
|
252
|
+
'level_edit': 5,
|
|
253
|
+
'cancel': 5,
|
|
254
|
+
'order': 25,
|
|
255
|
+
'allOpenOrders': 5,
|
|
256
|
+
'futures_transfer': 5,
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
'dapi': {
|
|
262
|
+
'v1': {
|
|
263
|
+
'public': {
|
|
264
|
+
'get': {
|
|
265
|
+
'ping': 0.24,
|
|
266
|
+
'time': 0.24,
|
|
267
|
+
'contracts': 0.24,
|
|
268
|
+
'depth': 0.24,
|
|
269
|
+
'ticker': 0.24,
|
|
270
|
+
'klines': 0.24,
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
'v2': {
|
|
275
|
+
'private': {
|
|
276
|
+
'get': {
|
|
277
|
+
'myTrades': 5,
|
|
278
|
+
'openOrders': 5,
|
|
279
|
+
'order': 5,
|
|
280
|
+
'account': 5,
|
|
281
|
+
'leverageBracket': 5,
|
|
282
|
+
'commissionRate': 5,
|
|
283
|
+
'futures_transfer_history': 5,
|
|
284
|
+
'forceOrdersHistory': 5,
|
|
285
|
+
},
|
|
286
|
+
'post': {
|
|
287
|
+
'positionMargin': 5,
|
|
288
|
+
'level_edit': 5,
|
|
289
|
+
'cancel': 5,
|
|
290
|
+
'order': 5,
|
|
291
|
+
'allOpenOrders': 5,
|
|
292
|
+
'futures_transfer': 5,
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
'fees': {
|
|
299
|
+
'trading': {
|
|
300
|
+
'feeSide': 'get',
|
|
301
|
+
'tierBased': false,
|
|
302
|
+
'percentage': true,
|
|
303
|
+
'taker': this.parseNumber('0.00098'),
|
|
304
|
+
'maker': this.parseNumber('0.00098'),
|
|
305
|
+
},
|
|
306
|
+
'future': {
|
|
307
|
+
'trading': {
|
|
308
|
+
'feeSide': 'quote',
|
|
309
|
+
'tierBased': true,
|
|
310
|
+
'percentage': true,
|
|
311
|
+
'taker': this.parseNumber('0.000400'),
|
|
312
|
+
'maker': this.parseNumber('0.000200'),
|
|
313
|
+
'tiers': {
|
|
314
|
+
'taker': [
|
|
315
|
+
[this.parseNumber('0'), this.parseNumber('0.000400')],
|
|
316
|
+
[this.parseNumber('250'), this.parseNumber('0.000400')],
|
|
317
|
+
[this.parseNumber('2500'), this.parseNumber('0.000350')],
|
|
318
|
+
[this.parseNumber('7500'), this.parseNumber('0.000320')],
|
|
319
|
+
[this.parseNumber('22500'), this.parseNumber('0.000300')],
|
|
320
|
+
[this.parseNumber('50000'), this.parseNumber('0.000270')],
|
|
321
|
+
[this.parseNumber('100000'), this.parseNumber('0.000250')],
|
|
322
|
+
[this.parseNumber('200000'), this.parseNumber('0.000220')],
|
|
323
|
+
[this.parseNumber('400000'), this.parseNumber('0.000200')],
|
|
324
|
+
[this.parseNumber('750000'), this.parseNumber('0.000170')],
|
|
325
|
+
],
|
|
326
|
+
'maker': [
|
|
327
|
+
[this.parseNumber('0'), this.parseNumber('0.000200')],
|
|
328
|
+
[this.parseNumber('250'), this.parseNumber('0.000160')],
|
|
329
|
+
[this.parseNumber('2500'), this.parseNumber('0.000140')],
|
|
330
|
+
[this.parseNumber('7500'), this.parseNumber('0.000120')],
|
|
331
|
+
[this.parseNumber('22500'), this.parseNumber('0.000100')],
|
|
332
|
+
[this.parseNumber('50000'), this.parseNumber('0.000080')],
|
|
333
|
+
[this.parseNumber('100000'), this.parseNumber('0.000060')],
|
|
334
|
+
[this.parseNumber('200000'), this.parseNumber('0.000040')],
|
|
335
|
+
[this.parseNumber('400000'), this.parseNumber('0.000020')],
|
|
336
|
+
[this.parseNumber('750000'), this.parseNumber('0')],
|
|
337
|
+
],
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
'delivery': {
|
|
342
|
+
'trading': {
|
|
343
|
+
'feeSide': 'base',
|
|
344
|
+
'tierBased': true,
|
|
345
|
+
'percentage': true,
|
|
346
|
+
'taker': this.parseNumber('0.000500'),
|
|
347
|
+
'maker': this.parseNumber('0.000100'),
|
|
348
|
+
'tiers': {
|
|
349
|
+
'taker': [
|
|
350
|
+
[this.parseNumber('0'), this.parseNumber('0.000500')],
|
|
351
|
+
[this.parseNumber('250'), this.parseNumber('0.000450')],
|
|
352
|
+
[this.parseNumber('2500'), this.parseNumber('0.000400')],
|
|
353
|
+
[this.parseNumber('7500'), this.parseNumber('0.000300')],
|
|
354
|
+
[this.parseNumber('22500'), this.parseNumber('0.000250')],
|
|
355
|
+
[this.parseNumber('50000'), this.parseNumber('0.000240')],
|
|
356
|
+
[this.parseNumber('100000'), this.parseNumber('0.000240')],
|
|
357
|
+
[this.parseNumber('200000'), this.parseNumber('0.000240')],
|
|
358
|
+
[this.parseNumber('400000'), this.parseNumber('0.000240')],
|
|
359
|
+
[this.parseNumber('750000'), this.parseNumber('0.000240')],
|
|
360
|
+
],
|
|
361
|
+
'maker': [
|
|
362
|
+
[this.parseNumber('0'), this.parseNumber('0.000100')],
|
|
363
|
+
[this.parseNumber('250'), this.parseNumber('0.000080')],
|
|
364
|
+
[this.parseNumber('2500'), this.parseNumber('0.000050')],
|
|
365
|
+
[this.parseNumber('7500'), this.parseNumber('0.0000030')],
|
|
366
|
+
[this.parseNumber('22500'), this.parseNumber('0')],
|
|
367
|
+
[this.parseNumber('50000'), this.parseNumber('-0.000050')],
|
|
368
|
+
[this.parseNumber('100000'), this.parseNumber('-0.000060')],
|
|
369
|
+
[this.parseNumber('200000'), this.parseNumber('-0.000070')],
|
|
370
|
+
[this.parseNumber('400000'), this.parseNumber('-0.000080')],
|
|
371
|
+
[this.parseNumber('750000'), this.parseNumber('-0.000090')],
|
|
372
|
+
],
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
// exchange-specific options
|
|
378
|
+
'options': {
|
|
379
|
+
'createMarketBuyOrderRequiresPrice': true,
|
|
380
|
+
'fetchMarkets': {
|
|
381
|
+
'types': ['spot', 'linear', 'inverse'],
|
|
382
|
+
},
|
|
383
|
+
// 'fetchTradesMethod': 'publicGetAggTrades', // publicGetTrades, publicGetHistoricalTrades
|
|
384
|
+
'fetchMyTradesMethod': 'v2PrivateGetMyTrades',
|
|
385
|
+
'hasAlreadyAuthenticatedSuccessfully': false,
|
|
386
|
+
'currencyToPrecisionRoundingMode': TRUNCATE,
|
|
387
|
+
'recvWindow': 5 * 1000,
|
|
388
|
+
'timeDifference': 0,
|
|
389
|
+
'adjustForTimeDifference': false,
|
|
390
|
+
'parseOrderToPrecision': false,
|
|
391
|
+
'newOrderRespType': {
|
|
392
|
+
'market': 'FULL',
|
|
393
|
+
'limit': 'FULL', // we change it from 'ACK' by default to 'FULL' (returns immediately if limit is not hit)
|
|
394
|
+
},
|
|
395
|
+
'networks': {
|
|
396
|
+
'ERC20': 'ETH',
|
|
397
|
+
'TRC20': 'TRX',
|
|
398
|
+
'AETERNITY': 'Aeternity',
|
|
399
|
+
'AION': 'AION',
|
|
400
|
+
'ALGO': 'Algorand',
|
|
401
|
+
'ASK': 'ASK',
|
|
402
|
+
'ATOM': 'ATOM',
|
|
403
|
+
'AVAXC': 'AVAX C-Chain',
|
|
404
|
+
'BCH': 'BCH',
|
|
405
|
+
'BEP2': 'BEP2',
|
|
406
|
+
'BEP20': 'BEP20',
|
|
407
|
+
'Bitcoin': 'Bitcoin',
|
|
408
|
+
'BRP20': 'BRP20',
|
|
409
|
+
'ADA': 'Cardano',
|
|
410
|
+
'CASINOCOIN': 'CasinoCoin',
|
|
411
|
+
'CASINOCOIN-XRPL': 'CasinoCoin XRPL',
|
|
412
|
+
'CONTENTOS': 'Contentos',
|
|
413
|
+
'DASH': 'Dash',
|
|
414
|
+
'DECOIN': 'Decoin',
|
|
415
|
+
'DFI': 'DeFiChain',
|
|
416
|
+
'DGB': 'DGB',
|
|
417
|
+
'DIVI': 'Divi',
|
|
418
|
+
'DOGE': 'dogecoin',
|
|
419
|
+
'EOS': 'EOS',
|
|
420
|
+
'ETC': 'ETC',
|
|
421
|
+
'FILECOIN': 'Filecoin',
|
|
422
|
+
'FREETON': 'FREETON',
|
|
423
|
+
'HBAR': 'HBAR',
|
|
424
|
+
'HEDERA': 'Hedera Hashgraph',
|
|
425
|
+
'HRC20': 'HRC20',
|
|
426
|
+
'ICON': 'ICON',
|
|
427
|
+
'ICP': 'ICP',
|
|
428
|
+
'IGNIS': 'Ignis',
|
|
429
|
+
'INTERNETCOMPUTER': 'Internet Computer',
|
|
430
|
+
'IOTA': 'IOTA',
|
|
431
|
+
'KAVA': 'KAVA',
|
|
432
|
+
'KSM': 'KSM',
|
|
433
|
+
'LTC': 'LiteCoin',
|
|
434
|
+
'LUNA': 'Luna',
|
|
435
|
+
'MATIC': 'MATIC',
|
|
436
|
+
'MOBILECOIN': 'Mobile Coin',
|
|
437
|
+
'MONACOIN': 'MonaCoin',
|
|
438
|
+
'XMR': 'Monero',
|
|
439
|
+
'NEM': 'NEM',
|
|
440
|
+
'NEP5': 'NEP5',
|
|
441
|
+
'OMNI': 'OMNI',
|
|
442
|
+
'PAC': 'PAC',
|
|
443
|
+
'DOT': 'Polkadot',
|
|
444
|
+
'RAVEN': 'Ravencoin',
|
|
445
|
+
'SAFEX': 'Safex',
|
|
446
|
+
'SOL': 'SOLANA',
|
|
447
|
+
'SGB': 'Songbird',
|
|
448
|
+
'XML': 'Stellar Lumens',
|
|
449
|
+
'XYM': 'Symbol',
|
|
450
|
+
'XTZ': 'Tezos',
|
|
451
|
+
'theta': 'theta',
|
|
452
|
+
'THETA': 'THETA',
|
|
453
|
+
'VECHAIN': 'VeChain',
|
|
454
|
+
'WANCHAIN': 'Wanchain',
|
|
455
|
+
'XINFIN': 'XinFin Network',
|
|
456
|
+
'XRP': 'XRP',
|
|
457
|
+
'XRPL': 'XRPL',
|
|
458
|
+
'ZIL': 'ZIL',
|
|
459
|
+
},
|
|
460
|
+
'defaultType': 'spot',
|
|
461
|
+
'timeframes': {
|
|
462
|
+
'spot': {
|
|
463
|
+
'1m': '1m',
|
|
464
|
+
'5m': '5m',
|
|
465
|
+
'15m': '15m',
|
|
466
|
+
'30m': '30m',
|
|
467
|
+
'1h': '1H',
|
|
468
|
+
'2h': '2H',
|
|
469
|
+
'4h': '4H',
|
|
470
|
+
'12h': '12H',
|
|
471
|
+
'1d': '1D',
|
|
472
|
+
'1w': '1W',
|
|
473
|
+
},
|
|
474
|
+
'future': {
|
|
475
|
+
'1m': '1min',
|
|
476
|
+
'5m': '5min',
|
|
477
|
+
'15m': '15min',
|
|
478
|
+
'30m': '30min',
|
|
479
|
+
'1h': '1h',
|
|
480
|
+
'1d': '1day',
|
|
481
|
+
'1w': '1week',
|
|
482
|
+
'1M': '1month',
|
|
483
|
+
},
|
|
484
|
+
},
|
|
485
|
+
'accountsByType': {
|
|
486
|
+
'spot': 'wallet',
|
|
487
|
+
'future': 'contract',
|
|
488
|
+
'swap': 'contract',
|
|
489
|
+
'funding': 'wallet',
|
|
490
|
+
'fund': 'wallet',
|
|
491
|
+
'contract': 'contract',
|
|
492
|
+
},
|
|
493
|
+
},
|
|
494
|
+
'commonCurrencies': {
|
|
495
|
+
'MIM': 'MIM Swarm',
|
|
496
|
+
},
|
|
497
|
+
'precisionMode': TICK_SIZE,
|
|
498
|
+
'features': {
|
|
499
|
+
'default': {
|
|
500
|
+
'sandbox': false,
|
|
501
|
+
'createOrder': {
|
|
502
|
+
'marginMode': false,
|
|
503
|
+
'triggerPrice': true,
|
|
504
|
+
'triggerPriceType': undefined,
|
|
505
|
+
'triggerDirection': undefined,
|
|
506
|
+
'stopLossPrice': false,
|
|
507
|
+
'takeProfitPrice': false,
|
|
508
|
+
'attachedStopLossTakeProfit': undefined,
|
|
509
|
+
'timeInForce': {
|
|
510
|
+
'IOC': true,
|
|
511
|
+
'FOK': true,
|
|
512
|
+
'PO': true,
|
|
513
|
+
'GTD': false,
|
|
514
|
+
},
|
|
515
|
+
'hedged': false,
|
|
516
|
+
'trailing': false,
|
|
517
|
+
'leverage': false,
|
|
518
|
+
'marketBuyRequiresPrice': true,
|
|
519
|
+
'marketBuyByCost': true,
|
|
520
|
+
'selfTradePrevention': false,
|
|
521
|
+
'iceberg': true, // todo implement
|
|
522
|
+
},
|
|
523
|
+
'createOrders': undefined,
|
|
524
|
+
'fetchMyTrades': {
|
|
525
|
+
'marginMode': false,
|
|
526
|
+
'limit': 1000,
|
|
527
|
+
'daysBack': 100000,
|
|
528
|
+
'untilDays': 100000,
|
|
529
|
+
'symbolRequired': true,
|
|
530
|
+
},
|
|
531
|
+
'fetchOrder': {
|
|
532
|
+
'marginMode': false,
|
|
533
|
+
'trigger': false,
|
|
534
|
+
'trailing': false,
|
|
535
|
+
'symbolRequired': true,
|
|
536
|
+
},
|
|
537
|
+
'fetchOpenOrders': {
|
|
538
|
+
'marginMode': false,
|
|
539
|
+
'limit': undefined,
|
|
540
|
+
'trigger': false,
|
|
541
|
+
'trailing': false,
|
|
542
|
+
'symbolRequired': true,
|
|
543
|
+
},
|
|
544
|
+
'fetchOrders': undefined,
|
|
545
|
+
'fetchClosedOrders': {
|
|
546
|
+
'marginMode': false,
|
|
547
|
+
'limit': 1000,
|
|
548
|
+
'daysBack': 90,
|
|
549
|
+
'daysBackCanceled': 1,
|
|
550
|
+
'untilDays': 90,
|
|
551
|
+
'trigger': false,
|
|
552
|
+
'trailing': false,
|
|
553
|
+
'symbolRequired': true,
|
|
554
|
+
},
|
|
555
|
+
'fetchOHLCV': {
|
|
556
|
+
'limit': 1440,
|
|
557
|
+
},
|
|
558
|
+
},
|
|
559
|
+
'spot': {
|
|
560
|
+
'extends': 'default',
|
|
561
|
+
},
|
|
562
|
+
'forDerivatives': {
|
|
563
|
+
'extends': 'default',
|
|
564
|
+
'createOrder': {
|
|
565
|
+
'marginMode': true,
|
|
566
|
+
'leverage': true,
|
|
567
|
+
'marketBuyRequiresPrice': false,
|
|
568
|
+
'marketBuyByCost': false,
|
|
569
|
+
},
|
|
570
|
+
'fetchOHLCV': {
|
|
571
|
+
'limit': 300,
|
|
572
|
+
},
|
|
573
|
+
'fetchClosedOrders': undefined,
|
|
574
|
+
},
|
|
575
|
+
'swap': {
|
|
576
|
+
'linear': {
|
|
577
|
+
'extends': 'forDerivatives',
|
|
578
|
+
},
|
|
579
|
+
'inverse': {
|
|
580
|
+
'extends': 'forDerivatives',
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
'future': {
|
|
584
|
+
'linear': undefined,
|
|
585
|
+
'inverse': undefined,
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
'exceptions': {
|
|
589
|
+
'exact': {
|
|
590
|
+
'System is under maintenance.': OnMaintenance,
|
|
591
|
+
'System abnormality': ExchangeError,
|
|
592
|
+
'You are not authorized to execute this request.': PermissionDenied,
|
|
593
|
+
'API key does not exist': AuthenticationError,
|
|
594
|
+
'Order would trigger immediately.': OrderImmediatelyFillable,
|
|
595
|
+
'Stop price would trigger immediately.': OrderImmediatelyFillable,
|
|
596
|
+
'Order would immediately match and take.': OrderImmediatelyFillable,
|
|
597
|
+
'Account has insufficient balance for requested action.': InsufficientFunds,
|
|
598
|
+
'Rest API trading is not enabled.': ExchangeNotAvailable,
|
|
599
|
+
"You don't have permission.": PermissionDenied,
|
|
600
|
+
'Market is closed.': ExchangeNotAvailable,
|
|
601
|
+
'Too many requests. Please try again later.': DDoSProtection,
|
|
602
|
+
'-1000': ExchangeNotAvailable,
|
|
603
|
+
'-1001': ExchangeNotAvailable,
|
|
604
|
+
'-1002': AuthenticationError,
|
|
605
|
+
'-1003': RateLimitExceeded,
|
|
606
|
+
'-1013': InvalidOrder,
|
|
607
|
+
'-1015': RateLimitExceeded,
|
|
608
|
+
'-1016': ExchangeNotAvailable,
|
|
609
|
+
'-1020': BadRequest,
|
|
610
|
+
'-1021': InvalidNonce,
|
|
611
|
+
'-1022': AuthenticationError,
|
|
612
|
+
'-1100': BadRequest,
|
|
613
|
+
'-1101': BadRequest,
|
|
614
|
+
'-1102': BadRequest,
|
|
615
|
+
'-1103': BadRequest,
|
|
616
|
+
'-1104': BadRequest,
|
|
617
|
+
'-1105': BadRequest,
|
|
618
|
+
'-1106': BadRequest,
|
|
619
|
+
'-1111': BadRequest,
|
|
620
|
+
'-1112': InvalidOrder,
|
|
621
|
+
'-1114': BadRequest,
|
|
622
|
+
'-1115': BadRequest,
|
|
623
|
+
'-1116': BadRequest,
|
|
624
|
+
'-1117': BadRequest,
|
|
625
|
+
'-1166': InvalidOrder,
|
|
626
|
+
'-1118': BadRequest,
|
|
627
|
+
'-1119': BadRequest,
|
|
628
|
+
'-1120': BadRequest,
|
|
629
|
+
'-1121': BadSymbol,
|
|
630
|
+
'-1125': AuthenticationError,
|
|
631
|
+
'-1127': BadRequest,
|
|
632
|
+
'-1128': BadRequest,
|
|
633
|
+
'-1130': BadRequest,
|
|
634
|
+
'-1131': BadRequest,
|
|
635
|
+
'-1160': InvalidOrder,
|
|
636
|
+
'-1156': InvalidOrder,
|
|
637
|
+
'-2008': AuthenticationError,
|
|
638
|
+
'-2010': ExchangeError,
|
|
639
|
+
'-2011': OrderNotFound,
|
|
640
|
+
'-2013': OrderNotFound,
|
|
641
|
+
'-2014': AuthenticationError,
|
|
642
|
+
'-2015': AuthenticationError,
|
|
643
|
+
'-2017': InsufficientFunds,
|
|
644
|
+
'-2019': InsufficientFunds,
|
|
645
|
+
'-3005': InsufficientFunds,
|
|
646
|
+
'-3006': InsufficientFunds,
|
|
647
|
+
'-3008': InsufficientFunds,
|
|
648
|
+
'-3010': ExchangeError,
|
|
649
|
+
'-3015': ExchangeError,
|
|
650
|
+
'-3022': AccountSuspended,
|
|
651
|
+
'-4028': BadRequest,
|
|
652
|
+
'-3020': InsufficientFunds,
|
|
653
|
+
'-3041': InsufficientFunds,
|
|
654
|
+
'-5013': InsufficientFunds,
|
|
655
|
+
'-11008': InsufficientFunds,
|
|
656
|
+
'-4051': InsufficientFunds, // {"code":-4051,"msg":"Isolated balance insufficient."}
|
|
657
|
+
},
|
|
658
|
+
'broad': {
|
|
659
|
+
'Insufficient account balance': InsufficientFunds,
|
|
660
|
+
'has no operation privilege': PermissionDenied,
|
|
661
|
+
'MAX_POSITION': InvalidOrder, // {"code":-2010,"msg":"Filter failure: MAX_POSITION"}
|
|
662
|
+
},
|
|
663
|
+
},
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
nonce() {
|
|
667
|
+
return this.milliseconds() - this.options['timeDifference'];
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* @method
|
|
671
|
+
* @name bitrue#fetchStatus
|
|
672
|
+
* @description the latest known information on the availability of the exchange API
|
|
673
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
|
|
674
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
675
|
+
* @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
|
|
676
|
+
*/
|
|
677
|
+
async fetchStatus(params = {}) {
|
|
678
|
+
const response = await this.spotV1PublicGetPing(params);
|
|
679
|
+
//
|
|
680
|
+
// empty means working status.
|
|
681
|
+
//
|
|
682
|
+
// {}
|
|
683
|
+
//
|
|
684
|
+
const keys = Object.keys(response);
|
|
685
|
+
const keysLength = keys.length;
|
|
686
|
+
const formattedStatus = keysLength ? 'maintenance' : 'ok';
|
|
687
|
+
return {
|
|
688
|
+
'status': formattedStatus,
|
|
689
|
+
'updated': undefined,
|
|
690
|
+
'eta': undefined,
|
|
691
|
+
'url': undefined,
|
|
692
|
+
'info': response,
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* @method
|
|
697
|
+
* @name bitrue#fetchTime
|
|
698
|
+
* @description fetches the current integer timestamp in milliseconds from the exchange server
|
|
699
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
|
|
700
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
701
|
+
* @returns {int} the current integer timestamp in milliseconds from the exchange server
|
|
702
|
+
*/
|
|
703
|
+
async fetchTime(params = {}) {
|
|
704
|
+
const response = await this.spotV1PublicGetTime(params);
|
|
705
|
+
//
|
|
706
|
+
// {
|
|
707
|
+
// "serverTime":1635467280514
|
|
708
|
+
// }
|
|
709
|
+
//
|
|
710
|
+
return this.safeInteger(response, 'serverTime');
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* @method
|
|
714
|
+
* @name bitrue#fetchCurrencies
|
|
715
|
+
* @description fetches all available currencies on an exchange
|
|
716
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
717
|
+
* @returns {object} an associative dictionary of currencies
|
|
718
|
+
*/
|
|
719
|
+
async fetchCurrencies(params = {}) {
|
|
720
|
+
const response = await this.spotV1PublicGetExchangeInfo(params);
|
|
721
|
+
//
|
|
722
|
+
// {
|
|
723
|
+
// "timezone":"CTT",
|
|
724
|
+
// "serverTime":1635464889117,
|
|
725
|
+
// "rateLimits":[
|
|
726
|
+
// {"rateLimitType":"REQUESTS_WEIGHT","interval":"MINUTES","limit":6000},
|
|
727
|
+
// {"rateLimitType":"ORDERS","interval":"SECONDS","limit":150},
|
|
728
|
+
// {"rateLimitType":"ORDERS","interval":"DAYS","limit":288000},
|
|
729
|
+
// ],
|
|
730
|
+
// "exchangeFilters":[],
|
|
731
|
+
// "symbols":[
|
|
732
|
+
// {
|
|
733
|
+
// "symbol":"SHABTC",
|
|
734
|
+
// "status":"TRADING",
|
|
735
|
+
// "baseAsset":"sha",
|
|
736
|
+
// "baseAssetPrecision":0,
|
|
737
|
+
// "quoteAsset":"btc",
|
|
738
|
+
// "quotePrecision":10,
|
|
739
|
+
// "orderTypes":["MARKET","LIMIT"],
|
|
740
|
+
// "icebergAllowed":false,
|
|
741
|
+
// "filters":[
|
|
742
|
+
// {"filterType":"PRICE_FILTER","minPrice":"0.00000001349","maxPrice":"0.00000017537","priceScale":10},
|
|
743
|
+
// {"filterType":"LOT_SIZE","minQty":"1.0","minVal":"0.00020","maxQty":"1000000000","volumeScale":0},
|
|
744
|
+
// ],
|
|
745
|
+
// "defaultPrice":"0.0000006100",
|
|
746
|
+
// },
|
|
747
|
+
// ],
|
|
748
|
+
// "coins":[
|
|
749
|
+
// {
|
|
750
|
+
// "coin": "near",
|
|
751
|
+
// "coinFulName": "NEAR Protocol",
|
|
752
|
+
// "chains": [ "BEP20", ],
|
|
753
|
+
// "chainDetail": [
|
|
754
|
+
// {
|
|
755
|
+
// "chain": "BEP20",
|
|
756
|
+
// "enableWithdraw": true,
|
|
757
|
+
// "enableDeposit": true,
|
|
758
|
+
// "withdrawFee": "0.2000",
|
|
759
|
+
// "minWithdraw": "5.0000",
|
|
760
|
+
// "maxWithdraw": "1000000000000000.0000",
|
|
761
|
+
// },
|
|
762
|
+
// ],
|
|
763
|
+
// },
|
|
764
|
+
// ],
|
|
765
|
+
// }
|
|
766
|
+
//
|
|
767
|
+
const result = {};
|
|
768
|
+
const coins = this.safeList(response, 'coins', []);
|
|
769
|
+
for (let i = 0; i < coins.length; i++) {
|
|
770
|
+
const currency = coins[i];
|
|
771
|
+
const id = this.safeString(currency, 'coin');
|
|
772
|
+
const name = this.safeString(currency, 'coinFulName');
|
|
773
|
+
const code = this.safeCurrencyCode(id);
|
|
774
|
+
const networkDetails = this.safeList(currency, 'chainDetail', []);
|
|
775
|
+
const networks = {};
|
|
776
|
+
for (let j = 0; j < networkDetails.length; j++) {
|
|
777
|
+
const entry = networkDetails[j];
|
|
778
|
+
const networkId = this.safeString(entry, 'chain');
|
|
779
|
+
const network = this.networkIdToCode(networkId, code);
|
|
780
|
+
networks[network] = {
|
|
781
|
+
'info': entry,
|
|
782
|
+
'id': networkId,
|
|
783
|
+
'network': network,
|
|
784
|
+
'deposit': this.safeBool(entry, 'enableDeposit'),
|
|
785
|
+
'withdraw': this.safeBool(entry, 'enableWithdraw'),
|
|
786
|
+
'active': undefined,
|
|
787
|
+
'fee': this.safeNumber(entry, 'withdrawFee'),
|
|
788
|
+
'precision': undefined,
|
|
789
|
+
'limits': {
|
|
790
|
+
'withdraw': {
|
|
791
|
+
'min': this.safeNumber(entry, 'minWithdraw'),
|
|
792
|
+
'max': this.safeNumber(entry, 'maxWithdraw'),
|
|
793
|
+
},
|
|
794
|
+
},
|
|
795
|
+
};
|
|
796
|
+
}
|
|
797
|
+
result[code] = this.safeCurrencyStructure({
|
|
798
|
+
'id': id,
|
|
799
|
+
'name': name,
|
|
800
|
+
'code': code,
|
|
801
|
+
'precision': undefined,
|
|
802
|
+
'info': currency,
|
|
803
|
+
'active': undefined,
|
|
804
|
+
'deposit': undefined,
|
|
805
|
+
'withdraw': undefined,
|
|
806
|
+
'networks': networks,
|
|
807
|
+
'fee': undefined,
|
|
808
|
+
'fees': undefined,
|
|
809
|
+
'type': 'crypto',
|
|
810
|
+
'limits': {
|
|
811
|
+
'withdraw': {
|
|
812
|
+
'min': undefined,
|
|
813
|
+
'max': undefined,
|
|
814
|
+
},
|
|
815
|
+
},
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
return result;
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* @method
|
|
822
|
+
* @name bitrue#fetchMarkets
|
|
823
|
+
* @description retrieves data on all markets for bitrue
|
|
824
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
|
825
|
+
* @see https://www.bitrue.com/api-docs#current-open-contract
|
|
826
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
|
|
827
|
+
* @param {object} [params] extra parameters specific to the exchange api endpoint
|
|
828
|
+
* @returns {object[]} an array of objects representing market data
|
|
829
|
+
*/
|
|
830
|
+
async fetchMarkets(params = {}) {
|
|
831
|
+
const promisesRaw = [];
|
|
832
|
+
let types = undefined;
|
|
833
|
+
const defaultTypes = ['spot', 'linear', 'inverse'];
|
|
834
|
+
const fetchMarketsOptions = this.safeDict(this.options, 'fetchMarkets');
|
|
835
|
+
if (fetchMarketsOptions !== undefined) {
|
|
836
|
+
types = this.safeList(fetchMarketsOptions, 'types', defaultTypes);
|
|
837
|
+
}
|
|
838
|
+
else {
|
|
839
|
+
// for backward-compatibility
|
|
840
|
+
types = this.safeList(this.options, 'fetchMarkets', defaultTypes);
|
|
841
|
+
}
|
|
842
|
+
for (let i = 0; i < types.length; i++) {
|
|
843
|
+
const marketType = types[i];
|
|
844
|
+
if (marketType === 'spot') {
|
|
845
|
+
promisesRaw.push(this.spotV1PublicGetExchangeInfo(params));
|
|
846
|
+
}
|
|
847
|
+
else if (marketType === 'linear') {
|
|
848
|
+
promisesRaw.push(this.fapiV1PublicGetContracts(params));
|
|
849
|
+
}
|
|
850
|
+
else if (marketType === 'inverse') {
|
|
851
|
+
promisesRaw.push(this.dapiV1PublicGetContracts(params));
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
throw new ExchangeError(this.id + ' fetchMarkets() this.options fetchMarkets "' + marketType + '" is not a supported market type');
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
const promises = await Promise.all(promisesRaw);
|
|
858
|
+
const spotMarkets = this.safeValue(this.safeValue(promises, 0), 'symbols', []);
|
|
859
|
+
const futureMarkets = this.safeValue(promises, 1);
|
|
860
|
+
const deliveryMarkets = this.safeValue(promises, 2);
|
|
861
|
+
let markets = spotMarkets;
|
|
862
|
+
markets = this.arrayConcat(markets, futureMarkets);
|
|
863
|
+
markets = this.arrayConcat(markets, deliveryMarkets);
|
|
864
|
+
//
|
|
865
|
+
// spot
|
|
866
|
+
//
|
|
867
|
+
// {
|
|
868
|
+
// "timezone":"CTT",
|
|
869
|
+
// "serverTime":1635464889117,
|
|
870
|
+
// "rateLimits":[
|
|
871
|
+
// {"rateLimitType":"REQUESTS_WEIGHT","interval":"MINUTES","limit":6000},
|
|
872
|
+
// {"rateLimitType":"ORDERS","interval":"SECONDS","limit":150},
|
|
873
|
+
// {"rateLimitType":"ORDERS","interval":"DAYS","limit":288000},
|
|
874
|
+
// ],
|
|
875
|
+
// "exchangeFilters":[],
|
|
876
|
+
// "symbols":[
|
|
877
|
+
// {
|
|
878
|
+
// "symbol":"SHABTC",
|
|
879
|
+
// "status":"TRADING",
|
|
880
|
+
// "baseAsset":"sha",
|
|
881
|
+
// "baseAssetPrecision":0,
|
|
882
|
+
// "quoteAsset":"btc",
|
|
883
|
+
// "quotePrecision":10,
|
|
884
|
+
// "orderTypes":["MARKET","LIMIT"],
|
|
885
|
+
// "icebergAllowed":false,
|
|
886
|
+
// "filters":[
|
|
887
|
+
// {"filterType":"PRICE_FILTER","minPrice":"0.00000001349","maxPrice":"0.00000017537","priceScale":10},
|
|
888
|
+
// {"filterType":"LOT_SIZE","minQty":"1.0","minVal":"0.00020","maxQty":"1000000000","volumeScale":0},
|
|
889
|
+
// ],
|
|
890
|
+
// "defaultPrice":"0.0000006100",
|
|
891
|
+
// },
|
|
892
|
+
// ],
|
|
893
|
+
// "coins":[
|
|
894
|
+
// {
|
|
895
|
+
// "coin":"sbr",
|
|
896
|
+
// "coinFulName":"Saber",
|
|
897
|
+
// "enableWithdraw":true,
|
|
898
|
+
// "enableDeposit":true,
|
|
899
|
+
// "chains":["SOLANA"],
|
|
900
|
+
// "withdrawFee":"2.0",
|
|
901
|
+
// "minWithdraw":"5.0",
|
|
902
|
+
// "maxWithdraw":"1000000000000000",
|
|
903
|
+
// },
|
|
904
|
+
// ],
|
|
905
|
+
// }
|
|
906
|
+
//
|
|
907
|
+
// swap / delivery
|
|
908
|
+
//
|
|
909
|
+
// [
|
|
910
|
+
// {
|
|
911
|
+
// "symbol": "H-HT-USDT",
|
|
912
|
+
// "pricePrecision": 8,
|
|
913
|
+
// "side": 1,
|
|
914
|
+
// "maxMarketVolume": 100000,
|
|
915
|
+
// "multiplier": 6,
|
|
916
|
+
// "minOrderVolume": 1,
|
|
917
|
+
// "maxMarketMoney": 10000000,
|
|
918
|
+
// "type": "H", // E: perpetual contract, S: test contract, others are mixed contract
|
|
919
|
+
// "maxLimitVolume": 1000000,
|
|
920
|
+
// "maxValidOrder": 20,
|
|
921
|
+
// "multiplierCoin": "HT",
|
|
922
|
+
// "minOrderMoney": 0.001,
|
|
923
|
+
// "maxLimitMoney": 1000000,
|
|
924
|
+
// "status": 1
|
|
925
|
+
// }
|
|
926
|
+
// ]
|
|
927
|
+
//
|
|
928
|
+
if (this.options['adjustForTimeDifference']) {
|
|
929
|
+
await this.loadTimeDifference();
|
|
930
|
+
}
|
|
931
|
+
return this.parseMarkets(markets);
|
|
932
|
+
}
|
|
933
|
+
parseMarket(market) {
|
|
934
|
+
const id = this.safeString(market, 'symbol');
|
|
935
|
+
const lowercaseId = this.safeStringLower(market, 'symbol');
|
|
936
|
+
const side = this.safeInteger(market, 'side'); // 1 linear, 0 inverse, undefined spot
|
|
937
|
+
let type = undefined;
|
|
938
|
+
let isLinear = undefined;
|
|
939
|
+
let isInverse = undefined;
|
|
940
|
+
if (side === undefined) {
|
|
941
|
+
type = 'spot';
|
|
942
|
+
}
|
|
943
|
+
else {
|
|
944
|
+
type = 'swap';
|
|
945
|
+
isLinear = (side === 1);
|
|
946
|
+
isInverse = (side === 0);
|
|
947
|
+
}
|
|
948
|
+
const isContract = (type !== 'spot');
|
|
949
|
+
let baseId = this.safeString(market, 'baseAsset');
|
|
950
|
+
let quoteId = this.safeString(market, 'quoteAsset');
|
|
951
|
+
let settleId = undefined;
|
|
952
|
+
let settle = undefined;
|
|
953
|
+
if (isContract) {
|
|
954
|
+
const symbolSplit = id.split('-');
|
|
955
|
+
baseId = this.safeString(symbolSplit, 1);
|
|
956
|
+
quoteId = this.safeString(symbolSplit, 2);
|
|
957
|
+
if (isLinear) {
|
|
958
|
+
settleId = quoteId;
|
|
959
|
+
}
|
|
960
|
+
else {
|
|
961
|
+
settleId = baseId;
|
|
962
|
+
}
|
|
963
|
+
settle = this.safeCurrencyCode(settleId);
|
|
964
|
+
}
|
|
965
|
+
const base = this.safeCurrencyCode(baseId);
|
|
966
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
967
|
+
let symbol = base + '/' + quote;
|
|
968
|
+
if (settle !== undefined) {
|
|
969
|
+
symbol += ':' + settle;
|
|
970
|
+
}
|
|
971
|
+
const filters = this.safeList(market, 'filters', []);
|
|
972
|
+
const filtersByType = this.indexBy(filters, 'filterType');
|
|
973
|
+
const status = this.safeString(market, 'status');
|
|
974
|
+
const priceFilter = this.safeDict(filtersByType, 'PRICE_FILTER', {});
|
|
975
|
+
const amountFilter = this.safeDict(filtersByType, 'LOT_SIZE', {});
|
|
976
|
+
const defaultPricePrecision = this.safeString(market, 'pricePrecision');
|
|
977
|
+
const defaultAmountPrecision = this.safeString(market, 'quantityPrecision');
|
|
978
|
+
const pricePrecision = this.safeString(priceFilter, 'priceScale', defaultPricePrecision);
|
|
979
|
+
const amountPrecision = this.safeString(amountFilter, 'volumeScale', defaultAmountPrecision);
|
|
980
|
+
const multiplier = this.safeString(market, 'multiplier');
|
|
981
|
+
let maxQuantity = this.safeNumber(amountFilter, 'maxQty');
|
|
982
|
+
if (maxQuantity === undefined) {
|
|
983
|
+
maxQuantity = this.safeNumber(market, 'maxValidOrder');
|
|
984
|
+
}
|
|
985
|
+
let minCost = this.safeNumber(amountFilter, 'minVal');
|
|
986
|
+
if (minCost === undefined) {
|
|
987
|
+
minCost = this.safeNumber(market, 'minOrderMoney');
|
|
988
|
+
}
|
|
989
|
+
return {
|
|
990
|
+
'id': id,
|
|
991
|
+
'lowercaseId': lowercaseId,
|
|
992
|
+
'symbol': symbol,
|
|
993
|
+
'base': base,
|
|
994
|
+
'quote': quote,
|
|
995
|
+
'settle': settle,
|
|
996
|
+
'baseId': baseId,
|
|
997
|
+
'quoteId': quoteId,
|
|
998
|
+
'settleId': settleId,
|
|
999
|
+
'type': type,
|
|
1000
|
+
'spot': (type === 'spot'),
|
|
1001
|
+
'margin': false,
|
|
1002
|
+
'swap': isContract,
|
|
1003
|
+
'future': false,
|
|
1004
|
+
'option': false,
|
|
1005
|
+
'active': (status === 'TRADING'),
|
|
1006
|
+
'contract': isContract,
|
|
1007
|
+
'linear': isLinear,
|
|
1008
|
+
'inverse': isInverse,
|
|
1009
|
+
'contractSize': this.parseNumber(Precise.stringAbs(multiplier)),
|
|
1010
|
+
'expiry': undefined,
|
|
1011
|
+
'expiryDatetime': undefined,
|
|
1012
|
+
'strike': undefined,
|
|
1013
|
+
'optionType': undefined,
|
|
1014
|
+
'precision': {
|
|
1015
|
+
'amount': this.parseNumber(this.parsePrecision(amountPrecision)),
|
|
1016
|
+
'price': this.parseNumber(this.parsePrecision(pricePrecision)),
|
|
1017
|
+
},
|
|
1018
|
+
'limits': {
|
|
1019
|
+
'leverage': {
|
|
1020
|
+
'min': undefined,
|
|
1021
|
+
'max': undefined,
|
|
1022
|
+
},
|
|
1023
|
+
'amount': {
|
|
1024
|
+
'min': this.safeNumber(amountFilter, 'minQty'),
|
|
1025
|
+
'max': maxQuantity,
|
|
1026
|
+
},
|
|
1027
|
+
'price': {
|
|
1028
|
+
'min': this.safeNumber(priceFilter, 'minPrice'),
|
|
1029
|
+
'max': this.safeNumber(priceFilter, 'maxPrice'),
|
|
1030
|
+
},
|
|
1031
|
+
'cost': {
|
|
1032
|
+
'min': minCost,
|
|
1033
|
+
'max': undefined,
|
|
1034
|
+
},
|
|
1035
|
+
},
|
|
1036
|
+
'created': undefined,
|
|
1037
|
+
'info': market,
|
|
1038
|
+
};
|
|
1039
|
+
}
|
|
1040
|
+
parseBalance(response) {
|
|
1041
|
+
//
|
|
1042
|
+
// spot
|
|
1043
|
+
//
|
|
1044
|
+
// {
|
|
1045
|
+
// "makerCommission":0,
|
|
1046
|
+
// "takerCommission":0,
|
|
1047
|
+
// "buyerCommission":0,
|
|
1048
|
+
// "sellerCommission":0,
|
|
1049
|
+
// "updateTime":null,
|
|
1050
|
+
// "balances":[
|
|
1051
|
+
// {"asset":"sbr","free":"0","locked":"0"},
|
|
1052
|
+
// {"asset":"ksm","free":"0","locked":"0"},
|
|
1053
|
+
// {"asset":"neo3s","free":"0","locked":"0"},
|
|
1054
|
+
// ],
|
|
1055
|
+
// "canTrade":false,
|
|
1056
|
+
// "canWithdraw":false,
|
|
1057
|
+
// "canDeposit":false
|
|
1058
|
+
// }
|
|
1059
|
+
//
|
|
1060
|
+
// swap
|
|
1061
|
+
//
|
|
1062
|
+
// {
|
|
1063
|
+
// "account":[
|
|
1064
|
+
// {
|
|
1065
|
+
// "marginCoin":"USDT",
|
|
1066
|
+
// "coinPrecious":4,
|
|
1067
|
+
// "accountNormal":1010.4043400372839856,
|
|
1068
|
+
// "accountLock":2.9827889600000006,
|
|
1069
|
+
// "partPositionNormal":0,
|
|
1070
|
+
// "totalPositionNormal":0,
|
|
1071
|
+
// "achievedAmount":0,
|
|
1072
|
+
// "unrealizedAmount":0,
|
|
1073
|
+
// "totalMarginRate":0,
|
|
1074
|
+
// "totalEquity":1010.4043400372839856,
|
|
1075
|
+
// "partEquity":0,
|
|
1076
|
+
// "totalCost":0,
|
|
1077
|
+
// "sumMarginRate":0,
|
|
1078
|
+
// "sumOpenRealizedAmount":0,
|
|
1079
|
+
// "canUseTrialFund":0,
|
|
1080
|
+
// "sumMaintenanceMargin":null,
|
|
1081
|
+
// "futureModel":null,
|
|
1082
|
+
// "positionVos":[]
|
|
1083
|
+
// }
|
|
1084
|
+
// ]
|
|
1085
|
+
// }
|
|
1086
|
+
//
|
|
1087
|
+
const result = {
|
|
1088
|
+
'info': response,
|
|
1089
|
+
};
|
|
1090
|
+
const timestamp = this.safeInteger(response, 'updateTime');
|
|
1091
|
+
const balances = this.safeValue2(response, 'balances', 'account', []);
|
|
1092
|
+
for (let i = 0; i < balances.length; i++) {
|
|
1093
|
+
const balance = balances[i];
|
|
1094
|
+
const currencyId = this.safeString2(balance, 'asset', 'marginCoin');
|
|
1095
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
1096
|
+
const account = this.account();
|
|
1097
|
+
account['free'] = this.safeString2(balance, 'free', 'accountNormal');
|
|
1098
|
+
account['used'] = this.safeString2(balance, 'locked', 'accountLock');
|
|
1099
|
+
result[code] = account;
|
|
1100
|
+
}
|
|
1101
|
+
result['timestamp'] = timestamp;
|
|
1102
|
+
result['datetime'] = this.iso8601(timestamp);
|
|
1103
|
+
return this.safeBalance(result);
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* @method
|
|
1107
|
+
* @name bitrue#fetchBalance
|
|
1108
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
1109
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
|
|
1110
|
+
* @see https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
|
|
1111
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
|
|
1112
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1113
|
+
* @param {string} [params.type] 'future', 'delivery', 'spot', 'swap'
|
|
1114
|
+
* @param {string} [params.subType] 'linear', 'inverse'
|
|
1115
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
1116
|
+
*/
|
|
1117
|
+
async fetchBalance(params = {}) {
|
|
1118
|
+
await this.loadMarkets();
|
|
1119
|
+
let type = undefined;
|
|
1120
|
+
[type, params] = this.handleMarketTypeAndParams('fetchBalance', undefined, params);
|
|
1121
|
+
let subType = undefined;
|
|
1122
|
+
[subType, params] = this.handleSubTypeAndParams('fetchBalance', undefined, params);
|
|
1123
|
+
let response = undefined;
|
|
1124
|
+
let result = undefined;
|
|
1125
|
+
if (type === 'swap') {
|
|
1126
|
+
if (subType !== undefined && subType === 'inverse') {
|
|
1127
|
+
response = await this.dapiV2PrivateGetAccount(params);
|
|
1128
|
+
result = this.safeDict(response, 'data', {});
|
|
1129
|
+
//
|
|
1130
|
+
// {
|
|
1131
|
+
// "code":"0",
|
|
1132
|
+
// "msg":"Success",
|
|
1133
|
+
// "data":{
|
|
1134
|
+
// "account":[
|
|
1135
|
+
// {
|
|
1136
|
+
// "marginCoin":"USD",
|
|
1137
|
+
// "coinPrecious":4,
|
|
1138
|
+
// "accountNormal":1010.4043400372839856,
|
|
1139
|
+
// "accountLock":2.9827889600000006,
|
|
1140
|
+
// "partPositionNormal":0,
|
|
1141
|
+
// "totalPositionNormal":0,
|
|
1142
|
+
// "achievedAmount":0,
|
|
1143
|
+
// "unrealizedAmount":0,
|
|
1144
|
+
// "totalMarginRate":0,
|
|
1145
|
+
// "totalEquity":1010.4043400372839856,
|
|
1146
|
+
// "partEquity":0,
|
|
1147
|
+
// "totalCost":0,
|
|
1148
|
+
// "sumMarginRate":0,
|
|
1149
|
+
// "sumOpenRealizedAmount":0,
|
|
1150
|
+
// "canUseTrialFund":0,
|
|
1151
|
+
// "sumMaintenanceMargin":null,
|
|
1152
|
+
// "futureModel":null,
|
|
1153
|
+
// "positionVos":[]
|
|
1154
|
+
// }
|
|
1155
|
+
// ]
|
|
1156
|
+
// }
|
|
1157
|
+
// }
|
|
1158
|
+
//
|
|
1159
|
+
}
|
|
1160
|
+
else {
|
|
1161
|
+
response = await this.fapiV2PrivateGetAccount(params);
|
|
1162
|
+
result = this.safeDict(response, 'data', {});
|
|
1163
|
+
//
|
|
1164
|
+
// {
|
|
1165
|
+
// "code":"0",
|
|
1166
|
+
// "msg":"Success",
|
|
1167
|
+
// "data":{
|
|
1168
|
+
// "account":[
|
|
1169
|
+
// {
|
|
1170
|
+
// "marginCoin":"USDT",
|
|
1171
|
+
// "coinPrecious":4,
|
|
1172
|
+
// "accountNormal":1010.4043400372839856,
|
|
1173
|
+
// "accountLock":2.9827889600000006,
|
|
1174
|
+
// "partPositionNormal":0,
|
|
1175
|
+
// "totalPositionNormal":0,
|
|
1176
|
+
// "achievedAmount":0,
|
|
1177
|
+
// "unrealizedAmount":0,
|
|
1178
|
+
// "totalMarginRate":0,
|
|
1179
|
+
// "totalEquity":1010.4043400372839856,
|
|
1180
|
+
// "partEquity":0,
|
|
1181
|
+
// "totalCost":0,
|
|
1182
|
+
// "sumMarginRate":0,
|
|
1183
|
+
// "sumOpenRealizedAmount":0,
|
|
1184
|
+
// "canUseTrialFund":0,
|
|
1185
|
+
// "sumMaintenanceMargin":null,
|
|
1186
|
+
// "futureModel":null,
|
|
1187
|
+
// "positionVos":[]
|
|
1188
|
+
// }
|
|
1189
|
+
// ]
|
|
1190
|
+
// }
|
|
1191
|
+
// }
|
|
1192
|
+
//
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
else {
|
|
1196
|
+
response = await this.spotV1PrivateGetAccount(params);
|
|
1197
|
+
result = response;
|
|
1198
|
+
//
|
|
1199
|
+
// {
|
|
1200
|
+
// "makerCommission":0,
|
|
1201
|
+
// "takerCommission":0,
|
|
1202
|
+
// "buyerCommission":0,
|
|
1203
|
+
// "sellerCommission":0,
|
|
1204
|
+
// "updateTime":null,
|
|
1205
|
+
// "balances":[
|
|
1206
|
+
// {"asset":"sbr","free":"0","locked":"0"},
|
|
1207
|
+
// {"asset":"ksm","free":"0","locked":"0"},
|
|
1208
|
+
// {"asset":"neo3s","free":"0","locked":"0"},
|
|
1209
|
+
// ],
|
|
1210
|
+
// "canTrade":false,
|
|
1211
|
+
// "canWithdraw":false,
|
|
1212
|
+
// "canDeposit":false
|
|
1213
|
+
// }
|
|
1214
|
+
//
|
|
1215
|
+
}
|
|
1216
|
+
return this.parseBalance(result);
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* @method
|
|
1220
|
+
* @name bitrue#fetchOrderBook
|
|
1221
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1222
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
|
|
1223
|
+
* @see https://www.bitrue.com/api-docs#order-book
|
|
1224
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
|
|
1225
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
1226
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
1227
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1228
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1229
|
+
*/
|
|
1230
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
1231
|
+
await this.loadMarkets();
|
|
1232
|
+
const market = this.market(symbol);
|
|
1233
|
+
let response = undefined;
|
|
1234
|
+
if (market['swap']) {
|
|
1235
|
+
const request = {
|
|
1236
|
+
'contractName': market['id'],
|
|
1237
|
+
};
|
|
1238
|
+
if (limit !== undefined) {
|
|
1239
|
+
if (limit > 100) {
|
|
1240
|
+
limit = 100;
|
|
1241
|
+
}
|
|
1242
|
+
request['limit'] = limit; // default 100, max 100, see https://www.bitrue.com/api-docs#order-book
|
|
1243
|
+
}
|
|
1244
|
+
if (market['linear']) {
|
|
1245
|
+
response = await this.fapiV1PublicGetDepth(this.extend(request, params));
|
|
1246
|
+
}
|
|
1247
|
+
else if (market['inverse']) {
|
|
1248
|
+
response = await this.dapiV1PublicGetDepth(this.extend(request, params));
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
else if (market['spot']) {
|
|
1252
|
+
const request = {
|
|
1253
|
+
'symbol': market['id'],
|
|
1254
|
+
};
|
|
1255
|
+
if (limit !== undefined) {
|
|
1256
|
+
if (limit > 1000) {
|
|
1257
|
+
limit = 1000;
|
|
1258
|
+
}
|
|
1259
|
+
request['limit'] = limit; // default 100, max 1000, see https://github.com/Bitrue-exchange/bitrue-official-api-docs#order-book
|
|
1260
|
+
}
|
|
1261
|
+
response = await this.spotV1PublicGetDepth(this.extend(request, params));
|
|
1262
|
+
}
|
|
1263
|
+
else {
|
|
1264
|
+
throw new NotSupported(this.id + ' fetchOrderBook only support spot & swap markets');
|
|
1265
|
+
}
|
|
1266
|
+
//
|
|
1267
|
+
// spot
|
|
1268
|
+
//
|
|
1269
|
+
// {
|
|
1270
|
+
// "lastUpdateId":1635474910177,
|
|
1271
|
+
// "bids":[
|
|
1272
|
+
// ["61436.84","0.05",[]],
|
|
1273
|
+
// ["61435.77","0.0124",[]],
|
|
1274
|
+
// ["61434.88","0.012",[]],
|
|
1275
|
+
// ],
|
|
1276
|
+
// "asks":[
|
|
1277
|
+
// ["61452.46","0.0001",[]],
|
|
1278
|
+
// ["61452.47","0.0597",[]],
|
|
1279
|
+
// ["61452.76","0.0713",[]],
|
|
1280
|
+
// ]
|
|
1281
|
+
// }
|
|
1282
|
+
//
|
|
1283
|
+
// swap
|
|
1284
|
+
//
|
|
1285
|
+
// {
|
|
1286
|
+
// "asks": [[34916.5, 2582], [34916.6, 2193], [34916.7, 2629], [34916.8, 3478], [34916.9, 2718]],
|
|
1287
|
+
// "bids": [[34916.4, 92065], [34916.3, 25703], [34916.2, 37259], [34916.1, 26446], [34916, 44456]],
|
|
1288
|
+
// "time": 1699338305000
|
|
1289
|
+
// }
|
|
1290
|
+
//
|
|
1291
|
+
const timestamp = this.safeInteger2(response, 'time', 'lastUpdateId');
|
|
1292
|
+
const orderbook = this.parseOrderBook(response, symbol, timestamp);
|
|
1293
|
+
orderbook['nonce'] = this.safeInteger(response, 'lastUpdateId');
|
|
1294
|
+
return orderbook;
|
|
1295
|
+
}
|
|
1296
|
+
parseTicker(ticker, market = undefined) {
|
|
1297
|
+
//
|
|
1298
|
+
// fetchBidsAsks
|
|
1299
|
+
//
|
|
1300
|
+
// {
|
|
1301
|
+
// "symbol": "LTCBTC",
|
|
1302
|
+
// "bidPrice": "4.00000000",
|
|
1303
|
+
// "bidQty": "431.00000000",
|
|
1304
|
+
// "askPrice": "4.00000200",
|
|
1305
|
+
// "askQty": "9.00000000"
|
|
1306
|
+
// }
|
|
1307
|
+
//
|
|
1308
|
+
// fetchTicker
|
|
1309
|
+
//
|
|
1310
|
+
// {
|
|
1311
|
+
// "symbol": "BNBBTC",
|
|
1312
|
+
// "priceChange": "0.000248",
|
|
1313
|
+
// "priceChangePercent": "3.5500",
|
|
1314
|
+
// "weightedAvgPrice": null,
|
|
1315
|
+
// "prevClosePrice": null,
|
|
1316
|
+
// "lastPrice": "0.007226",
|
|
1317
|
+
// "lastQty": null,
|
|
1318
|
+
// "bidPrice": "0.007208",
|
|
1319
|
+
// "askPrice": "0.007240",
|
|
1320
|
+
// "openPrice": "0.006978",
|
|
1321
|
+
// "highPrice": "0.007295",
|
|
1322
|
+
// "lowPrice": "0.006935",
|
|
1323
|
+
// "volume": "11749.86",
|
|
1324
|
+
// "quoteVolume": "84.1066211",
|
|
1325
|
+
// "openTime": 0,
|
|
1326
|
+
// "closeTime": 0,
|
|
1327
|
+
// "firstId": 0,
|
|
1328
|
+
// "lastId": 0,
|
|
1329
|
+
// "count": 0
|
|
1330
|
+
// }
|
|
1331
|
+
//
|
|
1332
|
+
const symbol = this.safeSymbol(undefined, market);
|
|
1333
|
+
const last = this.safeString2(ticker, 'lastPrice', 'last');
|
|
1334
|
+
const timestamp = this.safeInteger(ticker, 'time');
|
|
1335
|
+
let percentage = undefined;
|
|
1336
|
+
if (market['swap']) {
|
|
1337
|
+
percentage = Precise.stringMul(this.safeString(ticker, 'rose'), '100');
|
|
1338
|
+
}
|
|
1339
|
+
else {
|
|
1340
|
+
percentage = this.safeString(ticker, 'priceChangePercent');
|
|
1341
|
+
}
|
|
1342
|
+
return this.safeTicker({
|
|
1343
|
+
'symbol': symbol,
|
|
1344
|
+
'timestamp': timestamp,
|
|
1345
|
+
'datetime': this.iso8601(timestamp),
|
|
1346
|
+
'high': this.safeString2(ticker, 'highPrice', 'high'),
|
|
1347
|
+
'low': this.safeString2(ticker, 'lowPrice', 'low'),
|
|
1348
|
+
'bid': this.safeString2(ticker, 'bidPrice', 'buy'),
|
|
1349
|
+
'bidVolume': this.safeString(ticker, 'bidQty'),
|
|
1350
|
+
'ask': this.safeString2(ticker, 'askPrice', 'sell'),
|
|
1351
|
+
'askVolume': this.safeString(ticker, 'askQty'),
|
|
1352
|
+
'vwap': this.safeString(ticker, 'weightedAvgPrice'),
|
|
1353
|
+
'open': this.safeString(ticker, 'openPrice'),
|
|
1354
|
+
'close': last,
|
|
1355
|
+
'last': last,
|
|
1356
|
+
'previousClose': undefined,
|
|
1357
|
+
'change': this.safeString(ticker, 'priceChange'),
|
|
1358
|
+
'percentage': percentage,
|
|
1359
|
+
'average': undefined,
|
|
1360
|
+
'baseVolume': this.safeString2(ticker, 'volume', 'vol'),
|
|
1361
|
+
'quoteVolume': this.safeString(ticker, 'quoteVolume'),
|
|
1362
|
+
'info': ticker,
|
|
1363
|
+
}, market);
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* @method
|
|
1367
|
+
* @name bitrue#fetchTicker
|
|
1368
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
1369
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
|
1370
|
+
* @see https://www.bitrue.com/api-docs#ticker
|
|
1371
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
|
1372
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
1373
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1374
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
1375
|
+
*/
|
|
1376
|
+
async fetchTicker(symbol, params = {}) {
|
|
1377
|
+
await this.loadMarkets();
|
|
1378
|
+
const market = this.market(symbol);
|
|
1379
|
+
let response = undefined;
|
|
1380
|
+
let data = undefined;
|
|
1381
|
+
if (market['swap']) {
|
|
1382
|
+
const request = {
|
|
1383
|
+
'contractName': market['id'],
|
|
1384
|
+
};
|
|
1385
|
+
if (market['linear']) {
|
|
1386
|
+
response = await this.fapiV1PublicGetTicker(this.extend(request, params));
|
|
1387
|
+
}
|
|
1388
|
+
else if (market['inverse']) {
|
|
1389
|
+
response = await this.dapiV1PublicGetTicker(this.extend(request, params));
|
|
1390
|
+
}
|
|
1391
|
+
data = response;
|
|
1392
|
+
}
|
|
1393
|
+
else if (market['spot']) {
|
|
1394
|
+
const request = {
|
|
1395
|
+
'symbol': market['id'],
|
|
1396
|
+
};
|
|
1397
|
+
response = await this.spotV1PublicGetTicker24hr(this.extend(request, params));
|
|
1398
|
+
data = this.safeDict(response, 0, {});
|
|
1399
|
+
}
|
|
1400
|
+
else {
|
|
1401
|
+
throw new NotSupported(this.id + ' fetchTicker only support spot & swap markets');
|
|
1402
|
+
}
|
|
1403
|
+
//
|
|
1404
|
+
// spot
|
|
1405
|
+
//
|
|
1406
|
+
// [{
|
|
1407
|
+
// symbol: 'BTCUSDT',
|
|
1408
|
+
// priceChange: '105.20',
|
|
1409
|
+
// priceChangePercent: '0.3000',
|
|
1410
|
+
// weightedAvgPrice: null,
|
|
1411
|
+
// prevClosePrice: null,
|
|
1412
|
+
// lastPrice: '34905.21',
|
|
1413
|
+
// lastQty: null,
|
|
1414
|
+
// bidPrice: '34905.21',
|
|
1415
|
+
// askPrice: '34905.22',
|
|
1416
|
+
// openPrice: '34800.01',
|
|
1417
|
+
// highPrice: '35276.33',
|
|
1418
|
+
// lowPrice: '34787.51',
|
|
1419
|
+
// volume: '12549.6481',
|
|
1420
|
+
// quoteVolume: '439390492.917',
|
|
1421
|
+
// openTime: '0',
|
|
1422
|
+
// closeTime: '0',
|
|
1423
|
+
// firstId: '0',
|
|
1424
|
+
// lastId: '0',
|
|
1425
|
+
// count: '0'
|
|
1426
|
+
// }]
|
|
1427
|
+
//
|
|
1428
|
+
// swap
|
|
1429
|
+
//
|
|
1430
|
+
// {
|
|
1431
|
+
// "high": "35296",
|
|
1432
|
+
// "vol": "779308354",
|
|
1433
|
+
// "last": "34884.1",
|
|
1434
|
+
// "low": "34806.7",
|
|
1435
|
+
// "buy": 34883.9,
|
|
1436
|
+
// "sell": 34884,
|
|
1437
|
+
// "rose": "-0.0027957315",
|
|
1438
|
+
// "time": 1699348013000
|
|
1439
|
+
// }
|
|
1440
|
+
//
|
|
1441
|
+
return this.parseTicker(data, market);
|
|
1442
|
+
}
|
|
1443
|
+
/**
|
|
1444
|
+
* @method
|
|
1445
|
+
* @name bitrue#fetchOHLCV
|
|
1446
|
+
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
1447
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#kline-data
|
|
1448
|
+
* @see https://www.bitrue.com/api_docs_includes_file/futures/index.html#kline-candlestick-data
|
|
1449
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
1450
|
+
* @param {string} timeframe the length of time each candle represents
|
|
1451
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
1452
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
1453
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1454
|
+
* @param {int} [params.until] the latest time in ms to fetch transfers for
|
|
1455
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
1456
|
+
*/
|
|
1457
|
+
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
1458
|
+
await this.loadMarkets();
|
|
1459
|
+
const market = this.market(symbol);
|
|
1460
|
+
const timeframes = this.safeDict(this.options, 'timeframes', {});
|
|
1461
|
+
let response = undefined;
|
|
1462
|
+
let data = undefined;
|
|
1463
|
+
if (market['swap']) {
|
|
1464
|
+
const timeframesFuture = this.safeDict(timeframes, 'future', {});
|
|
1465
|
+
const request = {
|
|
1466
|
+
'contractName': market['id'],
|
|
1467
|
+
// 1min / 5min / 15min / 30min / 1h / 1day / 1week / 1month
|
|
1468
|
+
'interval': this.safeString(timeframesFuture, timeframe, '1min'),
|
|
1469
|
+
};
|
|
1470
|
+
if (limit !== undefined) {
|
|
1471
|
+
request['limit'] = limit;
|
|
1472
|
+
}
|
|
1473
|
+
if (market['linear']) {
|
|
1474
|
+
response = await this.fapiV1PublicGetKlines(this.extend(request, params));
|
|
1475
|
+
}
|
|
1476
|
+
else if (market['inverse']) {
|
|
1477
|
+
response = await this.dapiV1PublicGetKlines(this.extend(request, params));
|
|
1478
|
+
}
|
|
1479
|
+
data = response;
|
|
1480
|
+
}
|
|
1481
|
+
else if (market['spot']) {
|
|
1482
|
+
const timeframesSpot = this.safeDict(timeframes, 'spot', {});
|
|
1483
|
+
const request = {
|
|
1484
|
+
'symbol': market['id'],
|
|
1485
|
+
// 1m / 5m / 15m / 30m / 1H / 2H / 4H / 12H / 1D / 1W
|
|
1486
|
+
'scale': this.safeString(timeframesSpot, timeframe, '1m'),
|
|
1487
|
+
};
|
|
1488
|
+
if (limit !== undefined) {
|
|
1489
|
+
request['limit'] = limit;
|
|
1490
|
+
}
|
|
1491
|
+
const until = this.safeInteger(params, 'until');
|
|
1492
|
+
if (until !== undefined) {
|
|
1493
|
+
params = this.omit(params, 'until');
|
|
1494
|
+
request['fromIdx'] = until;
|
|
1495
|
+
}
|
|
1496
|
+
response = await this.spotV1PublicGetMarketKline(this.extend(request, params));
|
|
1497
|
+
data = this.safeList(response, 'data', []);
|
|
1498
|
+
}
|
|
1499
|
+
else {
|
|
1500
|
+
throw new NotSupported(this.id + ' fetchOHLCV only support spot & swap markets');
|
|
1501
|
+
}
|
|
1502
|
+
//
|
|
1503
|
+
// spot
|
|
1504
|
+
//
|
|
1505
|
+
// {
|
|
1506
|
+
// "symbol":"BTCUSDT",
|
|
1507
|
+
// "scale":"KLINE_1MIN",
|
|
1508
|
+
// "data":[
|
|
1509
|
+
// {
|
|
1510
|
+
// "i":"1660825020",
|
|
1511
|
+
// "a":"93458.778",
|
|
1512
|
+
// "v":"3.9774",
|
|
1513
|
+
// "c":"23494.99",
|
|
1514
|
+
// "h":"23509.63",
|
|
1515
|
+
// "l":"23491.93",
|
|
1516
|
+
// "o":"23508.34"
|
|
1517
|
+
// }
|
|
1518
|
+
// ]
|
|
1519
|
+
// }
|
|
1520
|
+
//
|
|
1521
|
+
// swap
|
|
1522
|
+
//
|
|
1523
|
+
// [
|
|
1524
|
+
// {
|
|
1525
|
+
// "high": "35360.7",
|
|
1526
|
+
// "vol": "110288",
|
|
1527
|
+
// "low": "35347.9",
|
|
1528
|
+
// "idx": 1699411680000,
|
|
1529
|
+
// "close": "35347.9",
|
|
1530
|
+
// "open": "35349.4"
|
|
1531
|
+
// }
|
|
1532
|
+
// ]
|
|
1533
|
+
//
|
|
1534
|
+
return this.parseOHLCVs(data, market, timeframe, since, limit);
|
|
1535
|
+
}
|
|
1536
|
+
parseOHLCV(ohlcv, market = undefined) {
|
|
1537
|
+
//
|
|
1538
|
+
// spot
|
|
1539
|
+
//
|
|
1540
|
+
// {
|
|
1541
|
+
// "i":"1660825020",
|
|
1542
|
+
// "a":"93458.778",
|
|
1543
|
+
// "v":"3.9774",
|
|
1544
|
+
// "c":"23494.99",
|
|
1545
|
+
// "h":"23509.63",
|
|
1546
|
+
// "l":"23491.93",
|
|
1547
|
+
// "o":"23508.34"
|
|
1548
|
+
// }
|
|
1549
|
+
//
|
|
1550
|
+
// swap
|
|
1551
|
+
//
|
|
1552
|
+
// {
|
|
1553
|
+
// "high": "35360.7",
|
|
1554
|
+
// "vol": "110288",
|
|
1555
|
+
// "low": "35347.9",
|
|
1556
|
+
// "idx": 1699411680000,
|
|
1557
|
+
// "close": "35347.9",
|
|
1558
|
+
// "open": "35349.4"
|
|
1559
|
+
// }
|
|
1560
|
+
//
|
|
1561
|
+
let timestamp = this.safeTimestamp(ohlcv, 'i');
|
|
1562
|
+
if (timestamp === undefined) {
|
|
1563
|
+
timestamp = this.safeInteger(ohlcv, 'idx');
|
|
1564
|
+
}
|
|
1565
|
+
return [
|
|
1566
|
+
timestamp,
|
|
1567
|
+
this.safeNumber2(ohlcv, 'o', 'open'),
|
|
1568
|
+
this.safeNumber2(ohlcv, 'h', 'high'),
|
|
1569
|
+
this.safeNumber2(ohlcv, 'l', 'low'),
|
|
1570
|
+
this.safeNumber2(ohlcv, 'c', 'close'),
|
|
1571
|
+
this.safeNumber2(ohlcv, 'v', 'vol'),
|
|
1572
|
+
];
|
|
1573
|
+
}
|
|
1574
|
+
/**
|
|
1575
|
+
* @method
|
|
1576
|
+
* @name bitrue#fetchBidsAsks
|
|
1577
|
+
* @description fetches the bid and ask price and volume for multiple markets
|
|
1578
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
|
|
1579
|
+
* @see https://www.bitrue.com/api-docs#ticker
|
|
1580
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
|
1581
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
|
|
1582
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1583
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
1584
|
+
*/
|
|
1585
|
+
async fetchBidsAsks(symbols = undefined, params = {}) {
|
|
1586
|
+
await this.loadMarkets();
|
|
1587
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
1588
|
+
const first = this.safeString(symbols, 0);
|
|
1589
|
+
const market = this.market(first);
|
|
1590
|
+
let response = undefined;
|
|
1591
|
+
if (market['swap']) {
|
|
1592
|
+
const request = {
|
|
1593
|
+
'contractName': market['id'],
|
|
1594
|
+
};
|
|
1595
|
+
if (market['linear']) {
|
|
1596
|
+
response = await this.fapiV1PublicGetTicker(this.extend(request, params));
|
|
1597
|
+
}
|
|
1598
|
+
else if (market['inverse']) {
|
|
1599
|
+
response = await this.dapiV1PublicGetTicker(this.extend(request, params));
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
else if (market['spot']) {
|
|
1603
|
+
const request = {
|
|
1604
|
+
'symbol': market['id'],
|
|
1605
|
+
};
|
|
1606
|
+
response = await this.spotV1PublicGetTickerBookTicker(this.extend(request, params));
|
|
1607
|
+
}
|
|
1608
|
+
else {
|
|
1609
|
+
throw new NotSupported(this.id + ' fetchBidsAsks only support spot & swap markets');
|
|
1610
|
+
}
|
|
1611
|
+
//
|
|
1612
|
+
// spot
|
|
1613
|
+
//
|
|
1614
|
+
// {
|
|
1615
|
+
// "symbol": "LTCBTC",
|
|
1616
|
+
// "bidPrice": "4.00000000",
|
|
1617
|
+
// "bidQty": "431.00000000",
|
|
1618
|
+
// "askPrice": "4.00000200",
|
|
1619
|
+
// "askQty": "9.00000000"
|
|
1620
|
+
// }
|
|
1621
|
+
//
|
|
1622
|
+
// swap
|
|
1623
|
+
//
|
|
1624
|
+
// {
|
|
1625
|
+
// "high": "35296",
|
|
1626
|
+
// "vol": "779308354",
|
|
1627
|
+
// "last": "34884.1",
|
|
1628
|
+
// "low": "34806.7",
|
|
1629
|
+
// "buy": 34883.9,
|
|
1630
|
+
// "sell": 34884,
|
|
1631
|
+
// "rose": "-0.0027957315",
|
|
1632
|
+
// "time": 1699348013000
|
|
1633
|
+
// }
|
|
1634
|
+
//
|
|
1635
|
+
const data = {};
|
|
1636
|
+
data[market['id']] = response;
|
|
1637
|
+
return this.parseTickers(data, symbols);
|
|
1638
|
+
}
|
|
1639
|
+
/**
|
|
1640
|
+
* @method
|
|
1641
|
+
* @name bitrue#fetchTickers
|
|
1642
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
1643
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
|
1644
|
+
* @see https://www.bitrue.com/api-docs#ticker
|
|
1645
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
|
1646
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
1647
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1648
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
1649
|
+
*/
|
|
1650
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
1651
|
+
await this.loadMarkets();
|
|
1652
|
+
symbols = this.marketSymbols(symbols);
|
|
1653
|
+
let response = undefined;
|
|
1654
|
+
let data = undefined;
|
|
1655
|
+
const request = {};
|
|
1656
|
+
let type = undefined;
|
|
1657
|
+
if (symbols !== undefined) {
|
|
1658
|
+
const first = this.safeString(symbols, 0);
|
|
1659
|
+
const market = this.market(first);
|
|
1660
|
+
if (market['swap']) {
|
|
1661
|
+
throw new NotSupported(this.id + ' fetchTickers does not support swap markets, please use fetchTicker instead');
|
|
1662
|
+
}
|
|
1663
|
+
else if (market['spot']) {
|
|
1664
|
+
response = await this.spotV1PublicGetTicker24hr(this.extend(request, params));
|
|
1665
|
+
data = response;
|
|
1666
|
+
}
|
|
1667
|
+
else {
|
|
1668
|
+
throw new NotSupported(this.id + ' fetchTickers only support spot & swap markets');
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
else {
|
|
1672
|
+
[type, params] = this.handleMarketTypeAndParams('fetchTickers', undefined, params);
|
|
1673
|
+
if (type !== 'spot') {
|
|
1674
|
+
throw new NotSupported(this.id + ' fetchTickers only support spot when symbols are not proved');
|
|
1675
|
+
}
|
|
1676
|
+
response = await this.spotV1PublicGetTicker24hr(this.extend(request, params));
|
|
1677
|
+
data = response;
|
|
1678
|
+
}
|
|
1679
|
+
//
|
|
1680
|
+
// spot
|
|
1681
|
+
//
|
|
1682
|
+
// [{
|
|
1683
|
+
// symbol: 'BTCUSDT',
|
|
1684
|
+
// priceChange: '105.20',
|
|
1685
|
+
// priceChangePercent: '0.3000',
|
|
1686
|
+
// weightedAvgPrice: null,
|
|
1687
|
+
// prevClosePrice: null,
|
|
1688
|
+
// lastPrice: '34905.21',
|
|
1689
|
+
// lastQty: null,
|
|
1690
|
+
// bidPrice: '34905.21',
|
|
1691
|
+
// askPrice: '34905.22',
|
|
1692
|
+
// openPrice: '34800.01',
|
|
1693
|
+
// highPrice: '35276.33',
|
|
1694
|
+
// lowPrice: '34787.51',
|
|
1695
|
+
// volume: '12549.6481',
|
|
1696
|
+
// quoteVolume: '439390492.917',
|
|
1697
|
+
// openTime: '0',
|
|
1698
|
+
// closeTime: '0',
|
|
1699
|
+
// firstId: '0',
|
|
1700
|
+
// lastId: '0',
|
|
1701
|
+
// count: '0'
|
|
1702
|
+
// }]
|
|
1703
|
+
//
|
|
1704
|
+
// swap
|
|
1705
|
+
//
|
|
1706
|
+
// {
|
|
1707
|
+
// "high": "35296",
|
|
1708
|
+
// "vol": "779308354",
|
|
1709
|
+
// "last": "34884.1",
|
|
1710
|
+
// "low": "34806.7",
|
|
1711
|
+
// "buy": 34883.9,
|
|
1712
|
+
// "sell": 34884,
|
|
1713
|
+
// "rose": "-0.0027957315",
|
|
1714
|
+
// "time": 1699348013000
|
|
1715
|
+
// }
|
|
1716
|
+
//
|
|
1717
|
+
// the exchange returns market ids with an underscore from the tickers endpoint
|
|
1718
|
+
// the market ids do not have an underscore, so it has to be removed
|
|
1719
|
+
// https://github.com/ccxt/ccxt/issues/13856
|
|
1720
|
+
const tickers = {};
|
|
1721
|
+
for (let i = 0; i < data.length; i++) {
|
|
1722
|
+
const ticker = this.safeDict(data, i, {});
|
|
1723
|
+
const market = this.safeMarket(this.safeString(ticker, 'symbol'));
|
|
1724
|
+
tickers[market['id']] = ticker;
|
|
1725
|
+
}
|
|
1726
|
+
return this.parseTickers(tickers, symbols);
|
|
1727
|
+
}
|
|
1728
|
+
parseTrade(trade, market = undefined) {
|
|
1729
|
+
//
|
|
1730
|
+
// fetchTrades
|
|
1731
|
+
//
|
|
1732
|
+
// {
|
|
1733
|
+
// "id": 28457,
|
|
1734
|
+
// "price": "4.00000100",
|
|
1735
|
+
// "qty": "12.00000000",
|
|
1736
|
+
// "time": 1499865549590, // Actual timestamp of trade
|
|
1737
|
+
// "isBuyerMaker": true,
|
|
1738
|
+
// "isBestMatch": true
|
|
1739
|
+
// }
|
|
1740
|
+
//
|
|
1741
|
+
// fetchTrades - spot
|
|
1742
|
+
//
|
|
1743
|
+
// {
|
|
1744
|
+
// "symbol":"USDCUSDT",
|
|
1745
|
+
// "id":20725156,
|
|
1746
|
+
// "orderId":2880918576,
|
|
1747
|
+
// "origClientOrderId":null,
|
|
1748
|
+
// "price":"0.9996000000000000",
|
|
1749
|
+
// "qty":"100.0000000000000000",
|
|
1750
|
+
// "commission":null,
|
|
1751
|
+
// "commissionAssert":null,
|
|
1752
|
+
// "time":1635558511000,
|
|
1753
|
+
// "isBuyer":false,
|
|
1754
|
+
// "isMaker":false,
|
|
1755
|
+
// "isBestMatch":true
|
|
1756
|
+
// }
|
|
1757
|
+
//
|
|
1758
|
+
// fetchTrades - future
|
|
1759
|
+
//
|
|
1760
|
+
// {
|
|
1761
|
+
// "tradeId":12,
|
|
1762
|
+
// "price":0.9,
|
|
1763
|
+
// "qty":1,
|
|
1764
|
+
// "amount":9,
|
|
1765
|
+
// "contractName":"E-SAND-USDT",
|
|
1766
|
+
// "side":"BUY",
|
|
1767
|
+
// "fee":"0.0018",
|
|
1768
|
+
// "bidId":1558124009467904992,
|
|
1769
|
+
// "askId":1558124043827644908,
|
|
1770
|
+
// "bidUserId":10294,
|
|
1771
|
+
// "askUserId":10467,
|
|
1772
|
+
// "isBuyer":true,
|
|
1773
|
+
// "isMaker":true,
|
|
1774
|
+
// "ctime":1678426306000
|
|
1775
|
+
// }
|
|
1776
|
+
//
|
|
1777
|
+
const timestamp = this.safeInteger2(trade, 'ctime', 'time');
|
|
1778
|
+
const priceString = this.safeString(trade, 'price');
|
|
1779
|
+
const amountString = this.safeString(trade, 'qty');
|
|
1780
|
+
const marketId = this.safeString2(trade, 'symbol', 'contractName');
|
|
1781
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
1782
|
+
const orderId = this.safeString(trade, 'orderId');
|
|
1783
|
+
const id = this.safeString2(trade, 'id', 'tradeId');
|
|
1784
|
+
let side = undefined;
|
|
1785
|
+
const buyerMaker = this.safeBool(trade, 'isBuyerMaker'); // ignore "m" until Bitrue fixes api
|
|
1786
|
+
const isBuyer = this.safeBool(trade, 'isBuyer');
|
|
1787
|
+
if (buyerMaker !== undefined) {
|
|
1788
|
+
side = buyerMaker ? 'sell' : 'buy';
|
|
1789
|
+
}
|
|
1790
|
+
if (isBuyer !== undefined) {
|
|
1791
|
+
side = isBuyer ? 'buy' : 'sell'; // this is a true side
|
|
1792
|
+
}
|
|
1793
|
+
let fee = undefined;
|
|
1794
|
+
if ('commission' in trade) {
|
|
1795
|
+
fee = {
|
|
1796
|
+
'cost': this.safeString2(trade, 'commission', 'fee'),
|
|
1797
|
+
'currency': this.safeCurrencyCode(this.safeString(trade, 'commissionAssert')),
|
|
1798
|
+
};
|
|
1799
|
+
}
|
|
1800
|
+
let takerOrMaker = undefined;
|
|
1801
|
+
const isMaker = this.safeBool(trade, 'isMaker');
|
|
1802
|
+
if (isMaker !== undefined) {
|
|
1803
|
+
takerOrMaker = isMaker ? 'maker' : 'taker';
|
|
1804
|
+
}
|
|
1805
|
+
return this.safeTrade({
|
|
1806
|
+
'info': trade,
|
|
1807
|
+
'timestamp': timestamp,
|
|
1808
|
+
'datetime': this.iso8601(timestamp),
|
|
1809
|
+
'symbol': symbol,
|
|
1810
|
+
'id': id,
|
|
1811
|
+
'order': orderId,
|
|
1812
|
+
'type': undefined,
|
|
1813
|
+
'side': side,
|
|
1814
|
+
'takerOrMaker': takerOrMaker,
|
|
1815
|
+
'price': priceString,
|
|
1816
|
+
'amount': amountString,
|
|
1817
|
+
'cost': undefined,
|
|
1818
|
+
'fee': fee,
|
|
1819
|
+
}, market);
|
|
1820
|
+
}
|
|
1821
|
+
/**
|
|
1822
|
+
* @method
|
|
1823
|
+
* @name bitrue#fetchTrades
|
|
1824
|
+
* @description get the list of most recent trades for a particular symbol
|
|
1825
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
|
|
1826
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
1827
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
1828
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
1829
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1830
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
1831
|
+
*/
|
|
1832
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
1833
|
+
await this.loadMarkets();
|
|
1834
|
+
const market = this.market(symbol);
|
|
1835
|
+
let response = undefined;
|
|
1836
|
+
if (market['spot']) {
|
|
1837
|
+
const request = {
|
|
1838
|
+
'symbol': market['id'],
|
|
1839
|
+
// 'limit': 100, // default 100, max = 1000
|
|
1840
|
+
};
|
|
1841
|
+
if (limit !== undefined) {
|
|
1842
|
+
request['limit'] = limit; // default 100, max 1000
|
|
1843
|
+
}
|
|
1844
|
+
response = await this.spotV1PublicGetTrades(this.extend(request, params));
|
|
1845
|
+
}
|
|
1846
|
+
else {
|
|
1847
|
+
throw new NotSupported(this.id + ' fetchTrades only support spot markets');
|
|
1848
|
+
}
|
|
1849
|
+
//
|
|
1850
|
+
// spot
|
|
1851
|
+
//
|
|
1852
|
+
// [
|
|
1853
|
+
// {
|
|
1854
|
+
// "id": 28457,
|
|
1855
|
+
// "price": "4.00000100",
|
|
1856
|
+
// "qty": "12.00000000",
|
|
1857
|
+
// "time": 1499865549590,
|
|
1858
|
+
// "isBuyerMaker": true,
|
|
1859
|
+
// "isBestMatch": true
|
|
1860
|
+
// }
|
|
1861
|
+
// ]
|
|
1862
|
+
//
|
|
1863
|
+
return this.parseTrades(response, market, since, limit);
|
|
1864
|
+
}
|
|
1865
|
+
parseOrderStatus(status) {
|
|
1866
|
+
const statuses = {
|
|
1867
|
+
'INIT': 'open',
|
|
1868
|
+
'PENDING_CREATE': 'open',
|
|
1869
|
+
'NEW': 'open',
|
|
1870
|
+
'PARTIALLY_FILLED': 'open',
|
|
1871
|
+
'FILLED': 'closed',
|
|
1872
|
+
'CANCELED': 'canceled',
|
|
1873
|
+
'PENDING_CANCEL': 'canceling',
|
|
1874
|
+
'REJECTED': 'rejected',
|
|
1875
|
+
'EXPIRED': 'expired',
|
|
1876
|
+
};
|
|
1877
|
+
return this.safeString(statuses, status, status);
|
|
1878
|
+
}
|
|
1879
|
+
parseOrder(order, market = undefined) {
|
|
1880
|
+
//
|
|
1881
|
+
// createOrder - spot
|
|
1882
|
+
//
|
|
1883
|
+
// {
|
|
1884
|
+
// "symbol":"USDCUSDT",
|
|
1885
|
+
// "orderId":2878854881,
|
|
1886
|
+
// "clientOrderId":"",
|
|
1887
|
+
// "transactTime":1635551031276
|
|
1888
|
+
// }
|
|
1889
|
+
//
|
|
1890
|
+
// createOrder - future
|
|
1891
|
+
//
|
|
1892
|
+
// {
|
|
1893
|
+
// "orderId":1690615676032452985,
|
|
1894
|
+
// }
|
|
1895
|
+
//
|
|
1896
|
+
// fetchOrders - spot
|
|
1897
|
+
//
|
|
1898
|
+
// {
|
|
1899
|
+
// "symbol":"USDCUSDT",
|
|
1900
|
+
// "orderId":"2878854881",
|
|
1901
|
+
// "clientOrderId":"",
|
|
1902
|
+
// "price":"1.1000000000000000",
|
|
1903
|
+
// "origQty":"100.0000000000000000",
|
|
1904
|
+
// "executedQty":"0.0000000000000000",
|
|
1905
|
+
// "cummulativeQuoteQty":"0.0000000000000000",
|
|
1906
|
+
// "status":"NEW",
|
|
1907
|
+
// "timeInForce":"",
|
|
1908
|
+
// "type":"LIMIT",
|
|
1909
|
+
// "side":"SELL",
|
|
1910
|
+
// "stopPrice":"",
|
|
1911
|
+
// "icebergQty":"",
|
|
1912
|
+
// "time":1635551031000,
|
|
1913
|
+
// "updateTime":1635551031000,
|
|
1914
|
+
// "isWorking":false
|
|
1915
|
+
// }
|
|
1916
|
+
//
|
|
1917
|
+
// fetchOrders - future
|
|
1918
|
+
//
|
|
1919
|
+
// {
|
|
1920
|
+
// "orderId":1917641,
|
|
1921
|
+
// "price":100,
|
|
1922
|
+
// "origQty":10,
|
|
1923
|
+
// "origAmount":10,
|
|
1924
|
+
// "executedQty":1,
|
|
1925
|
+
// "avgPrice":10000,
|
|
1926
|
+
// "status":"INIT",
|
|
1927
|
+
// "type":"LIMIT",
|
|
1928
|
+
// "side":"BUY",
|
|
1929
|
+
// "action":"OPEN",
|
|
1930
|
+
// "transactTime":1686716571425
|
|
1931
|
+
// "clientOrderId":4949299210
|
|
1932
|
+
// }
|
|
1933
|
+
//
|
|
1934
|
+
const status = this.parseOrderStatus(this.safeString2(order, 'status', 'orderStatus'));
|
|
1935
|
+
const marketId = this.safeString(order, 'symbol');
|
|
1936
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
1937
|
+
const filled = this.safeString(order, 'executedQty');
|
|
1938
|
+
let timestamp = undefined;
|
|
1939
|
+
let lastTradeTimestamp = undefined;
|
|
1940
|
+
if ('time' in order) {
|
|
1941
|
+
timestamp = this.safeInteger(order, 'time');
|
|
1942
|
+
}
|
|
1943
|
+
else if ('transactTime' in order) {
|
|
1944
|
+
timestamp = this.safeInteger(order, 'transactTime');
|
|
1945
|
+
}
|
|
1946
|
+
else if ('updateTime' in order) {
|
|
1947
|
+
if (status === 'open') {
|
|
1948
|
+
if (Precise.stringGt(filled, '0')) {
|
|
1949
|
+
lastTradeTimestamp = this.safeInteger(order, 'updateTime');
|
|
1950
|
+
}
|
|
1951
|
+
else {
|
|
1952
|
+
timestamp = this.safeInteger(order, 'updateTime');
|
|
1953
|
+
}
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
const average = this.safeString(order, 'avgPrice');
|
|
1957
|
+
const price = this.safeString(order, 'price');
|
|
1958
|
+
const amount = this.safeString(order, 'origQty');
|
|
1959
|
+
// - Spot/Margin market: cummulativeQuoteQty
|
|
1960
|
+
// - Futures market: cumQuote.
|
|
1961
|
+
// Note this is not the actual cost, since Binance futures uses leverage to calculate margins.
|
|
1962
|
+
const cost = this.safeString2(order, 'cummulativeQuoteQty', 'cumQuote');
|
|
1963
|
+
const id = this.safeString(order, 'orderId');
|
|
1964
|
+
let type = this.safeStringLower(order, 'type');
|
|
1965
|
+
const side = this.safeStringLower(order, 'side');
|
|
1966
|
+
const fills = this.safeList(order, 'fills', []);
|
|
1967
|
+
const clientOrderId = this.safeString(order, 'clientOrderId');
|
|
1968
|
+
const timeInForce = this.safeString(order, 'timeInForce');
|
|
1969
|
+
const postOnly = (type === 'limit_maker') || (timeInForce === 'GTX') || (type === 'post_only');
|
|
1970
|
+
if (type === 'limit_maker') {
|
|
1971
|
+
type = 'limit';
|
|
1972
|
+
}
|
|
1973
|
+
const triggerPrice = this.parseNumber(this.omitZero(this.safeString(order, 'stopPrice')));
|
|
1974
|
+
return this.safeOrder({
|
|
1975
|
+
'info': order,
|
|
1976
|
+
'id': id,
|
|
1977
|
+
'clientOrderId': clientOrderId,
|
|
1978
|
+
'timestamp': timestamp,
|
|
1979
|
+
'datetime': this.iso8601(timestamp),
|
|
1980
|
+
'lastTradeTimestamp': lastTradeTimestamp,
|
|
1981
|
+
'symbol': symbol,
|
|
1982
|
+
'type': type,
|
|
1983
|
+
'timeInForce': timeInForce,
|
|
1984
|
+
'postOnly': postOnly,
|
|
1985
|
+
'side': side,
|
|
1986
|
+
'price': price,
|
|
1987
|
+
'triggerPrice': triggerPrice,
|
|
1988
|
+
'amount': amount,
|
|
1989
|
+
'cost': cost,
|
|
1990
|
+
'average': average,
|
|
1991
|
+
'filled': filled,
|
|
1992
|
+
'remaining': undefined,
|
|
1993
|
+
'status': status,
|
|
1994
|
+
'fee': undefined,
|
|
1995
|
+
'trades': fills,
|
|
1996
|
+
}, market);
|
|
1997
|
+
}
|
|
1998
|
+
/**
|
|
1999
|
+
* @method
|
|
2000
|
+
* @name bitrue#createMarketBuyOrderWithCost
|
|
2001
|
+
* @description create a market buy order by providing the symbol and cost
|
|
2002
|
+
* @see https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
|
|
2003
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
|
|
2004
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
2005
|
+
* @param {float} cost how much you want to trade in units of the quote currency
|
|
2006
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2007
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2008
|
+
*/
|
|
2009
|
+
async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
|
|
2010
|
+
await this.loadMarkets();
|
|
2011
|
+
const market = this.market(symbol);
|
|
2012
|
+
if (!market['swap']) {
|
|
2013
|
+
throw new NotSupported(this.id + ' createMarketBuyOrderWithCost() supports swap orders only');
|
|
2014
|
+
}
|
|
2015
|
+
params['createMarketBuyOrderRequiresPrice'] = false;
|
|
2016
|
+
return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
|
|
2017
|
+
}
|
|
2018
|
+
/**
|
|
2019
|
+
* @method
|
|
2020
|
+
* @name bitrue#createOrder
|
|
2021
|
+
* @description create a trade order
|
|
2022
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#new-order-trade
|
|
2023
|
+
* @see https://www.bitrue.com/api_docs_includes_file/futures/index.html#new-order-trade-hmac-sha256
|
|
2024
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
2025
|
+
* @param {string} type 'market' or 'limit'
|
|
2026
|
+
* @param {string} side 'buy' or 'sell'
|
|
2027
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
2028
|
+
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
2029
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2030
|
+
* @param {float} [params.triggerPrice] *spot only* the price at which a trigger order is triggered at
|
|
2031
|
+
* @param {string} [params.clientOrderId] a unique id for the order, automatically generated if not sent
|
|
2032
|
+
* @param {decimal} [params.leverage] in future order, the leverage value of the order should consistent with the user contract configuration, default is 1
|
|
2033
|
+
* @param {string} [params.timeInForce] 'fok', 'ioc' or 'po'
|
|
2034
|
+
* @param {bool} [params.postOnly] default false
|
|
2035
|
+
* @param {bool} [params.reduceOnly] default false
|
|
2036
|
+
* EXCHANGE SPECIFIC PARAMETERS
|
|
2037
|
+
* @param {decimal} [params.icebergQty]
|
|
2038
|
+
* @param {long} [params.recvWindow]
|
|
2039
|
+
* @param {float} [params.cost] *swap market buy only* the quote quantity that can be used as an alternative for the amount
|
|
2040
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2041
|
+
*/
|
|
2042
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
2043
|
+
await this.loadMarkets();
|
|
2044
|
+
const market = this.market(symbol);
|
|
2045
|
+
let response = undefined;
|
|
2046
|
+
let data = undefined;
|
|
2047
|
+
const uppercaseType = type.toUpperCase();
|
|
2048
|
+
const request = {
|
|
2049
|
+
'side': side.toUpperCase(),
|
|
2050
|
+
'type': uppercaseType,
|
|
2051
|
+
// 'timeInForce': '',
|
|
2052
|
+
// 'price': this.priceToPrecision (symbol, price),
|
|
2053
|
+
// 'newClientOrderId': clientOrderId, // automatically generated if not sent
|
|
2054
|
+
// 'stopPrice': this.priceToPrecision (symbol, 'stopPrice'),
|
|
2055
|
+
// 'icebergQty': this.amountToPrecision (symbol, icebergQty),
|
|
2056
|
+
};
|
|
2057
|
+
if (uppercaseType === 'LIMIT') {
|
|
2058
|
+
if (price === undefined) {
|
|
2059
|
+
throw new InvalidOrder(this.id + ' createOrder() requires a price argument');
|
|
2060
|
+
}
|
|
2061
|
+
request['price'] = this.priceToPrecision(symbol, price);
|
|
2062
|
+
}
|
|
2063
|
+
if (market['swap']) {
|
|
2064
|
+
const isMarket = uppercaseType === 'MARKET';
|
|
2065
|
+
const timeInForce = this.safeStringLower(params, 'timeInForce');
|
|
2066
|
+
const postOnly = this.isPostOnly(isMarket, undefined, params);
|
|
2067
|
+
if (postOnly) {
|
|
2068
|
+
request['type'] = 'POST_ONLY';
|
|
2069
|
+
}
|
|
2070
|
+
else if (timeInForce === 'fok') {
|
|
2071
|
+
request['type'] = 'FOK';
|
|
2072
|
+
}
|
|
2073
|
+
else if (timeInForce === 'ioc') {
|
|
2074
|
+
request['type'] = 'IOC';
|
|
2075
|
+
}
|
|
2076
|
+
request['contractName'] = market['id'];
|
|
2077
|
+
let createMarketBuyOrderRequiresPrice = true;
|
|
2078
|
+
[createMarketBuyOrderRequiresPrice, params] = this.handleOptionAndParams(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', true);
|
|
2079
|
+
if (isMarket && (side === 'buy') && createMarketBuyOrderRequiresPrice) {
|
|
2080
|
+
const cost = this.safeString(params, 'cost');
|
|
2081
|
+
params = this.omit(params, 'cost');
|
|
2082
|
+
if (price === undefined && cost === undefined) {
|
|
2083
|
+
throw new InvalidOrder(this.id + ' createOrder() requires the price argument with swap market buy orders to calculate total order cost (amount to spend), where cost = amount * price. Supply a price argument to createOrder() call if you want the cost to be calculated for you from price and amount, or, alternatively, add .options["createMarketBuyOrderRequiresPrice"] = false to supply the cost in the amount argument (the exchange-specific behaviour)');
|
|
2084
|
+
}
|
|
2085
|
+
else {
|
|
2086
|
+
const amountString = this.numberToString(amount);
|
|
2087
|
+
const priceString = this.numberToString(price);
|
|
2088
|
+
const quoteAmount = Precise.stringMul(amountString, priceString);
|
|
2089
|
+
const requestAmount = (cost !== undefined) ? cost : quoteAmount;
|
|
2090
|
+
request['amount'] = this.costToPrecision(symbol, requestAmount);
|
|
2091
|
+
request['volume'] = this.costToPrecision(symbol, requestAmount);
|
|
2092
|
+
}
|
|
2093
|
+
}
|
|
2094
|
+
else {
|
|
2095
|
+
request['amount'] = this.parseToNumeric(amount);
|
|
2096
|
+
request['volume'] = this.parseToNumeric(amount);
|
|
2097
|
+
}
|
|
2098
|
+
request['positionType'] = 1;
|
|
2099
|
+
const reduceOnly = this.safeValue2(params, 'reduceOnly', 'reduce_only');
|
|
2100
|
+
request['open'] = reduceOnly ? 'CLOSE' : 'OPEN';
|
|
2101
|
+
const leverage = this.safeString(params, 'leverage', '1');
|
|
2102
|
+
request['leverage'] = this.parseToNumeric(leverage);
|
|
2103
|
+
params = this.omit(params, ['leverage', 'reduceOnly', 'reduce_only', 'timeInForce']);
|
|
2104
|
+
if (market['linear']) {
|
|
2105
|
+
response = await this.fapiV2PrivatePostOrder(this.extend(request, params));
|
|
2106
|
+
}
|
|
2107
|
+
else if (market['inverse']) {
|
|
2108
|
+
response = await this.dapiV2PrivatePostOrder(this.extend(request, params));
|
|
2109
|
+
}
|
|
2110
|
+
data = this.safeDict(response, 'data', {});
|
|
2111
|
+
}
|
|
2112
|
+
else if (market['spot']) {
|
|
2113
|
+
request['symbol'] = market['id'];
|
|
2114
|
+
request['quantity'] = this.amountToPrecision(symbol, amount);
|
|
2115
|
+
const validOrderTypes = this.safeValue(market['info'], 'orderTypes');
|
|
2116
|
+
if (!this.inArray(uppercaseType, validOrderTypes)) {
|
|
2117
|
+
throw new InvalidOrder(this.id + ' ' + type + ' is not a valid order type in market ' + symbol);
|
|
2118
|
+
}
|
|
2119
|
+
const clientOrderId = this.safeString2(params, 'newClientOrderId', 'clientOrderId');
|
|
2120
|
+
if (clientOrderId !== undefined) {
|
|
2121
|
+
params = this.omit(params, ['newClientOrderId', 'clientOrderId']);
|
|
2122
|
+
request['newClientOrderId'] = clientOrderId;
|
|
2123
|
+
}
|
|
2124
|
+
const triggerPrice = this.safeValue2(params, 'triggerPrice', 'stopPrice');
|
|
2125
|
+
if (triggerPrice !== undefined) {
|
|
2126
|
+
params = this.omit(params, ['triggerPrice', 'stopPrice']);
|
|
2127
|
+
request['stopPrice'] = this.priceToPrecision(symbol, triggerPrice);
|
|
2128
|
+
}
|
|
2129
|
+
response = await this.spotV1PrivatePostOrder(this.extend(request, params));
|
|
2130
|
+
data = response;
|
|
2131
|
+
}
|
|
2132
|
+
else {
|
|
2133
|
+
throw new NotSupported(this.id + ' createOrder only support spot & swap markets');
|
|
2134
|
+
}
|
|
2135
|
+
//
|
|
2136
|
+
// spot
|
|
2137
|
+
//
|
|
2138
|
+
// {
|
|
2139
|
+
// "symbol": "BTCUSDT",
|
|
2140
|
+
// "orderId": 307650651173648896,
|
|
2141
|
+
// "orderIdStr": "307650651173648896",
|
|
2142
|
+
// "clientOrderId": "6gCrw2kRUAF9CvJDGP16IP",
|
|
2143
|
+
// "transactTime": 1507725176595
|
|
2144
|
+
// }
|
|
2145
|
+
//
|
|
2146
|
+
// swap
|
|
2147
|
+
//
|
|
2148
|
+
// {
|
|
2149
|
+
// "code": "0",
|
|
2150
|
+
// "msg": "Success",
|
|
2151
|
+
// "data": {
|
|
2152
|
+
// "orderId": 1690615676032452985
|
|
2153
|
+
// }
|
|
2154
|
+
// }
|
|
2155
|
+
//
|
|
2156
|
+
return this.parseOrder(data, market);
|
|
2157
|
+
}
|
|
2158
|
+
/**
|
|
2159
|
+
* @method
|
|
2160
|
+
* @name bitrue#fetchOrder
|
|
2161
|
+
* @description fetches information on an order made by the user
|
|
2162
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#query-order-user_data
|
|
2163
|
+
* @see https://www.bitrue.com/api_docs_includes_file/futures/index.html#query-order-user_data-hmac-sha256
|
|
2164
|
+
* @param {string} id the order id
|
|
2165
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
2166
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2167
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2168
|
+
*/
|
|
2169
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
2170
|
+
if (symbol === undefined) {
|
|
2171
|
+
throw new ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
|
|
2172
|
+
}
|
|
2173
|
+
await this.loadMarkets();
|
|
2174
|
+
const market = this.market(symbol);
|
|
2175
|
+
const origClientOrderId = this.safeValue2(params, 'origClientOrderId', 'clientOrderId');
|
|
2176
|
+
params = this.omit(params, ['origClientOrderId', 'clientOrderId']);
|
|
2177
|
+
let response = undefined;
|
|
2178
|
+
let data = undefined;
|
|
2179
|
+
const request = {};
|
|
2180
|
+
if (origClientOrderId === undefined) {
|
|
2181
|
+
request['orderId'] = id;
|
|
2182
|
+
}
|
|
2183
|
+
else {
|
|
2184
|
+
if (market['swap']) {
|
|
2185
|
+
request['clientOrderId'] = origClientOrderId;
|
|
2186
|
+
}
|
|
2187
|
+
else {
|
|
2188
|
+
request['origClientOrderId'] = origClientOrderId;
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
if (market['swap']) {
|
|
2192
|
+
request['contractName'] = market['id'];
|
|
2193
|
+
if (market['linear']) {
|
|
2194
|
+
response = await this.fapiV2PrivateGetOrder(this.extend(request, params));
|
|
2195
|
+
}
|
|
2196
|
+
else if (market['inverse']) {
|
|
2197
|
+
response = await this.dapiV2PrivateGetOrder(this.extend(request, params));
|
|
2198
|
+
}
|
|
2199
|
+
data = this.safeDict(response, 'data', {});
|
|
2200
|
+
}
|
|
2201
|
+
else if (market['spot']) {
|
|
2202
|
+
request['orderId'] = id; // spot market id is mandatory
|
|
2203
|
+
request['symbol'] = market['id'];
|
|
2204
|
+
response = await this.spotV1PrivateGetOrder(this.extend(request, params));
|
|
2205
|
+
data = response;
|
|
2206
|
+
}
|
|
2207
|
+
else {
|
|
2208
|
+
throw new NotSupported(this.id + ' fetchOrder only support spot & swap markets');
|
|
2209
|
+
}
|
|
2210
|
+
//
|
|
2211
|
+
// spot
|
|
2212
|
+
//
|
|
2213
|
+
// {
|
|
2214
|
+
// "symbol": "LTCBTC",
|
|
2215
|
+
// "orderId": 1,
|
|
2216
|
+
// "clientOrderId": "myOrder1",
|
|
2217
|
+
// "price": "0.1",
|
|
2218
|
+
// "origQty": "1.0",
|
|
2219
|
+
// "executedQty": "0.0",
|
|
2220
|
+
// "cummulativeQuoteQty": "0.0",
|
|
2221
|
+
// "status": "NEW",
|
|
2222
|
+
// "timeInForce": "GTC",
|
|
2223
|
+
// "type": "LIMIT",
|
|
2224
|
+
// "side": "BUY",
|
|
2225
|
+
// "stopPrice": "0.0",
|
|
2226
|
+
// "icebergQty": "0.0",
|
|
2227
|
+
// "time": 1499827319559,
|
|
2228
|
+
// "updateTime": 1499827319559,
|
|
2229
|
+
// "isWorking": true
|
|
2230
|
+
// }
|
|
2231
|
+
//
|
|
2232
|
+
// swap
|
|
2233
|
+
//
|
|
2234
|
+
// {
|
|
2235
|
+
// "code":0,
|
|
2236
|
+
// "msg":"success",
|
|
2237
|
+
// "data":{
|
|
2238
|
+
// "orderId":1917641,
|
|
2239
|
+
// "price":100,
|
|
2240
|
+
// "origQty":10,
|
|
2241
|
+
// "origAmount":10,
|
|
2242
|
+
// "executedQty":1,
|
|
2243
|
+
// "avgPrice":10000,
|
|
2244
|
+
// "status":"INIT",
|
|
2245
|
+
// "type":"LIMIT",
|
|
2246
|
+
// "side":"BUY",
|
|
2247
|
+
// "action":"OPEN",
|
|
2248
|
+
// "transactTime":1686716571425
|
|
2249
|
+
// "clientOrderId":4949299210
|
|
2250
|
+
// }
|
|
2251
|
+
// }
|
|
2252
|
+
//
|
|
2253
|
+
return this.parseOrder(data, market);
|
|
2254
|
+
}
|
|
2255
|
+
/**
|
|
2256
|
+
* @method
|
|
2257
|
+
* @name bitrue#fetchClosedOrders
|
|
2258
|
+
* @description fetches information on multiple closed orders made by the user
|
|
2259
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#all-orders-user_data
|
|
2260
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
2261
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
2262
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
2263
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2264
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2265
|
+
*/
|
|
2266
|
+
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2267
|
+
if (symbol === undefined) {
|
|
2268
|
+
throw new ArgumentsRequired(this.id + ' fetchClosedOrders() requires a symbol argument');
|
|
2269
|
+
}
|
|
2270
|
+
await this.loadMarkets();
|
|
2271
|
+
const market = this.market(symbol);
|
|
2272
|
+
if (!market['spot']) {
|
|
2273
|
+
throw new NotSupported(this.id + ' fetchClosedOrders only support spot markets');
|
|
2274
|
+
}
|
|
2275
|
+
const request = {
|
|
2276
|
+
'symbol': market['id'],
|
|
2277
|
+
// 'orderId': 123445, // long
|
|
2278
|
+
// 'startTime': since,
|
|
2279
|
+
// 'endTime': this.milliseconds (),
|
|
2280
|
+
// 'limit': limit, // default 100, max 1000
|
|
2281
|
+
};
|
|
2282
|
+
if (since !== undefined) {
|
|
2283
|
+
request['startTime'] = since;
|
|
2284
|
+
}
|
|
2285
|
+
if (limit !== undefined) {
|
|
2286
|
+
request['limit'] = limit; // default 100, max 1000
|
|
2287
|
+
}
|
|
2288
|
+
const response = await this.spotV1PrivateGetAllOrders(this.extend(request, params));
|
|
2289
|
+
//
|
|
2290
|
+
// [
|
|
2291
|
+
// {
|
|
2292
|
+
// "symbol": "LTCBTC",
|
|
2293
|
+
// "orderId": 1,
|
|
2294
|
+
// "clientOrderId": "myOrder1",
|
|
2295
|
+
// "price": "0.1",
|
|
2296
|
+
// "origQty": "1.0",
|
|
2297
|
+
// "executedQty": "0.0",
|
|
2298
|
+
// "cummulativeQuoteQty": "0.0",
|
|
2299
|
+
// "status": "NEW",
|
|
2300
|
+
// "timeInForce": "GTC",
|
|
2301
|
+
// "type": "LIMIT",
|
|
2302
|
+
// "side": "BUY",
|
|
2303
|
+
// "stopPrice": "0.0",
|
|
2304
|
+
// "icebergQty": "0.0",
|
|
2305
|
+
// "time": 1499827319559,
|
|
2306
|
+
// "updateTime": 1499827319559,
|
|
2307
|
+
// "isWorking": true
|
|
2308
|
+
// }
|
|
2309
|
+
// ]
|
|
2310
|
+
//
|
|
2311
|
+
return this.parseOrders(response, market, since, limit);
|
|
2312
|
+
}
|
|
2313
|
+
/**
|
|
2314
|
+
* @method
|
|
2315
|
+
* @name bitrue#fetchOpenOrders
|
|
2316
|
+
* @description fetch all unfilled currently open orders
|
|
2317
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#current-open-orders-user_data
|
|
2318
|
+
* @see https://www.bitrue.com/api_docs_includes_file/futures/index.html#cancel-all-open-orders-trade-hmac-sha256
|
|
2319
|
+
* @param {string} symbol unified market symbol
|
|
2320
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
2321
|
+
* @param {int} [limit] the maximum number of open order structures to retrieve
|
|
2322
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2323
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2324
|
+
*/
|
|
2325
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2326
|
+
if (symbol === undefined) {
|
|
2327
|
+
throw new ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument');
|
|
2328
|
+
}
|
|
2329
|
+
await this.loadMarkets();
|
|
2330
|
+
const market = this.market(symbol);
|
|
2331
|
+
let response = undefined;
|
|
2332
|
+
let data = undefined;
|
|
2333
|
+
const request = {};
|
|
2334
|
+
if (market['swap']) {
|
|
2335
|
+
request['contractName'] = market['id'];
|
|
2336
|
+
if (market['linear']) {
|
|
2337
|
+
response = await this.fapiV2PrivateGetOpenOrders(this.extend(request, params));
|
|
2338
|
+
}
|
|
2339
|
+
else if (market['inverse']) {
|
|
2340
|
+
response = await this.dapiV2PrivateGetOpenOrders(this.extend(request, params));
|
|
2341
|
+
}
|
|
2342
|
+
data = this.safeList(response, 'data', []);
|
|
2343
|
+
}
|
|
2344
|
+
else if (market['spot']) {
|
|
2345
|
+
request['symbol'] = market['id'];
|
|
2346
|
+
response = await this.spotV1PrivateGetOpenOrders(this.extend(request, params));
|
|
2347
|
+
data = response;
|
|
2348
|
+
}
|
|
2349
|
+
else {
|
|
2350
|
+
throw new NotSupported(this.id + ' fetchOpenOrders only support spot & swap markets');
|
|
2351
|
+
}
|
|
2352
|
+
//
|
|
2353
|
+
// spot
|
|
2354
|
+
//
|
|
2355
|
+
// [
|
|
2356
|
+
// {
|
|
2357
|
+
// "symbol":"USDCUSDT",
|
|
2358
|
+
// "orderId":"2878854881",
|
|
2359
|
+
// "clientOrderId":"",
|
|
2360
|
+
// "price":"1.1000000000000000",
|
|
2361
|
+
// "origQty":"100.0000000000000000",
|
|
2362
|
+
// "executedQty":"0.0000000000000000",
|
|
2363
|
+
// "cummulativeQuoteQty":"0.0000000000000000",
|
|
2364
|
+
// "status":"NEW",
|
|
2365
|
+
// "timeInForce":"",
|
|
2366
|
+
// "type":"LIMIT",
|
|
2367
|
+
// "side":"SELL",
|
|
2368
|
+
// "stopPrice":"",
|
|
2369
|
+
// "icebergQty":"",
|
|
2370
|
+
// "time":1635551031000,
|
|
2371
|
+
// "updateTime":1635551031000,
|
|
2372
|
+
// "isWorking":false
|
|
2373
|
+
// }
|
|
2374
|
+
// ]
|
|
2375
|
+
//
|
|
2376
|
+
// swap
|
|
2377
|
+
//
|
|
2378
|
+
// {
|
|
2379
|
+
// "code": "0",
|
|
2380
|
+
// "msg": "Success",
|
|
2381
|
+
// "data": [{
|
|
2382
|
+
// "orderId": 1917641,
|
|
2383
|
+
// "clientOrderId": "2488514315",
|
|
2384
|
+
// "price": 100,
|
|
2385
|
+
// "origQty": 10,
|
|
2386
|
+
// "origAmount": 10,
|
|
2387
|
+
// "executedQty": 1,
|
|
2388
|
+
// "avgPrice": 12451,
|
|
2389
|
+
// "status": "INIT",
|
|
2390
|
+
// "type": "LIMIT",
|
|
2391
|
+
// "side": "BUY",
|
|
2392
|
+
// "action": "OPEN",
|
|
2393
|
+
// "transactTime": 1686717303975
|
|
2394
|
+
// }
|
|
2395
|
+
// ]
|
|
2396
|
+
// }
|
|
2397
|
+
//
|
|
2398
|
+
return this.parseOrders(data, market, since, limit);
|
|
2399
|
+
}
|
|
2400
|
+
/**
|
|
2401
|
+
* @method
|
|
2402
|
+
* @name bitrue#cancelOrder
|
|
2403
|
+
* @description cancels an open order
|
|
2404
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
|
|
2405
|
+
* @see https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
|
|
2406
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
|
|
2407
|
+
* @param {string} id order id
|
|
2408
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
2409
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2410
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
2411
|
+
*/
|
|
2412
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
2413
|
+
if (symbol === undefined) {
|
|
2414
|
+
throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
|
|
2415
|
+
}
|
|
2416
|
+
await this.loadMarkets();
|
|
2417
|
+
const market = this.market(symbol);
|
|
2418
|
+
const origClientOrderId = this.safeValue2(params, 'origClientOrderId', 'clientOrderId');
|
|
2419
|
+
params = this.omit(params, ['origClientOrderId', 'clientOrderId']);
|
|
2420
|
+
let response = undefined;
|
|
2421
|
+
let data = undefined;
|
|
2422
|
+
const request = {};
|
|
2423
|
+
if (origClientOrderId === undefined) {
|
|
2424
|
+
request['orderId'] = id;
|
|
2425
|
+
}
|
|
2426
|
+
else {
|
|
2427
|
+
if (market['swap']) {
|
|
2428
|
+
request['clientOrderId'] = origClientOrderId;
|
|
2429
|
+
}
|
|
2430
|
+
else {
|
|
2431
|
+
request['origClientOrderId'] = origClientOrderId;
|
|
2432
|
+
}
|
|
2433
|
+
}
|
|
2434
|
+
if (market['swap']) {
|
|
2435
|
+
request['contractName'] = market['id'];
|
|
2436
|
+
if (market['linear']) {
|
|
2437
|
+
response = await this.fapiV2PrivatePostCancel(this.extend(request, params));
|
|
2438
|
+
}
|
|
2439
|
+
else if (market['inverse']) {
|
|
2440
|
+
response = await this.dapiV2PrivatePostCancel(this.extend(request, params));
|
|
2441
|
+
}
|
|
2442
|
+
data = this.safeDict(response, 'data', {});
|
|
2443
|
+
}
|
|
2444
|
+
else if (market['spot']) {
|
|
2445
|
+
request['symbol'] = market['id'];
|
|
2446
|
+
response = await this.spotV1PrivateDeleteOrder(this.extend(request, params));
|
|
2447
|
+
data = response;
|
|
2448
|
+
}
|
|
2449
|
+
else {
|
|
2450
|
+
throw new NotSupported(this.id + ' cancelOrder only support spot & swap markets');
|
|
2451
|
+
}
|
|
2452
|
+
//
|
|
2453
|
+
// spot
|
|
2454
|
+
//
|
|
2455
|
+
// {
|
|
2456
|
+
// "symbol": "LTCBTC",
|
|
2457
|
+
// "origClientOrderId": "myOrder1",
|
|
2458
|
+
// "orderId": 1,
|
|
2459
|
+
// "clientOrderId": "cancelMyOrder1"
|
|
2460
|
+
// }
|
|
2461
|
+
//
|
|
2462
|
+
// swap
|
|
2463
|
+
//
|
|
2464
|
+
// {
|
|
2465
|
+
// "code": "0",
|
|
2466
|
+
// "msg": "Success",
|
|
2467
|
+
// "data": {
|
|
2468
|
+
// "orderId": 1690615847831143159
|
|
2469
|
+
// }
|
|
2470
|
+
// }
|
|
2471
|
+
//
|
|
2472
|
+
return this.parseOrder(data, market);
|
|
2473
|
+
}
|
|
2474
|
+
/**
|
|
2475
|
+
* @method
|
|
2476
|
+
* @name bitrue#cancelAllOrders
|
|
2477
|
+
* @description cancel all open orders in a market
|
|
2478
|
+
* @see https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
|
|
2479
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
|
|
2480
|
+
* @param {string} symbol unified market symbol of the market to cancel orders in
|
|
2481
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2482
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated', for spot margin trading
|
|
2483
|
+
* @returns {object[]} a list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
|
|
2484
|
+
*/
|
|
2485
|
+
async cancelAllOrders(symbol = undefined, params = {}) {
|
|
2486
|
+
await this.loadMarkets();
|
|
2487
|
+
const market = this.market(symbol);
|
|
2488
|
+
let response = undefined;
|
|
2489
|
+
let data = undefined;
|
|
2490
|
+
if (market['swap']) {
|
|
2491
|
+
const request = {
|
|
2492
|
+
'contractName': market['id'],
|
|
2493
|
+
};
|
|
2494
|
+
if (market['linear']) {
|
|
2495
|
+
response = await this.fapiV2PrivatePostAllOpenOrders(this.extend(request, params));
|
|
2496
|
+
}
|
|
2497
|
+
else if (market['inverse']) {
|
|
2498
|
+
response = await this.dapiV2PrivatePostAllOpenOrders(this.extend(request, params));
|
|
2499
|
+
}
|
|
2500
|
+
data = this.safeList(response, 'data', []);
|
|
2501
|
+
}
|
|
2502
|
+
else {
|
|
2503
|
+
throw new NotSupported(this.id + ' cancelAllOrders only support future markets');
|
|
2504
|
+
}
|
|
2505
|
+
//
|
|
2506
|
+
// swap
|
|
2507
|
+
//
|
|
2508
|
+
// {
|
|
2509
|
+
// 'code': '0',
|
|
2510
|
+
// 'msg': 'Success',
|
|
2511
|
+
// 'data': null
|
|
2512
|
+
// }
|
|
2513
|
+
//
|
|
2514
|
+
return this.parseOrders(data, market);
|
|
2515
|
+
}
|
|
2516
|
+
/**
|
|
2517
|
+
* @method
|
|
2518
|
+
* @name bitrue#fetchMyTrades
|
|
2519
|
+
* @description fetch all trades made by the user
|
|
2520
|
+
* @see https://www.bitrue.com/api_docs_includes_file/spot/index.html#account-trade-list-user_data
|
|
2521
|
+
* @see https://www.bitrue.com/api_docs_includes_file/futures/index.html#account-trade-list-user_data-hmac-sha256
|
|
2522
|
+
* @param {string} symbol unified market symbol
|
|
2523
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
2524
|
+
* @param {int} [limit] the maximum number of trades structures to retrieve
|
|
2525
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2526
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
2527
|
+
*/
|
|
2528
|
+
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2529
|
+
await this.loadMarkets();
|
|
2530
|
+
if (symbol === undefined) {
|
|
2531
|
+
throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
|
|
2532
|
+
}
|
|
2533
|
+
const market = this.market(symbol);
|
|
2534
|
+
let response = undefined;
|
|
2535
|
+
let data = undefined;
|
|
2536
|
+
const request = {};
|
|
2537
|
+
if (since !== undefined) {
|
|
2538
|
+
request['startTime'] = since;
|
|
2539
|
+
}
|
|
2540
|
+
if (limit !== undefined) {
|
|
2541
|
+
if (limit > 1000) {
|
|
2542
|
+
limit = 1000;
|
|
2543
|
+
}
|
|
2544
|
+
request['limit'] = limit;
|
|
2545
|
+
}
|
|
2546
|
+
if (market['swap']) {
|
|
2547
|
+
request['contractName'] = market['id'];
|
|
2548
|
+
if (market['linear']) {
|
|
2549
|
+
response = await this.fapiV2PrivateGetMyTrades(this.extend(request, params));
|
|
2550
|
+
}
|
|
2551
|
+
else if (market['inverse']) {
|
|
2552
|
+
response = await this.dapiV2PrivateGetMyTrades(this.extend(request, params));
|
|
2553
|
+
}
|
|
2554
|
+
data = this.safeList(response, 'data', []);
|
|
2555
|
+
}
|
|
2556
|
+
else if (market['spot']) {
|
|
2557
|
+
request['symbol'] = market['id'];
|
|
2558
|
+
response = await this.spotV2PrivateGetMyTrades(this.extend(request, params));
|
|
2559
|
+
data = response;
|
|
2560
|
+
}
|
|
2561
|
+
else {
|
|
2562
|
+
throw new NotSupported(this.id + ' fetchMyTrades only support spot & swap markets');
|
|
2563
|
+
}
|
|
2564
|
+
//
|
|
2565
|
+
// spot
|
|
2566
|
+
//
|
|
2567
|
+
// [
|
|
2568
|
+
// {
|
|
2569
|
+
// "symbol":"USDCUSDT",
|
|
2570
|
+
// "id":20725156,
|
|
2571
|
+
// "orderId":2880918576,
|
|
2572
|
+
// "origClientOrderId":null,
|
|
2573
|
+
// "price":"0.9996000000000000",
|
|
2574
|
+
// "qty":"100.0000000000000000",
|
|
2575
|
+
// "commission":null,
|
|
2576
|
+
// "commissionAssert":null,
|
|
2577
|
+
// "time":1635558511000,
|
|
2578
|
+
// "isBuyer":false,
|
|
2579
|
+
// "isMaker":false,
|
|
2580
|
+
// "isBestMatch":true
|
|
2581
|
+
// }
|
|
2582
|
+
// ]
|
|
2583
|
+
//
|
|
2584
|
+
// swap
|
|
2585
|
+
//
|
|
2586
|
+
// {
|
|
2587
|
+
// "code":"0",
|
|
2588
|
+
// "msg":"Success",
|
|
2589
|
+
// "data":[
|
|
2590
|
+
// {
|
|
2591
|
+
// "tradeId":12,
|
|
2592
|
+
// "price":0.9,
|
|
2593
|
+
// "qty":1,
|
|
2594
|
+
// "amount":9,
|
|
2595
|
+
// "contractName":"E-SAND-USDT",
|
|
2596
|
+
// "side":"BUY",
|
|
2597
|
+
// "fee":"0.0018",
|
|
2598
|
+
// "bidId":1558124009467904992,
|
|
2599
|
+
// "askId":1558124043827644908,
|
|
2600
|
+
// "bidUserId":10294,
|
|
2601
|
+
// "askUserId":10467,
|
|
2602
|
+
// "isBuyer":true,
|
|
2603
|
+
// "isMaker":true,
|
|
2604
|
+
// "ctime":1678426306000
|
|
2605
|
+
// }
|
|
2606
|
+
// ]
|
|
2607
|
+
// }
|
|
2608
|
+
//
|
|
2609
|
+
return this.parseTrades(data, market, since, limit);
|
|
2610
|
+
}
|
|
2611
|
+
/**
|
|
2612
|
+
* @method
|
|
2613
|
+
* @name bitrue#fetchDeposits
|
|
2614
|
+
* @description fetch all deposits made to an account
|
|
2615
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
|
|
2616
|
+
* @param {string} code unified currency code
|
|
2617
|
+
* @param {int} [since] the earliest time in ms to fetch deposits for
|
|
2618
|
+
* @param {int} [limit] the maximum number of deposits structures to retrieve
|
|
2619
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2620
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2621
|
+
*/
|
|
2622
|
+
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2623
|
+
if (code === undefined) {
|
|
2624
|
+
throw new ArgumentsRequired(this.id + ' fetchDeposits() requires a code argument');
|
|
2625
|
+
}
|
|
2626
|
+
await this.loadMarkets();
|
|
2627
|
+
const currency = this.currency(code);
|
|
2628
|
+
const request = {
|
|
2629
|
+
'coin': currency['id'],
|
|
2630
|
+
'status': 1, // 0 init, 1 finished, default 0
|
|
2631
|
+
// 'offset': 0,
|
|
2632
|
+
// 'limit': limit, // default 10, max 1000
|
|
2633
|
+
// 'startTime': since,
|
|
2634
|
+
// 'endTime': this.milliseconds (),
|
|
2635
|
+
};
|
|
2636
|
+
if (since !== undefined) {
|
|
2637
|
+
request['startTime'] = since;
|
|
2638
|
+
// request['endTime'] = this.sum (since, 7776000000);
|
|
2639
|
+
}
|
|
2640
|
+
if (limit !== undefined) {
|
|
2641
|
+
request['limit'] = limit;
|
|
2642
|
+
}
|
|
2643
|
+
const response = await this.spotV1PrivateGetDepositHistory(this.extend(request, params));
|
|
2644
|
+
//
|
|
2645
|
+
// {
|
|
2646
|
+
// "code":200,
|
|
2647
|
+
// "msg":"succ",
|
|
2648
|
+
// "data":[
|
|
2649
|
+
// {
|
|
2650
|
+
// "id":2659137,
|
|
2651
|
+
// "symbol":"USDC",
|
|
2652
|
+
// "amount":"200.0000000000000000",
|
|
2653
|
+
// "fee":"0.0E-15",
|
|
2654
|
+
// "createdAt":1635503169000,
|
|
2655
|
+
// "updatedAt":1635503202000,
|
|
2656
|
+
// "addressFrom":"0x2faf487a4414fe77e2327f0bf4ae2a264a776ad2",
|
|
2657
|
+
// "addressTo":"0x190ceccb1f8bfbec1749180f0ba8922b488d865b",
|
|
2658
|
+
// "txid":"0x9970aec41099ac385568859517308707bc7d716df8dabae7b52f5b17351c3ed0",
|
|
2659
|
+
// "confirmations":5,
|
|
2660
|
+
// "status":0,
|
|
2661
|
+
// "tagType":null,
|
|
2662
|
+
// },
|
|
2663
|
+
// {
|
|
2664
|
+
// "id":2659137,
|
|
2665
|
+
// "symbol": "XRP",
|
|
2666
|
+
// "amount": "20.0000000000000000",
|
|
2667
|
+
// "fee": "0.0E-15",
|
|
2668
|
+
// "createdAt": 1544669393000,
|
|
2669
|
+
// "updatedAt": 1544669413000,
|
|
2670
|
+
// "addressFrom": "",
|
|
2671
|
+
// "addressTo": "raLPjTYeGezfdb6crXZzcC8RkLBEwbBHJ5_18113641",
|
|
2672
|
+
// "txid": "515B23E1F9864D3AF7F5B4C4FCBED784BAE861854FAB95F4031922B6AAEFC7AC",
|
|
2673
|
+
// "confirmations": 7,
|
|
2674
|
+
// "status": 1,
|
|
2675
|
+
// "tagType": "Tag"
|
|
2676
|
+
// }
|
|
2677
|
+
// ]
|
|
2678
|
+
// }
|
|
2679
|
+
//
|
|
2680
|
+
const data = this.safeList(response, 'data', []);
|
|
2681
|
+
return this.parseTransactions(data, currency, since, limit);
|
|
2682
|
+
}
|
|
2683
|
+
/**
|
|
2684
|
+
* @method
|
|
2685
|
+
* @name bitrue#fetchWithdrawals
|
|
2686
|
+
* @description fetch all withdrawals made from an account
|
|
2687
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
|
|
2688
|
+
* @param {string} code unified currency code
|
|
2689
|
+
* @param {int} [since] the earliest time in ms to fetch withdrawals for
|
|
2690
|
+
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
|
|
2691
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2692
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2693
|
+
*/
|
|
2694
|
+
async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
2695
|
+
if (code === undefined) {
|
|
2696
|
+
throw new ArgumentsRequired(this.id + ' fetchWithdrawals() requires a code argument');
|
|
2697
|
+
}
|
|
2698
|
+
await this.loadMarkets();
|
|
2699
|
+
const currency = this.currency(code);
|
|
2700
|
+
const request = {
|
|
2701
|
+
'coin': currency['id'],
|
|
2702
|
+
'status': 5, // 0 init, 5 finished, 6 canceled, default 0
|
|
2703
|
+
// 'offset': 0,
|
|
2704
|
+
// 'limit': limit, // default 10, max 1000
|
|
2705
|
+
// 'startTime': since,
|
|
2706
|
+
// 'endTime': this.milliseconds (),
|
|
2707
|
+
};
|
|
2708
|
+
if (since !== undefined) {
|
|
2709
|
+
request['startTime'] = since;
|
|
2710
|
+
// request['endTime'] = this.sum (since, 7776000000);
|
|
2711
|
+
}
|
|
2712
|
+
if (limit !== undefined) {
|
|
2713
|
+
request['limit'] = limit;
|
|
2714
|
+
}
|
|
2715
|
+
const response = await this.spotV1PrivateGetWithdrawHistory(this.extend(request, params));
|
|
2716
|
+
//
|
|
2717
|
+
// {
|
|
2718
|
+
// "code": 200,
|
|
2719
|
+
// "msg": "succ",
|
|
2720
|
+
// "data": [
|
|
2721
|
+
// {
|
|
2722
|
+
// "id": 183745,
|
|
2723
|
+
// "symbol": "usdt_erc20",
|
|
2724
|
+
// "amount": "8.4000000000000000",
|
|
2725
|
+
// "fee": "1.6000000000000000",
|
|
2726
|
+
// "payAmount": "0.0000000000000000",
|
|
2727
|
+
// "createdAt": 1595336441000,
|
|
2728
|
+
// "updatedAt": 1595336576000,
|
|
2729
|
+
// "addressFrom": "",
|
|
2730
|
+
// "addressTo": "0x2edfae3878d7b6db70ce4abed177ab2636f60c83",
|
|
2731
|
+
// "txid": "",
|
|
2732
|
+
// "confirmations": 0,
|
|
2733
|
+
// "status": 6,
|
|
2734
|
+
// "tagType": null
|
|
2735
|
+
// }
|
|
2736
|
+
// ]
|
|
2737
|
+
// }
|
|
2738
|
+
//
|
|
2739
|
+
const data = this.safeList(response, 'data', []);
|
|
2740
|
+
return this.parseTransactions(data, currency);
|
|
2741
|
+
}
|
|
2742
|
+
parseTransactionStatusByType(status, type = undefined) {
|
|
2743
|
+
const statusesByType = {
|
|
2744
|
+
'deposit': {
|
|
2745
|
+
'0': 'pending',
|
|
2746
|
+
'1': 'ok',
|
|
2747
|
+
},
|
|
2748
|
+
'withdrawal': {
|
|
2749
|
+
'0': 'pending',
|
|
2750
|
+
'5': 'ok',
|
|
2751
|
+
'6': 'canceled',
|
|
2752
|
+
},
|
|
2753
|
+
};
|
|
2754
|
+
const statuses = this.safeDict(statusesByType, type, {});
|
|
2755
|
+
return this.safeString(statuses, status, status);
|
|
2756
|
+
}
|
|
2757
|
+
parseTransaction(transaction, currency = undefined) {
|
|
2758
|
+
//
|
|
2759
|
+
// fetchDeposits
|
|
2760
|
+
//
|
|
2761
|
+
// {
|
|
2762
|
+
// "symbol": "XRP",
|
|
2763
|
+
// "amount": "261.3361000000000000",
|
|
2764
|
+
// "fee": "0.0E-15",
|
|
2765
|
+
// "createdAt": 1548816979000,
|
|
2766
|
+
// "updatedAt": 1548816999000,
|
|
2767
|
+
// "addressFrom": "",
|
|
2768
|
+
// "addressTo": "raLPjTYeGezfdb6crXZzcC8RkLBEwbBHJ5_18113641",
|
|
2769
|
+
// "txid": "86D6EB68A7A28938BCE06BD348F8C07DEF500C5F7FE92069EF8C0551CE0F2C7D",
|
|
2770
|
+
// "confirmations": 8,
|
|
2771
|
+
// "status": 1,
|
|
2772
|
+
// "tagType": "Tag"
|
|
2773
|
+
// },
|
|
2774
|
+
// {
|
|
2775
|
+
// "symbol": "XRP",
|
|
2776
|
+
// "amount": "20.0000000000000000",
|
|
2777
|
+
// "fee": "0.0E-15",
|
|
2778
|
+
// "createdAt": 1544669393000,
|
|
2779
|
+
// "updatedAt": 1544669413000,
|
|
2780
|
+
// "addressFrom": "",
|
|
2781
|
+
// "addressTo": "raLPjTYeGezfdb6crXZzcC8RkLBEwbBHJ5_18113641",
|
|
2782
|
+
// "txid": "515B23E1F9864D3AF7F5B4C4FCBED784BAE861854FAB95F4031922B6AAEFC7AC",
|
|
2783
|
+
// "confirmations": 7,
|
|
2784
|
+
// "status": 1,
|
|
2785
|
+
// "tagType": "Tag"
|
|
2786
|
+
// }
|
|
2787
|
+
//
|
|
2788
|
+
// fetchWithdrawals
|
|
2789
|
+
//
|
|
2790
|
+
// {
|
|
2791
|
+
// "id": 183745,
|
|
2792
|
+
// "symbol": "usdt_erc20",
|
|
2793
|
+
// "amount": "8.4000000000000000",
|
|
2794
|
+
// "fee": "1.6000000000000000",
|
|
2795
|
+
// "payAmount": "0.0000000000000000",
|
|
2796
|
+
// "createdAt": 1595336441000,
|
|
2797
|
+
// "updatedAt": 1595336576000,
|
|
2798
|
+
// "addressFrom": "",
|
|
2799
|
+
// "addressTo": "0x2edfae3878d7b6db70ce4abed177ab2636f60c83",
|
|
2800
|
+
// "txid": "",
|
|
2801
|
+
// "confirmations": 0,
|
|
2802
|
+
// "status": 6,
|
|
2803
|
+
// "tagType": null
|
|
2804
|
+
// }
|
|
2805
|
+
//
|
|
2806
|
+
// withdraw
|
|
2807
|
+
//
|
|
2808
|
+
// {
|
|
2809
|
+
// "msg": null,
|
|
2810
|
+
// "amount": 1000,
|
|
2811
|
+
// "fee": 1,
|
|
2812
|
+
// "ctime": null,
|
|
2813
|
+
// "coin": "usdt_erc20",
|
|
2814
|
+
// "withdrawId": 1156423,
|
|
2815
|
+
// "addressTo": "0x2edfae3878d7b6db70ce4abed177ab2636f60c83"
|
|
2816
|
+
// }
|
|
2817
|
+
//
|
|
2818
|
+
const id = this.safeString2(transaction, 'id', 'withdrawId');
|
|
2819
|
+
const tagType = this.safeString(transaction, 'tagType');
|
|
2820
|
+
let addressTo = this.safeString(transaction, 'addressTo');
|
|
2821
|
+
let addressFrom = this.safeString(transaction, 'addressFrom');
|
|
2822
|
+
let tagTo = undefined;
|
|
2823
|
+
let tagFrom = undefined;
|
|
2824
|
+
if (tagType !== undefined) {
|
|
2825
|
+
if (addressTo !== undefined) {
|
|
2826
|
+
const parts = addressTo.split('_');
|
|
2827
|
+
addressTo = this.safeString(parts, 0);
|
|
2828
|
+
tagTo = this.safeString(parts, 1);
|
|
2829
|
+
}
|
|
2830
|
+
if (addressFrom !== undefined) {
|
|
2831
|
+
const parts = addressFrom.split('_');
|
|
2832
|
+
addressFrom = this.safeString(parts, 0);
|
|
2833
|
+
tagFrom = this.safeString(parts, 1);
|
|
2834
|
+
}
|
|
2835
|
+
}
|
|
2836
|
+
const txid = this.safeString(transaction, 'txid');
|
|
2837
|
+
const timestamp = this.safeInteger(transaction, 'createdAt');
|
|
2838
|
+
const updated = this.safeInteger(transaction, 'updatedAt');
|
|
2839
|
+
const payAmount = ('payAmount' in transaction);
|
|
2840
|
+
const ctime = ('ctime' in transaction);
|
|
2841
|
+
const type = (payAmount || ctime) ? 'withdrawal' : 'deposit';
|
|
2842
|
+
const status = this.parseTransactionStatusByType(this.safeString(transaction, 'status'), type);
|
|
2843
|
+
const amount = this.safeNumber(transaction, 'amount');
|
|
2844
|
+
let network = undefined;
|
|
2845
|
+
let currencyId = this.safeString2(transaction, 'symbol', 'coin');
|
|
2846
|
+
if (currencyId !== undefined) {
|
|
2847
|
+
const parts = currencyId.split('_');
|
|
2848
|
+
currencyId = this.safeString(parts, 0);
|
|
2849
|
+
const networkId = this.safeString(parts, 1);
|
|
2850
|
+
if (networkId !== undefined) {
|
|
2851
|
+
network = networkId.toUpperCase();
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
2855
|
+
const feeCost = this.safeNumber(transaction, 'fee');
|
|
2856
|
+
let fee = undefined;
|
|
2857
|
+
if (feeCost !== undefined) {
|
|
2858
|
+
fee = { 'currency': code, 'cost': feeCost };
|
|
2859
|
+
}
|
|
2860
|
+
return {
|
|
2861
|
+
'info': transaction,
|
|
2862
|
+
'id': id,
|
|
2863
|
+
'txid': txid,
|
|
2864
|
+
'timestamp': timestamp,
|
|
2865
|
+
'datetime': this.iso8601(timestamp),
|
|
2866
|
+
'network': network,
|
|
2867
|
+
'address': addressTo,
|
|
2868
|
+
'addressTo': addressTo,
|
|
2869
|
+
'addressFrom': addressFrom,
|
|
2870
|
+
'tag': tagTo,
|
|
2871
|
+
'tagTo': tagTo,
|
|
2872
|
+
'tagFrom': tagFrom,
|
|
2873
|
+
'type': type,
|
|
2874
|
+
'amount': amount,
|
|
2875
|
+
'currency': code,
|
|
2876
|
+
'status': status,
|
|
2877
|
+
'updated': updated,
|
|
2878
|
+
'internal': false,
|
|
2879
|
+
'comment': undefined,
|
|
2880
|
+
'fee': fee,
|
|
2881
|
+
};
|
|
2882
|
+
}
|
|
2883
|
+
/**
|
|
2884
|
+
* @method
|
|
2885
|
+
* @name bitrue#withdraw
|
|
2886
|
+
* @description make a withdrawal
|
|
2887
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
|
|
2888
|
+
* @param {string} code unified currency code
|
|
2889
|
+
* @param {float} amount the amount to withdraw
|
|
2890
|
+
* @param {string} address the address to withdraw to
|
|
2891
|
+
* @param {string} tag
|
|
2892
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2893
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
2894
|
+
*/
|
|
2895
|
+
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
2896
|
+
[tag, params] = this.handleWithdrawTagAndParams(tag, params);
|
|
2897
|
+
this.checkAddress(address);
|
|
2898
|
+
await this.loadMarkets();
|
|
2899
|
+
const currency = this.currency(code);
|
|
2900
|
+
const request = {
|
|
2901
|
+
'coin': currency['id'],
|
|
2902
|
+
'amount': amount,
|
|
2903
|
+
'addressTo': address,
|
|
2904
|
+
// 'chainName': chainName, // 'ERC20', 'TRC20', 'SOL'
|
|
2905
|
+
// 'addressMark': '', // mark of address
|
|
2906
|
+
// 'addrType': '', // type of address
|
|
2907
|
+
// 'tag': tag,
|
|
2908
|
+
};
|
|
2909
|
+
let networkCode = undefined;
|
|
2910
|
+
[networkCode, params] = this.handleNetworkCodeAndParams(params);
|
|
2911
|
+
if (networkCode !== undefined) {
|
|
2912
|
+
request['chainName'] = this.networkCodeToId(networkCode);
|
|
2913
|
+
}
|
|
2914
|
+
if (tag !== undefined) {
|
|
2915
|
+
request['tag'] = tag;
|
|
2916
|
+
}
|
|
2917
|
+
const response = await this.spotV1PrivatePostWithdrawCommit(this.extend(request, params));
|
|
2918
|
+
//
|
|
2919
|
+
// {
|
|
2920
|
+
// "code": 200,
|
|
2921
|
+
// "msg": "succ",
|
|
2922
|
+
// "data": {
|
|
2923
|
+
// "msg": null,
|
|
2924
|
+
// "amount": 1000,
|
|
2925
|
+
// "fee": 1,
|
|
2926
|
+
// "ctime": null,
|
|
2927
|
+
// "coin": "usdt_erc20",
|
|
2928
|
+
// "withdrawId": 1156423,
|
|
2929
|
+
// "addressTo": "0x2edfae3878d7b6db70ce4abed177ab2636f60c83"
|
|
2930
|
+
// }
|
|
2931
|
+
// }
|
|
2932
|
+
//
|
|
2933
|
+
const data = this.safeDict(response, 'data', {});
|
|
2934
|
+
return this.parseTransaction(data, currency);
|
|
2935
|
+
}
|
|
2936
|
+
parseDepositWithdrawFee(fee, currency = undefined) {
|
|
2937
|
+
//
|
|
2938
|
+
// {
|
|
2939
|
+
// "coin": "adx",
|
|
2940
|
+
// "coinFulName": "Ambire AdEx",
|
|
2941
|
+
// "chains": [ "BSC" ],
|
|
2942
|
+
// "chainDetail": [ [Object] ]
|
|
2943
|
+
// }
|
|
2944
|
+
//
|
|
2945
|
+
const chainDetails = this.safeList(fee, 'chainDetail', []);
|
|
2946
|
+
const chainDetailLength = chainDetails.length;
|
|
2947
|
+
const result = {
|
|
2948
|
+
'info': fee,
|
|
2949
|
+
'withdraw': {
|
|
2950
|
+
'fee': undefined,
|
|
2951
|
+
'percentage': undefined,
|
|
2952
|
+
},
|
|
2953
|
+
'deposit': {
|
|
2954
|
+
'fee': undefined,
|
|
2955
|
+
'percentage': undefined,
|
|
2956
|
+
},
|
|
2957
|
+
'networks': {},
|
|
2958
|
+
};
|
|
2959
|
+
if (chainDetailLength !== 0) {
|
|
2960
|
+
for (let i = 0; i < chainDetailLength; i++) {
|
|
2961
|
+
const chainDetail = chainDetails[i];
|
|
2962
|
+
const networkId = this.safeString(chainDetail, 'chain');
|
|
2963
|
+
const currencyCode = this.safeString(currency, 'code');
|
|
2964
|
+
const networkCode = this.networkIdToCode(networkId, currencyCode);
|
|
2965
|
+
result['networks'][networkCode] = {
|
|
2966
|
+
'deposit': { 'fee': undefined, 'percentage': undefined },
|
|
2967
|
+
'withdraw': { 'fee': this.safeNumber(chainDetail, 'withdrawFee'), 'percentage': false },
|
|
2968
|
+
};
|
|
2969
|
+
if (chainDetailLength === 1) {
|
|
2970
|
+
result['withdraw']['fee'] = this.safeNumber(chainDetail, 'withdrawFee');
|
|
2971
|
+
result['withdraw']['percentage'] = false;
|
|
2972
|
+
}
|
|
2973
|
+
}
|
|
2974
|
+
}
|
|
2975
|
+
return result;
|
|
2976
|
+
}
|
|
2977
|
+
/**
|
|
2978
|
+
* @method
|
|
2979
|
+
* @name bitrue#fetchDepositWithdrawFees
|
|
2980
|
+
* @description fetch deposit and withdraw fees
|
|
2981
|
+
* @see https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
|
2982
|
+
* @param {string[]|undefined} codes list of unified currency codes
|
|
2983
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2984
|
+
* @returns {object} a list of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure}
|
|
2985
|
+
*/
|
|
2986
|
+
async fetchDepositWithdrawFees(codes = undefined, params = {}) {
|
|
2987
|
+
await this.loadMarkets();
|
|
2988
|
+
const response = await this.spotV1PublicGetExchangeInfo(params);
|
|
2989
|
+
const coins = this.safeList(response, 'coins');
|
|
2990
|
+
return this.parseDepositWithdrawFees(coins, codes, 'coin');
|
|
2991
|
+
}
|
|
2992
|
+
parseTransfer(transfer, currency = undefined) {
|
|
2993
|
+
//
|
|
2994
|
+
// fetchTransfers
|
|
2995
|
+
//
|
|
2996
|
+
// {
|
|
2997
|
+
// 'transferType': 'wallet_to_contract',
|
|
2998
|
+
// 'symbol': 'USDT',
|
|
2999
|
+
// 'amount': 1.0,
|
|
3000
|
+
// 'status': 1,
|
|
3001
|
+
// 'ctime': 1685404575000
|
|
3002
|
+
// }
|
|
3003
|
+
//
|
|
3004
|
+
// transfer
|
|
3005
|
+
//
|
|
3006
|
+
// {}
|
|
3007
|
+
//
|
|
3008
|
+
const transferType = this.safeString(transfer, 'transferType');
|
|
3009
|
+
let fromAccount = undefined;
|
|
3010
|
+
let toAccount = undefined;
|
|
3011
|
+
if (transferType !== undefined) {
|
|
3012
|
+
const accountSplit = transferType.split('_to_');
|
|
3013
|
+
fromAccount = this.safeString(accountSplit, 0);
|
|
3014
|
+
toAccount = this.safeString(accountSplit, 1);
|
|
3015
|
+
}
|
|
3016
|
+
const timestamp = this.safeInteger(transfer, 'ctime');
|
|
3017
|
+
return {
|
|
3018
|
+
'info': transfer,
|
|
3019
|
+
'id': undefined,
|
|
3020
|
+
'timestamp': timestamp,
|
|
3021
|
+
'datetime': this.iso8601(timestamp),
|
|
3022
|
+
'currency': this.safeString(currency, 'code'),
|
|
3023
|
+
'amount': this.safeNumber(transfer, 'amount'),
|
|
3024
|
+
'fromAccount': fromAccount,
|
|
3025
|
+
'toAccount': toAccount,
|
|
3026
|
+
'status': 'ok',
|
|
3027
|
+
};
|
|
3028
|
+
}
|
|
3029
|
+
/**
|
|
3030
|
+
* @method
|
|
3031
|
+
* @name bitrue#fetchTransfers
|
|
3032
|
+
* @description fetch a history of internal transfers made on an account
|
|
3033
|
+
* @see https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
|
|
3034
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
|
|
3035
|
+
* @param {string} code unified currency code of the currency transferred
|
|
3036
|
+
* @param {int} [since] the earliest time in ms to fetch transfers for
|
|
3037
|
+
* @param {int} [limit] the maximum number of transfers structures to retrieve
|
|
3038
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
3039
|
+
* @param {int} [params.until] the latest time in ms to fetch transfers for
|
|
3040
|
+
* @param {string} [params.type] transfer type wallet_to_contract or contract_to_wallet
|
|
3041
|
+
* @returns {object[]} a list of [transfer structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#transfer-structure}
|
|
3042
|
+
*/
|
|
3043
|
+
async fetchTransfers(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
3044
|
+
await this.loadMarkets();
|
|
3045
|
+
const type = this.safeString2(params, 'type', 'transferType');
|
|
3046
|
+
const request = {
|
|
3047
|
+
'transferType': type,
|
|
3048
|
+
};
|
|
3049
|
+
let currency = undefined;
|
|
3050
|
+
if (code !== undefined) {
|
|
3051
|
+
currency = this.currency(code);
|
|
3052
|
+
request['coinSymbol'] = currency['id'];
|
|
3053
|
+
}
|
|
3054
|
+
if (since !== undefined) {
|
|
3055
|
+
request['beginTime'] = since;
|
|
3056
|
+
}
|
|
3057
|
+
if (limit !== undefined) {
|
|
3058
|
+
if (limit > 200) {
|
|
3059
|
+
limit = 200;
|
|
3060
|
+
}
|
|
3061
|
+
request['limit'] = limit;
|
|
3062
|
+
}
|
|
3063
|
+
const until = this.safeInteger(params, 'until');
|
|
3064
|
+
if (until !== undefined) {
|
|
3065
|
+
params = this.omit(params, 'until');
|
|
3066
|
+
request['endTime'] = until;
|
|
3067
|
+
}
|
|
3068
|
+
const response = await this.fapiV2PrivateGetFuturesTransferHistory(this.extend(request, params));
|
|
3069
|
+
//
|
|
3070
|
+
// {
|
|
3071
|
+
// 'code': '0',
|
|
3072
|
+
// 'msg': 'Success',
|
|
3073
|
+
// 'data': [{
|
|
3074
|
+
// 'transferType': 'wallet_to_contract',
|
|
3075
|
+
// 'symbol': 'USDT',
|
|
3076
|
+
// 'amount': 1.0,
|
|
3077
|
+
// 'status': 1,
|
|
3078
|
+
// 'ctime': 1685404575000
|
|
3079
|
+
// }]
|
|
3080
|
+
// }
|
|
3081
|
+
//
|
|
3082
|
+
const data = this.safeList(response, 'data', []);
|
|
3083
|
+
return this.parseTransfers(data, currency, since, limit);
|
|
3084
|
+
}
|
|
3085
|
+
/**
|
|
3086
|
+
* @method
|
|
3087
|
+
* @name bitrue#transfer
|
|
3088
|
+
* @description transfer currency internally between wallets on the same account
|
|
3089
|
+
* @see https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
|
|
3090
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
|
|
3091
|
+
* @param {string} code unified currency code
|
|
3092
|
+
* @param {float} amount amount to transfer
|
|
3093
|
+
* @param {string} fromAccount account to transfer from
|
|
3094
|
+
* @param {string} toAccount account to transfer to
|
|
3095
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
3096
|
+
* @returns {object} a [transfer structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#transfer-structure}
|
|
3097
|
+
*/
|
|
3098
|
+
async transfer(code, amount, fromAccount, toAccount, params = {}) {
|
|
3099
|
+
await this.loadMarkets();
|
|
3100
|
+
const currency = this.currency(code);
|
|
3101
|
+
const accountTypes = this.safeDict(this.options, 'accountsByType', {});
|
|
3102
|
+
const fromId = this.safeString(accountTypes, fromAccount, fromAccount);
|
|
3103
|
+
const toId = this.safeString(accountTypes, toAccount, toAccount);
|
|
3104
|
+
const request = {
|
|
3105
|
+
'coinSymbol': currency['id'],
|
|
3106
|
+
'amount': this.currencyToPrecision(code, amount),
|
|
3107
|
+
'transferType': fromId + '_to_' + toId,
|
|
3108
|
+
};
|
|
3109
|
+
const response = await this.fapiV2PrivatePostFuturesTransfer(this.extend(request, params));
|
|
3110
|
+
//
|
|
3111
|
+
// {
|
|
3112
|
+
// 'code': '0',
|
|
3113
|
+
// 'msg': 'Success',
|
|
3114
|
+
// 'data': null
|
|
3115
|
+
// }
|
|
3116
|
+
//
|
|
3117
|
+
const data = this.safeDict(response, 'data', {});
|
|
3118
|
+
return this.parseTransfer(data, currency);
|
|
3119
|
+
}
|
|
3120
|
+
/**
|
|
3121
|
+
* @method
|
|
3122
|
+
* @name bitrue#setLeverage
|
|
3123
|
+
* @description set the level of leverage for a market
|
|
3124
|
+
* @see https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
|
|
3125
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
|
|
3126
|
+
* @param {float} leverage the rate of leverage
|
|
3127
|
+
* @param {string} symbol unified market symbol
|
|
3128
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
3129
|
+
* @returns {object} response from the exchange
|
|
3130
|
+
*/
|
|
3131
|
+
async setLeverage(leverage, symbol = undefined, params = {}) {
|
|
3132
|
+
if (symbol === undefined) {
|
|
3133
|
+
throw new ArgumentsRequired(this.id + ' setLeverage() requires a symbol argument');
|
|
3134
|
+
}
|
|
3135
|
+
if ((leverage < 1) || (leverage > 125)) {
|
|
3136
|
+
throw new BadRequest(this.id + ' leverage should be between 1 and 125');
|
|
3137
|
+
}
|
|
3138
|
+
await this.loadMarkets();
|
|
3139
|
+
const market = this.market(symbol);
|
|
3140
|
+
let response = undefined;
|
|
3141
|
+
const request = {
|
|
3142
|
+
'contractName': market['id'],
|
|
3143
|
+
'leverage': leverage,
|
|
3144
|
+
};
|
|
3145
|
+
if (!market['swap']) {
|
|
3146
|
+
throw new NotSupported(this.id + ' setLeverage only support swap markets');
|
|
3147
|
+
}
|
|
3148
|
+
if (market['linear']) {
|
|
3149
|
+
response = await this.fapiV2PrivatePostLevelEdit(this.extend(request, params));
|
|
3150
|
+
}
|
|
3151
|
+
else if (market['inverse']) {
|
|
3152
|
+
response = await this.dapiV2PrivatePostLevelEdit(this.extend(request, params));
|
|
3153
|
+
}
|
|
3154
|
+
return response;
|
|
3155
|
+
}
|
|
3156
|
+
parseMarginModification(data, market = undefined) {
|
|
3157
|
+
//
|
|
3158
|
+
// setMargin
|
|
3159
|
+
//
|
|
3160
|
+
// {
|
|
3161
|
+
// "code": 0,
|
|
3162
|
+
// "msg": "success"
|
|
3163
|
+
// "data": null
|
|
3164
|
+
// }
|
|
3165
|
+
//
|
|
3166
|
+
return {
|
|
3167
|
+
'info': data,
|
|
3168
|
+
'symbol': market['symbol'],
|
|
3169
|
+
'type': undefined,
|
|
3170
|
+
'marginMode': 'isolated',
|
|
3171
|
+
'amount': undefined,
|
|
3172
|
+
'total': undefined,
|
|
3173
|
+
'code': undefined,
|
|
3174
|
+
'status': undefined,
|
|
3175
|
+
'timestamp': undefined,
|
|
3176
|
+
'datetime': undefined,
|
|
3177
|
+
};
|
|
3178
|
+
}
|
|
3179
|
+
/**
|
|
3180
|
+
* @method
|
|
3181
|
+
* @name bitrue#setMargin
|
|
3182
|
+
* @description Either adds or reduces margin in an isolated position in order to set the margin to a specific value
|
|
3183
|
+
* @see https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
|
|
3184
|
+
* @see https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
|
|
3185
|
+
* @param {string} symbol unified market symbol of the market to set margin in
|
|
3186
|
+
* @param {float} amount the amount to set the margin to
|
|
3187
|
+
* @param {object} [params] parameters specific to the exchange API endpoint
|
|
3188
|
+
* @returns {object} A [margin structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#add-margin-structure}
|
|
3189
|
+
*/
|
|
3190
|
+
async setMargin(symbol, amount, params = {}) {
|
|
3191
|
+
await this.loadMarkets();
|
|
3192
|
+
const market = this.market(symbol);
|
|
3193
|
+
if (!market['swap']) {
|
|
3194
|
+
throw new NotSupported(this.id + ' setMargin only support swap markets');
|
|
3195
|
+
}
|
|
3196
|
+
let response = undefined;
|
|
3197
|
+
const request = {
|
|
3198
|
+
'contractName': market['id'],
|
|
3199
|
+
'amount': this.parseToNumeric(amount),
|
|
3200
|
+
};
|
|
3201
|
+
if (market['linear']) {
|
|
3202
|
+
response = await this.fapiV2PrivatePostPositionMargin(this.extend(request, params));
|
|
3203
|
+
}
|
|
3204
|
+
else if (market['inverse']) {
|
|
3205
|
+
response = await this.dapiV2PrivatePostPositionMargin(this.extend(request, params));
|
|
3206
|
+
}
|
|
3207
|
+
//
|
|
3208
|
+
// {
|
|
3209
|
+
// "code": 0,
|
|
3210
|
+
// "msg": "success"
|
|
3211
|
+
// "data": null
|
|
3212
|
+
// }
|
|
3213
|
+
//
|
|
3214
|
+
return this.parseMarginModification(response, market);
|
|
3215
|
+
}
|
|
3216
|
+
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
3217
|
+
const type = this.safeString(api, 0);
|
|
3218
|
+
const version = this.safeString(api, 1);
|
|
3219
|
+
const access = this.safeString(api, 2);
|
|
3220
|
+
let url = undefined;
|
|
3221
|
+
if ((type === 'api' && version === 'kline') || (type === 'open' && path.indexOf('listenKey') >= 0)) {
|
|
3222
|
+
url = this.urls['api'][type];
|
|
3223
|
+
}
|
|
3224
|
+
else {
|
|
3225
|
+
url = this.urls['api'][type] + '/' + version;
|
|
3226
|
+
}
|
|
3227
|
+
url = url + '/' + this.implodeParams(path, params);
|
|
3228
|
+
params = this.omit(params, this.extractParams(path));
|
|
3229
|
+
if (access === 'private') {
|
|
3230
|
+
this.checkRequiredCredentials();
|
|
3231
|
+
const recvWindow = this.safeInteger(this.options, 'recvWindow', 5000);
|
|
3232
|
+
if (type === 'spot' || type === 'open') {
|
|
3233
|
+
let query = this.urlencode(this.extend({
|
|
3234
|
+
'timestamp': this.nonce(),
|
|
3235
|
+
'recvWindow': recvWindow,
|
|
3236
|
+
}, params));
|
|
3237
|
+
const signature = this.hmac(this.encode(query), this.encode(this.secret), sha256);
|
|
3238
|
+
query += '&' + 'signature=' + signature;
|
|
3239
|
+
headers = {
|
|
3240
|
+
'X-MBX-APIKEY': this.apiKey,
|
|
3241
|
+
};
|
|
3242
|
+
if ((method === 'GET') || (method === 'DELETE')) {
|
|
3243
|
+
url += '?' + query;
|
|
3244
|
+
}
|
|
3245
|
+
else {
|
|
3246
|
+
body = query;
|
|
3247
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
3248
|
+
}
|
|
3249
|
+
}
|
|
3250
|
+
else {
|
|
3251
|
+
const timestamp = this.nonce().toString();
|
|
3252
|
+
let signPath = undefined;
|
|
3253
|
+
if (type === 'fapi') {
|
|
3254
|
+
signPath = '/fapi';
|
|
3255
|
+
}
|
|
3256
|
+
else if (type === 'dapi') {
|
|
3257
|
+
signPath = '/dapi';
|
|
3258
|
+
}
|
|
3259
|
+
signPath = signPath + '/' + version + '/' + path;
|
|
3260
|
+
let signMessage = timestamp + method + signPath;
|
|
3261
|
+
if (method === 'GET') {
|
|
3262
|
+
const keys = Object.keys(params);
|
|
3263
|
+
const keysLength = keys.length;
|
|
3264
|
+
if (keysLength > 0) {
|
|
3265
|
+
signMessage += '?' + this.urlencode(params);
|
|
3266
|
+
}
|
|
3267
|
+
const signature = this.hmac(this.encode(signMessage), this.encode(this.secret), sha256);
|
|
3268
|
+
headers = {
|
|
3269
|
+
'X-CH-APIKEY': this.apiKey,
|
|
3270
|
+
'X-CH-SIGN': signature,
|
|
3271
|
+
'X-CH-TS': timestamp,
|
|
3272
|
+
};
|
|
3273
|
+
url += '?' + this.urlencode(params);
|
|
3274
|
+
}
|
|
3275
|
+
else {
|
|
3276
|
+
const query = this.extend({
|
|
3277
|
+
'recvWindow': recvWindow,
|
|
3278
|
+
}, params);
|
|
3279
|
+
body = this.json(query);
|
|
3280
|
+
signMessage += body;
|
|
3281
|
+
const signature = this.hmac(this.encode(signMessage), this.encode(this.secret), sha256);
|
|
3282
|
+
headers = {
|
|
3283
|
+
'Content-Type': 'application/json',
|
|
3284
|
+
'X-CH-APIKEY': this.apiKey,
|
|
3285
|
+
'X-CH-SIGN': signature,
|
|
3286
|
+
'X-CH-TS': timestamp,
|
|
3287
|
+
};
|
|
3288
|
+
}
|
|
3289
|
+
}
|
|
3290
|
+
}
|
|
3291
|
+
else {
|
|
3292
|
+
if (Object.keys(params).length) {
|
|
3293
|
+
url += '?' + this.urlencode(params);
|
|
3294
|
+
}
|
|
3295
|
+
}
|
|
3296
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
3297
|
+
}
|
|
3298
|
+
handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
3299
|
+
if ((code === 418) || (code === 429)) {
|
|
3300
|
+
throw new DDoSProtection(this.id + ' ' + code.toString() + ' ' + reason + ' ' + body);
|
|
3301
|
+
}
|
|
3302
|
+
// error response in a form: { "code": -1013, "msg": "Invalid quantity." }
|
|
3303
|
+
// following block cointains legacy checks against message patterns in "msg" property
|
|
3304
|
+
// will switch "code" checks eventually, when we know all of them
|
|
3305
|
+
if (code >= 400) {
|
|
3306
|
+
if (body.indexOf('Price * QTY is zero or less') >= 0) {
|
|
3307
|
+
throw new InvalidOrder(this.id + ' order cost = amount * price is zero or less ' + body);
|
|
3308
|
+
}
|
|
3309
|
+
if (body.indexOf('LOT_SIZE') >= 0) {
|
|
3310
|
+
throw new InvalidOrder(this.id + ' order amount should be evenly divisible by lot size ' + body);
|
|
3311
|
+
}
|
|
3312
|
+
if (body.indexOf('PRICE_FILTER') >= 0) {
|
|
3313
|
+
throw new InvalidOrder(this.id + ' order price is invalid, i.e. exceeds allowed price precision, exceeds min price or max price limits or is invalid float value in general, use this.priceToPrecision (symbol, amount) ' + body);
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
if (response === undefined) {
|
|
3317
|
+
return undefined; // fallback to default error handler
|
|
3318
|
+
}
|
|
3319
|
+
// check success value for wapi endpoints
|
|
3320
|
+
// response in format {'msg': 'The coin does not exist.', 'success': true/false}
|
|
3321
|
+
const success = this.safeBool(response, 'success', true);
|
|
3322
|
+
if (!success) {
|
|
3323
|
+
const messageInner = this.safeString(response, 'msg');
|
|
3324
|
+
let parsedMessage = undefined;
|
|
3325
|
+
if (messageInner !== undefined) {
|
|
3326
|
+
try {
|
|
3327
|
+
parsedMessage = JSON.parse(messageInner);
|
|
3328
|
+
}
|
|
3329
|
+
catch (e) {
|
|
3330
|
+
// do nothing
|
|
3331
|
+
parsedMessage = undefined;
|
|
3332
|
+
}
|
|
3333
|
+
if (parsedMessage !== undefined) {
|
|
3334
|
+
response = parsedMessage;
|
|
3335
|
+
}
|
|
3336
|
+
}
|
|
3337
|
+
}
|
|
3338
|
+
const message = this.safeString(response, 'msg');
|
|
3339
|
+
if (message !== undefined) {
|
|
3340
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], message, this.id + ' ' + message);
|
|
3341
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], message, this.id + ' ' + message);
|
|
3342
|
+
}
|
|
3343
|
+
// checks against error codes
|
|
3344
|
+
const error = this.safeString(response, 'code');
|
|
3345
|
+
if (error !== undefined) {
|
|
3346
|
+
// https://github.com/ccxt/ccxt/issues/6501
|
|
3347
|
+
// https://github.com/ccxt/ccxt/issues/7742
|
|
3348
|
+
if ((error === '200') || Precise.stringEquals(error, '0')) {
|
|
3349
|
+
return undefined;
|
|
3350
|
+
}
|
|
3351
|
+
// a workaround for {"code":-2015,"msg":"Invalid API-key, IP, or permissions for action."}
|
|
3352
|
+
// despite that their message is very confusing, it is raised by Binance
|
|
3353
|
+
// on a temporary ban, the API key is valid, but disabled for a while
|
|
3354
|
+
if ((error === '-2015') && this.options['hasAlreadyAuthenticatedSuccessfully']) {
|
|
3355
|
+
throw new DDoSProtection(this.id + ' temporary banned: ' + body);
|
|
3356
|
+
}
|
|
3357
|
+
const feedback = this.id + ' ' + body;
|
|
3358
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], error, feedback);
|
|
3359
|
+
throw new ExchangeError(feedback);
|
|
3360
|
+
}
|
|
3361
|
+
if (!success) {
|
|
3362
|
+
throw new ExchangeError(this.id + ' ' + body);
|
|
3363
|
+
}
|
|
3364
|
+
return undefined;
|
|
3365
|
+
}
|
|
3366
|
+
calculateRateLimiterCost(api, method, path, params, config = {}) {
|
|
3367
|
+
if (('noSymbol' in config) && !('symbol' in params)) {
|
|
3368
|
+
return config['noSymbol'];
|
|
3369
|
+
}
|
|
3370
|
+
else if (('byLimit' in config) && ('limit' in params)) {
|
|
3371
|
+
const limit = params['limit'];
|
|
3372
|
+
const byLimit = config['byLimit'];
|
|
3373
|
+
for (let i = 0; i < byLimit.length; i++) {
|
|
3374
|
+
const entry = byLimit[i];
|
|
3375
|
+
if (limit <= entry[0]) {
|
|
3376
|
+
return entry[1];
|
|
3377
|
+
}
|
|
3378
|
+
}
|
|
3379
|
+
}
|
|
3380
|
+
return this.safeValue(config, 'cost', 1);
|
|
3381
|
+
}
|
|
3382
|
+
}
|