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,2119 @@
|
|
|
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 gateRest from '../gate.js';
|
|
9
|
+
import { AuthenticationError, BadRequest, ArgumentsRequired, ChecksumError, ExchangeError, NotSupported } from '../base/errors.js';
|
|
10
|
+
import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
|
|
11
|
+
import { sha512 } from '../static_dependencies/noble-hashes/sha512.js';
|
|
12
|
+
import Precise from '../base/Precise.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export default class gate extends gateRest {
|
|
15
|
+
describe() {
|
|
16
|
+
return this.deepExtend(super.describe(), {
|
|
17
|
+
'has': {
|
|
18
|
+
'ws': true,
|
|
19
|
+
'cancelAllOrdersWs': true,
|
|
20
|
+
'cancelOrderWs': true,
|
|
21
|
+
'createMarketBuyOrderWithCostWs': true,
|
|
22
|
+
'createMarketOrderWs': true,
|
|
23
|
+
'createMarketOrderWithCostWs': false,
|
|
24
|
+
'createMarketSellOrderWithCostWs': false,
|
|
25
|
+
'createOrderWs': true,
|
|
26
|
+
'createOrdersWs': true,
|
|
27
|
+
'createPostOnlyOrderWs': true,
|
|
28
|
+
'createReduceOnlyOrderWs': true,
|
|
29
|
+
'createStopLimitOrderWs': true,
|
|
30
|
+
'createStopLossOrderWs': true,
|
|
31
|
+
'createStopMarketOrderWs': false,
|
|
32
|
+
'createStopOrderWs': true,
|
|
33
|
+
'createTakeProfitOrderWs': true,
|
|
34
|
+
'createTriggerOrderWs': true,
|
|
35
|
+
'editOrderWs': true,
|
|
36
|
+
'fetchOrderWs': true,
|
|
37
|
+
'fetchOrdersWs': false,
|
|
38
|
+
'fetchOpenOrdersWs': true,
|
|
39
|
+
'fetchClosedOrdersWs': true,
|
|
40
|
+
'watchOrderBook': true,
|
|
41
|
+
'watchBidsAsks': true,
|
|
42
|
+
'watchTicker': true,
|
|
43
|
+
'watchTickers': true,
|
|
44
|
+
'watchTrades': true,
|
|
45
|
+
'watchTradesForSymbols': true,
|
|
46
|
+
'watchMyTrades': true,
|
|
47
|
+
'watchOHLCV': true,
|
|
48
|
+
'watchBalance': true,
|
|
49
|
+
'watchOrders': true,
|
|
50
|
+
'watchLiquidations': false,
|
|
51
|
+
'watchLiquidationsForSymbols': false,
|
|
52
|
+
'watchMyLiquidations': true,
|
|
53
|
+
'watchMyLiquidationsForSymbols': true,
|
|
54
|
+
'watchPositions': true,
|
|
55
|
+
},
|
|
56
|
+
'urls': {
|
|
57
|
+
'api': {
|
|
58
|
+
'ws': 'wss://ws.gate.io/v4',
|
|
59
|
+
'spot': 'wss://api.gateio.ws/ws/v4/',
|
|
60
|
+
'swap': {
|
|
61
|
+
'usdt': 'wss://fx-ws.gateio.ws/v4/ws/usdt',
|
|
62
|
+
'btc': 'wss://fx-ws.gateio.ws/v4/ws/btc',
|
|
63
|
+
},
|
|
64
|
+
'future': {
|
|
65
|
+
'usdt': 'wss://fx-ws.gateio.ws/v4/ws/delivery/usdt',
|
|
66
|
+
'btc': 'wss://fx-ws.gateio.ws/v4/ws/delivery/btc',
|
|
67
|
+
},
|
|
68
|
+
'option': {
|
|
69
|
+
'usdt': 'wss://op-ws.gateio.live/v4/ws/usdt',
|
|
70
|
+
'btc': 'wss://op-ws.gateio.live/v4/ws/btc',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
'test': {
|
|
74
|
+
'swap': {
|
|
75
|
+
'usdt': 'wss://fx-ws-testnet.gateio.ws/v4/ws/usdt',
|
|
76
|
+
'btc': 'wss://fx-ws-testnet.gateio.ws/v4/ws/btc',
|
|
77
|
+
},
|
|
78
|
+
'future': {
|
|
79
|
+
'usdt': 'wss://fx-ws-testnet.gateio.ws/v4/ws/usdt',
|
|
80
|
+
'btc': 'wss://fx-ws-testnet.gateio.ws/v4/ws/btc',
|
|
81
|
+
},
|
|
82
|
+
'option': {
|
|
83
|
+
'usdt': 'wss://op-ws-testnet.gateio.live/v4/ws/usdt',
|
|
84
|
+
'btc': 'wss://op-ws-testnet.gateio.live/v4/ws/btc',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
'options': {
|
|
89
|
+
'tradesLimit': 1000,
|
|
90
|
+
'OHLCVLimit': 1000,
|
|
91
|
+
'watchTradesSubscriptions': {},
|
|
92
|
+
'watchTickerSubscriptions': {},
|
|
93
|
+
'watchOrderBookSubscriptions': {},
|
|
94
|
+
'watchTicker': {
|
|
95
|
+
'name': 'tickers', // or book_ticker
|
|
96
|
+
},
|
|
97
|
+
'watchOrderBook': {
|
|
98
|
+
'interval': '100ms',
|
|
99
|
+
'snapshotDelay': 10,
|
|
100
|
+
'snapshotMaxRetries': 3,
|
|
101
|
+
'checksum': true,
|
|
102
|
+
},
|
|
103
|
+
'watchBalance': {
|
|
104
|
+
'settle': 'usdt',
|
|
105
|
+
'spot': 'spot.balances', // spot.margin_balances, spot.funding_balances or spot.cross_balances
|
|
106
|
+
},
|
|
107
|
+
'watchPositions': {
|
|
108
|
+
'fetchPositionsSnapshot': true,
|
|
109
|
+
'awaitPositionsSnapshot': true, // whether to wait for the positions snapshot before providing updates
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
'exceptions': {
|
|
113
|
+
'ws': {
|
|
114
|
+
'exact': {
|
|
115
|
+
'1': BadRequest,
|
|
116
|
+
'2': BadRequest,
|
|
117
|
+
'4': AuthenticationError,
|
|
118
|
+
'6': AuthenticationError,
|
|
119
|
+
'11': AuthenticationError,
|
|
120
|
+
},
|
|
121
|
+
'broad': {},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* @method
|
|
128
|
+
* @name gate#createOrderWs
|
|
129
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-place
|
|
130
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-place
|
|
131
|
+
* @description Create an order on the exchange
|
|
132
|
+
* @param {string} symbol Unified CCXT market symbol
|
|
133
|
+
* @param {string} type 'limit' or 'market' *"market" is contract only*
|
|
134
|
+
* @param {string} side 'buy' or 'sell'
|
|
135
|
+
* @param {float} amount the amount of currency to trade
|
|
136
|
+
* @param {float} [price] *ignored in "market" orders* the price at which the order is to be fulfilled at in units of the quote currency
|
|
137
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
138
|
+
* @param {float} [params.stopPrice] The price at which a trigger order is triggered at
|
|
139
|
+
* @param {string} [params.timeInForce] "GTC", "IOC", or "PO"
|
|
140
|
+
* @param {float} [params.stopLossPrice] The price at which a stop loss order is triggered at
|
|
141
|
+
* @param {float} [params.takeProfitPrice] The price at which a take profit order is triggered at
|
|
142
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
|
|
143
|
+
* @param {int} [params.iceberg] Amount to display for the iceberg order, Null or 0 for normal orders, Set to -1 to hide the order completely
|
|
144
|
+
* @param {string} [params.text] User defined information
|
|
145
|
+
* @param {string} [params.account] *spot and margin only* "spot", "margin" or "cross_margin"
|
|
146
|
+
* @param {bool} [params.auto_borrow] *margin only* Used in margin or cross margin trading to allow automatic loan of insufficient amount if balance is not enough
|
|
147
|
+
* @param {string} [params.settle] *contract only* Unified Currency Code for settle currency
|
|
148
|
+
* @param {bool} [params.reduceOnly] *contract only* Indicates if this order is to reduce the size of a position
|
|
149
|
+
* @param {bool} [params.close] *contract only* Set as true to close the position, with size set to 0
|
|
150
|
+
* @param {bool} [params.auto_size] *contract only* Set side to close dual-mode position, close_long closes the long side, while close_short the short one, size also needs to be set to 0
|
|
151
|
+
* @param {int} [params.price_type] *contract only* 0 latest deal price, 1 mark price, 2 index price
|
|
152
|
+
* @param {float} [params.cost] *spot market buy only* the quote quantity that can be used as an alternative for the amount
|
|
153
|
+
* @returns {object|undefined} [An order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
154
|
+
*/
|
|
155
|
+
async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
|
|
156
|
+
await this.loadMarkets();
|
|
157
|
+
const market = this.market(symbol);
|
|
158
|
+
symbol = market['symbol'];
|
|
159
|
+
const messageType = this.getTypeByMarket(market);
|
|
160
|
+
const channel = messageType + '.order_place';
|
|
161
|
+
const url = this.getUrlByMarket(market);
|
|
162
|
+
params['textIsRequired'] = true;
|
|
163
|
+
const request = this.createOrderRequest(symbol, type, side, amount, price, params);
|
|
164
|
+
await this.authenticate(url, messageType);
|
|
165
|
+
const rawOrder = await this.requestPrivate(url, request, channel);
|
|
166
|
+
const order = this.parseOrder(rawOrder, market);
|
|
167
|
+
return order;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* @method
|
|
171
|
+
* @name gate#createOrdersWs
|
|
172
|
+
* @description create a list of trade orders
|
|
173
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-batch-place
|
|
174
|
+
* @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
|
175
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
176
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
177
|
+
*/
|
|
178
|
+
async createOrdersWs(orders, params = {}) {
|
|
179
|
+
await this.loadMarkets();
|
|
180
|
+
const request = this.createOrdersRequest(orders, params);
|
|
181
|
+
const firstOrder = orders[0];
|
|
182
|
+
const market = this.market(firstOrder['symbol']);
|
|
183
|
+
if (market['swap'] !== true) {
|
|
184
|
+
throw new NotSupported(this.id + ' createOrdersWs is not supported for swap markets');
|
|
185
|
+
}
|
|
186
|
+
const messageType = this.getTypeByMarket(market);
|
|
187
|
+
const channel = messageType + '.order_batch_place';
|
|
188
|
+
const url = this.getUrlByMarket(market);
|
|
189
|
+
await this.authenticate(url, messageType);
|
|
190
|
+
const rawOrders = await this.requestPrivate(url, request, channel);
|
|
191
|
+
return this.parseOrders(rawOrders, market);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @method
|
|
195
|
+
* @name gate#cancelAllOrdersWs
|
|
196
|
+
* @description cancel all open orders
|
|
197
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#cancel-all-open-orders-matched
|
|
198
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-cancel-all-with-specified-currency-pair
|
|
199
|
+
* @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
|
|
200
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
201
|
+
* @param {string} [params.channel] the channel to use, defaults to spot.order_cancel_cp or futures.order_cancel_cp
|
|
202
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
203
|
+
*/
|
|
204
|
+
async cancelAllOrdersWs(symbol = undefined, params = {}) {
|
|
205
|
+
await this.loadMarkets();
|
|
206
|
+
const market = (symbol === undefined) ? undefined : this.market(symbol);
|
|
207
|
+
const trigger = this.safeBool2(params, 'stop', 'trigger');
|
|
208
|
+
const messageType = this.getTypeByMarket(market);
|
|
209
|
+
let channel = messageType + '.order_cancel_cp';
|
|
210
|
+
[channel, params] = this.handleOptionAndParams(params, 'cancelAllOrdersWs', 'channel', channel);
|
|
211
|
+
const url = this.getUrlByMarket(market);
|
|
212
|
+
params = this.omit(params, ['stop', 'trigger']);
|
|
213
|
+
const [type, query] = this.handleMarketTypeAndParams('cancelAllOrders', market, params);
|
|
214
|
+
const [request, requestParams] = (type === 'spot') ? this.multiOrderSpotPrepareRequest(market, trigger, query) : this.prepareRequest(market, type, query);
|
|
215
|
+
await this.authenticate(url, messageType);
|
|
216
|
+
const rawOrders = await this.requestPrivate(url, this.extend(request, requestParams), channel);
|
|
217
|
+
return this.parseOrders(rawOrders, market);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* @method
|
|
221
|
+
* @name gate#cancelOrderWs
|
|
222
|
+
* @description Cancels an open order
|
|
223
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-cancel
|
|
224
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-cancel
|
|
225
|
+
* @param {string} id Order id
|
|
226
|
+
* @param {string} symbol Unified market symbol
|
|
227
|
+
* @param {object} [params] Parameters specified by the exchange api
|
|
228
|
+
* @param {bool} [params.trigger] True if the order to be cancelled is a trigger order
|
|
229
|
+
* @returns An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
230
|
+
*/
|
|
231
|
+
async cancelOrderWs(id, symbol = undefined, params = {}) {
|
|
232
|
+
await this.loadMarkets();
|
|
233
|
+
const market = (symbol === undefined) ? undefined : this.market(symbol);
|
|
234
|
+
const trigger = this.safeValueN(params, ['is_stop_order', 'stop', 'trigger'], false);
|
|
235
|
+
params = this.omit(params, ['is_stop_order', 'stop', 'trigger']);
|
|
236
|
+
const [type, query] = this.handleMarketTypeAndParams('cancelOrder', market, params);
|
|
237
|
+
const [request, requestParams] = (type === 'spot' || type === 'margin') ? this.spotOrderPrepareRequest(market, trigger, query) : this.prepareRequest(market, type, query);
|
|
238
|
+
const messageType = this.getTypeByMarket(market);
|
|
239
|
+
const channel = messageType + '.order_cancel';
|
|
240
|
+
const url = this.getUrlByMarket(market);
|
|
241
|
+
await this.authenticate(url, messageType);
|
|
242
|
+
request['order_id'] = id.toString();
|
|
243
|
+
const res = await this.requestPrivate(url, this.extend(request, requestParams), channel);
|
|
244
|
+
return this.parseOrder(res, market);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* @method
|
|
248
|
+
* @name gate#editOrderWs
|
|
249
|
+
* @description edit a trade order, gate currently only supports the modification of the price or amount fields
|
|
250
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-amend
|
|
251
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-amend
|
|
252
|
+
* @param {string} id order id
|
|
253
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
254
|
+
* @param {string} type 'market' or 'limit'
|
|
255
|
+
* @param {string} side 'buy' or 'sell'
|
|
256
|
+
* @param {float} amount how much of the currency you want to trade in units of the base currency
|
|
257
|
+
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
258
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
259
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
260
|
+
*/
|
|
261
|
+
async editOrderWs(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
|
|
262
|
+
await this.loadMarkets();
|
|
263
|
+
const market = this.market(symbol);
|
|
264
|
+
const extendedRequest = this.editOrderRequest(id, symbol, type, side, amount, price, params);
|
|
265
|
+
const messageType = this.getTypeByMarket(market);
|
|
266
|
+
const channel = messageType + '.order_amend';
|
|
267
|
+
const url = this.getUrlByMarket(market);
|
|
268
|
+
await this.authenticate(url, messageType);
|
|
269
|
+
const rawOrder = await this.requestPrivate(url, extendedRequest, channel);
|
|
270
|
+
return this.parseOrder(rawOrder, market);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* @method
|
|
274
|
+
* @name gate#fetchOrderWs
|
|
275
|
+
* @description Retrieves information on an order
|
|
276
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-status
|
|
277
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-status
|
|
278
|
+
* @param {string} id Order id
|
|
279
|
+
* @param {string} symbol Unified market symbol, *required for spot and margin*
|
|
280
|
+
* @param {object} [params] Parameters specified by the exchange api
|
|
281
|
+
* @param {bool} [params.trigger] True if the order being fetched is a trigger order
|
|
282
|
+
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
|
|
283
|
+
* @param {string} [params.type] 'spot', 'swap', or 'future', if not provided this.options['defaultMarginMode'] is used
|
|
284
|
+
* @param {string} [params.settle] 'btc' or 'usdt' - settle currency for perpetual swap and future - market settle currency is used if symbol !== undefined, default="usdt" for swap and "btc" for future
|
|
285
|
+
* @returns An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
286
|
+
*/
|
|
287
|
+
async fetchOrderWs(id, symbol = undefined, params = {}) {
|
|
288
|
+
await this.loadMarkets();
|
|
289
|
+
const market = (symbol === undefined) ? undefined : this.market(symbol);
|
|
290
|
+
const [request, requestParams] = this.fetchOrderRequest(id, symbol, params);
|
|
291
|
+
const messageType = this.getTypeByMarket(market);
|
|
292
|
+
const channel = messageType + '.order_status';
|
|
293
|
+
const url = this.getUrlByMarket(market);
|
|
294
|
+
await this.authenticate(url, messageType);
|
|
295
|
+
const rawOrder = await this.requestPrivate(url, this.extend(request, requestParams), channel);
|
|
296
|
+
return this.parseOrder(rawOrder, market);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* @method
|
|
300
|
+
* @name gate#fetchOpenOrdersWs
|
|
301
|
+
* @description fetch all unfilled currently open orders
|
|
302
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-list
|
|
303
|
+
* @param {string} symbol unified market symbol
|
|
304
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
305
|
+
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
306
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
307
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
308
|
+
*/
|
|
309
|
+
async fetchOpenOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
310
|
+
return await this.fetchOrdersByStatusWs('open', symbol, since, limit, params);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* @method
|
|
314
|
+
* @name gate#fetchClosedOrdersWs
|
|
315
|
+
* @description fetches information on multiple closed orders made by the user
|
|
316
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-list
|
|
317
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
318
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
319
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
320
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
321
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
322
|
+
*/
|
|
323
|
+
async fetchClosedOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
324
|
+
return await this.fetchOrdersByStatusWs('finished', symbol, since, limit, params);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* @method
|
|
328
|
+
* @name gate#fetchOrdersWs
|
|
329
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#order-list
|
|
330
|
+
* @description fetches information on multiple orders made by the user by status
|
|
331
|
+
* @param {string} status requested order status
|
|
332
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
333
|
+
* @param {int|undefined} [since] the earliest time in ms to fetch orders for
|
|
334
|
+
* @param {int|undefined} [limit] the maximum number of order structures to retrieve
|
|
335
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
336
|
+
* @param {int} [params.orderId] order id to begin at
|
|
337
|
+
* @param {int} [params.limit] the maximum number of order structures to retrieve
|
|
338
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
339
|
+
*/
|
|
340
|
+
async fetchOrdersByStatusWs(status, symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
341
|
+
await this.loadMarkets();
|
|
342
|
+
let market = undefined;
|
|
343
|
+
if (symbol !== undefined) {
|
|
344
|
+
market = this.market(symbol);
|
|
345
|
+
symbol = market['symbol'];
|
|
346
|
+
if (market['swap'] !== true) {
|
|
347
|
+
throw new NotSupported(this.id + ' fetchOrdersByStatusWs is only supported by swap markets. Use rest API for other markets');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const [request, requestParams] = this.prepareOrdersByStatusRequest(status, symbol, since, limit, params);
|
|
351
|
+
const newRequest = this.omit(request, ['settle']);
|
|
352
|
+
const messageType = this.getTypeByMarket(market);
|
|
353
|
+
const channel = messageType + '.order_list';
|
|
354
|
+
const url = this.getUrlByMarket(market);
|
|
355
|
+
await this.authenticate(url, messageType);
|
|
356
|
+
const rawOrders = await this.requestPrivate(url, this.extend(newRequest, requestParams), channel);
|
|
357
|
+
const orders = this.parseOrders(rawOrders, market);
|
|
358
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit);
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* @method
|
|
362
|
+
* @name gate#watchOrderBook
|
|
363
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
364
|
+
* @see https://www.gate.com/docs/developers/apiv4/ws/en/#order-book-channel
|
|
365
|
+
* @see https://www.gate.com/docs/developers/apiv4/ws/en/#order-book-v2-api
|
|
366
|
+
* @see https://www.gate.com/docs/developers/futures/ws/en/#order-book-api
|
|
367
|
+
* @see https://www.gate.com/docs/developers/futures/ws/en/#order-book-v2-api
|
|
368
|
+
* @see https://www.gate.com/docs/developers/delivery/ws/en/#order-book-api
|
|
369
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
370
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
371
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
372
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
373
|
+
*/
|
|
374
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
375
|
+
await this.loadMarkets();
|
|
376
|
+
const market = this.market(symbol);
|
|
377
|
+
symbol = market['symbol'];
|
|
378
|
+
const marketId = market['id'];
|
|
379
|
+
const [interval, query] = this.handleOptionAndParams(params, 'watchOrderBook', 'interval', '100ms');
|
|
380
|
+
const messageType = this.getTypeByMarket(market);
|
|
381
|
+
const channel = messageType + '.order_book_update';
|
|
382
|
+
const messageHash = 'orderbook' + ':' + symbol;
|
|
383
|
+
const url = this.getUrlByMarket(market);
|
|
384
|
+
const payload = [marketId, interval];
|
|
385
|
+
if (limit === undefined) {
|
|
386
|
+
limit = 100; // max 100 atm
|
|
387
|
+
}
|
|
388
|
+
if (market['contract']) {
|
|
389
|
+
const stringLimit = limit.toString();
|
|
390
|
+
payload.push(stringLimit);
|
|
391
|
+
}
|
|
392
|
+
const subscription = {
|
|
393
|
+
'symbol': symbol,
|
|
394
|
+
'limit': limit,
|
|
395
|
+
};
|
|
396
|
+
const orderbook = await this.subscribePublic(url, messageHash, payload, channel, query, subscription);
|
|
397
|
+
return orderbook.limit();
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* @method
|
|
401
|
+
* @name gate#unWatchOrderBook
|
|
402
|
+
* @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
403
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
404
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
405
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
406
|
+
*/
|
|
407
|
+
async unWatchOrderBook(symbol, params = {}) {
|
|
408
|
+
await this.loadMarkets();
|
|
409
|
+
const market = this.market(symbol);
|
|
410
|
+
symbol = market['symbol'];
|
|
411
|
+
const marketId = market['id'];
|
|
412
|
+
let interval = '100ms';
|
|
413
|
+
[interval, params] = this.handleOptionAndParams(params, 'watchOrderBook', 'interval', interval);
|
|
414
|
+
const messageType = this.getTypeByMarket(market);
|
|
415
|
+
const channel = messageType + '.order_book_update';
|
|
416
|
+
const subMessageHash = 'orderbook' + ':' + symbol;
|
|
417
|
+
const messageHash = 'unsubscribe:orderbook' + ':' + symbol;
|
|
418
|
+
const url = this.getUrlByMarket(market);
|
|
419
|
+
const payload = [marketId, interval];
|
|
420
|
+
const limit = this.safeInteger(params, 'limit', 100);
|
|
421
|
+
if (market['contract']) {
|
|
422
|
+
const stringLimit = limit.toString();
|
|
423
|
+
payload.push(stringLimit);
|
|
424
|
+
}
|
|
425
|
+
return await this.unSubscribePublicMultiple(url, 'orderbook', [symbol], [messageHash], [subMessageHash], payload, channel, params);
|
|
426
|
+
}
|
|
427
|
+
handleOrderBookSubscription(client, message, subscription) {
|
|
428
|
+
const symbol = this.safeString(subscription, 'symbol');
|
|
429
|
+
const limit = this.safeInteger(subscription, 'limit');
|
|
430
|
+
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
431
|
+
}
|
|
432
|
+
handleOrderBook(client, message) {
|
|
433
|
+
//
|
|
434
|
+
// spot
|
|
435
|
+
//
|
|
436
|
+
// {
|
|
437
|
+
// "time": 1650189272,
|
|
438
|
+
// "channel": "spot.order_book_update",
|
|
439
|
+
// "event": "update",
|
|
440
|
+
// "result": {
|
|
441
|
+
// "t": 1650189272515,
|
|
442
|
+
// "e": "depthUpdate",
|
|
443
|
+
// "E": 1650189272,
|
|
444
|
+
// "s": "GMT_USDT",
|
|
445
|
+
// "U": 140595902,
|
|
446
|
+
// "u": 140595902,
|
|
447
|
+
// "b": [
|
|
448
|
+
// [ '2.51518', "228.119" ],
|
|
449
|
+
// [ '2.50587', "1510.11" ],
|
|
450
|
+
// [ '2.49944', "67.6" ],
|
|
451
|
+
// ],
|
|
452
|
+
// "a": [
|
|
453
|
+
// [ '2.5182', "4.199" ],
|
|
454
|
+
// [ "2.51926", "1874" ],
|
|
455
|
+
// [ '2.53528', "96.529" ],
|
|
456
|
+
// ]
|
|
457
|
+
// }
|
|
458
|
+
// }
|
|
459
|
+
//
|
|
460
|
+
// swap
|
|
461
|
+
//
|
|
462
|
+
// {
|
|
463
|
+
// "id": null,
|
|
464
|
+
// "time": 1650188898,
|
|
465
|
+
// "channel": "futures.order_book_update",
|
|
466
|
+
// "event": "update",
|
|
467
|
+
// "error": null,
|
|
468
|
+
// "result": {
|
|
469
|
+
// "t": 1650188898938,
|
|
470
|
+
// "s": "GMT_USDT",
|
|
471
|
+
// "U": 1577718307,
|
|
472
|
+
// "u": 1577719254,
|
|
473
|
+
// "b": [
|
|
474
|
+
// { p: "2.5178", s: 0 },
|
|
475
|
+
// { p: "2.5179", s: 0 },
|
|
476
|
+
// { p: "2.518", s: 0 },
|
|
477
|
+
// ],
|
|
478
|
+
// "a": [
|
|
479
|
+
// { p: "2.52", s: 0 },
|
|
480
|
+
// { p: "2.5201", s: 0 },
|
|
481
|
+
// { p: "2.5203", s: 0 },
|
|
482
|
+
// ]
|
|
483
|
+
// }
|
|
484
|
+
// }
|
|
485
|
+
//
|
|
486
|
+
const channel = this.safeString(message, 'channel');
|
|
487
|
+
const channelParts = channel.split('.');
|
|
488
|
+
const rawMarketType = this.safeString(channelParts, 0);
|
|
489
|
+
const isSpot = rawMarketType === 'spot';
|
|
490
|
+
const marketType = isSpot ? 'spot' : 'contract';
|
|
491
|
+
const delta = this.safeValue(message, 'result');
|
|
492
|
+
const deltaStart = this.safeInteger(delta, 'U');
|
|
493
|
+
const deltaEnd = this.safeInteger(delta, 'u');
|
|
494
|
+
const marketId = this.safeString(delta, 's');
|
|
495
|
+
const symbol = this.safeSymbol(marketId, undefined, '_', marketType);
|
|
496
|
+
const messageHash = 'orderbook:' + symbol;
|
|
497
|
+
const storedOrderBook = this.safeValue(this.orderbooks, symbol, this.orderBook({}));
|
|
498
|
+
const nonce = this.safeInteger(storedOrderBook, 'nonce');
|
|
499
|
+
if (nonce === undefined) {
|
|
500
|
+
let cacheLength = 0;
|
|
501
|
+
if (storedOrderBook !== undefined) {
|
|
502
|
+
cacheLength = storedOrderBook.cache.length;
|
|
503
|
+
}
|
|
504
|
+
const snapshotDelay = this.handleOption('watchOrderBook', 'snapshotDelay', 10);
|
|
505
|
+
const waitAmount = isSpot ? snapshotDelay : 0;
|
|
506
|
+
if (cacheLength === waitAmount) {
|
|
507
|
+
// max limit is 100
|
|
508
|
+
const subscription = client.subscriptions[messageHash];
|
|
509
|
+
const limit = this.safeInteger(subscription, 'limit');
|
|
510
|
+
this.spawn(this.loadOrderBook, client, messageHash, symbol, limit, {}); // needed for c#, number of args needs to match
|
|
511
|
+
}
|
|
512
|
+
storedOrderBook.cache.push(delta);
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
else if (nonce >= deltaEnd) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
else if (nonce >= deltaStart - 1) {
|
|
519
|
+
this.handleDelta(storedOrderBook, delta);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
delete client.subscriptions[messageHash];
|
|
523
|
+
delete this.orderbooks[symbol];
|
|
524
|
+
const checksum = this.handleOption('watchOrderBook', 'checksum', true);
|
|
525
|
+
if (checksum) {
|
|
526
|
+
const error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
|
|
527
|
+
client.reject(error, messageHash);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
client.resolve(storedOrderBook, messageHash);
|
|
531
|
+
}
|
|
532
|
+
getCacheIndex(orderBook, cache) {
|
|
533
|
+
const nonce = this.safeInteger(orderBook, 'nonce');
|
|
534
|
+
const firstDelta = cache[0];
|
|
535
|
+
const firstDeltaStart = this.safeInteger(firstDelta, 'U');
|
|
536
|
+
if (nonce < firstDeltaStart) {
|
|
537
|
+
return -1;
|
|
538
|
+
}
|
|
539
|
+
for (let i = 0; i < cache.length; i++) {
|
|
540
|
+
const delta = cache[i];
|
|
541
|
+
const deltaStart = this.safeInteger(delta, 'U');
|
|
542
|
+
const deltaEnd = this.safeInteger(delta, 'u');
|
|
543
|
+
if ((nonce >= deltaStart - 1) && (nonce < deltaEnd)) {
|
|
544
|
+
return i;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return cache.length;
|
|
548
|
+
}
|
|
549
|
+
handleBidAsks(bookSide, bidAsks) {
|
|
550
|
+
for (let i = 0; i < bidAsks.length; i++) {
|
|
551
|
+
const bidAsk = bidAsks[i];
|
|
552
|
+
if (Array.isArray(bidAsk)) {
|
|
553
|
+
bookSide.storeArray(this.parseBidAsk(bidAsk));
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
const price = this.safeFloat(bidAsk, 'p');
|
|
557
|
+
const amount = this.safeFloat(bidAsk, 's');
|
|
558
|
+
bookSide.store(price, amount);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
handleDelta(orderbook, delta) {
|
|
563
|
+
const timestamp = this.safeInteger(delta, 't');
|
|
564
|
+
orderbook['timestamp'] = timestamp;
|
|
565
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
566
|
+
orderbook['nonce'] = this.safeInteger(delta, 'u');
|
|
567
|
+
const bids = this.safeValue(delta, 'b', []);
|
|
568
|
+
const asks = this.safeValue(delta, 'a', []);
|
|
569
|
+
const storedBids = orderbook['bids'];
|
|
570
|
+
const storedAsks = orderbook['asks'];
|
|
571
|
+
this.handleBidAsks(storedBids, bids);
|
|
572
|
+
this.handleBidAsks(storedAsks, asks);
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* @method
|
|
576
|
+
* @name gate#watchTicker
|
|
577
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
|
|
578
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
579
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
580
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
581
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
582
|
+
*/
|
|
583
|
+
async watchTicker(symbol, params = {}) {
|
|
584
|
+
await this.loadMarkets();
|
|
585
|
+
const market = this.market(symbol);
|
|
586
|
+
symbol = market['symbol'];
|
|
587
|
+
params['callerMethodName'] = 'watchTicker';
|
|
588
|
+
const result = await this.watchTickers([symbol], params);
|
|
589
|
+
return this.safeValue(result, symbol);
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* @method
|
|
593
|
+
* @name gate#watchTickers
|
|
594
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#tickers-channel
|
|
595
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
596
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
597
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
598
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
599
|
+
*/
|
|
600
|
+
async watchTickers(symbols = undefined, params = {}) {
|
|
601
|
+
return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchTickers', this.extend({ 'method': 'tickers' }, params));
|
|
602
|
+
}
|
|
603
|
+
handleTicker(client, message) {
|
|
604
|
+
//
|
|
605
|
+
// {
|
|
606
|
+
// "time": 1649326221,
|
|
607
|
+
// "channel": "spot.tickers",
|
|
608
|
+
// "event": "update",
|
|
609
|
+
// "result": {
|
|
610
|
+
// "currency_pair": "BTC_USDT",
|
|
611
|
+
// "last": "43444.82",
|
|
612
|
+
// "lowest_ask": "43444.82",
|
|
613
|
+
// "highest_bid": "43444.81",
|
|
614
|
+
// "change_percentage": "-4.0036",
|
|
615
|
+
// "base_volume": "5182.5412425462",
|
|
616
|
+
// "quote_volume": "227267634.93123952",
|
|
617
|
+
// "high_24h": "47698",
|
|
618
|
+
// "low_24h": "42721.03"
|
|
619
|
+
// }
|
|
620
|
+
// }
|
|
621
|
+
//
|
|
622
|
+
this.handleTickerAndBidAsk('ticker', client, message);
|
|
623
|
+
}
|
|
624
|
+
/**
|
|
625
|
+
* @method
|
|
626
|
+
* @name gate#watchBidsAsks
|
|
627
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#best-bid-or-ask-price
|
|
628
|
+
* @see https://www.gate.io/docs/developers/apiv4/ws/en/#order-book-channel
|
|
629
|
+
* @description watches best bid & ask for symbols
|
|
630
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
631
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
632
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
633
|
+
*/
|
|
634
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
635
|
+
return await this.subscribeWatchTickersAndBidsAsks(symbols, 'watchBidsAsks', this.extend({ 'method': 'book_ticker' }, params));
|
|
636
|
+
}
|
|
637
|
+
handleBidAsk(client, message) {
|
|
638
|
+
//
|
|
639
|
+
// {
|
|
640
|
+
// "time": 1671363004,
|
|
641
|
+
// "time_ms": 1671363004235,
|
|
642
|
+
// "channel": "spot.book_ticker",
|
|
643
|
+
// "event": "update",
|
|
644
|
+
// "result": {
|
|
645
|
+
// "t": 1671363004228,
|
|
646
|
+
// "u": 9793320464,
|
|
647
|
+
// "s": "BTC_USDT",
|
|
648
|
+
// "b": "16716.8",
|
|
649
|
+
// "B": "0.0134",
|
|
650
|
+
// "a": "16716.9",
|
|
651
|
+
// "A": "0.0353"
|
|
652
|
+
// }
|
|
653
|
+
// }
|
|
654
|
+
//
|
|
655
|
+
this.handleTickerAndBidAsk('bidask', client, message);
|
|
656
|
+
}
|
|
657
|
+
async subscribeWatchTickersAndBidsAsks(symbols = undefined, callerMethodName = undefined, params = {}) {
|
|
658
|
+
await this.loadMarkets();
|
|
659
|
+
[callerMethodName, params] = this.handleParamString(params, 'callerMethodName', callerMethodName);
|
|
660
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
661
|
+
const market = this.market(symbols[0]);
|
|
662
|
+
const messageType = this.getTypeByMarket(market);
|
|
663
|
+
const marketIds = this.marketIds(symbols);
|
|
664
|
+
let channelName = undefined;
|
|
665
|
+
[channelName, params] = this.handleOptionAndParams(params, callerMethodName, 'method');
|
|
666
|
+
const url = this.getUrlByMarket(market);
|
|
667
|
+
const channel = messageType + '.' + channelName;
|
|
668
|
+
const isWatchTickers = callerMethodName.indexOf('watchTicker') >= 0;
|
|
669
|
+
const prefix = isWatchTickers ? 'ticker' : 'bidask';
|
|
670
|
+
const messageHashes = [];
|
|
671
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
672
|
+
const symbol = symbols[i];
|
|
673
|
+
messageHashes.push(prefix + ':' + symbol);
|
|
674
|
+
}
|
|
675
|
+
const tickerOrBidAsk = await this.subscribePublicMultiple(url, messageHashes, marketIds, channel, params);
|
|
676
|
+
if (this.newUpdates) {
|
|
677
|
+
const items = {};
|
|
678
|
+
items[tickerOrBidAsk['symbol']] = tickerOrBidAsk;
|
|
679
|
+
return items;
|
|
680
|
+
}
|
|
681
|
+
const result = isWatchTickers ? this.tickers : this.bidsasks;
|
|
682
|
+
return this.filterByArray(result, 'symbol', symbols, true);
|
|
683
|
+
}
|
|
684
|
+
handleTickerAndBidAsk(objectName, client, message) {
|
|
685
|
+
const channel = this.safeString(message, 'channel');
|
|
686
|
+
const parts = channel.split('.');
|
|
687
|
+
const rawMarketType = this.safeString(parts, 0);
|
|
688
|
+
const marketType = (rawMarketType === 'futures') ? 'contract' : 'spot';
|
|
689
|
+
const result = this.safeValue(message, 'result');
|
|
690
|
+
let results = [];
|
|
691
|
+
if (Array.isArray(result)) {
|
|
692
|
+
results = this.safeList(message, 'result', []);
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
const rawTicker = this.safeDict(message, 'result', {});
|
|
696
|
+
results = [rawTicker];
|
|
697
|
+
}
|
|
698
|
+
const isTicker = (objectName === 'ticker'); // whether ticker or bid-ask
|
|
699
|
+
for (let i = 0; i < results.length; i++) {
|
|
700
|
+
const rawTicker = results[i];
|
|
701
|
+
const marketId = this.safeString(rawTicker, 's');
|
|
702
|
+
const market = this.safeMarket(marketId, undefined, '_', marketType);
|
|
703
|
+
const parsedItem = this.parseTicker(rawTicker, market);
|
|
704
|
+
const symbol = parsedItem['symbol'];
|
|
705
|
+
if (isTicker) {
|
|
706
|
+
this.tickers[symbol] = parsedItem;
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
this.bidsasks[symbol] = parsedItem;
|
|
710
|
+
}
|
|
711
|
+
const messageHash = objectName + ':' + symbol;
|
|
712
|
+
client.resolve(parsedItem, messageHash);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* @method
|
|
717
|
+
* @name gate#watchTrades
|
|
718
|
+
* @description get the list of most recent trades for a particular symbol
|
|
719
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
720
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
721
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
722
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
723
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
724
|
+
*/
|
|
725
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
726
|
+
return await this.watchTradesForSymbols([symbol], since, limit, params);
|
|
727
|
+
}
|
|
728
|
+
/**
|
|
729
|
+
* @method
|
|
730
|
+
* @name gate#watchTradesForSymbols
|
|
731
|
+
* @description get the list of most recent trades for a particular symbol
|
|
732
|
+
* @param {string[]} symbols unified symbol of the market to fetch trades for
|
|
733
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
734
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
735
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
736
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
737
|
+
*/
|
|
738
|
+
async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
739
|
+
await this.loadMarkets();
|
|
740
|
+
symbols = this.marketSymbols(symbols);
|
|
741
|
+
const marketIds = this.marketIds(symbols);
|
|
742
|
+
const market = this.market(symbols[0]);
|
|
743
|
+
const messageType = this.getTypeByMarket(market);
|
|
744
|
+
const channel = messageType + '.trades';
|
|
745
|
+
const messageHashes = [];
|
|
746
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
747
|
+
const symbol = symbols[i];
|
|
748
|
+
messageHashes.push('trades:' + symbol);
|
|
749
|
+
}
|
|
750
|
+
const url = this.getUrlByMarket(market);
|
|
751
|
+
const trades = await this.subscribePublicMultiple(url, messageHashes, marketIds, channel, params);
|
|
752
|
+
if (this.newUpdates) {
|
|
753
|
+
const first = this.safeValue(trades, 0);
|
|
754
|
+
const tradeSymbol = this.safeString(first, 'symbol');
|
|
755
|
+
limit = trades.getLimit(tradeSymbol, limit);
|
|
756
|
+
}
|
|
757
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
758
|
+
}
|
|
759
|
+
/**
|
|
760
|
+
* @method
|
|
761
|
+
* @name gate#unWatchTradesForSymbols
|
|
762
|
+
* @description get the list of most recent trades for a particular symbol
|
|
763
|
+
* @param {string[]} symbols unified symbol of the market to fetch trades for
|
|
764
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
765
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
766
|
+
*/
|
|
767
|
+
async unWatchTradesForSymbols(symbols, params = {}) {
|
|
768
|
+
await this.loadMarkets();
|
|
769
|
+
symbols = this.marketSymbols(symbols);
|
|
770
|
+
const marketIds = this.marketIds(symbols);
|
|
771
|
+
const market = this.market(symbols[0]);
|
|
772
|
+
const messageType = this.getTypeByMarket(market);
|
|
773
|
+
const channel = messageType + '.trades';
|
|
774
|
+
const subMessageHashes = [];
|
|
775
|
+
const messageHashes = [];
|
|
776
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
777
|
+
const symbol = symbols[i];
|
|
778
|
+
subMessageHashes.push('trades:' + symbol);
|
|
779
|
+
messageHashes.push('unsubscribe:trades:' + symbol);
|
|
780
|
+
}
|
|
781
|
+
const url = this.getUrlByMarket(market);
|
|
782
|
+
return await this.unSubscribePublicMultiple(url, 'trades', symbols, messageHashes, subMessageHashes, marketIds, channel, params);
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* @method
|
|
786
|
+
* @name gate#unWatchTrades
|
|
787
|
+
* @description get the list of most recent trades for a particular symbol
|
|
788
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
789
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
790
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
791
|
+
*/
|
|
792
|
+
async unWatchTrades(symbol, params = {}) {
|
|
793
|
+
return await this.unWatchTradesForSymbols([symbol], params);
|
|
794
|
+
}
|
|
795
|
+
handleTrades(client, message) {
|
|
796
|
+
//
|
|
797
|
+
// {
|
|
798
|
+
// "time": 1648725035,
|
|
799
|
+
// "channel": "spot.trades",
|
|
800
|
+
// "event": "update",
|
|
801
|
+
// "result": [{
|
|
802
|
+
// "id": 3130257995,
|
|
803
|
+
// "create_time": 1648725035,
|
|
804
|
+
// "create_time_ms": "1648725035923.0",
|
|
805
|
+
// "side": "sell",
|
|
806
|
+
// "currency_pair": "LTC_USDT",
|
|
807
|
+
// "amount": "0.0116",
|
|
808
|
+
// "price": "130.11"
|
|
809
|
+
// }]
|
|
810
|
+
// }
|
|
811
|
+
//
|
|
812
|
+
let result = this.safeValue(message, 'result');
|
|
813
|
+
if (!Array.isArray(result)) {
|
|
814
|
+
result = [result];
|
|
815
|
+
}
|
|
816
|
+
const parsedTrades = this.parseTrades(result);
|
|
817
|
+
for (let i = 0; i < parsedTrades.length; i++) {
|
|
818
|
+
const trade = parsedTrades[i];
|
|
819
|
+
const symbol = trade['symbol'];
|
|
820
|
+
let cachedTrades = this.safeValue(this.trades, symbol);
|
|
821
|
+
if (cachedTrades === undefined) {
|
|
822
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
823
|
+
cachedTrades = new ArrayCache(limit);
|
|
824
|
+
this.trades[symbol] = cachedTrades;
|
|
825
|
+
}
|
|
826
|
+
cachedTrades.append(trade);
|
|
827
|
+
const hash = 'trades:' + symbol;
|
|
828
|
+
client.resolve(cachedTrades, hash);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
/**
|
|
832
|
+
* @method
|
|
833
|
+
* @name gate#watchOHLCV
|
|
834
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
835
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
836
|
+
* @param {string} timeframe the length of time each candle represents
|
|
837
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
838
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
839
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
840
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
841
|
+
*/
|
|
842
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
843
|
+
await this.loadMarkets();
|
|
844
|
+
const market = this.market(symbol);
|
|
845
|
+
symbol = market['symbol'];
|
|
846
|
+
const marketId = market['id'];
|
|
847
|
+
const interval = this.safeString(this.timeframes, timeframe, timeframe);
|
|
848
|
+
const messageType = this.getTypeByMarket(market);
|
|
849
|
+
const channel = messageType + '.candlesticks';
|
|
850
|
+
const messageHash = 'candles:' + interval + ':' + market['symbol'];
|
|
851
|
+
const url = this.getUrlByMarket(market);
|
|
852
|
+
const payload = [interval, marketId];
|
|
853
|
+
const ohlcv = await this.subscribePublic(url, messageHash, payload, channel, params);
|
|
854
|
+
if (this.newUpdates) {
|
|
855
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
856
|
+
}
|
|
857
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
858
|
+
}
|
|
859
|
+
handleOHLCV(client, message) {
|
|
860
|
+
//
|
|
861
|
+
// {
|
|
862
|
+
// "time": 1606292600,
|
|
863
|
+
// "channel": "spot.candlesticks",
|
|
864
|
+
// "event": "update",
|
|
865
|
+
// "result": {
|
|
866
|
+
// "t": "1606292580", // total volume
|
|
867
|
+
// "v": "2362.32035", // volume
|
|
868
|
+
// "c": "19128.1", // close
|
|
869
|
+
// "h": "19128.1", // high
|
|
870
|
+
// "l": "19128.1", // low
|
|
871
|
+
// "o": "19128.1", // open
|
|
872
|
+
// "n": "1m_BTC_USDT" // sub
|
|
873
|
+
// }
|
|
874
|
+
// }
|
|
875
|
+
//
|
|
876
|
+
const channel = this.safeString(message, 'channel');
|
|
877
|
+
const channelParts = channel.split('.');
|
|
878
|
+
const rawMarketType = this.safeString(channelParts, 0);
|
|
879
|
+
const marketType = (rawMarketType === 'spot') ? 'spot' : 'contract';
|
|
880
|
+
let result = this.safeValue(message, 'result');
|
|
881
|
+
if (!Array.isArray(result)) {
|
|
882
|
+
result = [result];
|
|
883
|
+
}
|
|
884
|
+
const marketIds = {};
|
|
885
|
+
for (let i = 0; i < result.length; i++) {
|
|
886
|
+
const ohlcv = result[i];
|
|
887
|
+
const subscription = this.safeString(ohlcv, 'n', '');
|
|
888
|
+
const parts = subscription.split('_');
|
|
889
|
+
const timeframe = this.safeString(parts, 0);
|
|
890
|
+
const timeframeId = this.findTimeframe(timeframe);
|
|
891
|
+
const prefix = timeframe + '_';
|
|
892
|
+
const marketId = subscription.replace(prefix, '');
|
|
893
|
+
const symbol = this.safeSymbol(marketId, undefined, '_', marketType);
|
|
894
|
+
const parsed = this.parseOHLCV(ohlcv);
|
|
895
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
896
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
897
|
+
if (stored === undefined) {
|
|
898
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
899
|
+
stored = new ArrayCacheByTimestamp(limit);
|
|
900
|
+
this.ohlcvs[symbol][timeframeId] = stored;
|
|
901
|
+
}
|
|
902
|
+
stored.append(parsed);
|
|
903
|
+
marketIds[symbol] = timeframe;
|
|
904
|
+
}
|
|
905
|
+
const keys = Object.keys(marketIds);
|
|
906
|
+
for (let i = 0; i < keys.length; i++) {
|
|
907
|
+
const symbol = keys[i];
|
|
908
|
+
const timeframe = marketIds[symbol];
|
|
909
|
+
const interval = this.findTimeframe(timeframe);
|
|
910
|
+
const hash = 'candles' + ':' + interval + ':' + symbol;
|
|
911
|
+
const stored = this.safeValue(this.ohlcvs[symbol], interval);
|
|
912
|
+
client.resolve(stored, hash);
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* @method
|
|
917
|
+
* @name gate#watchMyTrades
|
|
918
|
+
* @description watches information on multiple trades made by the user
|
|
919
|
+
* @param {string} symbol unified market symbol of the market trades were made in
|
|
920
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
921
|
+
* @param {int} [limit] the maximum number of trade structures to retrieve
|
|
922
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
923
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
924
|
+
*/
|
|
925
|
+
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
926
|
+
await this.loadMarkets();
|
|
927
|
+
let subType = undefined;
|
|
928
|
+
let type = undefined;
|
|
929
|
+
let marketId = '!' + 'all';
|
|
930
|
+
let market = undefined;
|
|
931
|
+
if (symbol !== undefined) {
|
|
932
|
+
market = this.market(symbol);
|
|
933
|
+
marketId = market['id'];
|
|
934
|
+
}
|
|
935
|
+
[type, params] = this.handleMarketTypeAndParams('watchMyTrades', market, params);
|
|
936
|
+
[subType, params] = this.handleSubTypeAndParams('watchMyTrades', market, params);
|
|
937
|
+
const messageType = this.getSupportedMapping(type, {
|
|
938
|
+
'spot': 'spot',
|
|
939
|
+
'margin': 'spot',
|
|
940
|
+
'future': 'futures',
|
|
941
|
+
'swap': 'futures',
|
|
942
|
+
'option': 'options',
|
|
943
|
+
});
|
|
944
|
+
const channel = messageType + '.usertrades';
|
|
945
|
+
let messageHash = 'myTrades';
|
|
946
|
+
if (symbol !== undefined) {
|
|
947
|
+
messageHash += ':' + symbol;
|
|
948
|
+
}
|
|
949
|
+
const isInverse = (subType === 'inverse');
|
|
950
|
+
const url = this.getUrlByMarketType(type, isInverse);
|
|
951
|
+
const payload = [marketId];
|
|
952
|
+
// uid required for non spot markets
|
|
953
|
+
const requiresUid = (type !== 'spot');
|
|
954
|
+
const trades = await this.subscribePrivate(url, messageHash, payload, channel, params, requiresUid);
|
|
955
|
+
if (this.newUpdates) {
|
|
956
|
+
limit = trades.getLimit(symbol, limit);
|
|
957
|
+
}
|
|
958
|
+
return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
|
|
959
|
+
}
|
|
960
|
+
handleMyTrades(client, message) {
|
|
961
|
+
//
|
|
962
|
+
// {
|
|
963
|
+
// "time": 1543205083,
|
|
964
|
+
// "channel": "futures.usertrades",
|
|
965
|
+
// "event": "update",
|
|
966
|
+
// "error": null,
|
|
967
|
+
// "result": [
|
|
968
|
+
// {
|
|
969
|
+
// "id": "3335259",
|
|
970
|
+
// "create_time": 1628736848,
|
|
971
|
+
// "create_time_ms": 1628736848321,
|
|
972
|
+
// "contract": "BTC_USD",
|
|
973
|
+
// "order_id": "4872460",
|
|
974
|
+
// "size": 1,
|
|
975
|
+
// "price": "40000.4",
|
|
976
|
+
// "role": "maker"
|
|
977
|
+
// }
|
|
978
|
+
// ]
|
|
979
|
+
// }
|
|
980
|
+
//
|
|
981
|
+
const result = this.safeValue(message, 'result', []);
|
|
982
|
+
const tradesLength = result.length;
|
|
983
|
+
if (tradesLength === 0) {
|
|
984
|
+
return;
|
|
985
|
+
}
|
|
986
|
+
let cachedTrades = this.myTrades;
|
|
987
|
+
if (cachedTrades === undefined) {
|
|
988
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
989
|
+
cachedTrades = new ArrayCacheBySymbolById(limit);
|
|
990
|
+
this.myTrades = cachedTrades;
|
|
991
|
+
}
|
|
992
|
+
const parsed = this.parseTrades(result);
|
|
993
|
+
const marketIds = {};
|
|
994
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
995
|
+
const trade = parsed[i];
|
|
996
|
+
cachedTrades.append(trade);
|
|
997
|
+
const symbol = trade['symbol'];
|
|
998
|
+
marketIds[symbol] = true;
|
|
999
|
+
}
|
|
1000
|
+
const keys = Object.keys(marketIds);
|
|
1001
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1002
|
+
const market = keys[i];
|
|
1003
|
+
const hash = 'myTrades:' + market;
|
|
1004
|
+
client.resolve(cachedTrades, hash);
|
|
1005
|
+
}
|
|
1006
|
+
client.resolve(cachedTrades, 'myTrades');
|
|
1007
|
+
}
|
|
1008
|
+
/**
|
|
1009
|
+
* @method
|
|
1010
|
+
* @name gate#watchBalance
|
|
1011
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
1012
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1013
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
1014
|
+
*/
|
|
1015
|
+
async watchBalance(params = {}) {
|
|
1016
|
+
await this.loadMarkets();
|
|
1017
|
+
let type = undefined;
|
|
1018
|
+
let subType = undefined;
|
|
1019
|
+
[type, params] = this.handleMarketTypeAndParams('watchBalance', undefined, params);
|
|
1020
|
+
[subType, params] = this.handleSubTypeAndParams('watchBalance', undefined, params);
|
|
1021
|
+
const isInverse = (subType === 'inverse');
|
|
1022
|
+
const url = this.getUrlByMarketType(type, isInverse);
|
|
1023
|
+
const requiresUid = (type !== 'spot');
|
|
1024
|
+
const channelType = this.getSupportedMapping(type, {
|
|
1025
|
+
'spot': 'spot',
|
|
1026
|
+
'margin': 'spot',
|
|
1027
|
+
'future': 'futures',
|
|
1028
|
+
'swap': 'futures',
|
|
1029
|
+
'option': 'options',
|
|
1030
|
+
});
|
|
1031
|
+
const channel = channelType + '.balances';
|
|
1032
|
+
const messageHash = type + '.balance';
|
|
1033
|
+
return await this.subscribePrivate(url, messageHash, undefined, channel, params, requiresUid);
|
|
1034
|
+
}
|
|
1035
|
+
handleBalance(client, message) {
|
|
1036
|
+
//
|
|
1037
|
+
// spot order fill
|
|
1038
|
+
// {
|
|
1039
|
+
// "time": 1653664351,
|
|
1040
|
+
// "channel": "spot.balances",
|
|
1041
|
+
// "event": "update",
|
|
1042
|
+
// "result": [
|
|
1043
|
+
// {
|
|
1044
|
+
// "timestamp": "1653664351",
|
|
1045
|
+
// "timestamp_ms": "1653664351017",
|
|
1046
|
+
// "user": "10406147",
|
|
1047
|
+
// "currency": "LTC",
|
|
1048
|
+
// "change": "-0.0002000000000000",
|
|
1049
|
+
// "total": "0.09986000000000000000",
|
|
1050
|
+
// "available": "0.09986000000000000000"
|
|
1051
|
+
// }
|
|
1052
|
+
// ]
|
|
1053
|
+
// }
|
|
1054
|
+
//
|
|
1055
|
+
// account transfer
|
|
1056
|
+
//
|
|
1057
|
+
// {
|
|
1058
|
+
// "id": null,
|
|
1059
|
+
// "time": 1653665088,
|
|
1060
|
+
// "channel": "futures.balances",
|
|
1061
|
+
// "event": "update",
|
|
1062
|
+
// "error": null,
|
|
1063
|
+
// "result": [
|
|
1064
|
+
// {
|
|
1065
|
+
// "balance": 25.035008537,
|
|
1066
|
+
// "change": 25,
|
|
1067
|
+
// "text": "-",
|
|
1068
|
+
// "time": 1653665088,
|
|
1069
|
+
// "time_ms": 1653665088286,
|
|
1070
|
+
// "type": "dnw",
|
|
1071
|
+
// "user": "10406147"
|
|
1072
|
+
// }
|
|
1073
|
+
// ]
|
|
1074
|
+
// }
|
|
1075
|
+
//
|
|
1076
|
+
// swap order fill
|
|
1077
|
+
// {
|
|
1078
|
+
// "id": null,
|
|
1079
|
+
// "time": 1653665311,
|
|
1080
|
+
// "channel": "futures.balances",
|
|
1081
|
+
// "event": "update",
|
|
1082
|
+
// "error": null,
|
|
1083
|
+
// "result": [
|
|
1084
|
+
// {
|
|
1085
|
+
// "balance": 20.031873037,
|
|
1086
|
+
// "change": -0.0031355,
|
|
1087
|
+
// "text": "LTC_USDT:165551103273",
|
|
1088
|
+
// "time": 1653665311,
|
|
1089
|
+
// "time_ms": 1653665311437,
|
|
1090
|
+
// "type": "fee",
|
|
1091
|
+
// "user": "10406147"
|
|
1092
|
+
// }
|
|
1093
|
+
// ]
|
|
1094
|
+
// }
|
|
1095
|
+
//
|
|
1096
|
+
const result = this.safeValue(message, 'result', []);
|
|
1097
|
+
const timestamp = this.safeInteger(message, 'time_ms');
|
|
1098
|
+
this.balance['info'] = result;
|
|
1099
|
+
this.balance['timestamp'] = timestamp;
|
|
1100
|
+
this.balance['datetime'] = this.iso8601(timestamp);
|
|
1101
|
+
for (let i = 0; i < result.length; i++) {
|
|
1102
|
+
const rawBalance = result[i];
|
|
1103
|
+
const account = this.account();
|
|
1104
|
+
const currencyId = this.safeString(rawBalance, 'currency', 'USDT'); // when not present it is USDT
|
|
1105
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
1106
|
+
account['free'] = this.safeString(rawBalance, 'available');
|
|
1107
|
+
account['total'] = this.safeString2(rawBalance, 'total', 'balance');
|
|
1108
|
+
this.balance[code] = account;
|
|
1109
|
+
}
|
|
1110
|
+
const channel = this.safeString(message, 'channel');
|
|
1111
|
+
const parts = channel.split('.');
|
|
1112
|
+
const rawType = this.safeString(parts, 0);
|
|
1113
|
+
const channelType = this.getSupportedMapping(rawType, {
|
|
1114
|
+
'spot': 'spot',
|
|
1115
|
+
'futures': 'swap',
|
|
1116
|
+
'options': 'option',
|
|
1117
|
+
});
|
|
1118
|
+
const messageHash = channelType + '.balance';
|
|
1119
|
+
this.balance = this.safeBalance(this.balance);
|
|
1120
|
+
client.resolve(this.balance, messageHash);
|
|
1121
|
+
}
|
|
1122
|
+
/**
|
|
1123
|
+
* @method
|
|
1124
|
+
* @name gate#watchPositions
|
|
1125
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#positions-subscription
|
|
1126
|
+
* @see https://www.gate.io/docs/developers/delivery/ws/en/#positions-subscription
|
|
1127
|
+
* @see https://www.gate.io/docs/developers/options/ws/en/#positions-channel
|
|
1128
|
+
* @description watch all open positions
|
|
1129
|
+
* @param {string[]} [symbols] list of unified market symbols to watch positions for
|
|
1130
|
+
* @param {int} [since] the earliest time in ms to fetch positions for
|
|
1131
|
+
* @param {int} [limit] the maximum number of positions to retrieve
|
|
1132
|
+
* @param {object} params extra parameters specific to the exchange API endpoint
|
|
1133
|
+
* @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/en/latest/manual.html#position-structure}
|
|
1134
|
+
*/
|
|
1135
|
+
async watchPositions(symbols = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1136
|
+
await this.loadMarkets();
|
|
1137
|
+
let market = undefined;
|
|
1138
|
+
symbols = this.marketSymbols(symbols);
|
|
1139
|
+
const payload = ['!' + 'all'];
|
|
1140
|
+
if (!this.isEmpty(symbols)) {
|
|
1141
|
+
market = this.getMarketFromSymbols(symbols);
|
|
1142
|
+
}
|
|
1143
|
+
let type = undefined;
|
|
1144
|
+
let query = undefined;
|
|
1145
|
+
[type, query] = this.handleMarketTypeAndParams('watchPositions', market, params);
|
|
1146
|
+
if (type === 'spot') {
|
|
1147
|
+
type = 'swap';
|
|
1148
|
+
}
|
|
1149
|
+
const typeId = this.getSupportedMapping(type, {
|
|
1150
|
+
'future': 'futures',
|
|
1151
|
+
'swap': 'futures',
|
|
1152
|
+
'option': 'options',
|
|
1153
|
+
});
|
|
1154
|
+
let messageHash = type + ':positions';
|
|
1155
|
+
if (!this.isEmpty(symbols)) {
|
|
1156
|
+
messageHash += '::' + symbols.join(',');
|
|
1157
|
+
}
|
|
1158
|
+
const channel = typeId + '.positions';
|
|
1159
|
+
let subType = undefined;
|
|
1160
|
+
[subType, query] = this.handleSubTypeAndParams('watchPositions', market, query);
|
|
1161
|
+
const isInverse = (subType === 'inverse');
|
|
1162
|
+
const url = this.getUrlByMarketType(type, isInverse);
|
|
1163
|
+
const client = this.client(url);
|
|
1164
|
+
this.setPositionsCache(client, type, symbols);
|
|
1165
|
+
const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', true);
|
|
1166
|
+
const awaitPositionsSnapshot = this.handleOption('watchPositions', 'awaitPositionsSnapshot', true);
|
|
1167
|
+
const cache = this.safeValue(this.positions, type);
|
|
1168
|
+
if (fetchPositionsSnapshot && awaitPositionsSnapshot && cache === undefined) {
|
|
1169
|
+
return await client.future(type + ':fetchPositionsSnapshot');
|
|
1170
|
+
}
|
|
1171
|
+
const positions = await this.subscribePrivate(url, messageHash, payload, channel, query, true);
|
|
1172
|
+
if (this.newUpdates) {
|
|
1173
|
+
return positions;
|
|
1174
|
+
}
|
|
1175
|
+
return this.filterBySymbolsSinceLimit(this.positions[type], symbols, since, limit, true);
|
|
1176
|
+
}
|
|
1177
|
+
setPositionsCache(client, type, symbols = undefined) {
|
|
1178
|
+
if (this.positions === undefined) {
|
|
1179
|
+
this.positions = {};
|
|
1180
|
+
}
|
|
1181
|
+
if (type in this.positions) {
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
const fetchPositionsSnapshot = this.handleOption('watchPositions', 'fetchPositionsSnapshot', false);
|
|
1185
|
+
if (fetchPositionsSnapshot) {
|
|
1186
|
+
const messageHash = type + ':fetchPositionsSnapshot';
|
|
1187
|
+
if (!(messageHash in client.futures)) {
|
|
1188
|
+
client.future(messageHash);
|
|
1189
|
+
this.spawn(this.loadPositionsSnapshot, client, messageHash, type);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
else {
|
|
1193
|
+
this.positions[type] = new ArrayCacheBySymbolBySide();
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
async loadPositionsSnapshot(client, messageHash, type) {
|
|
1197
|
+
const positions = await this.fetchPositions(undefined, { 'type': type });
|
|
1198
|
+
this.positions[type] = new ArrayCacheBySymbolBySide();
|
|
1199
|
+
const cache = this.positions[type];
|
|
1200
|
+
for (let i = 0; i < positions.length; i++) {
|
|
1201
|
+
const position = positions[i];
|
|
1202
|
+
const contracts = this.safeNumber(position, 'contracts', 0);
|
|
1203
|
+
if (contracts > 0) {
|
|
1204
|
+
cache.append(position);
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
// don't remove the future from the .futures cache
|
|
1208
|
+
const future = client.futures[messageHash];
|
|
1209
|
+
future.resolve(cache);
|
|
1210
|
+
client.resolve(cache, type + ':position');
|
|
1211
|
+
}
|
|
1212
|
+
handlePositions(client, message) {
|
|
1213
|
+
//
|
|
1214
|
+
// {
|
|
1215
|
+
// time: 1693158497,
|
|
1216
|
+
// time_ms: 1693158497204,
|
|
1217
|
+
// channel: 'futures.positions',
|
|
1218
|
+
// event: 'update',
|
|
1219
|
+
// result: [{
|
|
1220
|
+
// contract: 'XRP_USDT',
|
|
1221
|
+
// cross_leverage_limit: 0,
|
|
1222
|
+
// entry_price: 0.5253,
|
|
1223
|
+
// history_pnl: 0,
|
|
1224
|
+
// history_point: 0,
|
|
1225
|
+
// last_close_pnl: 0,
|
|
1226
|
+
// leverage: 0,
|
|
1227
|
+
// leverage_max: 50,
|
|
1228
|
+
// liq_price: 0.0361,
|
|
1229
|
+
// maintenance_rate: 0.01,
|
|
1230
|
+
// margin: 4.89609962852,
|
|
1231
|
+
// mode: 'single',
|
|
1232
|
+
// realised_pnl: -0.0026265,
|
|
1233
|
+
// realised_point: 0,
|
|
1234
|
+
// risk_limit: 500000,
|
|
1235
|
+
// size: 1,
|
|
1236
|
+
// time: 1693158497,
|
|
1237
|
+
// time_ms: 1693158497195,
|
|
1238
|
+
// update_id: 1,
|
|
1239
|
+
// user: '10444586'
|
|
1240
|
+
// }]
|
|
1241
|
+
// }
|
|
1242
|
+
//
|
|
1243
|
+
const type = this.getMarketTypeByUrl(client.url);
|
|
1244
|
+
const data = this.safeValue(message, 'result', []);
|
|
1245
|
+
const cache = this.positions[type];
|
|
1246
|
+
const newPositions = [];
|
|
1247
|
+
for (let i = 0; i < data.length; i++) {
|
|
1248
|
+
const rawPosition = data[i];
|
|
1249
|
+
const position = this.parsePosition(rawPosition);
|
|
1250
|
+
const symbol = this.safeString(position, 'symbol');
|
|
1251
|
+
const side = this.safeString(position, 'side');
|
|
1252
|
+
// Control when position is closed no side is returned
|
|
1253
|
+
if (side === undefined) {
|
|
1254
|
+
const prevLongPosition = this.safeDict(cache, symbol + 'long');
|
|
1255
|
+
if (prevLongPosition !== undefined) {
|
|
1256
|
+
position['side'] = prevLongPosition['side'];
|
|
1257
|
+
newPositions.push(position);
|
|
1258
|
+
cache.append(position);
|
|
1259
|
+
}
|
|
1260
|
+
const prevShortPosition = this.safeDict(cache, symbol + 'short');
|
|
1261
|
+
if (prevShortPosition !== undefined) {
|
|
1262
|
+
position['side'] = prevShortPosition['side'];
|
|
1263
|
+
newPositions.push(position);
|
|
1264
|
+
cache.append(position);
|
|
1265
|
+
}
|
|
1266
|
+
// if no prev position is found, default to long
|
|
1267
|
+
if (prevLongPosition === undefined && prevShortPosition === undefined) {
|
|
1268
|
+
position['side'] = 'long';
|
|
1269
|
+
newPositions.push(position);
|
|
1270
|
+
cache.append(position);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
else {
|
|
1274
|
+
newPositions.push(position);
|
|
1275
|
+
cache.append(position);
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
const messageHashes = this.findMessageHashes(client, type + ':positions::');
|
|
1279
|
+
for (let i = 0; i < messageHashes.length; i++) {
|
|
1280
|
+
const messageHash = messageHashes[i];
|
|
1281
|
+
const parts = messageHash.split('::');
|
|
1282
|
+
const symbolsString = parts[1];
|
|
1283
|
+
const symbols = symbolsString.split(',');
|
|
1284
|
+
const positions = this.filterByArray(newPositions, 'symbol', symbols, false);
|
|
1285
|
+
if (!this.isEmpty(positions)) {
|
|
1286
|
+
client.resolve(positions, messageHash);
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
client.resolve(newPositions, type + ':positions');
|
|
1290
|
+
}
|
|
1291
|
+
/**
|
|
1292
|
+
* @method
|
|
1293
|
+
* @name gate#watchOrders
|
|
1294
|
+
* @description watches information on multiple orders made by the user
|
|
1295
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
1296
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
1297
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
1298
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1299
|
+
* @param {string} [params.type] spot, margin, swap, future, or option. Required if listening to all symbols.
|
|
1300
|
+
* @param {boolean} [params.isInverse] if future, listen to inverse or linear contracts
|
|
1301
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
1302
|
+
*/
|
|
1303
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1304
|
+
await this.loadMarkets();
|
|
1305
|
+
let market = undefined;
|
|
1306
|
+
if (symbol !== undefined) {
|
|
1307
|
+
market = this.market(symbol);
|
|
1308
|
+
symbol = market['symbol'];
|
|
1309
|
+
}
|
|
1310
|
+
let type = undefined;
|
|
1311
|
+
let query = undefined;
|
|
1312
|
+
[type, query] = this.handleMarketTypeAndParams('watchOrders', market, params);
|
|
1313
|
+
const typeId = this.getSupportedMapping(type, {
|
|
1314
|
+
'spot': 'spot',
|
|
1315
|
+
'margin': 'spot',
|
|
1316
|
+
'future': 'futures',
|
|
1317
|
+
'swap': 'futures',
|
|
1318
|
+
'option': 'options',
|
|
1319
|
+
});
|
|
1320
|
+
const channel = typeId + '.orders';
|
|
1321
|
+
let messageHash = 'orders';
|
|
1322
|
+
let payload = ['!' + 'all'];
|
|
1323
|
+
if (symbol !== undefined) {
|
|
1324
|
+
messageHash += ':' + market['id'];
|
|
1325
|
+
payload = [market['id']];
|
|
1326
|
+
}
|
|
1327
|
+
let subType = undefined;
|
|
1328
|
+
[subType, query] = this.handleSubTypeAndParams('watchOrders', market, query);
|
|
1329
|
+
const isInverse = (subType === 'inverse');
|
|
1330
|
+
const url = this.getUrlByMarketType(type, isInverse);
|
|
1331
|
+
// uid required for non spot markets
|
|
1332
|
+
const requiresUid = (type !== 'spot');
|
|
1333
|
+
const orders = await this.subscribePrivate(url, messageHash, payload, channel, query, requiresUid);
|
|
1334
|
+
if (this.newUpdates) {
|
|
1335
|
+
limit = orders.getLimit(symbol, limit);
|
|
1336
|
+
}
|
|
1337
|
+
return this.filterBySinceLimit(orders, since, limit, 'timestamp', true);
|
|
1338
|
+
}
|
|
1339
|
+
handleOrder(client, message) {
|
|
1340
|
+
//
|
|
1341
|
+
// {
|
|
1342
|
+
// "time": 1605175506,
|
|
1343
|
+
// "channel": "spot.orders",
|
|
1344
|
+
// "event": "update",
|
|
1345
|
+
// "result": [
|
|
1346
|
+
// {
|
|
1347
|
+
// "id": "30784435",
|
|
1348
|
+
// "user": 123456,
|
|
1349
|
+
// "text": "t-abc",
|
|
1350
|
+
// "create_time": "1605175506",
|
|
1351
|
+
// "create_time_ms": "1605175506123",
|
|
1352
|
+
// "update_time": "1605175506",
|
|
1353
|
+
// "update_time_ms": "1605175506123",
|
|
1354
|
+
// "event": "put",
|
|
1355
|
+
// "currency_pair": "BTC_USDT",
|
|
1356
|
+
// "type": "limit",
|
|
1357
|
+
// "account": "spot",
|
|
1358
|
+
// "side": "sell",
|
|
1359
|
+
// "amount": "1",
|
|
1360
|
+
// "price": "10001",
|
|
1361
|
+
// "time_in_force": "gtc",
|
|
1362
|
+
// "left": "1",
|
|
1363
|
+
// "filled_total": "0",
|
|
1364
|
+
// "fee": "0",
|
|
1365
|
+
// "fee_currency": "USDT",
|
|
1366
|
+
// "point_fee": "0",
|
|
1367
|
+
// "gt_fee": "0",
|
|
1368
|
+
// "gt_discount": true,
|
|
1369
|
+
// "rebated_fee": "0",
|
|
1370
|
+
// "rebated_fee_currency": "USDT"
|
|
1371
|
+
// }
|
|
1372
|
+
// ]
|
|
1373
|
+
// }
|
|
1374
|
+
//
|
|
1375
|
+
const orders = this.safeValue(message, 'result', []);
|
|
1376
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
1377
|
+
if (this.orders === undefined) {
|
|
1378
|
+
this.orders = new ArrayCacheBySymbolById(limit);
|
|
1379
|
+
}
|
|
1380
|
+
const stored = this.orders;
|
|
1381
|
+
const marketIds = {};
|
|
1382
|
+
const parsedOrders = this.parseOrders(orders);
|
|
1383
|
+
for (let i = 0; i < parsedOrders.length; i++) {
|
|
1384
|
+
const parsed = parsedOrders[i];
|
|
1385
|
+
// inject order status
|
|
1386
|
+
const info = this.safeValue(parsed, 'info');
|
|
1387
|
+
const event = this.safeString(info, 'event');
|
|
1388
|
+
if (event === 'put' || event === 'update') {
|
|
1389
|
+
parsed['status'] = 'open';
|
|
1390
|
+
}
|
|
1391
|
+
else if (event === 'finish') {
|
|
1392
|
+
const status = this.safeString(parsed, 'status');
|
|
1393
|
+
if (status === undefined) {
|
|
1394
|
+
const left = this.safeInteger(info, 'left');
|
|
1395
|
+
parsed['status'] = (left === 0) ? 'closed' : 'canceled';
|
|
1396
|
+
}
|
|
1397
|
+
}
|
|
1398
|
+
stored.append(parsed);
|
|
1399
|
+
const symbol = parsed['symbol'];
|
|
1400
|
+
const market = this.market(symbol);
|
|
1401
|
+
marketIds[market['id']] = true;
|
|
1402
|
+
}
|
|
1403
|
+
const keys = Object.keys(marketIds);
|
|
1404
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1405
|
+
const messageHash = 'orders:' + keys[i];
|
|
1406
|
+
client.resolve(this.orders, messageHash);
|
|
1407
|
+
}
|
|
1408
|
+
client.resolve(this.orders, 'orders');
|
|
1409
|
+
}
|
|
1410
|
+
/**
|
|
1411
|
+
* @method
|
|
1412
|
+
* @name gate#watchMyLiquidations
|
|
1413
|
+
* @description watch the public liquidations of a trading pair
|
|
1414
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#liquidates-api
|
|
1415
|
+
* @see https://www.gate.io/docs/developers/delivery/ws/en/#liquidates-api
|
|
1416
|
+
* @see https://www.gate.io/docs/developers/options/ws/en/#liquidates-channel
|
|
1417
|
+
* @param {string} symbol unified CCXT market symbol
|
|
1418
|
+
* @param {int} [since] the earliest time in ms to fetch liquidations for
|
|
1419
|
+
* @param {int} [limit] the maximum number of liquidation structures to retrieve
|
|
1420
|
+
* @param {object} [params] exchange specific parameters for the bitmex api endpoint
|
|
1421
|
+
* @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
|
|
1422
|
+
*/
|
|
1423
|
+
async watchMyLiquidations(symbol, since = undefined, limit = undefined, params = {}) {
|
|
1424
|
+
return this.watchMyLiquidationsForSymbols([symbol], since, limit, params);
|
|
1425
|
+
}
|
|
1426
|
+
/**
|
|
1427
|
+
* @method
|
|
1428
|
+
* @name gate#watchMyLiquidationsForSymbols
|
|
1429
|
+
* @description watch the private liquidations of a trading pair
|
|
1430
|
+
* @see https://www.gate.io/docs/developers/futures/ws/en/#liquidates-api
|
|
1431
|
+
* @see https://www.gate.io/docs/developers/delivery/ws/en/#liquidates-api
|
|
1432
|
+
* @see https://www.gate.io/docs/developers/options/ws/en/#liquidates-channel
|
|
1433
|
+
* @param {string[]} symbols unified CCXT market symbols
|
|
1434
|
+
* @param {int} [since] the earliest time in ms to fetch liquidations for
|
|
1435
|
+
* @param {int} [limit] the maximum number of liquidation structures to retrieve
|
|
1436
|
+
* @param {object} [params] exchange specific parameters for the gate api endpoint
|
|
1437
|
+
* @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
|
|
1438
|
+
*/
|
|
1439
|
+
async watchMyLiquidationsForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
1440
|
+
await this.loadMarkets();
|
|
1441
|
+
symbols = this.marketSymbols(symbols, undefined, true, true);
|
|
1442
|
+
const market = this.getMarketFromSymbols(symbols);
|
|
1443
|
+
let type = undefined;
|
|
1444
|
+
let query = undefined;
|
|
1445
|
+
[type, query] = this.handleMarketTypeAndParams('watchMyLiquidationsForSymbols', market, params);
|
|
1446
|
+
const typeId = this.getSupportedMapping(type, {
|
|
1447
|
+
'future': 'futures',
|
|
1448
|
+
'swap': 'futures',
|
|
1449
|
+
'option': 'options',
|
|
1450
|
+
});
|
|
1451
|
+
let subType = undefined;
|
|
1452
|
+
[subType, query] = this.handleSubTypeAndParams('watchMyLiquidationsForSymbols', market, query);
|
|
1453
|
+
const isInverse = (subType === 'inverse');
|
|
1454
|
+
const url = this.getUrlByMarketType(type, isInverse);
|
|
1455
|
+
const payload = [];
|
|
1456
|
+
let messageHash = '';
|
|
1457
|
+
if (this.isEmpty(symbols)) {
|
|
1458
|
+
if (typeId !== 'futures' && !isInverse) {
|
|
1459
|
+
throw new BadRequest(this.id + ' watchMyLiquidationsForSymbols() does not support listening to all symbols, you must call watchMyLiquidations() instead for each symbol you wish to watch.');
|
|
1460
|
+
}
|
|
1461
|
+
messageHash = 'myLiquidations';
|
|
1462
|
+
payload.push('!all');
|
|
1463
|
+
}
|
|
1464
|
+
else {
|
|
1465
|
+
const symbolsLength = symbols.length;
|
|
1466
|
+
if (symbolsLength !== 1) {
|
|
1467
|
+
throw new BadRequest(this.id + ' watchMyLiquidationsForSymbols() only allows one symbol at a time. To listen to several symbols call watchMyLiquidationsForSymbols() several times.');
|
|
1468
|
+
}
|
|
1469
|
+
messageHash = 'myLiquidations::' + symbols[0];
|
|
1470
|
+
payload.push(market['id']);
|
|
1471
|
+
}
|
|
1472
|
+
const channel = typeId + '.liquidates';
|
|
1473
|
+
const newLiquidations = await this.subscribePrivate(url, messageHash, payload, channel, query, true);
|
|
1474
|
+
if (this.newUpdates) {
|
|
1475
|
+
return newLiquidations;
|
|
1476
|
+
}
|
|
1477
|
+
return this.filterBySymbolsSinceLimit(this.liquidations, symbols, since, limit, true);
|
|
1478
|
+
}
|
|
1479
|
+
handleLiquidation(client, message) {
|
|
1480
|
+
//
|
|
1481
|
+
// future / delivery
|
|
1482
|
+
// {
|
|
1483
|
+
// "channel":"futures.liquidates",
|
|
1484
|
+
// "event":"update",
|
|
1485
|
+
// "time":1541505434,
|
|
1486
|
+
// "time_ms":1541505434123,
|
|
1487
|
+
// "result":[
|
|
1488
|
+
// {
|
|
1489
|
+
// "entry_price":209,
|
|
1490
|
+
// "fill_price":215.1,
|
|
1491
|
+
// "left":0,
|
|
1492
|
+
// "leverage":0.0,
|
|
1493
|
+
// "liq_price":213,
|
|
1494
|
+
// "margin":0.007816722941,
|
|
1495
|
+
// "mark_price":213,
|
|
1496
|
+
// "order_id":4093362,
|
|
1497
|
+
// "order_price":215.1,
|
|
1498
|
+
// "size":-124,
|
|
1499
|
+
// "time":1541486601,
|
|
1500
|
+
// "time_ms":1541486601123,
|
|
1501
|
+
// "contract":"BTC_USD",
|
|
1502
|
+
// "user":"1040xxxx"
|
|
1503
|
+
// }
|
|
1504
|
+
// ]
|
|
1505
|
+
// }
|
|
1506
|
+
// option
|
|
1507
|
+
// {
|
|
1508
|
+
// "channel":"options.liquidates",
|
|
1509
|
+
// "event":"update",
|
|
1510
|
+
// "time":1630654851,
|
|
1511
|
+
// "result":[
|
|
1512
|
+
// {
|
|
1513
|
+
// "user":"1xxxx",
|
|
1514
|
+
// "init_margin":1190,
|
|
1515
|
+
// "maint_margin":1042.5,
|
|
1516
|
+
// "order_margin":0,
|
|
1517
|
+
// "time":1639051907,
|
|
1518
|
+
// "time_ms":1639051907000
|
|
1519
|
+
// }
|
|
1520
|
+
// ]
|
|
1521
|
+
// }
|
|
1522
|
+
//
|
|
1523
|
+
const rawLiquidations = this.safeList(message, 'result', []);
|
|
1524
|
+
const newLiquidations = [];
|
|
1525
|
+
for (let i = 0; i < rawLiquidations.length; i++) {
|
|
1526
|
+
const rawLiquidation = rawLiquidations[i];
|
|
1527
|
+
const liquidation = this.parseWsLiquidation(rawLiquidation);
|
|
1528
|
+
const symbol = this.safeString(liquidation, 'symbol');
|
|
1529
|
+
let liquidations = this.safeValue(this.liquidations, symbol);
|
|
1530
|
+
if (liquidations === undefined) {
|
|
1531
|
+
const limit = this.safeInteger(this.options, 'liquidationsLimit', 1000);
|
|
1532
|
+
liquidations = new ArrayCache(limit);
|
|
1533
|
+
}
|
|
1534
|
+
liquidations.append(liquidation);
|
|
1535
|
+
this.liquidations[symbol] = liquidations;
|
|
1536
|
+
client.resolve(liquidations, 'myLiquidations::' + symbol);
|
|
1537
|
+
}
|
|
1538
|
+
client.resolve(newLiquidations, 'myLiquidations');
|
|
1539
|
+
}
|
|
1540
|
+
parseWsLiquidation(liquidation, market = undefined) {
|
|
1541
|
+
//
|
|
1542
|
+
// future / delivery
|
|
1543
|
+
// {
|
|
1544
|
+
// "entry_price": 209,
|
|
1545
|
+
// "fill_price": 215.1,
|
|
1546
|
+
// "left": 0,
|
|
1547
|
+
// "leverage": 0.0,
|
|
1548
|
+
// "liq_price": 213,
|
|
1549
|
+
// "margin": 0.007816722941,
|
|
1550
|
+
// "mark_price": 213,
|
|
1551
|
+
// "order_id": 4093362,
|
|
1552
|
+
// "order_price": 215.1,
|
|
1553
|
+
// "size": -124,
|
|
1554
|
+
// "time": 1541486601,
|
|
1555
|
+
// "time_ms": 1541486601123,
|
|
1556
|
+
// "contract": "BTC_USD",
|
|
1557
|
+
// "user": "1040xxxx"
|
|
1558
|
+
// }
|
|
1559
|
+
// option
|
|
1560
|
+
// {
|
|
1561
|
+
// "user": "1xxxx",
|
|
1562
|
+
// "init_margin": 1190,
|
|
1563
|
+
// "maint_margin": 1042.5,
|
|
1564
|
+
// "order_margin": 0,
|
|
1565
|
+
// "time": 1639051907,
|
|
1566
|
+
// "time_ms": 1639051907000
|
|
1567
|
+
// }
|
|
1568
|
+
//
|
|
1569
|
+
const marketId = this.safeString(liquidation, 'contract');
|
|
1570
|
+
market = this.safeMarket(marketId, market);
|
|
1571
|
+
const timestamp = this.safeInteger(liquidation, 'time_ms');
|
|
1572
|
+
const originalSize = this.safeString(liquidation, 'size');
|
|
1573
|
+
const left = this.safeString(liquidation, 'left');
|
|
1574
|
+
const amount = Precise.stringAbs(Precise.stringSub(originalSize, left));
|
|
1575
|
+
return this.safeLiquidation({
|
|
1576
|
+
'info': liquidation,
|
|
1577
|
+
'symbol': this.safeSymbol(marketId, market),
|
|
1578
|
+
'contracts': this.parseNumber(amount),
|
|
1579
|
+
'contractSize': this.safeNumber(market, 'contractSize'),
|
|
1580
|
+
'price': this.safeNumber(liquidation, 'fill_price'),
|
|
1581
|
+
'baseValue': undefined,
|
|
1582
|
+
'quoteValue': undefined,
|
|
1583
|
+
'timestamp': timestamp,
|
|
1584
|
+
'datetime': this.iso8601(timestamp),
|
|
1585
|
+
});
|
|
1586
|
+
}
|
|
1587
|
+
handleErrorMessage(client, message) {
|
|
1588
|
+
//
|
|
1589
|
+
// {
|
|
1590
|
+
// "time": 1647274664,
|
|
1591
|
+
// "channel": "futures.orders",
|
|
1592
|
+
// "event": "subscribe",
|
|
1593
|
+
// "error": { code: 2, message: "unknown contract BTC_USDT_20220318" },
|
|
1594
|
+
// }
|
|
1595
|
+
// {
|
|
1596
|
+
// "time": 1647276473,
|
|
1597
|
+
// "channel": "futures.orders",
|
|
1598
|
+
// "event": "subscribe",
|
|
1599
|
+
// "error": {
|
|
1600
|
+
// "code": 4,
|
|
1601
|
+
// "message": "{"label":"INVALID_KEY","message":"Invalid key provided"}\n"
|
|
1602
|
+
// },
|
|
1603
|
+
// "result": null
|
|
1604
|
+
// }
|
|
1605
|
+
// {
|
|
1606
|
+
// header: {
|
|
1607
|
+
// response_time: '1718551891329',
|
|
1608
|
+
// status: '400',
|
|
1609
|
+
// channel: 'spot.order_place',
|
|
1610
|
+
// event: 'api',
|
|
1611
|
+
// client_id: '81.34.68.6-0xc16375e2c0',
|
|
1612
|
+
// conn_id: '9539116e0e09678f'
|
|
1613
|
+
// },
|
|
1614
|
+
// data: { errs: { label: 'AUTHENTICATION_FAILED', message: 'Not login' } },
|
|
1615
|
+
// request_id: '10406147'
|
|
1616
|
+
// }
|
|
1617
|
+
// {
|
|
1618
|
+
// "time": 1739853211,
|
|
1619
|
+
// "time_ms": 1739853211201,
|
|
1620
|
+
// "id": 1,
|
|
1621
|
+
// "conn_id": "62f2c1dabbe186d7",
|
|
1622
|
+
// "trace_id": "cdb02a8c0b61086b2fe6f8fad2f98c54",
|
|
1623
|
+
// "channel": "spot.trades",
|
|
1624
|
+
// "event": "subscribe",
|
|
1625
|
+
// "payload": [
|
|
1626
|
+
// "LUNARLENS_USDT",
|
|
1627
|
+
// "ETH_USDT"
|
|
1628
|
+
// ],
|
|
1629
|
+
// "error": {
|
|
1630
|
+
// "code": 2,
|
|
1631
|
+
// "message": "unknown currency pair: LUNARLENS_USDT"
|
|
1632
|
+
// },
|
|
1633
|
+
// "result": {
|
|
1634
|
+
// "status": "fail"
|
|
1635
|
+
// },
|
|
1636
|
+
// "requestId": "cdb02a8c0b61086b2fe6f8fad2f98c54"
|
|
1637
|
+
// }
|
|
1638
|
+
//
|
|
1639
|
+
const data = this.safeDict(message, 'data');
|
|
1640
|
+
const errs = this.safeDict(data, 'errs');
|
|
1641
|
+
const error = this.safeDict(message, 'error', errs);
|
|
1642
|
+
const code = this.safeString2(error, 'code', 'label');
|
|
1643
|
+
const id = this.safeStringN(message, ['id', 'requestId', 'request_id']);
|
|
1644
|
+
if (error !== undefined) {
|
|
1645
|
+
const messageHash = this.safeString(client.subscriptions, id);
|
|
1646
|
+
try {
|
|
1647
|
+
this.throwExactlyMatchedException(this.exceptions['ws']['exact'], code, this.json(message));
|
|
1648
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], code, this.json(errs));
|
|
1649
|
+
const errorMessage = this.safeString(error, 'message', this.safeString(errs, 'message'));
|
|
1650
|
+
this.throwBroadlyMatchedException(this.exceptions['ws']['broad'], errorMessage, this.json(message));
|
|
1651
|
+
throw new ExchangeError(this.json(message));
|
|
1652
|
+
}
|
|
1653
|
+
catch (e) {
|
|
1654
|
+
client.reject(e, messageHash);
|
|
1655
|
+
if ((messageHash !== undefined) && (messageHash in client.subscriptions)) {
|
|
1656
|
+
delete client.subscriptions[messageHash];
|
|
1657
|
+
}
|
|
1658
|
+
// remove subscriptions for watchSymbols
|
|
1659
|
+
const channel = this.safeString(message, 'channel');
|
|
1660
|
+
if ((channel !== undefined) && (channel.indexOf('.') > 0)) {
|
|
1661
|
+
const parsedChannel = channel.split('.');
|
|
1662
|
+
const payload = this.safeList(message, 'payload', []);
|
|
1663
|
+
for (let i = 0; i < payload.length; i++) {
|
|
1664
|
+
const marketType = parsedChannel[0] === 'futures' ? 'swap' : parsedChannel[0];
|
|
1665
|
+
const symbol = this.safeSymbol(payload[i], undefined, '_', marketType);
|
|
1666
|
+
const messageHashSymbol = parsedChannel[1] + ':' + symbol;
|
|
1667
|
+
if ((messageHashSymbol !== undefined) && (messageHashSymbol in client.subscriptions)) {
|
|
1668
|
+
delete client.subscriptions[messageHashSymbol];
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
if ((id !== undefined) && (id in client.subscriptions)) {
|
|
1674
|
+
delete client.subscriptions[id];
|
|
1675
|
+
}
|
|
1676
|
+
return true;
|
|
1677
|
+
}
|
|
1678
|
+
return false;
|
|
1679
|
+
}
|
|
1680
|
+
handleBalanceSubscription(client, message, subscription = undefined) {
|
|
1681
|
+
this.balance = {};
|
|
1682
|
+
}
|
|
1683
|
+
handleSubscriptionStatus(client, message) {
|
|
1684
|
+
const channel = this.safeString(message, 'channel');
|
|
1685
|
+
const methods = {
|
|
1686
|
+
'balance': this.handleBalanceSubscription,
|
|
1687
|
+
'spot.order_book_update': this.handleOrderBookSubscription,
|
|
1688
|
+
'futures.order_book_update': this.handleOrderBookSubscription,
|
|
1689
|
+
};
|
|
1690
|
+
const id = this.safeString(message, 'id');
|
|
1691
|
+
if (channel in methods) {
|
|
1692
|
+
const subscriptionHash = this.safeString(client.subscriptions, id);
|
|
1693
|
+
const subscription = this.safeValue(client.subscriptions, subscriptionHash);
|
|
1694
|
+
const method = methods[channel];
|
|
1695
|
+
method.call(this, client, message, subscription);
|
|
1696
|
+
}
|
|
1697
|
+
if (id in client.subscriptions) {
|
|
1698
|
+
delete client.subscriptions[id];
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1701
|
+
handleUnSubscribe(client, message) {
|
|
1702
|
+
//
|
|
1703
|
+
// {
|
|
1704
|
+
// "time":1725534679,
|
|
1705
|
+
// "time_ms":1725534679786,
|
|
1706
|
+
// "id":2,
|
|
1707
|
+
// "conn_id":"fac539b443fd7002",
|
|
1708
|
+
// "trace_id":"efe1d282b630b4aa266b84bee177791a",
|
|
1709
|
+
// "channel":"spot.trades",
|
|
1710
|
+
// "event":"unsubscribe",
|
|
1711
|
+
// "payload":[
|
|
1712
|
+
// "LTC_USDT"
|
|
1713
|
+
// ],
|
|
1714
|
+
// "result":{
|
|
1715
|
+
// "status":"success"
|
|
1716
|
+
// },
|
|
1717
|
+
// "requestId":"efe1d282b630b4aa266b84bee177791a"
|
|
1718
|
+
// }
|
|
1719
|
+
//
|
|
1720
|
+
const id = this.safeString(message, 'id');
|
|
1721
|
+
const keys = Object.keys(client.subscriptions);
|
|
1722
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1723
|
+
const messageHash = keys[i];
|
|
1724
|
+
if (!(messageHash in client.subscriptions)) {
|
|
1725
|
+
continue;
|
|
1726
|
+
// the previous iteration can have deleted the messageHash from the subscriptions
|
|
1727
|
+
}
|
|
1728
|
+
if (messageHash.startsWith('unsubscribe')) {
|
|
1729
|
+
const subscription = client.subscriptions[messageHash];
|
|
1730
|
+
const subId = this.safeString(subscription, 'id');
|
|
1731
|
+
if (id !== subId) {
|
|
1732
|
+
continue;
|
|
1733
|
+
}
|
|
1734
|
+
const messageHashes = this.safeList(subscription, 'messageHashes', []);
|
|
1735
|
+
const subMessageHashes = this.safeList(subscription, 'subMessageHashes', []);
|
|
1736
|
+
for (let j = 0; j < messageHashes.length; j++) {
|
|
1737
|
+
const unsubHash = messageHashes[j];
|
|
1738
|
+
const subHash = subMessageHashes[j];
|
|
1739
|
+
this.cleanUnsubscription(client, subHash, unsubHash);
|
|
1740
|
+
}
|
|
1741
|
+
this.cleanCache(subscription);
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
cleanCache(subscription) {
|
|
1746
|
+
const topic = this.safeString(subscription, 'topic', '');
|
|
1747
|
+
const symbols = this.safeList(subscription, 'symbols', []);
|
|
1748
|
+
const symbolsLength = symbols.length;
|
|
1749
|
+
if (topic === 'ohlcv') {
|
|
1750
|
+
const symbolsAndTimeFrames = this.safeList(subscription, 'symbolsAndTimeframes', []);
|
|
1751
|
+
for (let i = 0; i < symbolsAndTimeFrames.length; i++) {
|
|
1752
|
+
const symbolAndTimeFrame = symbolsAndTimeFrames[i];
|
|
1753
|
+
const symbol = this.safeString(symbolAndTimeFrame, 0);
|
|
1754
|
+
const timeframe = this.safeString(symbolAndTimeFrame, 1);
|
|
1755
|
+
delete this.ohlcvs[symbol][timeframe];
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
else if (symbolsLength > 0) {
|
|
1759
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
1760
|
+
const symbol = symbols[i];
|
|
1761
|
+
if (topic.endsWith('trades')) {
|
|
1762
|
+
delete this.trades[symbol];
|
|
1763
|
+
}
|
|
1764
|
+
else if (topic === 'orderbook') {
|
|
1765
|
+
delete this.orderbooks[symbol];
|
|
1766
|
+
}
|
|
1767
|
+
else if (topic === 'ticker') {
|
|
1768
|
+
delete this.tickers[symbol];
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
else {
|
|
1773
|
+
if (topic.endsWith('trades')) {
|
|
1774
|
+
// don't reset this.myTrades directly here
|
|
1775
|
+
// because in c# we need to use a different object
|
|
1776
|
+
const keys = Object.keys(this.trades);
|
|
1777
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1778
|
+
delete this.trades[keys[i]];
|
|
1779
|
+
}
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
handleMessage(client, message) {
|
|
1784
|
+
//
|
|
1785
|
+
// subscribe
|
|
1786
|
+
// {
|
|
1787
|
+
// "time": 1649062304,
|
|
1788
|
+
// "id": 1649062303,
|
|
1789
|
+
// "channel": "spot.candlesticks",
|
|
1790
|
+
// "event": "subscribe",
|
|
1791
|
+
// "result": { status: "success" }
|
|
1792
|
+
// }
|
|
1793
|
+
//
|
|
1794
|
+
// candlestick
|
|
1795
|
+
// {
|
|
1796
|
+
// "time": 1649063328,
|
|
1797
|
+
// "channel": "spot.candlesticks",
|
|
1798
|
+
// "event": "update",
|
|
1799
|
+
// "result": {
|
|
1800
|
+
// "t": "1649063280",
|
|
1801
|
+
// "v": "58932.23174896",
|
|
1802
|
+
// "c": "45966.47",
|
|
1803
|
+
// "h": "45997.24",
|
|
1804
|
+
// "l": "45966.47",
|
|
1805
|
+
// "o": "45975.18",
|
|
1806
|
+
// "n": "1m_BTC_USDT",
|
|
1807
|
+
// "a": "1.281699"
|
|
1808
|
+
// }
|
|
1809
|
+
// }
|
|
1810
|
+
//
|
|
1811
|
+
// orders
|
|
1812
|
+
// {
|
|
1813
|
+
// "time": 1630654851,
|
|
1814
|
+
// "channel": "options.orders", or futures.orders or spot.orders
|
|
1815
|
+
// "event": "update",
|
|
1816
|
+
// "result": [
|
|
1817
|
+
// {
|
|
1818
|
+
// "contract": "BTC_USDT-20211130-65000-C",
|
|
1819
|
+
// "create_time": 1637897000,
|
|
1820
|
+
// (...)
|
|
1821
|
+
// ]
|
|
1822
|
+
// }
|
|
1823
|
+
// orderbook
|
|
1824
|
+
// {
|
|
1825
|
+
// "time": 1649770525,
|
|
1826
|
+
// "channel": "spot.order_book_update",
|
|
1827
|
+
// "event": "update",
|
|
1828
|
+
// "result": {
|
|
1829
|
+
// "t": 1649770525653,
|
|
1830
|
+
// "e": "depthUpdate",
|
|
1831
|
+
// "E": 1649770525,
|
|
1832
|
+
// "s": "LTC_USDT",
|
|
1833
|
+
// "U": 2622525645,
|
|
1834
|
+
// "u": 2622525665,
|
|
1835
|
+
// "b": [
|
|
1836
|
+
// [Array], [Array],
|
|
1837
|
+
// [Array], [Array],
|
|
1838
|
+
// [Array], [Array],
|
|
1839
|
+
// [Array], [Array],
|
|
1840
|
+
// [Array], [Array],
|
|
1841
|
+
// [Array]
|
|
1842
|
+
// ],
|
|
1843
|
+
// "a": [
|
|
1844
|
+
// [Array], [Array],
|
|
1845
|
+
// [Array], [Array],
|
|
1846
|
+
// [Array], [Array],
|
|
1847
|
+
// [Array], [Array],
|
|
1848
|
+
// [Array], [Array],
|
|
1849
|
+
// [Array]
|
|
1850
|
+
// ]
|
|
1851
|
+
// }
|
|
1852
|
+
// }
|
|
1853
|
+
//
|
|
1854
|
+
// balance update
|
|
1855
|
+
//
|
|
1856
|
+
// {
|
|
1857
|
+
// "time": 1653664351,
|
|
1858
|
+
// "channel": "spot.balances",
|
|
1859
|
+
// "event": "update",
|
|
1860
|
+
// "result": [
|
|
1861
|
+
// {
|
|
1862
|
+
// "timestamp": "1653664351",
|
|
1863
|
+
// "timestamp_ms": "1653664351017",
|
|
1864
|
+
// "user": "10406147",
|
|
1865
|
+
// "currency": "LTC",
|
|
1866
|
+
// "change": "-0.0002000000000000",
|
|
1867
|
+
// "total": "0.09986000000000000000",
|
|
1868
|
+
// "available": "0.09986000000000000000"
|
|
1869
|
+
// }
|
|
1870
|
+
// ]
|
|
1871
|
+
// }
|
|
1872
|
+
//
|
|
1873
|
+
if (this.handleErrorMessage(client, message)) {
|
|
1874
|
+
return;
|
|
1875
|
+
}
|
|
1876
|
+
const event = this.safeString(message, 'event');
|
|
1877
|
+
if (event === 'subscribe') {
|
|
1878
|
+
this.handleSubscriptionStatus(client, message);
|
|
1879
|
+
return;
|
|
1880
|
+
}
|
|
1881
|
+
if (event === 'unsubscribe') {
|
|
1882
|
+
this.handleUnSubscribe(client, message);
|
|
1883
|
+
return;
|
|
1884
|
+
}
|
|
1885
|
+
const channel = this.safeString(message, 'channel', '');
|
|
1886
|
+
const channelParts = channel.split('.');
|
|
1887
|
+
const channelType = this.safeValue(channelParts, 1);
|
|
1888
|
+
const v4Methods = {
|
|
1889
|
+
'usertrades': this.handleMyTrades,
|
|
1890
|
+
'candlesticks': this.handleOHLCV,
|
|
1891
|
+
'orders': this.handleOrder,
|
|
1892
|
+
'positions': this.handlePositions,
|
|
1893
|
+
'tickers': this.handleTicker,
|
|
1894
|
+
'book_ticker': this.handleBidAsk,
|
|
1895
|
+
'trades': this.handleTrades,
|
|
1896
|
+
'order_book_update': this.handleOrderBook,
|
|
1897
|
+
'balances': this.handleBalance,
|
|
1898
|
+
'liquidates': this.handleLiquidation,
|
|
1899
|
+
};
|
|
1900
|
+
const method = this.safeValue(v4Methods, channelType);
|
|
1901
|
+
if (method !== undefined) {
|
|
1902
|
+
method.call(this, client, message);
|
|
1903
|
+
}
|
|
1904
|
+
const requestId = this.safeString(message, 'request_id');
|
|
1905
|
+
if (requestId === 'authenticated') {
|
|
1906
|
+
this.handleAuthenticationMessage(client, message);
|
|
1907
|
+
return;
|
|
1908
|
+
}
|
|
1909
|
+
if (requestId !== undefined) {
|
|
1910
|
+
const data = this.safeDict(message, 'data');
|
|
1911
|
+
// use safeValue as result may be Array or an Object
|
|
1912
|
+
const result = this.safeValue(data, 'result');
|
|
1913
|
+
const ack = this.safeBool(message, 'ack');
|
|
1914
|
+
if (ack !== true) {
|
|
1915
|
+
client.resolve(result, requestId);
|
|
1916
|
+
}
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
getUrlByMarket(market) {
|
|
1920
|
+
const baseUrl = this.urls['api'][market['type']];
|
|
1921
|
+
if (market['contract']) {
|
|
1922
|
+
return market['linear'] ? baseUrl['usdt'] : baseUrl['btc'];
|
|
1923
|
+
}
|
|
1924
|
+
else {
|
|
1925
|
+
return baseUrl;
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
getTypeByMarket(market) {
|
|
1929
|
+
if (market['spot']) {
|
|
1930
|
+
return 'spot';
|
|
1931
|
+
}
|
|
1932
|
+
else if (market['option']) {
|
|
1933
|
+
return 'options';
|
|
1934
|
+
}
|
|
1935
|
+
else {
|
|
1936
|
+
return 'futures';
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
getUrlByMarketType(type, isInverse = false) {
|
|
1940
|
+
const api = this.urls['api'];
|
|
1941
|
+
const url = api[type];
|
|
1942
|
+
if ((type === 'swap') || (type === 'future')) {
|
|
1943
|
+
return isInverse ? url['btc'] : url['usdt'];
|
|
1944
|
+
}
|
|
1945
|
+
else {
|
|
1946
|
+
return url;
|
|
1947
|
+
}
|
|
1948
|
+
}
|
|
1949
|
+
getMarketTypeByUrl(url) {
|
|
1950
|
+
const findBy = {
|
|
1951
|
+
'op-': 'option',
|
|
1952
|
+
'delivery': 'future',
|
|
1953
|
+
'fx': 'swap',
|
|
1954
|
+
};
|
|
1955
|
+
const keys = Object.keys(findBy);
|
|
1956
|
+
for (let i = 0; i < keys.length; i++) {
|
|
1957
|
+
const key = keys[i];
|
|
1958
|
+
const value = findBy[key];
|
|
1959
|
+
if (url.indexOf(key) >= 0) {
|
|
1960
|
+
return value;
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
return 'spot';
|
|
1964
|
+
}
|
|
1965
|
+
requestId() {
|
|
1966
|
+
// their support said that reqid must be an int32, not documented
|
|
1967
|
+
const reqid = this.sum(this.safeInteger(this.options, 'reqid', 0), 1);
|
|
1968
|
+
this.options['reqid'] = reqid;
|
|
1969
|
+
return reqid;
|
|
1970
|
+
}
|
|
1971
|
+
async subscribePublic(url, messageHash, payload, channel, params = {}, subscription = undefined) {
|
|
1972
|
+
const requestId = this.requestId();
|
|
1973
|
+
const time = this.seconds();
|
|
1974
|
+
const request = {
|
|
1975
|
+
'id': requestId,
|
|
1976
|
+
'time': time,
|
|
1977
|
+
'channel': channel,
|
|
1978
|
+
'event': 'subscribe',
|
|
1979
|
+
'payload': payload,
|
|
1980
|
+
};
|
|
1981
|
+
if (subscription !== undefined) {
|
|
1982
|
+
const client = this.client(url);
|
|
1983
|
+
if (!(messageHash in client.subscriptions)) {
|
|
1984
|
+
const tempSubscriptionHash = requestId.toString();
|
|
1985
|
+
client.subscriptions[tempSubscriptionHash] = messageHash;
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
const message = this.extend(request, params);
|
|
1989
|
+
return await this.watch(url, messageHash, message, messageHash, subscription);
|
|
1990
|
+
}
|
|
1991
|
+
async subscribePublicMultiple(url, messageHashes, payload, channel, params = {}) {
|
|
1992
|
+
const requestId = this.requestId();
|
|
1993
|
+
const time = this.seconds();
|
|
1994
|
+
const request = {
|
|
1995
|
+
'id': requestId,
|
|
1996
|
+
'time': time,
|
|
1997
|
+
'channel': channel,
|
|
1998
|
+
'event': 'subscribe',
|
|
1999
|
+
'payload': payload,
|
|
2000
|
+
};
|
|
2001
|
+
const message = this.extend(request, params);
|
|
2002
|
+
return await this.watchMultiple(url, messageHashes, message, messageHashes);
|
|
2003
|
+
}
|
|
2004
|
+
async unSubscribePublicMultiple(url, topic, symbols, messageHashes, subMessageHashes, payload, channel, params = {}) {
|
|
2005
|
+
const requestId = this.requestId();
|
|
2006
|
+
const time = this.seconds();
|
|
2007
|
+
const request = {
|
|
2008
|
+
'id': requestId,
|
|
2009
|
+
'time': time,
|
|
2010
|
+
'channel': channel,
|
|
2011
|
+
'event': 'unsubscribe',
|
|
2012
|
+
'payload': payload,
|
|
2013
|
+
};
|
|
2014
|
+
const sub = {
|
|
2015
|
+
'id': requestId.toString(),
|
|
2016
|
+
'topic': topic,
|
|
2017
|
+
'unsubscribe': true,
|
|
2018
|
+
'messageHashes': messageHashes,
|
|
2019
|
+
'subMessageHashes': subMessageHashes,
|
|
2020
|
+
'symbols': symbols,
|
|
2021
|
+
};
|
|
2022
|
+
const message = this.extend(request, params);
|
|
2023
|
+
return await this.watchMultiple(url, messageHashes, message, messageHashes, sub);
|
|
2024
|
+
}
|
|
2025
|
+
async authenticate(url, messageType) {
|
|
2026
|
+
const channel = messageType + '.login';
|
|
2027
|
+
const client = this.client(url);
|
|
2028
|
+
const messageHash = 'authenticated';
|
|
2029
|
+
const future = client.future(messageHash);
|
|
2030
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
2031
|
+
if (authenticated === undefined) {
|
|
2032
|
+
return await this.requestPrivate(url, {}, channel, messageHash);
|
|
2033
|
+
}
|
|
2034
|
+
return future;
|
|
2035
|
+
}
|
|
2036
|
+
handleAuthenticationMessage(client, message) {
|
|
2037
|
+
const messageHash = 'authenticated';
|
|
2038
|
+
const future = this.safeValue(client.futures, messageHash);
|
|
2039
|
+
future.resolve(true);
|
|
2040
|
+
}
|
|
2041
|
+
async requestPrivate(url, reqParams, channel, requestId = undefined) {
|
|
2042
|
+
this.checkRequiredCredentials();
|
|
2043
|
+
// uid is required for some subscriptions only so it's not a part of required credentials
|
|
2044
|
+
const event = 'api';
|
|
2045
|
+
if (requestId === undefined) {
|
|
2046
|
+
const reqId = this.requestId();
|
|
2047
|
+
requestId = reqId.toString();
|
|
2048
|
+
}
|
|
2049
|
+
const messageHash = requestId;
|
|
2050
|
+
const time = this.seconds();
|
|
2051
|
+
// unfortunately, PHP demands double quotes for the escaped newline symbol
|
|
2052
|
+
const signatureString = [event, channel, this.json(reqParams), time.toString()].join("\n"); // eslint-disable-line quotes
|
|
2053
|
+
const signature = this.hmac(this.encode(signatureString), this.encode(this.secret), sha512, 'hex');
|
|
2054
|
+
const payload = {
|
|
2055
|
+
'req_id': requestId,
|
|
2056
|
+
'timestamp': time.toString(),
|
|
2057
|
+
'api_key': this.apiKey,
|
|
2058
|
+
'signature': signature,
|
|
2059
|
+
'req_param': reqParams,
|
|
2060
|
+
};
|
|
2061
|
+
if ((channel === 'spot.order_place') || (channel === 'futures.order_place')) {
|
|
2062
|
+
payload['req_header'] = {
|
|
2063
|
+
'X-Gate-Channel-Id': 'ccxt',
|
|
2064
|
+
};
|
|
2065
|
+
}
|
|
2066
|
+
const request = {
|
|
2067
|
+
'id': requestId,
|
|
2068
|
+
'time': time,
|
|
2069
|
+
'channel': channel,
|
|
2070
|
+
'event': event,
|
|
2071
|
+
'payload': payload,
|
|
2072
|
+
};
|
|
2073
|
+
return await this.watch(url, messageHash, request, messageHash, requestId);
|
|
2074
|
+
}
|
|
2075
|
+
async subscribePrivate(url, messageHash, payload, channel, params, requiresUid = false) {
|
|
2076
|
+
this.checkRequiredCredentials();
|
|
2077
|
+
// uid is required for some subscriptions only so it's not a part of required credentials
|
|
2078
|
+
if (requiresUid) {
|
|
2079
|
+
if (this.uid === undefined || this.uid.length === 0) {
|
|
2080
|
+
throw new ArgumentsRequired(this.id + ' requires uid to subscribe');
|
|
2081
|
+
}
|
|
2082
|
+
const idArray = [this.uid];
|
|
2083
|
+
if (payload === undefined) {
|
|
2084
|
+
payload = idArray;
|
|
2085
|
+
}
|
|
2086
|
+
else {
|
|
2087
|
+
payload = this.arrayConcat(idArray, payload);
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
const time = this.seconds();
|
|
2091
|
+
const event = 'subscribe';
|
|
2092
|
+
const signaturePayload = 'channel=' + channel + '&' + 'event=' + event + '&' + 'time=' + time.toString();
|
|
2093
|
+
const signature = this.hmac(this.encode(signaturePayload), this.encode(this.secret), sha512, 'hex');
|
|
2094
|
+
const auth = {
|
|
2095
|
+
'method': 'api_key',
|
|
2096
|
+
'KEY': this.apiKey,
|
|
2097
|
+
'SIGN': signature,
|
|
2098
|
+
};
|
|
2099
|
+
const requestId = this.requestId();
|
|
2100
|
+
const request = {
|
|
2101
|
+
'id': requestId,
|
|
2102
|
+
'time': time,
|
|
2103
|
+
'channel': channel,
|
|
2104
|
+
'event': event,
|
|
2105
|
+
'auth': auth,
|
|
2106
|
+
};
|
|
2107
|
+
if (payload !== undefined) {
|
|
2108
|
+
request['payload'] = payload;
|
|
2109
|
+
}
|
|
2110
|
+
const client = this.client(url);
|
|
2111
|
+
if (!(messageHash in client.subscriptions)) {
|
|
2112
|
+
const tempSubscriptionHash = requestId.toString();
|
|
2113
|
+
// in case of authenticationError we will throw
|
|
2114
|
+
client.subscriptions[tempSubscriptionHash] = messageHash;
|
|
2115
|
+
}
|
|
2116
|
+
const message = this.extend(request, params);
|
|
2117
|
+
return await this.watch(url, messageHash, message, messageHash, messageHash);
|
|
2118
|
+
}
|
|
2119
|
+
}
|