ccxt 4.2.11 → 4.2.13
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 +5 -5
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +1347 -490
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/_virtual/agent.js +7 -0
- package/dist/cjs/_virtual/parse-proxy-response.js +7 -0
- package/dist/cjs/_virtual/promisify.js +7 -0
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/js/ccxt.js +474 -0
- package/dist/cjs/js/src/abstract/ace.js +9 -0
- package/dist/cjs/js/src/abstract/alpaca.js +9 -0
- package/dist/cjs/js/src/abstract/ascendex.js +9 -0
- package/dist/cjs/js/src/abstract/bigone.js +9 -0
- package/dist/cjs/js/src/abstract/binance.js +9 -0
- package/dist/cjs/js/src/abstract/bingx.js +9 -0
- package/dist/cjs/js/src/abstract/bit2c.js +9 -0
- package/dist/cjs/js/src/abstract/bitbank.js +9 -0
- package/dist/cjs/js/src/abstract/bitbns.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex2.js +9 -0
- package/dist/cjs/js/src/abstract/bitflyer.js +9 -0
- package/dist/cjs/js/src/abstract/bitforex.js +9 -0
- package/dist/cjs/js/src/abstract/bitget.js +9 -0
- package/dist/cjs/js/src/abstract/bithumb.js +9 -0
- package/dist/cjs/js/src/abstract/bitmart.js +9 -0
- package/dist/cjs/js/src/abstract/bitmex.js +9 -0
- package/dist/cjs/js/src/abstract/bitopro.js +9 -0
- package/dist/cjs/js/src/abstract/bitpanda.js +9 -0
- package/dist/cjs/js/src/abstract/bitrue.js +9 -0
- package/dist/cjs/js/src/abstract/bitso.js +9 -0
- package/dist/cjs/js/src/abstract/bitstamp.js +9 -0
- package/dist/cjs/js/src/abstract/bitteam.js +9 -0
- package/dist/cjs/js/src/abstract/bitvavo.js +9 -0
- package/dist/cjs/js/src/abstract/bl3p.js +9 -0
- package/dist/cjs/js/src/abstract/blockchaincom.js +9 -0
- package/dist/cjs/js/src/abstract/btcalpha.js +9 -0
- package/dist/cjs/js/src/abstract/btcbox.js +9 -0
- package/dist/cjs/js/src/abstract/btcmarkets.js +9 -0
- package/dist/cjs/js/src/abstract/btcturk.js +9 -0
- package/dist/cjs/js/src/abstract/bybit.js +9 -0
- package/dist/cjs/js/src/abstract/cex.js +9 -0
- package/dist/cjs/js/src/abstract/coinbase.js +9 -0
- package/dist/cjs/js/src/abstract/coinbasepro.js +9 -0
- package/dist/cjs/js/src/abstract/coincheck.js +9 -0
- package/dist/cjs/js/src/abstract/coinex.js +9 -0
- package/dist/cjs/js/src/abstract/coinlist.js +9 -0
- package/dist/cjs/js/src/abstract/coinmate.js +9 -0
- package/dist/cjs/js/src/abstract/coinone.js +9 -0
- package/dist/cjs/js/src/abstract/coinsph.js +9 -0
- package/dist/cjs/js/src/abstract/coinspot.js +9 -0
- package/dist/cjs/js/src/abstract/cryptocom.js +9 -0
- package/dist/cjs/js/src/abstract/currencycom.js +9 -0
- package/dist/cjs/js/src/abstract/delta.js +9 -0
- package/dist/cjs/js/src/abstract/deribit.js +9 -0
- package/dist/cjs/js/src/abstract/digifinex.js +9 -0
- package/dist/cjs/js/src/abstract/exmo.js +9 -0
- package/dist/cjs/js/src/abstract/gate.js +9 -0
- package/dist/cjs/js/src/abstract/gemini.js +9 -0
- package/dist/cjs/js/src/abstract/hitbtc.js +9 -0
- package/dist/cjs/js/src/abstract/hollaex.js +9 -0
- package/dist/cjs/js/src/abstract/htx.js +9 -0
- package/dist/cjs/js/src/abstract/huobijp.js +9 -0
- package/dist/cjs/js/src/abstract/idex.js +9 -0
- package/dist/cjs/js/src/abstract/independentreserve.js +9 -0
- package/dist/cjs/js/src/abstract/indodax.js +9 -0
- package/dist/cjs/js/src/abstract/kraken.js +9 -0
- package/dist/cjs/js/src/abstract/krakenfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kucoin.js +9 -0
- package/dist/cjs/js/src/abstract/kucoinfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kuna.js +9 -0
- package/dist/cjs/js/src/abstract/latoken.js +9 -0
- package/dist/cjs/js/src/abstract/lbank.js +9 -0
- package/dist/cjs/js/src/abstract/luno.js +9 -0
- package/dist/cjs/js/src/abstract/lykke.js +9 -0
- package/dist/cjs/js/src/abstract/mercado.js +9 -0
- package/dist/cjs/js/src/abstract/mexc.js +9 -0
- package/dist/cjs/js/src/abstract/ndax.js +9 -0
- package/dist/cjs/js/src/abstract/novadax.js +9 -0
- package/dist/cjs/js/src/abstract/oceanex.js +9 -0
- package/dist/cjs/js/src/abstract/okcoin.js +9 -0
- package/dist/cjs/js/src/abstract/okx.js +9 -0
- package/dist/cjs/js/src/abstract/p2b.js +9 -0
- package/dist/cjs/js/src/abstract/paymium.js +9 -0
- package/dist/cjs/js/src/abstract/phemex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniexfutures.js +9 -0
- package/dist/cjs/js/src/abstract/probit.js +9 -0
- package/dist/cjs/js/src/abstract/timex.js +9 -0
- package/dist/cjs/js/src/abstract/tokocrypto.js +9 -0
- package/dist/cjs/js/src/abstract/upbit.js +9 -0
- package/dist/cjs/js/src/abstract/wavesexchange.js +9 -0
- package/dist/cjs/js/src/abstract/wazirx.js +9 -0
- package/dist/cjs/js/src/abstract/whitebit.js +9 -0
- package/dist/cjs/js/src/abstract/woo.js +9 -0
- package/dist/cjs/js/src/abstract/yobit.js +9 -0
- package/dist/cjs/js/src/abstract/zaif.js +9 -0
- package/dist/cjs/js/src/abstract/zonda.js +9 -0
- package/dist/cjs/js/src/ace.js +1058 -0
- package/dist/cjs/js/src/alpaca.js +1125 -0
- package/dist/cjs/js/src/ascendex.js +3360 -0
- package/dist/cjs/js/src/base/Exchange.js +5110 -0
- package/dist/cjs/js/src/base/Precise.js +263 -0
- package/dist/cjs/js/src/base/errors.js +299 -0
- package/dist/cjs/js/src/base/functions/crypto.js +78 -0
- package/dist/cjs/js/src/base/functions/encode.js +44 -0
- package/dist/cjs/js/src/base/functions/generic.js +193 -0
- package/dist/cjs/js/src/base/functions/misc.js +96 -0
- package/dist/cjs/js/src/base/functions/number.js +297 -0
- package/dist/cjs/js/src/base/functions/platform.js +28 -0
- package/dist/cjs/js/src/base/functions/rsa.js +34 -0
- package/dist/cjs/js/src/base/functions/string.js +48 -0
- package/dist/cjs/js/src/base/functions/throttle.js +66 -0
- package/dist/cjs/js/src/base/functions/time.js +187 -0
- package/dist/cjs/js/src/base/functions/totp.js +24 -0
- package/dist/cjs/js/src/base/functions/type.js +162 -0
- package/dist/cjs/js/src/base/functions.js +157 -0
- package/dist/cjs/js/src/base/ws/Cache.js +254 -0
- package/dist/cjs/js/src/base/ws/Client.js +299 -0
- package/dist/cjs/js/src/base/ws/Future.js +34 -0
- package/dist/cjs/js/src/base/ws/OrderBook.js +107 -0
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +281 -0
- package/dist/cjs/js/src/base/ws/WsClient.js +69 -0
- package/dist/cjs/js/src/bequant.js +33 -0
- package/dist/cjs/js/src/bigone.js +2209 -0
- package/dist/cjs/js/src/binance.js +9736 -0
- package/dist/cjs/js/src/binancecoinm.js +45 -0
- package/dist/cjs/js/src/binanceus.js +84 -0
- package/dist/cjs/js/src/binanceusdm.js +58 -0
- package/dist/cjs/js/src/bingx.js +3807 -0
- package/dist/cjs/js/src/bit2c.js +916 -0
- package/dist/cjs/js/src/bitbank.js +1000 -0
- package/dist/cjs/js/src/bitbay.js +17 -0
- package/dist/cjs/js/src/bitbns.js +1220 -0
- package/dist/cjs/js/src/bitcoincom.js +17 -0
- package/dist/cjs/js/src/bitfinex.js +1670 -0
- package/dist/cjs/js/src/bitfinex2.js +2990 -0
- package/dist/cjs/js/src/bitflyer.js +1045 -0
- package/dist/cjs/js/src/bitforex.js +852 -0
- package/dist/cjs/js/src/bitget.js +8291 -0
- package/dist/cjs/js/src/bithumb.js +1090 -0
- package/dist/cjs/js/src/bitmart.js +4454 -0
- package/dist/cjs/js/src/bitmex.js +2884 -0
- package/dist/cjs/js/src/bitopro.js +1724 -0
- package/dist/cjs/js/src/bitpanda.js +2002 -0
- package/dist/cjs/js/src/bitrue.js +3253 -0
- package/dist/cjs/js/src/bitso.js +1753 -0
- package/dist/cjs/js/src/bitstamp.js +2188 -0
- package/dist/cjs/js/src/bitteam.js +2309 -0
- package/dist/cjs/js/src/bitvavo.js +1968 -0
- package/dist/cjs/js/src/bl3p.js +447 -0
- package/dist/cjs/js/src/blockchaincom.js +1160 -0
- package/dist/cjs/js/src/btcalpha.js +929 -0
- package/dist/cjs/js/src/btcbox.js +565 -0
- package/dist/cjs/js/src/btcmarkets.js +1237 -0
- package/dist/cjs/js/src/btcturk.js +929 -0
- package/dist/cjs/js/src/bybit.js +7646 -0
- package/dist/cjs/js/src/cex.js +1693 -0
- package/dist/cjs/js/src/coinbase.js +3424 -0
- package/dist/cjs/js/src/coinbasepro.js +1866 -0
- package/dist/cjs/js/src/coincheck.js +843 -0
- package/dist/cjs/js/src/coinex.js +5414 -0
- package/dist/cjs/js/src/coinlist.js +2329 -0
- package/dist/cjs/js/src/coinmate.js +989 -0
- package/dist/cjs/js/src/coinone.js +1185 -0
- package/dist/cjs/js/src/coinsph.js +1933 -0
- package/dist/cjs/js/src/coinspot.js +548 -0
- package/dist/cjs/js/src/cryptocom.js +3007 -0
- package/dist/cjs/js/src/currencycom.js +2015 -0
- package/dist/cjs/js/src/delta.js +3256 -0
- package/dist/cjs/js/src/deribit.js +3306 -0
- package/dist/cjs/js/src/digifinex.js +4307 -0
- package/dist/cjs/js/src/exmo.js +2645 -0
- package/dist/cjs/js/src/fmfwio.js +34 -0
- package/dist/cjs/js/src/gate.js +7072 -0
- package/dist/cjs/js/src/gateio.js +16 -0
- package/dist/cjs/js/src/gemini.js +1801 -0
- package/dist/cjs/js/src/hitbtc.js +3660 -0
- package/dist/cjs/js/src/hitbtc3.js +19 -0
- package/dist/cjs/js/src/hollaex.js +1882 -0
- package/dist/cjs/js/src/htx.js +9049 -0
- package/dist/cjs/js/src/huobi.js +16 -0
- package/dist/cjs/js/src/huobijp.js +1918 -0
- package/dist/cjs/js/src/idex.js +1770 -0
- package/dist/cjs/js/src/independentreserve.js +761 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2857 -0
- package/dist/cjs/js/src/krakenfutures.js +2407 -0
- package/dist/cjs/js/src/kucoin.js +4489 -0
- package/dist/cjs/js/src/kucoinfutures.js +2475 -0
- package/dist/cjs/js/src/kuna.js +1949 -0
- package/dist/cjs/js/src/latoken.js +1729 -0
- package/dist/cjs/js/src/lbank.js +2851 -0
- package/dist/cjs/js/src/luno.js +1044 -0
- package/dist/cjs/js/src/lykke.js +1303 -0
- package/dist/cjs/js/src/mercado.js +897 -0
- package/dist/cjs/js/src/mexc.js +5407 -0
- package/dist/cjs/js/src/ndax.js +2450 -0
- package/dist/cjs/js/src/novadax.js +1556 -0
- package/dist/cjs/js/src/oceanex.js +964 -0
- package/dist/cjs/js/src/okcoin.js +3115 -0
- package/dist/cjs/js/src/okx.js +7330 -0
- package/dist/cjs/js/src/p2b.js +1243 -0
- package/dist/cjs/js/src/paymium.js +597 -0
- package/dist/cjs/js/src/phemex.js +4722 -0
- package/dist/cjs/js/src/poloniex.js +2356 -0
- package/dist/cjs/js/src/poloniexfutures.js +1794 -0
- package/dist/cjs/js/src/pro/alpaca.js +714 -0
- package/dist/cjs/js/src/pro/ascendex.js +957 -0
- package/dist/cjs/js/src/pro/bequant.js +33 -0
- package/dist/cjs/js/src/pro/binance.js +2796 -0
- package/dist/cjs/js/src/pro/binancecoinm.js +23 -0
- package/dist/cjs/js/src/pro/binanceus.js +51 -0
- package/dist/cjs/js/src/pro/binanceusdm.js +32 -0
- package/dist/cjs/js/src/pro/bingx.js +944 -0
- package/dist/cjs/js/src/pro/bitcoincom.js +29 -0
- package/dist/cjs/js/src/pro/bitfinex.js +672 -0
- package/dist/cjs/js/src/pro/bitfinex2.js +1159 -0
- package/dist/cjs/js/src/pro/bitget.js +1733 -0
- package/dist/cjs/js/src/pro/bitmart.js +1486 -0
- package/dist/cjs/js/src/pro/bitmex.js +1576 -0
- package/dist/cjs/js/src/pro/bitopro.js +327 -0
- package/dist/cjs/js/src/pro/bitpanda.js +1341 -0
- package/dist/cjs/js/src/pro/bitrue.js +462 -0
- package/dist/cjs/js/src/pro/bitstamp.js +547 -0
- package/dist/cjs/js/src/pro/bitvavo.js +704 -0
- package/dist/cjs/js/src/pro/blockchaincom.js +794 -0
- package/dist/cjs/js/src/pro/bybit.js +1843 -0
- package/dist/cjs/js/src/pro/cex.js +1510 -0
- package/dist/cjs/js/src/pro/coinbase.js +561 -0
- package/dist/cjs/js/src/pro/coinbasepro.js +968 -0
- package/dist/cjs/js/src/pro/coinex.js +1095 -0
- package/dist/cjs/js/src/pro/cryptocom.js +1020 -0
- package/dist/cjs/js/src/pro/currencycom.js +563 -0
- package/dist/cjs/js/src/pro/deribit.js +825 -0
- package/dist/cjs/js/src/pro/exmo.js +658 -0
- package/dist/cjs/js/src/pro/gate.js +1316 -0
- package/dist/cjs/js/src/pro/gateio.js +16 -0
- package/dist/cjs/js/src/pro/gemini.js +649 -0
- package/dist/cjs/js/src/pro/hitbtc.js +1293 -0
- package/dist/cjs/js/src/pro/hollaex.js +597 -0
- package/dist/cjs/js/src/pro/htx.js +2383 -0
- package/dist/cjs/js/src/pro/huobi.js +16 -0
- package/dist/cjs/js/src/pro/huobijp.js +606 -0
- package/dist/cjs/js/src/pro/idex.js +714 -0
- package/dist/cjs/js/src/pro/independentreserve.js +280 -0
- package/dist/cjs/js/src/pro/kraken.js +1364 -0
- package/dist/cjs/js/src/pro/krakenfutures.js +1500 -0
- package/dist/cjs/js/src/pro/kucoin.js +1052 -0
- package/dist/cjs/js/src/pro/kucoinfutures.js +981 -0
- package/dist/cjs/js/src/pro/luno.js +322 -0
- package/dist/cjs/js/src/pro/mexc.js +1170 -0
- package/dist/cjs/js/src/pro/ndax.js +545 -0
- package/dist/cjs/js/src/pro/okcoin.js +760 -0
- package/dist/cjs/js/src/pro/okx.js +1608 -0
- package/dist/cjs/js/src/pro/phemex.js +1511 -0
- package/dist/cjs/js/src/pro/poloniex.js +1253 -0
- package/dist/cjs/js/src/pro/poloniexfutures.js +1014 -0
- package/dist/cjs/js/src/pro/probit.js +586 -0
- package/dist/cjs/js/src/pro/upbit.js +234 -0
- package/dist/cjs/js/src/pro/wazirx.js +776 -0
- package/dist/cjs/js/src/pro/whitebit.js +927 -0
- package/dist/cjs/js/src/pro/woo.js +769 -0
- package/dist/cjs/js/src/probit.js +1867 -0
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +401 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +195 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +308 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +554 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +16 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1760 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +52 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +81 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +376 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1580 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +74 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +24 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +158 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +429 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +176 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +324 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +163 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +245 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1018 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +383 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +258 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +53 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +120 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +69 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +83 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +240 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +91 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +130 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +214 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +239 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +93 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +354 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +20 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +30 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +239 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +372 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +273 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +139 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +14 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +81 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +292 -0
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +103 -0
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +140 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +175 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +7 -0
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +383 -0
- package/dist/cjs/js/src/timex.js +1562 -0
- package/dist/cjs/js/src/tokocrypto.js +2542 -0
- package/dist/cjs/js/src/upbit.js +1844 -0
- package/dist/cjs/js/src/wavesexchange.js +2607 -0
- package/dist/cjs/js/src/wazirx.js +953 -0
- package/dist/cjs/js/src/whitebit.js +2309 -0
- package/dist/cjs/js/src/woo.js +2765 -0
- package/dist/cjs/js/src/yobit.js +1314 -0
- package/dist/cjs/js/src/zaif.js +736 -0
- package/dist/cjs/js/src/zonda.js +1883 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bigone.d.ts +18 -0
- package/js/src/abstract/binance.d.ts +2 -0
- package/js/src/abstract/binancecoinm.d.ts +2 -0
- package/js/src/abstract/binanceus.d.ts +2 -0
- package/js/src/abstract/binanceusdm.d.ts +2 -0
- package/js/src/abstract/bingx.d.ts +2 -0
- package/js/src/abstract/bybit.d.ts +1 -0
- package/js/src/abstract/gate.d.ts +11 -0
- package/js/src/abstract/gateio.d.ts +11 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/alpaca.js +18 -18
- package/js/src/base/Exchange.d.ts +5 -1
- package/js/src/base/Exchange.js +101 -12
- package/js/src/bigone.d.ts +3 -2
- package/js/src/bigone.js +429 -167
- package/js/src/binance.js +48 -34
- package/js/src/bingx.js +115 -38
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +33 -13
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +5 -5
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinbase.d.ts +26 -3
- package/js/src/coinbase.js +176 -26
- package/js/src/coinlist.js +3 -4
- package/js/src/coinone.js +1 -1
- package/js/src/coinsph.js +2 -3
- package/js/src/deribit.js +1 -0
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +96 -59
- package/js/src/gemini.js +1 -1
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.d.ts +1 -0
- package/js/src/htx.js +29 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/independentreserve.js +7 -5
- package/js/src/kraken.js +3 -6
- package/js/src/lbank.js +59 -33
- package/js/src/mexc.js +2 -1
- package/js/src/oceanex.js +1 -1
- package/js/src/okx.js +14 -3
- package/js/src/phemex.js +9 -2
- package/js/src/pro/binance.d.ts +2 -23
- package/js/src/pro/binance.js +58 -22
- package/js/src/pro/coinbase.d.ts +2 -2
- package/js/src/pro/coinbase.js +4 -1
- package/js/src/pro/coinbasepro.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/kraken.js +1 -1
- package/js/src/pro/okx.d.ts +1 -0
- package/js/src/pro/okx.js +52 -2
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/probit.js +4 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/wavesexchange.js +1 -1
- package/js/src/woo.d.ts +2 -0
- package/js/src/woo.js +52 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,927 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var whitebit$1 = require('../whitebit.js');
|
|
4
|
+
var Precise = require('../base/Precise.js');
|
|
5
|
+
var errors = require('../base/errors.js');
|
|
6
|
+
var Cache = require('../base/ws/Cache.js');
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
class whitebit extends whitebit$1 {
|
|
11
|
+
describe() {
|
|
12
|
+
return this.deepExtend(super.describe(), {
|
|
13
|
+
'has': {
|
|
14
|
+
'ws': true,
|
|
15
|
+
'watchBalance': true,
|
|
16
|
+
'watchMyTrades': true,
|
|
17
|
+
'watchOHLCV': true,
|
|
18
|
+
'watchOrderBook': true,
|
|
19
|
+
'watchOrders': true,
|
|
20
|
+
'watchTicker': true,
|
|
21
|
+
'watchTrades': true,
|
|
22
|
+
},
|
|
23
|
+
'urls': {
|
|
24
|
+
'api': {
|
|
25
|
+
'ws': 'wss://api.whitebit.com/ws',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
'options': {
|
|
29
|
+
'timeframes': {
|
|
30
|
+
'1m': '60',
|
|
31
|
+
'5m': '300',
|
|
32
|
+
'15m': '900',
|
|
33
|
+
'30m': '1800',
|
|
34
|
+
'1h': '3600',
|
|
35
|
+
'4h': '14400',
|
|
36
|
+
'8h': '28800',
|
|
37
|
+
'1d': '86400',
|
|
38
|
+
'1w': '604800',
|
|
39
|
+
},
|
|
40
|
+
'watchOrderBook': {
|
|
41
|
+
'priceInterval': 0, // "0" - no interval, available values - "0.00000001", "0.0000001", "0.000001", "0.00001", "0.0001", "0.001", "0.01", "0.1"
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
'streaming': {
|
|
45
|
+
'ping': this.ping,
|
|
46
|
+
},
|
|
47
|
+
'exceptions': {
|
|
48
|
+
'ws': {
|
|
49
|
+
'exact': {
|
|
50
|
+
'1': errors.BadRequest,
|
|
51
|
+
'2': errors.BadRequest,
|
|
52
|
+
'4': errors.BadRequest,
|
|
53
|
+
'6': errors.AuthenticationError, // { error: { code: 6, message: 'require authentication' }, result: null, id: 1656404076 }
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
60
|
+
/**
|
|
61
|
+
* @method
|
|
62
|
+
* @name whitebit#watchOHLCV
|
|
63
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
64
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
65
|
+
* @param {string} timeframe the length of time each candle represents
|
|
66
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
67
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
68
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
69
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
70
|
+
*/
|
|
71
|
+
await this.loadMarkets();
|
|
72
|
+
const market = this.market(symbol);
|
|
73
|
+
symbol = market['symbol'];
|
|
74
|
+
const timeframes = this.safeValue(this.options, 'timeframes', {});
|
|
75
|
+
const interval = this.safeInteger(timeframes, timeframe);
|
|
76
|
+
const marketId = market['id'];
|
|
77
|
+
// currently there is no way of knowing
|
|
78
|
+
// the interval upon getting an update
|
|
79
|
+
// so that can't be part of the message hash, and the user can only subscribe
|
|
80
|
+
// to one timeframe per symbol
|
|
81
|
+
const messageHash = 'candles:' + symbol;
|
|
82
|
+
const reqParams = [marketId, interval];
|
|
83
|
+
const method = 'candles_subscribe';
|
|
84
|
+
const ohlcv = await this.watchPublic(messageHash, method, reqParams, params);
|
|
85
|
+
if (this.newUpdates) {
|
|
86
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
87
|
+
}
|
|
88
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
89
|
+
}
|
|
90
|
+
handleOHLCV(client, message) {
|
|
91
|
+
//
|
|
92
|
+
// {
|
|
93
|
+
// "method": "candles_update",
|
|
94
|
+
// "params": [
|
|
95
|
+
// [
|
|
96
|
+
// 1655204760,
|
|
97
|
+
// "22374.15",
|
|
98
|
+
// "22351.34",
|
|
99
|
+
// "22374.27",
|
|
100
|
+
// "22342.52",
|
|
101
|
+
// "30.213426",
|
|
102
|
+
// "675499.29718947",
|
|
103
|
+
// "BTC_USDT"
|
|
104
|
+
// ]
|
|
105
|
+
// ],
|
|
106
|
+
// "id": null
|
|
107
|
+
// }
|
|
108
|
+
//
|
|
109
|
+
const params = this.safeValue(message, 'params', []);
|
|
110
|
+
for (let i = 0; i < params.length; i++) {
|
|
111
|
+
const data = params[i];
|
|
112
|
+
const marketId = this.safeString(data, 7);
|
|
113
|
+
const market = this.safeMarket(marketId);
|
|
114
|
+
const symbol = market['symbol'];
|
|
115
|
+
const messageHash = 'candles' + ':' + symbol;
|
|
116
|
+
const parsed = this.parseOHLCV(data, market);
|
|
117
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol);
|
|
118
|
+
let stored = this.ohlcvs[symbol];
|
|
119
|
+
if (stored === undefined) {
|
|
120
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
121
|
+
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
122
|
+
this.ohlcvs[symbol] = stored;
|
|
123
|
+
}
|
|
124
|
+
stored.append(parsed);
|
|
125
|
+
client.resolve(stored, messageHash);
|
|
126
|
+
}
|
|
127
|
+
return message;
|
|
128
|
+
}
|
|
129
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
130
|
+
/**
|
|
131
|
+
* @method
|
|
132
|
+
* @name whitebit#watchOrderBook
|
|
133
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
134
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
135
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
136
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
137
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
138
|
+
*/
|
|
139
|
+
await this.loadMarkets();
|
|
140
|
+
const market = this.market(symbol);
|
|
141
|
+
if (limit === undefined) {
|
|
142
|
+
limit = 10; // max 100
|
|
143
|
+
}
|
|
144
|
+
const messageHash = 'orderbook' + ':' + market['symbol'];
|
|
145
|
+
const method = 'depth_subscribe';
|
|
146
|
+
const options = this.safeValue(this.options, 'watchOrderBook', {});
|
|
147
|
+
const defaultPriceInterval = this.safeString(options, 'priceInterval', '0');
|
|
148
|
+
const priceInterval = this.safeString(params, 'priceInterval', defaultPriceInterval);
|
|
149
|
+
params = this.omit(params, 'priceInterval');
|
|
150
|
+
const reqParams = [
|
|
151
|
+
market['id'],
|
|
152
|
+
limit,
|
|
153
|
+
priceInterval,
|
|
154
|
+
true, // true for allowing multiple subscriptions
|
|
155
|
+
];
|
|
156
|
+
const orderbook = await this.watchPublic(messageHash, method, reqParams, params);
|
|
157
|
+
return orderbook.limit();
|
|
158
|
+
}
|
|
159
|
+
handleOrderBook(client, message) {
|
|
160
|
+
//
|
|
161
|
+
// {
|
|
162
|
+
// "method":"depth_update",
|
|
163
|
+
// "params":[
|
|
164
|
+
// true,
|
|
165
|
+
// {
|
|
166
|
+
// "asks":[
|
|
167
|
+
// [ "21252.45","0.01957"],
|
|
168
|
+
// ["21252.55","0.126205"],
|
|
169
|
+
// ["21252.66","0.222689"],
|
|
170
|
+
// ["21252.76","0.185358"],
|
|
171
|
+
// ["21252.87","0.210077"],
|
|
172
|
+
// ["21252.98","0.303991"],
|
|
173
|
+
// ["21253.08","0.327909"],
|
|
174
|
+
// ["21253.19","0.399007"],
|
|
175
|
+
// ["21253.3","0.427695"],
|
|
176
|
+
// ["21253.4","0.492901"]
|
|
177
|
+
// ],
|
|
178
|
+
// "bids":[
|
|
179
|
+
// ["21248.82","0.22"],
|
|
180
|
+
// ["21248.73","0.000467"],
|
|
181
|
+
// ["21248.62","0.100864"],
|
|
182
|
+
// ["21248.51","0.061436"],
|
|
183
|
+
// ["21248.42","0.091"],
|
|
184
|
+
// ["21248.41","0.126839"],
|
|
185
|
+
// ["21248.3","0.063511"],
|
|
186
|
+
// ["21248.2","0.110547"],
|
|
187
|
+
// ["21248","0.25257"],
|
|
188
|
+
// ["21247.7","1.71813"]
|
|
189
|
+
// ]
|
|
190
|
+
// },
|
|
191
|
+
// "BTC_USDT"
|
|
192
|
+
// ],
|
|
193
|
+
// "id":null
|
|
194
|
+
// }
|
|
195
|
+
//
|
|
196
|
+
const params = this.safeValue(message, 'params', []);
|
|
197
|
+
const isSnapshot = this.safeValue(params, 0);
|
|
198
|
+
const marketId = this.safeString(params, 2);
|
|
199
|
+
const market = this.safeMarket(marketId);
|
|
200
|
+
const symbol = market['symbol'];
|
|
201
|
+
const data = this.safeValue(params, 1);
|
|
202
|
+
let orderbook = undefined;
|
|
203
|
+
if (symbol in this.orderbooks) {
|
|
204
|
+
orderbook = this.orderbooks[symbol];
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
orderbook = this.orderBook();
|
|
208
|
+
this.orderbooks[symbol] = orderbook;
|
|
209
|
+
}
|
|
210
|
+
if (isSnapshot) {
|
|
211
|
+
const snapshot = this.parseOrderBook(data, symbol);
|
|
212
|
+
orderbook.reset(snapshot);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const asks = this.safeValue(data, 'asks', []);
|
|
216
|
+
const bids = this.safeValue(data, 'bids', []);
|
|
217
|
+
this.handleDeltas(orderbook['asks'], asks);
|
|
218
|
+
this.handleDeltas(orderbook['bids'], bids);
|
|
219
|
+
}
|
|
220
|
+
const messageHash = 'orderbook' + ':' + symbol;
|
|
221
|
+
client.resolve(orderbook, messageHash);
|
|
222
|
+
}
|
|
223
|
+
handleDelta(bookside, delta) {
|
|
224
|
+
const price = this.safeFloat(delta, 0);
|
|
225
|
+
const amount = this.safeFloat(delta, 1);
|
|
226
|
+
bookside.store(price, amount);
|
|
227
|
+
}
|
|
228
|
+
handleDeltas(bookside, deltas) {
|
|
229
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
230
|
+
this.handleDelta(bookside, deltas[i]);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async watchTicker(symbol, params = {}) {
|
|
234
|
+
/**
|
|
235
|
+
* @method
|
|
236
|
+
* @name whitebit#watchTicker
|
|
237
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
238
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
239
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
240
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
241
|
+
*/
|
|
242
|
+
await this.loadMarkets();
|
|
243
|
+
const market = this.market(symbol);
|
|
244
|
+
symbol = market['symbol'];
|
|
245
|
+
const method = 'market_subscribe';
|
|
246
|
+
const messageHash = 'ticker:' + symbol;
|
|
247
|
+
// every time we want to subscribe to another market we have to "re-subscribe" sending it all again
|
|
248
|
+
return await this.watchMultipleSubscription(messageHash, method, symbol, false, params);
|
|
249
|
+
}
|
|
250
|
+
handleTicker(client, message) {
|
|
251
|
+
//
|
|
252
|
+
// {
|
|
253
|
+
// "method": "market_update",
|
|
254
|
+
// "params": [
|
|
255
|
+
// "BTC_USDT",
|
|
256
|
+
// {
|
|
257
|
+
// "close": "22293.86",
|
|
258
|
+
// "deal": "1986990019.96552952",
|
|
259
|
+
// "high": "24360.7",
|
|
260
|
+
// "last": "22293.86",
|
|
261
|
+
// "low": "20851.44",
|
|
262
|
+
// "open": "24076.12",
|
|
263
|
+
// "period": 86400,
|
|
264
|
+
// "volume": "87016.995668"
|
|
265
|
+
// }
|
|
266
|
+
// ],
|
|
267
|
+
// "id": null
|
|
268
|
+
// }
|
|
269
|
+
//
|
|
270
|
+
const tickers = this.safeValue(message, 'params', []);
|
|
271
|
+
const marketId = this.safeString(tickers, 0);
|
|
272
|
+
const market = this.safeMarket(marketId, undefined);
|
|
273
|
+
const symbol = market['symbol'];
|
|
274
|
+
const rawTicker = this.safeValue(tickers, 1, {});
|
|
275
|
+
const messageHash = 'ticker' + ':' + symbol;
|
|
276
|
+
const ticker = this.parseTicker(rawTicker, market);
|
|
277
|
+
this.tickers[symbol] = ticker;
|
|
278
|
+
// watchTicker
|
|
279
|
+
client.resolve(ticker, messageHash);
|
|
280
|
+
// watchTickers
|
|
281
|
+
const messageHashes = Object.keys(client.futures);
|
|
282
|
+
for (let i = 0; i < messageHashes.length; i++) {
|
|
283
|
+
const currentMessageHash = messageHashes[i];
|
|
284
|
+
if (currentMessageHash.indexOf('tickers') >= 0 && currentMessageHash.indexOf(symbol) >= 0) {
|
|
285
|
+
// Example: user calls watchTickers with ['LTC/USDT', 'ETH/USDT']
|
|
286
|
+
// the associated messagehash will be: 'tickers:LTC/USDT:ETH/USDT'
|
|
287
|
+
// since we only have access to a single symbol at a time
|
|
288
|
+
// we have to do a reverse lookup into the tickers hashes
|
|
289
|
+
// and check if the current symbol is a part of one or more
|
|
290
|
+
// tickers hashes and resolve them
|
|
291
|
+
// user might have multiple watchTickers promises
|
|
292
|
+
// watchTickers ( ['LTC/USDT', 'ETH/USDT'] ), watchTickers ( ['ETC/USDT', 'DOGE/USDT'] )
|
|
293
|
+
// and we want to make sure we resolve only the correct ones
|
|
294
|
+
client.resolve(ticker, currentMessageHash);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return message;
|
|
298
|
+
}
|
|
299
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
300
|
+
/**
|
|
301
|
+
* @method
|
|
302
|
+
* @name whitebit#watchTrades
|
|
303
|
+
* @description get the list of most recent trades for a particular symbol
|
|
304
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
305
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
306
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
307
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
308
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
309
|
+
*/
|
|
310
|
+
await this.loadMarkets();
|
|
311
|
+
const market = this.market(symbol);
|
|
312
|
+
symbol = market['symbol'];
|
|
313
|
+
const messageHash = 'trades' + ':' + symbol;
|
|
314
|
+
const method = 'trades_subscribe';
|
|
315
|
+
// every time we want to subscribe to another market we have to 're-subscribe' sending it all again
|
|
316
|
+
const trades = await this.watchMultipleSubscription(messageHash, method, symbol, false, params);
|
|
317
|
+
if (this.newUpdates) {
|
|
318
|
+
limit = trades.getLimit(symbol, limit);
|
|
319
|
+
}
|
|
320
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
321
|
+
}
|
|
322
|
+
handleTrades(client, message) {
|
|
323
|
+
//
|
|
324
|
+
// {
|
|
325
|
+
// "method":"trades_update",
|
|
326
|
+
// "params":[
|
|
327
|
+
// "BTC_USDT",
|
|
328
|
+
// [
|
|
329
|
+
// {
|
|
330
|
+
// "id":1900632398,
|
|
331
|
+
// "time":1656320231.404343,
|
|
332
|
+
// "price":"21443.04",
|
|
333
|
+
// "amount":"0.072844",
|
|
334
|
+
// "type":"buy"
|
|
335
|
+
// },
|
|
336
|
+
// {
|
|
337
|
+
// "id":1900632397,
|
|
338
|
+
// "time":1656320231.400001,
|
|
339
|
+
// "price":"21443.15",
|
|
340
|
+
// "amount":"0.060757",
|
|
341
|
+
// "type":"buy"
|
|
342
|
+
// }
|
|
343
|
+
// ]
|
|
344
|
+
// ]
|
|
345
|
+
// }
|
|
346
|
+
//
|
|
347
|
+
const params = this.safeValue(message, 'params', []);
|
|
348
|
+
const marketId = this.safeString(params, 0);
|
|
349
|
+
const market = this.safeMarket(marketId);
|
|
350
|
+
const symbol = market['symbol'];
|
|
351
|
+
let stored = this.safeValue(this.trades, symbol);
|
|
352
|
+
if (stored === undefined) {
|
|
353
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
354
|
+
stored = new Cache.ArrayCache(limit);
|
|
355
|
+
this.trades[symbol] = stored;
|
|
356
|
+
}
|
|
357
|
+
const data = this.safeValue(params, 1, []);
|
|
358
|
+
const parsedTrades = this.parseTrades(data, market);
|
|
359
|
+
for (let j = 0; j < parsedTrades.length; j++) {
|
|
360
|
+
stored.append(parsedTrades[j]);
|
|
361
|
+
}
|
|
362
|
+
const messageHash = 'trades:' + market['symbol'];
|
|
363
|
+
client.resolve(stored, messageHash);
|
|
364
|
+
}
|
|
365
|
+
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
366
|
+
/**
|
|
367
|
+
* @method
|
|
368
|
+
* @name whitebit#watchMyTrades
|
|
369
|
+
* @description watches trades made by the user
|
|
370
|
+
* @param {str} symbol unified market symbol
|
|
371
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
372
|
+
* @param {int} [limit] the maximum number of trades structures to retrieve
|
|
373
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
374
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
375
|
+
*/
|
|
376
|
+
if (symbol === undefined) {
|
|
377
|
+
throw new errors.ArgumentsRequired(this.id + ' watchMyTrades() requires a symbol argument');
|
|
378
|
+
}
|
|
379
|
+
await this.loadMarkets();
|
|
380
|
+
await this.authenticate();
|
|
381
|
+
const market = this.market(symbol);
|
|
382
|
+
symbol = market['symbol'];
|
|
383
|
+
const messageHash = 'myTrades:' + symbol;
|
|
384
|
+
const method = 'deals_subscribe';
|
|
385
|
+
const trades = await this.watchMultipleSubscription(messageHash, method, symbol, true, params);
|
|
386
|
+
if (this.newUpdates) {
|
|
387
|
+
limit = trades.getLimit(symbol, limit);
|
|
388
|
+
}
|
|
389
|
+
return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
|
|
390
|
+
}
|
|
391
|
+
handleMyTrades(client, message, subscription = undefined) {
|
|
392
|
+
//
|
|
393
|
+
// {
|
|
394
|
+
// "method": "deals_update",
|
|
395
|
+
// "params": [
|
|
396
|
+
// 1894994106,
|
|
397
|
+
// 1656151427.729706,
|
|
398
|
+
// "LTC_USDT",
|
|
399
|
+
// 96624037337,
|
|
400
|
+
// "56.78",
|
|
401
|
+
// "0.16717",
|
|
402
|
+
// "0.0094919126",
|
|
403
|
+
// ''
|
|
404
|
+
// ],
|
|
405
|
+
// "id": null
|
|
406
|
+
// }
|
|
407
|
+
//
|
|
408
|
+
const trade = this.safeValue(message, 'params');
|
|
409
|
+
if (this.myTrades === undefined) {
|
|
410
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
411
|
+
this.myTrades = new Cache.ArrayCache(limit);
|
|
412
|
+
}
|
|
413
|
+
const stored = this.myTrades;
|
|
414
|
+
const parsed = this.parseWsTrade(trade);
|
|
415
|
+
stored.append(parsed);
|
|
416
|
+
const symbol = parsed['symbol'];
|
|
417
|
+
const messageHash = 'myTrades:' + symbol;
|
|
418
|
+
client.resolve(stored, messageHash);
|
|
419
|
+
}
|
|
420
|
+
parseWsTrade(trade, market = undefined) {
|
|
421
|
+
//
|
|
422
|
+
// [
|
|
423
|
+
// 1894994106, // id
|
|
424
|
+
// 1656151427.729706, // deal time
|
|
425
|
+
// "LTC_USDT", // symbol
|
|
426
|
+
// 96624037337, // order id
|
|
427
|
+
// "56.78", // price
|
|
428
|
+
// "0.16717", // amount
|
|
429
|
+
// "0.0094919126", // fee
|
|
430
|
+
// '' // client order id
|
|
431
|
+
// ]
|
|
432
|
+
//
|
|
433
|
+
const orderId = this.safeString(trade, 3);
|
|
434
|
+
const timestamp = this.safeTimestamp(trade, 1);
|
|
435
|
+
const id = this.safeString(trade, 0);
|
|
436
|
+
const price = this.safeString(trade, 4);
|
|
437
|
+
const amount = this.safeString(trade, 5);
|
|
438
|
+
const marketId = this.safeString(trade, 2);
|
|
439
|
+
market = this.safeMarket(marketId, market);
|
|
440
|
+
let fee = undefined;
|
|
441
|
+
const feeCost = this.safeString(trade, 6);
|
|
442
|
+
if (feeCost !== undefined) {
|
|
443
|
+
fee = {
|
|
444
|
+
'cost': feeCost,
|
|
445
|
+
'currency': market['quote'],
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
return this.safeTrade({
|
|
449
|
+
'id': id,
|
|
450
|
+
'info': trade,
|
|
451
|
+
'timestamp': timestamp,
|
|
452
|
+
'datetime': this.iso8601(timestamp),
|
|
453
|
+
'symbol': market['symbol'],
|
|
454
|
+
'order': orderId,
|
|
455
|
+
'type': undefined,
|
|
456
|
+
'side': undefined,
|
|
457
|
+
'takerOrMaker': undefined,
|
|
458
|
+
'price': price,
|
|
459
|
+
'amount': amount,
|
|
460
|
+
'cost': undefined,
|
|
461
|
+
'fee': fee,
|
|
462
|
+
}, market);
|
|
463
|
+
}
|
|
464
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
465
|
+
/**
|
|
466
|
+
* @method
|
|
467
|
+
* @name whitebit#watchOrders
|
|
468
|
+
* @description watches information on multiple orders made by the user
|
|
469
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
470
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
471
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
472
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
473
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
|
|
474
|
+
*/
|
|
475
|
+
if (symbol === undefined) {
|
|
476
|
+
throw new errors.ArgumentsRequired(this.id + ' watchOrders() requires a symbol argument');
|
|
477
|
+
}
|
|
478
|
+
await this.loadMarkets();
|
|
479
|
+
await this.authenticate();
|
|
480
|
+
const market = this.market(symbol);
|
|
481
|
+
symbol = market['symbol'];
|
|
482
|
+
const messageHash = 'orders:' + symbol;
|
|
483
|
+
const method = 'ordersPending_subscribe';
|
|
484
|
+
const trades = await this.watchMultipleSubscription(messageHash, method, symbol, false, params);
|
|
485
|
+
if (this.newUpdates) {
|
|
486
|
+
limit = trades.getLimit(symbol, limit);
|
|
487
|
+
}
|
|
488
|
+
return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
|
|
489
|
+
}
|
|
490
|
+
handleOrder(client, message, subscription = undefined) {
|
|
491
|
+
//
|
|
492
|
+
// {
|
|
493
|
+
// "method": "ordersPending_update",
|
|
494
|
+
// "params": [
|
|
495
|
+
// 1, // 1 = new, 2 = update 3 = cancel or execute
|
|
496
|
+
// {
|
|
497
|
+
// "id": 96433622651,
|
|
498
|
+
// "market": "LTC_USDT",
|
|
499
|
+
// "type": 1,
|
|
500
|
+
// "side": 2,
|
|
501
|
+
// "ctime": 1656092215.39375,
|
|
502
|
+
// "mtime": 1656092215.39375,
|
|
503
|
+
// "price": "25",
|
|
504
|
+
// "amount": "0.202",
|
|
505
|
+
// "taker_fee": "0.001",
|
|
506
|
+
// "maker_fee": "0.001",
|
|
507
|
+
// "left": "0.202",
|
|
508
|
+
// "deal_stock": "0",
|
|
509
|
+
// "deal_money": "0",
|
|
510
|
+
// "deal_fee": "0",
|
|
511
|
+
// "client_order_id": ''
|
|
512
|
+
// }
|
|
513
|
+
// ]
|
|
514
|
+
// "id": null
|
|
515
|
+
// }
|
|
516
|
+
//
|
|
517
|
+
const params = this.safeValue(message, 'params', []);
|
|
518
|
+
const data = this.safeValue(params, 1);
|
|
519
|
+
if (this.orders === undefined) {
|
|
520
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
521
|
+
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
522
|
+
}
|
|
523
|
+
const stored = this.orders;
|
|
524
|
+
const status = this.safeInteger(params, 0);
|
|
525
|
+
const parsed = this.parseWsOrder(this.extend(data, { 'status': status }));
|
|
526
|
+
stored.append(parsed);
|
|
527
|
+
const symbol = parsed['symbol'];
|
|
528
|
+
const messageHash = 'orders:' + symbol;
|
|
529
|
+
client.resolve(this.orders, messageHash);
|
|
530
|
+
}
|
|
531
|
+
parseWsOrder(order, market = undefined) {
|
|
532
|
+
//
|
|
533
|
+
// {
|
|
534
|
+
// "id": 96433622651,
|
|
535
|
+
// "market": "LTC_USDT",
|
|
536
|
+
// "type": 1,
|
|
537
|
+
// "side": 2, //1- sell 2-buy
|
|
538
|
+
// "ctime": 1656092215.39375,
|
|
539
|
+
// "mtime": 1656092215.39375,
|
|
540
|
+
// "price": "25",
|
|
541
|
+
// "amount": "0.202",
|
|
542
|
+
// "taker_fee": "0.001",
|
|
543
|
+
// "maker_fee": "0.001",
|
|
544
|
+
// "left": "0.202",
|
|
545
|
+
// "deal_stock": "0",
|
|
546
|
+
// "deal_money": "0",
|
|
547
|
+
// "deal_fee": "0",
|
|
548
|
+
// "activation_price": "40",
|
|
549
|
+
// "activation_condition": "lte",
|
|
550
|
+
// "client_order_id": ''
|
|
551
|
+
// "status": 1, // 1 = new, 2 = update 3 = cancel or execute
|
|
552
|
+
// }
|
|
553
|
+
//
|
|
554
|
+
const status = this.safeInteger(order, 'status');
|
|
555
|
+
const marketId = this.safeString(order, 'market');
|
|
556
|
+
market = this.safeMarket(marketId, market);
|
|
557
|
+
const id = this.safeString(order, 'id');
|
|
558
|
+
const clientOrderId = this.omitZero(this.safeString(order, 'client_order_id'));
|
|
559
|
+
const price = this.safeString(order, 'price');
|
|
560
|
+
const filled = this.safeString(order, 'deal_stock');
|
|
561
|
+
const cost = this.safeString(order, 'deal_money');
|
|
562
|
+
const stopPrice = this.safeString(order, 'activation_price');
|
|
563
|
+
const rawType = this.safeString(order, 'type');
|
|
564
|
+
const type = this.parseWsOrderType(rawType);
|
|
565
|
+
let amount = undefined;
|
|
566
|
+
let remaining = undefined;
|
|
567
|
+
if (type === 'market') {
|
|
568
|
+
amount = this.safeString(order, 'deal_stock');
|
|
569
|
+
remaining = '0';
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
remaining = this.safeString(order, 'left');
|
|
573
|
+
amount = this.safeString(order, 'amount');
|
|
574
|
+
}
|
|
575
|
+
const timestamp = this.safeTimestamp(order, 'ctime');
|
|
576
|
+
const lastTradeTimestamp = this.safeTimestamp(order, 'mtime');
|
|
577
|
+
const symbol = market['symbol'];
|
|
578
|
+
const rawSide = this.safeInteger(order, 'side');
|
|
579
|
+
const side = (rawSide === 1) ? 'sell' : 'buy';
|
|
580
|
+
const dealFee = this.safeString(order, 'deal_fee');
|
|
581
|
+
let fee = undefined;
|
|
582
|
+
if (dealFee !== undefined) {
|
|
583
|
+
fee = {
|
|
584
|
+
'cost': this.parseNumber(dealFee),
|
|
585
|
+
'currency': market['quote'],
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
let unifiedStatus = undefined;
|
|
589
|
+
if ((status === 1) || (status === 2)) {
|
|
590
|
+
unifiedStatus = 'open';
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
if (Precise["default"].stringEquals(remaining, '0')) {
|
|
594
|
+
unifiedStatus = 'closed';
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
unifiedStatus = 'canceled';
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return this.safeOrder({
|
|
601
|
+
'info': order,
|
|
602
|
+
'symbol': symbol,
|
|
603
|
+
'id': id,
|
|
604
|
+
'clientOrderId': clientOrderId,
|
|
605
|
+
'timestamp': timestamp,
|
|
606
|
+
'datetime': this.iso8601(timestamp),
|
|
607
|
+
'lastTradeTimestamp': lastTradeTimestamp,
|
|
608
|
+
'type': type,
|
|
609
|
+
'timeInForce': undefined,
|
|
610
|
+
'postOnly': undefined,
|
|
611
|
+
'side': side,
|
|
612
|
+
'price': price,
|
|
613
|
+
'stopPrice': stopPrice,
|
|
614
|
+
'triggerPrice': stopPrice,
|
|
615
|
+
'amount': amount,
|
|
616
|
+
'cost': cost,
|
|
617
|
+
'average': undefined,
|
|
618
|
+
'filled': filled,
|
|
619
|
+
'remaining': remaining,
|
|
620
|
+
'status': unifiedStatus,
|
|
621
|
+
'fee': fee,
|
|
622
|
+
'trades': undefined,
|
|
623
|
+
}, market);
|
|
624
|
+
}
|
|
625
|
+
parseWsOrderType(status) {
|
|
626
|
+
const statuses = {
|
|
627
|
+
'1': 'limit',
|
|
628
|
+
'2': 'market',
|
|
629
|
+
'202': 'market',
|
|
630
|
+
'3': 'limit',
|
|
631
|
+
'4': 'market',
|
|
632
|
+
'5': 'limit',
|
|
633
|
+
'6': 'market',
|
|
634
|
+
'8': 'limit',
|
|
635
|
+
'10': 'market',
|
|
636
|
+
};
|
|
637
|
+
return this.safeString(statuses, status, status);
|
|
638
|
+
}
|
|
639
|
+
async watchBalance(params = {}) {
|
|
640
|
+
/**
|
|
641
|
+
* @method
|
|
642
|
+
* @name whitebit#watchBalance
|
|
643
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
644
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
645
|
+
* @param {str} [params.type] spot or contract if not provided this.options['defaultType'] is used
|
|
646
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
647
|
+
*/
|
|
648
|
+
await this.loadMarkets();
|
|
649
|
+
let type = undefined;
|
|
650
|
+
[type, params] = this.handleMarketTypeAndParams('watchBalance', undefined, params);
|
|
651
|
+
let messageHash = 'wallet:';
|
|
652
|
+
let method = undefined;
|
|
653
|
+
if (type === 'spot') {
|
|
654
|
+
method = 'balanceSpot_subscribe';
|
|
655
|
+
messageHash += 'spot';
|
|
656
|
+
}
|
|
657
|
+
else {
|
|
658
|
+
method = 'balanceMargin_subscribe';
|
|
659
|
+
messageHash += 'margin';
|
|
660
|
+
}
|
|
661
|
+
const currencies = Object.keys(this.currencies);
|
|
662
|
+
return await this.watchPrivate(messageHash, method, currencies, params);
|
|
663
|
+
}
|
|
664
|
+
handleBalance(client, message) {
|
|
665
|
+
//
|
|
666
|
+
// {
|
|
667
|
+
// "method":"balanceSpot_update",
|
|
668
|
+
// "params":[
|
|
669
|
+
// {
|
|
670
|
+
// "LTC":{
|
|
671
|
+
// "available":"0.16587",
|
|
672
|
+
// "freeze":"0"
|
|
673
|
+
// }
|
|
674
|
+
// }
|
|
675
|
+
// ],
|
|
676
|
+
// "id":null
|
|
677
|
+
// }
|
|
678
|
+
//
|
|
679
|
+
const method = this.safeString(message, 'method');
|
|
680
|
+
const data = this.safeValue(message, 'params');
|
|
681
|
+
const balanceDict = this.safeValue(data, 0);
|
|
682
|
+
this.balance['info'] = balanceDict;
|
|
683
|
+
const keys = Object.keys(balanceDict);
|
|
684
|
+
const currencyId = this.safeValue(keys, 0);
|
|
685
|
+
const rawBalance = this.safeValue(balanceDict, currencyId);
|
|
686
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
687
|
+
const account = this.account();
|
|
688
|
+
account['free'] = this.safeString(rawBalance, 'available');
|
|
689
|
+
account['used'] = this.safeString(rawBalance, 'freeze');
|
|
690
|
+
this.balance[code] = account;
|
|
691
|
+
this.balance = this.safeBalance(this.balance);
|
|
692
|
+
let messageHash = 'wallet:';
|
|
693
|
+
if (method.indexOf('Spot') >= 0) {
|
|
694
|
+
messageHash += 'spot';
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
messageHash += 'margin';
|
|
698
|
+
}
|
|
699
|
+
client.resolve(this.balance, messageHash);
|
|
700
|
+
}
|
|
701
|
+
async watchPublic(messageHash, method, reqParams = [], params = {}) {
|
|
702
|
+
const url = this.urls['api']['ws'];
|
|
703
|
+
const id = this.nonce();
|
|
704
|
+
const request = {
|
|
705
|
+
'id': id,
|
|
706
|
+
'method': method,
|
|
707
|
+
'params': reqParams,
|
|
708
|
+
};
|
|
709
|
+
const message = this.extend(request, params);
|
|
710
|
+
return await this.watch(url, messageHash, message, messageHash);
|
|
711
|
+
}
|
|
712
|
+
async watchMultipleSubscription(messageHash, method, symbol, isNested = false, params = {}) {
|
|
713
|
+
await this.loadMarkets();
|
|
714
|
+
const url = this.urls['api']['ws'];
|
|
715
|
+
const id = this.nonce();
|
|
716
|
+
const client = this.safeValue(this.clients, url);
|
|
717
|
+
let request = undefined;
|
|
718
|
+
let marketIds = [];
|
|
719
|
+
if (client === undefined) {
|
|
720
|
+
const subscription = {};
|
|
721
|
+
const market = this.market(symbol);
|
|
722
|
+
const marketId = market['id'];
|
|
723
|
+
subscription[marketId] = true;
|
|
724
|
+
marketIds = [marketId];
|
|
725
|
+
if (isNested) {
|
|
726
|
+
marketIds = [marketIds];
|
|
727
|
+
}
|
|
728
|
+
request = {
|
|
729
|
+
'id': id,
|
|
730
|
+
'method': method,
|
|
731
|
+
'params': marketIds,
|
|
732
|
+
};
|
|
733
|
+
const message = this.extend(request, params);
|
|
734
|
+
return await this.watch(url, messageHash, message, method, subscription);
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
const subscription = this.safeValue(client.subscriptions, method, {});
|
|
738
|
+
let hasSymbolSubscription = true;
|
|
739
|
+
const market = this.market(symbol);
|
|
740
|
+
const marketId = market['id'];
|
|
741
|
+
const isSubscribed = this.safeValue(subscription, marketId, false);
|
|
742
|
+
if (!isSubscribed) {
|
|
743
|
+
subscription[marketId] = true;
|
|
744
|
+
hasSymbolSubscription = false;
|
|
745
|
+
}
|
|
746
|
+
if (hasSymbolSubscription) {
|
|
747
|
+
// already subscribed to this market(s)
|
|
748
|
+
return await this.watch(url, messageHash, request, method, subscription);
|
|
749
|
+
}
|
|
750
|
+
else {
|
|
751
|
+
// resubscribe
|
|
752
|
+
let marketIdsNew = [];
|
|
753
|
+
marketIdsNew = Object.keys(subscription);
|
|
754
|
+
if (isNested) {
|
|
755
|
+
marketIdsNew = [marketIdsNew];
|
|
756
|
+
}
|
|
757
|
+
const resubRequest = {
|
|
758
|
+
'id': id,
|
|
759
|
+
'method': method,
|
|
760
|
+
'params': marketIdsNew,
|
|
761
|
+
};
|
|
762
|
+
if (method in client.subscriptions) {
|
|
763
|
+
delete client.subscriptions[method];
|
|
764
|
+
}
|
|
765
|
+
return await this.watch(url, messageHash, resubRequest, method, subscription);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
async watchPrivate(messageHash, method, reqParams = [], params = {}) {
|
|
770
|
+
this.checkRequiredCredentials();
|
|
771
|
+
await this.authenticate();
|
|
772
|
+
const url = this.urls['api']['ws'];
|
|
773
|
+
const id = this.nonce();
|
|
774
|
+
const request = {
|
|
775
|
+
'id': id,
|
|
776
|
+
'method': method,
|
|
777
|
+
'params': reqParams,
|
|
778
|
+
};
|
|
779
|
+
const message = this.extend(request, params);
|
|
780
|
+
return await this.watch(url, messageHash, message, messageHash);
|
|
781
|
+
}
|
|
782
|
+
async authenticate(params = {}) {
|
|
783
|
+
this.checkRequiredCredentials();
|
|
784
|
+
const url = this.urls['api']['ws'];
|
|
785
|
+
const messageHash = 'authenticated';
|
|
786
|
+
const client = this.client(url);
|
|
787
|
+
const future = client.future('authenticated');
|
|
788
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
789
|
+
if (authenticated === undefined) {
|
|
790
|
+
const authToken = await this.v4PrivatePostProfileWebsocketToken();
|
|
791
|
+
//
|
|
792
|
+
// {
|
|
793
|
+
// "websocket_token": "$2y$10$lxCvTXig/XrcTBFY1bdFseCKQmFTDtCpEzHNVnXowGplExFxPJp9y"
|
|
794
|
+
// }
|
|
795
|
+
//
|
|
796
|
+
const token = this.safeString(authToken, 'websocket_token');
|
|
797
|
+
const id = this.nonce();
|
|
798
|
+
const request = {
|
|
799
|
+
'id': id,
|
|
800
|
+
'method': 'authorize',
|
|
801
|
+
'params': [
|
|
802
|
+
token,
|
|
803
|
+
'public',
|
|
804
|
+
],
|
|
805
|
+
};
|
|
806
|
+
const subscription = {
|
|
807
|
+
'id': id,
|
|
808
|
+
'method': this.handleAuthenticate,
|
|
809
|
+
};
|
|
810
|
+
try {
|
|
811
|
+
await this.watch(url, messageHash, request, messageHash, subscription);
|
|
812
|
+
}
|
|
813
|
+
catch (e) {
|
|
814
|
+
delete client.subscriptions[messageHash];
|
|
815
|
+
future.reject(e);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
return await future;
|
|
819
|
+
}
|
|
820
|
+
handleAuthenticate(client, message) {
|
|
821
|
+
//
|
|
822
|
+
// { error: null, result: { status: "success" }, id: 1656084550 }
|
|
823
|
+
//
|
|
824
|
+
const future = client.futures['authenticated'];
|
|
825
|
+
future.resolve(1);
|
|
826
|
+
return message;
|
|
827
|
+
}
|
|
828
|
+
handleErrorMessage(client, message) {
|
|
829
|
+
//
|
|
830
|
+
// {
|
|
831
|
+
// "error": { code: 1, message: "invalid argument" },
|
|
832
|
+
// "result": null,
|
|
833
|
+
// "id": 1656090882
|
|
834
|
+
// }
|
|
835
|
+
//
|
|
836
|
+
const error = this.safeValue(message, 'error');
|
|
837
|
+
try {
|
|
838
|
+
if (error !== undefined) {
|
|
839
|
+
const code = this.safeString(message, 'code');
|
|
840
|
+
const feedback = this.id + ' ' + this.json(message);
|
|
841
|
+
this.throwExactlyMatchedException(this.exceptions['ws']['exact'], code, feedback);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
catch (e) {
|
|
845
|
+
if (e instanceof errors.AuthenticationError) {
|
|
846
|
+
client.reject(e, 'authenticated');
|
|
847
|
+
if ('authenticated' in client.subscriptions) {
|
|
848
|
+
delete client.subscriptions['authenticated'];
|
|
849
|
+
}
|
|
850
|
+
return false;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
return message;
|
|
854
|
+
}
|
|
855
|
+
handleMessage(client, message) {
|
|
856
|
+
//
|
|
857
|
+
// auth
|
|
858
|
+
// { error: null, result: { status: "success" }, id: 1656084550 }
|
|
859
|
+
//
|
|
860
|
+
// pong
|
|
861
|
+
// { error: null, result: "pong", id: 0 }
|
|
862
|
+
//
|
|
863
|
+
if (!this.handleErrorMessage(client, message)) {
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
const result = this.safeValue(message, 'result', {});
|
|
867
|
+
if (result !== undefined) {
|
|
868
|
+
if (result === 'pong') {
|
|
869
|
+
this.handlePong(client, message);
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
const id = this.safeInteger(message, 'id');
|
|
874
|
+
if (id !== undefined) {
|
|
875
|
+
this.handleSubscriptionStatus(client, message, id);
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
878
|
+
const methods = {
|
|
879
|
+
'market_update': this.handleTicker,
|
|
880
|
+
'trades_update': this.handleTrades,
|
|
881
|
+
'depth_update': this.handleOrderBook,
|
|
882
|
+
'candles_update': this.handleOHLCV,
|
|
883
|
+
'ordersPending_update': this.handleOrder,
|
|
884
|
+
'ordersExecuted_update': this.handleOrder,
|
|
885
|
+
'balanceSpot_update': this.handleBalance,
|
|
886
|
+
'balanceMargin_update': this.handleBalance,
|
|
887
|
+
'deals_update': this.handleMyTrades,
|
|
888
|
+
};
|
|
889
|
+
const topic = this.safeValue(message, 'method');
|
|
890
|
+
const method = this.safeValue(methods, topic);
|
|
891
|
+
if (method !== undefined) {
|
|
892
|
+
method.call(this, client, message);
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
handleSubscriptionStatus(client, message, id) {
|
|
896
|
+
// not every method stores its subscription
|
|
897
|
+
// as an object so we can't do indeById here
|
|
898
|
+
const subs = client.subscriptions;
|
|
899
|
+
const values = Object.values(subs);
|
|
900
|
+
for (let i = 0; i < values.length; i++) {
|
|
901
|
+
const subscription = values[i];
|
|
902
|
+
if (subscription !== true) {
|
|
903
|
+
const subId = this.safeInteger(subscription, 'id');
|
|
904
|
+
if ((subId !== undefined) && (subId === id)) {
|
|
905
|
+
const method = this.safeValue(subscription, 'method');
|
|
906
|
+
if (method !== undefined) {
|
|
907
|
+
method.call(this, client, message);
|
|
908
|
+
return;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
handlePong(client, message) {
|
|
915
|
+
client.lastPong = this.milliseconds();
|
|
916
|
+
return message;
|
|
917
|
+
}
|
|
918
|
+
ping(client) {
|
|
919
|
+
return {
|
|
920
|
+
'id': 0,
|
|
921
|
+
'method': 'ping',
|
|
922
|
+
'params': [],
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
module.exports = whitebit;
|