ccxt 4.2.11 → 4.2.12
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 +640 -261
- 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 +2142 -0
- package/dist/cjs/js/src/binance.js +9729 -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 +3737 -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 +8284 -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 +3274 -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 +7054 -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 +9024 -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 +759 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2861 -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 +2825 -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 +7329 -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 +4715 -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 +1558 -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 +1865 -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 +2715 -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/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/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 +1 -2
- package/js/src/bigone.js +340 -145
- package/js/src/binance.js +15 -8
- package/js/src/bingx.js +9 -2
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +21 -8
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +3 -3
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinlist.js +2 -3
- 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 +22 -3
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.js +4 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/kraken.js +1 -0
- package/js/src/mexc.js +2 -1
- package/js/src/okx.js +13 -3
- 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/poloniex.d.ts +2 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/woo.js +2 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,957 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ascendex$1 = require('../ascendex.js');
|
|
4
|
+
var errors = require('../base/errors.js');
|
|
5
|
+
var Cache = require('../base/ws/Cache.js');
|
|
6
|
+
var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
class ascendex extends ascendex$1 {
|
|
11
|
+
describe() {
|
|
12
|
+
return this.deepExtend(super.describe(), {
|
|
13
|
+
'has': {
|
|
14
|
+
'ws': true,
|
|
15
|
+
'watchBalance': true,
|
|
16
|
+
'watchOHLCV': true,
|
|
17
|
+
'watchOrderBook': true,
|
|
18
|
+
'watchOrders': true,
|
|
19
|
+
'watchTicker': false,
|
|
20
|
+
'watchTrades': true,
|
|
21
|
+
},
|
|
22
|
+
'urls': {
|
|
23
|
+
'api': {
|
|
24
|
+
'ws': {
|
|
25
|
+
'public': 'wss://ascendex.com:443/api/pro/v2/stream',
|
|
26
|
+
'private': 'wss://ascendex.com:443/{accountGroup}/api/pro/v2/stream',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
'test': {
|
|
30
|
+
'ws': {
|
|
31
|
+
'public': 'wss://api-test.ascendex-sandbox.com:443/api/pro/v2/stream',
|
|
32
|
+
'private': 'wss://api-test.ascendex-sandbox.com:443/{accountGroup}/api/pro/v2/stream',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
'options': {
|
|
37
|
+
'tradesLimit': 1000,
|
|
38
|
+
'ordersLimit': 1000,
|
|
39
|
+
'OHLCVLimit': 1000,
|
|
40
|
+
'categoriesAccount': {
|
|
41
|
+
'cash': 'spot',
|
|
42
|
+
'futures': 'swap',
|
|
43
|
+
'margin': 'margin',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async watchPublic(messageHash, params = {}) {
|
|
49
|
+
const url = this.urls['api']['ws']['public'];
|
|
50
|
+
const id = this.nonce();
|
|
51
|
+
const request = {
|
|
52
|
+
'id': id.toString(),
|
|
53
|
+
'op': 'sub',
|
|
54
|
+
};
|
|
55
|
+
const message = this.extend(request, params);
|
|
56
|
+
return await this.watch(url, messageHash, message, messageHash);
|
|
57
|
+
}
|
|
58
|
+
async watchPrivate(channel, messageHash, params = {}) {
|
|
59
|
+
await this.loadAccounts();
|
|
60
|
+
const accountGroup = this.safeString(this.options, 'account-group');
|
|
61
|
+
let url = this.urls['api']['ws']['private'];
|
|
62
|
+
url = this.implodeParams(url, { 'accountGroup': accountGroup });
|
|
63
|
+
const id = this.nonce();
|
|
64
|
+
const request = {
|
|
65
|
+
'id': id.toString(),
|
|
66
|
+
'op': 'sub',
|
|
67
|
+
'ch': channel,
|
|
68
|
+
};
|
|
69
|
+
const message = this.extend(request, params);
|
|
70
|
+
await this.authenticate(url, params);
|
|
71
|
+
return await this.watch(url, messageHash, message, channel);
|
|
72
|
+
}
|
|
73
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
74
|
+
/**
|
|
75
|
+
* @method
|
|
76
|
+
* @name ascendex#watchOHLCV
|
|
77
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
78
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
79
|
+
* @param {string} timeframe the length of time each candle represents
|
|
80
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
81
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
82
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
83
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
84
|
+
*/
|
|
85
|
+
await this.loadMarkets();
|
|
86
|
+
const market = this.market(symbol);
|
|
87
|
+
symbol = market['symbol'];
|
|
88
|
+
if ((limit === undefined) || (limit > 1440)) {
|
|
89
|
+
limit = 100;
|
|
90
|
+
}
|
|
91
|
+
const interval = this.safeString(this.timeframes, timeframe, timeframe);
|
|
92
|
+
const channel = 'bar' + ':' + interval + ':' + market['id'];
|
|
93
|
+
params = {
|
|
94
|
+
'ch': channel,
|
|
95
|
+
};
|
|
96
|
+
const ohlcv = await this.watchPublic(channel, params);
|
|
97
|
+
if (this.newUpdates) {
|
|
98
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
99
|
+
}
|
|
100
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
101
|
+
}
|
|
102
|
+
handleOHLCV(client, message) {
|
|
103
|
+
//
|
|
104
|
+
// {
|
|
105
|
+
// "m": "bar",
|
|
106
|
+
// "s": "ASD/USDT",
|
|
107
|
+
// "data": {
|
|
108
|
+
// "i": "1",
|
|
109
|
+
// "ts": 1575398940000,
|
|
110
|
+
// "o": "0.04993",
|
|
111
|
+
// "c": "0.04970",
|
|
112
|
+
// "h": "0.04993",
|
|
113
|
+
// "l": "0.04970",
|
|
114
|
+
// "v": "8052"
|
|
115
|
+
// }
|
|
116
|
+
// }
|
|
117
|
+
//
|
|
118
|
+
const marketId = this.safeString(message, 's');
|
|
119
|
+
const symbol = this.safeSymbol(marketId);
|
|
120
|
+
const channel = this.safeString(message, 'm');
|
|
121
|
+
const data = this.safeValue(message, 'data', {});
|
|
122
|
+
const interval = this.safeString(data, 'i');
|
|
123
|
+
const messageHash = channel + ':' + interval + ':' + marketId;
|
|
124
|
+
const timeframe = this.findTimeframe(interval);
|
|
125
|
+
const market = this.market(symbol);
|
|
126
|
+
const parsed = this.parseOHLCV(message, market);
|
|
127
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
128
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
129
|
+
if (stored === undefined) {
|
|
130
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
131
|
+
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
132
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
133
|
+
}
|
|
134
|
+
stored.append(parsed);
|
|
135
|
+
client.resolve(stored, messageHash);
|
|
136
|
+
return message;
|
|
137
|
+
}
|
|
138
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
139
|
+
/**
|
|
140
|
+
* @method
|
|
141
|
+
* @name ascendex#watchTrades
|
|
142
|
+
* @description get the list of most recent trades for a particular symbol
|
|
143
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
144
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
145
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
146
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
147
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
148
|
+
*/
|
|
149
|
+
await this.loadMarkets();
|
|
150
|
+
const market = this.market(symbol);
|
|
151
|
+
symbol = market['symbol'];
|
|
152
|
+
const channel = 'trades' + ':' + market['id'];
|
|
153
|
+
params = this.extend(params, {
|
|
154
|
+
'ch': channel,
|
|
155
|
+
});
|
|
156
|
+
const trades = await this.watchPublic(channel, params);
|
|
157
|
+
if (this.newUpdates) {
|
|
158
|
+
limit = trades.getLimit(symbol, limit);
|
|
159
|
+
}
|
|
160
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
161
|
+
}
|
|
162
|
+
handleTrades(client, message) {
|
|
163
|
+
//
|
|
164
|
+
// {
|
|
165
|
+
// "m": "trades",
|
|
166
|
+
// "symbol": "BTC/USDT",
|
|
167
|
+
// "data": [
|
|
168
|
+
// {
|
|
169
|
+
// "p": "40744.28",
|
|
170
|
+
// "q": "0.00150",
|
|
171
|
+
// "ts": 1647514330758,
|
|
172
|
+
// "bm": true,
|
|
173
|
+
// "seqnum": 72057633465800320
|
|
174
|
+
// }
|
|
175
|
+
// ]
|
|
176
|
+
// }
|
|
177
|
+
//
|
|
178
|
+
const marketId = this.safeString(message, 'symbol');
|
|
179
|
+
const symbol = this.safeSymbol(marketId);
|
|
180
|
+
const channel = this.safeString(message, 'm');
|
|
181
|
+
const messageHash = channel + ':' + marketId;
|
|
182
|
+
const market = this.market(symbol);
|
|
183
|
+
let rawData = this.safeValue(message, 'data');
|
|
184
|
+
if (rawData === undefined) {
|
|
185
|
+
rawData = [];
|
|
186
|
+
}
|
|
187
|
+
const trades = this.parseTrades(rawData, market);
|
|
188
|
+
let tradesArray = this.safeValue(this.trades, symbol);
|
|
189
|
+
if (tradesArray === undefined) {
|
|
190
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
191
|
+
tradesArray = new Cache.ArrayCache(limit);
|
|
192
|
+
}
|
|
193
|
+
for (let i = 0; i < trades.length; i++) {
|
|
194
|
+
tradesArray.append(trades[i]);
|
|
195
|
+
}
|
|
196
|
+
this.trades[symbol] = tradesArray;
|
|
197
|
+
client.resolve(tradesArray, messageHash);
|
|
198
|
+
}
|
|
199
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
200
|
+
/**
|
|
201
|
+
* @method
|
|
202
|
+
* @name ascendex#watchOrderBook
|
|
203
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
204
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
205
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
206
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
207
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
208
|
+
*/
|
|
209
|
+
await this.loadMarkets();
|
|
210
|
+
const market = this.market(symbol);
|
|
211
|
+
const channel = 'depth-realtime' + ':' + market['id'];
|
|
212
|
+
params = this.extend(params, {
|
|
213
|
+
'ch': channel,
|
|
214
|
+
});
|
|
215
|
+
const orderbook = await this.watchPublic(channel, params);
|
|
216
|
+
return orderbook.limit();
|
|
217
|
+
}
|
|
218
|
+
async watchOrderBookSnapshot(symbol, limit = undefined, params = {}) {
|
|
219
|
+
await this.loadMarkets();
|
|
220
|
+
const market = this.market(symbol);
|
|
221
|
+
const action = 'depth-snapshot-realtime';
|
|
222
|
+
const channel = action + ':' + market['id'];
|
|
223
|
+
params = this.extend(params, {
|
|
224
|
+
'action': action,
|
|
225
|
+
'args': {
|
|
226
|
+
'symbol': market['id'],
|
|
227
|
+
},
|
|
228
|
+
'op': 'req',
|
|
229
|
+
});
|
|
230
|
+
const orderbook = await this.watchPublic(channel, params);
|
|
231
|
+
return orderbook.limit();
|
|
232
|
+
}
|
|
233
|
+
handleOrderBookSnapshot(client, message) {
|
|
234
|
+
//
|
|
235
|
+
// {
|
|
236
|
+
// "m": "depth",
|
|
237
|
+
// "symbol": "BTC/USDT",
|
|
238
|
+
// "data": {
|
|
239
|
+
// "ts": 1647520500149,
|
|
240
|
+
// "seqnum": 28590487626,
|
|
241
|
+
// "asks": [
|
|
242
|
+
// [Array], [Array], [Array],
|
|
243
|
+
// [Array], [Array], [Array],
|
|
244
|
+
// ],
|
|
245
|
+
// "bids": [
|
|
246
|
+
// [Array], [Array], [Array],
|
|
247
|
+
// [Array], [Array], [Array],
|
|
248
|
+
// ]
|
|
249
|
+
// }
|
|
250
|
+
// }
|
|
251
|
+
//
|
|
252
|
+
const marketId = this.safeString(message, 'symbol');
|
|
253
|
+
const symbol = this.safeSymbol(marketId);
|
|
254
|
+
const channel = this.safeString(message, 'm');
|
|
255
|
+
const messageHash = channel + ':' + symbol;
|
|
256
|
+
const orderbook = this.orderbooks[symbol];
|
|
257
|
+
const data = this.safeValue(message, 'data');
|
|
258
|
+
const snapshot = this.parseOrderBook(data, symbol);
|
|
259
|
+
snapshot['nonce'] = this.safeInteger(data, 'seqnum');
|
|
260
|
+
orderbook.reset(snapshot);
|
|
261
|
+
// unroll the accumulated deltas
|
|
262
|
+
const messages = orderbook.cache;
|
|
263
|
+
for (let i = 0; i < messages.length; i++) {
|
|
264
|
+
const messageItem = messages[i];
|
|
265
|
+
this.handleOrderBookMessage(client, messageItem, orderbook);
|
|
266
|
+
}
|
|
267
|
+
this.orderbooks[symbol] = orderbook;
|
|
268
|
+
client.resolve(orderbook, messageHash);
|
|
269
|
+
}
|
|
270
|
+
handleOrderBook(client, message) {
|
|
271
|
+
//
|
|
272
|
+
// {
|
|
273
|
+
// "m": "depth",
|
|
274
|
+
// "symbol": "BTC/USDT",
|
|
275
|
+
// "data": {
|
|
276
|
+
// "ts": 1647515136144,
|
|
277
|
+
// "seqnum": 28590470736,
|
|
278
|
+
// "asks": [ [Array], [Array] ],
|
|
279
|
+
// "bids": [ [Array], [Array], [Array], [Array], [Array], [Array] ]
|
|
280
|
+
// }
|
|
281
|
+
// }
|
|
282
|
+
//
|
|
283
|
+
const channel = this.safeString(message, 'm');
|
|
284
|
+
const marketId = this.safeString(message, 'symbol');
|
|
285
|
+
const symbol = this.safeSymbol(marketId);
|
|
286
|
+
const messageHash = channel + ':' + marketId;
|
|
287
|
+
let orderbook = this.safeValue(this.orderbooks, symbol);
|
|
288
|
+
if (orderbook === undefined) {
|
|
289
|
+
orderbook = this.orderBook({});
|
|
290
|
+
}
|
|
291
|
+
if (orderbook['nonce'] === undefined) {
|
|
292
|
+
orderbook.cache.push(message);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
this.handleOrderBookMessage(client, message, orderbook);
|
|
296
|
+
client.resolve(orderbook, messageHash);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
handleDelta(bookside, delta) {
|
|
300
|
+
//
|
|
301
|
+
// ["40990.47","0.01619"],
|
|
302
|
+
//
|
|
303
|
+
const price = this.safeFloat(delta, 0);
|
|
304
|
+
const amount = this.safeFloat(delta, 1);
|
|
305
|
+
bookside.store(price, amount);
|
|
306
|
+
}
|
|
307
|
+
handleDeltas(bookside, deltas) {
|
|
308
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
309
|
+
this.handleDelta(bookside, deltas[i]);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
handleOrderBookMessage(client, message, orderbook) {
|
|
313
|
+
//
|
|
314
|
+
// {
|
|
315
|
+
// "m":"depth",
|
|
316
|
+
// "symbol":"BTC/USDT",
|
|
317
|
+
// "data":{
|
|
318
|
+
// "ts":1647527417715,
|
|
319
|
+
// "seqnum":28590257013,
|
|
320
|
+
// "asks":[
|
|
321
|
+
// ["40990.47","0.01619"],
|
|
322
|
+
// ["41021.21","0"],
|
|
323
|
+
// ["41031.59","0.06096"]
|
|
324
|
+
// ],
|
|
325
|
+
// "bids":[
|
|
326
|
+
// ["40990.46","0.76114"],
|
|
327
|
+
// ["40985.18","0"]
|
|
328
|
+
// ]
|
|
329
|
+
// }
|
|
330
|
+
// }
|
|
331
|
+
//
|
|
332
|
+
const data = this.safeValue(message, 'data', {});
|
|
333
|
+
const seqNum = this.safeInteger(data, 'seqnum');
|
|
334
|
+
if (seqNum > orderbook['nonce']) {
|
|
335
|
+
const asks = this.safeValue(data, 'asks', []);
|
|
336
|
+
const bids = this.safeValue(data, 'bids', []);
|
|
337
|
+
this.handleDeltas(orderbook['asks'], asks);
|
|
338
|
+
this.handleDeltas(orderbook['bids'], bids);
|
|
339
|
+
orderbook['nonce'] = seqNum;
|
|
340
|
+
const timestamp = this.safeInteger(data, 'ts');
|
|
341
|
+
orderbook['timestamp'] = timestamp;
|
|
342
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
343
|
+
}
|
|
344
|
+
return orderbook;
|
|
345
|
+
}
|
|
346
|
+
async watchBalance(params = {}) {
|
|
347
|
+
/**
|
|
348
|
+
* @method
|
|
349
|
+
* @name ascendex#watchBalance
|
|
350
|
+
* @description watch balance and get the amount of funds available for trading or funds locked in orders
|
|
351
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
352
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
353
|
+
*/
|
|
354
|
+
await this.loadMarkets();
|
|
355
|
+
const [type, query] = this.handleMarketTypeAndParams('watchBalance', undefined, params);
|
|
356
|
+
let channel = undefined;
|
|
357
|
+
let messageHash = undefined;
|
|
358
|
+
if ((type === 'spot') || (type === 'margin')) {
|
|
359
|
+
const accountCategories = this.safeValue(this.options, 'accountCategories', {});
|
|
360
|
+
let accountCategory = this.safeString(accountCategories, type, 'cash'); // cash, margin,
|
|
361
|
+
accountCategory = accountCategory.toUpperCase();
|
|
362
|
+
channel = 'order:' + accountCategory; // order and balance share the same channel
|
|
363
|
+
messageHash = 'balance:' + type;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
channel = 'futures-account-update';
|
|
367
|
+
messageHash = 'balance:swap';
|
|
368
|
+
}
|
|
369
|
+
return await this.watchPrivate(channel, messageHash, query);
|
|
370
|
+
}
|
|
371
|
+
handleBalance(client, message) {
|
|
372
|
+
//
|
|
373
|
+
// cash account
|
|
374
|
+
//
|
|
375
|
+
// {
|
|
376
|
+
// "m": "balance",
|
|
377
|
+
// "accountId": "cshQtyfq8XLAA9kcf19h8bXHbAwwoqDo",
|
|
378
|
+
// "ac": "CASH",
|
|
379
|
+
// "data": {
|
|
380
|
+
// "a" : "USDT",
|
|
381
|
+
// "sn": 8159798,
|
|
382
|
+
// "tb": "600",
|
|
383
|
+
// "ab": "600"
|
|
384
|
+
// }
|
|
385
|
+
// }
|
|
386
|
+
//
|
|
387
|
+
// margin account
|
|
388
|
+
//
|
|
389
|
+
// {
|
|
390
|
+
// "m": "balance",
|
|
391
|
+
// "accountId": "marOxpKJV83dxTRx0Eyxpa0gxc4Txt0P",
|
|
392
|
+
// "ac": "MARGIN",
|
|
393
|
+
// "data": {
|
|
394
|
+
// "a" : "USDT",
|
|
395
|
+
// "sn" : 8159802,
|
|
396
|
+
// "tb" : "400", // total Balance
|
|
397
|
+
// "ab" : "400", // available balance
|
|
398
|
+
// "brw": "0", // borrowws
|
|
399
|
+
// "int": "0" // interest
|
|
400
|
+
// }
|
|
401
|
+
// }
|
|
402
|
+
//
|
|
403
|
+
// futures
|
|
404
|
+
// {
|
|
405
|
+
// "m" : "futures-account-update", // message
|
|
406
|
+
// "e" : "ExecutionReport", // event type
|
|
407
|
+
// "t" : 1612508562129, // time
|
|
408
|
+
// "acc" : "futures-account-id", // account ID
|
|
409
|
+
// "at" : "FUTURES", // account type
|
|
410
|
+
// "sn" : 23128, // sequence number,
|
|
411
|
+
// "id" : "r177710001cbU3813942147C5kbFGOan",
|
|
412
|
+
// "col": [
|
|
413
|
+
// {
|
|
414
|
+
// "a": "USDT", // asset code
|
|
415
|
+
// "b": "1000000", // balance
|
|
416
|
+
// "f": "1" // discount factor
|
|
417
|
+
// }
|
|
418
|
+
// ],
|
|
419
|
+
// (...)
|
|
420
|
+
//
|
|
421
|
+
const channel = this.safeString(message, 'm');
|
|
422
|
+
let result = undefined;
|
|
423
|
+
let type = undefined;
|
|
424
|
+
if ((channel === 'order') || (channel === 'futures-order')) {
|
|
425
|
+
const data = this.safeValue(message, 'data');
|
|
426
|
+
const marketId = this.safeString(data, 's');
|
|
427
|
+
const market = this.safeMarket(marketId);
|
|
428
|
+
const baseAccount = this.account();
|
|
429
|
+
baseAccount['free'] = this.safeString(data, 'bab');
|
|
430
|
+
baseAccount['total'] = this.safeString(data, 'btb');
|
|
431
|
+
const quoteAccount = this.account();
|
|
432
|
+
quoteAccount['free'] = this.safeString(data, 'qab');
|
|
433
|
+
quoteAccount['total'] = this.safeString(data, 'qtb');
|
|
434
|
+
if (market['contract']) {
|
|
435
|
+
type = 'swap';
|
|
436
|
+
result = this.safeValue(this.balance, type, {});
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
type = market['type'];
|
|
440
|
+
result = this.safeValue(this.balance, type, {});
|
|
441
|
+
}
|
|
442
|
+
result[market['base']] = baseAccount;
|
|
443
|
+
result[market['quote']] = quoteAccount;
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
const accountType = this.safeStringLower2(message, 'ac', 'at');
|
|
447
|
+
const categoriesAccounts = this.safeValue(this.options, 'categoriesAccount');
|
|
448
|
+
type = this.safeString(categoriesAccounts, accountType, 'spot');
|
|
449
|
+
result = this.safeValue(this.balance, type, {});
|
|
450
|
+
const data = this.safeValue(message, 'data');
|
|
451
|
+
let balances = undefined;
|
|
452
|
+
if (data === undefined) {
|
|
453
|
+
balances = this.safeValue(message, 'col');
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
balances = [data];
|
|
457
|
+
}
|
|
458
|
+
for (let i = 0; i < balances.length; i++) {
|
|
459
|
+
const balance = balances[i];
|
|
460
|
+
const code = this.safeCurrencyCode(this.safeString(balance, 'a'));
|
|
461
|
+
const account = this.account();
|
|
462
|
+
account['free'] = this.safeString(balance, 'ab');
|
|
463
|
+
account['total'] = this.safeString2(balance, 'tb', 'b');
|
|
464
|
+
result[code] = account;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const messageHash = 'balance' + ':' + type;
|
|
468
|
+
client.resolve(this.safeBalance(result), messageHash);
|
|
469
|
+
}
|
|
470
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
471
|
+
/**
|
|
472
|
+
* @method
|
|
473
|
+
* @name ascendex#watchOrders
|
|
474
|
+
* @see https://ascendex.github.io/ascendex-pro-api/#channel-order-and-balance
|
|
475
|
+
* @description watches information on multiple orders made by the user
|
|
476
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
477
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
478
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
479
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
480
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
481
|
+
*/
|
|
482
|
+
await this.loadMarkets();
|
|
483
|
+
let market = undefined;
|
|
484
|
+
if (symbol !== undefined) {
|
|
485
|
+
market = this.market(symbol);
|
|
486
|
+
symbol = market['symbol'];
|
|
487
|
+
}
|
|
488
|
+
const [type, query] = this.handleMarketTypeAndParams('watchOrders', market, params);
|
|
489
|
+
let messageHash = undefined;
|
|
490
|
+
let channel = undefined;
|
|
491
|
+
if (type !== 'spot' && type !== 'margin') {
|
|
492
|
+
channel = 'futures-order';
|
|
493
|
+
messageHash = 'order:FUTURES';
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
const accountCategories = this.safeValue(this.options, 'accountCategories', {});
|
|
497
|
+
let accountCategory = this.safeString(accountCategories, type, 'cash'); // cash, margin
|
|
498
|
+
accountCategory = accountCategory.toUpperCase();
|
|
499
|
+
messageHash = 'order' + ':' + accountCategory;
|
|
500
|
+
channel = messageHash;
|
|
501
|
+
}
|
|
502
|
+
if (symbol !== undefined) {
|
|
503
|
+
messageHash = messageHash + ':' + symbol;
|
|
504
|
+
}
|
|
505
|
+
const orders = await this.watchPrivate(channel, messageHash, query);
|
|
506
|
+
if (this.newUpdates) {
|
|
507
|
+
limit = orders.getLimit(symbol, limit);
|
|
508
|
+
}
|
|
509
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
510
|
+
}
|
|
511
|
+
handleOrder(client, message) {
|
|
512
|
+
//
|
|
513
|
+
// spot order
|
|
514
|
+
// {
|
|
515
|
+
// "m": "order",
|
|
516
|
+
// "accountId": "cshF5SlR9ukAXoDOuXbND4dVpBMw9gzH",
|
|
517
|
+
// "ac": "CASH",
|
|
518
|
+
// "data": {
|
|
519
|
+
// "sn": 19399016185,
|
|
520
|
+
// "orderId": "r17f9d7983faU7223046196CMlrj3bfC",
|
|
521
|
+
// "s": "LTC/USDT",
|
|
522
|
+
// "ot": "Limit",
|
|
523
|
+
// "t": 1647614461160,
|
|
524
|
+
// "p": "50",
|
|
525
|
+
// "q": "0.1",
|
|
526
|
+
// "sd": "Buy",
|
|
527
|
+
// "st": "New",
|
|
528
|
+
// "ap": "0",
|
|
529
|
+
// "cfq": "0",
|
|
530
|
+
// "sp": '',
|
|
531
|
+
// "err": '',
|
|
532
|
+
// "btb": "0",
|
|
533
|
+
// "bab": "0",
|
|
534
|
+
// "qtb": "8",
|
|
535
|
+
// "qab": "2.995",
|
|
536
|
+
// "cf": "0",
|
|
537
|
+
// "fa": "USDT",
|
|
538
|
+
// "ei": "NULL_VAL"
|
|
539
|
+
// }
|
|
540
|
+
// }
|
|
541
|
+
//
|
|
542
|
+
// futures order
|
|
543
|
+
// {
|
|
544
|
+
// "m": "futures-order",
|
|
545
|
+
// "sn": 19399927636,
|
|
546
|
+
// "e": "ExecutionReport",
|
|
547
|
+
// "a": "futF5SlR9ukAXoDOuXbND4dVpBMw9gzH", // account id
|
|
548
|
+
// "ac": "FUTURES",
|
|
549
|
+
// "t": 1647622515434, // last execution time
|
|
550
|
+
// (...)
|
|
551
|
+
// }
|
|
552
|
+
//
|
|
553
|
+
const accountType = this.safeString(message, 'ac');
|
|
554
|
+
const messageHash = 'order:' + accountType;
|
|
555
|
+
const data = this.safeValue(message, 'data', message);
|
|
556
|
+
const order = this.parseWsOrder(data);
|
|
557
|
+
if (this.orders === undefined) {
|
|
558
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
559
|
+
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
560
|
+
}
|
|
561
|
+
const orders = this.orders;
|
|
562
|
+
orders.append(order);
|
|
563
|
+
const symbolMessageHash = messageHash + ':' + order['symbol'];
|
|
564
|
+
client.resolve(orders, symbolMessageHash);
|
|
565
|
+
client.resolve(orders, messageHash);
|
|
566
|
+
}
|
|
567
|
+
parseWsOrder(order, market = undefined) {
|
|
568
|
+
//
|
|
569
|
+
// spot order
|
|
570
|
+
// {
|
|
571
|
+
// "sn": 19399016185, //sequence number
|
|
572
|
+
// "orderId": "r17f9d7983faU7223046196CMlrj3bfC",
|
|
573
|
+
// "s": "LTC/USDT",
|
|
574
|
+
// "ot": "Limit", // order type
|
|
575
|
+
// "t": 1647614461160, // last execution timestamp
|
|
576
|
+
// "p": "50", // price
|
|
577
|
+
// "q": "0.1", // quantity
|
|
578
|
+
// "sd": "Buy", // side
|
|
579
|
+
// "st": "New", // status
|
|
580
|
+
// "ap": "0", // average fill price
|
|
581
|
+
// "cfq": "0", // cumulated fill quantity
|
|
582
|
+
// "sp": '', // stop price
|
|
583
|
+
// "err": '',
|
|
584
|
+
// "btb": "0", // base asset total balance
|
|
585
|
+
// "bab": "0", // base asset available balance
|
|
586
|
+
// "qtb": "8", // quote asset total balance
|
|
587
|
+
// "qab": "2.995", // quote asset available balance
|
|
588
|
+
// "cf": "0", // cumulated commission
|
|
589
|
+
// "fa": "USDT", // fee asset
|
|
590
|
+
// "ei": "NULL_VAL"
|
|
591
|
+
// }
|
|
592
|
+
//
|
|
593
|
+
// futures order
|
|
594
|
+
// {
|
|
595
|
+
// "m": "futures-order",
|
|
596
|
+
// "sn": 19399927636,
|
|
597
|
+
// "e": "ExecutionReport",
|
|
598
|
+
// "a": "futF5SlR9ukAXoDOuXbND4dVpBMw9gzH", // account id
|
|
599
|
+
// "ac": "FUTURES",
|
|
600
|
+
// "t": 1647622515434, // last execution time
|
|
601
|
+
// "ct": 1647622515413, // order creation time
|
|
602
|
+
// "orderId": "r17f9df469b1U7223046196Okf5Kbmd",
|
|
603
|
+
// "sd": "Buy", // side
|
|
604
|
+
// "ot": "Limit", // order type
|
|
605
|
+
// "ei": "NULL_VAL",
|
|
606
|
+
// "q": "1", // quantity
|
|
607
|
+
// "p": "50", //price
|
|
608
|
+
// "sp": "0", // stopPrice
|
|
609
|
+
// "spb": '', // stopTrigger
|
|
610
|
+
// "s": "LTC-PERP", // symbol
|
|
611
|
+
// "st": "New", // state
|
|
612
|
+
// "err": '',
|
|
613
|
+
// "lp": "0", // last filled price
|
|
614
|
+
// "lq": "0", // last filled quantity (base asset)
|
|
615
|
+
// "ap": "0", // average filled price
|
|
616
|
+
// "cfq": "0", // cummulative filled quantity (base asset)
|
|
617
|
+
// "f": "0", // commission fee of the current execution
|
|
618
|
+
// "cf": "0", // cumulative commission fee
|
|
619
|
+
// "fa": "USDT", // fee asset
|
|
620
|
+
// "psl": "0",
|
|
621
|
+
// "pslt": "market",
|
|
622
|
+
// "ptp": "0",
|
|
623
|
+
// "ptpt": "market"
|
|
624
|
+
// }
|
|
625
|
+
//
|
|
626
|
+
const status = this.parseOrderStatus(this.safeString(order, 'st'));
|
|
627
|
+
const marketId = this.safeString(order, 's');
|
|
628
|
+
const timestamp = this.safeInteger(order, 't');
|
|
629
|
+
const symbol = this.safeSymbol(marketId, market, '/');
|
|
630
|
+
const lastTradeTimestamp = this.safeInteger(order, 't');
|
|
631
|
+
const price = this.safeString(order, 'p');
|
|
632
|
+
const amount = this.safeString(order, 'q');
|
|
633
|
+
const average = this.safeString(order, 'ap');
|
|
634
|
+
const filled = this.safeString(order, 'cfq');
|
|
635
|
+
const id = this.safeString(order, 'orderId');
|
|
636
|
+
const type = this.safeStringLower(order, 'ot');
|
|
637
|
+
const side = this.safeStringLower(order, 'sd');
|
|
638
|
+
const feeCost = this.safeNumber(order, 'cf');
|
|
639
|
+
let fee = undefined;
|
|
640
|
+
if (feeCost !== undefined) {
|
|
641
|
+
const feeCurrencyId = this.safeString(order, 'fa');
|
|
642
|
+
const feeCurrencyCode = this.safeCurrencyCode(feeCurrencyId);
|
|
643
|
+
fee = {
|
|
644
|
+
'cost': feeCost,
|
|
645
|
+
'currency': feeCurrencyCode,
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
const stopPrice = this.parseNumber(this.omitZero(this.safeString(order, 'sp')));
|
|
649
|
+
return this.safeOrder({
|
|
650
|
+
'info': order,
|
|
651
|
+
'id': id,
|
|
652
|
+
'clientOrderId': undefined,
|
|
653
|
+
'timestamp': timestamp,
|
|
654
|
+
'datetime': this.iso8601(timestamp),
|
|
655
|
+
'lastTradeTimestamp': lastTradeTimestamp,
|
|
656
|
+
'symbol': symbol,
|
|
657
|
+
'type': type,
|
|
658
|
+
'timeInForce': undefined,
|
|
659
|
+
'postOnly': undefined,
|
|
660
|
+
'side': side,
|
|
661
|
+
'price': price,
|
|
662
|
+
'stopPrice': stopPrice,
|
|
663
|
+
'triggerPrice': stopPrice,
|
|
664
|
+
'amount': amount,
|
|
665
|
+
'cost': undefined,
|
|
666
|
+
'average': average,
|
|
667
|
+
'filled': filled,
|
|
668
|
+
'remaining': undefined,
|
|
669
|
+
'status': status,
|
|
670
|
+
'fee': fee,
|
|
671
|
+
'trades': undefined,
|
|
672
|
+
}, market);
|
|
673
|
+
}
|
|
674
|
+
handleErrorMessage(client, message) {
|
|
675
|
+
//
|
|
676
|
+
// {
|
|
677
|
+
// "m": "disconnected",
|
|
678
|
+
// "code": 100005,
|
|
679
|
+
// "reason": "INVALID_WS_REQUEST_DATA",
|
|
680
|
+
// "info": "Session is disconnected due to missing pong message from the client"
|
|
681
|
+
// }
|
|
682
|
+
//
|
|
683
|
+
const errorCode = this.safeInteger(message, 'code');
|
|
684
|
+
try {
|
|
685
|
+
if (errorCode !== undefined) {
|
|
686
|
+
const feedback = this.id + ' ' + this.json(message);
|
|
687
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
688
|
+
const messageString = this.safeValue(message, 'message');
|
|
689
|
+
if (messageString !== undefined) {
|
|
690
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
catch (e) {
|
|
696
|
+
if (e instanceof errors.AuthenticationError) {
|
|
697
|
+
const messageHash = 'authenticated';
|
|
698
|
+
client.reject(e, messageHash);
|
|
699
|
+
if (messageHash in client.subscriptions) {
|
|
700
|
+
delete client.subscriptions[messageHash];
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
client.reject(e);
|
|
705
|
+
}
|
|
706
|
+
return true;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
handleAuthenticate(client, message) {
|
|
710
|
+
//
|
|
711
|
+
// { m: "auth", id: "1647605234", code: 0 }
|
|
712
|
+
//
|
|
713
|
+
const messageHash = 'authenticated';
|
|
714
|
+
client.resolve(message, messageHash);
|
|
715
|
+
}
|
|
716
|
+
handleMessage(client, message) {
|
|
717
|
+
if (this.handleErrorMessage(client, message)) {
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
//
|
|
721
|
+
// { m: "ping", hp: 3 }
|
|
722
|
+
//
|
|
723
|
+
// { m: "sub", ch: "bar:BTC/USDT", code: 0 }
|
|
724
|
+
//
|
|
725
|
+
// { m: 'sub', id: "1647515701", ch: "depth:BTC/USDT", code: 0 }
|
|
726
|
+
//
|
|
727
|
+
// { m: "connected", type: "unauth" }
|
|
728
|
+
//
|
|
729
|
+
// { m: "auth", id: "1647605234", code: 0 }
|
|
730
|
+
//
|
|
731
|
+
// order or balance sub
|
|
732
|
+
// {
|
|
733
|
+
// "m": "sub",
|
|
734
|
+
// "id": "1647605952",
|
|
735
|
+
// "ch": "order:cshF5SlR9ukAXoDOuXbND4dVpBMw9gzH", or futures-order
|
|
736
|
+
// "code": 0
|
|
737
|
+
// }
|
|
738
|
+
//
|
|
739
|
+
// ohlcv
|
|
740
|
+
// {
|
|
741
|
+
// "m": "bar",
|
|
742
|
+
// "s": "BTC/USDT",
|
|
743
|
+
// "data": {
|
|
744
|
+
// "i": "1",
|
|
745
|
+
// "ts": 1647510060000,
|
|
746
|
+
// "o": "40813.93",
|
|
747
|
+
// "c": "40804.57",
|
|
748
|
+
// "h": "40814.21",
|
|
749
|
+
// "l": "40804.56",
|
|
750
|
+
// "v": "0.01537"
|
|
751
|
+
// }
|
|
752
|
+
// }
|
|
753
|
+
//
|
|
754
|
+
// trades
|
|
755
|
+
//
|
|
756
|
+
// {
|
|
757
|
+
// "m": "trades",
|
|
758
|
+
// "symbol": "BTC/USDT",
|
|
759
|
+
// "data": [
|
|
760
|
+
// {
|
|
761
|
+
// "p": "40762.26",
|
|
762
|
+
// "q": "0.01500",
|
|
763
|
+
// "ts": 1647514306759,
|
|
764
|
+
// "bm": true,
|
|
765
|
+
// "seqnum": 72057633465795180
|
|
766
|
+
// }
|
|
767
|
+
// ]
|
|
768
|
+
// }
|
|
769
|
+
//
|
|
770
|
+
// orderbook deltas
|
|
771
|
+
//
|
|
772
|
+
// {
|
|
773
|
+
// "m":"depth",
|
|
774
|
+
// "symbol":"BTC/USDT",
|
|
775
|
+
// "data":{
|
|
776
|
+
// "ts":1647527417715,
|
|
777
|
+
// "seqnum":28590257013,
|
|
778
|
+
// "asks":[
|
|
779
|
+
// ["40990.47","0.01619"],
|
|
780
|
+
// ["41021.21","0"],
|
|
781
|
+
// ["41031.59","0.06096"]
|
|
782
|
+
// ],
|
|
783
|
+
// "bids":[
|
|
784
|
+
// ["40990.46","0.76114"],
|
|
785
|
+
// ["40985.18","0"]
|
|
786
|
+
// ]
|
|
787
|
+
// }
|
|
788
|
+
// }
|
|
789
|
+
//
|
|
790
|
+
// orderbook snapshot
|
|
791
|
+
// {
|
|
792
|
+
// "m": "depth-snapshot",
|
|
793
|
+
// "symbol": "BTC/USDT",
|
|
794
|
+
// "data": {
|
|
795
|
+
// "ts": 1647525938513,
|
|
796
|
+
// "seqnum": 28590504772,
|
|
797
|
+
// "asks": [
|
|
798
|
+
// [Array], [Array], [Array], [Array], [Array], [Array], [Array],
|
|
799
|
+
// [Array], [Array], [Array], [Array], [Array], [Array], [Array],
|
|
800
|
+
// [Array], [Array], [Array], [Array], [Array], [Array], [Array],
|
|
801
|
+
// (...)
|
|
802
|
+
// ]
|
|
803
|
+
// }
|
|
804
|
+
//
|
|
805
|
+
// spot order update
|
|
806
|
+
// {
|
|
807
|
+
// "m": "order",
|
|
808
|
+
// "accountId": "cshQtyfq8XLAA9kcf19h8bXHbAwwoqDo",
|
|
809
|
+
// "ac": "CASH",
|
|
810
|
+
// "data": {
|
|
811
|
+
// "s": "BTC/USDT",
|
|
812
|
+
// "sn": 8159711,
|
|
813
|
+
// "sd": "Buy",
|
|
814
|
+
// "ap": "0",
|
|
815
|
+
// "bab": "2006.5974027",
|
|
816
|
+
// "btb": "2006.5974027",
|
|
817
|
+
// "cf": "0",
|
|
818
|
+
// "cfq": "0",
|
|
819
|
+
// (...)
|
|
820
|
+
// }
|
|
821
|
+
// }
|
|
822
|
+
// future order update
|
|
823
|
+
// {
|
|
824
|
+
// "m": "futures-order",
|
|
825
|
+
// "sn": 19404258063,
|
|
826
|
+
// "e": "ExecutionReport",
|
|
827
|
+
// "a": "futF5SlR9ukAXoDOuXbND4dVpBMw9gzH",
|
|
828
|
+
// "ac": "FUTURES",
|
|
829
|
+
// "t": 1647681792543,
|
|
830
|
+
// "ct": 1647622515413,
|
|
831
|
+
// "orderId": "r17f9df469b1U7223046196Okf5KbmdL",
|
|
832
|
+
// (...)
|
|
833
|
+
// "ptpt": "None"
|
|
834
|
+
// }
|
|
835
|
+
//
|
|
836
|
+
// balance update cash
|
|
837
|
+
// {
|
|
838
|
+
// "m": "balance",
|
|
839
|
+
// "accountId": "cshQtyfq8XLAA9kcf19h8bXHbAwwoqDo",
|
|
840
|
+
// "ac": "CASH",
|
|
841
|
+
// "data": {
|
|
842
|
+
// "a" : "USDT",
|
|
843
|
+
// "sn": 8159798,
|
|
844
|
+
// "tb": "600",
|
|
845
|
+
// "ab": "600"
|
|
846
|
+
// }
|
|
847
|
+
// }
|
|
848
|
+
//
|
|
849
|
+
// balance update margin
|
|
850
|
+
// {
|
|
851
|
+
// "m": "balance",
|
|
852
|
+
// "accountId": "marOxpKJV83dxTRx0Eyxpa0gxc4Txt0P",
|
|
853
|
+
// "ac": "MARGIN",
|
|
854
|
+
// "data": {
|
|
855
|
+
// "a" : "USDT",
|
|
856
|
+
// "sn" : 8159802,
|
|
857
|
+
// "tb" : "400",
|
|
858
|
+
// "ab" : "400",
|
|
859
|
+
// "brw": "0",
|
|
860
|
+
// "int": "0"
|
|
861
|
+
// }
|
|
862
|
+
// }
|
|
863
|
+
//
|
|
864
|
+
const subject = this.safeString(message, 'm');
|
|
865
|
+
const methods = {
|
|
866
|
+
'ping': this.handlePing,
|
|
867
|
+
'auth': this.handleAuthenticate,
|
|
868
|
+
'sub': this.handleSubscriptionStatus,
|
|
869
|
+
'depth-realtime': this.handleOrderBook,
|
|
870
|
+
'depth-snapshot-realtime': this.handleOrderBookSnapshot,
|
|
871
|
+
'trades': this.handleTrades,
|
|
872
|
+
'bar': this.handleOHLCV,
|
|
873
|
+
'balance': this.handleBalance,
|
|
874
|
+
'futures-account-update': this.handleBalance,
|
|
875
|
+
};
|
|
876
|
+
const method = this.safeValue(methods, subject);
|
|
877
|
+
if (method !== undefined) {
|
|
878
|
+
method.call(this, client, message);
|
|
879
|
+
}
|
|
880
|
+
if ((subject === 'order') || (subject === 'futures-order')) {
|
|
881
|
+
// this.handleOrder (client, message);
|
|
882
|
+
// balance updates may be in the order structure
|
|
883
|
+
// they may also be standalone balance updates related to account transfers
|
|
884
|
+
this.handleOrder(client, message);
|
|
885
|
+
if (subject === 'order') {
|
|
886
|
+
this.handleBalance(client, message);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
return message;
|
|
890
|
+
}
|
|
891
|
+
handleSubscriptionStatus(client, message) {
|
|
892
|
+
//
|
|
893
|
+
// { m: "sub", ch: "bar:BTC/USDT", code: 0 }
|
|
894
|
+
//
|
|
895
|
+
// { m: 'sub', id: "1647515701", ch: "depth:BTC/USDT", code: 0 }
|
|
896
|
+
//
|
|
897
|
+
const channel = this.safeString(message, 'ch', '');
|
|
898
|
+
if (channel.indexOf('depth-realtime') > -1) {
|
|
899
|
+
this.handleOrderBookSubscription(client, message);
|
|
900
|
+
}
|
|
901
|
+
return message;
|
|
902
|
+
}
|
|
903
|
+
handleOrderBookSubscription(client, message) {
|
|
904
|
+
const channel = this.safeString(message, 'ch');
|
|
905
|
+
const parts = channel.split(':');
|
|
906
|
+
const marketId = parts[1];
|
|
907
|
+
const symbol = this.safeSymbol(marketId);
|
|
908
|
+
if (symbol in this.orderbooks) {
|
|
909
|
+
delete this.orderbooks[symbol];
|
|
910
|
+
}
|
|
911
|
+
this.orderbooks[symbol] = this.orderBook({});
|
|
912
|
+
this.spawn(this.watchOrderBookSnapshot, symbol);
|
|
913
|
+
}
|
|
914
|
+
async pong(client, message) {
|
|
915
|
+
//
|
|
916
|
+
// { m: "ping", hp: 3 }
|
|
917
|
+
//
|
|
918
|
+
try {
|
|
919
|
+
await client.send({ 'op': 'pong', 'hp': this.safeInteger(message, 'hp') });
|
|
920
|
+
}
|
|
921
|
+
catch (e) {
|
|
922
|
+
const error = new errors.NetworkError(this.id + ' handlePing failed with error ' + this.json(e));
|
|
923
|
+
client.reset(error);
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
handlePing(client, message) {
|
|
927
|
+
this.spawn(this.pong, client, message);
|
|
928
|
+
}
|
|
929
|
+
authenticate(url, params = {}) {
|
|
930
|
+
this.checkRequiredCredentials();
|
|
931
|
+
const messageHash = 'authenticated';
|
|
932
|
+
const client = this.client(url);
|
|
933
|
+
let future = this.safeValue(client.subscriptions, messageHash);
|
|
934
|
+
if (future === undefined) {
|
|
935
|
+
const timestamp = this.milliseconds().toString();
|
|
936
|
+
const urlParts = url.split('/');
|
|
937
|
+
const partsLength = urlParts.length;
|
|
938
|
+
const path = this.safeString(urlParts, partsLength - 1);
|
|
939
|
+
const version = this.safeString(urlParts, partsLength - 2);
|
|
940
|
+
const auth = timestamp + '+' + version + '/' + path;
|
|
941
|
+
const secret = this.base64ToBinary(this.secret);
|
|
942
|
+
const signature = this.hmac(this.encode(auth), secret, sha256.sha256, 'base64');
|
|
943
|
+
const request = {
|
|
944
|
+
'op': 'auth',
|
|
945
|
+
'id': this.nonce().toString(),
|
|
946
|
+
't': timestamp,
|
|
947
|
+
'key': this.apiKey,
|
|
948
|
+
'sig': signature,
|
|
949
|
+
};
|
|
950
|
+
future = this.watch(url, messageHash, this.extend(request, params));
|
|
951
|
+
client.subscriptions[messageHash] = future;
|
|
952
|
+
}
|
|
953
|
+
return future;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
module.exports = ascendex;
|