ccxt 4.2.10 → 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 +4 -4
- package/dist/ccxt.browser.js +695 -282
- 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/dist/cjs/src/base/Exchange.js +11 -0
- package/dist/cjs/src/bingx.js +0 -10
- package/dist/cjs/src/bitget.js +14 -5
- package/dist/cjs/src/bybit.js +1 -1
- package/dist/cjs/src/kucoin.js +29 -5
- 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 +6 -1
- package/js/src/base/Exchange.js +112 -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.d.ts +0 -1
- package/js/src/bingx.js +9 -12
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +35 -13
- 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 +3 -1
- 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/kucoin.js +29 -5
- 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 +11 -11
- package/skip-tests.json +5 -0
- package/tests-manager.sh +2 -2
|
@@ -0,0 +1,704 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var bitvavo$1 = require('../bitvavo.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 bitvavo extends bitvavo$1 {
|
|
11
|
+
describe() {
|
|
12
|
+
return this.deepExtend(super.describe(), {
|
|
13
|
+
'has': {
|
|
14
|
+
'ws': true,
|
|
15
|
+
'createOrderWs': false,
|
|
16
|
+
'editOrderWs': false,
|
|
17
|
+
'fetchOpenOrdersWs': false,
|
|
18
|
+
'fetchOrderWs': false,
|
|
19
|
+
'cancelOrderWs': false,
|
|
20
|
+
'cancelOrdersWs': false,
|
|
21
|
+
'cancelAllOrdersWs': false,
|
|
22
|
+
'fetchTradesWs': false,
|
|
23
|
+
'fetchBalanceWs': false,
|
|
24
|
+
'watchOrderBook': true,
|
|
25
|
+
'watchTrades': true,
|
|
26
|
+
'watchTicker': true,
|
|
27
|
+
'watchOHLCV': true,
|
|
28
|
+
'watchOrders': true,
|
|
29
|
+
'watchMyTrades': true,
|
|
30
|
+
},
|
|
31
|
+
'urls': {
|
|
32
|
+
'api': {
|
|
33
|
+
'ws': 'wss://ws.bitvavo.com/v2',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
'options': {
|
|
37
|
+
'tradesLimit': 1000,
|
|
38
|
+
'ordersLimit': 1000,
|
|
39
|
+
'OHLCVLimit': 1000,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async watchPublic(name, symbol, params = {}) {
|
|
44
|
+
await this.loadMarkets();
|
|
45
|
+
const market = this.market(symbol);
|
|
46
|
+
const messageHash = name + '@' + market['id'];
|
|
47
|
+
const url = this.urls['api']['ws'];
|
|
48
|
+
const request = {
|
|
49
|
+
'action': 'subscribe',
|
|
50
|
+
'channels': [
|
|
51
|
+
{
|
|
52
|
+
'name': name,
|
|
53
|
+
'markets': [
|
|
54
|
+
market['id'],
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
const message = this.extend(request, params);
|
|
60
|
+
return await this.watch(url, messageHash, message, messageHash);
|
|
61
|
+
}
|
|
62
|
+
async watchTicker(symbol, params = {}) {
|
|
63
|
+
/**
|
|
64
|
+
* @method
|
|
65
|
+
* @name bitvavo#watchTicker
|
|
66
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
67
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
68
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
69
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
70
|
+
*/
|
|
71
|
+
return await this.watchPublic('ticker24h', symbol, params);
|
|
72
|
+
}
|
|
73
|
+
handleTicker(client, message) {
|
|
74
|
+
//
|
|
75
|
+
// {
|
|
76
|
+
// "event": "ticker24h",
|
|
77
|
+
// "data": [
|
|
78
|
+
// {
|
|
79
|
+
// "market": "ETH-EUR",
|
|
80
|
+
// "open": "193.5",
|
|
81
|
+
// "high": "202.72",
|
|
82
|
+
// "low": "192.46",
|
|
83
|
+
// "last": "199.01",
|
|
84
|
+
// "volume": "3587.05020246",
|
|
85
|
+
// "volumeQuote": "708030.17",
|
|
86
|
+
// "bid": "199.56",
|
|
87
|
+
// "bidSize": "4.14730803",
|
|
88
|
+
// "ask": "199.57",
|
|
89
|
+
// "askSize": "6.13642074",
|
|
90
|
+
// "timestamp": 1590770885217
|
|
91
|
+
// }
|
|
92
|
+
// ]
|
|
93
|
+
// }
|
|
94
|
+
//
|
|
95
|
+
const event = this.safeString(message, 'event');
|
|
96
|
+
const tickers = this.safeValue(message, 'data', []);
|
|
97
|
+
for (let i = 0; i < tickers.length; i++) {
|
|
98
|
+
const data = tickers[i];
|
|
99
|
+
const marketId = this.safeString(data, 'market');
|
|
100
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
101
|
+
const messageHash = event + '@' + marketId;
|
|
102
|
+
const ticker = this.parseTicker(data, market);
|
|
103
|
+
const symbol = ticker['symbol'];
|
|
104
|
+
this.tickers[symbol] = ticker;
|
|
105
|
+
client.resolve(ticker, messageHash);
|
|
106
|
+
}
|
|
107
|
+
return message;
|
|
108
|
+
}
|
|
109
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
110
|
+
/**
|
|
111
|
+
* @method
|
|
112
|
+
* @name bitvavo#watchTrades
|
|
113
|
+
* @description get the list of most recent trades for a particular symbol
|
|
114
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
115
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
116
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
117
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
118
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
119
|
+
*/
|
|
120
|
+
await this.loadMarkets();
|
|
121
|
+
symbol = this.symbol(symbol);
|
|
122
|
+
const trades = await this.watchPublic('trades', symbol, params);
|
|
123
|
+
if (this.newUpdates) {
|
|
124
|
+
limit = trades.getLimit(symbol, limit);
|
|
125
|
+
}
|
|
126
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
127
|
+
}
|
|
128
|
+
handleTrade(client, message) {
|
|
129
|
+
//
|
|
130
|
+
// {
|
|
131
|
+
// "event": "trade",
|
|
132
|
+
// "timestamp": 1590779594547,
|
|
133
|
+
// "market": "ETH-EUR",
|
|
134
|
+
// "id": "450c3298-f082-4461-9e2c-a0262cc7cc2e",
|
|
135
|
+
// "amount": "0.05026233",
|
|
136
|
+
// "price": "198.46",
|
|
137
|
+
// "side": "buy"
|
|
138
|
+
// }
|
|
139
|
+
//
|
|
140
|
+
const marketId = this.safeString(message, 'market');
|
|
141
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
142
|
+
const symbol = market['symbol'];
|
|
143
|
+
const name = 'trades';
|
|
144
|
+
const messageHash = name + '@' + marketId;
|
|
145
|
+
const trade = this.parseTrade(message, market);
|
|
146
|
+
let tradesArray = this.safeValue(this.trades, symbol);
|
|
147
|
+
if (tradesArray === undefined) {
|
|
148
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
149
|
+
tradesArray = new Cache.ArrayCache(limit);
|
|
150
|
+
}
|
|
151
|
+
tradesArray.append(trade);
|
|
152
|
+
this.trades[symbol] = tradesArray;
|
|
153
|
+
client.resolve(tradesArray, messageHash);
|
|
154
|
+
}
|
|
155
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
156
|
+
/**
|
|
157
|
+
* @method
|
|
158
|
+
* @name bitvavo#watchOHLCV
|
|
159
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
160
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
161
|
+
* @param {string} timeframe the length of time each candle represents
|
|
162
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
163
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
164
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
165
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
166
|
+
*/
|
|
167
|
+
await this.loadMarkets();
|
|
168
|
+
const market = this.market(symbol);
|
|
169
|
+
symbol = market['symbol'];
|
|
170
|
+
const name = 'candles';
|
|
171
|
+
const marketId = market['id'];
|
|
172
|
+
const interval = this.safeString(this.timeframes, timeframe, timeframe);
|
|
173
|
+
const messageHash = name + '@' + marketId + '_' + interval;
|
|
174
|
+
const url = this.urls['api']['ws'];
|
|
175
|
+
const request = {
|
|
176
|
+
'action': 'subscribe',
|
|
177
|
+
'channels': [
|
|
178
|
+
{
|
|
179
|
+
'name': 'candles',
|
|
180
|
+
'interval': [interval],
|
|
181
|
+
'markets': [marketId],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
};
|
|
185
|
+
const message = this.extend(request, params);
|
|
186
|
+
const ohlcv = await this.watch(url, messageHash, message, messageHash);
|
|
187
|
+
if (this.newUpdates) {
|
|
188
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
189
|
+
}
|
|
190
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
191
|
+
}
|
|
192
|
+
handleOHLCV(client, message) {
|
|
193
|
+
//
|
|
194
|
+
// {
|
|
195
|
+
// "event": "candle",
|
|
196
|
+
// "market": "BTC-EUR",
|
|
197
|
+
// "interval": "1m",
|
|
198
|
+
// "candle": [
|
|
199
|
+
// [
|
|
200
|
+
// 1590797160000,
|
|
201
|
+
// "8480.9",
|
|
202
|
+
// "8480.9",
|
|
203
|
+
// "8480.9",
|
|
204
|
+
// "8480.9",
|
|
205
|
+
// "0.01038628"
|
|
206
|
+
// ]
|
|
207
|
+
// ]
|
|
208
|
+
// }
|
|
209
|
+
//
|
|
210
|
+
const name = 'candles';
|
|
211
|
+
const marketId = this.safeString(message, 'market');
|
|
212
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
213
|
+
const symbol = market['symbol'];
|
|
214
|
+
const interval = this.safeString(message, 'interval');
|
|
215
|
+
// use a reverse lookup in a static map instead
|
|
216
|
+
const timeframe = this.findTimeframe(interval);
|
|
217
|
+
const messageHash = name + '@' + marketId + '_' + interval;
|
|
218
|
+
const candles = this.safeValue(message, 'candle');
|
|
219
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
220
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
221
|
+
if (stored === undefined) {
|
|
222
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
223
|
+
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
224
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
225
|
+
}
|
|
226
|
+
for (let i = 0; i < candles.length; i++) {
|
|
227
|
+
const candle = candles[i];
|
|
228
|
+
const parsed = this.parseOHLCV(candle, market);
|
|
229
|
+
stored.append(parsed);
|
|
230
|
+
}
|
|
231
|
+
client.resolve(stored, messageHash);
|
|
232
|
+
}
|
|
233
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
234
|
+
/**
|
|
235
|
+
* @method
|
|
236
|
+
* @name bitvavo#watchOrderBook
|
|
237
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
238
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
239
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
240
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
241
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
242
|
+
*/
|
|
243
|
+
await this.loadMarkets();
|
|
244
|
+
const market = this.market(symbol);
|
|
245
|
+
symbol = market['symbol'];
|
|
246
|
+
const name = 'book';
|
|
247
|
+
const messageHash = name + '@' + market['id'];
|
|
248
|
+
const url = this.urls['api']['ws'];
|
|
249
|
+
const request = {
|
|
250
|
+
'action': 'subscribe',
|
|
251
|
+
'channels': [
|
|
252
|
+
{
|
|
253
|
+
'name': name,
|
|
254
|
+
'markets': [
|
|
255
|
+
market['id'],
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
};
|
|
260
|
+
const subscription = {
|
|
261
|
+
'messageHash': messageHash,
|
|
262
|
+
'name': name,
|
|
263
|
+
'symbol': symbol,
|
|
264
|
+
'marketId': market['id'],
|
|
265
|
+
'method': this.handleOrderBookSubscription,
|
|
266
|
+
'limit': limit,
|
|
267
|
+
'params': params,
|
|
268
|
+
};
|
|
269
|
+
const message = this.extend(request, params);
|
|
270
|
+
const orderbook = await this.watch(url, messageHash, message, messageHash, subscription);
|
|
271
|
+
return orderbook.limit();
|
|
272
|
+
}
|
|
273
|
+
handleDelta(bookside, delta) {
|
|
274
|
+
const price = this.safeFloat(delta, 0);
|
|
275
|
+
const amount = this.safeFloat(delta, 1);
|
|
276
|
+
bookside.store(price, amount);
|
|
277
|
+
}
|
|
278
|
+
handleDeltas(bookside, deltas) {
|
|
279
|
+
for (let i = 0; i < deltas.length; i++) {
|
|
280
|
+
this.handleDelta(bookside, deltas[i]);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
handleOrderBookMessage(client, message, orderbook) {
|
|
284
|
+
//
|
|
285
|
+
// {
|
|
286
|
+
// "event": "book",
|
|
287
|
+
// "market": "BTC-EUR",
|
|
288
|
+
// "nonce": 36947383,
|
|
289
|
+
// "bids": [
|
|
290
|
+
// [ "8477.8", "0" ]
|
|
291
|
+
// ],
|
|
292
|
+
// "asks": [
|
|
293
|
+
// [ "8550.9", "0" ]
|
|
294
|
+
// ]
|
|
295
|
+
// }
|
|
296
|
+
//
|
|
297
|
+
const nonce = this.safeInteger(message, 'nonce');
|
|
298
|
+
if (nonce > orderbook['nonce']) {
|
|
299
|
+
this.handleDeltas(orderbook['asks'], this.safeValue(message, 'asks', []));
|
|
300
|
+
this.handleDeltas(orderbook['bids'], this.safeValue(message, 'bids', []));
|
|
301
|
+
orderbook['nonce'] = nonce;
|
|
302
|
+
}
|
|
303
|
+
return orderbook;
|
|
304
|
+
}
|
|
305
|
+
handleOrderBook(client, message) {
|
|
306
|
+
//
|
|
307
|
+
// {
|
|
308
|
+
// "event": "book",
|
|
309
|
+
// "market": "BTC-EUR",
|
|
310
|
+
// "nonce": 36729561,
|
|
311
|
+
// "bids": [
|
|
312
|
+
// [ "8513.3", "0" ],
|
|
313
|
+
// [ '8518.8', "0.64236203" ],
|
|
314
|
+
// [ '8513.6', "0.32435481" ],
|
|
315
|
+
// ],
|
|
316
|
+
// "asks": []
|
|
317
|
+
// }
|
|
318
|
+
//
|
|
319
|
+
const event = this.safeString(message, 'event');
|
|
320
|
+
const marketId = this.safeString(message, 'market');
|
|
321
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
322
|
+
const symbol = market['symbol'];
|
|
323
|
+
const messageHash = event + '@' + market['id'];
|
|
324
|
+
const orderbook = this.safeValue(this.orderbooks, symbol);
|
|
325
|
+
if (orderbook === undefined) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (orderbook['nonce'] === undefined) {
|
|
329
|
+
const subscription = this.safeValue(client.subscriptions, messageHash, {});
|
|
330
|
+
const watchingOrderBookSnapshot = this.safeValue(subscription, 'watchingOrderBookSnapshot');
|
|
331
|
+
if (watchingOrderBookSnapshot === undefined) {
|
|
332
|
+
subscription['watchingOrderBookSnapshot'] = true;
|
|
333
|
+
client.subscriptions[messageHash] = subscription;
|
|
334
|
+
const options = this.safeValue(this.options, 'watchOrderBookSnapshot', {});
|
|
335
|
+
const delay = this.safeInteger(options, 'delay', this.rateLimit);
|
|
336
|
+
// fetch the snapshot in a separate async call after a warmup delay
|
|
337
|
+
this.delay(delay, this.watchOrderBookSnapshot, client, message, subscription);
|
|
338
|
+
}
|
|
339
|
+
orderbook.cache.push(message);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
this.handleOrderBookMessage(client, message, orderbook);
|
|
343
|
+
client.resolve(orderbook, messageHash);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async watchOrderBookSnapshot(client, message, subscription) {
|
|
347
|
+
const params = this.safeValue(subscription, 'params');
|
|
348
|
+
const marketId = this.safeString(subscription, 'marketId');
|
|
349
|
+
const name = 'getBook';
|
|
350
|
+
const messageHash = name + '@' + marketId;
|
|
351
|
+
const url = this.urls['api']['ws'];
|
|
352
|
+
const request = {
|
|
353
|
+
'action': name,
|
|
354
|
+
'market': marketId,
|
|
355
|
+
};
|
|
356
|
+
const orderbook = await this.watch(url, messageHash, this.extend(request, params), messageHash, subscription);
|
|
357
|
+
return orderbook.limit();
|
|
358
|
+
}
|
|
359
|
+
handleOrderBookSnapshot(client, message) {
|
|
360
|
+
//
|
|
361
|
+
// {
|
|
362
|
+
// "action": "getBook",
|
|
363
|
+
// "response": {
|
|
364
|
+
// "market": "BTC-EUR",
|
|
365
|
+
// "nonce": 36946120,
|
|
366
|
+
// "bids": [
|
|
367
|
+
// [ '8494.9', "0.24399521" ],
|
|
368
|
+
// [ '8494.8', "0.34884085" ],
|
|
369
|
+
// [ '8493.9', "0.14535128" ],
|
|
370
|
+
// ],
|
|
371
|
+
// "asks": [
|
|
372
|
+
// [ "8495", "0.46982463" ],
|
|
373
|
+
// [ '8495.1', "0.12178267" ],
|
|
374
|
+
// [ '8496.2', "0.21924143" ],
|
|
375
|
+
// ]
|
|
376
|
+
// }
|
|
377
|
+
// }
|
|
378
|
+
//
|
|
379
|
+
const response = this.safeValue(message, 'response');
|
|
380
|
+
if (response === undefined) {
|
|
381
|
+
return message;
|
|
382
|
+
}
|
|
383
|
+
const marketId = this.safeString(response, 'market');
|
|
384
|
+
const symbol = this.safeSymbol(marketId, undefined, '-');
|
|
385
|
+
const name = 'book';
|
|
386
|
+
const messageHash = name + '@' + marketId;
|
|
387
|
+
const orderbook = this.orderbooks[symbol];
|
|
388
|
+
const snapshot = this.parseOrderBook(response, symbol);
|
|
389
|
+
snapshot['nonce'] = this.safeInteger(response, 'nonce');
|
|
390
|
+
orderbook.reset(snapshot);
|
|
391
|
+
// unroll the accumulated deltas
|
|
392
|
+
const messages = orderbook.cache;
|
|
393
|
+
for (let i = 0; i < messages.length; i++) {
|
|
394
|
+
const messageItem = messages[i];
|
|
395
|
+
this.handleOrderBookMessage(client, messageItem, orderbook);
|
|
396
|
+
}
|
|
397
|
+
this.orderbooks[symbol] = orderbook;
|
|
398
|
+
client.resolve(orderbook, messageHash);
|
|
399
|
+
}
|
|
400
|
+
handleOrderBookSubscription(client, message, subscription) {
|
|
401
|
+
const symbol = this.safeString(subscription, 'symbol');
|
|
402
|
+
const limit = this.safeInteger(subscription, 'limit');
|
|
403
|
+
if (symbol in this.orderbooks) {
|
|
404
|
+
delete this.orderbooks[symbol];
|
|
405
|
+
}
|
|
406
|
+
this.orderbooks[symbol] = this.orderBook({}, limit);
|
|
407
|
+
}
|
|
408
|
+
handleOrderBookSubscriptions(client, message, marketIds) {
|
|
409
|
+
const name = 'book';
|
|
410
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
411
|
+
const marketId = this.safeString(marketIds, i);
|
|
412
|
+
const symbol = this.safeSymbol(marketId, undefined, '-');
|
|
413
|
+
const messageHash = name + '@' + marketId;
|
|
414
|
+
if (!(symbol in this.orderbooks)) {
|
|
415
|
+
const subscription = this.safeValue(client.subscriptions, messageHash);
|
|
416
|
+
const method = this.safeValue(subscription, 'method');
|
|
417
|
+
if (method !== undefined) {
|
|
418
|
+
method.call(this, client, message, subscription);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
424
|
+
/**
|
|
425
|
+
* @method
|
|
426
|
+
* @name bitvavo#watchOrders
|
|
427
|
+
* @description watches information on multiple orders made by the user
|
|
428
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
429
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
430
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
431
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
432
|
+
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
433
|
+
*/
|
|
434
|
+
if (symbol === undefined) {
|
|
435
|
+
throw new errors.ArgumentsRequired(this.id + ' watchOrders() requires a symbol argument');
|
|
436
|
+
}
|
|
437
|
+
await this.loadMarkets();
|
|
438
|
+
await this.authenticate();
|
|
439
|
+
const market = this.market(symbol);
|
|
440
|
+
symbol = market['symbol'];
|
|
441
|
+
const marketId = market['id'];
|
|
442
|
+
const url = this.urls['api']['ws'];
|
|
443
|
+
const name = 'account';
|
|
444
|
+
const messageHash = 'order:' + symbol;
|
|
445
|
+
const request = {
|
|
446
|
+
'action': 'subscribe',
|
|
447
|
+
'channels': [
|
|
448
|
+
{
|
|
449
|
+
'name': name,
|
|
450
|
+
'markets': [marketId],
|
|
451
|
+
},
|
|
452
|
+
],
|
|
453
|
+
};
|
|
454
|
+
const orders = await this.watch(url, messageHash, request, messageHash);
|
|
455
|
+
if (this.newUpdates) {
|
|
456
|
+
limit = orders.getLimit(symbol, limit);
|
|
457
|
+
}
|
|
458
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
459
|
+
}
|
|
460
|
+
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
461
|
+
/**
|
|
462
|
+
* @method
|
|
463
|
+
* @name bitvavo#watchMyTrades
|
|
464
|
+
* @description watches information on multiple trades made by the user
|
|
465
|
+
* @param {string} symbol unified market symbol of the market trades were made in
|
|
466
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
467
|
+
* @param {int} [limit] the maximum number of trade structures to retrieve
|
|
468
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
469
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=ortradeder-structure
|
|
470
|
+
*/
|
|
471
|
+
if (symbol === undefined) {
|
|
472
|
+
throw new errors.ArgumentsRequired(this.id + ' watchMyTrades() requires a symbol argument');
|
|
473
|
+
}
|
|
474
|
+
await this.loadMarkets();
|
|
475
|
+
await this.authenticate();
|
|
476
|
+
const market = this.market(symbol);
|
|
477
|
+
symbol = market['symbol'];
|
|
478
|
+
const marketId = market['id'];
|
|
479
|
+
const url = this.urls['api']['ws'];
|
|
480
|
+
const name = 'account';
|
|
481
|
+
const messageHash = 'myTrades:' + symbol;
|
|
482
|
+
const request = {
|
|
483
|
+
'action': 'subscribe',
|
|
484
|
+
'channels': [
|
|
485
|
+
{
|
|
486
|
+
'name': name,
|
|
487
|
+
'markets': [marketId],
|
|
488
|
+
},
|
|
489
|
+
],
|
|
490
|
+
};
|
|
491
|
+
const trades = await this.watch(url, messageHash, request, messageHash);
|
|
492
|
+
if (this.newUpdates) {
|
|
493
|
+
limit = trades.getLimit(symbol, limit);
|
|
494
|
+
}
|
|
495
|
+
return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
|
|
496
|
+
}
|
|
497
|
+
handleOrder(client, message) {
|
|
498
|
+
//
|
|
499
|
+
// {
|
|
500
|
+
// "event": "order",
|
|
501
|
+
// "orderId": "f0e5180f-9497-4d05-9dc2-7056e8a2de9b",
|
|
502
|
+
// "market": "ETH-EUR",
|
|
503
|
+
// "created": 1590948500319,
|
|
504
|
+
// "updated": 1590948500319,
|
|
505
|
+
// "status": "new",
|
|
506
|
+
// "side": "sell",
|
|
507
|
+
// "orderType": "limit",
|
|
508
|
+
// "amount": "0.1",
|
|
509
|
+
// "amountRemaining": "0.1",
|
|
510
|
+
// "price": "300",
|
|
511
|
+
// "onHold": "0.1",
|
|
512
|
+
// "onHoldCurrency": "ETH",
|
|
513
|
+
// "selfTradePrevention": "decrementAndCancel",
|
|
514
|
+
// "visible": true,
|
|
515
|
+
// "timeInForce": "GTC",
|
|
516
|
+
// "postOnly": false
|
|
517
|
+
// }
|
|
518
|
+
//
|
|
519
|
+
const marketId = this.safeString(message, 'market');
|
|
520
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
521
|
+
const symbol = market['symbol'];
|
|
522
|
+
const messageHash = 'order:' + symbol;
|
|
523
|
+
const order = this.parseOrder(message, market);
|
|
524
|
+
if (this.orders === undefined) {
|
|
525
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
526
|
+
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
527
|
+
}
|
|
528
|
+
const orders = this.orders;
|
|
529
|
+
orders.append(order);
|
|
530
|
+
client.resolve(this.orders, messageHash);
|
|
531
|
+
}
|
|
532
|
+
handleMyTrade(client, message) {
|
|
533
|
+
//
|
|
534
|
+
// {
|
|
535
|
+
// "event": "fill",
|
|
536
|
+
// "timestamp": 1590964470132,
|
|
537
|
+
// "market": "ETH-EUR",
|
|
538
|
+
// "orderId": "85d082e1-eda4-4209-9580-248281a29a9a",
|
|
539
|
+
// "fillId": "861d2da5-aa93-475c-8d9a-dce431bd4211",
|
|
540
|
+
// "side": "sell",
|
|
541
|
+
// "amount": "0.1",
|
|
542
|
+
// "price": "211.46",
|
|
543
|
+
// "taker": true,
|
|
544
|
+
// "fee": "0.056",
|
|
545
|
+
// "feeCurrency": "EUR"
|
|
546
|
+
// }
|
|
547
|
+
//
|
|
548
|
+
const marketId = this.safeString(message, 'market');
|
|
549
|
+
const market = this.safeMarket(marketId, undefined, '-');
|
|
550
|
+
const symbol = market['symbol'];
|
|
551
|
+
const messageHash = 'myTrades:' + symbol;
|
|
552
|
+
const trade = this.parseTrade(message, market);
|
|
553
|
+
if (this.myTrades === undefined) {
|
|
554
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
555
|
+
this.myTrades = new Cache.ArrayCache(limit);
|
|
556
|
+
}
|
|
557
|
+
const tradesArray = this.myTrades;
|
|
558
|
+
tradesArray.append(trade);
|
|
559
|
+
client.resolve(tradesArray, messageHash);
|
|
560
|
+
}
|
|
561
|
+
handleSubscriptionStatus(client, message) {
|
|
562
|
+
//
|
|
563
|
+
// {
|
|
564
|
+
// "event": "subscribed",
|
|
565
|
+
// "subscriptions": {
|
|
566
|
+
// "book": [ "BTC-EUR" ]
|
|
567
|
+
// }
|
|
568
|
+
// }
|
|
569
|
+
//
|
|
570
|
+
const subscriptions = this.safeValue(message, 'subscriptions', {});
|
|
571
|
+
const methods = {
|
|
572
|
+
'book': this.handleOrderBookSubscriptions,
|
|
573
|
+
};
|
|
574
|
+
const names = Object.keys(subscriptions);
|
|
575
|
+
for (let i = 0; i < names.length; i++) {
|
|
576
|
+
const name = names[i];
|
|
577
|
+
const method = this.safeValue(methods, name);
|
|
578
|
+
if (method !== undefined) {
|
|
579
|
+
const subscription = this.safeValue(subscriptions, name);
|
|
580
|
+
method.call(this, client, message, subscription);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return message;
|
|
584
|
+
}
|
|
585
|
+
authenticate(params = {}) {
|
|
586
|
+
const url = this.urls['api']['ws'];
|
|
587
|
+
const client = this.client(url);
|
|
588
|
+
const messageHash = 'authenticated';
|
|
589
|
+
let future = this.safeValue(client.subscriptions, messageHash);
|
|
590
|
+
if (future === undefined) {
|
|
591
|
+
const timestamp = this.milliseconds();
|
|
592
|
+
const stringTimestamp = timestamp.toString();
|
|
593
|
+
const auth = stringTimestamp + 'GET/' + this.version + '/websocket';
|
|
594
|
+
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256.sha256);
|
|
595
|
+
const action = 'authenticate';
|
|
596
|
+
const request = {
|
|
597
|
+
'action': action,
|
|
598
|
+
'key': this.apiKey,
|
|
599
|
+
'signature': signature,
|
|
600
|
+
'timestamp': timestamp,
|
|
601
|
+
};
|
|
602
|
+
const message = this.extend(request, params);
|
|
603
|
+
future = this.watch(url, messageHash, message);
|
|
604
|
+
client.subscriptions[messageHash] = future;
|
|
605
|
+
}
|
|
606
|
+
return future;
|
|
607
|
+
}
|
|
608
|
+
handleAuthenticationMessage(client, message) {
|
|
609
|
+
//
|
|
610
|
+
// {
|
|
611
|
+
// "event": "authenticate",
|
|
612
|
+
// "authenticated": true
|
|
613
|
+
// }
|
|
614
|
+
//
|
|
615
|
+
const messageHash = 'authenticated';
|
|
616
|
+
const authenticated = this.safeValue(message, 'authenticated', false);
|
|
617
|
+
if (authenticated) {
|
|
618
|
+
// we resolve the future here permanently so authentication only happens once
|
|
619
|
+
client.resolve(message, messageHash);
|
|
620
|
+
}
|
|
621
|
+
else {
|
|
622
|
+
const error = new errors.AuthenticationError(this.json(message));
|
|
623
|
+
client.reject(error, messageHash);
|
|
624
|
+
// allows further authentication attempts
|
|
625
|
+
if (messageHash in client.subscriptions) {
|
|
626
|
+
delete client.subscriptions[messageHash];
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
handleMessage(client, message) {
|
|
631
|
+
//
|
|
632
|
+
// {
|
|
633
|
+
// "event": "subscribed",
|
|
634
|
+
// "subscriptions": {
|
|
635
|
+
// "book": [ "BTC-EUR" ]
|
|
636
|
+
// }
|
|
637
|
+
// }
|
|
638
|
+
//
|
|
639
|
+
//
|
|
640
|
+
// {
|
|
641
|
+
// "event": "book",
|
|
642
|
+
// "market": "BTC-EUR",
|
|
643
|
+
// "nonce": 36729561,
|
|
644
|
+
// "bids": [
|
|
645
|
+
// [ "8513.3", "0" ],
|
|
646
|
+
// [ '8518.8', "0.64236203" ],
|
|
647
|
+
// [ '8513.6', "0.32435481" ],
|
|
648
|
+
// ],
|
|
649
|
+
// "asks": []
|
|
650
|
+
// }
|
|
651
|
+
//
|
|
652
|
+
// {
|
|
653
|
+
// "action": "getBook",
|
|
654
|
+
// "response": {
|
|
655
|
+
// "market": "BTC-EUR",
|
|
656
|
+
// "nonce": 36946120,
|
|
657
|
+
// "bids": [
|
|
658
|
+
// [ '8494.9', "0.24399521" ],
|
|
659
|
+
// [ '8494.8', "0.34884085" ],
|
|
660
|
+
// [ '8493.9', "0.14535128" ],
|
|
661
|
+
// ],
|
|
662
|
+
// "asks": [
|
|
663
|
+
// [ "8495", "0.46982463" ],
|
|
664
|
+
// [ '8495.1', "0.12178267" ],
|
|
665
|
+
// [ '8496.2', "0.21924143" ],
|
|
666
|
+
// ]
|
|
667
|
+
// }
|
|
668
|
+
// }
|
|
669
|
+
//
|
|
670
|
+
// {
|
|
671
|
+
// "event": "authenticate",
|
|
672
|
+
// "authenticated": true
|
|
673
|
+
// }
|
|
674
|
+
//
|
|
675
|
+
const methods = {
|
|
676
|
+
'subscribed': this.handleSubscriptionStatus,
|
|
677
|
+
'book': this.handleOrderBook,
|
|
678
|
+
'getBook': this.handleOrderBookSnapshot,
|
|
679
|
+
'trade': this.handleTrade,
|
|
680
|
+
'candle': this.handleOHLCV,
|
|
681
|
+
'ticker24h': this.handleTicker,
|
|
682
|
+
'authenticate': this.handleAuthenticationMessage,
|
|
683
|
+
'order': this.handleOrder,
|
|
684
|
+
'fill': this.handleMyTrade,
|
|
685
|
+
};
|
|
686
|
+
const event = this.safeString(message, 'event');
|
|
687
|
+
let method = this.safeValue(methods, event);
|
|
688
|
+
if (method === undefined) {
|
|
689
|
+
const action = this.safeString(message, 'action');
|
|
690
|
+
method = this.safeValue(methods, action);
|
|
691
|
+
if (method === undefined) {
|
|
692
|
+
return message;
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
return method.call(this, client, message);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
else {
|
|
699
|
+
return method.call(this, client, message);
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
module.exports = bitvavo;
|