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,1069 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var indodax$1 = require('./abstract/indodax.js');
|
|
4
|
+
var errors = require('./base/errors.js');
|
|
5
|
+
var number = require('./base/functions/number.js');
|
|
6
|
+
var sha512 = require('./static_dependencies/noble-hashes/sha512.js');
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* @class indodax
|
|
12
|
+
* @augments Exchange
|
|
13
|
+
*/
|
|
14
|
+
class indodax extends indodax$1 {
|
|
15
|
+
describe() {
|
|
16
|
+
return this.deepExtend(super.describe(), {
|
|
17
|
+
'id': 'indodax',
|
|
18
|
+
'name': 'INDODAX',
|
|
19
|
+
'countries': ['ID'],
|
|
20
|
+
// 10 requests per second for making trades => 1000ms / 10 = 100ms
|
|
21
|
+
// 180 requests per minute (public endpoints) = 2 requests per second => cost = (1000ms / rateLimit) / 2 = 5
|
|
22
|
+
'rateLimit': 100,
|
|
23
|
+
'has': {
|
|
24
|
+
'CORS': undefined,
|
|
25
|
+
'spot': true,
|
|
26
|
+
'margin': false,
|
|
27
|
+
'swap': false,
|
|
28
|
+
'future': false,
|
|
29
|
+
'option': false,
|
|
30
|
+
'addMargin': false,
|
|
31
|
+
'cancelAllOrders': false,
|
|
32
|
+
'cancelOrder': true,
|
|
33
|
+
'cancelOrders': false,
|
|
34
|
+
'closeAllPositions': false,
|
|
35
|
+
'closePosition': false,
|
|
36
|
+
'createDepositAddress': false,
|
|
37
|
+
'createOrder': true,
|
|
38
|
+
'createReduceOnlyOrder': false,
|
|
39
|
+
'createStopLimitOrder': false,
|
|
40
|
+
'createStopMarketOrder': false,
|
|
41
|
+
'createStopOrder': false,
|
|
42
|
+
'fetchBalance': true,
|
|
43
|
+
'fetchBorrowRateHistories': false,
|
|
44
|
+
'fetchBorrowRateHistory': false,
|
|
45
|
+
'fetchClosedOrders': true,
|
|
46
|
+
'fetchCrossBorrowRate': false,
|
|
47
|
+
'fetchCrossBorrowRates': false,
|
|
48
|
+
'fetchDeposit': false,
|
|
49
|
+
'fetchDeposits': false,
|
|
50
|
+
'fetchDepositsWithdrawals': true,
|
|
51
|
+
'fetchFundingHistory': false,
|
|
52
|
+
'fetchFundingRate': false,
|
|
53
|
+
'fetchFundingRateHistory': false,
|
|
54
|
+
'fetchFundingRates': false,
|
|
55
|
+
'fetchIndexOHLCV': false,
|
|
56
|
+
'fetchIsolatedBorrowRate': false,
|
|
57
|
+
'fetchIsolatedBorrowRates': false,
|
|
58
|
+
'fetchLeverage': false,
|
|
59
|
+
'fetchLeverageTiers': false,
|
|
60
|
+
'fetchMarginMode': false,
|
|
61
|
+
'fetchMarkets': true,
|
|
62
|
+
'fetchMarkOHLCV': false,
|
|
63
|
+
'fetchOpenInterestHistory': false,
|
|
64
|
+
'fetchOpenOrders': true,
|
|
65
|
+
'fetchOrder': true,
|
|
66
|
+
'fetchOrderBook': true,
|
|
67
|
+
'fetchOrders': false,
|
|
68
|
+
'fetchPosition': false,
|
|
69
|
+
'fetchPositionMode': false,
|
|
70
|
+
'fetchPositions': false,
|
|
71
|
+
'fetchPositionsRisk': false,
|
|
72
|
+
'fetchPremiumIndexOHLCV': false,
|
|
73
|
+
'fetchTicker': true,
|
|
74
|
+
'fetchTime': true,
|
|
75
|
+
'fetchTrades': true,
|
|
76
|
+
'fetchTradingFee': false,
|
|
77
|
+
'fetchTradingFees': false,
|
|
78
|
+
'fetchTransactionFee': true,
|
|
79
|
+
'fetchTransactionFees': false,
|
|
80
|
+
'fetchTransactions': 'emulated',
|
|
81
|
+
'fetchTransfer': false,
|
|
82
|
+
'fetchTransfers': false,
|
|
83
|
+
'fetchWithdrawal': false,
|
|
84
|
+
'fetchWithdrawals': false,
|
|
85
|
+
'reduceMargin': false,
|
|
86
|
+
'setLeverage': false,
|
|
87
|
+
'setMargin': false,
|
|
88
|
+
'setMarginMode': false,
|
|
89
|
+
'setPositionMode': false,
|
|
90
|
+
'transfer': false,
|
|
91
|
+
'withdraw': true,
|
|
92
|
+
},
|
|
93
|
+
'version': '2.0',
|
|
94
|
+
'urls': {
|
|
95
|
+
'logo': 'https://user-images.githubusercontent.com/51840849/87070508-9358c880-c221-11ea-8dc5-5391afbbb422.jpg',
|
|
96
|
+
'api': {
|
|
97
|
+
'public': 'https://indodax.com/api',
|
|
98
|
+
'private': 'https://indodax.com/tapi',
|
|
99
|
+
},
|
|
100
|
+
'www': 'https://www.indodax.com',
|
|
101
|
+
'doc': 'https://github.com/btcid/indodax-official-api-docs',
|
|
102
|
+
'referral': 'https://indodax.com/ref/testbitcoincoid/1',
|
|
103
|
+
},
|
|
104
|
+
'api': {
|
|
105
|
+
'public': {
|
|
106
|
+
'get': {
|
|
107
|
+
'server_time': 5,
|
|
108
|
+
'pairs': 5,
|
|
109
|
+
'price_increments': 5,
|
|
110
|
+
'summaries': 5,
|
|
111
|
+
'ticker_all': 5,
|
|
112
|
+
'{pair}/ticker': 5,
|
|
113
|
+
'{pair}/trades': 5,
|
|
114
|
+
'{pair}/depth': 5,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
'private': {
|
|
118
|
+
'post': {
|
|
119
|
+
'getInfo': 4,
|
|
120
|
+
'transHistory': 4,
|
|
121
|
+
'trade': 1,
|
|
122
|
+
'tradeHistory': 4,
|
|
123
|
+
'openOrders': 4,
|
|
124
|
+
'orderHistory': 4,
|
|
125
|
+
'getOrder': 4,
|
|
126
|
+
'cancelOrder': 4,
|
|
127
|
+
'withdrawFee': 4,
|
|
128
|
+
'withdrawCoin': 4,
|
|
129
|
+
'listDownline': 4,
|
|
130
|
+
'checkDownline': 4,
|
|
131
|
+
'createVoucher': 4, // partner only
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
'fees': {
|
|
136
|
+
'trading': {
|
|
137
|
+
'tierBased': false,
|
|
138
|
+
'percentage': true,
|
|
139
|
+
'maker': 0,
|
|
140
|
+
'taker': 0.003,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
'exceptions': {
|
|
144
|
+
'exact': {
|
|
145
|
+
'invalid_pair': errors.BadSymbol,
|
|
146
|
+
'Insufficient balance.': errors.InsufficientFunds,
|
|
147
|
+
'invalid order.': errors.OrderNotFound,
|
|
148
|
+
'Invalid credentials. API not found or session has expired.': errors.AuthenticationError,
|
|
149
|
+
'Invalid credentials. Bad sign.': errors.AuthenticationError,
|
|
150
|
+
},
|
|
151
|
+
'broad': {
|
|
152
|
+
'Minimum price': errors.InvalidOrder,
|
|
153
|
+
'Minimum order': errors.InvalidOrder,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
// exchange-specific options
|
|
157
|
+
'options': {
|
|
158
|
+
'recvWindow': 5 * 1000,
|
|
159
|
+
'timeDifference': 0,
|
|
160
|
+
'adjustForTimeDifference': false, // controls the adjustment logic upon instantiation
|
|
161
|
+
},
|
|
162
|
+
'commonCurrencies': {
|
|
163
|
+
'STR': 'XLM',
|
|
164
|
+
'BCHABC': 'BCH',
|
|
165
|
+
'BCHSV': 'BSV',
|
|
166
|
+
'DRK': 'DASH',
|
|
167
|
+
'NEM': 'XEM',
|
|
168
|
+
},
|
|
169
|
+
'precisionMode': number.TICK_SIZE,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
nonce() {
|
|
173
|
+
return this.milliseconds() - this.options['timeDifference'];
|
|
174
|
+
}
|
|
175
|
+
async fetchTime(params = {}) {
|
|
176
|
+
/**
|
|
177
|
+
* @method
|
|
178
|
+
* @name indodax#fetchTime
|
|
179
|
+
* @description fetches the current integer timestamp in milliseconds from the exchange server
|
|
180
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
181
|
+
* @returns {int} the current integer timestamp in milliseconds from the exchange server
|
|
182
|
+
*/
|
|
183
|
+
const response = await this.publicGetServerTime(params);
|
|
184
|
+
//
|
|
185
|
+
// {
|
|
186
|
+
// "timezone": "UTC",
|
|
187
|
+
// "server_time": 1571205969552
|
|
188
|
+
// }
|
|
189
|
+
//
|
|
190
|
+
return this.safeInteger(response, 'server_time');
|
|
191
|
+
}
|
|
192
|
+
async fetchMarkets(params = {}) {
|
|
193
|
+
/**
|
|
194
|
+
* @method
|
|
195
|
+
* @name indodax#fetchMarkets
|
|
196
|
+
* @description retrieves data on all markets for indodax
|
|
197
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
198
|
+
* @returns {object[]} an array of objects representing market data
|
|
199
|
+
*/
|
|
200
|
+
const response = await this.publicGetPairs(params);
|
|
201
|
+
//
|
|
202
|
+
// [
|
|
203
|
+
// {
|
|
204
|
+
// "id": "btcidr",
|
|
205
|
+
// "symbol": "BTCIDR",
|
|
206
|
+
// "base_currency": "idr",
|
|
207
|
+
// "traded_currency": "btc",
|
|
208
|
+
// "traded_currency_unit": "BTC",
|
|
209
|
+
// "description": "BTC/IDR",
|
|
210
|
+
// "ticker_id": "btc_idr",
|
|
211
|
+
// "volume_precision": 0,
|
|
212
|
+
// "price_precision": 1000,
|
|
213
|
+
// "price_round": 8,
|
|
214
|
+
// "pricescale": 1000,
|
|
215
|
+
// "trade_min_base_currency": 10000,
|
|
216
|
+
// "trade_min_traded_currency": 0.00007457,
|
|
217
|
+
// "has_memo": false,
|
|
218
|
+
// "memo_name": false,
|
|
219
|
+
// "has_payment_id": false,
|
|
220
|
+
// "trade_fee_percent": 0.3,
|
|
221
|
+
// "url_logo": "https://indodax.com/v2/logo/svg/color/btc.svg",
|
|
222
|
+
// "url_logo_png": "https://indodax.com/v2/logo/png/color/btc.png",
|
|
223
|
+
// "is_maintenance": 0
|
|
224
|
+
// }
|
|
225
|
+
// ]
|
|
226
|
+
//
|
|
227
|
+
const result = [];
|
|
228
|
+
for (let i = 0; i < response.length; i++) {
|
|
229
|
+
const market = response[i];
|
|
230
|
+
const id = this.safeString(market, 'ticker_id');
|
|
231
|
+
const baseId = this.safeString(market, 'traded_currency');
|
|
232
|
+
const quoteId = this.safeString(market, 'base_currency');
|
|
233
|
+
const base = this.safeCurrencyCode(baseId);
|
|
234
|
+
const quote = this.safeCurrencyCode(quoteId);
|
|
235
|
+
const isMaintenance = this.safeInteger(market, 'is_maintenance');
|
|
236
|
+
result.push({
|
|
237
|
+
'id': id,
|
|
238
|
+
'symbol': base + '/' + quote,
|
|
239
|
+
'base': base,
|
|
240
|
+
'quote': quote,
|
|
241
|
+
'settle': undefined,
|
|
242
|
+
'baseId': baseId,
|
|
243
|
+
'quoteId': quoteId,
|
|
244
|
+
'settleId': undefined,
|
|
245
|
+
'type': 'spot',
|
|
246
|
+
'spot': true,
|
|
247
|
+
'margin': false,
|
|
248
|
+
'swap': false,
|
|
249
|
+
'future': false,
|
|
250
|
+
'option': false,
|
|
251
|
+
'active': isMaintenance ? false : true,
|
|
252
|
+
'contract': false,
|
|
253
|
+
'linear': undefined,
|
|
254
|
+
'inverse': undefined,
|
|
255
|
+
'taker': this.safeNumber(market, 'trade_fee_percent'),
|
|
256
|
+
'contractSize': undefined,
|
|
257
|
+
'expiry': undefined,
|
|
258
|
+
'expiryDatetime': undefined,
|
|
259
|
+
'strike': undefined,
|
|
260
|
+
'optionType': undefined,
|
|
261
|
+
'percentage': true,
|
|
262
|
+
'precision': {
|
|
263
|
+
'amount': this.parseNumber('1e-8'),
|
|
264
|
+
'price': this.parseNumber(this.parsePrecision(this.safeString(market, 'price_round'))),
|
|
265
|
+
'cost': this.parseNumber(this.parsePrecision(this.safeString(market, 'volume_precision'))),
|
|
266
|
+
},
|
|
267
|
+
'limits': {
|
|
268
|
+
'leverage': {
|
|
269
|
+
'min': undefined,
|
|
270
|
+
'max': undefined,
|
|
271
|
+
},
|
|
272
|
+
'amount': {
|
|
273
|
+
'min': this.safeNumber(market, 'trade_min_traded_currency'),
|
|
274
|
+
'max': undefined,
|
|
275
|
+
},
|
|
276
|
+
'price': {
|
|
277
|
+
'min': this.safeNumber(market, 'trade_min_base_currency'),
|
|
278
|
+
'max': undefined,
|
|
279
|
+
},
|
|
280
|
+
'cost': {
|
|
281
|
+
'min': undefined,
|
|
282
|
+
'max': undefined,
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
'created': undefined,
|
|
286
|
+
'info': market,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
parseBalance(response) {
|
|
292
|
+
const balances = this.safeValue(response, 'return', {});
|
|
293
|
+
const free = this.safeValue(balances, 'balance', {});
|
|
294
|
+
const used = this.safeValue(balances, 'balance_hold', {});
|
|
295
|
+
const timestamp = this.safeTimestamp(balances, 'server_time');
|
|
296
|
+
const result = {
|
|
297
|
+
'info': response,
|
|
298
|
+
'timestamp': timestamp,
|
|
299
|
+
'datetime': this.iso8601(timestamp),
|
|
300
|
+
};
|
|
301
|
+
const currencyIds = Object.keys(free);
|
|
302
|
+
for (let i = 0; i < currencyIds.length; i++) {
|
|
303
|
+
const currencyId = currencyIds[i];
|
|
304
|
+
const code = this.safeCurrencyCode(currencyId);
|
|
305
|
+
const account = this.account();
|
|
306
|
+
account['free'] = this.safeString(free, currencyId);
|
|
307
|
+
account['used'] = this.safeString(used, currencyId);
|
|
308
|
+
result[code] = account;
|
|
309
|
+
}
|
|
310
|
+
return this.safeBalance(result);
|
|
311
|
+
}
|
|
312
|
+
async fetchBalance(params = {}) {
|
|
313
|
+
/**
|
|
314
|
+
* @method
|
|
315
|
+
* @name indodax#fetchBalance
|
|
316
|
+
* @description query for balance and get the amount of funds available for trading or funds locked in orders
|
|
317
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
318
|
+
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
|
|
319
|
+
*/
|
|
320
|
+
await this.loadMarkets();
|
|
321
|
+
const response = await this.privatePostGetInfo(params);
|
|
322
|
+
//
|
|
323
|
+
// {
|
|
324
|
+
// "success":1,
|
|
325
|
+
// "return":{
|
|
326
|
+
// "server_time":1619562628,
|
|
327
|
+
// "balance":{
|
|
328
|
+
// "idr":167,
|
|
329
|
+
// "btc":"0.00000000",
|
|
330
|
+
// "1inch":"0.00000000",
|
|
331
|
+
// },
|
|
332
|
+
// "balance_hold":{
|
|
333
|
+
// "idr":0,
|
|
334
|
+
// "btc":"0.00000000",
|
|
335
|
+
// "1inch":"0.00000000",
|
|
336
|
+
// },
|
|
337
|
+
// "address":{
|
|
338
|
+
// "btc":"1KMntgzvU7iTSgMBWc11nVuJjAyfW3qJyk",
|
|
339
|
+
// "1inch":"0x1106c8bb3172625e1f411c221be49161dac19355",
|
|
340
|
+
// "xrp":"rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
|
|
341
|
+
// "zrx":"0x1106c8bb3172625e1f411c221be49161dac19355"
|
|
342
|
+
// },
|
|
343
|
+
// "user_id":"276011",
|
|
344
|
+
// "name":"",
|
|
345
|
+
// "email":"testbitcoincoid@mailforspam.com",
|
|
346
|
+
// "profile_picture":null,
|
|
347
|
+
// "verification_status":"unverified",
|
|
348
|
+
// "gauth_enable":true
|
|
349
|
+
// }
|
|
350
|
+
// }
|
|
351
|
+
//
|
|
352
|
+
return this.parseBalance(response);
|
|
353
|
+
}
|
|
354
|
+
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
355
|
+
/**
|
|
356
|
+
* @method
|
|
357
|
+
* @name indodax#fetchOrderBook
|
|
358
|
+
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
359
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
360
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
361
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
362
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
363
|
+
*/
|
|
364
|
+
await this.loadMarkets();
|
|
365
|
+
const market = this.market(symbol);
|
|
366
|
+
const request = {
|
|
367
|
+
'pair': market['id'],
|
|
368
|
+
};
|
|
369
|
+
const orderbook = await this.publicGetPairDepth(this.extend(request, params));
|
|
370
|
+
return this.parseOrderBook(orderbook, market['symbol'], undefined, 'buy', 'sell');
|
|
371
|
+
}
|
|
372
|
+
parseTicker(ticker, market = undefined) {
|
|
373
|
+
//
|
|
374
|
+
// {
|
|
375
|
+
// "high":"0.01951",
|
|
376
|
+
// "low":"0.01877",
|
|
377
|
+
// "vol_eth":"39.38839319",
|
|
378
|
+
// "vol_btc":"0.75320886",
|
|
379
|
+
// "last":"0.01896",
|
|
380
|
+
// "buy":"0.01896",
|
|
381
|
+
// "sell":"0.019",
|
|
382
|
+
// "server_time":1565248908
|
|
383
|
+
// }
|
|
384
|
+
//
|
|
385
|
+
const symbol = this.safeSymbol(undefined, market);
|
|
386
|
+
const timestamp = this.safeTimestamp(ticker, 'server_time');
|
|
387
|
+
const baseVolume = 'vol_' + market['baseId'].toLowerCase();
|
|
388
|
+
const quoteVolume = 'vol_' + market['quoteId'].toLowerCase();
|
|
389
|
+
const last = this.safeString(ticker, 'last');
|
|
390
|
+
return this.safeTicker({
|
|
391
|
+
'symbol': symbol,
|
|
392
|
+
'timestamp': timestamp,
|
|
393
|
+
'datetime': this.iso8601(timestamp),
|
|
394
|
+
'high': this.safeString(ticker, 'high'),
|
|
395
|
+
'low': this.safeString(ticker, 'low'),
|
|
396
|
+
'bid': this.safeString(ticker, 'buy'),
|
|
397
|
+
'bidVolume': undefined,
|
|
398
|
+
'ask': this.safeString(ticker, 'sell'),
|
|
399
|
+
'askVolume': undefined,
|
|
400
|
+
'vwap': undefined,
|
|
401
|
+
'open': undefined,
|
|
402
|
+
'close': last,
|
|
403
|
+
'last': last,
|
|
404
|
+
'previousClose': undefined,
|
|
405
|
+
'change': undefined,
|
|
406
|
+
'percentage': undefined,
|
|
407
|
+
'average': undefined,
|
|
408
|
+
'baseVolume': this.safeString(ticker, baseVolume),
|
|
409
|
+
'quoteVolume': this.safeString(ticker, quoteVolume),
|
|
410
|
+
'info': ticker,
|
|
411
|
+
}, market);
|
|
412
|
+
}
|
|
413
|
+
async fetchTicker(symbol, params = {}) {
|
|
414
|
+
/**
|
|
415
|
+
* @method
|
|
416
|
+
* @name indodax#fetchTicker
|
|
417
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
418
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
419
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
420
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
421
|
+
*/
|
|
422
|
+
await this.loadMarkets();
|
|
423
|
+
const market = this.market(symbol);
|
|
424
|
+
const request = {
|
|
425
|
+
'pair': market['id'],
|
|
426
|
+
};
|
|
427
|
+
const response = await this.publicGetPairTicker(this.extend(request, params));
|
|
428
|
+
//
|
|
429
|
+
// {
|
|
430
|
+
// "ticker": {
|
|
431
|
+
// "high":"0.01951",
|
|
432
|
+
// "low":"0.01877",
|
|
433
|
+
// "vol_eth":"39.38839319",
|
|
434
|
+
// "vol_btc":"0.75320886",
|
|
435
|
+
// "last":"0.01896",
|
|
436
|
+
// "buy":"0.01896",
|
|
437
|
+
// "sell":"0.019",
|
|
438
|
+
// "server_time":1565248908
|
|
439
|
+
// }
|
|
440
|
+
// }
|
|
441
|
+
//
|
|
442
|
+
const ticker = this.safeValue(response, 'ticker', {});
|
|
443
|
+
return this.parseTicker(ticker, market);
|
|
444
|
+
}
|
|
445
|
+
async fetchTickers(symbols = undefined, params = {}) {
|
|
446
|
+
/**
|
|
447
|
+
* @method
|
|
448
|
+
* @name indodax#fetchTickers
|
|
449
|
+
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
|
450
|
+
* @see https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker-all
|
|
451
|
+
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
|
452
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
453
|
+
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
454
|
+
*/
|
|
455
|
+
await this.loadMarkets();
|
|
456
|
+
//
|
|
457
|
+
// {
|
|
458
|
+
// "tickers": {
|
|
459
|
+
// "btc_idr": {
|
|
460
|
+
// "high": "120009000",
|
|
461
|
+
// "low": "116735000",
|
|
462
|
+
// "vol_btc": "218.13777777",
|
|
463
|
+
// "vol_idr": "25800033297",
|
|
464
|
+
// "last": "117088000",
|
|
465
|
+
// "buy": "117002000",
|
|
466
|
+
// "sell": "117078000",
|
|
467
|
+
// "server_time": 1571207881
|
|
468
|
+
// }
|
|
469
|
+
// }
|
|
470
|
+
// }
|
|
471
|
+
//
|
|
472
|
+
const response = await this.publicGetTickerAll(params);
|
|
473
|
+
const tickers = this.safeValue(response, 'tickers');
|
|
474
|
+
return this.parseTickers(tickers, symbols);
|
|
475
|
+
}
|
|
476
|
+
parseTrade(trade, market = undefined) {
|
|
477
|
+
const timestamp = this.safeTimestamp(trade, 'date');
|
|
478
|
+
return this.safeTrade({
|
|
479
|
+
'id': this.safeString(trade, 'tid'),
|
|
480
|
+
'info': trade,
|
|
481
|
+
'timestamp': timestamp,
|
|
482
|
+
'datetime': this.iso8601(timestamp),
|
|
483
|
+
'symbol': this.safeSymbol(undefined, market),
|
|
484
|
+
'type': undefined,
|
|
485
|
+
'side': this.safeString(trade, 'type'),
|
|
486
|
+
'order': undefined,
|
|
487
|
+
'takerOrMaker': undefined,
|
|
488
|
+
'price': this.safeString(trade, 'price'),
|
|
489
|
+
'amount': this.safeString(trade, 'amount'),
|
|
490
|
+
'cost': undefined,
|
|
491
|
+
'fee': undefined,
|
|
492
|
+
}, market);
|
|
493
|
+
}
|
|
494
|
+
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
495
|
+
/**
|
|
496
|
+
* @method
|
|
497
|
+
* @name indodax#fetchTrades
|
|
498
|
+
* @description get the list of most recent trades for a particular symbol
|
|
499
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
500
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
501
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
502
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
503
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
504
|
+
*/
|
|
505
|
+
await this.loadMarkets();
|
|
506
|
+
const market = this.market(symbol);
|
|
507
|
+
const request = {
|
|
508
|
+
'pair': market['id'],
|
|
509
|
+
};
|
|
510
|
+
const response = await this.publicGetPairTrades(this.extend(request, params));
|
|
511
|
+
return this.parseTrades(response, market, since, limit);
|
|
512
|
+
}
|
|
513
|
+
parseOrderStatus(status) {
|
|
514
|
+
const statuses = {
|
|
515
|
+
'open': 'open',
|
|
516
|
+
'filled': 'closed',
|
|
517
|
+
'cancelled': 'canceled',
|
|
518
|
+
};
|
|
519
|
+
return this.safeString(statuses, status, status);
|
|
520
|
+
}
|
|
521
|
+
parseOrder(order, market = undefined) {
|
|
522
|
+
//
|
|
523
|
+
// {
|
|
524
|
+
// "order_id": "12345",
|
|
525
|
+
// "submit_time": "1392228122",
|
|
526
|
+
// "price": "8000000",
|
|
527
|
+
// "type": "sell",
|
|
528
|
+
// "order_ltc": "100000000",
|
|
529
|
+
// "remain_ltc": "100000000"
|
|
530
|
+
// }
|
|
531
|
+
//
|
|
532
|
+
// market closed orders - note that the price is very high
|
|
533
|
+
// and does not reflect actual price the order executed at
|
|
534
|
+
//
|
|
535
|
+
// {
|
|
536
|
+
// "order_id": "49326856",
|
|
537
|
+
// "type": "sell",
|
|
538
|
+
// "price": "1000000000",
|
|
539
|
+
// "submit_time": "1618314671",
|
|
540
|
+
// "finish_time": "1618314671",
|
|
541
|
+
// "status": "filled",
|
|
542
|
+
// "order_xrp": "30.45000000",
|
|
543
|
+
// "remain_xrp": "0.00000000"
|
|
544
|
+
// }
|
|
545
|
+
let side = undefined;
|
|
546
|
+
if ('type' in order) {
|
|
547
|
+
side = order['type'];
|
|
548
|
+
}
|
|
549
|
+
const status = this.parseOrderStatus(this.safeString(order, 'status', 'open'));
|
|
550
|
+
let symbol = undefined;
|
|
551
|
+
let cost = undefined;
|
|
552
|
+
const price = this.safeString(order, 'price');
|
|
553
|
+
let amount = undefined;
|
|
554
|
+
let remaining = undefined;
|
|
555
|
+
if (market !== undefined) {
|
|
556
|
+
symbol = market['symbol'];
|
|
557
|
+
let quoteId = market['quoteId'];
|
|
558
|
+
let baseId = market['baseId'];
|
|
559
|
+
if ((market['quoteId'] === 'idr') && ('order_rp' in order)) {
|
|
560
|
+
quoteId = 'rp';
|
|
561
|
+
}
|
|
562
|
+
if ((market['baseId'] === 'idr') && ('remain_rp' in order)) {
|
|
563
|
+
baseId = 'rp';
|
|
564
|
+
}
|
|
565
|
+
cost = this.safeString(order, 'order_' + quoteId);
|
|
566
|
+
if (!cost) {
|
|
567
|
+
amount = this.safeString(order, 'order_' + baseId);
|
|
568
|
+
remaining = this.safeString(order, 'remain_' + baseId);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
const timestamp = this.safeInteger(order, 'submit_time');
|
|
572
|
+
const fee = undefined;
|
|
573
|
+
const id = this.safeString(order, 'order_id');
|
|
574
|
+
return this.safeOrder({
|
|
575
|
+
'info': order,
|
|
576
|
+
'id': id,
|
|
577
|
+
'clientOrderId': undefined,
|
|
578
|
+
'timestamp': timestamp,
|
|
579
|
+
'datetime': this.iso8601(timestamp),
|
|
580
|
+
'lastTradeTimestamp': undefined,
|
|
581
|
+
'symbol': symbol,
|
|
582
|
+
'type': 'limit',
|
|
583
|
+
'timeInForce': undefined,
|
|
584
|
+
'postOnly': undefined,
|
|
585
|
+
'side': side,
|
|
586
|
+
'price': price,
|
|
587
|
+
'stopPrice': undefined,
|
|
588
|
+
'triggerPrice': undefined,
|
|
589
|
+
'cost': cost,
|
|
590
|
+
'average': undefined,
|
|
591
|
+
'amount': amount,
|
|
592
|
+
'filled': undefined,
|
|
593
|
+
'remaining': remaining,
|
|
594
|
+
'status': status,
|
|
595
|
+
'fee': fee,
|
|
596
|
+
'trades': undefined,
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
600
|
+
/**
|
|
601
|
+
* @method
|
|
602
|
+
* @name indodax#fetchOrder
|
|
603
|
+
* @description fetches information on an order made by the user
|
|
604
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
605
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
606
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
607
|
+
*/
|
|
608
|
+
if (symbol === undefined) {
|
|
609
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
|
|
610
|
+
}
|
|
611
|
+
await this.loadMarkets();
|
|
612
|
+
const market = this.market(symbol);
|
|
613
|
+
const request = {
|
|
614
|
+
'pair': market['id'],
|
|
615
|
+
'order_id': id,
|
|
616
|
+
};
|
|
617
|
+
const response = await this.privatePostGetOrder(this.extend(request, params));
|
|
618
|
+
const orders = response['return'];
|
|
619
|
+
const order = this.parseOrder(this.extend({ 'id': id }, orders['order']), market);
|
|
620
|
+
order['info'] = response;
|
|
621
|
+
return order;
|
|
622
|
+
}
|
|
623
|
+
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
624
|
+
/**
|
|
625
|
+
* @method
|
|
626
|
+
* @name indodax#fetchOpenOrders
|
|
627
|
+
* @description fetch all unfilled currently open orders
|
|
628
|
+
* @param {string} symbol unified market symbol
|
|
629
|
+
* @param {int} [since] the earliest time in ms to fetch open orders for
|
|
630
|
+
* @param {int} [limit] the maximum number of open orders structures to retrieve
|
|
631
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
632
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
633
|
+
*/
|
|
634
|
+
await this.loadMarkets();
|
|
635
|
+
let market = undefined;
|
|
636
|
+
const request = {};
|
|
637
|
+
if (symbol !== undefined) {
|
|
638
|
+
market = this.market(symbol);
|
|
639
|
+
request['pair'] = market['id'];
|
|
640
|
+
}
|
|
641
|
+
const response = await this.privatePostOpenOrders(this.extend(request, params));
|
|
642
|
+
const rawOrders = response['return']['orders'];
|
|
643
|
+
// { success: 1, return: { orders: null }} if no orders
|
|
644
|
+
if (!rawOrders) {
|
|
645
|
+
return [];
|
|
646
|
+
}
|
|
647
|
+
// { success: 1, return: { orders: [ ... objects ] }} for orders fetched by symbol
|
|
648
|
+
if (symbol !== undefined) {
|
|
649
|
+
return this.parseOrders(rawOrders, market, since, limit);
|
|
650
|
+
}
|
|
651
|
+
// { success: 1, return: { orders: { marketid: [ ... objects ] }}} if all orders are fetched
|
|
652
|
+
const marketIds = Object.keys(rawOrders);
|
|
653
|
+
let exchangeOrders = [];
|
|
654
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
655
|
+
const marketId = marketIds[i];
|
|
656
|
+
const marketOrders = rawOrders[marketId];
|
|
657
|
+
market = this.safeMarket(marketId);
|
|
658
|
+
const parsedOrders = this.parseOrders(marketOrders, market, since, limit);
|
|
659
|
+
exchangeOrders = this.arrayConcat(exchangeOrders, parsedOrders);
|
|
660
|
+
}
|
|
661
|
+
return exchangeOrders;
|
|
662
|
+
}
|
|
663
|
+
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
664
|
+
/**
|
|
665
|
+
* @method
|
|
666
|
+
* @name indodax#fetchClosedOrders
|
|
667
|
+
* @description fetches information on multiple closed orders made by the user
|
|
668
|
+
* @param {string} symbol unified market symbol of the market orders were made in
|
|
669
|
+
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
670
|
+
* @param {int} [limit] the maximum number of order structures to retrieve
|
|
671
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
672
|
+
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
673
|
+
*/
|
|
674
|
+
if (symbol === undefined) {
|
|
675
|
+
throw new errors.ArgumentsRequired(this.id + ' fetchClosedOrders() requires a symbol argument');
|
|
676
|
+
}
|
|
677
|
+
await this.loadMarkets();
|
|
678
|
+
const market = this.market(symbol);
|
|
679
|
+
const request = {
|
|
680
|
+
'pair': market['id'],
|
|
681
|
+
};
|
|
682
|
+
const response = await this.privatePostOrderHistory(this.extend(request, params));
|
|
683
|
+
let orders = this.parseOrders(response['return']['orders'], market);
|
|
684
|
+
orders = this.filterBy(orders, 'status', 'closed');
|
|
685
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit);
|
|
686
|
+
}
|
|
687
|
+
async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
|
|
688
|
+
/**
|
|
689
|
+
* @method
|
|
690
|
+
* @name indodax#createOrder
|
|
691
|
+
* @description create a trade order
|
|
692
|
+
* @param {string} symbol unified symbol of the market to create an order in
|
|
693
|
+
* @param {string} type 'market' or 'limit'
|
|
694
|
+
* @param {string} side 'buy' or 'sell'
|
|
695
|
+
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
696
|
+
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
697
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
698
|
+
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
699
|
+
*/
|
|
700
|
+
if (type !== 'limit') {
|
|
701
|
+
throw new errors.ExchangeError(this.id + ' createOrder() allows limit orders only');
|
|
702
|
+
}
|
|
703
|
+
await this.loadMarkets();
|
|
704
|
+
const market = this.market(symbol);
|
|
705
|
+
const request = {
|
|
706
|
+
'pair': market['id'],
|
|
707
|
+
'type': side,
|
|
708
|
+
'price': price,
|
|
709
|
+
};
|
|
710
|
+
const currency = market['baseId'];
|
|
711
|
+
if (side === 'buy') {
|
|
712
|
+
request[market['quoteId']] = amount * price;
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
request[market['baseId']] = amount;
|
|
716
|
+
}
|
|
717
|
+
request[currency] = amount;
|
|
718
|
+
const result = await this.privatePostTrade(this.extend(request, params));
|
|
719
|
+
const data = this.safeValue(result, 'return', {});
|
|
720
|
+
const id = this.safeString(data, 'order_id');
|
|
721
|
+
return this.safeOrder({
|
|
722
|
+
'info': result,
|
|
723
|
+
'id': id,
|
|
724
|
+
}, market);
|
|
725
|
+
}
|
|
726
|
+
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
727
|
+
/**
|
|
728
|
+
* @method
|
|
729
|
+
* @name indodax#cancelOrder
|
|
730
|
+
* @description cancels an open order
|
|
731
|
+
* @param {string} id order id
|
|
732
|
+
* @param {string} symbol unified symbol of the market the order was made in
|
|
733
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
734
|
+
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
735
|
+
*/
|
|
736
|
+
if (symbol === undefined) {
|
|
737
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument');
|
|
738
|
+
}
|
|
739
|
+
const side = this.safeValue(params, 'side');
|
|
740
|
+
if (side === undefined) {
|
|
741
|
+
throw new errors.ArgumentsRequired(this.id + ' cancelOrder() requires an extra "side" param');
|
|
742
|
+
}
|
|
743
|
+
await this.loadMarkets();
|
|
744
|
+
const market = this.market(symbol);
|
|
745
|
+
const request = {
|
|
746
|
+
'order_id': id,
|
|
747
|
+
'pair': market['id'],
|
|
748
|
+
'type': side,
|
|
749
|
+
};
|
|
750
|
+
return await this.privatePostCancelOrder(this.extend(request, params));
|
|
751
|
+
}
|
|
752
|
+
async fetchTransactionFee(code, params = {}) {
|
|
753
|
+
/**
|
|
754
|
+
* @method
|
|
755
|
+
* @name indodax#fetchTransactionFee
|
|
756
|
+
* @description fetch the fee for a transaction
|
|
757
|
+
* @param {string} code unified currency code
|
|
758
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
759
|
+
* @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
|
|
760
|
+
*/
|
|
761
|
+
await this.loadMarkets();
|
|
762
|
+
const currency = this.currency(code);
|
|
763
|
+
const request = {
|
|
764
|
+
'currency': currency['id'],
|
|
765
|
+
};
|
|
766
|
+
const response = await this.privatePostWithdrawFee(this.extend(request, params));
|
|
767
|
+
//
|
|
768
|
+
// {
|
|
769
|
+
// "success": 1,
|
|
770
|
+
// "return": {
|
|
771
|
+
// "server_time": 1607923272,
|
|
772
|
+
// "withdraw_fee": 0.005,
|
|
773
|
+
// "currency": "eth"
|
|
774
|
+
// }
|
|
775
|
+
// }
|
|
776
|
+
//
|
|
777
|
+
const data = this.safeValue(response, 'return', {});
|
|
778
|
+
const currencyId = this.safeString(data, 'currency');
|
|
779
|
+
return {
|
|
780
|
+
'info': response,
|
|
781
|
+
'rate': this.safeNumber(data, 'withdraw_fee'),
|
|
782
|
+
'currency': this.safeCurrencyCode(currencyId, currency),
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
786
|
+
/**
|
|
787
|
+
* @method
|
|
788
|
+
* @name indodax#fetchDepositsWithdrawals
|
|
789
|
+
* @description fetch history of deposits and withdrawals
|
|
790
|
+
* @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
|
|
791
|
+
* @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
|
|
792
|
+
* @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
|
|
793
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
794
|
+
* @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
795
|
+
*/
|
|
796
|
+
await this.loadMarkets();
|
|
797
|
+
const request = {};
|
|
798
|
+
if (since !== undefined) {
|
|
799
|
+
const startTime = this.iso8601(since).slice(0, 10);
|
|
800
|
+
request['start'] = startTime;
|
|
801
|
+
request['end'] = this.iso8601(this.milliseconds()).slice(0, 10);
|
|
802
|
+
}
|
|
803
|
+
const response = await this.privatePostTransHistory(this.extend(request, params));
|
|
804
|
+
//
|
|
805
|
+
// {
|
|
806
|
+
// "success": 1,
|
|
807
|
+
// "return": {
|
|
808
|
+
// "withdraw": {
|
|
809
|
+
// "idr": [
|
|
810
|
+
// {
|
|
811
|
+
// "status": "success",
|
|
812
|
+
// "type": "coupon",
|
|
813
|
+
// "rp": "115205",
|
|
814
|
+
// "fee": "500",
|
|
815
|
+
// "amount": "114705",
|
|
816
|
+
// "submit_time": "1539844166",
|
|
817
|
+
// "success_time": "1539844189",
|
|
818
|
+
// "withdraw_id": "1783717",
|
|
819
|
+
// "tx": "BTC-IDR-RDTVVO2P-ETD0EVAW-VTNZGMIR-HTNTUAPI-84ULM9OI",
|
|
820
|
+
// "sender": "boris",
|
|
821
|
+
// "used_by": "viginia88"
|
|
822
|
+
// },
|
|
823
|
+
// ...
|
|
824
|
+
// ],
|
|
825
|
+
// "btc": [],
|
|
826
|
+
// "abyss": [],
|
|
827
|
+
// ...
|
|
828
|
+
// },
|
|
829
|
+
// "deposit": {
|
|
830
|
+
// "idr": [
|
|
831
|
+
// {
|
|
832
|
+
// "status": "success",
|
|
833
|
+
// "type": "duitku",
|
|
834
|
+
// "rp": "393000",
|
|
835
|
+
// "fee": "5895",
|
|
836
|
+
// "amount": "387105",
|
|
837
|
+
// "submit_time": "1576555012",
|
|
838
|
+
// "success_time": "1576555012",
|
|
839
|
+
// "deposit_id": "3395438",
|
|
840
|
+
// "tx": "Duitku OVO Settlement"
|
|
841
|
+
// },
|
|
842
|
+
// ...
|
|
843
|
+
// ],
|
|
844
|
+
// "btc": [
|
|
845
|
+
// {
|
|
846
|
+
// "status": "success",
|
|
847
|
+
// "btc": "0.00118769",
|
|
848
|
+
// "amount": "0.00118769",
|
|
849
|
+
// "success_time": "1539529208",
|
|
850
|
+
// "deposit_id": "3602369",
|
|
851
|
+
// "tx": "c816aeb35a5b42f389970325a32aff69bb6b2126784dcda8f23b9dd9570d6573"
|
|
852
|
+
// },
|
|
853
|
+
// ...
|
|
854
|
+
// ],
|
|
855
|
+
// "abyss": [],
|
|
856
|
+
// ...
|
|
857
|
+
// }
|
|
858
|
+
// }
|
|
859
|
+
// }
|
|
860
|
+
//
|
|
861
|
+
const data = this.safeValue(response, 'return', {});
|
|
862
|
+
const withdraw = this.safeValue(data, 'withdraw', {});
|
|
863
|
+
const deposit = this.safeValue(data, 'deposit', {});
|
|
864
|
+
let transactions = [];
|
|
865
|
+
let currency = undefined;
|
|
866
|
+
if (code === undefined) {
|
|
867
|
+
let keys = Object.keys(withdraw);
|
|
868
|
+
for (let i = 0; i < keys.length; i++) {
|
|
869
|
+
const key = keys[i];
|
|
870
|
+
transactions = this.arrayConcat(transactions, withdraw[key]);
|
|
871
|
+
}
|
|
872
|
+
keys = Object.keys(deposit);
|
|
873
|
+
for (let i = 0; i < keys.length; i++) {
|
|
874
|
+
const key = keys[i];
|
|
875
|
+
transactions = this.arrayConcat(transactions, deposit[key]);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
currency = this.currency(code);
|
|
880
|
+
const withdraws = this.safeValue(withdraw, currency['id'], []);
|
|
881
|
+
const deposits = this.safeValue(deposit, currency['id'], []);
|
|
882
|
+
transactions = this.arrayConcat(withdraws, deposits);
|
|
883
|
+
}
|
|
884
|
+
return this.parseTransactions(transactions, currency, since, limit);
|
|
885
|
+
}
|
|
886
|
+
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
887
|
+
/**
|
|
888
|
+
* @method
|
|
889
|
+
* @name indodax#withdraw
|
|
890
|
+
* @description make a withdrawal
|
|
891
|
+
* @param {string} code unified currency code
|
|
892
|
+
* @param {float} amount the amount to withdraw
|
|
893
|
+
* @param {string} address the address to withdraw to
|
|
894
|
+
* @param {string} tag
|
|
895
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
896
|
+
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
|
|
897
|
+
*/
|
|
898
|
+
[tag, params] = this.handleWithdrawTagAndParams(tag, params);
|
|
899
|
+
this.checkAddress(address);
|
|
900
|
+
await this.loadMarkets();
|
|
901
|
+
const currency = this.currency(code);
|
|
902
|
+
// Custom string you need to provide to identify each withdrawal.
|
|
903
|
+
// Will be passed to callback URL (assigned via website to the API key)
|
|
904
|
+
// so your system can identify the request and confirm it.
|
|
905
|
+
// Alphanumeric, max length 255.
|
|
906
|
+
const requestId = this.milliseconds();
|
|
907
|
+
// Alternatively:
|
|
908
|
+
// let requestId = this.uuid ();
|
|
909
|
+
const request = {
|
|
910
|
+
'currency': currency['id'],
|
|
911
|
+
'withdraw_amount': amount,
|
|
912
|
+
'withdraw_address': address,
|
|
913
|
+
'request_id': requestId.toString(),
|
|
914
|
+
};
|
|
915
|
+
if (tag) {
|
|
916
|
+
request['withdraw_memo'] = tag;
|
|
917
|
+
}
|
|
918
|
+
const response = await this.privatePostWithdrawCoin(this.extend(request, params));
|
|
919
|
+
//
|
|
920
|
+
// {
|
|
921
|
+
// "success": 1,
|
|
922
|
+
// "status": "approved",
|
|
923
|
+
// "withdraw_currency": "xrp",
|
|
924
|
+
// "withdraw_address": "rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
|
|
925
|
+
// "withdraw_amount": "10000.00000000",
|
|
926
|
+
// "fee": "2.00000000",
|
|
927
|
+
// "amount_after_fee": "9998.00000000",
|
|
928
|
+
// "submit_time": "1509469200",
|
|
929
|
+
// "withdraw_id": "xrp-12345",
|
|
930
|
+
// "txid": "",
|
|
931
|
+
// "withdraw_memo": "123123"
|
|
932
|
+
// }
|
|
933
|
+
//
|
|
934
|
+
return this.parseTransaction(response, currency);
|
|
935
|
+
}
|
|
936
|
+
parseTransaction(transaction, currency = undefined) {
|
|
937
|
+
//
|
|
938
|
+
// withdraw
|
|
939
|
+
//
|
|
940
|
+
// {
|
|
941
|
+
// "success": 1,
|
|
942
|
+
// "status": "approved",
|
|
943
|
+
// "withdraw_currency": "xrp",
|
|
944
|
+
// "withdraw_address": "rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
|
|
945
|
+
// "withdraw_amount": "10000.00000000",
|
|
946
|
+
// "fee": "2.00000000",
|
|
947
|
+
// "amount_after_fee": "9998.00000000",
|
|
948
|
+
// "submit_time": "1509469200",
|
|
949
|
+
// "withdraw_id": "xrp-12345",
|
|
950
|
+
// "txid": "",
|
|
951
|
+
// "withdraw_memo": "123123"
|
|
952
|
+
// }
|
|
953
|
+
//
|
|
954
|
+
// transHistory
|
|
955
|
+
//
|
|
956
|
+
// {
|
|
957
|
+
// "status": "success",
|
|
958
|
+
// "type": "coupon",
|
|
959
|
+
// "rp": "115205",
|
|
960
|
+
// "fee": "500",
|
|
961
|
+
// "amount": "114705",
|
|
962
|
+
// "submit_time": "1539844166",
|
|
963
|
+
// "success_time": "1539844189",
|
|
964
|
+
// "withdraw_id": "1783717",
|
|
965
|
+
// "tx": "BTC-IDR-RDTVVO2P-ETD0EVAW-VTNZGMIR-HTNTUAPI-84ULM9OI",
|
|
966
|
+
// "sender": "boris",
|
|
967
|
+
// "used_by": "viginia88"
|
|
968
|
+
// }
|
|
969
|
+
//
|
|
970
|
+
// {
|
|
971
|
+
// "status": "success",
|
|
972
|
+
// "btc": "0.00118769",
|
|
973
|
+
// "amount": "0.00118769",
|
|
974
|
+
// "success_time": "1539529208",
|
|
975
|
+
// "deposit_id": "3602369",
|
|
976
|
+
// "tx": "c816aeb35a5b42f389970325a32aff69bb6b2126784dcda8f23b9dd9570d6573"
|
|
977
|
+
// },
|
|
978
|
+
const status = this.safeString(transaction, 'status');
|
|
979
|
+
const timestamp = this.safeTimestamp2(transaction, 'success_time', 'submit_time');
|
|
980
|
+
const depositId = this.safeString(transaction, 'deposit_id');
|
|
981
|
+
const feeCost = this.safeNumber(transaction, 'fee');
|
|
982
|
+
let fee = undefined;
|
|
983
|
+
if (feeCost !== undefined) {
|
|
984
|
+
fee = {
|
|
985
|
+
'currency': this.safeCurrencyCode(undefined, currency),
|
|
986
|
+
'cost': feeCost,
|
|
987
|
+
'rate': undefined,
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
return {
|
|
991
|
+
'id': this.safeString2(transaction, 'withdraw_id', 'deposit_id'),
|
|
992
|
+
'txid': this.safeString2(transaction, 'txid', 'tx'),
|
|
993
|
+
'timestamp': timestamp,
|
|
994
|
+
'datetime': this.iso8601(timestamp),
|
|
995
|
+
'network': undefined,
|
|
996
|
+
'addressFrom': undefined,
|
|
997
|
+
'address': this.safeString(transaction, 'withdraw_address'),
|
|
998
|
+
'addressTo': undefined,
|
|
999
|
+
'amount': this.safeNumberN(transaction, ['amount', 'withdraw_amount', 'deposit_amount']),
|
|
1000
|
+
'type': (depositId === undefined) ? 'withdraw' : 'deposit',
|
|
1001
|
+
'currency': this.safeCurrencyCode(undefined, currency),
|
|
1002
|
+
'status': this.parseTransactionStatus(status),
|
|
1003
|
+
'updated': undefined,
|
|
1004
|
+
'tagFrom': undefined,
|
|
1005
|
+
'tag': undefined,
|
|
1006
|
+
'tagTo': undefined,
|
|
1007
|
+
'comment': this.safeString(transaction, 'withdraw_memo'),
|
|
1008
|
+
'internal': undefined,
|
|
1009
|
+
'fee': fee,
|
|
1010
|
+
'info': transaction,
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
parseTransactionStatus(status) {
|
|
1014
|
+
const statuses = {
|
|
1015
|
+
'success': 'ok',
|
|
1016
|
+
};
|
|
1017
|
+
return this.safeString(statuses, status, status);
|
|
1018
|
+
}
|
|
1019
|
+
sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
|
|
1020
|
+
let url = this.urls['api'][api];
|
|
1021
|
+
if (api === 'public') {
|
|
1022
|
+
url += '/' + this.implodeParams(path, params);
|
|
1023
|
+
}
|
|
1024
|
+
else {
|
|
1025
|
+
this.checkRequiredCredentials();
|
|
1026
|
+
body = this.urlencode(this.extend({
|
|
1027
|
+
'method': path,
|
|
1028
|
+
'timestamp': this.nonce(),
|
|
1029
|
+
'recvWindow': this.options['recvWindow'],
|
|
1030
|
+
}, params));
|
|
1031
|
+
headers = {
|
|
1032
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
1033
|
+
'Key': this.apiKey,
|
|
1034
|
+
'Sign': this.hmac(this.encode(body), this.encode(this.secret), sha512.sha512),
|
|
1035
|
+
};
|
|
1036
|
+
}
|
|
1037
|
+
return { 'url': url, 'method': method, 'body': body, 'headers': headers };
|
|
1038
|
+
}
|
|
1039
|
+
handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
|
|
1040
|
+
if (response === undefined) {
|
|
1041
|
+
return undefined;
|
|
1042
|
+
}
|
|
1043
|
+
// { success: 0, error: "invalid order." }
|
|
1044
|
+
// or
|
|
1045
|
+
// [{ data, ... }, { ... }, ... ]
|
|
1046
|
+
if (Array.isArray(response)) {
|
|
1047
|
+
return undefined; // public endpoints may return []-arrays
|
|
1048
|
+
}
|
|
1049
|
+
const error = this.safeValue(response, 'error', '');
|
|
1050
|
+
if (!('success' in response) && error === '') {
|
|
1051
|
+
return undefined; // no 'success' property on public responses
|
|
1052
|
+
}
|
|
1053
|
+
if (this.safeInteger(response, 'success', 0) === 1) {
|
|
1054
|
+
// { success: 1, return: { orders: [] }}
|
|
1055
|
+
if (!('return' in response)) {
|
|
1056
|
+
throw new errors.ExchangeError(this.id + ': malformed response: ' + this.json(response));
|
|
1057
|
+
}
|
|
1058
|
+
else {
|
|
1059
|
+
return undefined;
|
|
1060
|
+
}
|
|
1061
|
+
}
|
|
1062
|
+
const feedback = this.id + ' ' + body;
|
|
1063
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], error, feedback);
|
|
1064
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], error, feedback);
|
|
1065
|
+
throw new errors.ExchangeError(feedback); // unknown message
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
module.exports = indodax;
|