ccxt 4.2.11 → 4.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +1347 -490
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/_virtual/agent.js +7 -0
- package/dist/cjs/_virtual/parse-proxy-response.js +7 -0
- package/dist/cjs/_virtual/promisify.js +7 -0
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/js/ccxt.js +474 -0
- package/dist/cjs/js/src/abstract/ace.js +9 -0
- package/dist/cjs/js/src/abstract/alpaca.js +9 -0
- package/dist/cjs/js/src/abstract/ascendex.js +9 -0
- package/dist/cjs/js/src/abstract/bigone.js +9 -0
- package/dist/cjs/js/src/abstract/binance.js +9 -0
- package/dist/cjs/js/src/abstract/bingx.js +9 -0
- package/dist/cjs/js/src/abstract/bit2c.js +9 -0
- package/dist/cjs/js/src/abstract/bitbank.js +9 -0
- package/dist/cjs/js/src/abstract/bitbns.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex2.js +9 -0
- package/dist/cjs/js/src/abstract/bitflyer.js +9 -0
- package/dist/cjs/js/src/abstract/bitforex.js +9 -0
- package/dist/cjs/js/src/abstract/bitget.js +9 -0
- package/dist/cjs/js/src/abstract/bithumb.js +9 -0
- package/dist/cjs/js/src/abstract/bitmart.js +9 -0
- package/dist/cjs/js/src/abstract/bitmex.js +9 -0
- package/dist/cjs/js/src/abstract/bitopro.js +9 -0
- package/dist/cjs/js/src/abstract/bitpanda.js +9 -0
- package/dist/cjs/js/src/abstract/bitrue.js +9 -0
- package/dist/cjs/js/src/abstract/bitso.js +9 -0
- package/dist/cjs/js/src/abstract/bitstamp.js +9 -0
- package/dist/cjs/js/src/abstract/bitteam.js +9 -0
- package/dist/cjs/js/src/abstract/bitvavo.js +9 -0
- package/dist/cjs/js/src/abstract/bl3p.js +9 -0
- package/dist/cjs/js/src/abstract/blockchaincom.js +9 -0
- package/dist/cjs/js/src/abstract/btcalpha.js +9 -0
- package/dist/cjs/js/src/abstract/btcbox.js +9 -0
- package/dist/cjs/js/src/abstract/btcmarkets.js +9 -0
- package/dist/cjs/js/src/abstract/btcturk.js +9 -0
- package/dist/cjs/js/src/abstract/bybit.js +9 -0
- package/dist/cjs/js/src/abstract/cex.js +9 -0
- package/dist/cjs/js/src/abstract/coinbase.js +9 -0
- package/dist/cjs/js/src/abstract/coinbasepro.js +9 -0
- package/dist/cjs/js/src/abstract/coincheck.js +9 -0
- package/dist/cjs/js/src/abstract/coinex.js +9 -0
- package/dist/cjs/js/src/abstract/coinlist.js +9 -0
- package/dist/cjs/js/src/abstract/coinmate.js +9 -0
- package/dist/cjs/js/src/abstract/coinone.js +9 -0
- package/dist/cjs/js/src/abstract/coinsph.js +9 -0
- package/dist/cjs/js/src/abstract/coinspot.js +9 -0
- package/dist/cjs/js/src/abstract/cryptocom.js +9 -0
- package/dist/cjs/js/src/abstract/currencycom.js +9 -0
- package/dist/cjs/js/src/abstract/delta.js +9 -0
- package/dist/cjs/js/src/abstract/deribit.js +9 -0
- package/dist/cjs/js/src/abstract/digifinex.js +9 -0
- package/dist/cjs/js/src/abstract/exmo.js +9 -0
- package/dist/cjs/js/src/abstract/gate.js +9 -0
- package/dist/cjs/js/src/abstract/gemini.js +9 -0
- package/dist/cjs/js/src/abstract/hitbtc.js +9 -0
- package/dist/cjs/js/src/abstract/hollaex.js +9 -0
- package/dist/cjs/js/src/abstract/htx.js +9 -0
- package/dist/cjs/js/src/abstract/huobijp.js +9 -0
- package/dist/cjs/js/src/abstract/idex.js +9 -0
- package/dist/cjs/js/src/abstract/independentreserve.js +9 -0
- package/dist/cjs/js/src/abstract/indodax.js +9 -0
- package/dist/cjs/js/src/abstract/kraken.js +9 -0
- package/dist/cjs/js/src/abstract/krakenfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kucoin.js +9 -0
- package/dist/cjs/js/src/abstract/kucoinfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kuna.js +9 -0
- package/dist/cjs/js/src/abstract/latoken.js +9 -0
- package/dist/cjs/js/src/abstract/lbank.js +9 -0
- package/dist/cjs/js/src/abstract/luno.js +9 -0
- package/dist/cjs/js/src/abstract/lykke.js +9 -0
- package/dist/cjs/js/src/abstract/mercado.js +9 -0
- package/dist/cjs/js/src/abstract/mexc.js +9 -0
- package/dist/cjs/js/src/abstract/ndax.js +9 -0
- package/dist/cjs/js/src/abstract/novadax.js +9 -0
- package/dist/cjs/js/src/abstract/oceanex.js +9 -0
- package/dist/cjs/js/src/abstract/okcoin.js +9 -0
- package/dist/cjs/js/src/abstract/okx.js +9 -0
- package/dist/cjs/js/src/abstract/p2b.js +9 -0
- package/dist/cjs/js/src/abstract/paymium.js +9 -0
- package/dist/cjs/js/src/abstract/phemex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniexfutures.js +9 -0
- package/dist/cjs/js/src/abstract/probit.js +9 -0
- package/dist/cjs/js/src/abstract/timex.js +9 -0
- package/dist/cjs/js/src/abstract/tokocrypto.js +9 -0
- package/dist/cjs/js/src/abstract/upbit.js +9 -0
- package/dist/cjs/js/src/abstract/wavesexchange.js +9 -0
- package/dist/cjs/js/src/abstract/wazirx.js +9 -0
- package/dist/cjs/js/src/abstract/whitebit.js +9 -0
- package/dist/cjs/js/src/abstract/woo.js +9 -0
- package/dist/cjs/js/src/abstract/yobit.js +9 -0
- package/dist/cjs/js/src/abstract/zaif.js +9 -0
- package/dist/cjs/js/src/abstract/zonda.js +9 -0
- package/dist/cjs/js/src/ace.js +1058 -0
- package/dist/cjs/js/src/alpaca.js +1125 -0
- package/dist/cjs/js/src/ascendex.js +3360 -0
- package/dist/cjs/js/src/base/Exchange.js +5110 -0
- package/dist/cjs/js/src/base/Precise.js +263 -0
- package/dist/cjs/js/src/base/errors.js +299 -0
- package/dist/cjs/js/src/base/functions/crypto.js +78 -0
- package/dist/cjs/js/src/base/functions/encode.js +44 -0
- package/dist/cjs/js/src/base/functions/generic.js +193 -0
- package/dist/cjs/js/src/base/functions/misc.js +96 -0
- package/dist/cjs/js/src/base/functions/number.js +297 -0
- package/dist/cjs/js/src/base/functions/platform.js +28 -0
- package/dist/cjs/js/src/base/functions/rsa.js +34 -0
- package/dist/cjs/js/src/base/functions/string.js +48 -0
- package/dist/cjs/js/src/base/functions/throttle.js +66 -0
- package/dist/cjs/js/src/base/functions/time.js +187 -0
- package/dist/cjs/js/src/base/functions/totp.js +24 -0
- package/dist/cjs/js/src/base/functions/type.js +162 -0
- package/dist/cjs/js/src/base/functions.js +157 -0
- package/dist/cjs/js/src/base/ws/Cache.js +254 -0
- package/dist/cjs/js/src/base/ws/Client.js +299 -0
- package/dist/cjs/js/src/base/ws/Future.js +34 -0
- package/dist/cjs/js/src/base/ws/OrderBook.js +107 -0
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +281 -0
- package/dist/cjs/js/src/base/ws/WsClient.js +69 -0
- package/dist/cjs/js/src/bequant.js +33 -0
- package/dist/cjs/js/src/bigone.js +2209 -0
- package/dist/cjs/js/src/binance.js +9736 -0
- package/dist/cjs/js/src/binancecoinm.js +45 -0
- package/dist/cjs/js/src/binanceus.js +84 -0
- package/dist/cjs/js/src/binanceusdm.js +58 -0
- package/dist/cjs/js/src/bingx.js +3807 -0
- package/dist/cjs/js/src/bit2c.js +916 -0
- package/dist/cjs/js/src/bitbank.js +1000 -0
- package/dist/cjs/js/src/bitbay.js +17 -0
- package/dist/cjs/js/src/bitbns.js +1220 -0
- package/dist/cjs/js/src/bitcoincom.js +17 -0
- package/dist/cjs/js/src/bitfinex.js +1670 -0
- package/dist/cjs/js/src/bitfinex2.js +2990 -0
- package/dist/cjs/js/src/bitflyer.js +1045 -0
- package/dist/cjs/js/src/bitforex.js +852 -0
- package/dist/cjs/js/src/bitget.js +8291 -0
- package/dist/cjs/js/src/bithumb.js +1090 -0
- package/dist/cjs/js/src/bitmart.js +4454 -0
- package/dist/cjs/js/src/bitmex.js +2884 -0
- package/dist/cjs/js/src/bitopro.js +1724 -0
- package/dist/cjs/js/src/bitpanda.js +2002 -0
- package/dist/cjs/js/src/bitrue.js +3253 -0
- package/dist/cjs/js/src/bitso.js +1753 -0
- package/dist/cjs/js/src/bitstamp.js +2188 -0
- package/dist/cjs/js/src/bitteam.js +2309 -0
- package/dist/cjs/js/src/bitvavo.js +1968 -0
- package/dist/cjs/js/src/bl3p.js +447 -0
- package/dist/cjs/js/src/blockchaincom.js +1160 -0
- package/dist/cjs/js/src/btcalpha.js +929 -0
- package/dist/cjs/js/src/btcbox.js +565 -0
- package/dist/cjs/js/src/btcmarkets.js +1237 -0
- package/dist/cjs/js/src/btcturk.js +929 -0
- package/dist/cjs/js/src/bybit.js +7646 -0
- package/dist/cjs/js/src/cex.js +1693 -0
- package/dist/cjs/js/src/coinbase.js +3424 -0
- package/dist/cjs/js/src/coinbasepro.js +1866 -0
- package/dist/cjs/js/src/coincheck.js +843 -0
- package/dist/cjs/js/src/coinex.js +5414 -0
- package/dist/cjs/js/src/coinlist.js +2329 -0
- package/dist/cjs/js/src/coinmate.js +989 -0
- package/dist/cjs/js/src/coinone.js +1185 -0
- package/dist/cjs/js/src/coinsph.js +1933 -0
- package/dist/cjs/js/src/coinspot.js +548 -0
- package/dist/cjs/js/src/cryptocom.js +3007 -0
- package/dist/cjs/js/src/currencycom.js +2015 -0
- package/dist/cjs/js/src/delta.js +3256 -0
- package/dist/cjs/js/src/deribit.js +3306 -0
- package/dist/cjs/js/src/digifinex.js +4307 -0
- package/dist/cjs/js/src/exmo.js +2645 -0
- package/dist/cjs/js/src/fmfwio.js +34 -0
- package/dist/cjs/js/src/gate.js +7072 -0
- package/dist/cjs/js/src/gateio.js +16 -0
- package/dist/cjs/js/src/gemini.js +1801 -0
- package/dist/cjs/js/src/hitbtc.js +3660 -0
- package/dist/cjs/js/src/hitbtc3.js +19 -0
- package/dist/cjs/js/src/hollaex.js +1882 -0
- package/dist/cjs/js/src/htx.js +9049 -0
- package/dist/cjs/js/src/huobi.js +16 -0
- package/dist/cjs/js/src/huobijp.js +1918 -0
- package/dist/cjs/js/src/idex.js +1770 -0
- package/dist/cjs/js/src/independentreserve.js +761 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2857 -0
- package/dist/cjs/js/src/krakenfutures.js +2407 -0
- package/dist/cjs/js/src/kucoin.js +4489 -0
- package/dist/cjs/js/src/kucoinfutures.js +2475 -0
- package/dist/cjs/js/src/kuna.js +1949 -0
- package/dist/cjs/js/src/latoken.js +1729 -0
- package/dist/cjs/js/src/lbank.js +2851 -0
- package/dist/cjs/js/src/luno.js +1044 -0
- package/dist/cjs/js/src/lykke.js +1303 -0
- package/dist/cjs/js/src/mercado.js +897 -0
- package/dist/cjs/js/src/mexc.js +5407 -0
- package/dist/cjs/js/src/ndax.js +2450 -0
- package/dist/cjs/js/src/novadax.js +1556 -0
- package/dist/cjs/js/src/oceanex.js +964 -0
- package/dist/cjs/js/src/okcoin.js +3115 -0
- package/dist/cjs/js/src/okx.js +7330 -0
- package/dist/cjs/js/src/p2b.js +1243 -0
- package/dist/cjs/js/src/paymium.js +597 -0
- package/dist/cjs/js/src/phemex.js +4722 -0
- package/dist/cjs/js/src/poloniex.js +2356 -0
- package/dist/cjs/js/src/poloniexfutures.js +1794 -0
- package/dist/cjs/js/src/pro/alpaca.js +714 -0
- package/dist/cjs/js/src/pro/ascendex.js +957 -0
- package/dist/cjs/js/src/pro/bequant.js +33 -0
- package/dist/cjs/js/src/pro/binance.js +2796 -0
- package/dist/cjs/js/src/pro/binancecoinm.js +23 -0
- package/dist/cjs/js/src/pro/binanceus.js +51 -0
- package/dist/cjs/js/src/pro/binanceusdm.js +32 -0
- package/dist/cjs/js/src/pro/bingx.js +944 -0
- package/dist/cjs/js/src/pro/bitcoincom.js +29 -0
- package/dist/cjs/js/src/pro/bitfinex.js +672 -0
- package/dist/cjs/js/src/pro/bitfinex2.js +1159 -0
- package/dist/cjs/js/src/pro/bitget.js +1733 -0
- package/dist/cjs/js/src/pro/bitmart.js +1486 -0
- package/dist/cjs/js/src/pro/bitmex.js +1576 -0
- package/dist/cjs/js/src/pro/bitopro.js +327 -0
- package/dist/cjs/js/src/pro/bitpanda.js +1341 -0
- package/dist/cjs/js/src/pro/bitrue.js +462 -0
- package/dist/cjs/js/src/pro/bitstamp.js +547 -0
- package/dist/cjs/js/src/pro/bitvavo.js +704 -0
- package/dist/cjs/js/src/pro/blockchaincom.js +794 -0
- package/dist/cjs/js/src/pro/bybit.js +1843 -0
- package/dist/cjs/js/src/pro/cex.js +1510 -0
- package/dist/cjs/js/src/pro/coinbase.js +561 -0
- package/dist/cjs/js/src/pro/coinbasepro.js +968 -0
- package/dist/cjs/js/src/pro/coinex.js +1095 -0
- package/dist/cjs/js/src/pro/cryptocom.js +1020 -0
- package/dist/cjs/js/src/pro/currencycom.js +563 -0
- package/dist/cjs/js/src/pro/deribit.js +825 -0
- package/dist/cjs/js/src/pro/exmo.js +658 -0
- package/dist/cjs/js/src/pro/gate.js +1316 -0
- package/dist/cjs/js/src/pro/gateio.js +16 -0
- package/dist/cjs/js/src/pro/gemini.js +649 -0
- package/dist/cjs/js/src/pro/hitbtc.js +1293 -0
- package/dist/cjs/js/src/pro/hollaex.js +597 -0
- package/dist/cjs/js/src/pro/htx.js +2383 -0
- package/dist/cjs/js/src/pro/huobi.js +16 -0
- package/dist/cjs/js/src/pro/huobijp.js +606 -0
- package/dist/cjs/js/src/pro/idex.js +714 -0
- package/dist/cjs/js/src/pro/independentreserve.js +280 -0
- package/dist/cjs/js/src/pro/kraken.js +1364 -0
- package/dist/cjs/js/src/pro/krakenfutures.js +1500 -0
- package/dist/cjs/js/src/pro/kucoin.js +1052 -0
- package/dist/cjs/js/src/pro/kucoinfutures.js +981 -0
- package/dist/cjs/js/src/pro/luno.js +322 -0
- package/dist/cjs/js/src/pro/mexc.js +1170 -0
- package/dist/cjs/js/src/pro/ndax.js +545 -0
- package/dist/cjs/js/src/pro/okcoin.js +760 -0
- package/dist/cjs/js/src/pro/okx.js +1608 -0
- package/dist/cjs/js/src/pro/phemex.js +1511 -0
- package/dist/cjs/js/src/pro/poloniex.js +1253 -0
- package/dist/cjs/js/src/pro/poloniexfutures.js +1014 -0
- package/dist/cjs/js/src/pro/probit.js +586 -0
- package/dist/cjs/js/src/pro/upbit.js +234 -0
- package/dist/cjs/js/src/pro/wazirx.js +776 -0
- package/dist/cjs/js/src/pro/whitebit.js +927 -0
- package/dist/cjs/js/src/pro/woo.js +769 -0
- package/dist/cjs/js/src/probit.js +1867 -0
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +401 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +195 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +308 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +554 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +16 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1760 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +52 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +81 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +376 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1580 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +74 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +24 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +158 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +429 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +176 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +324 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +163 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +245 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1018 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +383 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +258 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +53 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +120 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +69 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +83 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +240 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +91 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +130 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +214 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +239 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +93 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +354 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +20 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +30 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +239 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +372 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +273 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +139 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +14 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +81 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +292 -0
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +103 -0
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +140 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +175 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +7 -0
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +383 -0
- package/dist/cjs/js/src/timex.js +1562 -0
- package/dist/cjs/js/src/tokocrypto.js +2542 -0
- package/dist/cjs/js/src/upbit.js +1844 -0
- package/dist/cjs/js/src/wavesexchange.js +2607 -0
- package/dist/cjs/js/src/wazirx.js +953 -0
- package/dist/cjs/js/src/whitebit.js +2309 -0
- package/dist/cjs/js/src/woo.js +2765 -0
- package/dist/cjs/js/src/yobit.js +1314 -0
- package/dist/cjs/js/src/zaif.js +736 -0
- package/dist/cjs/js/src/zonda.js +1883 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bigone.d.ts +18 -0
- package/js/src/abstract/binance.d.ts +2 -0
- package/js/src/abstract/binancecoinm.d.ts +2 -0
- package/js/src/abstract/binanceus.d.ts +2 -0
- package/js/src/abstract/binanceusdm.d.ts +2 -0
- package/js/src/abstract/bingx.d.ts +2 -0
- package/js/src/abstract/bybit.d.ts +1 -0
- package/js/src/abstract/gate.d.ts +11 -0
- package/js/src/abstract/gateio.d.ts +11 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/alpaca.js +18 -18
- package/js/src/base/Exchange.d.ts +5 -1
- package/js/src/base/Exchange.js +101 -12
- package/js/src/bigone.d.ts +3 -2
- package/js/src/bigone.js +429 -167
- package/js/src/binance.js +48 -34
- package/js/src/bingx.js +115 -38
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +33 -13
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +5 -5
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinbase.d.ts +26 -3
- package/js/src/coinbase.js +176 -26
- package/js/src/coinlist.js +3 -4
- package/js/src/coinone.js +1 -1
- package/js/src/coinsph.js +2 -3
- package/js/src/deribit.js +1 -0
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +96 -59
- package/js/src/gemini.js +1 -1
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.d.ts +1 -0
- package/js/src/htx.js +29 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/independentreserve.js +7 -5
- package/js/src/kraken.js +3 -6
- package/js/src/lbank.js +59 -33
- package/js/src/mexc.js +2 -1
- package/js/src/oceanex.js +1 -1
- package/js/src/okx.js +14 -3
- package/js/src/phemex.js +9 -2
- package/js/src/pro/binance.d.ts +2 -23
- package/js/src/pro/binance.js +58 -22
- package/js/src/pro/coinbase.d.ts +2 -2
- package/js/src/pro/coinbase.js +4 -1
- package/js/src/pro/coinbasepro.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/kraken.js +1 -1
- package/js/src/pro/okx.d.ts +1 -0
- package/js/src/pro/okx.js +52 -2
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/probit.js +4 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/wavesexchange.js +1 -1
- package/js/src/woo.d.ts +2 -0
- package/js/src/woo.js +52 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,1220 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var bitbns$1 = require('./abstract/bitbns.js');
|
|
4
|
+
var errors = require('./base/errors.js');
|
|
5
|
+
var Precise = require('./base/Precise.js');
|
|
6
|
+
var number = require('./base/functions/number.js');
|
|
7
|
+
var sha512 = require('./static_dependencies/noble-hashes/sha512.js');
|
|
8
|
+
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* @class bitbns
|
|
13
|
+
* @augments Exchange
|
|
14
|
+
*/
|
|
15
|
+
class bitbns extends bitbns$1 {
|
|
16
|
+
describe() {
|
|
17
|
+
return this.deepExtend(super.describe(), {
|
|
18
|
+
'id': 'bitbns',
|
|
19
|
+
'name': 'Bitbns',
|
|
20
|
+
'countries': ['IN'],
|
|
21
|
+
'rateLimit': 1000,
|
|
22
|
+
'certified': false,
|
|
23
|
+
'version': 'v2',
|
|
24
|
+
// new metainfo interface
|
|
25
|
+
'has': {
|
|
26
|
+
'CORS': undefined,
|
|
27
|
+
'spot': true,
|
|
28
|
+
'margin': undefined,
|
|
29
|
+
'swap': false,
|
|
30
|
+
'future': false,
|
|
31
|
+
'option': undefined,
|
|
32
|
+
'cancelOrder': true,
|
|
33
|
+
'createOrder': true,
|
|
34
|
+
'fetchBalance': true,
|
|
35
|
+
'fetchDepositAddress': true,
|
|
36
|
+
'fetchDeposits': true,
|
|
37
|
+
'fetchFundingHistory': false,
|
|
38
|
+
'fetchFundingRate': false,
|
|
39
|
+
'fetchFundingRateHistory': false,
|
|
40
|
+
'fetchFundingRates': false,
|
|
41
|
+
'fetchIndexOHLCV': false,
|
|
42
|
+
'fetchMarginMode': false,
|
|
43
|
+
'fetchMarkets': true,
|
|
44
|
+
'fetchMarkOHLCV': false,
|
|
45
|
+
'fetchMyTrades': true,
|
|
46
|
+
'fetchOHLCV': false,
|
|
47
|
+
'fetchOpenOrders': true,
|
|
48
|
+
'fetchOrder': true,
|
|
49
|
+
'fetchOrderBook': true,
|
|
50
|
+
'fetchPositionMode': false,
|
|
51
|
+
'fetchPremiumIndexOHLCV': false,
|
|
52
|
+
'fetchStatus': true,
|
|
53
|
+
'fetchTicker': 'emulated',
|
|
54
|
+
'fetchTickers': true,
|
|
55
|
+
'fetchTrades': true,
|
|
56
|
+
'fetchTradingFee': false,
|
|
57
|
+
'fetchTradingFees': false,
|
|
58
|
+
'fetchTransfer': false,
|
|
59
|
+
'fetchTransfers': false,
|
|
60
|
+
'fetchWithdrawal': false,
|
|
61
|
+
'fetchWithdrawals': true,
|
|
62
|
+
'transfer': false,
|
|
63
|
+
'withdraw': false,
|
|
64
|
+
},
|
|
65
|
+
'hostname': 'bitbns.com',
|
|
66
|
+
'urls': {
|
|
67
|
+
'logo': 'https://user-images.githubusercontent.com/1294454/117201933-e7a6e780-adf5-11eb-9d80-98fc2a21c3d6.jpg',
|
|
68
|
+
'api': {
|
|
69
|
+
'www': 'https://{hostname}',
|
|
70
|
+
'v1': 'https://api.{hostname}/api/trade/v1',
|
|
71
|
+
'v2': 'https://api.{hostname}/api/trade/v2',
|
|
72
|
+
},
|
|
73
|
+
'www': 'https://bitbns.com',
|
|
74
|
+
'referral': 'https://ref.bitbns.com/1090961',
|
|
75
|
+
'doc': [
|
|
76
|
+
'https://bitbns.com/trade/#/api-trading/',
|
|
77
|
+
],
|
|
78
|
+
'fees': 'https://bitbns.com/fees',
|
|
79
|
+
},
|
|
80
|
+
'api': {
|
|
81
|
+
'www': {
|
|
82
|
+
'get': [
|
|
83
|
+
'order/fetchMarkets',
|
|
84
|
+
'order/fetchTickers',
|
|
85
|
+
'order/fetchOrderbook',
|
|
86
|
+
'order/getTickerWithVolume',
|
|
87
|
+
'exchangeData/ohlc',
|
|
88
|
+
'exchangeData/orderBook',
|
|
89
|
+
'exchangeData/tradedetails',
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
'v1': {
|
|
93
|
+
'get': [
|
|
94
|
+
'platform/status',
|
|
95
|
+
'tickers',
|
|
96
|
+
'orderbook/sell/{symbol}',
|
|
97
|
+
'orderbook/buy/{symbol}',
|
|
98
|
+
],
|
|
99
|
+
'post': [
|
|
100
|
+
'currentCoinBalance/EVERYTHING',
|
|
101
|
+
'getApiUsageStatus/USAGE',
|
|
102
|
+
'getOrderSocketToken/USAGE',
|
|
103
|
+
'currentCoinBalance/{symbol}',
|
|
104
|
+
'orderStatus/{symbol}',
|
|
105
|
+
'depositHistory/{symbol}',
|
|
106
|
+
'withdrawHistory/{symbol}',
|
|
107
|
+
'withdrawHistoryAll/{symbol}',
|
|
108
|
+
'depositHistoryAll/{symbol}',
|
|
109
|
+
'listOpenOrders/{symbol}',
|
|
110
|
+
'listOpenStopOrders/{symbol}',
|
|
111
|
+
'getCoinAddress/{symbol}',
|
|
112
|
+
'placeSellOrder/{symbol}',
|
|
113
|
+
'placeBuyOrder/{symbol}',
|
|
114
|
+
'buyStopLoss/{symbol}',
|
|
115
|
+
'sellStopLoss/{symbol}',
|
|
116
|
+
'cancelOrder/{symbol}',
|
|
117
|
+
'cancelStopLossOrder/{symbol}',
|
|
118
|
+
'listExecutedOrders/{symbol}',
|
|
119
|
+
'placeMarketOrder/{symbol}',
|
|
120
|
+
'placeMarketOrderQnty/{symbol}',
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
'v2': {
|
|
124
|
+
'post': [
|
|
125
|
+
'orders',
|
|
126
|
+
'cancel',
|
|
127
|
+
'getordersnew',
|
|
128
|
+
'marginOrders',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
'fees': {
|
|
133
|
+
'trading': {
|
|
134
|
+
'feeSide': 'quote',
|
|
135
|
+
'tierBased': false,
|
|
136
|
+
'percentage': true,
|
|
137
|
+
'taker': this.parseNumber('0.0025'),
|
|
138
|
+
'maker': this.parseNumber('0.0025'),
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
'precisionMode': number.TICK_SIZE,
|
|
142
|
+
'exceptions': {
|
|
143
|
+
'exact': {
|
|
144
|
+
'400': errors.BadRequest,
|
|
145
|
+
'409': errors.BadSymbol,
|
|
146
|
+
'416': errors.InsufficientFunds,
|
|
147
|
+
'417': errors.OrderNotFound, // {"data":[],"status":0,"error":"Nothing to show","code":417}
|
|
148
|
+
},
|
|
149
|
+
'broad': {},
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async fetchStatus(params = {}) {
|
|
154
|
+
/**
|
|
155
|
+
* @method
|
|
156
|
+
* @name bitbns#fetchStatus
|
|
157
|
+
* @description the latest known information on the availability of the exchange API
|
|
158
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
159
|
+
* @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
|
|
160
|
+
*/
|
|
161
|
+
const response = await this.v1GetPlatformStatus(params);
|
|
162
|
+
//
|
|
163
|
+
// {
|
|
164
|
+
// "data":{
|
|
165
|
+
// "BTC":{"status":1},
|
|
166
|
+
// "ETH":{"status":1},
|
|
167
|
+
// "XRP":{"status":1},
|
|
168
|
+
// },
|
|
169
|
+
// "status":1,
|
|
170
|
+
// "error":null,
|
|
171
|
+
// "code":200
|
|
172
|
+
// }
|
|
173
|
+
//
|
|
174
|
+
const statusRaw = this.safeString(response, 'status');
|
|
175
|
+
return {
|
|
176
|
+
'status': this.safeString({ '1': 'ok' }, statusRaw, statusRaw),
|
|
177
|
+
'updated': undefined,
|
|
178
|
+
'eta': undefined,
|
|
179
|
+
'url': undefined,
|
|
180
|
+
'info': response,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async fetchMarkets(params = {}) {
|
|
184
|
+
/**
|
|
185
|
+
* @method
|
|
186
|
+
* @name bitbns#fetchMarkets
|
|
187
|
+
* @description retrieves data on all markets for bitbns
|
|
188
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
189
|
+
* @returns {object[]} an array of objects representing market data
|
|
190
|
+
*/
|
|
191
|
+
const response = await this.wwwGetOrderFetchMarkets(params);
|
|
192
|
+
//
|
|
193
|
+
// [
|
|
194
|
+
// {
|
|
195
|
+
// "id":"BTC",
|
|
196
|
+
// "symbol":"BTC/INR",
|
|
197
|
+
// "base":"BTC",
|
|
198
|
+
// "quote":"INR",
|
|
199
|
+
// "baseId":"BTC",
|
|
200
|
+
// "quoteId":"",
|
|
201
|
+
// "active":true,
|
|
202
|
+
// "limits":{
|
|
203
|
+
// "amount":{"min":"0.00017376","max":20},
|
|
204
|
+
// "price":{"min":2762353.2359999996,"max":6445490.883999999},
|
|
205
|
+
// "cost":{"min":800,"max":128909817.67999998}
|
|
206
|
+
// },
|
|
207
|
+
// "precision":{
|
|
208
|
+
// "amount":8,
|
|
209
|
+
// "price":2
|
|
210
|
+
// },
|
|
211
|
+
// "info":{}
|
|
212
|
+
// },
|
|
213
|
+
// ]
|
|
214
|
+
//
|
|
215
|
+
const result = [];
|
|
216
|
+
for (let i = 0; i < response.length; i++) {
|
|
217
|
+
const market = response[i];
|
|
218
|
+
const id = this.safeString(market, 'id');
|
|
219
|
+
const baseId = this.safeString(market, 'base');
|
|
220
|
+
const quoteId = this.safeString(market, 'quote');
|
|
221
|
+
const base = this.safeCurrencyCode(baseId);
|
|
222
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
223
|
+
const marketPrecision = this.safeValue(market, 'precision', {});
|
|
224
|
+
const marketLimits = this.safeValue(market, 'limits', {});
|
|
225
|
+
const amountLimits = this.safeValue(marketLimits, 'amount', {});
|
|
226
|
+
const priceLimits = this.safeValue(marketLimits, 'price', {});
|
|
227
|
+
const costLimits = this.safeValue(marketLimits, 'cost', {});
|
|
228
|
+
const usdt = (quoteId === 'USDT');
|
|
229
|
+
// INR markets don't need a _INR prefix
|
|
230
|
+
const uppercaseId = usdt ? (baseId + '_' + quoteId) : baseId;
|
|
231
|
+
result.push({
|
|
232
|
+
'id': id,
|
|
233
|
+
'uppercaseId': uppercaseId,
|
|
234
|
+
'symbol': base + '/' + quote,
|
|
235
|
+
'base': base,
|
|
236
|
+
'quote': quote,
|
|
237
|
+
'settle': undefined,
|
|
238
|
+
'baseId': baseId,
|
|
239
|
+
'quoteId': quoteId,
|
|
240
|
+
'settleId': undefined,
|
|
241
|
+
'type': 'spot',
|
|
242
|
+
'spot': true,
|
|
243
|
+
'margin': false,
|
|
244
|
+
'swap': false,
|
|
245
|
+
'future': false,
|
|
246
|
+
'option': false,
|
|
247
|
+
'active': undefined,
|
|
248
|
+
'contract': false,
|
|
249
|
+
'linear': undefined,
|
|
250
|
+
'inverse': undefined,
|
|
251
|
+
'contractSize': undefined,
|
|
252
|
+
'expiry': undefined,
|
|
253
|
+
'expiryDatetime': undefined,
|
|
254
|
+
'strike': undefined,
|
|
255
|
+
'optionType': undefined,
|
|
256
|
+
'precision': {
|
|
257
|
+
'amount': this.parseNumber(this.parsePrecision(this.safeString(marketPrecision, 'amount'))),
|
|
258
|
+
'price': this.parseNumber(this.parsePrecision(this.safeString(marketPrecision, 'price'))),
|
|
259
|
+
},
|
|
260
|
+
'limits': {
|
|
261
|
+
'leverage': {
|
|
262
|
+
'min': undefined,
|
|
263
|
+
'max': undefined,
|
|
264
|
+
},
|
|
265
|
+
'amount': {
|
|
266
|
+
'min': this.safeNumber(amountLimits, 'min'),
|
|
267
|
+
'max': this.safeNumber(amountLimits, 'max'),
|
|
268
|
+
},
|
|
269
|
+
'price': {
|
|
270
|
+
'min': this.safeNumber(priceLimits, 'min'),
|
|
271
|
+
'max': this.safeNumber(priceLimits, 'max'),
|
|
272
|
+
},
|
|
273
|
+
'cost': {
|
|
274
|
+
'min': this.safeNumber(costLimits, 'min'),
|
|
275
|
+
'max': this.safeNumber(costLimits, 'max'),
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
'created': undefined,
|
|
279
|
+
'info': market,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
285
|
+
/**
|
|
286
|
+
* @method
|
|
287
|
+
* @name bitbns#fetchOrderBook
|
|
288
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
289
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
290
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
291
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
292
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
293
|
+
*/
|
|
294
|
+
await this.loadMarkets();
|
|
295
|
+
const market = this.market(symbol);
|
|
296
|
+
const request = {
|
|
297
|
+
'symbol': market['id'],
|
|
298
|
+
};
|
|
299
|
+
if (limit !== undefined) {
|
|
300
|
+
request['limit'] = limit; // default 100, max 5000, see https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md#order-book
|
|
301
|
+
}
|
|
302
|
+
const response = await this.wwwGetOrderFetchOrderbook(this.extend(request, params));
|
|
303
|
+
//
|
|
304
|
+
// {
|
|
305
|
+
// "bids":[
|
|
306
|
+
// [49352.04,0.843948],
|
|
307
|
+
// [49352.03,0.742048],
|
|
308
|
+
// [49349.78,0.686239],
|
|
309
|
+
// ],
|
|
310
|
+
// "asks":[
|
|
311
|
+
// [49443.59,0.065137],
|
|
312
|
+
// [49444.63,0.098211],
|
|
313
|
+
// [49449.01,0.066309],
|
|
314
|
+
// ],
|
|
315
|
+
// "timestamp":1619172786577,
|
|
316
|
+
// "datetime":"2021-04-23T10:13:06.577Z",
|
|
317
|
+
// "nonce":""
|
|
318
|
+
// }
|
|
319
|
+
//
|
|
320
|
+
const timestamp = this.safeInteger(response, 'timestamp');
|
|
321
|
+
return this.parseOrderBook(response, market['symbol'], timestamp);
|
|
322
|
+
}
|
|
323
|
+
parseTicker(ticker, market = undefined) {
|
|
324
|
+
//
|
|
325
|
+
// {
|
|
326
|
+
// "symbol":"BTC/INR",
|
|
327
|
+
// "info":{
|
|
328
|
+
// "highest_buy_bid":4368494.31,
|
|
329
|
+
// "lowest_sell_bid":4374835.09,
|
|
330
|
+
// "last_traded_price":4374835.09,
|
|
331
|
+
// "yes_price":4531016.27,
|
|
332
|
+
// "volume":{"max":"4569119.23","min":"4254552.13","volume":62.17722344}
|
|
333
|
+
// },
|
|
334
|
+
// "timestamp":1619100020845,
|
|
335
|
+
// "datetime":1619100020845,
|
|
336
|
+
// "high":"4569119.23",
|
|
337
|
+
// "low":"4254552.13",
|
|
338
|
+
// "bid":4368494.31,
|
|
339
|
+
// "bidVolume":"",
|
|
340
|
+
// "ask":4374835.09,
|
|
341
|
+
// "askVolume":"",
|
|
342
|
+
// "vwap":"",
|
|
343
|
+
// "open":4531016.27,
|
|
344
|
+
// "close":4374835.09,
|
|
345
|
+
// "last":4374835.09,
|
|
346
|
+
// "baseVolume":62.17722344,
|
|
347
|
+
// "quoteVolume":"",
|
|
348
|
+
// "previousClose":"",
|
|
349
|
+
// "change":-156181.1799999997,
|
|
350
|
+
// "percentage":-3.446934874943623,
|
|
351
|
+
// "average":4452925.68
|
|
352
|
+
// }
|
|
353
|
+
//
|
|
354
|
+
const timestamp = this.safeInteger(ticker, 'timestamp');
|
|
355
|
+
const marketId = this.safeString(ticker, 'symbol');
|
|
356
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
357
|
+
const last = this.safeString(ticker, 'last');
|
|
358
|
+
return this.safeTicker({
|
|
359
|
+
'symbol': symbol,
|
|
360
|
+
'timestamp': timestamp,
|
|
361
|
+
'datetime': this.iso8601(timestamp),
|
|
362
|
+
'high': this.safeString(ticker, 'high'),
|
|
363
|
+
'low': this.safeString(ticker, 'low'),
|
|
364
|
+
'bid': this.safeString(ticker, 'bid'),
|
|
365
|
+
'bidVolume': this.safeString(ticker, 'bidVolume'),
|
|
366
|
+
'ask': this.safeString(ticker, 'ask'),
|
|
367
|
+
'askVolume': this.safeString(ticker, 'askVolume'),
|
|
368
|
+
'vwap': this.safeString(ticker, 'vwap'),
|
|
369
|
+
'open': this.safeString(ticker, 'open'),
|
|
370
|
+
'close': last,
|
|
371
|
+
'last': last,
|
|
372
|
+
'previousClose': this.safeString(ticker, 'previousClose'),
|
|
373
|
+
'change': this.safeString(ticker, 'change'),
|
|
374
|
+
'percentage': this.safeString(ticker, 'percentage'),
|
|
375
|
+
'average': this.safeString(ticker, 'average'),
|
|
376
|
+
'baseVolume': this.safeString(ticker, 'baseVolume'),
|
|
377
|
+
'quoteVolume': this.safeString(ticker, 'quoteVolume'),
|
|
378
|
+
'info': ticker,
|
|
379
|
+
}, market);
|
|
380
|
+
}
|
|
381
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
382
|
+
/**
|
|
383
|
+
* @method
|
|
384
|
+
* @name bitbns#fetchTickers
|
|
385
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
386
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
387
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
388
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
389
|
+
*/
|
|
390
|
+
await this.loadMarkets();
|
|
391
|
+
const response = await this.wwwGetOrderFetchTickers(params);
|
|
392
|
+
//
|
|
393
|
+
// {
|
|
394
|
+
// "BTC/INR":{
|
|
395
|
+
// "symbol":"BTC/INR",
|
|
396
|
+
// "info":{
|
|
397
|
+
// "highest_buy_bid":4368494.31,
|
|
398
|
+
// "lowest_sell_bid":4374835.09,
|
|
399
|
+
// "last_traded_price":4374835.09,
|
|
400
|
+
// "yes_price":4531016.27,
|
|
401
|
+
// "volume":{"max":"4569119.23","min":"4254552.13","volume":62.17722344}
|
|
402
|
+
// },
|
|
403
|
+
// "timestamp":1619100020845,
|
|
404
|
+
// "datetime":1619100020845,
|
|
405
|
+
// "high":"4569119.23",
|
|
406
|
+
// "low":"4254552.13",
|
|
407
|
+
// "bid":4368494.31,
|
|
408
|
+
// "bidVolume":"",
|
|
409
|
+
// "ask":4374835.09,
|
|
410
|
+
// "askVolume":"",
|
|
411
|
+
// "vwap":"",
|
|
412
|
+
// "open":4531016.27,
|
|
413
|
+
// "close":4374835.09,
|
|
414
|
+
// "last":4374835.09,
|
|
415
|
+
// "baseVolume":62.17722344,
|
|
416
|
+
// "quoteVolume":"",
|
|
417
|
+
// "previousClose":"",
|
|
418
|
+
// "change":-156181.1799999997,
|
|
419
|
+
// "percentage":-3.446934874943623,
|
|
420
|
+
// "average":4452925.68
|
|
421
|
+
// }
|
|
422
|
+
// }
|
|
423
|
+
//
|
|
424
|
+
return this.parseTickers(response, symbols);
|
|
425
|
+
}
|
|
426
|
+
parseBalance(response) {
|
|
427
|
+
const timestamp = undefined;
|
|
428
|
+
const result = {
|
|
429
|
+
'info': response,
|
|
430
|
+
'timestamp': timestamp,
|
|
431
|
+
'datetime': this.iso8601(timestamp),
|
|
432
|
+
};
|
|
433
|
+
const data = this.safeValue(response, 'data', {});
|
|
434
|
+
const keys = Object.keys(data);
|
|
435
|
+
for (let i = 0; i < keys.length; i++) {
|
|
436
|
+
const key = keys[i];
|
|
437
|
+
const parts = key.split('availableorder');
|
|
438
|
+
const numParts = parts.length;
|
|
439
|
+
if (numParts > 1) {
|
|
440
|
+
let currencyId = this.safeString(parts, 1);
|
|
441
|
+
// note that "Money" stands for INR - the only fiat in bitbns
|
|
442
|
+
const account = this.account();
|
|
443
|
+
account['free'] = this.safeString(data, key);
|
|
444
|
+
account['used'] = this.safeString(data, 'inorder' + currencyId);
|
|
445
|
+
if (currencyId === 'Money') {
|
|
446
|
+
currencyId = 'INR';
|
|
447
|
+
}
|
|
448
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
449
|
+
result[code] = account;
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return this.safeBalance(result);
|
|
453
|
+
}
|
|
454
|
+
async fetchBalance(params = {}) {
|
|
455
|
+
/**
|
|
456
|
+
* @method
|
|
457
|
+
* @name bitbns#fetchBalance
|
|
458
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
459
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
460
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
461
|
+
*/
|
|
462
|
+
await this.loadMarkets();
|
|
463
|
+
const response = await this.v1PostCurrentCoinBalanceEVERYTHING(params);
|
|
464
|
+
//
|
|
465
|
+
// {
|
|
466
|
+
// "data":{
|
|
467
|
+
// "availableorderMoney":12.34, // INR
|
|
468
|
+
// "availableorderBTC":0,
|
|
469
|
+
// "availableorderXRP":0,
|
|
470
|
+
// "inorderMoney":0, // INR
|
|
471
|
+
// "inorderBTC":0,
|
|
472
|
+
// "inorderXRP":0,
|
|
473
|
+
// "inorderNEO":0,
|
|
474
|
+
// },
|
|
475
|
+
// "status":1,
|
|
476
|
+
// "error":null,
|
|
477
|
+
// "code":200
|
|
478
|
+
// }
|
|
479
|
+
//
|
|
480
|
+
// note that "Money" stands for INR - the only fiat in bitbns
|
|
481
|
+
return this.parseBalance(response);
|
|
482
|
+
}
|
|
483
|
+
parseStatus(status) {
|
|
484
|
+
const statuses = {
|
|
485
|
+
'-1': 'cancelled',
|
|
486
|
+
'0': 'open',
|
|
487
|
+
'1': 'open',
|
|
488
|
+
'2': 'done',
|
|
489
|
+
// 'PARTIALLY_FILLED': 'open',
|
|
490
|
+
// 'FILLED': 'closed',
|
|
491
|
+
// 'CANCELED': 'canceled',
|
|
492
|
+
// 'PENDING_CANCEL': 'canceling', // currently unused
|
|
493
|
+
// 'REJECTED': 'rejected',
|
|
494
|
+
// 'EXPIRED': 'expired',
|
|
495
|
+
};
|
|
496
|
+
return this.safeString(statuses, status, status);
|
|
497
|
+
}
|
|
498
|
+
parseOrder(order, market = undefined) {
|
|
499
|
+
//
|
|
500
|
+
// createOrder
|
|
501
|
+
//
|
|
502
|
+
// {
|
|
503
|
+
// "data": "Successfully placed bid to purchase currency",
|
|
504
|
+
// "status": 1,
|
|
505
|
+
// "error": null,
|
|
506
|
+
// "id": 5424475,
|
|
507
|
+
// "code": 200
|
|
508
|
+
// }
|
|
509
|
+
//
|
|
510
|
+
// fetchOpenOrders, fetchOrder
|
|
511
|
+
//
|
|
512
|
+
// {
|
|
513
|
+
// "entry_id": 5424475,
|
|
514
|
+
// "btc": 0.01,
|
|
515
|
+
// "rate": 2000,
|
|
516
|
+
// "time": "2021-04-25T17:05:42.000Z",
|
|
517
|
+
// "type": 0,
|
|
518
|
+
// "status": 0
|
|
519
|
+
// "t_rate": 0.45, // only stop orders
|
|
520
|
+
// "trail": 0 // only stop orders
|
|
521
|
+
// }
|
|
522
|
+
//
|
|
523
|
+
// cancelOrder
|
|
524
|
+
//
|
|
525
|
+
// {
|
|
526
|
+
// "data": "Successfully cancelled the order",
|
|
527
|
+
// "status": 1,
|
|
528
|
+
// "error": null,
|
|
529
|
+
// "code": 200
|
|
530
|
+
// }
|
|
531
|
+
//
|
|
532
|
+
const id = this.safeString2(order, 'id', 'entry_id');
|
|
533
|
+
const datetime = this.safeString(order, 'time');
|
|
534
|
+
const triggerPrice = this.safeString(order, 't_rate');
|
|
535
|
+
let side = this.safeString(order, 'type');
|
|
536
|
+
if (side === '0') {
|
|
537
|
+
side = 'buy';
|
|
538
|
+
}
|
|
539
|
+
else if (side === '1') {
|
|
540
|
+
side = 'sell';
|
|
541
|
+
}
|
|
542
|
+
const data = this.safeString(order, 'data');
|
|
543
|
+
let status = this.safeString(order, 'status');
|
|
544
|
+
if (data === 'Successfully cancelled the order') {
|
|
545
|
+
status = 'cancelled';
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
status = this.parseStatus(status);
|
|
549
|
+
}
|
|
550
|
+
return this.safeOrder({
|
|
551
|
+
'info': order,
|
|
552
|
+
'id': id,
|
|
553
|
+
'clientOrderId': undefined,
|
|
554
|
+
'timestamp': this.parse8601(datetime),
|
|
555
|
+
'datetime': datetime,
|
|
556
|
+
'lastTradeTimestamp': undefined,
|
|
557
|
+
'symbol': this.safeString(market, 'symbol'),
|
|
558
|
+
'timeInForce': undefined,
|
|
559
|
+
'postOnly': undefined,
|
|
560
|
+
'side': side,
|
|
561
|
+
'price': this.safeString(order, 'rate'),
|
|
562
|
+
'stopPrice': triggerPrice,
|
|
563
|
+
'triggerPrice': triggerPrice,
|
|
564
|
+
'amount': this.safeString(order, 'btc'),
|
|
565
|
+
'cost': undefined,
|
|
566
|
+
'average': undefined,
|
|
567
|
+
'filled': undefined,
|
|
568
|
+
'remaining': undefined,
|
|
569
|
+
'status': status,
|
|
570
|
+
'fee': {
|
|
571
|
+
'cost': undefined,
|
|
572
|
+
'currency': undefined,
|
|
573
|
+
'rate': undefined,
|
|
574
|
+
},
|
|
575
|
+
'trades': undefined,
|
|
576
|
+
}, market);
|
|
577
|
+
}
|
|
578
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
579
|
+
/**
|
|
580
|
+
* @method
|
|
581
|
+
* @name bitbns#createOrder
|
|
582
|
+
* @description create a trade order
|
|
583
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/place-orders
|
|
584
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/market-orders-quantity // market orders
|
|
585
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
586
|
+
* @param {string} type 'market' or 'limit'
|
|
587
|
+
* @param {string} side 'buy' or 'sell'
|
|
588
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
589
|
+
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
590
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
591
|
+
* @param {float} [params.triggerPrice] the price at which a trigger order is triggered at
|
|
592
|
+
*
|
|
593
|
+
* EXCHANGE SPECIFIC PARAMETERS
|
|
594
|
+
* @param {float} [params.target_rate] *requires params.trail_rate when set, type must be 'limit'* a bracket order is placed when set
|
|
595
|
+
* @param {float} [params.trail_rate] *requires params.target_rate when set, type must be 'limit'* a bracket order is placed when set
|
|
596
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
597
|
+
*/
|
|
598
|
+
await this.loadMarkets();
|
|
599
|
+
const market = this.market(symbol);
|
|
600
|
+
const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stopPrice', 't_rate']);
|
|
601
|
+
const targetRate = this.safeString(params, 'target_rate');
|
|
602
|
+
const trailRate = this.safeString(params, 'trail_rate');
|
|
603
|
+
params = this.omit(params, ['triggerPrice', 'stopPrice', 'trail_rate', 'target_rate', 't_rate']);
|
|
604
|
+
const request = {
|
|
605
|
+
'side': side.toUpperCase(),
|
|
606
|
+
'symbol': market['uppercaseId'],
|
|
607
|
+
'quantity': this.amountToPrecision(symbol, amount),
|
|
608
|
+
// 'target_rate': this.priceToPrecision (symbol, targetRate),
|
|
609
|
+
// 't_rate': this.priceToPrecision (symbol, stopPrice),
|
|
610
|
+
// 'trail_rate': this.priceToPrecision (symbol, trailRate),
|
|
611
|
+
};
|
|
612
|
+
let method = 'v2PostOrders';
|
|
613
|
+
if (type === 'limit') {
|
|
614
|
+
request['rate'] = this.priceToPrecision(symbol, price);
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
method = 'v1PostPlaceMarketOrderQntySymbol';
|
|
618
|
+
request['market'] = market['quoteId'];
|
|
619
|
+
}
|
|
620
|
+
if (triggerPrice !== undefined) {
|
|
621
|
+
request['t_rate'] = this.priceToPrecision(symbol, triggerPrice);
|
|
622
|
+
}
|
|
623
|
+
if (targetRate !== undefined) {
|
|
624
|
+
request['target_rate'] = this.priceToPrecision(symbol, targetRate);
|
|
625
|
+
}
|
|
626
|
+
if (trailRate !== undefined) {
|
|
627
|
+
request['trail_rate'] = this.priceToPrecision(symbol, trailRate);
|
|
628
|
+
}
|
|
629
|
+
const response = await this[method](this.extend(request, params));
|
|
630
|
+
//
|
|
631
|
+
// {
|
|
632
|
+
// "data":"Successfully placed bid to purchase currency",
|
|
633
|
+
// "status":1,
|
|
634
|
+
// "error":null,
|
|
635
|
+
// "id":5424475,
|
|
636
|
+
// "code":200
|
|
637
|
+
// }
|
|
638
|
+
//
|
|
639
|
+
return this.parseOrder(response, market);
|
|
640
|
+
}
|
|
641
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
642
|
+
/**
|
|
643
|
+
* @method
|
|
644
|
+
* @name bitbns#cancelOrder
|
|
645
|
+
* @description cancels an open order
|
|
646
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/cancel-orders
|
|
647
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/cancel-stop-loss-orders
|
|
648
|
+
* @param {string} id order id
|
|
649
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
650
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
651
|
+
* @param {boolean} [params.trigger] true if cancelling a trigger order
|
|
652
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
653
|
+
*/
|
|
654
|
+
if (symbol === undefined) {
|
|
655
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
|
|
656
|
+
}
|
|
657
|
+
await this.loadMarkets();
|
|
658
|
+
const market = this.market(symbol);
|
|
659
|
+
const isTrigger = this.safeValue2(params, 'trigger', 'stop');
|
|
660
|
+
params = this.omit(params, ['trigger', 'stop']);
|
|
661
|
+
const request = {
|
|
662
|
+
'entry_id': id,
|
|
663
|
+
'symbol': market['uppercaseId'],
|
|
664
|
+
};
|
|
665
|
+
let response = undefined;
|
|
666
|
+
const tail = isTrigger ? 'StopLossOrder' : 'Order';
|
|
667
|
+
let quoteSide = (market['quoteId'] === 'USDT') ? 'usdtcancel' : 'cancel';
|
|
668
|
+
quoteSide += tail;
|
|
669
|
+
request['side'] = quoteSide;
|
|
670
|
+
response = await this.v2PostCancel(this.extend(request, params));
|
|
671
|
+
return this.parseOrder(response, market);
|
|
672
|
+
}
|
|
673
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
674
|
+
/**
|
|
675
|
+
* @method
|
|
676
|
+
* @name bitbns#fetchOrder
|
|
677
|
+
* @description fetches information on an order made by the user
|
|
678
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-1/order-status
|
|
679
|
+
* @param {string} id order id
|
|
680
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
681
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
682
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
683
|
+
*/
|
|
684
|
+
if (symbol === undefined) {
|
|
685
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
|
|
686
|
+
}
|
|
687
|
+
await this.loadMarkets();
|
|
688
|
+
const market = this.market(symbol);
|
|
689
|
+
const request = {
|
|
690
|
+
'symbol': market['id'],
|
|
691
|
+
'entry_id': id,
|
|
692
|
+
};
|
|
693
|
+
const trigger = this.safeValue2(params, 'trigger', 'stop');
|
|
694
|
+
if (trigger) {
|
|
695
|
+
throw new errors.BadRequest(this.id + ' fetchOrder cannot fetch stop orders');
|
|
696
|
+
}
|
|
697
|
+
const response = await this.v1PostOrderStatusSymbol(this.extend(request, params));
|
|
698
|
+
//
|
|
699
|
+
// {
|
|
700
|
+
// "data":[
|
|
701
|
+
// {
|
|
702
|
+
// "entry_id":5424475,
|
|
703
|
+
// "btc":0.01,
|
|
704
|
+
// "rate":2000,
|
|
705
|
+
// "time":"2021-04-25T17:05:42.000Z",
|
|
706
|
+
// "type":0,
|
|
707
|
+
// "status":0,
|
|
708
|
+
// "total":0.01,
|
|
709
|
+
// "avg_cost":null,
|
|
710
|
+
// "side":"BUY",
|
|
711
|
+
// "amount":0.01,
|
|
712
|
+
// "remaining":0.01,
|
|
713
|
+
// "filled":0,
|
|
714
|
+
// "cost":null,
|
|
715
|
+
// "fee":0.05
|
|
716
|
+
// }
|
|
717
|
+
// ],
|
|
718
|
+
// "status":1,
|
|
719
|
+
// "error":null,
|
|
720
|
+
// "code":200
|
|
721
|
+
// }
|
|
722
|
+
//
|
|
723
|
+
const data = this.safeValue(response, 'data', []);
|
|
724
|
+
const first = this.safeValue(data, 0);
|
|
725
|
+
return this.parseOrder(first, market);
|
|
726
|
+
}
|
|
727
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
728
|
+
/**
|
|
729
|
+
* @method
|
|
730
|
+
* @name bitbns#fetchOpenOrders
|
|
731
|
+
* @description fetch all unfilled currently open orders
|
|
732
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/order-status-limit
|
|
733
|
+
* @see https://docs.bitbns.com/bitbns/rest-endpoints/order-apis/version-2/order-status-limit/order-status-stop-limit
|
|
734
|
+
* @param {string} symbol unified market symbol
|
|
735
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
736
|
+
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
737
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
738
|
+
* @param {boolean} [params.trigger] true if fetching trigger orders
|
|
739
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
740
|
+
*/
|
|
741
|
+
if (symbol === undefined) {
|
|
742
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument');
|
|
743
|
+
}
|
|
744
|
+
await this.loadMarkets();
|
|
745
|
+
const market = this.market(symbol);
|
|
746
|
+
const isTrigger = this.safeValue2(params, 'trigger', 'stop');
|
|
747
|
+
params = this.omit(params, ['trigger', 'stop']);
|
|
748
|
+
const quoteSide = (market['quoteId'] === 'USDT') ? 'usdtListOpen' : 'listOpen';
|
|
749
|
+
const request = {
|
|
750
|
+
'symbol': market['uppercaseId'],
|
|
751
|
+
'page': 0,
|
|
752
|
+
'side': isTrigger ? (quoteSide + 'StopOrders') : (quoteSide + 'Orders'),
|
|
753
|
+
};
|
|
754
|
+
const response = await this.v2PostGetordersnew(this.extend(request, params));
|
|
755
|
+
//
|
|
756
|
+
// {
|
|
757
|
+
// "data":[
|
|
758
|
+
// {
|
|
759
|
+
// "entry_id":5424475,
|
|
760
|
+
// "btc":0.01,
|
|
761
|
+
// "rate":2000,
|
|
762
|
+
// "time":"2021-04-25T17:05:42.000Z",
|
|
763
|
+
// "type":0,
|
|
764
|
+
// "status":0
|
|
765
|
+
// "t_rate":0.45, // only stop orders
|
|
766
|
+
// "type":1, // only stop orders
|
|
767
|
+
// "trail":0 // only stop orders
|
|
768
|
+
// }
|
|
769
|
+
// ],
|
|
770
|
+
// "status":1,
|
|
771
|
+
// "error":null,
|
|
772
|
+
// "code":200
|
|
773
|
+
// }
|
|
774
|
+
//
|
|
775
|
+
const data = this.safeValue(response, 'data', []);
|
|
776
|
+
return this.parseOrders(data, market, since, limit);
|
|
777
|
+
}
|
|
778
|
+
parseTrade(trade, market = undefined) {
|
|
779
|
+
//
|
|
780
|
+
// fetchMyTrades
|
|
781
|
+
//
|
|
782
|
+
// {
|
|
783
|
+
// "type": "BTC Sell order executed",
|
|
784
|
+
// "typeI": 6,
|
|
785
|
+
// "crypto": 5000,
|
|
786
|
+
// "amount": 35.4,
|
|
787
|
+
// "rate": 709800,
|
|
788
|
+
// "date": "2020-05-22T15:05:34.000Z",
|
|
789
|
+
// "unit": "INR",
|
|
790
|
+
// "factor": 100000000,
|
|
791
|
+
// "fee": 0.09,
|
|
792
|
+
// "delh_btc": -5000,
|
|
793
|
+
// "delh_inr": 0,
|
|
794
|
+
// "del_btc": 0,
|
|
795
|
+
// "del_inr": 35.4,
|
|
796
|
+
// "id": "2938823"
|
|
797
|
+
// }
|
|
798
|
+
//
|
|
799
|
+
// fetchTrades
|
|
800
|
+
//
|
|
801
|
+
// {
|
|
802
|
+
// "tradeId":"1909151",
|
|
803
|
+
// "price":"61904.6300",
|
|
804
|
+
// "quote_volume":1618.05,
|
|
805
|
+
// "base_volume":0.02607254,
|
|
806
|
+
// "timestamp":1634548602000,
|
|
807
|
+
// "type":"buy"
|
|
808
|
+
// }
|
|
809
|
+
//
|
|
810
|
+
market = this.safeMarket(undefined, market);
|
|
811
|
+
const orderId = this.safeString2(trade, 'id', 'tradeId');
|
|
812
|
+
let timestamp = this.parse8601(this.safeString(trade, 'date'));
|
|
813
|
+
timestamp = this.safeInteger(trade, 'timestamp', timestamp);
|
|
814
|
+
const priceString = this.safeString2(trade, 'rate', 'price');
|
|
815
|
+
let amountString = this.safeString(trade, 'amount');
|
|
816
|
+
let side = this.safeStringLower(trade, 'type');
|
|
817
|
+
if (side !== undefined) {
|
|
818
|
+
if (side.indexOf('buy') >= 0) {
|
|
819
|
+
side = 'buy';
|
|
820
|
+
}
|
|
821
|
+
else if (side.indexOf('sell') >= 0) {
|
|
822
|
+
side = 'sell';
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
const factor = this.safeString(trade, 'factor');
|
|
826
|
+
let costString = undefined;
|
|
827
|
+
if (factor !== undefined) {
|
|
828
|
+
amountString = Precise["default"].stringDiv(amountString, factor);
|
|
829
|
+
}
|
|
830
|
+
else {
|
|
831
|
+
amountString = this.safeString(trade, 'base_volume');
|
|
832
|
+
costString = this.safeString(trade, 'quote_volume');
|
|
833
|
+
}
|
|
834
|
+
const symbol = market['symbol'];
|
|
835
|
+
let fee = undefined;
|
|
836
|
+
const feeCostString = this.safeString(trade, 'fee');
|
|
837
|
+
if (feeCostString !== undefined) {
|
|
838
|
+
const feeCurrencyCode = market['quote'];
|
|
839
|
+
fee = {
|
|
840
|
+
'cost': feeCostString,
|
|
841
|
+
'currency': feeCurrencyCode,
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
return this.safeTrade({
|
|
845
|
+
'info': trade,
|
|
846
|
+
'timestamp': timestamp,
|
|
847
|
+
'datetime': this.iso8601(timestamp),
|
|
848
|
+
'symbol': symbol,
|
|
849
|
+
'id': orderId,
|
|
850
|
+
'order': orderId,
|
|
851
|
+
'type': undefined,
|
|
852
|
+
'side': side,
|
|
853
|
+
'takerOrMaker': undefined,
|
|
854
|
+
'price': priceString,
|
|
855
|
+
'amount': amountString,
|
|
856
|
+
'cost': costString,
|
|
857
|
+
'fee': fee,
|
|
858
|
+
}, market);
|
|
859
|
+
}
|
|
860
|
+
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
861
|
+
/**
|
|
862
|
+
* @method
|
|
863
|
+
* @name bitbns#fetchMyTrades
|
|
864
|
+
* @description fetch all trades made by the user
|
|
865
|
+
* @param {string} symbol unified market symbol
|
|
866
|
+
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
867
|
+
* @param {int} [limit] the maximum number of trades structures to retrieve
|
|
868
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
869
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
|
|
870
|
+
*/
|
|
871
|
+
if (symbol === undefined) {
|
|
872
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
|
|
873
|
+
}
|
|
874
|
+
await this.loadMarkets();
|
|
875
|
+
const market = this.market(symbol);
|
|
876
|
+
const request = {
|
|
877
|
+
'symbol': market['id'],
|
|
878
|
+
'page': 0,
|
|
879
|
+
};
|
|
880
|
+
if (since !== undefined) {
|
|
881
|
+
request['since'] = this.iso8601(since);
|
|
882
|
+
}
|
|
883
|
+
const response = await this.v1PostListExecutedOrdersSymbol(this.extend(request, params));
|
|
884
|
+
//
|
|
885
|
+
// {
|
|
886
|
+
// "data": [
|
|
887
|
+
// {
|
|
888
|
+
// "type": "BTC Sell order executed",
|
|
889
|
+
// "typeI": 6,
|
|
890
|
+
// "crypto": 5000,
|
|
891
|
+
// "amount": 35.4,
|
|
892
|
+
// "rate": 709800,
|
|
893
|
+
// "date": "2020-05-22T15:05:34.000Z",
|
|
894
|
+
// "unit": "INR",
|
|
895
|
+
// "factor": 100000000,
|
|
896
|
+
// "fee": 0.09,
|
|
897
|
+
// "delh_btc": -5000,
|
|
898
|
+
// "delh_inr": 0,
|
|
899
|
+
// "del_btc": 0,
|
|
900
|
+
// "del_inr": 35.4,
|
|
901
|
+
// "id": "2938823"
|
|
902
|
+
// },
|
|
903
|
+
// {
|
|
904
|
+
// "type": "BTC Sell order executed",
|
|
905
|
+
// "typeI": 6,
|
|
906
|
+
// "crypto": 195000,
|
|
907
|
+
// "amount": 1380.58,
|
|
908
|
+
// "rate": 709765.5,
|
|
909
|
+
// "date": "2020-05-22T15:05:34.000Z",
|
|
910
|
+
// "unit": "INR",
|
|
911
|
+
// "factor": 100000000,
|
|
912
|
+
// "fee": 3.47,
|
|
913
|
+
// "delh_btc": -195000,
|
|
914
|
+
// "delh_inr": 0,
|
|
915
|
+
// "del_btc": 0,
|
|
916
|
+
// "del_inr": 1380.58,
|
|
917
|
+
// "id": "2938823"
|
|
918
|
+
// }
|
|
919
|
+
// ],
|
|
920
|
+
// "status": 1,
|
|
921
|
+
// "error": null,
|
|
922
|
+
// "code": 200
|
|
923
|
+
// }
|
|
924
|
+
//
|
|
925
|
+
const data = this.safeValue(response, 'data', []);
|
|
926
|
+
return this.parseTrades(data, market, since, limit);
|
|
927
|
+
}
|
|
928
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
929
|
+
/**
|
|
930
|
+
* @method
|
|
931
|
+
* @name bitbns#fetchTrades
|
|
932
|
+
* @description get the list of most recent trades for a particular symbol
|
|
933
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
934
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
935
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
936
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
937
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
938
|
+
*/
|
|
939
|
+
if (symbol === undefined) {
|
|
940
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchTrades() requires a symbol argument');
|
|
941
|
+
}
|
|
942
|
+
await this.loadMarkets();
|
|
943
|
+
const market = this.market(symbol);
|
|
944
|
+
const request = {
|
|
945
|
+
'coin': market['baseId'],
|
|
946
|
+
'market': market['quoteId'],
|
|
947
|
+
};
|
|
948
|
+
const response = await this.wwwGetExchangeDataTradedetails(this.extend(request, params));
|
|
949
|
+
//
|
|
950
|
+
// [
|
|
951
|
+
// {"tradeId":"1909151","price":"61904.6300","quote_volume":1618.05,"base_volume":0.02607254,"timestamp":1634548602000,"type":"buy"},
|
|
952
|
+
// {"tradeId":"1909153","price":"61893.9000","quote_volume":16384.42,"base_volume":0.26405767,"timestamp":1634548999000,"type":"sell"},
|
|
953
|
+
// {"tradeId":"1909155","price":"61853.1100","quote_volume":2304.37,"base_volume":0.03716263,"timestamp":1634549670000,"type":"sell"}
|
|
954
|
+
// }
|
|
955
|
+
//
|
|
956
|
+
return this.parseTrades(response, market, since, limit);
|
|
957
|
+
}
|
|
958
|
+
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
959
|
+
/**
|
|
960
|
+
* @method
|
|
961
|
+
* @name bitbns#fetchDeposits
|
|
962
|
+
* @description fetch all deposits made to an account
|
|
963
|
+
* @param {string} code unified currency code
|
|
964
|
+
* @param {int} [since] the earliest time in ms to fetch deposits for
|
|
965
|
+
* @param {int} [limit] the maximum number of deposits structures to retrieve
|
|
966
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
967
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
968
|
+
*/
|
|
969
|
+
if (code === undefined) {
|
|
970
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchDeposits() requires a currency code argument');
|
|
971
|
+
}
|
|
972
|
+
await this.loadMarkets();
|
|
973
|
+
const currency = this.currency(code);
|
|
974
|
+
const request = {
|
|
975
|
+
'symbol': currency['id'],
|
|
976
|
+
'page': 0,
|
|
977
|
+
};
|
|
978
|
+
const response = await this.v1PostDepositHistorySymbol(this.extend(request, params));
|
|
979
|
+
//
|
|
980
|
+
// {
|
|
981
|
+
// "data":[
|
|
982
|
+
// {
|
|
983
|
+
// "type":"USDT deposited",
|
|
984
|
+
// "typeI":1,
|
|
985
|
+
// "amount":100,
|
|
986
|
+
// "date":"2021-04-24T14:56:04.000Z",
|
|
987
|
+
// "unit":"USDT",
|
|
988
|
+
// "factor":100,
|
|
989
|
+
// "fee":0,
|
|
990
|
+
// "delh_btc":0,
|
|
991
|
+
// "delh_inr":0,
|
|
992
|
+
// "rate":0,
|
|
993
|
+
// "del_btc":10000,
|
|
994
|
+
// "del_inr":0
|
|
995
|
+
// }
|
|
996
|
+
// ],
|
|
997
|
+
// "status":1,
|
|
998
|
+
// "error":null,
|
|
999
|
+
// "code":200
|
|
1000
|
+
// }
|
|
1001
|
+
//
|
|
1002
|
+
const data = this.safeValue(response, 'data', []);
|
|
1003
|
+
return this.parseTransactions(data, currency, since, limit);
|
|
1004
|
+
}
|
|
1005
|
+
async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
1006
|
+
/**
|
|
1007
|
+
* @method
|
|
1008
|
+
* @name bitbns#fetchWithdrawals
|
|
1009
|
+
* @description fetch all withdrawals made from an account
|
|
1010
|
+
* @param {string} code unified currency code
|
|
1011
|
+
* @param {int} [since] the earliest time in ms to fetch withdrawals for
|
|
1012
|
+
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
|
|
1013
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1014
|
+
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
1015
|
+
*/
|
|
1016
|
+
if (code === undefined) {
|
|
1017
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchWithdrawals() requires a currency code argument');
|
|
1018
|
+
}
|
|
1019
|
+
await this.loadMarkets();
|
|
1020
|
+
const currency = this.currency(code);
|
|
1021
|
+
const request = {
|
|
1022
|
+
'symbol': currency['id'],
|
|
1023
|
+
'page': 0,
|
|
1024
|
+
};
|
|
1025
|
+
const response = await this.v1PostWithdrawHistorySymbol(this.extend(request, params));
|
|
1026
|
+
//
|
|
1027
|
+
// ...
|
|
1028
|
+
//
|
|
1029
|
+
const data = this.safeValue(response, 'data', []);
|
|
1030
|
+
return this.parseTransactions(data, currency, since, limit);
|
|
1031
|
+
}
|
|
1032
|
+
parseTransactionStatusByType(status, type = undefined) {
|
|
1033
|
+
const statusesByType = {
|
|
1034
|
+
'deposit': {
|
|
1035
|
+
'0': 'pending',
|
|
1036
|
+
'1': 'ok',
|
|
1037
|
+
},
|
|
1038
|
+
'withdrawal': {
|
|
1039
|
+
'0': 'pending',
|
|
1040
|
+
'1': 'canceled',
|
|
1041
|
+
'2': 'pending',
|
|
1042
|
+
'3': 'failed',
|
|
1043
|
+
'4': 'pending',
|
|
1044
|
+
'5': 'failed',
|
|
1045
|
+
'6': 'ok', // Completed
|
|
1046
|
+
},
|
|
1047
|
+
};
|
|
1048
|
+
const statuses = this.safeValue(statusesByType, type, {});
|
|
1049
|
+
return this.safeString(statuses, status, status);
|
|
1050
|
+
}
|
|
1051
|
+
parseTransaction(transaction, currency = undefined) {
|
|
1052
|
+
//
|
|
1053
|
+
// fetchDeposits
|
|
1054
|
+
//
|
|
1055
|
+
// {
|
|
1056
|
+
// "type":"USDT deposited",
|
|
1057
|
+
// "typeI":1,
|
|
1058
|
+
// "amount":100,
|
|
1059
|
+
// "date":"2021-04-24T14:56:04.000Z",
|
|
1060
|
+
// "unit":"USDT",
|
|
1061
|
+
// "factor":100,
|
|
1062
|
+
// "fee":0,
|
|
1063
|
+
// "delh_btc":0,
|
|
1064
|
+
// "delh_inr":0,
|
|
1065
|
+
// "rate":0,
|
|
1066
|
+
// "del_btc":10000,
|
|
1067
|
+
// "del_inr":0
|
|
1068
|
+
// }
|
|
1069
|
+
//
|
|
1070
|
+
// fetchWithdrawals
|
|
1071
|
+
//
|
|
1072
|
+
// ...
|
|
1073
|
+
//
|
|
1074
|
+
const currencyId = this.safeString(transaction, 'unit');
|
|
1075
|
+
const code = this.safeCurrencyCode(currencyId, currency);
|
|
1076
|
+
const timestamp = this.parse8601(this.safeString2(transaction, 'date', 'timestamp'));
|
|
1077
|
+
let type = this.safeString(transaction, 'type');
|
|
1078
|
+
const expTime = this.safeString(transaction, 'expTime', '');
|
|
1079
|
+
let status = undefined;
|
|
1080
|
+
if (type !== undefined) {
|
|
1081
|
+
if (type.indexOf('deposit') >= 0) {
|
|
1082
|
+
type = 'deposit';
|
|
1083
|
+
status = 'ok';
|
|
1084
|
+
}
|
|
1085
|
+
else if (type.indexOf('withdraw') >= 0 || expTime.indexOf('withdraw') >= 0) {
|
|
1086
|
+
type = 'withdrawal';
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
// const status = this.parseTransactionStatusByType (this.safeString (transaction, 'status'), type);
|
|
1090
|
+
const amount = this.safeNumber(transaction, 'amount');
|
|
1091
|
+
const feeCost = this.safeNumber(transaction, 'fee');
|
|
1092
|
+
let fee = undefined;
|
|
1093
|
+
if (feeCost !== undefined) {
|
|
1094
|
+
fee = { 'currency': code, 'cost': feeCost };
|
|
1095
|
+
}
|
|
1096
|
+
return {
|
|
1097
|
+
'info': transaction,
|
|
1098
|
+
'id': undefined,
|
|
1099
|
+
'txid': undefined,
|
|
1100
|
+
'timestamp': timestamp,
|
|
1101
|
+
'datetime': this.iso8601(timestamp),
|
|
1102
|
+
'network': undefined,
|
|
1103
|
+
'address': undefined,
|
|
1104
|
+
'addressTo': undefined,
|
|
1105
|
+
'addressFrom': undefined,
|
|
1106
|
+
'tag': undefined,
|
|
1107
|
+
'tagTo': undefined,
|
|
1108
|
+
'tagFrom': undefined,
|
|
1109
|
+
'type': type,
|
|
1110
|
+
'amount': amount,
|
|
1111
|
+
'currency': code,
|
|
1112
|
+
'status': status,
|
|
1113
|
+
'updated': undefined,
|
|
1114
|
+
'comment': undefined,
|
|
1115
|
+
'internal': undefined,
|
|
1116
|
+
'fee': fee,
|
|
1117
|
+
};
|
|
1118
|
+
}
|
|
1119
|
+
async fetchDepositAddress(code, params = {}) {
|
|
1120
|
+
/**
|
|
1121
|
+
* @method
|
|
1122
|
+
* @name bitbns#fetchDepositAddress
|
|
1123
|
+
* @description fetch the deposit address for a currency associated with this account
|
|
1124
|
+
* @param {string} code unified currency code
|
|
1125
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1126
|
+
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
|
|
1127
|
+
*/
|
|
1128
|
+
await this.loadMarkets();
|
|
1129
|
+
const currency = this.currency(code);
|
|
1130
|
+
const request = {
|
|
1131
|
+
'symbol': currency['id'],
|
|
1132
|
+
};
|
|
1133
|
+
const response = await this.v1PostGetCoinAddressSymbol(this.extend(request, params));
|
|
1134
|
+
//
|
|
1135
|
+
// {
|
|
1136
|
+
// "data":{
|
|
1137
|
+
// "token":"0x680dee9edfff0c397736e10b017cf6a0aee4ba31",
|
|
1138
|
+
// "expiry":"2022-04-24 22:30:11"
|
|
1139
|
+
// },
|
|
1140
|
+
// "status":1,
|
|
1141
|
+
// "error":null
|
|
1142
|
+
// }
|
|
1143
|
+
//
|
|
1144
|
+
const data = this.safeValue(response, 'data', {});
|
|
1145
|
+
const address = this.safeString(data, 'token');
|
|
1146
|
+
const tag = this.safeString(data, 'tag');
|
|
1147
|
+
this.checkAddress(address);
|
|
1148
|
+
return {
|
|
1149
|
+
'currency': code,
|
|
1150
|
+
'address': address,
|
|
1151
|
+
'tag': tag,
|
|
1152
|
+
'network': undefined,
|
|
1153
|
+
'info': response,
|
|
1154
|
+
};
|
|
1155
|
+
}
|
|
1156
|
+
nonce() {
|
|
1157
|
+
return this.milliseconds();
|
|
1158
|
+
}
|
|
1159
|
+
sign(path, api = 'www', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1160
|
+
const urls = this.urls;
|
|
1161
|
+
if (!(api in urls['api'])) {
|
|
1162
|
+
throw new errors.ExchangeError(this.id + ' does not have a testnet/sandbox URL for ' + api + ' endpoints');
|
|
1163
|
+
}
|
|
1164
|
+
if (api !== 'www') {
|
|
1165
|
+
this.checkRequiredCredentials();
|
|
1166
|
+
headers = {
|
|
1167
|
+
'X-BITBNS-APIKEY': this.apiKey,
|
|
1168
|
+
};
|
|
1169
|
+
}
|
|
1170
|
+
const baseUrl = this.implodeHostname(this.urls['api'][api]);
|
|
1171
|
+
let url = baseUrl + '/' + this.implodeParams(path, params);
|
|
1172
|
+
const query = this.omit(params, this.extractParams(path));
|
|
1173
|
+
const nonce = this.nonce().toString();
|
|
1174
|
+
if (method === 'GET') {
|
|
1175
|
+
if (Object.keys(query).length) {
|
|
1176
|
+
url += '?' + this.urlencode(query);
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
else if (method === 'POST') {
|
|
1180
|
+
if (Object.keys(query).length) {
|
|
1181
|
+
body = this.json(query);
|
|
1182
|
+
}
|
|
1183
|
+
else {
|
|
1184
|
+
body = '{}';
|
|
1185
|
+
}
|
|
1186
|
+
const auth = {
|
|
1187
|
+
'timeStamp_nonce': nonce,
|
|
1188
|
+
'body': body,
|
|
1189
|
+
};
|
|
1190
|
+
const payload = this.stringToBase64(this.json(auth));
|
|
1191
|
+
const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha512.sha512);
|
|
1192
|
+
headers['X-BITBNS-PAYLOAD'] = payload;
|
|
1193
|
+
headers['X-BITBNS-SIGNATURE'] = signature;
|
|
1194
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
1195
|
+
}
|
|
1196
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
1197
|
+
}
|
|
1198
|
+
handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
1199
|
+
if (response === undefined) {
|
|
1200
|
+
return undefined; // fallback to default error handler
|
|
1201
|
+
}
|
|
1202
|
+
//
|
|
1203
|
+
// {"msg":"Invalid Request","status":-1,"code":400}
|
|
1204
|
+
// {"data":[],"status":0,"error":"Nothing to show","code":417}
|
|
1205
|
+
//
|
|
1206
|
+
const code = this.safeString(response, 'code');
|
|
1207
|
+
const message = this.safeString(response, 'msg');
|
|
1208
|
+
const error = (code !== undefined) && (code !== '200') && (code !== '204');
|
|
1209
|
+
if (error || (message !== undefined)) {
|
|
1210
|
+
const feedback = this.id + ' ' + body;
|
|
1211
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
|
|
1212
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
|
|
1213
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
|
|
1214
|
+
throw new errors.ExchangeError(feedback); // unknown message
|
|
1215
|
+
}
|
|
1216
|
+
return undefined;
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
module.exports = bitbns;
|