ccxt 4.2.11 → 4.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/build.sh +2 -2
- package/dist/ccxt.browser.js +640 -261
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/_virtual/agent.js +7 -0
- package/dist/cjs/_virtual/parse-proxy-response.js +7 -0
- package/dist/cjs/_virtual/promisify.js +7 -0
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/js/ccxt.js +474 -0
- package/dist/cjs/js/src/abstract/ace.js +9 -0
- package/dist/cjs/js/src/abstract/alpaca.js +9 -0
- package/dist/cjs/js/src/abstract/ascendex.js +9 -0
- package/dist/cjs/js/src/abstract/bigone.js +9 -0
- package/dist/cjs/js/src/abstract/binance.js +9 -0
- package/dist/cjs/js/src/abstract/bingx.js +9 -0
- package/dist/cjs/js/src/abstract/bit2c.js +9 -0
- package/dist/cjs/js/src/abstract/bitbank.js +9 -0
- package/dist/cjs/js/src/abstract/bitbns.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex.js +9 -0
- package/dist/cjs/js/src/abstract/bitfinex2.js +9 -0
- package/dist/cjs/js/src/abstract/bitflyer.js +9 -0
- package/dist/cjs/js/src/abstract/bitforex.js +9 -0
- package/dist/cjs/js/src/abstract/bitget.js +9 -0
- package/dist/cjs/js/src/abstract/bithumb.js +9 -0
- package/dist/cjs/js/src/abstract/bitmart.js +9 -0
- package/dist/cjs/js/src/abstract/bitmex.js +9 -0
- package/dist/cjs/js/src/abstract/bitopro.js +9 -0
- package/dist/cjs/js/src/abstract/bitpanda.js +9 -0
- package/dist/cjs/js/src/abstract/bitrue.js +9 -0
- package/dist/cjs/js/src/abstract/bitso.js +9 -0
- package/dist/cjs/js/src/abstract/bitstamp.js +9 -0
- package/dist/cjs/js/src/abstract/bitteam.js +9 -0
- package/dist/cjs/js/src/abstract/bitvavo.js +9 -0
- package/dist/cjs/js/src/abstract/bl3p.js +9 -0
- package/dist/cjs/js/src/abstract/blockchaincom.js +9 -0
- package/dist/cjs/js/src/abstract/btcalpha.js +9 -0
- package/dist/cjs/js/src/abstract/btcbox.js +9 -0
- package/dist/cjs/js/src/abstract/btcmarkets.js +9 -0
- package/dist/cjs/js/src/abstract/btcturk.js +9 -0
- package/dist/cjs/js/src/abstract/bybit.js +9 -0
- package/dist/cjs/js/src/abstract/cex.js +9 -0
- package/dist/cjs/js/src/abstract/coinbase.js +9 -0
- package/dist/cjs/js/src/abstract/coinbasepro.js +9 -0
- package/dist/cjs/js/src/abstract/coincheck.js +9 -0
- package/dist/cjs/js/src/abstract/coinex.js +9 -0
- package/dist/cjs/js/src/abstract/coinlist.js +9 -0
- package/dist/cjs/js/src/abstract/coinmate.js +9 -0
- package/dist/cjs/js/src/abstract/coinone.js +9 -0
- package/dist/cjs/js/src/abstract/coinsph.js +9 -0
- package/dist/cjs/js/src/abstract/coinspot.js +9 -0
- package/dist/cjs/js/src/abstract/cryptocom.js +9 -0
- package/dist/cjs/js/src/abstract/currencycom.js +9 -0
- package/dist/cjs/js/src/abstract/delta.js +9 -0
- package/dist/cjs/js/src/abstract/deribit.js +9 -0
- package/dist/cjs/js/src/abstract/digifinex.js +9 -0
- package/dist/cjs/js/src/abstract/exmo.js +9 -0
- package/dist/cjs/js/src/abstract/gate.js +9 -0
- package/dist/cjs/js/src/abstract/gemini.js +9 -0
- package/dist/cjs/js/src/abstract/hitbtc.js +9 -0
- package/dist/cjs/js/src/abstract/hollaex.js +9 -0
- package/dist/cjs/js/src/abstract/htx.js +9 -0
- package/dist/cjs/js/src/abstract/huobijp.js +9 -0
- package/dist/cjs/js/src/abstract/idex.js +9 -0
- package/dist/cjs/js/src/abstract/independentreserve.js +9 -0
- package/dist/cjs/js/src/abstract/indodax.js +9 -0
- package/dist/cjs/js/src/abstract/kraken.js +9 -0
- package/dist/cjs/js/src/abstract/krakenfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kucoin.js +9 -0
- package/dist/cjs/js/src/abstract/kucoinfutures.js +9 -0
- package/dist/cjs/js/src/abstract/kuna.js +9 -0
- package/dist/cjs/js/src/abstract/latoken.js +9 -0
- package/dist/cjs/js/src/abstract/lbank.js +9 -0
- package/dist/cjs/js/src/abstract/luno.js +9 -0
- package/dist/cjs/js/src/abstract/lykke.js +9 -0
- package/dist/cjs/js/src/abstract/mercado.js +9 -0
- package/dist/cjs/js/src/abstract/mexc.js +9 -0
- package/dist/cjs/js/src/abstract/ndax.js +9 -0
- package/dist/cjs/js/src/abstract/novadax.js +9 -0
- package/dist/cjs/js/src/abstract/oceanex.js +9 -0
- package/dist/cjs/js/src/abstract/okcoin.js +9 -0
- package/dist/cjs/js/src/abstract/okx.js +9 -0
- package/dist/cjs/js/src/abstract/p2b.js +9 -0
- package/dist/cjs/js/src/abstract/paymium.js +9 -0
- package/dist/cjs/js/src/abstract/phemex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniex.js +9 -0
- package/dist/cjs/js/src/abstract/poloniexfutures.js +9 -0
- package/dist/cjs/js/src/abstract/probit.js +9 -0
- package/dist/cjs/js/src/abstract/timex.js +9 -0
- package/dist/cjs/js/src/abstract/tokocrypto.js +9 -0
- package/dist/cjs/js/src/abstract/upbit.js +9 -0
- package/dist/cjs/js/src/abstract/wavesexchange.js +9 -0
- package/dist/cjs/js/src/abstract/wazirx.js +9 -0
- package/dist/cjs/js/src/abstract/whitebit.js +9 -0
- package/dist/cjs/js/src/abstract/woo.js +9 -0
- package/dist/cjs/js/src/abstract/yobit.js +9 -0
- package/dist/cjs/js/src/abstract/zaif.js +9 -0
- package/dist/cjs/js/src/abstract/zonda.js +9 -0
- package/dist/cjs/js/src/ace.js +1058 -0
- package/dist/cjs/js/src/alpaca.js +1125 -0
- package/dist/cjs/js/src/ascendex.js +3360 -0
- package/dist/cjs/js/src/base/Exchange.js +5110 -0
- package/dist/cjs/js/src/base/Precise.js +263 -0
- package/dist/cjs/js/src/base/errors.js +299 -0
- package/dist/cjs/js/src/base/functions/crypto.js +78 -0
- package/dist/cjs/js/src/base/functions/encode.js +44 -0
- package/dist/cjs/js/src/base/functions/generic.js +193 -0
- package/dist/cjs/js/src/base/functions/misc.js +96 -0
- package/dist/cjs/js/src/base/functions/number.js +297 -0
- package/dist/cjs/js/src/base/functions/platform.js +28 -0
- package/dist/cjs/js/src/base/functions/rsa.js +34 -0
- package/dist/cjs/js/src/base/functions/string.js +48 -0
- package/dist/cjs/js/src/base/functions/throttle.js +66 -0
- package/dist/cjs/js/src/base/functions/time.js +187 -0
- package/dist/cjs/js/src/base/functions/totp.js +24 -0
- package/dist/cjs/js/src/base/functions/type.js +162 -0
- package/dist/cjs/js/src/base/functions.js +157 -0
- package/dist/cjs/js/src/base/ws/Cache.js +254 -0
- package/dist/cjs/js/src/base/ws/Client.js +299 -0
- package/dist/cjs/js/src/base/ws/Future.js +34 -0
- package/dist/cjs/js/src/base/ws/OrderBook.js +107 -0
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +281 -0
- package/dist/cjs/js/src/base/ws/WsClient.js +69 -0
- package/dist/cjs/js/src/bequant.js +33 -0
- package/dist/cjs/js/src/bigone.js +2142 -0
- package/dist/cjs/js/src/binance.js +9729 -0
- package/dist/cjs/js/src/binancecoinm.js +45 -0
- package/dist/cjs/js/src/binanceus.js +84 -0
- package/dist/cjs/js/src/binanceusdm.js +58 -0
- package/dist/cjs/js/src/bingx.js +3737 -0
- package/dist/cjs/js/src/bit2c.js +916 -0
- package/dist/cjs/js/src/bitbank.js +1000 -0
- package/dist/cjs/js/src/bitbay.js +17 -0
- package/dist/cjs/js/src/bitbns.js +1220 -0
- package/dist/cjs/js/src/bitcoincom.js +17 -0
- package/dist/cjs/js/src/bitfinex.js +1670 -0
- package/dist/cjs/js/src/bitfinex2.js +2990 -0
- package/dist/cjs/js/src/bitflyer.js +1045 -0
- package/dist/cjs/js/src/bitforex.js +852 -0
- package/dist/cjs/js/src/bitget.js +8284 -0
- package/dist/cjs/js/src/bithumb.js +1090 -0
- package/dist/cjs/js/src/bitmart.js +4454 -0
- package/dist/cjs/js/src/bitmex.js +2884 -0
- package/dist/cjs/js/src/bitopro.js +1724 -0
- package/dist/cjs/js/src/bitpanda.js +2002 -0
- package/dist/cjs/js/src/bitrue.js +3253 -0
- package/dist/cjs/js/src/bitso.js +1753 -0
- package/dist/cjs/js/src/bitstamp.js +2188 -0
- package/dist/cjs/js/src/bitteam.js +2309 -0
- package/dist/cjs/js/src/bitvavo.js +1968 -0
- package/dist/cjs/js/src/bl3p.js +447 -0
- package/dist/cjs/js/src/blockchaincom.js +1160 -0
- package/dist/cjs/js/src/btcalpha.js +929 -0
- package/dist/cjs/js/src/btcbox.js +565 -0
- package/dist/cjs/js/src/btcmarkets.js +1237 -0
- package/dist/cjs/js/src/btcturk.js +929 -0
- package/dist/cjs/js/src/bybit.js +7646 -0
- package/dist/cjs/js/src/cex.js +1693 -0
- package/dist/cjs/js/src/coinbase.js +3274 -0
- package/dist/cjs/js/src/coinbasepro.js +1866 -0
- package/dist/cjs/js/src/coincheck.js +843 -0
- package/dist/cjs/js/src/coinex.js +5414 -0
- package/dist/cjs/js/src/coinlist.js +2329 -0
- package/dist/cjs/js/src/coinmate.js +989 -0
- package/dist/cjs/js/src/coinone.js +1185 -0
- package/dist/cjs/js/src/coinsph.js +1933 -0
- package/dist/cjs/js/src/coinspot.js +548 -0
- package/dist/cjs/js/src/cryptocom.js +3007 -0
- package/dist/cjs/js/src/currencycom.js +2015 -0
- package/dist/cjs/js/src/delta.js +3256 -0
- package/dist/cjs/js/src/deribit.js +3306 -0
- package/dist/cjs/js/src/digifinex.js +4307 -0
- package/dist/cjs/js/src/exmo.js +2645 -0
- package/dist/cjs/js/src/fmfwio.js +34 -0
- package/dist/cjs/js/src/gate.js +7054 -0
- package/dist/cjs/js/src/gateio.js +16 -0
- package/dist/cjs/js/src/gemini.js +1801 -0
- package/dist/cjs/js/src/hitbtc.js +3660 -0
- package/dist/cjs/js/src/hitbtc3.js +19 -0
- package/dist/cjs/js/src/hollaex.js +1882 -0
- package/dist/cjs/js/src/htx.js +9024 -0
- package/dist/cjs/js/src/huobi.js +16 -0
- package/dist/cjs/js/src/huobijp.js +1918 -0
- package/dist/cjs/js/src/idex.js +1770 -0
- package/dist/cjs/js/src/independentreserve.js +759 -0
- package/dist/cjs/js/src/indodax.js +1069 -0
- package/dist/cjs/js/src/kraken.js +2861 -0
- package/dist/cjs/js/src/krakenfutures.js +2407 -0
- package/dist/cjs/js/src/kucoin.js +4489 -0
- package/dist/cjs/js/src/kucoinfutures.js +2475 -0
- package/dist/cjs/js/src/kuna.js +1949 -0
- package/dist/cjs/js/src/latoken.js +1729 -0
- package/dist/cjs/js/src/lbank.js +2825 -0
- package/dist/cjs/js/src/luno.js +1044 -0
- package/dist/cjs/js/src/lykke.js +1303 -0
- package/dist/cjs/js/src/mercado.js +897 -0
- package/dist/cjs/js/src/mexc.js +5407 -0
- package/dist/cjs/js/src/ndax.js +2450 -0
- package/dist/cjs/js/src/novadax.js +1556 -0
- package/dist/cjs/js/src/oceanex.js +964 -0
- package/dist/cjs/js/src/okcoin.js +3115 -0
- package/dist/cjs/js/src/okx.js +7329 -0
- package/dist/cjs/js/src/p2b.js +1243 -0
- package/dist/cjs/js/src/paymium.js +597 -0
- package/dist/cjs/js/src/phemex.js +4715 -0
- package/dist/cjs/js/src/poloniex.js +2356 -0
- package/dist/cjs/js/src/poloniexfutures.js +1794 -0
- package/dist/cjs/js/src/pro/alpaca.js +714 -0
- package/dist/cjs/js/src/pro/ascendex.js +957 -0
- package/dist/cjs/js/src/pro/bequant.js +33 -0
- package/dist/cjs/js/src/pro/binance.js +2796 -0
- package/dist/cjs/js/src/pro/binancecoinm.js +23 -0
- package/dist/cjs/js/src/pro/binanceus.js +51 -0
- package/dist/cjs/js/src/pro/binanceusdm.js +32 -0
- package/dist/cjs/js/src/pro/bingx.js +944 -0
- package/dist/cjs/js/src/pro/bitcoincom.js +29 -0
- package/dist/cjs/js/src/pro/bitfinex.js +672 -0
- package/dist/cjs/js/src/pro/bitfinex2.js +1159 -0
- package/dist/cjs/js/src/pro/bitget.js +1733 -0
- package/dist/cjs/js/src/pro/bitmart.js +1486 -0
- package/dist/cjs/js/src/pro/bitmex.js +1576 -0
- package/dist/cjs/js/src/pro/bitopro.js +327 -0
- package/dist/cjs/js/src/pro/bitpanda.js +1341 -0
- package/dist/cjs/js/src/pro/bitrue.js +462 -0
- package/dist/cjs/js/src/pro/bitstamp.js +547 -0
- package/dist/cjs/js/src/pro/bitvavo.js +704 -0
- package/dist/cjs/js/src/pro/blockchaincom.js +794 -0
- package/dist/cjs/js/src/pro/bybit.js +1843 -0
- package/dist/cjs/js/src/pro/cex.js +1510 -0
- package/dist/cjs/js/src/pro/coinbase.js +561 -0
- package/dist/cjs/js/src/pro/coinbasepro.js +968 -0
- package/dist/cjs/js/src/pro/coinex.js +1095 -0
- package/dist/cjs/js/src/pro/cryptocom.js +1020 -0
- package/dist/cjs/js/src/pro/currencycom.js +563 -0
- package/dist/cjs/js/src/pro/deribit.js +825 -0
- package/dist/cjs/js/src/pro/exmo.js +658 -0
- package/dist/cjs/js/src/pro/gate.js +1316 -0
- package/dist/cjs/js/src/pro/gateio.js +16 -0
- package/dist/cjs/js/src/pro/gemini.js +649 -0
- package/dist/cjs/js/src/pro/hitbtc.js +1293 -0
- package/dist/cjs/js/src/pro/hollaex.js +597 -0
- package/dist/cjs/js/src/pro/htx.js +2383 -0
- package/dist/cjs/js/src/pro/huobi.js +16 -0
- package/dist/cjs/js/src/pro/huobijp.js +606 -0
- package/dist/cjs/js/src/pro/idex.js +714 -0
- package/dist/cjs/js/src/pro/independentreserve.js +280 -0
- package/dist/cjs/js/src/pro/kraken.js +1364 -0
- package/dist/cjs/js/src/pro/krakenfutures.js +1500 -0
- package/dist/cjs/js/src/pro/kucoin.js +1052 -0
- package/dist/cjs/js/src/pro/kucoinfutures.js +981 -0
- package/dist/cjs/js/src/pro/luno.js +322 -0
- package/dist/cjs/js/src/pro/mexc.js +1170 -0
- package/dist/cjs/js/src/pro/ndax.js +545 -0
- package/dist/cjs/js/src/pro/okcoin.js +760 -0
- package/dist/cjs/js/src/pro/okx.js +1558 -0
- package/dist/cjs/js/src/pro/phemex.js +1511 -0
- package/dist/cjs/js/src/pro/poloniex.js +1253 -0
- package/dist/cjs/js/src/pro/poloniexfutures.js +1014 -0
- package/dist/cjs/js/src/pro/probit.js +586 -0
- package/dist/cjs/js/src/pro/upbit.js +234 -0
- package/dist/cjs/js/src/pro/wazirx.js +776 -0
- package/dist/cjs/js/src/pro/whitebit.js +927 -0
- package/dist/cjs/js/src/pro/woo.js +769 -0
- package/dist/cjs/js/src/probit.js +1865 -0
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +401 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +195 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +308 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +554 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +16 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1760 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +52 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +81 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +376 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +70 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1580 -0
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +74 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +24 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +158 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +429 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +176 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +324 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +163 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +245 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1018 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +383 -0
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +258 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +53 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +120 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +69 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +7 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +83 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +240 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +91 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +130 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +214 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +239 -0
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +93 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +354 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +20 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +30 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +239 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +372 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +273 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +139 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +14 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +16 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +81 -0
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +292 -0
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +103 -0
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +140 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +175 -0
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +7 -0
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +383 -0
- package/dist/cjs/js/src/timex.js +1562 -0
- package/dist/cjs/js/src/tokocrypto.js +2542 -0
- package/dist/cjs/js/src/upbit.js +1844 -0
- package/dist/cjs/js/src/wavesexchange.js +2607 -0
- package/dist/cjs/js/src/wazirx.js +953 -0
- package/dist/cjs/js/src/whitebit.js +2309 -0
- package/dist/cjs/js/src/woo.js +2715 -0
- package/dist/cjs/js/src/yobit.js +1314 -0
- package/dist/cjs/js/src/zaif.js +736 -0
- package/dist/cjs/js/src/zonda.js +1883 -0
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bigone.d.ts +18 -0
- package/js/src/abstract/binance.d.ts +2 -0
- package/js/src/abstract/binancecoinm.d.ts +2 -0
- package/js/src/abstract/binanceus.d.ts +2 -0
- package/js/src/abstract/binanceusdm.d.ts +2 -0
- package/js/src/abstract/bybit.d.ts +1 -0
- package/js/src/abstract/gate.d.ts +11 -0
- package/js/src/abstract/gateio.d.ts +11 -0
- package/js/src/alpaca.js +18 -18
- package/js/src/base/Exchange.d.ts +5 -1
- package/js/src/base/Exchange.js +101 -12
- package/js/src/bigone.d.ts +1 -2
- package/js/src/bigone.js +340 -145
- package/js/src/binance.js +15 -8
- package/js/src/bingx.js +9 -2
- package/js/src/bitfinex.d.ts +2 -2
- package/js/src/bitfinex.js +2 -3
- package/js/src/bitget.js +21 -8
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmart.js +3 -3
- package/js/src/bitmex.js +1 -0
- package/js/src/bybit.js +2 -0
- package/js/src/coinlist.js +2 -3
- package/js/src/coinsph.js +2 -3
- package/js/src/deribit.js +1 -0
- package/js/src/gate.d.ts +4 -4
- package/js/src/gate.js +22 -3
- package/js/src/hitbtc.d.ts +4 -4
- package/js/src/hitbtc.js +2 -3
- package/js/src/htx.js +4 -7
- package/js/src/huobijp.js +2 -3
- package/js/src/kraken.js +1 -0
- package/js/src/mexc.js +2 -1
- package/js/src/okx.js +13 -3
- package/js/src/pro/binance.d.ts +2 -23
- package/js/src/pro/binance.js +58 -22
- package/js/src/pro/coinbase.d.ts +2 -2
- package/js/src/pro/coinbase.js +4 -1
- package/js/src/pro/coinbasepro.d.ts +2 -2
- package/js/src/pro/hitbtc.d.ts +2 -2
- package/js/src/pro/poloniex.d.ts +2 -2
- package/js/src/upbit.d.ts +3 -101
- package/js/src/upbit.js +12 -12
- package/js/src/woo.js +2 -0
- package/package.json +1 -1
- package/skip-tests.json +5 -0
|
@@ -0,0 +1,1090 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var bithumb$1 = require('./abstract/bithumb.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 bithumb
|
|
13
|
+
* @augments Exchange
|
|
14
|
+
*/
|
|
15
|
+
class bithumb extends bithumb$1 {
|
|
16
|
+
describe() {
|
|
17
|
+
return this.deepExtend(super.describe(), {
|
|
18
|
+
'id': 'bithumb',
|
|
19
|
+
'name': 'Bithumb',
|
|
20
|
+
'countries': ['KR'],
|
|
21
|
+
'rateLimit': 500,
|
|
22
|
+
'has': {
|
|
23
|
+
'CORS': true,
|
|
24
|
+
'spot': true,
|
|
25
|
+
'margin': false,
|
|
26
|
+
'swap': false,
|
|
27
|
+
'future': false,
|
|
28
|
+
'option': false,
|
|
29
|
+
'addMargin': false,
|
|
30
|
+
'cancelOrder': true,
|
|
31
|
+
'closeAllPositions': false,
|
|
32
|
+
'closePosition': false,
|
|
33
|
+
'createMarketOrder': true,
|
|
34
|
+
'createOrder': true,
|
|
35
|
+
'createReduceOnlyOrder': false,
|
|
36
|
+
'fetchBalance': true,
|
|
37
|
+
'fetchBorrowRateHistories': false,
|
|
38
|
+
'fetchBorrowRateHistory': false,
|
|
39
|
+
'fetchCrossBorrowRate': false,
|
|
40
|
+
'fetchCrossBorrowRates': false,
|
|
41
|
+
'fetchFundingHistory': false,
|
|
42
|
+
'fetchFundingRate': false,
|
|
43
|
+
'fetchFundingRateHistory': false,
|
|
44
|
+
'fetchFundingRates': false,
|
|
45
|
+
'fetchIndexOHLCV': false,
|
|
46
|
+
'fetchIsolatedBorrowRate': false,
|
|
47
|
+
'fetchIsolatedBorrowRates': false,
|
|
48
|
+
'fetchLeverage': false,
|
|
49
|
+
'fetchMarkets': true,
|
|
50
|
+
'fetchMarkOHLCV': false,
|
|
51
|
+
'fetchOHLCV': true,
|
|
52
|
+
'fetchOpenInterestHistory': false,
|
|
53
|
+
'fetchOpenOrders': true,
|
|
54
|
+
'fetchOrder': true,
|
|
55
|
+
'fetchOrderBook': true,
|
|
56
|
+
'fetchPosition': false,
|
|
57
|
+
'fetchPositions': false,
|
|
58
|
+
'fetchPositionsRisk': false,
|
|
59
|
+
'fetchPremiumIndexOHLCV': false,
|
|
60
|
+
'fetchTicker': true,
|
|
61
|
+
'fetchTickers': true,
|
|
62
|
+
'fetchTrades': true,
|
|
63
|
+
'fetchTransfer': false,
|
|
64
|
+
'fetchTransfers': false,
|
|
65
|
+
'reduceMargin': false,
|
|
66
|
+
'setLeverage': false,
|
|
67
|
+
'setMarginMode': false,
|
|
68
|
+
'setPositionMode': false,
|
|
69
|
+
'transfer': false,
|
|
70
|
+
'withdraw': true,
|
|
71
|
+
},
|
|
72
|
+
'hostname': 'bithumb.com',
|
|
73
|
+
'urls': {
|
|
74
|
+
'logo': 'https://user-images.githubusercontent.com/1294454/30597177-ea800172-9d5e-11e7-804c-b9d4fa9b56b0.jpg',
|
|
75
|
+
'api': {
|
|
76
|
+
'public': 'https://api.{hostname}/public',
|
|
77
|
+
'private': 'https://api.{hostname}',
|
|
78
|
+
},
|
|
79
|
+
'www': 'https://www.bithumb.com',
|
|
80
|
+
'doc': 'https://apidocs.bithumb.com',
|
|
81
|
+
'fees': 'https://en.bithumb.com/customer_support/info_fee',
|
|
82
|
+
},
|
|
83
|
+
'api': {
|
|
84
|
+
'public': {
|
|
85
|
+
'get': [
|
|
86
|
+
'ticker/ALL_{quoteId}',
|
|
87
|
+
'ticker/{baseId}_{quoteId}',
|
|
88
|
+
'orderbook/ALL_{quoteId}',
|
|
89
|
+
'orderbook/{baseId}_{quoteId}',
|
|
90
|
+
'transaction_history/{baseId}_{quoteId}',
|
|
91
|
+
'assetsstatus/ALL',
|
|
92
|
+
'assetsstatus/{baseId}',
|
|
93
|
+
'candlestick/{baseId}_{quoteId}/{interval}',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
'private': {
|
|
97
|
+
'post': [
|
|
98
|
+
'info/account',
|
|
99
|
+
'info/balance',
|
|
100
|
+
'info/wallet_address',
|
|
101
|
+
'info/ticker',
|
|
102
|
+
'info/orders',
|
|
103
|
+
'info/user_transactions',
|
|
104
|
+
'info/order_detail',
|
|
105
|
+
'trade/place',
|
|
106
|
+
'trade/cancel',
|
|
107
|
+
'trade/btc_withdrawal',
|
|
108
|
+
'trade/krw_deposit',
|
|
109
|
+
'trade/krw_withdrawal',
|
|
110
|
+
'trade/market_buy',
|
|
111
|
+
'trade/market_sell',
|
|
112
|
+
'trade/stop_limit',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
'fees': {
|
|
117
|
+
'trading': {
|
|
118
|
+
'maker': this.parseNumber('0.0025'),
|
|
119
|
+
'taker': this.parseNumber('0.0025'),
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
'precisionMode': number.SIGNIFICANT_DIGITS,
|
|
123
|
+
'exceptions': {
|
|
124
|
+
'Bad Request(SSL)': errors.BadRequest,
|
|
125
|
+
'Bad Request(Bad Method)': errors.BadRequest,
|
|
126
|
+
'Bad Request.(Auth Data)': errors.AuthenticationError,
|
|
127
|
+
'Not Member': errors.AuthenticationError,
|
|
128
|
+
'Invalid Apikey': errors.AuthenticationError,
|
|
129
|
+
'Method Not Allowed.(Access IP)': errors.PermissionDenied,
|
|
130
|
+
'Method Not Allowed.(BTC Adress)': errors.InvalidAddress,
|
|
131
|
+
'Method Not Allowed.(Access)': errors.PermissionDenied,
|
|
132
|
+
'Database Fail': errors.ExchangeNotAvailable,
|
|
133
|
+
'Invalid Parameter': errors.BadRequest,
|
|
134
|
+
'5600': errors.ExchangeError,
|
|
135
|
+
'Unknown Error': errors.ExchangeError,
|
|
136
|
+
'After May 23th, recent_transactions is no longer, hence users will not be able to connect to recent_transactions': errors.ExchangeError, // {"status":"5100","message":"After May 23th, recent_transactions is no longer, hence users will not be able to connect to recent_transactions"}
|
|
137
|
+
},
|
|
138
|
+
'timeframes': {
|
|
139
|
+
'1m': '1m',
|
|
140
|
+
'3m': '3m',
|
|
141
|
+
'5m': '5m',
|
|
142
|
+
'10m': '10m',
|
|
143
|
+
'30m': '30m',
|
|
144
|
+
'1h': '1h',
|
|
145
|
+
'6h': '6h',
|
|
146
|
+
'12h': '12h',
|
|
147
|
+
'1d': '24h',
|
|
148
|
+
},
|
|
149
|
+
'options': {
|
|
150
|
+
'quoteCurrencies': {
|
|
151
|
+
'BTC': {
|
|
152
|
+
'limits': {
|
|
153
|
+
'cost': {
|
|
154
|
+
'min': 0.0002,
|
|
155
|
+
'max': 100,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
'KRW': {
|
|
160
|
+
'limits': {
|
|
161
|
+
'cost': {
|
|
162
|
+
'min': 500,
|
|
163
|
+
'max': 5000000000,
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
'commonCurrencies': {
|
|
170
|
+
'ALT': 'ArchLoot',
|
|
171
|
+
'FTC': 'FTC2',
|
|
172
|
+
'SOC': 'Soda Coin',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
safeMarket(marketId = undefined, market = undefined, delimiter = undefined, marketType = undefined) {
|
|
177
|
+
// bithumb has a different type of conflict in markets, because
|
|
178
|
+
// their ids are the base currency (BTC for instance), so we can have
|
|
179
|
+
// multiple "BTC" ids representing the different markets (BTC/ETH, "BTC/DOGE", etc)
|
|
180
|
+
// since they're the same we just need to return one
|
|
181
|
+
return super.safeMarket(marketId, market, delimiter, 'spot');
|
|
182
|
+
}
|
|
183
|
+
amountToPrecision(symbol, amount) {
|
|
184
|
+
return this.decimalToPrecision(amount, number.TRUNCATE, this.markets[symbol]['precision']['amount'], number.DECIMAL_PLACES);
|
|
185
|
+
}
|
|
186
|
+
async fetchMarkets(params = {}) {
|
|
187
|
+
/**
|
|
188
|
+
* @method
|
|
189
|
+
* @name bithumb#fetchMarkets
|
|
190
|
+
* @description retrieves data on all markets for bithumb
|
|
191
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
192
|
+
* @returns {object[]} an array of objects representing market data
|
|
193
|
+
*/
|
|
194
|
+
const result = [];
|
|
195
|
+
const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
|
|
196
|
+
const quotes = Object.keys(quoteCurrencies);
|
|
197
|
+
for (let i = 0; i < quotes.length; i++) {
|
|
198
|
+
const quote = quotes[i];
|
|
199
|
+
const quoteId = quote;
|
|
200
|
+
const extension = this.safeValue(quoteCurrencies, quote, {});
|
|
201
|
+
const request = {
|
|
202
|
+
'quoteId': quoteId,
|
|
203
|
+
};
|
|
204
|
+
const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
|
|
205
|
+
const data = this.safeValue(response, 'data');
|
|
206
|
+
const currencyIds = Object.keys(data);
|
|
207
|
+
for (let j = 0; j < currencyIds.length; j++) {
|
|
208
|
+
const currencyId = currencyIds[j];
|
|
209
|
+
if (currencyId === 'date') {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const market = data[currencyId];
|
|
213
|
+
const base = this.safeCurrencyCode(currencyId);
|
|
214
|
+
let active = true;
|
|
215
|
+
if (Array.isArray(market)) {
|
|
216
|
+
const numElements = market.length;
|
|
217
|
+
if (numElements === 0) {
|
|
218
|
+
active = false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const entry = this.deepExtend({
|
|
222
|
+
'id': currencyId,
|
|
223
|
+
'symbol': base + '/' + quote,
|
|
224
|
+
'base': base,
|
|
225
|
+
'quote': quote,
|
|
226
|
+
'settle': undefined,
|
|
227
|
+
'baseId': currencyId,
|
|
228
|
+
'quoteId': quoteId,
|
|
229
|
+
'settleId': undefined,
|
|
230
|
+
'type': 'spot',
|
|
231
|
+
'spot': true,
|
|
232
|
+
'margin': false,
|
|
233
|
+
'swap': false,
|
|
234
|
+
'future': false,
|
|
235
|
+
'option': false,
|
|
236
|
+
'active': active,
|
|
237
|
+
'contract': false,
|
|
238
|
+
'linear': undefined,
|
|
239
|
+
'inverse': undefined,
|
|
240
|
+
'contractSize': undefined,
|
|
241
|
+
'expiry': undefined,
|
|
242
|
+
'expiryDateTime': undefined,
|
|
243
|
+
'strike': undefined,
|
|
244
|
+
'optionType': undefined,
|
|
245
|
+
'precision': {
|
|
246
|
+
'amount': parseInt('4'),
|
|
247
|
+
'price': parseInt('4'),
|
|
248
|
+
},
|
|
249
|
+
'limits': {
|
|
250
|
+
'leverage': {
|
|
251
|
+
'min': undefined,
|
|
252
|
+
'max': undefined,
|
|
253
|
+
},
|
|
254
|
+
'amount': {
|
|
255
|
+
'min': undefined,
|
|
256
|
+
'max': undefined,
|
|
257
|
+
},
|
|
258
|
+
'price': {
|
|
259
|
+
'min': undefined,
|
|
260
|
+
'max': undefined,
|
|
261
|
+
},
|
|
262
|
+
'cost': {}, // set via options
|
|
263
|
+
},
|
|
264
|
+
'created': undefined,
|
|
265
|
+
'info': market,
|
|
266
|
+
}, extension);
|
|
267
|
+
result.push(entry);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return result;
|
|
271
|
+
}
|
|
272
|
+
parseBalance(response) {
|
|
273
|
+
const result = { 'info': response };
|
|
274
|
+
const balances = this.safeValue(response, 'data');
|
|
275
|
+
const codes = Object.keys(this.currencies);
|
|
276
|
+
for (let i = 0; i < codes.length; i++) {
|
|
277
|
+
const code = codes[i];
|
|
278
|
+
const account = this.account();
|
|
279
|
+
const currency = this.currency(code);
|
|
280
|
+
const lowerCurrencyId = this.safeStringLower(currency, 'id');
|
|
281
|
+
account['total'] = this.safeString(balances, 'total_' + lowerCurrencyId);
|
|
282
|
+
account['used'] = this.safeString(balances, 'in_use_' + lowerCurrencyId);
|
|
283
|
+
account['free'] = this.safeString(balances, 'available_' + lowerCurrencyId);
|
|
284
|
+
result[code] = account;
|
|
285
|
+
}
|
|
286
|
+
return this.safeBalance(result);
|
|
287
|
+
}
|
|
288
|
+
async fetchBalance(params = {}) {
|
|
289
|
+
/**
|
|
290
|
+
* @method
|
|
291
|
+
* @name bithumb#fetchBalance
|
|
292
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
293
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
294
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
295
|
+
*/
|
|
296
|
+
await this.loadMarkets();
|
|
297
|
+
const request = {
|
|
298
|
+
'currency': 'ALL',
|
|
299
|
+
};
|
|
300
|
+
const response = await this.privatePostInfoBalance(this.extend(request, params));
|
|
301
|
+
return this.parseBalance(response);
|
|
302
|
+
}
|
|
303
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
304
|
+
/**
|
|
305
|
+
* @method
|
|
306
|
+
* @name bithumb#fetchOrderBook
|
|
307
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
308
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
309
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
310
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
311
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
312
|
+
*/
|
|
313
|
+
await this.loadMarkets();
|
|
314
|
+
const market = this.market(symbol);
|
|
315
|
+
const request = {
|
|
316
|
+
'baseId': market['baseId'],
|
|
317
|
+
'quoteId': market['quoteId'],
|
|
318
|
+
};
|
|
319
|
+
if (limit !== undefined) {
|
|
320
|
+
request['count'] = limit; // default 30, max 30
|
|
321
|
+
}
|
|
322
|
+
const response = await this.publicGetOrderbookBaseIdQuoteId(this.extend(request, params));
|
|
323
|
+
//
|
|
324
|
+
// {
|
|
325
|
+
// "status":"0000",
|
|
326
|
+
// "data":{
|
|
327
|
+
// "timestamp":"1587621553942",
|
|
328
|
+
// "payment_currency":"KRW",
|
|
329
|
+
// "order_currency":"BTC",
|
|
330
|
+
// "bids":[
|
|
331
|
+
// {"price":"8652000","quantity":"0.0043"},
|
|
332
|
+
// {"price":"8651000","quantity":"0.0049"},
|
|
333
|
+
// {"price":"8650000","quantity":"8.4791"},
|
|
334
|
+
// ],
|
|
335
|
+
// "asks":[
|
|
336
|
+
// {"price":"8654000","quantity":"0.119"},
|
|
337
|
+
// {"price":"8655000","quantity":"0.254"},
|
|
338
|
+
// {"price":"8658000","quantity":"0.119"},
|
|
339
|
+
// ]
|
|
340
|
+
// }
|
|
341
|
+
// }
|
|
342
|
+
//
|
|
343
|
+
const data = this.safeValue(response, 'data', {});
|
|
344
|
+
const timestamp = this.safeInteger(data, 'timestamp');
|
|
345
|
+
return this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks', 'price', 'quantity');
|
|
346
|
+
}
|
|
347
|
+
parseTicker(ticker, market = undefined) {
|
|
348
|
+
//
|
|
349
|
+
// fetchTicker, fetchTickers
|
|
350
|
+
//
|
|
351
|
+
// {
|
|
352
|
+
// "opening_price":"227100",
|
|
353
|
+
// "closing_price":"228400",
|
|
354
|
+
// "min_price":"222300",
|
|
355
|
+
// "max_price":"230000",
|
|
356
|
+
// "units_traded":"82618.56075337",
|
|
357
|
+
// "acc_trade_value":"18767376138.6031",
|
|
358
|
+
// "prev_closing_price":"227100",
|
|
359
|
+
// "units_traded_24H":"151871.13484676",
|
|
360
|
+
// "acc_trade_value_24H":"34247610416.8974",
|
|
361
|
+
// "fluctate_24H":"8700",
|
|
362
|
+
// "fluctate_rate_24H":"3.96",
|
|
363
|
+
// "date":"1587710327264", // fetchTickers inject this
|
|
364
|
+
// }
|
|
365
|
+
//
|
|
366
|
+
const timestamp = this.safeInteger(ticker, 'date');
|
|
367
|
+
const symbol = this.safeSymbol(undefined, market);
|
|
368
|
+
const open = this.safeString(ticker, 'opening_price');
|
|
369
|
+
const close = this.safeString(ticker, 'closing_price');
|
|
370
|
+
const baseVolume = this.safeString(ticker, 'units_traded_24H');
|
|
371
|
+
const quoteVolume = this.safeString(ticker, 'acc_trade_value_24H');
|
|
372
|
+
return this.safeTicker({
|
|
373
|
+
'symbol': symbol,
|
|
374
|
+
'timestamp': timestamp,
|
|
375
|
+
'datetime': this.iso8601(timestamp),
|
|
376
|
+
'high': this.safeString(ticker, 'max_price'),
|
|
377
|
+
'low': this.safeString(ticker, 'min_price'),
|
|
378
|
+
'bid': this.safeString(ticker, 'buy_price'),
|
|
379
|
+
'bidVolume': undefined,
|
|
380
|
+
'ask': this.safeString(ticker, 'sell_price'),
|
|
381
|
+
'askVolume': undefined,
|
|
382
|
+
'vwap': undefined,
|
|
383
|
+
'open': open,
|
|
384
|
+
'close': close,
|
|
385
|
+
'last': close,
|
|
386
|
+
'previousClose': undefined,
|
|
387
|
+
'change': undefined,
|
|
388
|
+
'percentage': undefined,
|
|
389
|
+
'average': undefined,
|
|
390
|
+
'baseVolume': baseVolume,
|
|
391
|
+
'quoteVolume': quoteVolume,
|
|
392
|
+
'info': ticker,
|
|
393
|
+
}, market);
|
|
394
|
+
}
|
|
395
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
396
|
+
/**
|
|
397
|
+
* @method
|
|
398
|
+
* @name bithumb#fetchTickers
|
|
399
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
400
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
401
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
402
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
403
|
+
*/
|
|
404
|
+
await this.loadMarkets();
|
|
405
|
+
const result = {};
|
|
406
|
+
const quoteCurrencies = this.safeValue(this.options, 'quoteCurrencies', {});
|
|
407
|
+
const quotes = Object.keys(quoteCurrencies);
|
|
408
|
+
for (let i = 0; i < quotes.length; i++) {
|
|
409
|
+
const quote = quotes[i];
|
|
410
|
+
const quoteId = quote;
|
|
411
|
+
const request = {
|
|
412
|
+
'quoteId': quoteId,
|
|
413
|
+
};
|
|
414
|
+
const response = await this.publicGetTickerALLQuoteId(this.extend(request, params));
|
|
415
|
+
//
|
|
416
|
+
// {
|
|
417
|
+
// "status":"0000",
|
|
418
|
+
// "data":{
|
|
419
|
+
// "BTC":{
|
|
420
|
+
// "opening_price":"9045000",
|
|
421
|
+
// "closing_price":"9132000",
|
|
422
|
+
// "min_price":"8938000",
|
|
423
|
+
// "max_price":"9168000",
|
|
424
|
+
// "units_traded":"4619.79967497",
|
|
425
|
+
// "acc_trade_value":"42021363832.5187",
|
|
426
|
+
// "prev_closing_price":"9041000",
|
|
427
|
+
// "units_traded_24H":"8793.5045804",
|
|
428
|
+
// "acc_trade_value_24H":"78933458515.4962",
|
|
429
|
+
// "fluctate_24H":"530000",
|
|
430
|
+
// "fluctate_rate_24H":"6.16"
|
|
431
|
+
// },
|
|
432
|
+
// "date":"1587710878669"
|
|
433
|
+
// }
|
|
434
|
+
// }
|
|
435
|
+
//
|
|
436
|
+
const data = this.safeValue(response, 'data', {});
|
|
437
|
+
const timestamp = this.safeInteger(data, 'date');
|
|
438
|
+
const tickers = this.omit(data, 'date');
|
|
439
|
+
const currencyIds = Object.keys(tickers);
|
|
440
|
+
for (let j = 0; j < currencyIds.length; j++) {
|
|
441
|
+
const currencyId = currencyIds[j];
|
|
442
|
+
const ticker = data[currencyId];
|
|
443
|
+
const base = this.safeCurrencyCode(currencyId);
|
|
444
|
+
const symbol = base + '/' + quote;
|
|
445
|
+
const market = this.safeMarket(symbol);
|
|
446
|
+
ticker['date'] = timestamp;
|
|
447
|
+
result[symbol] = this.parseTicker(ticker, market);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return this.filterByArrayTickers(result, 'symbol', symbols);
|
|
451
|
+
}
|
|
452
|
+
async fetchTicker(symbol, params = {}) {
|
|
453
|
+
/**
|
|
454
|
+
* @method
|
|
455
|
+
* @name bithumb#fetchTicker
|
|
456
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
457
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
458
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
459
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
460
|
+
*/
|
|
461
|
+
await this.loadMarkets();
|
|
462
|
+
const market = this.market(symbol);
|
|
463
|
+
const request = {
|
|
464
|
+
'baseId': market['baseId'],
|
|
465
|
+
'quoteId': market['quoteId'],
|
|
466
|
+
};
|
|
467
|
+
const response = await this.publicGetTickerBaseIdQuoteId(this.extend(request, params));
|
|
468
|
+
//
|
|
469
|
+
// {
|
|
470
|
+
// "status":"0000",
|
|
471
|
+
// "data":{
|
|
472
|
+
// "opening_price":"227100",
|
|
473
|
+
// "closing_price":"228400",
|
|
474
|
+
// "min_price":"222300",
|
|
475
|
+
// "max_price":"230000",
|
|
476
|
+
// "units_traded":"82618.56075337",
|
|
477
|
+
// "acc_trade_value":"18767376138.6031",
|
|
478
|
+
// "prev_closing_price":"227100",
|
|
479
|
+
// "units_traded_24H":"151871.13484676",
|
|
480
|
+
// "acc_trade_value_24H":"34247610416.8974",
|
|
481
|
+
// "fluctate_24H":"8700",
|
|
482
|
+
// "fluctate_rate_24H":"3.96",
|
|
483
|
+
// "date":"1587710327264"
|
|
484
|
+
// }
|
|
485
|
+
// }
|
|
486
|
+
//
|
|
487
|
+
const data = this.safeValue(response, 'data', {});
|
|
488
|
+
return this.parseTicker(data, market);
|
|
489
|
+
}
|
|
490
|
+
parseOHLCV(ohlcv, market = undefined) {
|
|
491
|
+
//
|
|
492
|
+
// [
|
|
493
|
+
// 1576823400000, // 기준 시간
|
|
494
|
+
// "8284000", // 시가
|
|
495
|
+
// "8286000", // 종가
|
|
496
|
+
// "8289000", // 고가
|
|
497
|
+
// "8276000", // 저가
|
|
498
|
+
// "15.41503692" // 거래량
|
|
499
|
+
// ]
|
|
500
|
+
//
|
|
501
|
+
return [
|
|
502
|
+
this.safeInteger(ohlcv, 0),
|
|
503
|
+
this.safeNumber(ohlcv, 1),
|
|
504
|
+
this.safeNumber(ohlcv, 3),
|
|
505
|
+
this.safeNumber(ohlcv, 4),
|
|
506
|
+
this.safeNumber(ohlcv, 2),
|
|
507
|
+
this.safeNumber(ohlcv, 5),
|
|
508
|
+
];
|
|
509
|
+
}
|
|
510
|
+
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
511
|
+
/**
|
|
512
|
+
* @method
|
|
513
|
+
* @name bithumb#fetchOHLCV
|
|
514
|
+
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
515
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
516
|
+
* @param {string} timeframe the length of time each candle represents
|
|
517
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
518
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
519
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
520
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
521
|
+
*/
|
|
522
|
+
await this.loadMarkets();
|
|
523
|
+
const market = this.market(symbol);
|
|
524
|
+
const request = {
|
|
525
|
+
'baseId': market['baseId'],
|
|
526
|
+
'quoteId': market['quoteId'],
|
|
527
|
+
'interval': this.safeString(this.timeframes, timeframe, timeframe),
|
|
528
|
+
};
|
|
529
|
+
const response = await this.publicGetCandlestickBaseIdQuoteIdInterval(this.extend(request, params));
|
|
530
|
+
//
|
|
531
|
+
// {
|
|
532
|
+
// "status": "0000",
|
|
533
|
+
// "data": {
|
|
534
|
+
// [
|
|
535
|
+
// 1576823400000, // 기준 시간
|
|
536
|
+
// "8284000", // 시가
|
|
537
|
+
// "8286000", // 종가
|
|
538
|
+
// "8289000", // 고가
|
|
539
|
+
// "8276000", // 저가
|
|
540
|
+
// "15.41503692" // 거래량
|
|
541
|
+
// ],
|
|
542
|
+
// [
|
|
543
|
+
// 1576824000000, // 기준 시간
|
|
544
|
+
// "8284000", // 시가
|
|
545
|
+
// "8281000", // 종가
|
|
546
|
+
// "8289000", // 고가
|
|
547
|
+
// "8275000", // 저가
|
|
548
|
+
// "6.19584467" // 거래량
|
|
549
|
+
// ],
|
|
550
|
+
// }
|
|
551
|
+
// }
|
|
552
|
+
//
|
|
553
|
+
const data = this.safeValue(response, 'data', []);
|
|
554
|
+
return this.parseOHLCVs(data, market, timeframe, since, limit);
|
|
555
|
+
}
|
|
556
|
+
parseTrade(trade, market = undefined) {
|
|
557
|
+
//
|
|
558
|
+
// fetchTrades (public)
|
|
559
|
+
//
|
|
560
|
+
// {
|
|
561
|
+
// "transaction_date":"2020-04-23 22:21:46",
|
|
562
|
+
// "type":"ask",
|
|
563
|
+
// "units_traded":"0.0125",
|
|
564
|
+
// "price":"8667000",
|
|
565
|
+
// "total":"108337"
|
|
566
|
+
// }
|
|
567
|
+
//
|
|
568
|
+
// fetchOrder (private)
|
|
569
|
+
//
|
|
570
|
+
// {
|
|
571
|
+
// "transaction_date": "1572497603902030",
|
|
572
|
+
// "price": "8601000",
|
|
573
|
+
// "units": "0.005",
|
|
574
|
+
// "fee_currency": "KRW",
|
|
575
|
+
// "fee": "107.51",
|
|
576
|
+
// "total": "43005"
|
|
577
|
+
// }
|
|
578
|
+
//
|
|
579
|
+
// a workaround for their bug in date format, hours are not 0-padded
|
|
580
|
+
let timestamp = undefined;
|
|
581
|
+
const transactionDatetime = this.safeString(trade, 'transaction_date');
|
|
582
|
+
if (transactionDatetime !== undefined) {
|
|
583
|
+
const parts = transactionDatetime.split(' ');
|
|
584
|
+
const numParts = parts.length;
|
|
585
|
+
if (numParts > 1) {
|
|
586
|
+
const transactionDate = parts[0];
|
|
587
|
+
let transactionTime = parts[1];
|
|
588
|
+
if (transactionTime.length < 8) {
|
|
589
|
+
transactionTime = '0' + transactionTime;
|
|
590
|
+
}
|
|
591
|
+
timestamp = this.parse8601(transactionDate + ' ' + transactionTime);
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
timestamp = this.safeIntegerProduct(trade, 'transaction_date', 0.001);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
if (timestamp !== undefined) {
|
|
598
|
+
timestamp -= 9 * 3600000; // they report UTC + 9 hours, server in Korean timezone
|
|
599
|
+
}
|
|
600
|
+
const type = undefined;
|
|
601
|
+
let side = this.safeString(trade, 'type');
|
|
602
|
+
side = (side === 'ask') ? 'sell' : 'buy';
|
|
603
|
+
const id = this.safeString(trade, 'cont_no');
|
|
604
|
+
market = this.safeMarket(undefined, market);
|
|
605
|
+
const priceString = this.safeString(trade, 'price');
|
|
606
|
+
const amountString = this.fixCommaNumber(this.safeString2(trade, 'units_traded', 'units'));
|
|
607
|
+
const costString = this.safeString(trade, 'total');
|
|
608
|
+
let fee = undefined;
|
|
609
|
+
const feeCostString = this.safeString(trade, 'fee');
|
|
610
|
+
if (feeCostString !== undefined) {
|
|
611
|
+
const feeCurrencyId = this.safeString(trade, 'fee_currency');
|
|
612
|
+
const feeCurrencyCode = this.commonCurrencyCode(feeCurrencyId);
|
|
613
|
+
fee = {
|
|
614
|
+
'cost': feeCostString,
|
|
615
|
+
'currency': feeCurrencyCode,
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
return this.safeTrade({
|
|
619
|
+
'id': id,
|
|
620
|
+
'info': trade,
|
|
621
|
+
'timestamp': timestamp,
|
|
622
|
+
'datetime': this.iso8601(timestamp),
|
|
623
|
+
'symbol': market['symbol'],
|
|
624
|
+
'order': undefined,
|
|
625
|
+
'type': type,
|
|
626
|
+
'side': side,
|
|
627
|
+
'takerOrMaker': undefined,
|
|
628
|
+
'price': priceString,
|
|
629
|
+
'amount': amountString,
|
|
630
|
+
'cost': costString,
|
|
631
|
+
'fee': fee,
|
|
632
|
+
}, market);
|
|
633
|
+
}
|
|
634
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
635
|
+
/**
|
|
636
|
+
* @method
|
|
637
|
+
* @name bithumb#fetchTrades
|
|
638
|
+
* @description get the list of most recent trades for a particular symbol
|
|
639
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
640
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
641
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
642
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
643
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
644
|
+
*/
|
|
645
|
+
await this.loadMarkets();
|
|
646
|
+
const market = this.market(symbol);
|
|
647
|
+
const request = {
|
|
648
|
+
'baseId': market['baseId'],
|
|
649
|
+
'quoteId': market['quoteId'],
|
|
650
|
+
};
|
|
651
|
+
if (limit !== undefined) {
|
|
652
|
+
request['count'] = limit; // default 20, max 100
|
|
653
|
+
}
|
|
654
|
+
const response = await this.publicGetTransactionHistoryBaseIdQuoteId(this.extend(request, params));
|
|
655
|
+
//
|
|
656
|
+
// {
|
|
657
|
+
// "status":"0000",
|
|
658
|
+
// "data":[
|
|
659
|
+
// {
|
|
660
|
+
// "transaction_date":"2020-04-23 22:21:46",
|
|
661
|
+
// "type":"ask",
|
|
662
|
+
// "units_traded":"0.0125",
|
|
663
|
+
// "price":"8667000",
|
|
664
|
+
// "total":"108337"
|
|
665
|
+
// },
|
|
666
|
+
// ]
|
|
667
|
+
// }
|
|
668
|
+
//
|
|
669
|
+
const data = this.safeValue(response, 'data', []);
|
|
670
|
+
return this.parseTrades(data, market, since, limit);
|
|
671
|
+
}
|
|
672
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
673
|
+
/**
|
|
674
|
+
* @method
|
|
675
|
+
* @name bithumb#createOrder
|
|
676
|
+
* @description create a trade order
|
|
677
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
678
|
+
* @param {string} type 'market' or 'limit'
|
|
679
|
+
* @param {string} side 'buy' or 'sell'
|
|
680
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
681
|
+
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
682
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
683
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
684
|
+
*/
|
|
685
|
+
await this.loadMarkets();
|
|
686
|
+
const market = this.market(symbol);
|
|
687
|
+
const request = {
|
|
688
|
+
'order_currency': market['id'],
|
|
689
|
+
'payment_currency': market['quote'],
|
|
690
|
+
'units': amount,
|
|
691
|
+
};
|
|
692
|
+
let method = 'privatePostTradePlace';
|
|
693
|
+
if (type === 'limit') {
|
|
694
|
+
request['price'] = price;
|
|
695
|
+
request['type'] = (side === 'buy') ? 'bid' : 'ask';
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
method = 'privatePostTradeMarket' + this.capitalize(side);
|
|
699
|
+
}
|
|
700
|
+
const response = await this[method](this.extend(request, params));
|
|
701
|
+
const id = this.safeString(response, 'order_id');
|
|
702
|
+
if (id === undefined) {
|
|
703
|
+
throw new errors.InvalidOrder(this.id + ' createOrder() did not return an order id');
|
|
704
|
+
}
|
|
705
|
+
return this.safeOrder({
|
|
706
|
+
'info': response,
|
|
707
|
+
'symbol': symbol,
|
|
708
|
+
'type': type,
|
|
709
|
+
'side': side,
|
|
710
|
+
'id': id,
|
|
711
|
+
}, market);
|
|
712
|
+
}
|
|
713
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
714
|
+
/**
|
|
715
|
+
* @method
|
|
716
|
+
* @name bithumb#fetchOrder
|
|
717
|
+
* @description fetches information on an order made by the user
|
|
718
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
719
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
720
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
721
|
+
*/
|
|
722
|
+
if (symbol === undefined) {
|
|
723
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
|
|
724
|
+
}
|
|
725
|
+
await this.loadMarkets();
|
|
726
|
+
const market = this.market(symbol);
|
|
727
|
+
const request = {
|
|
728
|
+
'order_id': id,
|
|
729
|
+
'count': 1,
|
|
730
|
+
'order_currency': market['base'],
|
|
731
|
+
'payment_currency': market['quote'],
|
|
732
|
+
};
|
|
733
|
+
const response = await this.privatePostInfoOrderDetail(this.extend(request, params));
|
|
734
|
+
//
|
|
735
|
+
// {
|
|
736
|
+
// "status": "0000",
|
|
737
|
+
// "data": {
|
|
738
|
+
// "order_date": "1603161798539254",
|
|
739
|
+
// "type": "ask",
|
|
740
|
+
// "order_status": "Cancel",
|
|
741
|
+
// "order_currency": "BTC",
|
|
742
|
+
// "payment_currency": "KRW",
|
|
743
|
+
// "watch_price": "0",
|
|
744
|
+
// "order_price": "13344000",
|
|
745
|
+
// "order_qty": "0.0125",
|
|
746
|
+
// "cancel_date": "1603161803809993",
|
|
747
|
+
// "cancel_type": "사용자취소",
|
|
748
|
+
// "contract": [
|
|
749
|
+
// {
|
|
750
|
+
// "transaction_date": "1603161799976383",
|
|
751
|
+
// "price": "13344000",
|
|
752
|
+
// "units": "0.0015",
|
|
753
|
+
// "fee_currency": "KRW",
|
|
754
|
+
// "fee": "0",
|
|
755
|
+
// "total": "20016"
|
|
756
|
+
// }
|
|
757
|
+
// ],
|
|
758
|
+
// }
|
|
759
|
+
// }
|
|
760
|
+
//
|
|
761
|
+
const data = this.safeValue(response, 'data');
|
|
762
|
+
return this.parseOrder(this.extend(data, { 'order_id': id }), market);
|
|
763
|
+
}
|
|
764
|
+
parseOrderStatus(status) {
|
|
765
|
+
const statuses = {
|
|
766
|
+
'Pending': 'open',
|
|
767
|
+
'Completed': 'closed',
|
|
768
|
+
'Cancel': 'canceled',
|
|
769
|
+
};
|
|
770
|
+
return this.safeString(statuses, status, status);
|
|
771
|
+
}
|
|
772
|
+
parseOrder(order, market = undefined) {
|
|
773
|
+
//
|
|
774
|
+
//
|
|
775
|
+
// fetchOrder
|
|
776
|
+
//
|
|
777
|
+
// {
|
|
778
|
+
// "transaction_date": "1572497603668315",
|
|
779
|
+
// "type": "bid",
|
|
780
|
+
// "order_status": "Completed", // Completed, Cancel ...
|
|
781
|
+
// "order_currency": "BTC",
|
|
782
|
+
// "payment_currency": "KRW",
|
|
783
|
+
// "watch_price": "0", // present in Cancel order
|
|
784
|
+
// "order_price": "8601000",
|
|
785
|
+
// "order_qty": "0.007",
|
|
786
|
+
// "cancel_date": "", // filled in Cancel order
|
|
787
|
+
// "cancel_type": "", // filled in Cancel order, i.e. 사용자취소
|
|
788
|
+
// "contract": [
|
|
789
|
+
// {
|
|
790
|
+
// "transaction_date": "1572497603902030",
|
|
791
|
+
// "price": "8601000",
|
|
792
|
+
// "units": "0.005",
|
|
793
|
+
// "fee_currency": "KRW",
|
|
794
|
+
// "fee": "107.51",
|
|
795
|
+
// "total": "43005"
|
|
796
|
+
// },
|
|
797
|
+
// ]
|
|
798
|
+
// }
|
|
799
|
+
//
|
|
800
|
+
// fetchOpenOrders
|
|
801
|
+
//
|
|
802
|
+
// {
|
|
803
|
+
// "order_currency": "BTC",
|
|
804
|
+
// "payment_currency": "KRW",
|
|
805
|
+
// "order_id": "C0101000007408440032",
|
|
806
|
+
// "order_date": "1571728739360570",
|
|
807
|
+
// "type": "bid",
|
|
808
|
+
// "units": "5.0",
|
|
809
|
+
// "units_remaining": "5.0",
|
|
810
|
+
// "price": "501000",
|
|
811
|
+
// }
|
|
812
|
+
//
|
|
813
|
+
const timestamp = this.safeIntegerProduct(order, 'order_date', 0.001);
|
|
814
|
+
const sideProperty = this.safeValue2(order, 'type', 'side');
|
|
815
|
+
const side = (sideProperty === 'bid') ? 'buy' : 'sell';
|
|
816
|
+
const status = this.parseOrderStatus(this.safeString(order, 'order_status'));
|
|
817
|
+
const price = this.safeString2(order, 'order_price', 'price');
|
|
818
|
+
let type = 'limit';
|
|
819
|
+
if (Precise["default"].stringEquals(price, '0')) {
|
|
820
|
+
type = 'market';
|
|
821
|
+
}
|
|
822
|
+
const amount = this.fixCommaNumber(this.safeString2(order, 'order_qty', 'units'));
|
|
823
|
+
let remaining = this.fixCommaNumber(this.safeString(order, 'units_remaining'));
|
|
824
|
+
if (remaining === undefined) {
|
|
825
|
+
if (status === 'closed') {
|
|
826
|
+
remaining = '0';
|
|
827
|
+
}
|
|
828
|
+
else if (status !== 'canceled') {
|
|
829
|
+
remaining = amount;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
let symbol = undefined;
|
|
833
|
+
const baseId = this.safeString(order, 'order_currency');
|
|
834
|
+
const quoteId = this.safeString(order, 'payment_currency');
|
|
835
|
+
const base = this.safeCurrencyCode(baseId);
|
|
836
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
837
|
+
if ((base !== undefined) && (quote !== undefined)) {
|
|
838
|
+
symbol = base + '/' + quote;
|
|
839
|
+
}
|
|
840
|
+
if (symbol === undefined) {
|
|
841
|
+
market = this.safeMarket(undefined, market);
|
|
842
|
+
symbol = market['symbol'];
|
|
843
|
+
}
|
|
844
|
+
const id = this.safeString(order, 'order_id');
|
|
845
|
+
const rawTrades = this.safeValue(order, 'contract', []);
|
|
846
|
+
return this.safeOrder({
|
|
847
|
+
'info': order,
|
|
848
|
+
'id': id,
|
|
849
|
+
'clientOrderId': undefined,
|
|
850
|
+
'timestamp': timestamp,
|
|
851
|
+
'datetime': this.iso8601(timestamp),
|
|
852
|
+
'lastTradeTimestamp': undefined,
|
|
853
|
+
'symbol': symbol,
|
|
854
|
+
'type': type,
|
|
855
|
+
'timeInForce': undefined,
|
|
856
|
+
'postOnly': undefined,
|
|
857
|
+
'side': side,
|
|
858
|
+
'price': price,
|
|
859
|
+
'stopPrice': undefined,
|
|
860
|
+
'triggerPrice': undefined,
|
|
861
|
+
'amount': amount,
|
|
862
|
+
'cost': undefined,
|
|
863
|
+
'average': undefined,
|
|
864
|
+
'filled': undefined,
|
|
865
|
+
'remaining': remaining,
|
|
866
|
+
'status': status,
|
|
867
|
+
'fee': undefined,
|
|
868
|
+
'trades': rawTrades,
|
|
869
|
+
}, market);
|
|
870
|
+
}
|
|
871
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
872
|
+
/**
|
|
873
|
+
* @method
|
|
874
|
+
* @name bithumb#fetchOpenOrders
|
|
875
|
+
* @description fetch all unfilled currently open orders
|
|
876
|
+
* @param {string} symbol unified market symbol
|
|
877
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
878
|
+
* @param {int} [limit] the maximum number of open order structures to retrieve
|
|
879
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
880
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
881
|
+
*/
|
|
882
|
+
if (symbol === undefined) {
|
|
883
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchOpenOrders() requires a symbol argument');
|
|
884
|
+
}
|
|
885
|
+
await this.loadMarkets();
|
|
886
|
+
const market = this.market(symbol);
|
|
887
|
+
if (limit === undefined) {
|
|
888
|
+
limit = 100;
|
|
889
|
+
}
|
|
890
|
+
const request = {
|
|
891
|
+
'count': limit,
|
|
892
|
+
'order_currency': market['base'],
|
|
893
|
+
'payment_currency': market['quote'],
|
|
894
|
+
};
|
|
895
|
+
if (since !== undefined) {
|
|
896
|
+
request['after'] = since;
|
|
897
|
+
}
|
|
898
|
+
const response = await this.privatePostInfoOrders(this.extend(request, params));
|
|
899
|
+
//
|
|
900
|
+
// {
|
|
901
|
+
// "status": "0000",
|
|
902
|
+
// "data": [
|
|
903
|
+
// {
|
|
904
|
+
// "order_currency": "BTC",
|
|
905
|
+
// "payment_currency": "KRW",
|
|
906
|
+
// "order_id": "C0101000007408440032",
|
|
907
|
+
// "order_date": "1571728739360570",
|
|
908
|
+
// "type": "bid",
|
|
909
|
+
// "units": "5.0",
|
|
910
|
+
// "units_remaining": "5.0",
|
|
911
|
+
// "price": "501000",
|
|
912
|
+
// }
|
|
913
|
+
// ]
|
|
914
|
+
// }
|
|
915
|
+
//
|
|
916
|
+
const data = this.safeValue(response, 'data', []);
|
|
917
|
+
return this.parseOrders(data, market, since, limit);
|
|
918
|
+
}
|
|
919
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
920
|
+
/**
|
|
921
|
+
* @method
|
|
922
|
+
* @name bithumb#cancelOrder
|
|
923
|
+
* @description cancels an open order
|
|
924
|
+
* @param {string} id order id
|
|
925
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
926
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
927
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
928
|
+
*/
|
|
929
|
+
if (symbol === undefined) {
|
|
930
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
|
|
931
|
+
}
|
|
932
|
+
const side_in_params = ('side' in params);
|
|
933
|
+
if (!side_in_params) {
|
|
934
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a `side` parameter (sell or buy)');
|
|
935
|
+
}
|
|
936
|
+
const market = this.market(symbol);
|
|
937
|
+
const side = (params['side'] === 'buy') ? 'bid' : 'ask';
|
|
938
|
+
params = this.omit(params, ['side', 'currency']);
|
|
939
|
+
// https://github.com/ccxt/ccxt/issues/6771
|
|
940
|
+
const request = {
|
|
941
|
+
'order_id': id,
|
|
942
|
+
'type': side,
|
|
943
|
+
'order_currency': market['base'],
|
|
944
|
+
'payment_currency': market['quote'],
|
|
945
|
+
};
|
|
946
|
+
return await this.privatePostTradeCancel(this.extend(request, params));
|
|
947
|
+
}
|
|
948
|
+
async cancelUnifiedOrder(order, params = {}) {
|
|
949
|
+
const request = {
|
|
950
|
+
'side': order['side'],
|
|
951
|
+
};
|
|
952
|
+
return await this.cancelOrder(order['id'], order['symbol'], this.extend(request, params));
|
|
953
|
+
}
|
|
954
|
+
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
955
|
+
/**
|
|
956
|
+
* @method
|
|
957
|
+
* @name bithumb#withdraw
|
|
958
|
+
* @description make a withdrawal
|
|
959
|
+
* @param {string} code unified currency code
|
|
960
|
+
* @param {float} amount the amount to withdraw
|
|
961
|
+
* @param {string} address the address to withdraw to
|
|
962
|
+
* @param {string} tag
|
|
963
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
964
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
965
|
+
*/
|
|
966
|
+
[tag, params] = this.handleWithdrawTagAndParams(tag, params);
|
|
967
|
+
this.checkAddress(address);
|
|
968
|
+
await this.loadMarkets();
|
|
969
|
+
const currency = this.currency(code);
|
|
970
|
+
const request = {
|
|
971
|
+
'units': amount,
|
|
972
|
+
'address': address,
|
|
973
|
+
'currency': currency['id'],
|
|
974
|
+
};
|
|
975
|
+
if (code === 'XRP' || code === 'XMR' || code === 'EOS' || code === 'STEEM') {
|
|
976
|
+
const destination = this.safeString(params, 'destination');
|
|
977
|
+
if ((tag === undefined) && (destination === undefined)) {
|
|
978
|
+
throw new errors.ArgumentsRequired(this.id + ' ' + code + ' withdraw() requires a tag argument or an extra destination param');
|
|
979
|
+
}
|
|
980
|
+
else if (tag !== undefined) {
|
|
981
|
+
request['destination'] = tag;
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
const response = await this.privatePostTradeBtcWithdrawal(this.extend(request, params));
|
|
985
|
+
//
|
|
986
|
+
// { "status" : "0000"}
|
|
987
|
+
//
|
|
988
|
+
return this.parseTransaction(response, currency);
|
|
989
|
+
}
|
|
990
|
+
parseTransaction(transaction, currency = undefined) {
|
|
991
|
+
//
|
|
992
|
+
// withdraw
|
|
993
|
+
//
|
|
994
|
+
// { "status" : "0000"}
|
|
995
|
+
//
|
|
996
|
+
currency = this.safeCurrency(undefined, currency);
|
|
997
|
+
return {
|
|
998
|
+
'id': undefined,
|
|
999
|
+
'txid': undefined,
|
|
1000
|
+
'timestamp': undefined,
|
|
1001
|
+
'datetime': undefined,
|
|
1002
|
+
'network': undefined,
|
|
1003
|
+
'addressFrom': undefined,
|
|
1004
|
+
'address': undefined,
|
|
1005
|
+
'addressTo': undefined,
|
|
1006
|
+
'amount': undefined,
|
|
1007
|
+
'type': undefined,
|
|
1008
|
+
'currency': currency['code'],
|
|
1009
|
+
'status': undefined,
|
|
1010
|
+
'updated': undefined,
|
|
1011
|
+
'tagFrom': undefined,
|
|
1012
|
+
'tag': undefined,
|
|
1013
|
+
'tagTo': undefined,
|
|
1014
|
+
'comment': undefined,
|
|
1015
|
+
'internal': undefined,
|
|
1016
|
+
'fee': undefined,
|
|
1017
|
+
'info': transaction,
|
|
1018
|
+
};
|
|
1019
|
+
}
|
|
1020
|
+
fixCommaNumber(numberStr) {
|
|
1021
|
+
// some endpoints need this https://github.com/ccxt/ccxt/issues/11031
|
|
1022
|
+
if (numberStr === undefined) {
|
|
1023
|
+
return undefined;
|
|
1024
|
+
}
|
|
1025
|
+
let finalNumberStr = numberStr;
|
|
1026
|
+
while (finalNumberStr.indexOf(',') > -1) {
|
|
1027
|
+
finalNumberStr = finalNumberStr.replace(',', '');
|
|
1028
|
+
}
|
|
1029
|
+
return finalNumberStr;
|
|
1030
|
+
}
|
|
1031
|
+
nonce() {
|
|
1032
|
+
return this.milliseconds();
|
|
1033
|
+
}
|
|
1034
|
+
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1035
|
+
const endpoint = '/' + this.implodeParams(path, params);
|
|
1036
|
+
let url = this.implodeHostname(this.urls['api'][api]) + endpoint;
|
|
1037
|
+
const query = this.omit(params, this.extractParams(path));
|
|
1038
|
+
if (api === 'public') {
|
|
1039
|
+
if (Object.keys(query).length) {
|
|
1040
|
+
url += '?' + this.urlencode(query);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
else {
|
|
1044
|
+
this.checkRequiredCredentials();
|
|
1045
|
+
body = this.urlencode(this.extend({
|
|
1046
|
+
'endpoint': endpoint,
|
|
1047
|
+
}, query));
|
|
1048
|
+
const nonce = this.nonce().toString();
|
|
1049
|
+
const auth = endpoint + "\0" + body + "\0" + nonce; // eslint-disable-line quotes
|
|
1050
|
+
const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha512.sha512);
|
|
1051
|
+
const signature64 = this.stringToBase64(signature);
|
|
1052
|
+
headers = {
|
|
1053
|
+
'Accept': 'application/json',
|
|
1054
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
1055
|
+
'Api-Key': this.apiKey,
|
|
1056
|
+
'Api-Sign': signature64,
|
|
1057
|
+
'Api-Nonce': nonce,
|
|
1058
|
+
};
|
|
1059
|
+
}
|
|
1060
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
1061
|
+
}
|
|
1062
|
+
handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
1063
|
+
if (response === undefined) {
|
|
1064
|
+
return undefined; // fallback to default error handler
|
|
1065
|
+
}
|
|
1066
|
+
if ('status' in response) {
|
|
1067
|
+
//
|
|
1068
|
+
// {"status":"5100","message":"After May 23th, recent_transactions is no longer, hence users will not be able to connect to recent_transactions"}
|
|
1069
|
+
//
|
|
1070
|
+
const status = this.safeString(response, 'status');
|
|
1071
|
+
const message = this.safeString(response, 'message');
|
|
1072
|
+
if (status !== undefined) {
|
|
1073
|
+
if (status === '0000') {
|
|
1074
|
+
return undefined; // no error
|
|
1075
|
+
}
|
|
1076
|
+
else if (message === '거래 진행중인 내역이 존재하지 않습니다.') {
|
|
1077
|
+
// https://github.com/ccxt/ccxt/issues/9017
|
|
1078
|
+
return undefined; // no error
|
|
1079
|
+
}
|
|
1080
|
+
const feedback = this.id + ' ' + message;
|
|
1081
|
+
this.throwExactlyMatchedException(this.exceptions, status, feedback);
|
|
1082
|
+
this.throwExactlyMatchedException(this.exceptions, message, feedback);
|
|
1083
|
+
throw new errors.ExchangeError(feedback);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return undefined;
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
module.exports = bithumb;
|