ccxt 4.2.18 → 4.2.19
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 +8 -8
- package/dist/ccxt.browser.js +34202 -33193
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +12 -1
- package/dist/cjs/src/alpaca.js +18 -18
- package/dist/cjs/src/ascendex.js +13 -6
- package/dist/cjs/src/base/Exchange.js +266 -27
- package/dist/cjs/src/bigone.js +434 -168
- package/dist/cjs/src/binance.js +163 -34
- package/dist/cjs/src/binanceus.js +8 -0
- package/dist/cjs/src/bingx.js +183 -41
- package/dist/cjs/src/bitfinex.js +2 -3
- package/dist/cjs/src/bitget.js +59 -16
- package/dist/cjs/src/bitmart.js +5 -5
- package/dist/cjs/src/bitmex.js +4 -6
- package/dist/cjs/src/bitpanda.js +5 -1991
- package/dist/cjs/src/bitstamp.js +8 -0
- package/dist/cjs/src/bybit.js +27 -47
- package/dist/cjs/src/coinbase.js +176 -26
- package/dist/cjs/src/coincheck.js +1 -0
- package/dist/cjs/src/coinex.js +3 -0
- package/dist/cjs/src/coinlist.js +13 -6
- package/dist/cjs/src/coinone.js +2 -2
- package/dist/cjs/src/coinsph.js +4 -5
- package/dist/cjs/src/delta.js +7 -1
- package/dist/cjs/src/deribit.js +17 -4
- package/dist/cjs/src/gate.js +151 -169
- package/dist/cjs/src/gemini.js +1 -1
- package/dist/cjs/src/hitbtc.js +2 -3
- package/dist/cjs/src/htx.js +157 -7
- package/dist/cjs/src/huobijp.js +2 -3
- package/dist/cjs/src/independentreserve.js +7 -5
- package/dist/cjs/src/kraken.js +86 -54
- package/dist/cjs/src/kucoin.js +5 -0
- package/dist/cjs/src/kucoinfutures.js +131 -77
- package/dist/cjs/src/lbank.js +60 -33
- package/dist/cjs/src/luno.js +84 -2
- package/dist/cjs/src/mexc.js +3 -3
- package/dist/cjs/src/oceanex.js +1 -1
- package/dist/cjs/src/okx.js +23 -11
- package/dist/cjs/{js/src/bitpanda.js → src/onetrading.js} +39 -39
- package/dist/cjs/src/phemex.js +37 -27
- package/dist/cjs/src/poloniexfutures.js +1 -0
- package/dist/cjs/src/pro/binance.js +66 -25
- package/dist/cjs/src/pro/bitget.js +1 -1
- package/dist/cjs/src/pro/bitpanda.js +5 -1330
- package/dist/cjs/src/pro/coinbase.js +4 -1
- package/dist/cjs/src/pro/hitbtc.js +5 -4
- package/dist/cjs/src/pro/htx.js +6 -1
- package/dist/cjs/src/pro/kraken.js +1 -1
- package/dist/cjs/src/pro/krakenfutures.js +7 -1
- package/dist/cjs/src/pro/kucoin.js +46 -36
- package/dist/cjs/src/pro/kucoinfutures.js +45 -37
- package/dist/cjs/src/pro/lbank.js +881 -0
- package/dist/cjs/src/pro/okx.js +52 -2
- package/dist/cjs/{js/src/pro/bitpanda.js → src/pro/onetrading.js} +4 -7
- package/dist/cjs/src/pro/poloniex.js +2 -2
- package/dist/cjs/src/pro/poloniexfutures.js +43 -35
- package/dist/cjs/src/pro/woo.js +126 -0
- package/dist/cjs/src/probit.js +4 -2
- package/dist/cjs/src/upbit.js +12 -12
- package/dist/cjs/src/wavesexchange.js +1 -1
- package/dist/cjs/src/whitebit.js +1 -0
- package/dist/cjs/src/woo.js +56 -0
- package/js/ccxt.d.ts +11 -2
- package/js/ccxt.js +8 -2
- package/js/src/abstract/bitpanda.d.ts +4 -4
- package/js/src/abstract/bitstamp.d.ts +8 -0
- package/js/src/abstract/gate.d.ts +1 -0
- package/js/src/abstract/gateio.d.ts +1 -0
- package/js/src/abstract/htx.d.ts +3 -0
- package/js/src/abstract/huobi.d.ts +3 -0
- package/js/src/abstract/luno.d.ts +1 -0
- package/js/src/abstract/onetrading.d.ts +38 -0
- package/js/src/ascendex.js +2 -0
- package/js/src/bingx.js +1 -1
- package/js/src/bitget.js +22 -3
- package/js/src/bitpanda.d.ts +2 -72
- package/js/src/bitpanda.js +5 -1991
- package/js/src/bitstamp.js +8 -0
- package/js/src/deribit.js +11 -3
- package/js/src/gate.d.ts +1 -0
- package/js/src/gate.js +50 -110
- package/js/src/htx.js +3 -0
- package/js/src/kraken.d.ts +1 -0
- package/js/src/kraken.js +39 -38
- package/js/src/lbank.js +1 -0
- package/js/src/luno.d.ts +3 -1
- package/js/src/luno.js +84 -2
- package/js/src/mexc.js +1 -2
- package/js/src/onetrading.d.ts +74 -0
- package/js/src/onetrading.js +2003 -0
- package/js/src/poloniexfutures.js +1 -0
- package/js/src/pro/binance.js +6 -1
- package/js/src/pro/bitpanda.d.ts +2 -34
- package/js/src/pro/bitpanda.js +5 -1330
- package/js/src/pro/lbank.d.ts +29 -0
- package/js/src/pro/lbank.js +882 -0
- package/js/src/pro/onetrading.d.ts +36 -0
- package/js/src/pro/onetrading.js +1339 -0
- package/package.json +2 -2
- package/rollup.config.js +2 -0
- package/skip-tests.json +2 -1
- package/test-commonjs.cjs +25 -1
- package/dist/cjs/js/ccxt.js +0 -478
- package/dist/cjs/js/src/abstract/alpaca.js +0 -9
- package/dist/cjs/js/src/abstract/ascendex.js +0 -9
- package/dist/cjs/js/src/abstract/bigone.js +0 -9
- package/dist/cjs/js/src/abstract/binance.js +0 -9
- package/dist/cjs/js/src/abstract/bingx.js +0 -9
- package/dist/cjs/js/src/abstract/bit2c.js +0 -9
- package/dist/cjs/js/src/abstract/bitbank.js +0 -9
- package/dist/cjs/js/src/abstract/bitbns.js +0 -9
- package/dist/cjs/js/src/abstract/bitfinex.js +0 -9
- package/dist/cjs/js/src/abstract/bitfinex2.js +0 -9
- package/dist/cjs/js/src/abstract/bitflyer.js +0 -9
- package/dist/cjs/js/src/abstract/bitforex.js +0 -9
- package/dist/cjs/js/src/abstract/bitget.js +0 -9
- package/dist/cjs/js/src/abstract/bithumb.js +0 -9
- package/dist/cjs/js/src/abstract/bitmart.js +0 -9
- package/dist/cjs/js/src/abstract/bitmex.js +0 -9
- package/dist/cjs/js/src/abstract/bitopro.js +0 -9
- package/dist/cjs/js/src/abstract/bitpanda.js +0 -9
- package/dist/cjs/js/src/abstract/bitrue.js +0 -9
- package/dist/cjs/js/src/abstract/bitso.js +0 -9
- package/dist/cjs/js/src/abstract/bitstamp.js +0 -9
- package/dist/cjs/js/src/abstract/bitteam.js +0 -9
- package/dist/cjs/js/src/abstract/bitvavo.js +0 -9
- package/dist/cjs/js/src/abstract/bl3p.js +0 -9
- package/dist/cjs/js/src/abstract/blockchaincom.js +0 -9
- package/dist/cjs/js/src/abstract/btcalpha.js +0 -9
- package/dist/cjs/js/src/abstract/btcbox.js +0 -9
- package/dist/cjs/js/src/abstract/btcmarkets.js +0 -9
- package/dist/cjs/js/src/abstract/btcturk.js +0 -9
- package/dist/cjs/js/src/abstract/bybit.js +0 -9
- package/dist/cjs/js/src/abstract/cex.js +0 -9
- package/dist/cjs/js/src/abstract/coinbase.js +0 -9
- package/dist/cjs/js/src/abstract/coinbasepro.js +0 -9
- package/dist/cjs/js/src/abstract/coincheck.js +0 -9
- package/dist/cjs/js/src/abstract/coinex.js +0 -9
- package/dist/cjs/js/src/abstract/coinlist.js +0 -9
- package/dist/cjs/js/src/abstract/coinmate.js +0 -9
- package/dist/cjs/js/src/abstract/coinone.js +0 -9
- package/dist/cjs/js/src/abstract/coinsph.js +0 -9
- package/dist/cjs/js/src/abstract/coinspot.js +0 -9
- package/dist/cjs/js/src/abstract/cryptocom.js +0 -9
- package/dist/cjs/js/src/abstract/currencycom.js +0 -9
- package/dist/cjs/js/src/abstract/delta.js +0 -9
- package/dist/cjs/js/src/abstract/deribit.js +0 -9
- package/dist/cjs/js/src/abstract/digifinex.js +0 -9
- package/dist/cjs/js/src/abstract/exmo.js +0 -9
- package/dist/cjs/js/src/abstract/gate.js +0 -9
- package/dist/cjs/js/src/abstract/gemini.js +0 -9
- package/dist/cjs/js/src/abstract/hitbtc.js +0 -9
- package/dist/cjs/js/src/abstract/hollaex.js +0 -9
- package/dist/cjs/js/src/abstract/htx.js +0 -9
- package/dist/cjs/js/src/abstract/huobijp.js +0 -9
- package/dist/cjs/js/src/abstract/idex.js +0 -9
- package/dist/cjs/js/src/abstract/independentreserve.js +0 -9
- package/dist/cjs/js/src/abstract/indodax.js +0 -9
- package/dist/cjs/js/src/abstract/kraken.js +0 -9
- package/dist/cjs/js/src/abstract/krakenfutures.js +0 -9
- package/dist/cjs/js/src/abstract/kucoin.js +0 -9
- package/dist/cjs/js/src/abstract/kucoinfutures.js +0 -9
- package/dist/cjs/js/src/abstract/kuna.js +0 -9
- package/dist/cjs/js/src/abstract/latoken.js +0 -9
- package/dist/cjs/js/src/abstract/lbank.js +0 -9
- package/dist/cjs/js/src/abstract/luno.js +0 -9
- package/dist/cjs/js/src/abstract/lykke.js +0 -9
- package/dist/cjs/js/src/abstract/mercado.js +0 -9
- package/dist/cjs/js/src/abstract/mexc.js +0 -9
- package/dist/cjs/js/src/abstract/ndax.js +0 -9
- package/dist/cjs/js/src/abstract/novadax.js +0 -9
- package/dist/cjs/js/src/abstract/oceanex.js +0 -9
- package/dist/cjs/js/src/abstract/okcoin.js +0 -9
- package/dist/cjs/js/src/abstract/okx.js +0 -9
- package/dist/cjs/js/src/abstract/p2b.js +0 -9
- package/dist/cjs/js/src/abstract/paymium.js +0 -9
- package/dist/cjs/js/src/abstract/phemex.js +0 -9
- package/dist/cjs/js/src/abstract/poloniex.js +0 -9
- package/dist/cjs/js/src/abstract/poloniexfutures.js +0 -9
- package/dist/cjs/js/src/abstract/probit.js +0 -9
- package/dist/cjs/js/src/abstract/timex.js +0 -9
- package/dist/cjs/js/src/abstract/tokocrypto.js +0 -9
- package/dist/cjs/js/src/abstract/upbit.js +0 -9
- package/dist/cjs/js/src/abstract/wavesexchange.js +0 -9
- package/dist/cjs/js/src/abstract/wazirx.js +0 -9
- package/dist/cjs/js/src/abstract/whitebit.js +0 -9
- package/dist/cjs/js/src/abstract/woo.js +0 -9
- package/dist/cjs/js/src/abstract/yobit.js +0 -9
- package/dist/cjs/js/src/abstract/zaif.js +0 -9
- package/dist/cjs/js/src/abstract/zonda.js +0 -9
- package/dist/cjs/js/src/ace.js +0 -1058
- package/dist/cjs/js/src/alpaca.js +0 -1125
- package/dist/cjs/js/src/ascendex.js +0 -3365
- package/dist/cjs/js/src/base/Exchange.js +0 -5260
- package/dist/cjs/js/src/base/Precise.js +0 -263
- package/dist/cjs/js/src/base/errors.js +0 -299
- package/dist/cjs/js/src/base/functions/crypto.js +0 -78
- package/dist/cjs/js/src/base/functions/encode.js +0 -44
- package/dist/cjs/js/src/base/functions/generic.js +0 -193
- package/dist/cjs/js/src/base/functions/misc.js +0 -96
- package/dist/cjs/js/src/base/functions/number.js +0 -297
- package/dist/cjs/js/src/base/functions/platform.js +0 -28
- package/dist/cjs/js/src/base/functions/rsa.js +0 -34
- package/dist/cjs/js/src/base/functions/string.js +0 -48
- package/dist/cjs/js/src/base/functions/throttle.js +0 -66
- package/dist/cjs/js/src/base/functions/time.js +0 -187
- package/dist/cjs/js/src/base/functions/totp.js +0 -24
- package/dist/cjs/js/src/base/functions/type.js +0 -162
- package/dist/cjs/js/src/base/functions.js +0 -157
- package/dist/cjs/js/src/base/ws/Cache.js +0 -254
- package/dist/cjs/js/src/base/ws/Client.js +0 -299
- package/dist/cjs/js/src/base/ws/Future.js +0 -34
- package/dist/cjs/js/src/base/ws/OrderBook.js +0 -107
- package/dist/cjs/js/src/base/ws/OrderBookSide.js +0 -281
- package/dist/cjs/js/src/base/ws/WsClient.js +0 -69
- package/dist/cjs/js/src/bequant.js +0 -33
- package/dist/cjs/js/src/bigone.js +0 -2213
- package/dist/cjs/js/src/binance.js +0 -9851
- package/dist/cjs/js/src/binancecoinm.js +0 -45
- package/dist/cjs/js/src/binanceus.js +0 -92
- package/dist/cjs/js/src/binanceusdm.js +0 -58
- package/dist/cjs/js/src/bingx.js +0 -3872
- package/dist/cjs/js/src/bit2c.js +0 -916
- package/dist/cjs/js/src/bitbank.js +0 -1000
- package/dist/cjs/js/src/bitbay.js +0 -17
- package/dist/cjs/js/src/bitbns.js +0 -1220
- package/dist/cjs/js/src/bitcoincom.js +0 -17
- package/dist/cjs/js/src/bitfinex.js +0 -1670
- package/dist/cjs/js/src/bitfinex2.js +0 -2990
- package/dist/cjs/js/src/bitflyer.js +0 -1045
- package/dist/cjs/js/src/bitforex.js +0 -852
- package/dist/cjs/js/src/bitget.js +0 -8295
- package/dist/cjs/js/src/bithumb.js +0 -1090
- package/dist/cjs/js/src/bitmart.js +0 -4454
- package/dist/cjs/js/src/bitmex.js +0 -2881
- package/dist/cjs/js/src/bitopro.js +0 -1724
- package/dist/cjs/js/src/bitrue.js +0 -3253
- package/dist/cjs/js/src/bitso.js +0 -1753
- package/dist/cjs/js/src/bitstamp.js +0 -2188
- package/dist/cjs/js/src/bitteam.js +0 -2309
- package/dist/cjs/js/src/bitvavo.js +0 -1968
- package/dist/cjs/js/src/bl3p.js +0 -447
- package/dist/cjs/js/src/blockchaincom.js +0 -1160
- package/dist/cjs/js/src/btcalpha.js +0 -929
- package/dist/cjs/js/src/btcbox.js +0 -565
- package/dist/cjs/js/src/btcmarkets.js +0 -1237
- package/dist/cjs/js/src/btcturk.js +0 -929
- package/dist/cjs/js/src/bybit.js +0 -7624
- package/dist/cjs/js/src/cex.js +0 -1693
- package/dist/cjs/js/src/coinbase.js +0 -3424
- package/dist/cjs/js/src/coinbasepro.js +0 -1866
- package/dist/cjs/js/src/coincheck.js +0 -844
- package/dist/cjs/js/src/coinex.js +0 -5417
- package/dist/cjs/js/src/coinlist.js +0 -2337
- package/dist/cjs/js/src/coinmate.js +0 -989
- package/dist/cjs/js/src/coinone.js +0 -1185
- package/dist/cjs/js/src/coinsph.js +0 -1933
- package/dist/cjs/js/src/coinspot.js +0 -548
- package/dist/cjs/js/src/cryptocom.js +0 -3007
- package/dist/cjs/js/src/currencycom.js +0 -2015
- package/dist/cjs/js/src/delta.js +0 -3262
- package/dist/cjs/js/src/deribit.js +0 -3310
- package/dist/cjs/js/src/digifinex.js +0 -4307
- package/dist/cjs/js/src/exmo.js +0 -2645
- package/dist/cjs/js/src/fmfwio.js +0 -34
- package/dist/cjs/js/src/gate.js +0 -7077
- package/dist/cjs/js/src/gateio.js +0 -16
- package/dist/cjs/js/src/gemini.js +0 -1801
- package/dist/cjs/js/src/hitbtc.js +0 -3660
- package/dist/cjs/js/src/hitbtc3.js +0 -19
- package/dist/cjs/js/src/hollaex.js +0 -1882
- package/dist/cjs/js/src/htx.js +0 -9174
- package/dist/cjs/js/src/huobi.js +0 -16
- package/dist/cjs/js/src/huobijp.js +0 -1918
- package/dist/cjs/js/src/idex.js +0 -1770
- package/dist/cjs/js/src/independentreserve.js +0 -761
- package/dist/cjs/js/src/indodax.js +0 -1069
- package/dist/cjs/js/src/kraken.js +0 -2891
- package/dist/cjs/js/src/krakenfutures.js +0 -2407
- package/dist/cjs/js/src/kucoin.js +0 -4494
- package/dist/cjs/js/src/kucoinfutures.js +0 -2529
- package/dist/cjs/js/src/kuna.js +0 -1949
- package/dist/cjs/js/src/latoken.js +0 -1729
- package/dist/cjs/js/src/lbank.js +0 -2851
- package/dist/cjs/js/src/luno.js +0 -1044
- package/dist/cjs/js/src/lykke.js +0 -1303
- package/dist/cjs/js/src/mercado.js +0 -897
- package/dist/cjs/js/src/mexc.js +0 -5407
- package/dist/cjs/js/src/ndax.js +0 -2450
- package/dist/cjs/js/src/novadax.js +0 -1556
- package/dist/cjs/js/src/oceanex.js +0 -964
- package/dist/cjs/js/src/okcoin.js +0 -3115
- package/dist/cjs/js/src/okx.js +0 -7331
- package/dist/cjs/js/src/p2b.js +0 -1243
- package/dist/cjs/js/src/paymium.js +0 -597
- package/dist/cjs/js/src/phemex.js +0 -4725
- package/dist/cjs/js/src/poloniex.js +0 -2356
- package/dist/cjs/js/src/poloniexfutures.js +0 -1794
- package/dist/cjs/js/src/pro/alpaca.js +0 -714
- package/dist/cjs/js/src/pro/ascendex.js +0 -957
- package/dist/cjs/js/src/pro/bequant.js +0 -33
- package/dist/cjs/js/src/pro/binance.js +0 -2796
- package/dist/cjs/js/src/pro/binancecoinm.js +0 -23
- package/dist/cjs/js/src/pro/binanceus.js +0 -51
- package/dist/cjs/js/src/pro/binanceusdm.js +0 -32
- package/dist/cjs/js/src/pro/bingx.js +0 -944
- package/dist/cjs/js/src/pro/bitcoincom.js +0 -29
- package/dist/cjs/js/src/pro/bitfinex.js +0 -672
- package/dist/cjs/js/src/pro/bitfinex2.js +0 -1159
- package/dist/cjs/js/src/pro/bitget.js +0 -1733
- package/dist/cjs/js/src/pro/bitmart.js +0 -1486
- package/dist/cjs/js/src/pro/bitmex.js +0 -1576
- package/dist/cjs/js/src/pro/bitopro.js +0 -327
- package/dist/cjs/js/src/pro/bitrue.js +0 -462
- package/dist/cjs/js/src/pro/bitstamp.js +0 -547
- package/dist/cjs/js/src/pro/bitvavo.js +0 -704
- package/dist/cjs/js/src/pro/blockchaincom.js +0 -794
- package/dist/cjs/js/src/pro/bybit.js +0 -1843
- package/dist/cjs/js/src/pro/cex.js +0 -1510
- package/dist/cjs/js/src/pro/coinbase.js +0 -561
- package/dist/cjs/js/src/pro/coinbasepro.js +0 -968
- package/dist/cjs/js/src/pro/coinex.js +0 -1095
- package/dist/cjs/js/src/pro/cryptocom.js +0 -1020
- package/dist/cjs/js/src/pro/currencycom.js +0 -563
- package/dist/cjs/js/src/pro/deribit.js +0 -825
- package/dist/cjs/js/src/pro/exmo.js +0 -658
- package/dist/cjs/js/src/pro/gate.js +0 -1316
- package/dist/cjs/js/src/pro/gateio.js +0 -16
- package/dist/cjs/js/src/pro/gemini.js +0 -649
- package/dist/cjs/js/src/pro/hitbtc.js +0 -1294
- package/dist/cjs/js/src/pro/hollaex.js +0 -597
- package/dist/cjs/js/src/pro/htx.js +0 -2388
- package/dist/cjs/js/src/pro/huobi.js +0 -16
- package/dist/cjs/js/src/pro/huobijp.js +0 -606
- package/dist/cjs/js/src/pro/idex.js +0 -714
- package/dist/cjs/js/src/pro/independentreserve.js +0 -280
- package/dist/cjs/js/src/pro/kraken.js +0 -1364
- package/dist/cjs/js/src/pro/krakenfutures.js +0 -1506
- package/dist/cjs/js/src/pro/kucoin.js +0 -1062
- package/dist/cjs/js/src/pro/kucoinfutures.js +0 -989
- package/dist/cjs/js/src/pro/luno.js +0 -322
- package/dist/cjs/js/src/pro/mexc.js +0 -1170
- package/dist/cjs/js/src/pro/ndax.js +0 -545
- package/dist/cjs/js/src/pro/okcoin.js +0 -760
- package/dist/cjs/js/src/pro/okx.js +0 -1608
- package/dist/cjs/js/src/pro/phemex.js +0 -1511
- package/dist/cjs/js/src/pro/poloniex.js +0 -1253
- package/dist/cjs/js/src/pro/poloniexfutures.js +0 -1022
- package/dist/cjs/js/src/pro/probit.js +0 -586
- package/dist/cjs/js/src/pro/upbit.js +0 -234
- package/dist/cjs/js/src/pro/wazirx.js +0 -776
- package/dist/cjs/js/src/pro/whitebit.js +0 -927
- package/dist/cjs/js/src/pro/woo.js +0 -895
- package/dist/cjs/js/src/probit.js +0 -1867
- package/dist/cjs/js/src/static_dependencies/fflake/browser.js +0 -401
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -195
- package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -308
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +0 -554
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -94
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -70
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -91
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -16
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +0 -1760
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -52
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +0 -81
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +0 -376
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -70
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +0 -1580
- package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -74
- package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +0 -24
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +0 -158
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +0 -429
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -176
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +0 -324
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +0 -163
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +0 -245
- package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +0 -1018
- package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +0 -383
- package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +0 -258
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +0 -53
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +0 -120
- package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +0 -69
- package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +0 -7
- package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +0 -83
- package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +0 -240
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +0 -91
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +0 -130
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +0 -214
- package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +0 -239
- package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +0 -93
- package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +0 -354
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +0 -16
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +0 -20
- package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -30
- package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +0 -239
- package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +0 -372
- package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +0 -273
- package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +0 -139
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +0 -14
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -16
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +0 -81
- package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +0 -292
- package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +0 -103
- package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -140
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -175
- package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -95
- package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +0 -7
- package/dist/cjs/js/src/static_dependencies/scure-base/index.js +0 -383
- package/dist/cjs/js/src/timex.js +0 -1562
- package/dist/cjs/js/src/tokocrypto.js +0 -2542
- package/dist/cjs/js/src/upbit.js +0 -1844
- package/dist/cjs/js/src/wavesexchange.js +0 -2607
- package/dist/cjs/js/src/wazirx.js +0 -953
- package/dist/cjs/js/src/whitebit.js +0 -2310
- package/dist/cjs/js/src/woo.js +0 -2769
- package/dist/cjs/js/src/yobit.js +0 -1314
- package/dist/cjs/js/src/zaif.js +0 -736
- package/dist/cjs/js/src/zonda.js +0 -1883
- package/dist/cjs/src/abstract/bitpanda.js +0 -9
- package/test.ts +0 -0
- /package/dist/cjs/{js/src/abstract/ace.js → src/abstract/onetrading.js} +0 -0
- /package/dist/cjs/{js/src → src}/pro/coincheck.js +0 -0
- /package/dist/cjs/{js/src → src}/pro/coinone.js +0 -0
- /package/js/src/abstract/{bitpanda.js → onetrading.js} +0 -0
|
@@ -1,1364 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var kraken$1 = require('../kraken.js');
|
|
4
|
-
var errors = require('../base/errors.js');
|
|
5
|
-
var Cache = require('../base/ws/Cache.js');
|
|
6
|
-
var Precise = require('../base/Precise.js');
|
|
7
|
-
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
class kraken extends kraken$1 {
|
|
11
|
-
describe() {
|
|
12
|
-
return this.deepExtend(super.describe(), {
|
|
13
|
-
'has': {
|
|
14
|
-
'ws': true,
|
|
15
|
-
'watchBalance': false,
|
|
16
|
-
'watchMyTrades': true,
|
|
17
|
-
'watchOHLCV': true,
|
|
18
|
-
'watchOrderBook': true,
|
|
19
|
-
'watchOrders': true,
|
|
20
|
-
'watchTicker': true,
|
|
21
|
-
'watchTickers': false,
|
|
22
|
-
'watchTrades': true,
|
|
23
|
-
'createOrderWs': true,
|
|
24
|
-
'editOrderWs': true,
|
|
25
|
-
'cancelOrderWs': true,
|
|
26
|
-
'cancelOrdersWs': true,
|
|
27
|
-
'cancelAllOrdersWs': true,
|
|
28
|
-
// 'watchHeartbeat': true,
|
|
29
|
-
// 'watchStatus': true,
|
|
30
|
-
},
|
|
31
|
-
'urls': {
|
|
32
|
-
'api': {
|
|
33
|
-
'ws': {
|
|
34
|
-
'public': 'wss://ws.kraken.com',
|
|
35
|
-
'private': 'wss://ws-auth.kraken.com',
|
|
36
|
-
'beta': 'wss://beta-ws.kraken.com',
|
|
37
|
-
'beta-private': 'wss://beta-ws-auth.kraken.com',
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
// 'versions': {
|
|
42
|
-
// 'ws': '0.2.0',
|
|
43
|
-
// },
|
|
44
|
-
'options': {
|
|
45
|
-
'tradesLimit': 1000,
|
|
46
|
-
'OHLCVLimit': 1000,
|
|
47
|
-
'ordersLimit': 1000,
|
|
48
|
-
'symbolsByOrderId': {},
|
|
49
|
-
'checksum': true,
|
|
50
|
-
},
|
|
51
|
-
'exceptions': {
|
|
52
|
-
'ws': {
|
|
53
|
-
'exact': {
|
|
54
|
-
'Event(s) not found': errors.BadRequest,
|
|
55
|
-
},
|
|
56
|
-
'broad': {
|
|
57
|
-
'Already subscribed': errors.BadRequest,
|
|
58
|
-
'Currency pair not in ISO 4217-A3 format': errors.BadSymbol,
|
|
59
|
-
'Malformed request': errors.BadRequest,
|
|
60
|
-
'Pair field must be an array': errors.BadRequest,
|
|
61
|
-
'Pair field unsupported for this subscription type': errors.BadRequest,
|
|
62
|
-
'Pair(s) not found': errors.BadSymbol,
|
|
63
|
-
'Subscription book depth must be an integer': errors.BadRequest,
|
|
64
|
-
'Subscription depth not supported': errors.BadRequest,
|
|
65
|
-
'Subscription field must be an object': errors.BadRequest,
|
|
66
|
-
'Subscription name invalid': errors.BadRequest,
|
|
67
|
-
'Subscription object unsupported field': errors.BadRequest,
|
|
68
|
-
'Subscription ohlc interval must be an integer': errors.BadRequest,
|
|
69
|
-
'Subscription ohlc interval not supported': errors.BadRequest,
|
|
70
|
-
'Subscription ohlc requires interval': errors.BadRequest,
|
|
71
|
-
'EAccount:Invalid permissions': errors.PermissionDenied,
|
|
72
|
-
'EAuth:Account temporary disabled': errors.AccountSuspended,
|
|
73
|
-
'EAuth:Account unconfirmed': errors.AuthenticationError,
|
|
74
|
-
'EAuth:Rate limit exceeded': errors.RateLimitExceeded,
|
|
75
|
-
'EAuth:Too many requests': errors.RateLimitExceeded,
|
|
76
|
-
'EDatabase: Internal error (to be deprecated)': errors.ExchangeError,
|
|
77
|
-
'EGeneral:Internal error[:<code>]': errors.ExchangeError,
|
|
78
|
-
'EGeneral:Invalid arguments': errors.BadRequest,
|
|
79
|
-
'EOrder:Cannot open opposing position': errors.InvalidOrder,
|
|
80
|
-
'EOrder:Cannot open position': errors.InvalidOrder,
|
|
81
|
-
'EOrder:Insufficient funds (insufficient user funds)': errors.InsufficientFunds,
|
|
82
|
-
'EOrder:Insufficient margin (exchange does not have sufficient funds to allow margin trading)': errors.InsufficientFunds,
|
|
83
|
-
'EOrder:Invalid price': errors.InvalidOrder,
|
|
84
|
-
'EOrder:Margin allowance exceeded': errors.InvalidOrder,
|
|
85
|
-
'EOrder:Margin level too low': errors.InvalidOrder,
|
|
86
|
-
'EOrder:Margin position size exceeded (client would exceed the maximum position size for this pair)': errors.InvalidOrder,
|
|
87
|
-
'EOrder:Order minimum not met (volume too low)': errors.InvalidOrder,
|
|
88
|
-
'EOrder:Orders limit exceeded': errors.InvalidOrder,
|
|
89
|
-
'EOrder:Positions limit exceeded': errors.InvalidOrder,
|
|
90
|
-
'EOrder:Rate limit exceeded': errors.RateLimitExceeded,
|
|
91
|
-
'EOrder:Scheduled orders limit exceeded': errors.InvalidOrder,
|
|
92
|
-
'EOrder:Unknown position': errors.OrderNotFound,
|
|
93
|
-
'EOrder:Unknown order': errors.OrderNotFound,
|
|
94
|
-
'EOrder:Invalid order': errors.InvalidOrder,
|
|
95
|
-
'EService:Deadline elapsed': errors.ExchangeNotAvailable,
|
|
96
|
-
'EService:Market in cancel_only mode': errors.NotSupported,
|
|
97
|
-
'EService:Market in limit_only mode': errors.NotSupported,
|
|
98
|
-
'EService:Market in post_only mode': errors.NotSupported,
|
|
99
|
-
'EService:Unavailable': errors.ExchangeNotAvailable,
|
|
100
|
-
'ETrade:Invalid request': errors.BadRequest,
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
|
|
107
|
-
/**
|
|
108
|
-
* @method
|
|
109
|
-
* @name kraken#createOrderWs
|
|
110
|
-
* @see https://docs.kraken.com/websockets/#message-addOrder
|
|
111
|
-
* @description create a trade order
|
|
112
|
-
* @param {string} symbol unified symbol of the market to create an order in
|
|
113
|
-
* @param {string} type 'market' or 'limit'
|
|
114
|
-
* @param {string} side 'buy' or 'sell'
|
|
115
|
-
* @param {float} amount how much of currency you want to trade in units of base currency
|
|
116
|
-
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
117
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
118
|
-
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
119
|
-
*/
|
|
120
|
-
await this.loadMarkets();
|
|
121
|
-
const token = await this.authenticate();
|
|
122
|
-
const market = this.market(symbol);
|
|
123
|
-
const url = this.urls['api']['ws']['private'];
|
|
124
|
-
const requestId = this.requestId();
|
|
125
|
-
const messageHash = requestId;
|
|
126
|
-
let request = {
|
|
127
|
-
'event': 'addOrder',
|
|
128
|
-
'token': token,
|
|
129
|
-
'reqid': requestId,
|
|
130
|
-
'ordertype': type,
|
|
131
|
-
'type': side,
|
|
132
|
-
'pair': market['wsId'],
|
|
133
|
-
'volume': this.amountToPrecision(symbol, amount),
|
|
134
|
-
};
|
|
135
|
-
[request, params] = this.orderRequest('createOrderWs()', symbol, type, request, price, params);
|
|
136
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
137
|
-
}
|
|
138
|
-
handleCreateEditOrder(client, message) {
|
|
139
|
-
//
|
|
140
|
-
// createOrder
|
|
141
|
-
// {
|
|
142
|
-
// "descr": "sell 0.00010000 XBTUSDT @ market",
|
|
143
|
-
// "event": "addOrderStatus",
|
|
144
|
-
// "reqid": 1,
|
|
145
|
-
// "status": "ok",
|
|
146
|
-
// "txid": "OAVXZH-XIE54-JCYYDG"
|
|
147
|
-
// }
|
|
148
|
-
// editOrder
|
|
149
|
-
// {
|
|
150
|
-
// "descr": "order edited price = 9000.00000000",
|
|
151
|
-
// "event": "editOrderStatus",
|
|
152
|
-
// "originaltxid": "O65KZW-J4AW3-VFS74A",
|
|
153
|
-
// "reqid": 3,
|
|
154
|
-
// "status": "ok",
|
|
155
|
-
// "txid": "OTI672-HJFAO-XOIPPK"
|
|
156
|
-
// }
|
|
157
|
-
//
|
|
158
|
-
const order = this.parseOrder(message);
|
|
159
|
-
const messageHash = this.safeValue(message, 'reqid');
|
|
160
|
-
client.resolve(order, messageHash);
|
|
161
|
-
}
|
|
162
|
-
async editOrderWs(id, symbol, type, side, amount, price = undefined, params = {}) {
|
|
163
|
-
/**
|
|
164
|
-
* @method
|
|
165
|
-
* @name kraken#editOrderWs
|
|
166
|
-
* @description edit a trade order
|
|
167
|
-
* @see https://docs.kraken.com/websockets/#message-editOrder
|
|
168
|
-
* @param {string} id order id
|
|
169
|
-
* @param {string} symbol unified symbol of the market to create an order in
|
|
170
|
-
* @param {string} type 'market' or 'limit'
|
|
171
|
-
* @param {string} side 'buy' or 'sell'
|
|
172
|
-
* @param {float} amount how much of the currency you want to trade in units of the base currency
|
|
173
|
-
* @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
|
174
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
175
|
-
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
176
|
-
*/
|
|
177
|
-
await this.loadMarkets();
|
|
178
|
-
const token = await this.authenticate();
|
|
179
|
-
const market = this.market(symbol);
|
|
180
|
-
const url = this.urls['api']['ws']['private'];
|
|
181
|
-
const requestId = this.requestId();
|
|
182
|
-
const messageHash = requestId;
|
|
183
|
-
let request = {
|
|
184
|
-
'event': 'editOrder',
|
|
185
|
-
'token': token,
|
|
186
|
-
'reqid': requestId,
|
|
187
|
-
'orderid': id,
|
|
188
|
-
'pair': market['wsId'],
|
|
189
|
-
'volume': this.amountToPrecision(symbol, amount),
|
|
190
|
-
};
|
|
191
|
-
[request, params] = this.orderRequest('editOrderWs()', symbol, type, request, price, params);
|
|
192
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
193
|
-
}
|
|
194
|
-
async cancelOrdersWs(ids, symbol = undefined, params = {}) {
|
|
195
|
-
/**
|
|
196
|
-
* @method
|
|
197
|
-
* @name kraken#cancelOrdersWs
|
|
198
|
-
* @see https://docs.kraken.com/websockets/#message-cancelOrder
|
|
199
|
-
* @description cancel multiple orders
|
|
200
|
-
* @param {string[]} ids order ids
|
|
201
|
-
* @param {string} symbol unified market symbol, default is undefined
|
|
202
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
203
|
-
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
204
|
-
*/
|
|
205
|
-
await this.loadMarkets();
|
|
206
|
-
const token = await this.authenticate();
|
|
207
|
-
const url = this.urls['api']['ws']['private'];
|
|
208
|
-
const requestId = this.requestId();
|
|
209
|
-
const messageHash = requestId;
|
|
210
|
-
const request = {
|
|
211
|
-
'event': 'cancelOrder',
|
|
212
|
-
'token': token,
|
|
213
|
-
'reqid': requestId,
|
|
214
|
-
'txid': ids,
|
|
215
|
-
};
|
|
216
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
217
|
-
}
|
|
218
|
-
async cancelOrderWs(id, symbol = undefined, params = {}) {
|
|
219
|
-
/**
|
|
220
|
-
* @method
|
|
221
|
-
* @name kraken#cancelOrderWs
|
|
222
|
-
* @see https://docs.kraken.com/websockets/#message-cancelOrder
|
|
223
|
-
* @description cancels an open order
|
|
224
|
-
* @param {string} id order id
|
|
225
|
-
* @param {string} symbol unified symbol of the market the order was made in
|
|
226
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
227
|
-
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
228
|
-
*/
|
|
229
|
-
await this.loadMarkets();
|
|
230
|
-
const token = await this.authenticate();
|
|
231
|
-
const url = this.urls['api']['ws']['private'];
|
|
232
|
-
const requestId = this.requestId();
|
|
233
|
-
const messageHash = requestId;
|
|
234
|
-
const clientOrderId = this.safeValue2(params, 'userref', 'clientOrderId', id);
|
|
235
|
-
params = this.omit(params, ['userref', 'clientOrderId']);
|
|
236
|
-
const request = {
|
|
237
|
-
'event': 'cancelOrder',
|
|
238
|
-
'token': token,
|
|
239
|
-
'reqid': requestId,
|
|
240
|
-
'txid': [clientOrderId],
|
|
241
|
-
};
|
|
242
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
243
|
-
}
|
|
244
|
-
handleCancelOrder(client, message) {
|
|
245
|
-
//
|
|
246
|
-
// success
|
|
247
|
-
// {
|
|
248
|
-
// "event": "cancelOrderStatus",
|
|
249
|
-
// "status": "ok"
|
|
250
|
-
// "reqid": 1,
|
|
251
|
-
// }
|
|
252
|
-
//
|
|
253
|
-
const reqId = this.safeValue(message, 'reqid');
|
|
254
|
-
client.resolve(message, reqId);
|
|
255
|
-
}
|
|
256
|
-
async cancelAllOrdersWs(symbol = undefined, params = {}) {
|
|
257
|
-
/**
|
|
258
|
-
* @method
|
|
259
|
-
* @name kraken#cancelAllOrdersWs
|
|
260
|
-
* @see https://docs.kraken.com/websockets/#message-cancelAll
|
|
261
|
-
* @description cancel all open orders
|
|
262
|
-
* @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
|
|
263
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
264
|
-
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
265
|
-
*/
|
|
266
|
-
if (symbol !== undefined) {
|
|
267
|
-
throw new errors.NotSupported(this.id + ' cancelAllOrdersWs () does not support cancelling orders in a specific market.');
|
|
268
|
-
}
|
|
269
|
-
await this.loadMarkets();
|
|
270
|
-
const token = await this.authenticate();
|
|
271
|
-
const url = this.urls['api']['ws']['private'];
|
|
272
|
-
const requestId = this.requestId();
|
|
273
|
-
const messageHash = requestId;
|
|
274
|
-
const request = {
|
|
275
|
-
'event': 'cancelAll',
|
|
276
|
-
'token': token,
|
|
277
|
-
'reqid': requestId,
|
|
278
|
-
};
|
|
279
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash);
|
|
280
|
-
}
|
|
281
|
-
handleCancelAllOrders(client, message) {
|
|
282
|
-
//
|
|
283
|
-
// {
|
|
284
|
-
// "count": 2,
|
|
285
|
-
// "event": "cancelAllStatus",
|
|
286
|
-
// "status": "ok",
|
|
287
|
-
// "reqId": 1
|
|
288
|
-
// }
|
|
289
|
-
//
|
|
290
|
-
const reqId = this.safeValue(message, 'reqid');
|
|
291
|
-
client.resolve(message, reqId);
|
|
292
|
-
}
|
|
293
|
-
handleTicker(client, message, subscription) {
|
|
294
|
-
//
|
|
295
|
-
// [
|
|
296
|
-
// 0, // channelID
|
|
297
|
-
// {
|
|
298
|
-
// "a": [ "5525.40000", 1, "1.000" ], // ask, wholeAskVolume, askVolume
|
|
299
|
-
// "b": [ "5525.10000", 1, "1.000" ], // bid, wholeBidVolume, bidVolume
|
|
300
|
-
// "c": [ "5525.10000", "0.00398963" ], // closing price, volume
|
|
301
|
-
// "h": [ "5783.00000", "5783.00000" ], // high price today, high price 24h ago
|
|
302
|
-
// "l": [ "5505.00000", "5505.00000" ], // low price today, low price 24h ago
|
|
303
|
-
// "o": [ "5760.70000", "5763.40000" ], // open price today, open price 24h ago
|
|
304
|
-
// "p": [ "5631.44067", "5653.78939" ], // vwap today, vwap 24h ago
|
|
305
|
-
// "t": [ 11493, 16267 ], // number of trades today, 24 hours ago
|
|
306
|
-
// "v": [ "2634.11501494", "3591.17907851" ], // volume today, volume 24 hours ago
|
|
307
|
-
// },
|
|
308
|
-
// "ticker",
|
|
309
|
-
// "XBT/USD"
|
|
310
|
-
// ]
|
|
311
|
-
//
|
|
312
|
-
const wsName = message[3];
|
|
313
|
-
const name = 'ticker';
|
|
314
|
-
const messageHash = name + ':' + wsName;
|
|
315
|
-
const market = this.safeValue(this.options['marketsByWsName'], wsName);
|
|
316
|
-
const symbol = market['symbol'];
|
|
317
|
-
const ticker = message[1];
|
|
318
|
-
const vwap = this.safeString(ticker['p'], 0);
|
|
319
|
-
let quoteVolume = undefined;
|
|
320
|
-
const baseVolume = this.safeString(ticker['v'], 0);
|
|
321
|
-
if (baseVolume !== undefined && vwap !== undefined) {
|
|
322
|
-
quoteVolume = Precise["default"].stringMul(baseVolume, vwap);
|
|
323
|
-
}
|
|
324
|
-
const last = this.safeString(ticker['c'], 0);
|
|
325
|
-
const result = this.safeTicker({
|
|
326
|
-
'symbol': symbol,
|
|
327
|
-
'timestamp': undefined,
|
|
328
|
-
'datetime': undefined,
|
|
329
|
-
'high': this.safeString(ticker['h'], 0),
|
|
330
|
-
'low': this.safeString(ticker['l'], 0),
|
|
331
|
-
'bid': this.safeString(ticker['b'], 0),
|
|
332
|
-
'bidVolume': this.safeString(ticker['b'], 2),
|
|
333
|
-
'ask': this.safeString(ticker['a'], 0),
|
|
334
|
-
'askVolume': this.safeString(ticker['a'], 2),
|
|
335
|
-
'vwap': vwap,
|
|
336
|
-
'open': this.safeString(ticker['o'], 0),
|
|
337
|
-
'close': last,
|
|
338
|
-
'last': last,
|
|
339
|
-
'previousClose': undefined,
|
|
340
|
-
'change': undefined,
|
|
341
|
-
'percentage': undefined,
|
|
342
|
-
'average': undefined,
|
|
343
|
-
'baseVolume': baseVolume,
|
|
344
|
-
'quoteVolume': quoteVolume,
|
|
345
|
-
'info': ticker,
|
|
346
|
-
});
|
|
347
|
-
// todo add support for multiple tickers (may be tricky)
|
|
348
|
-
// kraken confirms multi-pair subscriptions separately one by one
|
|
349
|
-
// trigger correct watchTickers calls upon receiving any of symbols
|
|
350
|
-
this.tickers[symbol] = result;
|
|
351
|
-
client.resolve(result, messageHash);
|
|
352
|
-
}
|
|
353
|
-
handleTrades(client, message, subscription) {
|
|
354
|
-
//
|
|
355
|
-
// [
|
|
356
|
-
// 0, // channelID
|
|
357
|
-
// [ // price volume time side type misc
|
|
358
|
-
// [ "5541.20000", "0.15850568", "1534614057.321597", "s", "l", "" ],
|
|
359
|
-
// [ "6060.00000", "0.02455000", "1534614057.324998", "b", "l", "" ],
|
|
360
|
-
// ],
|
|
361
|
-
// "trade",
|
|
362
|
-
// "XBT/USD"
|
|
363
|
-
// ]
|
|
364
|
-
//
|
|
365
|
-
const wsName = this.safeString(message, 3);
|
|
366
|
-
const name = this.safeString(message, 2);
|
|
367
|
-
const messageHash = name + ':' + wsName;
|
|
368
|
-
const market = this.safeValue(this.options['marketsByWsName'], wsName);
|
|
369
|
-
const symbol = market['symbol'];
|
|
370
|
-
let stored = this.safeValue(this.trades, symbol);
|
|
371
|
-
if (stored === undefined) {
|
|
372
|
-
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
373
|
-
stored = new Cache.ArrayCache(limit);
|
|
374
|
-
this.trades[symbol] = stored;
|
|
375
|
-
}
|
|
376
|
-
const trades = this.safeValue(message, 1, []);
|
|
377
|
-
const parsed = this.parseTrades(trades, market);
|
|
378
|
-
for (let i = 0; i < parsed.length; i++) {
|
|
379
|
-
stored.append(parsed[i]);
|
|
380
|
-
}
|
|
381
|
-
client.resolve(stored, messageHash);
|
|
382
|
-
}
|
|
383
|
-
handleOHLCV(client, message, subscription) {
|
|
384
|
-
//
|
|
385
|
-
// [
|
|
386
|
-
// 216, // channelID
|
|
387
|
-
// [
|
|
388
|
-
// "1574454214.962096", // Time, seconds since epoch
|
|
389
|
-
// "1574454240.000000", // End timestamp of the interval
|
|
390
|
-
// "0.020970", // Open price at midnight UTC
|
|
391
|
-
// "0.020970", // Intraday high price
|
|
392
|
-
// "0.020970", // Intraday low price
|
|
393
|
-
// "0.020970", // Closing price at midnight UTC
|
|
394
|
-
// "0.020970", // Volume weighted average price
|
|
395
|
-
// "0.08636138", // Accumulated volume today
|
|
396
|
-
// 1, // Number of trades today
|
|
397
|
-
// ],
|
|
398
|
-
// "ohlc-1", // Channel Name of subscription
|
|
399
|
-
// "ETH/XBT", // Asset pair
|
|
400
|
-
// ]
|
|
401
|
-
//
|
|
402
|
-
const info = this.safeValue(subscription, 'subscription', {});
|
|
403
|
-
const interval = this.safeInteger(info, 'interval');
|
|
404
|
-
const name = this.safeString(info, 'name');
|
|
405
|
-
const wsName = this.safeString(message, 3);
|
|
406
|
-
const market = this.safeValue(this.options['marketsByWsName'], wsName);
|
|
407
|
-
const symbol = market['symbol'];
|
|
408
|
-
const timeframe = this.findTimeframe(interval);
|
|
409
|
-
const duration = this.parseTimeframe(timeframe);
|
|
410
|
-
if (timeframe !== undefined) {
|
|
411
|
-
const candle = this.safeValue(message, 1);
|
|
412
|
-
const messageHash = name + ':' + timeframe + ':' + wsName;
|
|
413
|
-
let timestamp = this.safeFloat(candle, 1);
|
|
414
|
-
timestamp -= duration;
|
|
415
|
-
const ts = this.parseToInt(timestamp * 1000);
|
|
416
|
-
const result = [
|
|
417
|
-
ts,
|
|
418
|
-
this.safeFloat(candle, 2),
|
|
419
|
-
this.safeFloat(candle, 3),
|
|
420
|
-
this.safeFloat(candle, 4),
|
|
421
|
-
this.safeFloat(candle, 5),
|
|
422
|
-
this.safeFloat(candle, 7),
|
|
423
|
-
];
|
|
424
|
-
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
425
|
-
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
426
|
-
if (stored === undefined) {
|
|
427
|
-
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
428
|
-
stored = new Cache.ArrayCacheByTimestamp(limit);
|
|
429
|
-
this.ohlcvs[symbol][timeframe] = stored;
|
|
430
|
-
}
|
|
431
|
-
stored.append(result);
|
|
432
|
-
client.resolve(stored, messageHash);
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
requestId() {
|
|
436
|
-
// their support said that reqid must be an int32, not documented
|
|
437
|
-
const reqid = this.sum(this.safeInteger(this.options, 'reqid', 0), 1);
|
|
438
|
-
this.options['reqid'] = reqid;
|
|
439
|
-
return reqid;
|
|
440
|
-
}
|
|
441
|
-
async watchPublic(name, symbol, params = {}) {
|
|
442
|
-
await this.loadMarkets();
|
|
443
|
-
const market = this.market(symbol);
|
|
444
|
-
const wsName = this.safeValue(market['info'], 'wsname');
|
|
445
|
-
const messageHash = name + ':' + wsName;
|
|
446
|
-
const url = this.urls['api']['ws']['public'];
|
|
447
|
-
const requestId = this.requestId();
|
|
448
|
-
const subscribe = {
|
|
449
|
-
'event': 'subscribe',
|
|
450
|
-
'reqid': requestId,
|
|
451
|
-
'pair': [
|
|
452
|
-
wsName,
|
|
453
|
-
],
|
|
454
|
-
'subscription': {
|
|
455
|
-
'name': name,
|
|
456
|
-
},
|
|
457
|
-
};
|
|
458
|
-
const request = this.deepExtend(subscribe, params);
|
|
459
|
-
return await this.watch(url, messageHash, request, messageHash);
|
|
460
|
-
}
|
|
461
|
-
async watchTicker(symbol, params = {}) {
|
|
462
|
-
/**
|
|
463
|
-
* @method
|
|
464
|
-
* @name kraken#watchTicker
|
|
465
|
-
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
466
|
-
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
467
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
468
|
-
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
469
|
-
*/
|
|
470
|
-
return await this.watchPublic('ticker', symbol, params);
|
|
471
|
-
}
|
|
472
|
-
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
473
|
-
/**
|
|
474
|
-
* @method
|
|
475
|
-
* @name kraken#watchTrades
|
|
476
|
-
* @description get the list of most recent trades for a particular symbol
|
|
477
|
-
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
478
|
-
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
479
|
-
* @param {int} [limit] the maximum amount of trades to fetch
|
|
480
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
481
|
-
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
482
|
-
*/
|
|
483
|
-
await this.loadMarkets();
|
|
484
|
-
symbol = this.symbol(symbol);
|
|
485
|
-
const name = 'trade';
|
|
486
|
-
const trades = await this.watchPublic(name, symbol, params);
|
|
487
|
-
if (this.newUpdates) {
|
|
488
|
-
limit = trades.getLimit(symbol, limit);
|
|
489
|
-
}
|
|
490
|
-
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
491
|
-
}
|
|
492
|
-
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
493
|
-
/**
|
|
494
|
-
* @method
|
|
495
|
-
* @name kraken#watchOrderBook
|
|
496
|
-
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
497
|
-
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
498
|
-
* @param {int} [limit] the maximum amount of order book entries to return
|
|
499
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
500
|
-
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
501
|
-
*/
|
|
502
|
-
const name = 'book';
|
|
503
|
-
const request = {};
|
|
504
|
-
if (limit !== undefined) {
|
|
505
|
-
if ((limit === 10) || (limit === 25) || (limit === 100) || (limit === 500) || (limit === 1000)) {
|
|
506
|
-
request['subscription'] = {
|
|
507
|
-
'depth': limit, // default 10, valid options 10, 25, 100, 500, 1000
|
|
508
|
-
};
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
throw new errors.NotSupported(this.id + ' watchOrderBook accepts limit values of 10, 25, 100, 500 and 1000 only');
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
const orderbook = await this.watchPublic(name, symbol, this.extend(request, params));
|
|
515
|
-
return orderbook.limit();
|
|
516
|
-
}
|
|
517
|
-
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
518
|
-
/**
|
|
519
|
-
* @method
|
|
520
|
-
* @name kraken#watchOHLCV
|
|
521
|
-
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
522
|
-
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
523
|
-
* @param {string} timeframe the length of time each candle represents
|
|
524
|
-
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
525
|
-
* @param {int} [limit] the maximum amount of candles to fetch
|
|
526
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
527
|
-
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
528
|
-
*/
|
|
529
|
-
await this.loadMarkets();
|
|
530
|
-
const name = 'ohlc';
|
|
531
|
-
const market = this.market(symbol);
|
|
532
|
-
symbol = market['symbol'];
|
|
533
|
-
const wsName = this.safeValue(market['info'], 'wsname');
|
|
534
|
-
const messageHash = name + ':' + timeframe + ':' + wsName;
|
|
535
|
-
const url = this.urls['api']['ws']['public'];
|
|
536
|
-
const requestId = this.requestId();
|
|
537
|
-
const subscribe = {
|
|
538
|
-
'event': 'subscribe',
|
|
539
|
-
'reqid': requestId,
|
|
540
|
-
'pair': [
|
|
541
|
-
wsName,
|
|
542
|
-
],
|
|
543
|
-
'subscription': {
|
|
544
|
-
'name': name,
|
|
545
|
-
'interval': this.safeValue(this.timeframes, timeframe, timeframe),
|
|
546
|
-
},
|
|
547
|
-
};
|
|
548
|
-
const request = this.deepExtend(subscribe, params);
|
|
549
|
-
const ohlcv = await this.watch(url, messageHash, request, messageHash);
|
|
550
|
-
if (this.newUpdates) {
|
|
551
|
-
limit = ohlcv.getLimit(symbol, limit);
|
|
552
|
-
}
|
|
553
|
-
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
554
|
-
}
|
|
555
|
-
async loadMarkets(reload = false, params = {}) {
|
|
556
|
-
const markets = await super.loadMarkets(reload, params);
|
|
557
|
-
let marketsByWsName = this.safeValue(this.options, 'marketsByWsName');
|
|
558
|
-
if ((marketsByWsName === undefined) || reload) {
|
|
559
|
-
marketsByWsName = {};
|
|
560
|
-
for (let i = 0; i < this.symbols.length; i++) {
|
|
561
|
-
const symbol = this.symbols[i];
|
|
562
|
-
const market = this.markets[symbol];
|
|
563
|
-
if (market['darkpool']) {
|
|
564
|
-
const info = this.safeValue(market, 'info', {});
|
|
565
|
-
const altname = this.safeString(info, 'altname');
|
|
566
|
-
const wsName = altname.slice(0, 3) + '/' + altname.slice(3);
|
|
567
|
-
marketsByWsName[wsName] = market;
|
|
568
|
-
}
|
|
569
|
-
else {
|
|
570
|
-
const info = this.safeValue(market, 'info', {});
|
|
571
|
-
const wsName = this.safeString(info, 'wsname');
|
|
572
|
-
marketsByWsName[wsName] = market;
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
this.options['marketsByWsName'] = marketsByWsName;
|
|
576
|
-
}
|
|
577
|
-
return markets;
|
|
578
|
-
}
|
|
579
|
-
async watchHeartbeat(params = {}) {
|
|
580
|
-
await this.loadMarkets();
|
|
581
|
-
const event = 'heartbeat';
|
|
582
|
-
const url = this.urls['api']['ws']['public'];
|
|
583
|
-
return await this.watch(url, event);
|
|
584
|
-
}
|
|
585
|
-
handleHeartbeat(client, message) {
|
|
586
|
-
//
|
|
587
|
-
// every second (approx) if no other updates are sent
|
|
588
|
-
//
|
|
589
|
-
// { "event": "heartbeat" }
|
|
590
|
-
//
|
|
591
|
-
const event = this.safeString(message, 'event');
|
|
592
|
-
client.resolve(message, event);
|
|
593
|
-
}
|
|
594
|
-
handleOrderBook(client, message, subscription) {
|
|
595
|
-
//
|
|
596
|
-
// first message (snapshot)
|
|
597
|
-
//
|
|
598
|
-
// [
|
|
599
|
-
// 1234, // channelID
|
|
600
|
-
// {
|
|
601
|
-
// "as": [
|
|
602
|
-
// [ "5541.30000", "2.50700000", "1534614248.123678" ],
|
|
603
|
-
// [ "5541.80000", "0.33000000", "1534614098.345543" ],
|
|
604
|
-
// [ "5542.70000", "0.64700000", "1534614244.654432" ]
|
|
605
|
-
// ],
|
|
606
|
-
// "bs": [
|
|
607
|
-
// [ "5541.20000", "1.52900000", "1534614248.765567" ],
|
|
608
|
-
// [ "5539.90000", "0.30000000", "1534614241.769870" ],
|
|
609
|
-
// [ "5539.50000", "5.00000000", "1534613831.243486" ]
|
|
610
|
-
// ]
|
|
611
|
-
// },
|
|
612
|
-
// "book-10",
|
|
613
|
-
// "XBT/USD"
|
|
614
|
-
// ]
|
|
615
|
-
//
|
|
616
|
-
// subsequent updates
|
|
617
|
-
//
|
|
618
|
-
// [
|
|
619
|
-
// 1234,
|
|
620
|
-
// { // optional
|
|
621
|
-
// "a": [
|
|
622
|
-
// [ "5541.30000", "2.50700000", "1534614248.456738" ],
|
|
623
|
-
// [ "5542.50000", "0.40100000", "1534614248.456738" ]
|
|
624
|
-
// ]
|
|
625
|
-
// },
|
|
626
|
-
// { // optional
|
|
627
|
-
// "b": [
|
|
628
|
-
// [ "5541.30000", "0.00000000", "1534614335.345903" ]
|
|
629
|
-
// ]
|
|
630
|
-
// },
|
|
631
|
-
// "book-10",
|
|
632
|
-
// "XBT/USD"
|
|
633
|
-
// ]
|
|
634
|
-
//
|
|
635
|
-
const messageLength = message.length;
|
|
636
|
-
const wsName = message[messageLength - 1];
|
|
637
|
-
const bookDepthString = message[messageLength - 2];
|
|
638
|
-
const parts = bookDepthString.split('-');
|
|
639
|
-
const depth = this.safeInteger(parts, 1, 10);
|
|
640
|
-
const market = this.safeValue(this.options['marketsByWsName'], wsName);
|
|
641
|
-
const symbol = market['symbol'];
|
|
642
|
-
let timestamp = undefined;
|
|
643
|
-
const messageHash = 'book:' + wsName;
|
|
644
|
-
// if this is a snapshot
|
|
645
|
-
if ('as' in message[1]) {
|
|
646
|
-
// todo get depth from marketsByWsName
|
|
647
|
-
this.orderbooks[symbol] = this.orderBook({}, depth);
|
|
648
|
-
const orderbook = this.orderbooks[symbol];
|
|
649
|
-
const sides = {
|
|
650
|
-
'as': 'asks',
|
|
651
|
-
'bs': 'bids',
|
|
652
|
-
};
|
|
653
|
-
const keys = Object.keys(sides);
|
|
654
|
-
for (let i = 0; i < keys.length; i++) {
|
|
655
|
-
const key = keys[i];
|
|
656
|
-
const side = sides[key];
|
|
657
|
-
const bookside = orderbook[side];
|
|
658
|
-
const deltas = this.safeValue(message[1], key, []);
|
|
659
|
-
timestamp = this.handleDeltas(bookside, deltas, timestamp);
|
|
660
|
-
}
|
|
661
|
-
orderbook['symbol'] = symbol;
|
|
662
|
-
orderbook['timestamp'] = timestamp;
|
|
663
|
-
orderbook['datetime'] = this.iso8601(timestamp);
|
|
664
|
-
client.resolve(orderbook, messageHash);
|
|
665
|
-
}
|
|
666
|
-
else {
|
|
667
|
-
const orderbook = this.orderbooks[symbol];
|
|
668
|
-
// else, if this is an orderbook update
|
|
669
|
-
let a = undefined;
|
|
670
|
-
let b = undefined;
|
|
671
|
-
let c = undefined;
|
|
672
|
-
if (messageLength === 5) {
|
|
673
|
-
a = this.safeValue(message[1], 'a', []);
|
|
674
|
-
b = this.safeValue(message[2], 'b', []);
|
|
675
|
-
c = this.safeInteger(message[1], 'c');
|
|
676
|
-
c = this.safeInteger(message[2], 'c', c);
|
|
677
|
-
}
|
|
678
|
-
else {
|
|
679
|
-
c = this.safeInteger(message[1], 'c');
|
|
680
|
-
if ('a' in message[1]) {
|
|
681
|
-
a = this.safeValue(message[1], 'a', []);
|
|
682
|
-
}
|
|
683
|
-
else {
|
|
684
|
-
b = this.safeValue(message[1], 'b', []);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
const storedAsks = orderbook['asks'];
|
|
688
|
-
const storedBids = orderbook['bids'];
|
|
689
|
-
let example = undefined;
|
|
690
|
-
if (a !== undefined) {
|
|
691
|
-
timestamp = this.handleDeltas(storedAsks, a, timestamp);
|
|
692
|
-
example = this.safeValue(a, 0);
|
|
693
|
-
}
|
|
694
|
-
if (b !== undefined) {
|
|
695
|
-
timestamp = this.handleDeltas(storedBids, b, timestamp);
|
|
696
|
-
example = this.safeValue(b, 0);
|
|
697
|
-
}
|
|
698
|
-
// don't remove this line or I will poop on your face
|
|
699
|
-
orderbook.limit();
|
|
700
|
-
const checksum = this.safeValue(this.options, 'checksum', true);
|
|
701
|
-
if (checksum) {
|
|
702
|
-
const priceString = this.safeString(example, 0);
|
|
703
|
-
const amountString = this.safeString(example, 1);
|
|
704
|
-
const priceParts = priceString.split('.');
|
|
705
|
-
const amountParts = amountString.split('.');
|
|
706
|
-
const priceLength = priceParts[1].length - 0;
|
|
707
|
-
const amountLength = amountParts[1].length - 0;
|
|
708
|
-
const payloadArray = [];
|
|
709
|
-
if (c !== undefined) {
|
|
710
|
-
for (let i = 0; i < 10; i++) {
|
|
711
|
-
const formatted = this.formatNumber(storedAsks[i][0], priceLength) + this.formatNumber(storedAsks[i][1], amountLength);
|
|
712
|
-
payloadArray.push(formatted);
|
|
713
|
-
}
|
|
714
|
-
for (let i = 0; i < 10; i++) {
|
|
715
|
-
const formatted = this.formatNumber(storedBids[i][0], priceLength) + this.formatNumber(storedBids[i][1], amountLength);
|
|
716
|
-
payloadArray.push(formatted);
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
const payload = payloadArray.join('');
|
|
720
|
-
const localChecksum = this.crc32(payload, false);
|
|
721
|
-
if (localChecksum !== c) {
|
|
722
|
-
const error = new errors.InvalidNonce(this.id + ' invalid checksum');
|
|
723
|
-
client.reject(error, messageHash);
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
orderbook['symbol'] = symbol;
|
|
727
|
-
orderbook['timestamp'] = timestamp;
|
|
728
|
-
orderbook['datetime'] = this.iso8601(timestamp);
|
|
729
|
-
client.resolve(orderbook, messageHash);
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
formatNumber(n, length) {
|
|
733
|
-
const stringNumber = this.numberToString(n);
|
|
734
|
-
const parts = stringNumber.split('.');
|
|
735
|
-
const integer = this.safeString(parts, 0);
|
|
736
|
-
const decimals = this.safeString(parts, 1, '');
|
|
737
|
-
const paddedDecimals = decimals.padEnd(length, '0');
|
|
738
|
-
const joined = integer + paddedDecimals;
|
|
739
|
-
let i = 0;
|
|
740
|
-
while (joined[i] === '0') {
|
|
741
|
-
i += 1;
|
|
742
|
-
}
|
|
743
|
-
if (i > 0) {
|
|
744
|
-
return joined.slice(i);
|
|
745
|
-
}
|
|
746
|
-
else {
|
|
747
|
-
return joined;
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
handleDeltas(bookside, deltas, timestamp = undefined) {
|
|
751
|
-
for (let j = 0; j < deltas.length; j++) {
|
|
752
|
-
const delta = deltas[j];
|
|
753
|
-
const price = this.parseNumber(delta[0]);
|
|
754
|
-
const amount = this.parseNumber(delta[1]);
|
|
755
|
-
const oldTimestamp = timestamp ? timestamp : 0;
|
|
756
|
-
timestamp = Math.max(oldTimestamp, this.parseToInt(parseFloat(delta[2]) * 1000));
|
|
757
|
-
bookside.store(price, amount);
|
|
758
|
-
}
|
|
759
|
-
return timestamp;
|
|
760
|
-
}
|
|
761
|
-
handleSystemStatus(client, message) {
|
|
762
|
-
//
|
|
763
|
-
// todo: answer the question whether handleSystemStatus should be renamed
|
|
764
|
-
// and unified as handleStatus for any usage pattern that
|
|
765
|
-
// involves system status and maintenance updates
|
|
766
|
-
//
|
|
767
|
-
// {
|
|
768
|
-
// "connectionID": 15527282728335292000,
|
|
769
|
-
// "event": "systemStatus",
|
|
770
|
-
// "status": "online", // online|maintenance|(custom status tbd)
|
|
771
|
-
// "version": "0.2.0"
|
|
772
|
-
// }
|
|
773
|
-
//
|
|
774
|
-
return message;
|
|
775
|
-
}
|
|
776
|
-
async authenticate(params = {}) {
|
|
777
|
-
const url = this.urls['api']['ws']['private'];
|
|
778
|
-
const client = this.client(url);
|
|
779
|
-
const authenticated = 'authenticated';
|
|
780
|
-
let subscription = this.safeValue(client.subscriptions, authenticated);
|
|
781
|
-
if (subscription === undefined) {
|
|
782
|
-
const response = await this.privatePostGetWebSocketsToken(params);
|
|
783
|
-
//
|
|
784
|
-
// {
|
|
785
|
-
// "error":[],
|
|
786
|
-
// "result":{
|
|
787
|
-
// "token":"xeAQ\/RCChBYNVh53sTv1yZ5H4wIbwDF20PiHtTF+4UI",
|
|
788
|
-
// "expires":900
|
|
789
|
-
// }
|
|
790
|
-
// }
|
|
791
|
-
//
|
|
792
|
-
subscription = this.safeValue(response, 'result');
|
|
793
|
-
client.subscriptions[authenticated] = subscription;
|
|
794
|
-
}
|
|
795
|
-
return this.safeString(subscription, 'token');
|
|
796
|
-
}
|
|
797
|
-
async watchPrivate(name, symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
798
|
-
await this.loadMarkets();
|
|
799
|
-
const token = await this.authenticate();
|
|
800
|
-
const subscriptionHash = name;
|
|
801
|
-
let messageHash = name;
|
|
802
|
-
if (symbol !== undefined) {
|
|
803
|
-
symbol = this.symbol(symbol);
|
|
804
|
-
messageHash += ':' + symbol;
|
|
805
|
-
}
|
|
806
|
-
const url = this.urls['api']['ws']['private'];
|
|
807
|
-
const requestId = this.requestId();
|
|
808
|
-
const subscribe = {
|
|
809
|
-
'event': 'subscribe',
|
|
810
|
-
'reqid': requestId,
|
|
811
|
-
'subscription': {
|
|
812
|
-
'name': name,
|
|
813
|
-
'token': token,
|
|
814
|
-
},
|
|
815
|
-
};
|
|
816
|
-
const request = this.deepExtend(subscribe, params);
|
|
817
|
-
const result = await this.watch(url, messageHash, request, subscriptionHash);
|
|
818
|
-
if (this.newUpdates) {
|
|
819
|
-
limit = result.getLimit(symbol, limit);
|
|
820
|
-
}
|
|
821
|
-
return this.filterBySymbolSinceLimit(result, symbol, since, limit);
|
|
822
|
-
}
|
|
823
|
-
async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
824
|
-
/**
|
|
825
|
-
* @method
|
|
826
|
-
* @name kraken#watchMyTrades
|
|
827
|
-
* @description watches information on multiple trades made by the user
|
|
828
|
-
* @param {string} symbol unified market symbol of the market trades were made in
|
|
829
|
-
* @param {int} [since] the earliest time in ms to fetch trades for
|
|
830
|
-
* @param {int} [limit] the maximum number of trade structures to retrieve
|
|
831
|
-
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
832
|
-
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
|
|
833
|
-
*/
|
|
834
|
-
return await this.watchPrivate('ownTrades', symbol, since, limit, params);
|
|
835
|
-
}
|
|
836
|
-
handleMyTrades(client, message, subscription = undefined) {
|
|
837
|
-
//
|
|
838
|
-
// [
|
|
839
|
-
// [
|
|
840
|
-
// {
|
|
841
|
-
// "TT5UC3-GOIRW-6AZZ6R": {
|
|
842
|
-
// "cost": "1493.90107",
|
|
843
|
-
// "fee": "3.88415",
|
|
844
|
-
// "margin": "0.00000",
|
|
845
|
-
// "ordertxid": "OTLAS3-RRHUF-NDWH5A",
|
|
846
|
-
// "ordertype": "market",
|
|
847
|
-
// "pair": "XBT/USDT",
|
|
848
|
-
// "postxid": "TKH2SE-M7IF5-CFI7LT",
|
|
849
|
-
// "price": "6851.50005",
|
|
850
|
-
// "time": "1586822919.335498",
|
|
851
|
-
// "type": "sell",
|
|
852
|
-
// "vol": "0.21804000"
|
|
853
|
-
// }
|
|
854
|
-
// },
|
|
855
|
-
// {
|
|
856
|
-
// "TIY6G4-LKLAI-Y3GD4A": {
|
|
857
|
-
// "cost": "22.17134",
|
|
858
|
-
// "fee": "0.05765",
|
|
859
|
-
// "margin": "0.00000",
|
|
860
|
-
// "ordertxid": "ODQXS7-MOLK6-ICXKAA",
|
|
861
|
-
// "ordertype": "market",
|
|
862
|
-
// "pair": "ETH/USD",
|
|
863
|
-
// "postxid": "TKH2SE-M7IF5-CFI7LT",
|
|
864
|
-
// "price": "169.97999",
|
|
865
|
-
// "time": "1586340530.895739",
|
|
866
|
-
// "type": "buy",
|
|
867
|
-
// "vol": "0.13043500"
|
|
868
|
-
// }
|
|
869
|
-
// },
|
|
870
|
-
// ],
|
|
871
|
-
// "ownTrades",
|
|
872
|
-
// { sequence: 1 }
|
|
873
|
-
// ]
|
|
874
|
-
//
|
|
875
|
-
const allTrades = this.safeValue(message, 0, []);
|
|
876
|
-
const allTradesLength = allTrades.length;
|
|
877
|
-
if (allTradesLength > 0) {
|
|
878
|
-
if (this.myTrades === undefined) {
|
|
879
|
-
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
880
|
-
this.myTrades = new Cache.ArrayCache(limit);
|
|
881
|
-
}
|
|
882
|
-
const stored = this.myTrades;
|
|
883
|
-
const symbols = {};
|
|
884
|
-
for (let i = 0; i < allTrades.length; i++) {
|
|
885
|
-
const trades = this.safeValue(allTrades, i, {});
|
|
886
|
-
const ids = Object.keys(trades);
|
|
887
|
-
for (let j = 0; j < ids.length; j++) {
|
|
888
|
-
const id = ids[j];
|
|
889
|
-
const trade = trades[id];
|
|
890
|
-
const parsed = this.parseWsTrade(this.extend({ 'id': id }, trade));
|
|
891
|
-
stored.append(parsed);
|
|
892
|
-
const symbol = parsed['symbol'];
|
|
893
|
-
symbols[symbol] = true;
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
const name = 'ownTrades';
|
|
897
|
-
client.resolve(this.myTrades, name);
|
|
898
|
-
const keys = Object.keys(symbols);
|
|
899
|
-
for (let i = 0; i < keys.length; i++) {
|
|
900
|
-
const messageHash = name + ':' + keys[i];
|
|
901
|
-
client.resolve(this.myTrades, messageHash);
|
|
902
|
-
}
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
parseWsTrade(trade, market = undefined) {
|
|
906
|
-
//
|
|
907
|
-
// {
|
|
908
|
-
// "id": "TIMIRG-WUNNE-RRJ6GT", // injected from outside
|
|
909
|
-
// "ordertxid": "OQRPN2-LRHFY-HIFA7D",
|
|
910
|
-
// "postxid": "TKH2SE-M7IF5-CFI7LT",
|
|
911
|
-
// "pair": "USDCUSDT",
|
|
912
|
-
// "time": 1586340086.457,
|
|
913
|
-
// "type": "sell",
|
|
914
|
-
// "ordertype": "market",
|
|
915
|
-
// "price": "0.99860000",
|
|
916
|
-
// "cost": "22.16892001",
|
|
917
|
-
// "fee": "0.04433784",
|
|
918
|
-
// "vol": "22.20000000",
|
|
919
|
-
// "margin": "0.00000000",
|
|
920
|
-
// "misc": ''
|
|
921
|
-
// }
|
|
922
|
-
//
|
|
923
|
-
// {
|
|
924
|
-
// "id": "TIY6G4-LKLAI-Y3GD4A",
|
|
925
|
-
// "cost": "22.17134",
|
|
926
|
-
// "fee": "0.05765",
|
|
927
|
-
// "margin": "0.00000",
|
|
928
|
-
// "ordertxid": "ODQXS7-MOLK6-ICXKAA",
|
|
929
|
-
// "ordertype": "market",
|
|
930
|
-
// "pair": "ETH/USD",
|
|
931
|
-
// "postxid": "TKH2SE-M7IF5-CFI7LT",
|
|
932
|
-
// "price": "169.97999",
|
|
933
|
-
// "time": "1586340530.895739",
|
|
934
|
-
// "type": "buy",
|
|
935
|
-
// "vol": "0.13043500"
|
|
936
|
-
// }
|
|
937
|
-
//
|
|
938
|
-
const wsName = this.safeString(trade, 'pair');
|
|
939
|
-
market = this.safeValue(this.options['marketsByWsName'], wsName, market);
|
|
940
|
-
let symbol = undefined;
|
|
941
|
-
const orderId = this.safeString(trade, 'ordertxid');
|
|
942
|
-
const id = this.safeString2(trade, 'id', 'postxid');
|
|
943
|
-
const timestamp = this.safeTimestamp(trade, 'time');
|
|
944
|
-
const side = this.safeString(trade, 'type');
|
|
945
|
-
const type = this.safeString(trade, 'ordertype');
|
|
946
|
-
const price = this.safeFloat(trade, 'price');
|
|
947
|
-
const amount = this.safeFloat(trade, 'vol');
|
|
948
|
-
let cost = undefined;
|
|
949
|
-
let fee = undefined;
|
|
950
|
-
if ('fee' in trade) {
|
|
951
|
-
let currency = undefined;
|
|
952
|
-
if (market !== undefined) {
|
|
953
|
-
currency = market['quote'];
|
|
954
|
-
}
|
|
955
|
-
fee = {
|
|
956
|
-
'cost': this.safeFloat(trade, 'fee'),
|
|
957
|
-
'currency': currency,
|
|
958
|
-
};
|
|
959
|
-
}
|
|
960
|
-
if (market !== undefined) {
|
|
961
|
-
symbol = market['symbol'];
|
|
962
|
-
}
|
|
963
|
-
if (price !== undefined) {
|
|
964
|
-
if (amount !== undefined) {
|
|
965
|
-
cost = price * amount;
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
return {
|
|
969
|
-
'id': id,
|
|
970
|
-
'order': orderId,
|
|
971
|
-
'info': trade,
|
|
972
|
-
'timestamp': timestamp,
|
|
973
|
-
'datetime': this.iso8601(timestamp),
|
|
974
|
-
'symbol': symbol,
|
|
975
|
-
'type': type,
|
|
976
|
-
'side': side,
|
|
977
|
-
'takerOrMaker': undefined,
|
|
978
|
-
'price': price,
|
|
979
|
-
'amount': amount,
|
|
980
|
-
'cost': cost,
|
|
981
|
-
'fee': fee,
|
|
982
|
-
};
|
|
983
|
-
}
|
|
984
|
-
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
985
|
-
/**
|
|
986
|
-
* @method
|
|
987
|
-
* @name kraken#watchOrders
|
|
988
|
-
* @see https://docs.kraken.com/websockets/#message-openOrders
|
|
989
|
-
* @description watches information on multiple orders made by the user
|
|
990
|
-
* @param {string} symbol unified market symbol of the market orders were made in
|
|
991
|
-
* @param {int} [since] the earliest time in ms to fetch orders for
|
|
992
|
-
* @param {int} [limit] the maximum number of orde structures to retrieve
|
|
993
|
-
* @param {object} [params] maximum number of orderic to the exchange API endpoint
|
|
994
|
-
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
|
|
995
|
-
*/
|
|
996
|
-
return await this.watchPrivate('openOrders', symbol, since, limit, params);
|
|
997
|
-
}
|
|
998
|
-
handleOrders(client, message, subscription = undefined) {
|
|
999
|
-
//
|
|
1000
|
-
// [
|
|
1001
|
-
// [
|
|
1002
|
-
// {
|
|
1003
|
-
// "OGTT3Y-C6I3P-XRI6HX": {
|
|
1004
|
-
// "cost": "0.00000",
|
|
1005
|
-
// "descr": {
|
|
1006
|
-
// "close": "",
|
|
1007
|
-
// "leverage": "0:1",
|
|
1008
|
-
// "order": "sell 10.00345345 XBT/EUR @ limit 34.50000 with 0:1 leverage",
|
|
1009
|
-
// "ordertype": "limit",
|
|
1010
|
-
// "pair": "XBT/EUR",
|
|
1011
|
-
// "price": "34.50000",
|
|
1012
|
-
// "price2": "0.00000",
|
|
1013
|
-
// "type": "sell"
|
|
1014
|
-
// },
|
|
1015
|
-
// "expiretm": "0.000000",
|
|
1016
|
-
// "fee": "0.00000",
|
|
1017
|
-
// "limitprice": "34.50000",
|
|
1018
|
-
// "misc": "",
|
|
1019
|
-
// "oflags": "fcib",
|
|
1020
|
-
// "opentm": "0.000000",
|
|
1021
|
-
// "price": "34.50000",
|
|
1022
|
-
// "refid": "OKIVMP-5GVZN-Z2D2UA",
|
|
1023
|
-
// "starttm": "0.000000",
|
|
1024
|
-
// "status": "open",
|
|
1025
|
-
// "stopprice": "0.000000",
|
|
1026
|
-
// "userref": 0,
|
|
1027
|
-
// "vol": "10.00345345",
|
|
1028
|
-
// "vol_exec": "0.00000000"
|
|
1029
|
-
// }
|
|
1030
|
-
// },
|
|
1031
|
-
// {
|
|
1032
|
-
// "OGTT3Y-C6I3P-XRI6HX": {
|
|
1033
|
-
// "cost": "0.00000",
|
|
1034
|
-
// "descr": {
|
|
1035
|
-
// "close": "",
|
|
1036
|
-
// "leverage": "0:1",
|
|
1037
|
-
// "order": "sell 0.00000010 XBT/EUR @ limit 5334.60000 with 0:1 leverage",
|
|
1038
|
-
// "ordertype": "limit",
|
|
1039
|
-
// "pair": "XBT/EUR",
|
|
1040
|
-
// "price": "5334.60000",
|
|
1041
|
-
// "price2": "0.00000",
|
|
1042
|
-
// "type": "sell"
|
|
1043
|
-
// },
|
|
1044
|
-
// "expiretm": "0.000000",
|
|
1045
|
-
// "fee": "0.00000",
|
|
1046
|
-
// "limitprice": "5334.60000",
|
|
1047
|
-
// "misc": "",
|
|
1048
|
-
// "oflags": "fcib",
|
|
1049
|
-
// "opentm": "0.000000",
|
|
1050
|
-
// "price": "5334.60000",
|
|
1051
|
-
// "refid": "OKIVMP-5GVZN-Z2D2UA",
|
|
1052
|
-
// "starttm": "0.000000",
|
|
1053
|
-
// "status": "open",
|
|
1054
|
-
// "stopprice": "0.000000",
|
|
1055
|
-
// "userref": 0,
|
|
1056
|
-
// "vol": "0.00000010",
|
|
1057
|
-
// "vol_exec": "0.00000000"
|
|
1058
|
-
// }
|
|
1059
|
-
// },
|
|
1060
|
-
// ],
|
|
1061
|
-
// "openOrders",
|
|
1062
|
-
// { "sequence": 234 }
|
|
1063
|
-
// ]
|
|
1064
|
-
//
|
|
1065
|
-
// status-change
|
|
1066
|
-
//
|
|
1067
|
-
// [
|
|
1068
|
-
// [
|
|
1069
|
-
// { "OGTT3Y-C6I3P-XRI6HX": { "status": "closed" }},
|
|
1070
|
-
// { "OGTT3Y-C6I3P-XRI6HX": { "status": "closed" }},
|
|
1071
|
-
// ],
|
|
1072
|
-
// "openOrders",
|
|
1073
|
-
// { "sequence": 59342 }
|
|
1074
|
-
// ]
|
|
1075
|
-
//
|
|
1076
|
-
const allOrders = this.safeValue(message, 0, []);
|
|
1077
|
-
const allOrdersLength = allOrders.length;
|
|
1078
|
-
if (allOrdersLength > 0) {
|
|
1079
|
-
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
1080
|
-
if (this.orders === undefined) {
|
|
1081
|
-
this.orders = new Cache.ArrayCacheBySymbolById(limit);
|
|
1082
|
-
}
|
|
1083
|
-
const stored = this.orders;
|
|
1084
|
-
const symbols = {};
|
|
1085
|
-
for (let i = 0; i < allOrders.length; i++) {
|
|
1086
|
-
const orders = this.safeValue(allOrders, i, {});
|
|
1087
|
-
const ids = Object.keys(orders);
|
|
1088
|
-
for (let j = 0; j < ids.length; j++) {
|
|
1089
|
-
const id = ids[j];
|
|
1090
|
-
const order = orders[id];
|
|
1091
|
-
const parsed = this.parseWsOrder(order);
|
|
1092
|
-
parsed['id'] = id;
|
|
1093
|
-
let symbol = undefined;
|
|
1094
|
-
const symbolsByOrderId = this.safeValue(this.options, 'symbolsByOrderId', {});
|
|
1095
|
-
if (parsed['symbol'] !== undefined) {
|
|
1096
|
-
symbol = parsed['symbol'];
|
|
1097
|
-
symbolsByOrderId[id] = symbol;
|
|
1098
|
-
this.options['symbolsByOrderId'] = symbolsByOrderId;
|
|
1099
|
-
}
|
|
1100
|
-
else {
|
|
1101
|
-
symbol = this.safeString(symbolsByOrderId, id);
|
|
1102
|
-
}
|
|
1103
|
-
const previousOrders = this.safeValue(stored.hashmap, symbol);
|
|
1104
|
-
const previousOrder = this.safeValue(previousOrders, id);
|
|
1105
|
-
let newOrder = parsed;
|
|
1106
|
-
if (previousOrder !== undefined) {
|
|
1107
|
-
const newRawOrder = this.extend(previousOrder['info'], newOrder['info']);
|
|
1108
|
-
newOrder = this.parseWsOrder(newRawOrder);
|
|
1109
|
-
newOrder['id'] = id;
|
|
1110
|
-
}
|
|
1111
|
-
const length = stored.length;
|
|
1112
|
-
if (length === limit && (previousOrder === undefined)) {
|
|
1113
|
-
const first = stored[0];
|
|
1114
|
-
if (first['id'] in symbolsByOrderId) {
|
|
1115
|
-
delete symbolsByOrderId[first['id']];
|
|
1116
|
-
}
|
|
1117
|
-
}
|
|
1118
|
-
stored.append(newOrder);
|
|
1119
|
-
symbols[symbol] = true;
|
|
1120
|
-
}
|
|
1121
|
-
}
|
|
1122
|
-
const name = 'openOrders';
|
|
1123
|
-
client.resolve(this.orders, name);
|
|
1124
|
-
const keys = Object.keys(symbols);
|
|
1125
|
-
for (let i = 0; i < keys.length; i++) {
|
|
1126
|
-
const messageHash = name + ':' + keys[i];
|
|
1127
|
-
client.resolve(this.orders, messageHash);
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
parseWsOrder(order, market = undefined) {
|
|
1132
|
-
//
|
|
1133
|
-
// createOrder
|
|
1134
|
-
// {
|
|
1135
|
-
// "avg_price": "0.00000",
|
|
1136
|
-
// "cost": "0.00000",
|
|
1137
|
-
// "descr": {
|
|
1138
|
-
// "close": null,
|
|
1139
|
-
// "leverage": null,
|
|
1140
|
-
// "order": "sell 0.01000000 ETH/USDT @ limit 1900.00000",
|
|
1141
|
-
// "ordertype": "limit",
|
|
1142
|
-
// "pair": "ETH/USDT",
|
|
1143
|
-
// "price": "1900.00000",
|
|
1144
|
-
// "price2": "0.00000",
|
|
1145
|
-
// "type": "sell"
|
|
1146
|
-
// },
|
|
1147
|
-
// "expiretm": null,
|
|
1148
|
-
// "fee": "0.00000",
|
|
1149
|
-
// "limitprice": "0.00000",
|
|
1150
|
-
// "misc": '',
|
|
1151
|
-
// "oflags": "fciq",
|
|
1152
|
-
// "opentm": "1667522705.757622",
|
|
1153
|
-
// "refid": null,
|
|
1154
|
-
// "starttm": null,
|
|
1155
|
-
// "status": "open",
|
|
1156
|
-
// "stopprice": "0.00000",
|
|
1157
|
-
// "timeinforce": "GTC",
|
|
1158
|
-
// "userref": 0,
|
|
1159
|
-
// "vol": "0.01000000",
|
|
1160
|
-
// "vol_exec": "0.00000000"
|
|
1161
|
-
// }
|
|
1162
|
-
//
|
|
1163
|
-
const description = this.safeValue(order, 'descr', {});
|
|
1164
|
-
const orderDescription = this.safeString(description, 'order');
|
|
1165
|
-
let side = undefined;
|
|
1166
|
-
let type = undefined;
|
|
1167
|
-
let wsName = undefined;
|
|
1168
|
-
let price = undefined;
|
|
1169
|
-
let amount = undefined;
|
|
1170
|
-
if (orderDescription !== undefined) {
|
|
1171
|
-
const parts = orderDescription.split(' ');
|
|
1172
|
-
side = this.safeString(parts, 0);
|
|
1173
|
-
amount = this.safeString(parts, 1);
|
|
1174
|
-
wsName = this.safeString(parts, 2);
|
|
1175
|
-
type = this.safeString(parts, 4);
|
|
1176
|
-
price = this.safeString(parts, 5);
|
|
1177
|
-
}
|
|
1178
|
-
side = this.safeString(description, 'type', side);
|
|
1179
|
-
type = this.safeString(description, 'ordertype', type);
|
|
1180
|
-
wsName = this.safeString(description, 'pair', wsName);
|
|
1181
|
-
market = this.safeValue(this.options['marketsByWsName'], wsName, market);
|
|
1182
|
-
let symbol = undefined;
|
|
1183
|
-
const timestamp = this.safeTimestamp(order, 'opentm');
|
|
1184
|
-
amount = this.safeString(order, 'vol', amount);
|
|
1185
|
-
const filled = this.safeString(order, 'vol_exec');
|
|
1186
|
-
let fee = undefined;
|
|
1187
|
-
const cost = this.safeString(order, 'cost');
|
|
1188
|
-
price = this.safeString(description, 'price', price);
|
|
1189
|
-
if ((price === undefined) || (Precise["default"].stringEq(price, '0.0'))) {
|
|
1190
|
-
price = this.safeString(description, 'price2');
|
|
1191
|
-
}
|
|
1192
|
-
if ((price === undefined) || (Precise["default"].stringEq(price, '0.0'))) {
|
|
1193
|
-
price = this.safeString(order, 'price', price);
|
|
1194
|
-
}
|
|
1195
|
-
const average = this.safeString2(order, 'avg_price', 'price');
|
|
1196
|
-
if (market !== undefined) {
|
|
1197
|
-
symbol = market['symbol'];
|
|
1198
|
-
if ('fee' in order) {
|
|
1199
|
-
const flags = order['oflags'];
|
|
1200
|
-
const feeCost = this.safeString(order, 'fee');
|
|
1201
|
-
fee = {
|
|
1202
|
-
'cost': feeCost,
|
|
1203
|
-
'rate': undefined,
|
|
1204
|
-
};
|
|
1205
|
-
if (flags.indexOf('fciq') >= 0) {
|
|
1206
|
-
fee['currency'] = market['quote'];
|
|
1207
|
-
}
|
|
1208
|
-
else if (flags.indexOf('fcib') >= 0) {
|
|
1209
|
-
fee['currency'] = market['base'];
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
const status = this.parseOrderStatus(this.safeString(order, 'status'));
|
|
1214
|
-
let id = this.safeString(order, 'id');
|
|
1215
|
-
if (id === undefined) {
|
|
1216
|
-
const txid = this.safeValue(order, 'txid');
|
|
1217
|
-
id = this.safeString(txid, 0);
|
|
1218
|
-
}
|
|
1219
|
-
const clientOrderId = this.safeString(order, 'userref');
|
|
1220
|
-
const rawTrades = this.safeValue(order, 'trades');
|
|
1221
|
-
let trades = undefined;
|
|
1222
|
-
if (rawTrades !== undefined) {
|
|
1223
|
-
trades = this.parseTrades(rawTrades, market, undefined, undefined, { 'order': id });
|
|
1224
|
-
}
|
|
1225
|
-
const stopPrice = this.safeNumber(order, 'stopprice');
|
|
1226
|
-
return this.safeOrder({
|
|
1227
|
-
'id': id,
|
|
1228
|
-
'clientOrderId': clientOrderId,
|
|
1229
|
-
'info': order,
|
|
1230
|
-
'timestamp': timestamp,
|
|
1231
|
-
'datetime': this.iso8601(timestamp),
|
|
1232
|
-
'lastTradeTimestamp': undefined,
|
|
1233
|
-
'status': status,
|
|
1234
|
-
'symbol': symbol,
|
|
1235
|
-
'type': type,
|
|
1236
|
-
'timeInForce': undefined,
|
|
1237
|
-
'postOnly': undefined,
|
|
1238
|
-
'side': side,
|
|
1239
|
-
'price': price,
|
|
1240
|
-
'stopPrice': stopPrice,
|
|
1241
|
-
'triggerPrice': stopPrice,
|
|
1242
|
-
'cost': cost,
|
|
1243
|
-
'amount': amount,
|
|
1244
|
-
'filled': filled,
|
|
1245
|
-
'average': average,
|
|
1246
|
-
'remaining': undefined,
|
|
1247
|
-
'fee': fee,
|
|
1248
|
-
'trades': trades,
|
|
1249
|
-
});
|
|
1250
|
-
}
|
|
1251
|
-
handleSubscriptionStatus(client, message) {
|
|
1252
|
-
//
|
|
1253
|
-
// public
|
|
1254
|
-
//
|
|
1255
|
-
// {
|
|
1256
|
-
// "channelID": 210,
|
|
1257
|
-
// "channelName": "book-10",
|
|
1258
|
-
// "event": "subscriptionStatus",
|
|
1259
|
-
// "reqid": 1574146735269,
|
|
1260
|
-
// "pair": "ETH/XBT",
|
|
1261
|
-
// "status": "subscribed",
|
|
1262
|
-
// "subscription": { depth: 10, name: "book" }
|
|
1263
|
-
// }
|
|
1264
|
-
//
|
|
1265
|
-
// private
|
|
1266
|
-
//
|
|
1267
|
-
// {
|
|
1268
|
-
// "channelName": "openOrders",
|
|
1269
|
-
// "event": "subscriptionStatus",
|
|
1270
|
-
// "reqid": 1,
|
|
1271
|
-
// "status": "subscribed",
|
|
1272
|
-
// "subscription": { maxratecount: 125, name: "openOrders" }
|
|
1273
|
-
// }
|
|
1274
|
-
//
|
|
1275
|
-
const channelId = this.safeString(message, 'channelID');
|
|
1276
|
-
if (channelId !== undefined) {
|
|
1277
|
-
client.subscriptions[channelId] = message;
|
|
1278
|
-
}
|
|
1279
|
-
// const requestId = this.safeString (message, "reqid");
|
|
1280
|
-
// if (requestId in client.futures) {
|
|
1281
|
-
// delete client.futures[requestId];
|
|
1282
|
-
// }
|
|
1283
|
-
}
|
|
1284
|
-
handleErrorMessage(client, message) {
|
|
1285
|
-
//
|
|
1286
|
-
// {
|
|
1287
|
-
// "errorMessage": "Currency pair not in ISO 4217-A3 format foobar",
|
|
1288
|
-
// "event": "subscriptionStatus",
|
|
1289
|
-
// "pair": "foobar",
|
|
1290
|
-
// "reqid": 1574146735269,
|
|
1291
|
-
// "status": "error",
|
|
1292
|
-
// "subscription": { name: "ticker" }
|
|
1293
|
-
// }
|
|
1294
|
-
//
|
|
1295
|
-
const errorMessage = this.safeValue(message, 'errorMessage');
|
|
1296
|
-
if (errorMessage !== undefined) {
|
|
1297
|
-
const requestId = this.safeValue(message, 'reqid');
|
|
1298
|
-
if (requestId !== undefined) {
|
|
1299
|
-
const broad = this.exceptions['ws']['broad'];
|
|
1300
|
-
const broadKey = this.findBroadlyMatchedKey(broad, errorMessage);
|
|
1301
|
-
let exception = undefined;
|
|
1302
|
-
if (broadKey === undefined) {
|
|
1303
|
-
exception = new errors.ExchangeError(errorMessage);
|
|
1304
|
-
}
|
|
1305
|
-
else {
|
|
1306
|
-
exception = new broad[broadKey](errorMessage);
|
|
1307
|
-
}
|
|
1308
|
-
client.reject(exception, requestId);
|
|
1309
|
-
return false;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
return true;
|
|
1313
|
-
}
|
|
1314
|
-
handleMessage(client, message) {
|
|
1315
|
-
if (Array.isArray(message)) {
|
|
1316
|
-
const channelId = this.safeString(message, 0);
|
|
1317
|
-
const subscription = this.safeValue(client.subscriptions, channelId, {});
|
|
1318
|
-
const info = this.safeValue(subscription, 'subscription', {});
|
|
1319
|
-
const messageLength = message.length;
|
|
1320
|
-
const channelName = this.safeString(message, messageLength - 2);
|
|
1321
|
-
const name = this.safeString(info, 'name');
|
|
1322
|
-
const methods = {
|
|
1323
|
-
// public
|
|
1324
|
-
'book': this.handleOrderBook,
|
|
1325
|
-
'ohlc': this.handleOHLCV,
|
|
1326
|
-
'ticker': this.handleTicker,
|
|
1327
|
-
'trade': this.handleTrades,
|
|
1328
|
-
// private
|
|
1329
|
-
'openOrders': this.handleOrders,
|
|
1330
|
-
'ownTrades': this.handleMyTrades,
|
|
1331
|
-
};
|
|
1332
|
-
const method = this.safeValue2(methods, name, channelName);
|
|
1333
|
-
if (method === undefined) {
|
|
1334
|
-
return message;
|
|
1335
|
-
}
|
|
1336
|
-
else {
|
|
1337
|
-
return method.call(this, client, message, subscription);
|
|
1338
|
-
}
|
|
1339
|
-
}
|
|
1340
|
-
else {
|
|
1341
|
-
if (this.handleErrorMessage(client, message)) {
|
|
1342
|
-
const event = this.safeString(message, 'event');
|
|
1343
|
-
const methods = {
|
|
1344
|
-
'heartbeat': this.handleHeartbeat,
|
|
1345
|
-
'systemStatus': this.handleSystemStatus,
|
|
1346
|
-
'subscriptionStatus': this.handleSubscriptionStatus,
|
|
1347
|
-
'addOrderStatus': this.handleCreateEditOrder,
|
|
1348
|
-
'editOrderStatus': this.handleCreateEditOrder,
|
|
1349
|
-
'cancelOrderStatus': this.handleCancelOrder,
|
|
1350
|
-
'cancelAllStatus': this.handleCancelAllOrders,
|
|
1351
|
-
};
|
|
1352
|
-
const method = this.safeValue(methods, event);
|
|
1353
|
-
if (method === undefined) {
|
|
1354
|
-
return message;
|
|
1355
|
-
}
|
|
1356
|
-
else {
|
|
1357
|
-
return method.call(this, client, message);
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
}
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
module.exports = kraken;
|