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
|
@@ -0,0 +1,882 @@
|
|
|
1
|
+
// ----------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
|
4
|
+
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
|
5
|
+
// EDIT THE CORRESPONDENT .ts FILE INSTEAD
|
|
6
|
+
|
|
7
|
+
import lbankRest from '../lbank.js';
|
|
8
|
+
import { ExchangeError } from '../base/errors.js';
|
|
9
|
+
import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById } from '../base/ws/Cache.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export default class lbank extends lbankRest {
|
|
12
|
+
describe() {
|
|
13
|
+
return this.deepExtend(super.describe(), {
|
|
14
|
+
'has': {
|
|
15
|
+
'ws': true,
|
|
16
|
+
'fetchOHLCVWs': true,
|
|
17
|
+
'fetchOrderBookWs': true,
|
|
18
|
+
'fetchTickerWs': true,
|
|
19
|
+
'fetchTradesWs': true,
|
|
20
|
+
'watchBalance': false,
|
|
21
|
+
'watchTicker': true,
|
|
22
|
+
'watchTickers': false,
|
|
23
|
+
'watchTrades': true,
|
|
24
|
+
'watchMyTrades': false,
|
|
25
|
+
'watchOrders': true,
|
|
26
|
+
'watchOrderBook': true,
|
|
27
|
+
'watchOHLCV': true,
|
|
28
|
+
},
|
|
29
|
+
'urls': {
|
|
30
|
+
'api': {
|
|
31
|
+
'ws': 'wss://www.lbkex.net/ws/V2/',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
'options': {
|
|
35
|
+
'watchOHLCV': {
|
|
36
|
+
'timeframes': {
|
|
37
|
+
'1m': '1min',
|
|
38
|
+
'5m': '5min',
|
|
39
|
+
'15m': '15min',
|
|
40
|
+
'30m': '30min',
|
|
41
|
+
'1h': '1hr',
|
|
42
|
+
'4h': '4hr',
|
|
43
|
+
'1d': 'day',
|
|
44
|
+
'1w': 'week',
|
|
45
|
+
'1M': 'month',
|
|
46
|
+
'1y': 'year',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
'streaming': {},
|
|
51
|
+
'exceptions': {},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
requestId() {
|
|
55
|
+
const previousValue = this.safeInteger(this.options, 'requestId', 0);
|
|
56
|
+
const newValue = this.sum(previousValue, 1);
|
|
57
|
+
this.options['requestId'] = newValue;
|
|
58
|
+
return newValue;
|
|
59
|
+
}
|
|
60
|
+
async fetchOHLCVWs(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
61
|
+
/**
|
|
62
|
+
* @method
|
|
63
|
+
* @name lbank#fetchOHLCVWs
|
|
64
|
+
* @see https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
|
|
65
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
66
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
67
|
+
* @param {string} timeframe the length of time each candle represents
|
|
68
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
69
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
70
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
71
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
72
|
+
*/
|
|
73
|
+
await this.loadMarkets();
|
|
74
|
+
const market = this.market(symbol);
|
|
75
|
+
const url = this.urls['api']['ws'];
|
|
76
|
+
const watchOHLCVOptions = this.safeValue(this.options, 'watchOHLCV', {});
|
|
77
|
+
const timeframes = this.safeValue(watchOHLCVOptions, 'timeframes', {});
|
|
78
|
+
const timeframeId = this.safeString(timeframes, timeframe, timeframe);
|
|
79
|
+
const messageHash = 'fetchOHLCV:' + market['symbol'] + ':' + timeframeId;
|
|
80
|
+
const message = {
|
|
81
|
+
'action': 'request',
|
|
82
|
+
'request': 'kbar',
|
|
83
|
+
'kbar': timeframeId,
|
|
84
|
+
'pair': market['id'],
|
|
85
|
+
};
|
|
86
|
+
if (since !== undefined) {
|
|
87
|
+
message['start'] = this.parseToInt(Math.floor(since / 1000));
|
|
88
|
+
}
|
|
89
|
+
if (limit !== undefined) {
|
|
90
|
+
message['size'] = limit;
|
|
91
|
+
}
|
|
92
|
+
const request = this.deepExtend(message, params);
|
|
93
|
+
const requestId = this.requestId();
|
|
94
|
+
return await this.watch(url, messageHash, request, requestId, request);
|
|
95
|
+
}
|
|
96
|
+
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
97
|
+
/**
|
|
98
|
+
* @method
|
|
99
|
+
* @name lbank#watchOHLCV
|
|
100
|
+
* @see https://www.lbank.com/en-US/docs/index.html#subscription-of-k-line-data
|
|
101
|
+
* @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
|
102
|
+
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
|
|
103
|
+
* @param {string} timeframe the length of time each candle represents
|
|
104
|
+
* @param {int} [since] timestamp in ms of the earliest candle to fetch
|
|
105
|
+
* @param {int} [limit] the maximum amount of candles to fetch
|
|
106
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
107
|
+
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
|
|
108
|
+
*/
|
|
109
|
+
await this.loadMarkets();
|
|
110
|
+
const market = this.market(symbol);
|
|
111
|
+
const watchOHLCVOptions = this.safeValue(this.options, 'watchOHLCV', {});
|
|
112
|
+
const timeframes = this.safeValue(watchOHLCVOptions, 'timeframes', {});
|
|
113
|
+
const timeframeId = this.safeString(timeframes, timeframe, timeframe);
|
|
114
|
+
const messageHash = 'ohlcv:' + market['symbol'] + ':' + timeframeId;
|
|
115
|
+
const url = this.urls['api']['ws'];
|
|
116
|
+
const subscribe = {
|
|
117
|
+
'action': 'subscribe',
|
|
118
|
+
'subscribe': 'kbar',
|
|
119
|
+
'kbar': timeframeId,
|
|
120
|
+
'pair': market['id'],
|
|
121
|
+
};
|
|
122
|
+
const request = this.deepExtend(subscribe, params);
|
|
123
|
+
const ohlcv = await this.watch(url, messageHash, request, messageHash);
|
|
124
|
+
if (this.newUpdates) {
|
|
125
|
+
limit = ohlcv.getLimit(symbol, limit);
|
|
126
|
+
}
|
|
127
|
+
return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
|
|
128
|
+
}
|
|
129
|
+
handleOHLCV(client, message) {
|
|
130
|
+
//
|
|
131
|
+
// request
|
|
132
|
+
// {
|
|
133
|
+
// "records":[
|
|
134
|
+
// [
|
|
135
|
+
// 1705364400,
|
|
136
|
+
// 42614,
|
|
137
|
+
// 42624.57,
|
|
138
|
+
// 42532.15,
|
|
139
|
+
// 42537.43,
|
|
140
|
+
// 13.2615,
|
|
141
|
+
// 564568.931565,
|
|
142
|
+
// 433
|
|
143
|
+
// ]
|
|
144
|
+
// ],
|
|
145
|
+
// "columns":[
|
|
146
|
+
// "timestamp",
|
|
147
|
+
// "open",
|
|
148
|
+
// "high",
|
|
149
|
+
// "low",
|
|
150
|
+
// "close",
|
|
151
|
+
// "volume",
|
|
152
|
+
// "turnover",
|
|
153
|
+
// "count"
|
|
154
|
+
// ],
|
|
155
|
+
// "SERVER":"V2",
|
|
156
|
+
// "count":1,
|
|
157
|
+
// "kbar":"5min",
|
|
158
|
+
// "type":"kbar",
|
|
159
|
+
// "pair":"btc_usdt",
|
|
160
|
+
// "TS":"2024-01-16T08:29:41.718"
|
|
161
|
+
// }
|
|
162
|
+
// subscribe
|
|
163
|
+
// {
|
|
164
|
+
// SERVER: 'V2',
|
|
165
|
+
// kbar: {
|
|
166
|
+
// a: 26415.891476,
|
|
167
|
+
// c: 19315.51,
|
|
168
|
+
// t: '2022-10-02T12:44:00.000',
|
|
169
|
+
// v: 1.3676,
|
|
170
|
+
// h: 19316.66,
|
|
171
|
+
// slot: '1min',
|
|
172
|
+
// l: 19315.51,
|
|
173
|
+
// n: 1,
|
|
174
|
+
// o: 19316.66
|
|
175
|
+
// },
|
|
176
|
+
// type: 'kbar',
|
|
177
|
+
// pair: 'btc_usdt',
|
|
178
|
+
// TS: '2022-10-02T12:44:15.864'
|
|
179
|
+
// }
|
|
180
|
+
//
|
|
181
|
+
const marketId = this.safeString(message, 'pair');
|
|
182
|
+
const symbol = this.safeSymbol(marketId, undefined, '_');
|
|
183
|
+
const watchOHLCVOptions = this.safeValue(this.options, 'watchOHLCV', {});
|
|
184
|
+
const timeframes = this.safeValue(watchOHLCVOptions, 'timeframes', {});
|
|
185
|
+
const records = this.safeValue(message, 'records');
|
|
186
|
+
if (records !== undefined) { // from request
|
|
187
|
+
const rawOHLCV = this.safeValue(records, 0, []);
|
|
188
|
+
const parsed = [
|
|
189
|
+
this.safeInteger(rawOHLCV, 0),
|
|
190
|
+
this.safeNumber(rawOHLCV, 1),
|
|
191
|
+
this.safeNumber(rawOHLCV, 2),
|
|
192
|
+
this.safeNumber(rawOHLCV, 3),
|
|
193
|
+
this.safeNumber(rawOHLCV, 4),
|
|
194
|
+
this.safeNumber(rawOHLCV, 5),
|
|
195
|
+
];
|
|
196
|
+
const timeframeId = this.safeString(message, 'kbar');
|
|
197
|
+
const timeframe = this.findTimeframe(timeframeId, timeframes);
|
|
198
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
199
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
200
|
+
if (stored === undefined) {
|
|
201
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
202
|
+
stored = new ArrayCacheByTimestamp(limit);
|
|
203
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
204
|
+
}
|
|
205
|
+
stored.append(parsed);
|
|
206
|
+
const messageHash = 'fetchOHLCV:' + symbol + ':' + timeframeId;
|
|
207
|
+
client.resolve(stored, messageHash);
|
|
208
|
+
}
|
|
209
|
+
else { // from subscription
|
|
210
|
+
const rawOHLCV = this.safeValue(message, 'kbar', {});
|
|
211
|
+
const timeframeId = this.safeString(rawOHLCV, 'slot');
|
|
212
|
+
const datetime = this.safeString(rawOHLCV, 't');
|
|
213
|
+
const parsed = [
|
|
214
|
+
this.parse8601(datetime),
|
|
215
|
+
this.safeNumber(rawOHLCV, 'o'),
|
|
216
|
+
this.safeNumber(rawOHLCV, 'h'),
|
|
217
|
+
this.safeNumber(rawOHLCV, 'l'),
|
|
218
|
+
this.safeNumber(rawOHLCV, 'c'),
|
|
219
|
+
this.safeNumber(rawOHLCV, 'v'),
|
|
220
|
+
];
|
|
221
|
+
const timeframe = this.findTimeframe(timeframeId, timeframes);
|
|
222
|
+
this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
|
|
223
|
+
let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
|
|
224
|
+
if (stored === undefined) {
|
|
225
|
+
const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
|
|
226
|
+
stored = new ArrayCacheByTimestamp(limit);
|
|
227
|
+
this.ohlcvs[symbol][timeframe] = stored;
|
|
228
|
+
}
|
|
229
|
+
stored.append(parsed);
|
|
230
|
+
const messageHash = 'ohlcv:' + symbol + ':' + timeframeId;
|
|
231
|
+
client.resolve(stored, messageHash);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async fetchTickerWs(symbol, params = {}) {
|
|
235
|
+
/**
|
|
236
|
+
* @method
|
|
237
|
+
* @name lbank#fetchTickerWs
|
|
238
|
+
* @see https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
|
|
239
|
+
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
240
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
241
|
+
* @param {object} [params] extra parameters specific to the cex api endpoint
|
|
242
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
243
|
+
*/
|
|
244
|
+
await this.loadMarkets();
|
|
245
|
+
const market = this.market(symbol);
|
|
246
|
+
const url = this.urls['api']['ws'];
|
|
247
|
+
const messageHash = 'fetchTicker:' + market['symbol'];
|
|
248
|
+
const message = {
|
|
249
|
+
'action': 'request',
|
|
250
|
+
'request': 'tick',
|
|
251
|
+
'pair': market['id'],
|
|
252
|
+
};
|
|
253
|
+
const request = this.deepExtend(message, params);
|
|
254
|
+
const requestId = this.requestId();
|
|
255
|
+
return await this.watch(url, messageHash, request, requestId, request);
|
|
256
|
+
}
|
|
257
|
+
async watchTicker(symbol, params = {}) {
|
|
258
|
+
/**
|
|
259
|
+
* @method
|
|
260
|
+
* @name lbank#watchTicker
|
|
261
|
+
* @see https://www.lbank.com/en-US/docs/index.html#market
|
|
262
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
263
|
+
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
264
|
+
* @param {object} params extra parameters specific to the lbank api endpoint
|
|
265
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/en/latest/manual.html#ticker-structure}
|
|
266
|
+
*/
|
|
267
|
+
await this.loadMarkets();
|
|
268
|
+
const market = this.market(symbol);
|
|
269
|
+
const url = this.urls['api']['ws'];
|
|
270
|
+
const messageHash = 'ticker:' + market['symbol'];
|
|
271
|
+
const message = {
|
|
272
|
+
'action': 'subscribe',
|
|
273
|
+
'subscribe': 'tick',
|
|
274
|
+
'pair': market['id'],
|
|
275
|
+
};
|
|
276
|
+
const request = this.deepExtend(message, params);
|
|
277
|
+
return await this.watch(url, messageHash, request, messageHash, request);
|
|
278
|
+
}
|
|
279
|
+
handleTicker(client, message) {
|
|
280
|
+
//
|
|
281
|
+
// {
|
|
282
|
+
// "tick":{
|
|
283
|
+
// "to_cny":76643.5,
|
|
284
|
+
// "high":0.02719761,
|
|
285
|
+
// "vol":497529.7686,
|
|
286
|
+
// "low":0.02603071,
|
|
287
|
+
// "change":2.54,
|
|
288
|
+
// "usd":299.12,
|
|
289
|
+
// "to_usd":11083.66,
|
|
290
|
+
// "dir":"sell",
|
|
291
|
+
// "turnover":13224.0186,
|
|
292
|
+
// "latest":0.02698749,
|
|
293
|
+
// "cny":2068.41
|
|
294
|
+
// },
|
|
295
|
+
// "type":"tick",
|
|
296
|
+
// "pair":"eth_btc",
|
|
297
|
+
// "SERVER":"V2",
|
|
298
|
+
// "TS":"2019-07-01T11:33:55.188"
|
|
299
|
+
// }
|
|
300
|
+
//
|
|
301
|
+
const marketId = this.safeString(message, 'pair');
|
|
302
|
+
const symbol = this.safeSymbol(marketId);
|
|
303
|
+
const market = this.safeMarket(marketId);
|
|
304
|
+
const parsedTicker = this.parseWsTicker(message, market);
|
|
305
|
+
this.tickers[symbol] = parsedTicker;
|
|
306
|
+
let messageHash = 'ticker:' + symbol;
|
|
307
|
+
client.resolve(parsedTicker, messageHash);
|
|
308
|
+
messageHash = 'fetchTicker:' + symbol;
|
|
309
|
+
client.resolve(parsedTicker, messageHash);
|
|
310
|
+
}
|
|
311
|
+
parseWsTicker(ticker, market = undefined) {
|
|
312
|
+
//
|
|
313
|
+
// {
|
|
314
|
+
// "tick":{
|
|
315
|
+
// "to_cny":76643.5,
|
|
316
|
+
// "high":0.02719761,
|
|
317
|
+
// "vol":497529.7686,
|
|
318
|
+
// "low":0.02603071,
|
|
319
|
+
// "change":2.54,
|
|
320
|
+
// "usd":299.12,
|
|
321
|
+
// "to_usd":11083.66,
|
|
322
|
+
// "dir":"sell",
|
|
323
|
+
// "turnover":13224.0186,
|
|
324
|
+
// "latest":0.02698749,
|
|
325
|
+
// "cny":2068.41
|
|
326
|
+
// },
|
|
327
|
+
// "type":"tick",
|
|
328
|
+
// "pair":"eth_btc",
|
|
329
|
+
// "SERVER":"V2",
|
|
330
|
+
// "TS":"2019-07-01T11:33:55.188"
|
|
331
|
+
// }
|
|
332
|
+
//
|
|
333
|
+
const marketId = this.safeString(ticker, 'pair');
|
|
334
|
+
const symbol = this.safeSymbol(marketId, market);
|
|
335
|
+
const datetime = this.safeString(ticker, 'TS');
|
|
336
|
+
const tickerData = this.safeValue(ticker, 'tick');
|
|
337
|
+
return this.safeTicker({
|
|
338
|
+
'symbol': symbol,
|
|
339
|
+
'timestamp': this.parse8601(datetime),
|
|
340
|
+
'datetime': datetime,
|
|
341
|
+
'high': this.safeString(tickerData, 'high'),
|
|
342
|
+
'low': this.safeString(tickerData, 'low'),
|
|
343
|
+
'bid': undefined,
|
|
344
|
+
'bidVolume': undefined,
|
|
345
|
+
'ask': undefined,
|
|
346
|
+
'askVolume': undefined,
|
|
347
|
+
'vwap': undefined,
|
|
348
|
+
'open': undefined,
|
|
349
|
+
'close': undefined,
|
|
350
|
+
'last': this.safeString(tickerData, 'latest'),
|
|
351
|
+
'previousClose': undefined,
|
|
352
|
+
'change': undefined,
|
|
353
|
+
'percentage': this.safeString(tickerData, 'change'),
|
|
354
|
+
'average': undefined,
|
|
355
|
+
'baseVolume': this.safeString(tickerData, 'vol'),
|
|
356
|
+
'quoteVolume': this.safeString(tickerData, 'turnover'),
|
|
357
|
+
'info': ticker,
|
|
358
|
+
}, market);
|
|
359
|
+
}
|
|
360
|
+
async fetchTradesWs(symbol, since = undefined, limit = undefined, params = {}) {
|
|
361
|
+
/**
|
|
362
|
+
* @method
|
|
363
|
+
* @name lbank#fetchTradesWs
|
|
364
|
+
* @description get the list of most recent trades for a particular symbol
|
|
365
|
+
* @see https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
|
|
366
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
367
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
368
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
369
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
370
|
+
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
371
|
+
*/
|
|
372
|
+
await this.loadMarkets();
|
|
373
|
+
const market = this.market(symbol);
|
|
374
|
+
const url = this.urls['api']['ws'];
|
|
375
|
+
const messageHash = 'fetchTrades:' + market['symbol'];
|
|
376
|
+
if (limit === undefined) {
|
|
377
|
+
limit = 10;
|
|
378
|
+
}
|
|
379
|
+
const message = {
|
|
380
|
+
'action': 'request',
|
|
381
|
+
'request': 'trade',
|
|
382
|
+
'pair': market['id'],
|
|
383
|
+
'size': limit,
|
|
384
|
+
};
|
|
385
|
+
const request = this.deepExtend(message, params);
|
|
386
|
+
const requestId = this.requestId();
|
|
387
|
+
return await this.watch(url, messageHash, request, requestId, request);
|
|
388
|
+
}
|
|
389
|
+
async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
390
|
+
/**
|
|
391
|
+
* @method
|
|
392
|
+
* @name lbank#watchTrades
|
|
393
|
+
* @see https://www.lbank.com/en-US/docs/index.html#trade-record
|
|
394
|
+
* @description get the list of most recent trades for a particular symbol
|
|
395
|
+
* @param {string} symbol unified symbol of the market to fetch trades for
|
|
396
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
397
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
398
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
399
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
400
|
+
*/
|
|
401
|
+
await this.loadMarkets();
|
|
402
|
+
const market = this.market(symbol);
|
|
403
|
+
const url = this.urls['api']['ws'];
|
|
404
|
+
const messageHash = 'trades:' + market['symbol'];
|
|
405
|
+
const message = {
|
|
406
|
+
'action': 'subscribe',
|
|
407
|
+
'subscribe': 'trade',
|
|
408
|
+
'pair': market['id'],
|
|
409
|
+
};
|
|
410
|
+
const request = this.deepExtend(message, params);
|
|
411
|
+
const trades = await this.watch(url, messageHash, request, messageHash, request);
|
|
412
|
+
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
413
|
+
}
|
|
414
|
+
handleTrades(client, message) {
|
|
415
|
+
//
|
|
416
|
+
// request
|
|
417
|
+
// {
|
|
418
|
+
// columns: [ 'timestamp', 'price', 'volume', 'direction' ],
|
|
419
|
+
// SERVER: 'V2',
|
|
420
|
+
// count: 100,
|
|
421
|
+
// trades: [],
|
|
422
|
+
// type: 'trade',
|
|
423
|
+
// pair: 'btc_usdt',
|
|
424
|
+
// TS: '2024-01-16T08:48:24.470'
|
|
425
|
+
// }
|
|
426
|
+
// subscribe
|
|
427
|
+
// {
|
|
428
|
+
// "trade":{
|
|
429
|
+
// "volume":6.3607,
|
|
430
|
+
// "amount":77148.9303,
|
|
431
|
+
// "price":12129,
|
|
432
|
+
// "direction":"sell",
|
|
433
|
+
// "TS":"2019-06-28T19:55:49.460"
|
|
434
|
+
// },
|
|
435
|
+
// "type":"trade",
|
|
436
|
+
// "pair":"btc_usdt",
|
|
437
|
+
// "SERVER":"V2",
|
|
438
|
+
// "TS":"2019-06-28T19:55:49.466"
|
|
439
|
+
// }
|
|
440
|
+
//
|
|
441
|
+
const marketId = this.safeString(message, 'pair');
|
|
442
|
+
const symbol = this.safeSymbol(marketId);
|
|
443
|
+
const market = this.safeMarket(marketId);
|
|
444
|
+
let stored = this.safeValue(this.trades, symbol);
|
|
445
|
+
if (stored === undefined) {
|
|
446
|
+
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
447
|
+
stored = new ArrayCache(limit);
|
|
448
|
+
this.trades[symbol] = stored;
|
|
449
|
+
}
|
|
450
|
+
const rawTrade = this.safeValue(message, 'trade');
|
|
451
|
+
const rawTrades = this.safeValue(message, 'trades', [rawTrade]);
|
|
452
|
+
for (let i = 0; i < rawTrades.length; i++) {
|
|
453
|
+
const trade = this.parseWsTrade(rawTrades[i], market);
|
|
454
|
+
trade['symbol'] = symbol;
|
|
455
|
+
stored.append(trade);
|
|
456
|
+
}
|
|
457
|
+
this.trades[symbol] = stored;
|
|
458
|
+
let messageHash = 'trades:' + symbol;
|
|
459
|
+
client.resolve(this.trades[symbol], messageHash);
|
|
460
|
+
messageHash = 'fetchTrades:' + symbol;
|
|
461
|
+
client.resolve(this.trades[symbol], messageHash);
|
|
462
|
+
}
|
|
463
|
+
parseWsTrade(trade, market = undefined) {
|
|
464
|
+
//
|
|
465
|
+
// request
|
|
466
|
+
// [ 'timestamp', 'price', 'volume', 'direction' ]
|
|
467
|
+
// subscribe
|
|
468
|
+
// {
|
|
469
|
+
// "volume":6.3607,
|
|
470
|
+
// "amount":77148.9303,
|
|
471
|
+
// "price":12129,
|
|
472
|
+
// "direction":"sell",
|
|
473
|
+
// "TS":"2019-06-28T19:55:49.460"
|
|
474
|
+
// }
|
|
475
|
+
//
|
|
476
|
+
let timestamp = this.safeInteger(trade, 0);
|
|
477
|
+
const datetime = (timestamp !== undefined) ? (this.iso8601(timestamp)) : (this.safeString(trade, 'TS'));
|
|
478
|
+
if (timestamp === undefined) {
|
|
479
|
+
timestamp = this.parse8601(datetime);
|
|
480
|
+
}
|
|
481
|
+
return this.safeTrade({
|
|
482
|
+
'timestamp': timestamp,
|
|
483
|
+
'datetime': datetime,
|
|
484
|
+
'symbol': undefined,
|
|
485
|
+
'id': undefined,
|
|
486
|
+
'order': undefined,
|
|
487
|
+
'type': undefined,
|
|
488
|
+
'takerOrMaker': undefined,
|
|
489
|
+
'side': this.safeString2(trade, 'direction', 3),
|
|
490
|
+
'price': this.safeString2(trade, 'price', 1),
|
|
491
|
+
'amount': this.safeString2(trade, 'volume', 2),
|
|
492
|
+
'cost': this.safeString(trade, 'amount'),
|
|
493
|
+
'fee': undefined,
|
|
494
|
+
'info': trade,
|
|
495
|
+
}, market);
|
|
496
|
+
}
|
|
497
|
+
async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
498
|
+
/**
|
|
499
|
+
* @method
|
|
500
|
+
* @name lbank#watchOrders
|
|
501
|
+
* @see https://github.com/LBank-exchange/lbank-official-api-docs/blob/master/API-For-Spot-EN/WebSocket%20API(Asset%20%26%20Order).md#websocketsubscribeunsubscribe
|
|
502
|
+
* @description get the list of trades associated with the user
|
|
503
|
+
* @param {string} [symbol] unified symbol of the market to fetch trades for
|
|
504
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
505
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
506
|
+
* @param {object} params extra parameters specific to the lbank api endpoint
|
|
507
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
508
|
+
*/
|
|
509
|
+
await this.loadMarkets();
|
|
510
|
+
const key = await this.authenticate(params);
|
|
511
|
+
const url = this.urls['api']['ws'];
|
|
512
|
+
let messageHash = undefined;
|
|
513
|
+
let pair = 'all';
|
|
514
|
+
if (symbol === undefined) {
|
|
515
|
+
messageHash = 'orders:all';
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
const market = this.market(symbol);
|
|
519
|
+
symbol = this.symbol(symbol);
|
|
520
|
+
messageHash = 'orders:' + market['symbol'];
|
|
521
|
+
pair = market['id'];
|
|
522
|
+
}
|
|
523
|
+
const message = {
|
|
524
|
+
'action': 'subscribe',
|
|
525
|
+
'subscribe': 'orderUpdate',
|
|
526
|
+
'subscribeKey': key,
|
|
527
|
+
'pair': pair,
|
|
528
|
+
};
|
|
529
|
+
const request = this.deepExtend(message, params);
|
|
530
|
+
const orders = await this.watch(url, messageHash, request, messageHash, request);
|
|
531
|
+
return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
|
|
532
|
+
}
|
|
533
|
+
handleOrders(client, message) {
|
|
534
|
+
//
|
|
535
|
+
// {
|
|
536
|
+
// "orderUpdate":{
|
|
537
|
+
// "amount":"0.003",
|
|
538
|
+
// "orderStatus":2,
|
|
539
|
+
// "price":"0.02455211",
|
|
540
|
+
// "role":"maker",
|
|
541
|
+
// "updateTime":1561704577786,
|
|
542
|
+
// "uuid":"d0db191d-xxxxx-4418-xxxxx-fbb1xxxx2ea9",
|
|
543
|
+
// "txUuid":"da88f354d5xxxxxxa12128aa5bdcb3",
|
|
544
|
+
// "volumePrice":"0.00007365633"
|
|
545
|
+
// },
|
|
546
|
+
// "pair":"eth_btc",
|
|
547
|
+
// "type":"orderUpdate",
|
|
548
|
+
// "SERVER":"V2",
|
|
549
|
+
// "TS":"2019-06-28T14:49:37.816"
|
|
550
|
+
// }
|
|
551
|
+
//
|
|
552
|
+
const marketId = this.safeString(message, 'pair');
|
|
553
|
+
const symbol = this.safeSymbol(marketId, undefined, '_');
|
|
554
|
+
let myOrders = undefined;
|
|
555
|
+
if (this.orders === undefined) {
|
|
556
|
+
const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
|
|
557
|
+
myOrders = new ArrayCacheBySymbolById(limit);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
myOrders = this.orders;
|
|
561
|
+
}
|
|
562
|
+
const order = this.parseWsOrder(message);
|
|
563
|
+
myOrders.append(order);
|
|
564
|
+
this.orders = myOrders;
|
|
565
|
+
client.resolve(myOrders, 'orders');
|
|
566
|
+
const messageHash = 'orders:' + symbol;
|
|
567
|
+
client.resolve(myOrders, messageHash);
|
|
568
|
+
}
|
|
569
|
+
parseWsOrder(order, market = undefined) {
|
|
570
|
+
//
|
|
571
|
+
// {
|
|
572
|
+
// "orderUpdate":{
|
|
573
|
+
// "amount":"0.003",
|
|
574
|
+
// "orderStatus":2,
|
|
575
|
+
// "price":"0.02455211",
|
|
576
|
+
// "role":"maker",
|
|
577
|
+
// "updateTime":1561704577786,
|
|
578
|
+
// "uuid":"d0db191d-xxxxx-4418-xxxxx-fbb1xxxx2ea9",
|
|
579
|
+
// "txUuid":"da88f354d5xxxxxxa12128aa5bdcb3",
|
|
580
|
+
// "volumePrice":"0.00007365633"
|
|
581
|
+
// },
|
|
582
|
+
// "pair":"eth_btc",
|
|
583
|
+
// "type":"orderUpdate",
|
|
584
|
+
// "SERVER":"V2",
|
|
585
|
+
// "TS":"2019-06-28T14:49:37.816"
|
|
586
|
+
// }
|
|
587
|
+
// {
|
|
588
|
+
// "SERVER": "V2",
|
|
589
|
+
// "orderUpdate": {
|
|
590
|
+
// "accAmt": "0",
|
|
591
|
+
// "amount": "0",
|
|
592
|
+
// "avgPrice": "0",
|
|
593
|
+
// "customerID": "",
|
|
594
|
+
// "orderAmt": "5",
|
|
595
|
+
// "orderPrice": "0.009834",
|
|
596
|
+
// "orderStatus": 0,
|
|
597
|
+
// "price": "0.009834",
|
|
598
|
+
// "remainAmt": "5",
|
|
599
|
+
// "role": "taker",
|
|
600
|
+
// "symbol": "lbk_usdt",
|
|
601
|
+
// "type": "buy_market",
|
|
602
|
+
// "updateTime": 1705676718532,
|
|
603
|
+
// "uuid": "9b94ab2d-a510-4abe-a784-44a9d9c38ec7",
|
|
604
|
+
// "volumePrice": "0"
|
|
605
|
+
// },
|
|
606
|
+
// "type": "orderUpdate",
|
|
607
|
+
// "pair": "lbk_usdt",
|
|
608
|
+
// "TS": "2024-01-19T23:05:18.548"
|
|
609
|
+
// }
|
|
610
|
+
//
|
|
611
|
+
const orderUpdate = this.safeValue(order, 'orderUpdate', {});
|
|
612
|
+
const rawType = this.safeString(orderUpdate, 'type', '');
|
|
613
|
+
const typeParts = rawType.split('_');
|
|
614
|
+
const side = this.safeString(typeParts, 0);
|
|
615
|
+
const exchangeType = this.safeString(typeParts, 1);
|
|
616
|
+
let type = undefined;
|
|
617
|
+
if (rawType !== 'buy' && rawType !== 'sell') {
|
|
618
|
+
type = (exchangeType === 'market') ? 'market' : 'limit';
|
|
619
|
+
}
|
|
620
|
+
const marketId = this.safeString(order, 'pair');
|
|
621
|
+
const symbol = this.safeSymbol(marketId, market, '_');
|
|
622
|
+
const timestamp = this.safeInteger(orderUpdate, 'updateTime');
|
|
623
|
+
const status = this.safeString(orderUpdate, 'orderStatus');
|
|
624
|
+
const orderAmount = this.safeString(orderUpdate, 'orderAmt');
|
|
625
|
+
let cost = undefined;
|
|
626
|
+
if ((type === 'market') && (side === 'buy')) {
|
|
627
|
+
cost = orderAmount;
|
|
628
|
+
}
|
|
629
|
+
return this.safeOrder({
|
|
630
|
+
'info': order,
|
|
631
|
+
'id': this.safeString(orderUpdate, 'uuid'),
|
|
632
|
+
'clientOrderId': this.safeString(orderUpdate, 'customerID'),
|
|
633
|
+
'timestamp': timestamp,
|
|
634
|
+
'datetime': this.iso8601(timestamp),
|
|
635
|
+
'lastTradeTimestamp': undefined,
|
|
636
|
+
'lastUpdateTimestamp': this.safeInteger(orderUpdate, 'updateTime'),
|
|
637
|
+
'symbol': symbol,
|
|
638
|
+
'type': type,
|
|
639
|
+
'side': side,
|
|
640
|
+
'price': this.safeString2(orderUpdate, 'price', 'orderPrice'),
|
|
641
|
+
'stopPrice': undefined,
|
|
642
|
+
'average': this.safeString(orderUpdate, 'avgPrice'),
|
|
643
|
+
'amount': this.safeString2(orderUpdate, 'amount', 'orderAmt'),
|
|
644
|
+
'remaining': this.safeString(orderUpdate, 'remainAmt'),
|
|
645
|
+
'filled': this.safeString(orderUpdate, 'accAmt'),
|
|
646
|
+
'status': this.parseWsOrderStatus(status),
|
|
647
|
+
'fee': undefined,
|
|
648
|
+
'cost': cost,
|
|
649
|
+
'trades': undefined,
|
|
650
|
+
}, market);
|
|
651
|
+
}
|
|
652
|
+
parseWsOrderStatus(status) {
|
|
653
|
+
const statuses = {
|
|
654
|
+
'-1': 'canceled',
|
|
655
|
+
'0': 'open',
|
|
656
|
+
'1': 'open',
|
|
657
|
+
'2': 'closed',
|
|
658
|
+
'4': 'closed', // Withrawing
|
|
659
|
+
};
|
|
660
|
+
return this.safeString(statuses, status, status);
|
|
661
|
+
}
|
|
662
|
+
async fetchOrderBookWs(symbol, limit = undefined, params = {}) {
|
|
663
|
+
/**
|
|
664
|
+
* @method
|
|
665
|
+
* @name lbank#watchOrderBook
|
|
666
|
+
* @see https://www.lbank.com/en-US/docs/index.html#request-amp-subscription-instruction
|
|
667
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
668
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
669
|
+
* @param {int|undefined} limit the maximum amount of order book entries to return
|
|
670
|
+
* @param {object} params extra parameters specific to the lbank api endpoint
|
|
671
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/en/latest/manual.html#order-book-structure} indexed by market symbols
|
|
672
|
+
*/
|
|
673
|
+
await this.loadMarkets();
|
|
674
|
+
const market = this.market(symbol);
|
|
675
|
+
const url = this.urls['api']['ws'];
|
|
676
|
+
const messageHash = 'fetchOrderbook:' + market['symbol'];
|
|
677
|
+
if (limit === undefined) {
|
|
678
|
+
limit = 100;
|
|
679
|
+
}
|
|
680
|
+
const subscribe = {
|
|
681
|
+
'action': 'request',
|
|
682
|
+
'request': 'depth',
|
|
683
|
+
'depth': limit,
|
|
684
|
+
'pair': market['id'],
|
|
685
|
+
};
|
|
686
|
+
const request = this.deepExtend(subscribe, params);
|
|
687
|
+
const orderbook = await this.watch(url, messageHash, request, messageHash);
|
|
688
|
+
return orderbook.limit(limit);
|
|
689
|
+
}
|
|
690
|
+
async watchOrderBook(symbol, limit = undefined, params = {}) {
|
|
691
|
+
/**
|
|
692
|
+
* @method
|
|
693
|
+
* @name lbank#watchOrderBook
|
|
694
|
+
* @see https://www.lbank.com/en-US/docs/index.html#market-depth
|
|
695
|
+
* @see https://www.lbank.com/en-US/docs/index.html#market-increment-depth
|
|
696
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
697
|
+
* @param {string} symbol unified symbol of the market to fetch the order book for
|
|
698
|
+
* @param {int|undefined} limit the maximum amount of order book entries to return
|
|
699
|
+
* @param {object} params extra parameters specific to the lbank api endpoint
|
|
700
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/en/latest/manual.html#order-book-structure} indexed by market symbols
|
|
701
|
+
*/
|
|
702
|
+
await this.loadMarkets();
|
|
703
|
+
const market = this.market(symbol);
|
|
704
|
+
const url = this.urls['api']['ws'];
|
|
705
|
+
const messageHash = 'orderbook:' + market['symbol'];
|
|
706
|
+
params = this.omit(params, 'aggregation');
|
|
707
|
+
if (limit === undefined) {
|
|
708
|
+
limit = 100;
|
|
709
|
+
}
|
|
710
|
+
const subscribe = {
|
|
711
|
+
'action': 'subscribe',
|
|
712
|
+
'subscribe': 'depth',
|
|
713
|
+
'depth': limit,
|
|
714
|
+
'pair': market['id'],
|
|
715
|
+
};
|
|
716
|
+
const request = this.deepExtend(subscribe, params);
|
|
717
|
+
const orderbook = await this.watch(url, messageHash, request, messageHash);
|
|
718
|
+
return orderbook.limit();
|
|
719
|
+
}
|
|
720
|
+
handleOrderBook(client, message) {
|
|
721
|
+
//
|
|
722
|
+
// request
|
|
723
|
+
// {
|
|
724
|
+
// "SERVER":"V2",
|
|
725
|
+
// "asks":[
|
|
726
|
+
// [
|
|
727
|
+
// 42585.84,
|
|
728
|
+
// 1.4422
|
|
729
|
+
// ],
|
|
730
|
+
// ...
|
|
731
|
+
// ],
|
|
732
|
+
// "bids":[
|
|
733
|
+
// [
|
|
734
|
+
// 42585.83,
|
|
735
|
+
// 1.8054
|
|
736
|
+
// ],
|
|
737
|
+
// ,,,
|
|
738
|
+
// ],
|
|
739
|
+
// "count":100,
|
|
740
|
+
// "type":"depth",
|
|
741
|
+
// "pair":"btc_usdt",
|
|
742
|
+
// "TS":"2024-01-16T08:26:00.413"
|
|
743
|
+
// }
|
|
744
|
+
// subscribe
|
|
745
|
+
// {
|
|
746
|
+
// "depth": {
|
|
747
|
+
// "asks": [
|
|
748
|
+
// [
|
|
749
|
+
// 0.0252,
|
|
750
|
+
// 0.5833
|
|
751
|
+
// ],
|
|
752
|
+
// [
|
|
753
|
+
// 0.025215,
|
|
754
|
+
// 4.377
|
|
755
|
+
// ],
|
|
756
|
+
// ...
|
|
757
|
+
// ],
|
|
758
|
+
// "bids": [
|
|
759
|
+
// [
|
|
760
|
+
// 0.025135,
|
|
761
|
+
// 3.962
|
|
762
|
+
// ],
|
|
763
|
+
// [
|
|
764
|
+
// 0.025134,
|
|
765
|
+
// 3.46
|
|
766
|
+
// ],
|
|
767
|
+
// ...
|
|
768
|
+
// ]
|
|
769
|
+
// },
|
|
770
|
+
// "count": 100,
|
|
771
|
+
// "type": "depth",
|
|
772
|
+
// "pair": "eth_btc",
|
|
773
|
+
// "SERVER": "V2",
|
|
774
|
+
// "TS": "2019-06-28T17:49:22.722"
|
|
775
|
+
// }
|
|
776
|
+
//
|
|
777
|
+
const marketId = this.safeString(message, 'pair');
|
|
778
|
+
const symbol = this.safeSymbol(marketId);
|
|
779
|
+
const orderBook = this.safeValue(message, 'depth', message);
|
|
780
|
+
const datetime = this.safeString(message, 'TS');
|
|
781
|
+
const timestamp = this.parse8601(datetime);
|
|
782
|
+
let storedOrderBook = this.safeValue(this.orderbooks, symbol);
|
|
783
|
+
if (storedOrderBook === undefined) {
|
|
784
|
+
storedOrderBook = this.orderBook({});
|
|
785
|
+
this.orderbooks[symbol] = storedOrderBook;
|
|
786
|
+
}
|
|
787
|
+
const snapshot = this.parseOrderBook(orderBook, symbol, timestamp, 'bids', 'asks');
|
|
788
|
+
storedOrderBook.reset(snapshot);
|
|
789
|
+
let messageHash = 'orderbook:' + symbol;
|
|
790
|
+
client.resolve(storedOrderBook, messageHash);
|
|
791
|
+
messageHash = 'fetchOrderbook:' + symbol;
|
|
792
|
+
client.resolve(storedOrderBook, messageHash);
|
|
793
|
+
}
|
|
794
|
+
handleErrorMessage(client, message) {
|
|
795
|
+
//
|
|
796
|
+
// {
|
|
797
|
+
// SERVER: 'V2',
|
|
798
|
+
// message: "Missing parameter ['kbar']",
|
|
799
|
+
// status: 'error',
|
|
800
|
+
// TS: '2024-01-16T08:09:43.314'
|
|
801
|
+
// }
|
|
802
|
+
//
|
|
803
|
+
const errMsg = this.safeString(message, 'message', '');
|
|
804
|
+
const error = new ExchangeError(this.id + ' ' + errMsg);
|
|
805
|
+
client.reject(error);
|
|
806
|
+
}
|
|
807
|
+
async handlePing(client, message) {
|
|
808
|
+
//
|
|
809
|
+
// { ping: 'a13a939c-5f25-4e06-9981-93cb3b890707', action: 'ping' }
|
|
810
|
+
//
|
|
811
|
+
const pingId = this.safeString(message, 'ping');
|
|
812
|
+
await client.send({
|
|
813
|
+
'action': 'pong',
|
|
814
|
+
'pong': pingId,
|
|
815
|
+
});
|
|
816
|
+
}
|
|
817
|
+
handleMessage(client, message) {
|
|
818
|
+
const status = this.safeString(message, 'status');
|
|
819
|
+
if (status === 'error') {
|
|
820
|
+
return this.handleErrorMessage(client, message);
|
|
821
|
+
}
|
|
822
|
+
const type = this.safeString2(message, 'type', 'action');
|
|
823
|
+
if (type === 'ping') {
|
|
824
|
+
this.spawn(this.handlePing, client, message);
|
|
825
|
+
return;
|
|
826
|
+
}
|
|
827
|
+
const handlers = {
|
|
828
|
+
'kbar': this.handleOHLCV,
|
|
829
|
+
'depth': this.handleOrderBook,
|
|
830
|
+
'trade': this.handleTrades,
|
|
831
|
+
'tick': this.handleTicker,
|
|
832
|
+
'orderUpdate': this.handleOrders,
|
|
833
|
+
};
|
|
834
|
+
const handler = this.safeValue(handlers, type);
|
|
835
|
+
if (handler !== undefined) {
|
|
836
|
+
return handler.call(this, client, message);
|
|
837
|
+
}
|
|
838
|
+
return message;
|
|
839
|
+
}
|
|
840
|
+
async authenticate(params = {}) {
|
|
841
|
+
// when we implement more private streams, we need to refactor the authentication
|
|
842
|
+
// to be concurent-safe and respect the same authentication token
|
|
843
|
+
const url = this.urls['api']['ws'];
|
|
844
|
+
const client = this.client(url);
|
|
845
|
+
const now = this.milliseconds();
|
|
846
|
+
const messageHash = 'authenticated';
|
|
847
|
+
const authenticated = this.safeValue(client.subscriptions, messageHash);
|
|
848
|
+
if (authenticated === undefined) {
|
|
849
|
+
this.checkRequiredCredentials();
|
|
850
|
+
const response = await this.spotPrivatePostSubscribeGetKey(params);
|
|
851
|
+
//
|
|
852
|
+
// {"result":true,"data":"4e9958623e6006bd7b13ff9f36c03b36132f0f8da37f70b14ff2c4eab1fe0c97","error_code":0,"ts":1705602277198}
|
|
853
|
+
//
|
|
854
|
+
const result = this.safeValue(response, 'result');
|
|
855
|
+
if (result !== true) {
|
|
856
|
+
throw new ExchangeError(this.id + ' failed to get subscribe key');
|
|
857
|
+
}
|
|
858
|
+
client.subscriptions['authenticated'] = {
|
|
859
|
+
'key': this.safeString(response, 'data'),
|
|
860
|
+
'expires': this.sum(now, 3300000), // SubscribeKey lasts one hour, refresh it every 55 minutes
|
|
861
|
+
};
|
|
862
|
+
}
|
|
863
|
+
else {
|
|
864
|
+
const expires = this.safeInteger(authenticated, 'expires', 0);
|
|
865
|
+
if (expires < now) {
|
|
866
|
+
const request = {
|
|
867
|
+
'subscribeKey': authenticated['key'],
|
|
868
|
+
};
|
|
869
|
+
const response = await this.spotPrivatePostSubscribeRefreshKey(this.extend(request, params));
|
|
870
|
+
//
|
|
871
|
+
// {"result": "true"}
|
|
872
|
+
//
|
|
873
|
+
const result = this.safeString(response, 'result');
|
|
874
|
+
if (result !== 'true') {
|
|
875
|
+
throw new ExchangeError(this.id + ' failed to refresh the SubscribeKey');
|
|
876
|
+
}
|
|
877
|
+
client['subscriptions']['authenticated']['expires'] = this.sum(now, 3300000); // SubscribeKey lasts one hour, refresh it 5 minutes before it expires
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
return client.subscriptions['authenticated']['key'];
|
|
881
|
+
}
|
|
882
|
+
}
|