ccxt 4.2.11 → 4.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +5 -5
  2. package/build.sh +2 -2
  3. package/dist/ccxt.browser.js +1347 -490
  4. package/dist/ccxt.browser.min.js +3 -3
  5. package/dist/cjs/_virtual/agent.js +7 -0
  6. package/dist/cjs/_virtual/parse-proxy-response.js +7 -0
  7. package/dist/cjs/_virtual/promisify.js +7 -0
  8. package/dist/cjs/ccxt.js +1 -1
  9. package/dist/cjs/js/ccxt.js +474 -0
  10. package/dist/cjs/js/src/abstract/ace.js +9 -0
  11. package/dist/cjs/js/src/abstract/alpaca.js +9 -0
  12. package/dist/cjs/js/src/abstract/ascendex.js +9 -0
  13. package/dist/cjs/js/src/abstract/bigone.js +9 -0
  14. package/dist/cjs/js/src/abstract/binance.js +9 -0
  15. package/dist/cjs/js/src/abstract/bingx.js +9 -0
  16. package/dist/cjs/js/src/abstract/bit2c.js +9 -0
  17. package/dist/cjs/js/src/abstract/bitbank.js +9 -0
  18. package/dist/cjs/js/src/abstract/bitbns.js +9 -0
  19. package/dist/cjs/js/src/abstract/bitfinex.js +9 -0
  20. package/dist/cjs/js/src/abstract/bitfinex2.js +9 -0
  21. package/dist/cjs/js/src/abstract/bitflyer.js +9 -0
  22. package/dist/cjs/js/src/abstract/bitforex.js +9 -0
  23. package/dist/cjs/js/src/abstract/bitget.js +9 -0
  24. package/dist/cjs/js/src/abstract/bithumb.js +9 -0
  25. package/dist/cjs/js/src/abstract/bitmart.js +9 -0
  26. package/dist/cjs/js/src/abstract/bitmex.js +9 -0
  27. package/dist/cjs/js/src/abstract/bitopro.js +9 -0
  28. package/dist/cjs/js/src/abstract/bitpanda.js +9 -0
  29. package/dist/cjs/js/src/abstract/bitrue.js +9 -0
  30. package/dist/cjs/js/src/abstract/bitso.js +9 -0
  31. package/dist/cjs/js/src/abstract/bitstamp.js +9 -0
  32. package/dist/cjs/js/src/abstract/bitteam.js +9 -0
  33. package/dist/cjs/js/src/abstract/bitvavo.js +9 -0
  34. package/dist/cjs/js/src/abstract/bl3p.js +9 -0
  35. package/dist/cjs/js/src/abstract/blockchaincom.js +9 -0
  36. package/dist/cjs/js/src/abstract/btcalpha.js +9 -0
  37. package/dist/cjs/js/src/abstract/btcbox.js +9 -0
  38. package/dist/cjs/js/src/abstract/btcmarkets.js +9 -0
  39. package/dist/cjs/js/src/abstract/btcturk.js +9 -0
  40. package/dist/cjs/js/src/abstract/bybit.js +9 -0
  41. package/dist/cjs/js/src/abstract/cex.js +9 -0
  42. package/dist/cjs/js/src/abstract/coinbase.js +9 -0
  43. package/dist/cjs/js/src/abstract/coinbasepro.js +9 -0
  44. package/dist/cjs/js/src/abstract/coincheck.js +9 -0
  45. package/dist/cjs/js/src/abstract/coinex.js +9 -0
  46. package/dist/cjs/js/src/abstract/coinlist.js +9 -0
  47. package/dist/cjs/js/src/abstract/coinmate.js +9 -0
  48. package/dist/cjs/js/src/abstract/coinone.js +9 -0
  49. package/dist/cjs/js/src/abstract/coinsph.js +9 -0
  50. package/dist/cjs/js/src/abstract/coinspot.js +9 -0
  51. package/dist/cjs/js/src/abstract/cryptocom.js +9 -0
  52. package/dist/cjs/js/src/abstract/currencycom.js +9 -0
  53. package/dist/cjs/js/src/abstract/delta.js +9 -0
  54. package/dist/cjs/js/src/abstract/deribit.js +9 -0
  55. package/dist/cjs/js/src/abstract/digifinex.js +9 -0
  56. package/dist/cjs/js/src/abstract/exmo.js +9 -0
  57. package/dist/cjs/js/src/abstract/gate.js +9 -0
  58. package/dist/cjs/js/src/abstract/gemini.js +9 -0
  59. package/dist/cjs/js/src/abstract/hitbtc.js +9 -0
  60. package/dist/cjs/js/src/abstract/hollaex.js +9 -0
  61. package/dist/cjs/js/src/abstract/htx.js +9 -0
  62. package/dist/cjs/js/src/abstract/huobijp.js +9 -0
  63. package/dist/cjs/js/src/abstract/idex.js +9 -0
  64. package/dist/cjs/js/src/abstract/independentreserve.js +9 -0
  65. package/dist/cjs/js/src/abstract/indodax.js +9 -0
  66. package/dist/cjs/js/src/abstract/kraken.js +9 -0
  67. package/dist/cjs/js/src/abstract/krakenfutures.js +9 -0
  68. package/dist/cjs/js/src/abstract/kucoin.js +9 -0
  69. package/dist/cjs/js/src/abstract/kucoinfutures.js +9 -0
  70. package/dist/cjs/js/src/abstract/kuna.js +9 -0
  71. package/dist/cjs/js/src/abstract/latoken.js +9 -0
  72. package/dist/cjs/js/src/abstract/lbank.js +9 -0
  73. package/dist/cjs/js/src/abstract/luno.js +9 -0
  74. package/dist/cjs/js/src/abstract/lykke.js +9 -0
  75. package/dist/cjs/js/src/abstract/mercado.js +9 -0
  76. package/dist/cjs/js/src/abstract/mexc.js +9 -0
  77. package/dist/cjs/js/src/abstract/ndax.js +9 -0
  78. package/dist/cjs/js/src/abstract/novadax.js +9 -0
  79. package/dist/cjs/js/src/abstract/oceanex.js +9 -0
  80. package/dist/cjs/js/src/abstract/okcoin.js +9 -0
  81. package/dist/cjs/js/src/abstract/okx.js +9 -0
  82. package/dist/cjs/js/src/abstract/p2b.js +9 -0
  83. package/dist/cjs/js/src/abstract/paymium.js +9 -0
  84. package/dist/cjs/js/src/abstract/phemex.js +9 -0
  85. package/dist/cjs/js/src/abstract/poloniex.js +9 -0
  86. package/dist/cjs/js/src/abstract/poloniexfutures.js +9 -0
  87. package/dist/cjs/js/src/abstract/probit.js +9 -0
  88. package/dist/cjs/js/src/abstract/timex.js +9 -0
  89. package/dist/cjs/js/src/abstract/tokocrypto.js +9 -0
  90. package/dist/cjs/js/src/abstract/upbit.js +9 -0
  91. package/dist/cjs/js/src/abstract/wavesexchange.js +9 -0
  92. package/dist/cjs/js/src/abstract/wazirx.js +9 -0
  93. package/dist/cjs/js/src/abstract/whitebit.js +9 -0
  94. package/dist/cjs/js/src/abstract/woo.js +9 -0
  95. package/dist/cjs/js/src/abstract/yobit.js +9 -0
  96. package/dist/cjs/js/src/abstract/zaif.js +9 -0
  97. package/dist/cjs/js/src/abstract/zonda.js +9 -0
  98. package/dist/cjs/js/src/ace.js +1058 -0
  99. package/dist/cjs/js/src/alpaca.js +1125 -0
  100. package/dist/cjs/js/src/ascendex.js +3360 -0
  101. package/dist/cjs/js/src/base/Exchange.js +5110 -0
  102. package/dist/cjs/js/src/base/Precise.js +263 -0
  103. package/dist/cjs/js/src/base/errors.js +299 -0
  104. package/dist/cjs/js/src/base/functions/crypto.js +78 -0
  105. package/dist/cjs/js/src/base/functions/encode.js +44 -0
  106. package/dist/cjs/js/src/base/functions/generic.js +193 -0
  107. package/dist/cjs/js/src/base/functions/misc.js +96 -0
  108. package/dist/cjs/js/src/base/functions/number.js +297 -0
  109. package/dist/cjs/js/src/base/functions/platform.js +28 -0
  110. package/dist/cjs/js/src/base/functions/rsa.js +34 -0
  111. package/dist/cjs/js/src/base/functions/string.js +48 -0
  112. package/dist/cjs/js/src/base/functions/throttle.js +66 -0
  113. package/dist/cjs/js/src/base/functions/time.js +187 -0
  114. package/dist/cjs/js/src/base/functions/totp.js +24 -0
  115. package/dist/cjs/js/src/base/functions/type.js +162 -0
  116. package/dist/cjs/js/src/base/functions.js +157 -0
  117. package/dist/cjs/js/src/base/ws/Cache.js +254 -0
  118. package/dist/cjs/js/src/base/ws/Client.js +299 -0
  119. package/dist/cjs/js/src/base/ws/Future.js +34 -0
  120. package/dist/cjs/js/src/base/ws/OrderBook.js +107 -0
  121. package/dist/cjs/js/src/base/ws/OrderBookSide.js +281 -0
  122. package/dist/cjs/js/src/base/ws/WsClient.js +69 -0
  123. package/dist/cjs/js/src/bequant.js +33 -0
  124. package/dist/cjs/js/src/bigone.js +2209 -0
  125. package/dist/cjs/js/src/binance.js +9736 -0
  126. package/dist/cjs/js/src/binancecoinm.js +45 -0
  127. package/dist/cjs/js/src/binanceus.js +84 -0
  128. package/dist/cjs/js/src/binanceusdm.js +58 -0
  129. package/dist/cjs/js/src/bingx.js +3807 -0
  130. package/dist/cjs/js/src/bit2c.js +916 -0
  131. package/dist/cjs/js/src/bitbank.js +1000 -0
  132. package/dist/cjs/js/src/bitbay.js +17 -0
  133. package/dist/cjs/js/src/bitbns.js +1220 -0
  134. package/dist/cjs/js/src/bitcoincom.js +17 -0
  135. package/dist/cjs/js/src/bitfinex.js +1670 -0
  136. package/dist/cjs/js/src/bitfinex2.js +2990 -0
  137. package/dist/cjs/js/src/bitflyer.js +1045 -0
  138. package/dist/cjs/js/src/bitforex.js +852 -0
  139. package/dist/cjs/js/src/bitget.js +8291 -0
  140. package/dist/cjs/js/src/bithumb.js +1090 -0
  141. package/dist/cjs/js/src/bitmart.js +4454 -0
  142. package/dist/cjs/js/src/bitmex.js +2884 -0
  143. package/dist/cjs/js/src/bitopro.js +1724 -0
  144. package/dist/cjs/js/src/bitpanda.js +2002 -0
  145. package/dist/cjs/js/src/bitrue.js +3253 -0
  146. package/dist/cjs/js/src/bitso.js +1753 -0
  147. package/dist/cjs/js/src/bitstamp.js +2188 -0
  148. package/dist/cjs/js/src/bitteam.js +2309 -0
  149. package/dist/cjs/js/src/bitvavo.js +1968 -0
  150. package/dist/cjs/js/src/bl3p.js +447 -0
  151. package/dist/cjs/js/src/blockchaincom.js +1160 -0
  152. package/dist/cjs/js/src/btcalpha.js +929 -0
  153. package/dist/cjs/js/src/btcbox.js +565 -0
  154. package/dist/cjs/js/src/btcmarkets.js +1237 -0
  155. package/dist/cjs/js/src/btcturk.js +929 -0
  156. package/dist/cjs/js/src/bybit.js +7646 -0
  157. package/dist/cjs/js/src/cex.js +1693 -0
  158. package/dist/cjs/js/src/coinbase.js +3424 -0
  159. package/dist/cjs/js/src/coinbasepro.js +1866 -0
  160. package/dist/cjs/js/src/coincheck.js +843 -0
  161. package/dist/cjs/js/src/coinex.js +5414 -0
  162. package/dist/cjs/js/src/coinlist.js +2329 -0
  163. package/dist/cjs/js/src/coinmate.js +989 -0
  164. package/dist/cjs/js/src/coinone.js +1185 -0
  165. package/dist/cjs/js/src/coinsph.js +1933 -0
  166. package/dist/cjs/js/src/coinspot.js +548 -0
  167. package/dist/cjs/js/src/cryptocom.js +3007 -0
  168. package/dist/cjs/js/src/currencycom.js +2015 -0
  169. package/dist/cjs/js/src/delta.js +3256 -0
  170. package/dist/cjs/js/src/deribit.js +3306 -0
  171. package/dist/cjs/js/src/digifinex.js +4307 -0
  172. package/dist/cjs/js/src/exmo.js +2645 -0
  173. package/dist/cjs/js/src/fmfwio.js +34 -0
  174. package/dist/cjs/js/src/gate.js +7072 -0
  175. package/dist/cjs/js/src/gateio.js +16 -0
  176. package/dist/cjs/js/src/gemini.js +1801 -0
  177. package/dist/cjs/js/src/hitbtc.js +3660 -0
  178. package/dist/cjs/js/src/hitbtc3.js +19 -0
  179. package/dist/cjs/js/src/hollaex.js +1882 -0
  180. package/dist/cjs/js/src/htx.js +9049 -0
  181. package/dist/cjs/js/src/huobi.js +16 -0
  182. package/dist/cjs/js/src/huobijp.js +1918 -0
  183. package/dist/cjs/js/src/idex.js +1770 -0
  184. package/dist/cjs/js/src/independentreserve.js +761 -0
  185. package/dist/cjs/js/src/indodax.js +1069 -0
  186. package/dist/cjs/js/src/kraken.js +2857 -0
  187. package/dist/cjs/js/src/krakenfutures.js +2407 -0
  188. package/dist/cjs/js/src/kucoin.js +4489 -0
  189. package/dist/cjs/js/src/kucoinfutures.js +2475 -0
  190. package/dist/cjs/js/src/kuna.js +1949 -0
  191. package/dist/cjs/js/src/latoken.js +1729 -0
  192. package/dist/cjs/js/src/lbank.js +2851 -0
  193. package/dist/cjs/js/src/luno.js +1044 -0
  194. package/dist/cjs/js/src/lykke.js +1303 -0
  195. package/dist/cjs/js/src/mercado.js +897 -0
  196. package/dist/cjs/js/src/mexc.js +5407 -0
  197. package/dist/cjs/js/src/ndax.js +2450 -0
  198. package/dist/cjs/js/src/novadax.js +1556 -0
  199. package/dist/cjs/js/src/oceanex.js +964 -0
  200. package/dist/cjs/js/src/okcoin.js +3115 -0
  201. package/dist/cjs/js/src/okx.js +7330 -0
  202. package/dist/cjs/js/src/p2b.js +1243 -0
  203. package/dist/cjs/js/src/paymium.js +597 -0
  204. package/dist/cjs/js/src/phemex.js +4722 -0
  205. package/dist/cjs/js/src/poloniex.js +2356 -0
  206. package/dist/cjs/js/src/poloniexfutures.js +1794 -0
  207. package/dist/cjs/js/src/pro/alpaca.js +714 -0
  208. package/dist/cjs/js/src/pro/ascendex.js +957 -0
  209. package/dist/cjs/js/src/pro/bequant.js +33 -0
  210. package/dist/cjs/js/src/pro/binance.js +2796 -0
  211. package/dist/cjs/js/src/pro/binancecoinm.js +23 -0
  212. package/dist/cjs/js/src/pro/binanceus.js +51 -0
  213. package/dist/cjs/js/src/pro/binanceusdm.js +32 -0
  214. package/dist/cjs/js/src/pro/bingx.js +944 -0
  215. package/dist/cjs/js/src/pro/bitcoincom.js +29 -0
  216. package/dist/cjs/js/src/pro/bitfinex.js +672 -0
  217. package/dist/cjs/js/src/pro/bitfinex2.js +1159 -0
  218. package/dist/cjs/js/src/pro/bitget.js +1733 -0
  219. package/dist/cjs/js/src/pro/bitmart.js +1486 -0
  220. package/dist/cjs/js/src/pro/bitmex.js +1576 -0
  221. package/dist/cjs/js/src/pro/bitopro.js +327 -0
  222. package/dist/cjs/js/src/pro/bitpanda.js +1341 -0
  223. package/dist/cjs/js/src/pro/bitrue.js +462 -0
  224. package/dist/cjs/js/src/pro/bitstamp.js +547 -0
  225. package/dist/cjs/js/src/pro/bitvavo.js +704 -0
  226. package/dist/cjs/js/src/pro/blockchaincom.js +794 -0
  227. package/dist/cjs/js/src/pro/bybit.js +1843 -0
  228. package/dist/cjs/js/src/pro/cex.js +1510 -0
  229. package/dist/cjs/js/src/pro/coinbase.js +561 -0
  230. package/dist/cjs/js/src/pro/coinbasepro.js +968 -0
  231. package/dist/cjs/js/src/pro/coinex.js +1095 -0
  232. package/dist/cjs/js/src/pro/cryptocom.js +1020 -0
  233. package/dist/cjs/js/src/pro/currencycom.js +563 -0
  234. package/dist/cjs/js/src/pro/deribit.js +825 -0
  235. package/dist/cjs/js/src/pro/exmo.js +658 -0
  236. package/dist/cjs/js/src/pro/gate.js +1316 -0
  237. package/dist/cjs/js/src/pro/gateio.js +16 -0
  238. package/dist/cjs/js/src/pro/gemini.js +649 -0
  239. package/dist/cjs/js/src/pro/hitbtc.js +1293 -0
  240. package/dist/cjs/js/src/pro/hollaex.js +597 -0
  241. package/dist/cjs/js/src/pro/htx.js +2383 -0
  242. package/dist/cjs/js/src/pro/huobi.js +16 -0
  243. package/dist/cjs/js/src/pro/huobijp.js +606 -0
  244. package/dist/cjs/js/src/pro/idex.js +714 -0
  245. package/dist/cjs/js/src/pro/independentreserve.js +280 -0
  246. package/dist/cjs/js/src/pro/kraken.js +1364 -0
  247. package/dist/cjs/js/src/pro/krakenfutures.js +1500 -0
  248. package/dist/cjs/js/src/pro/kucoin.js +1052 -0
  249. package/dist/cjs/js/src/pro/kucoinfutures.js +981 -0
  250. package/dist/cjs/js/src/pro/luno.js +322 -0
  251. package/dist/cjs/js/src/pro/mexc.js +1170 -0
  252. package/dist/cjs/js/src/pro/ndax.js +545 -0
  253. package/dist/cjs/js/src/pro/okcoin.js +760 -0
  254. package/dist/cjs/js/src/pro/okx.js +1608 -0
  255. package/dist/cjs/js/src/pro/phemex.js +1511 -0
  256. package/dist/cjs/js/src/pro/poloniex.js +1253 -0
  257. package/dist/cjs/js/src/pro/poloniexfutures.js +1014 -0
  258. package/dist/cjs/js/src/pro/probit.js +586 -0
  259. package/dist/cjs/js/src/pro/upbit.js +234 -0
  260. package/dist/cjs/js/src/pro/wazirx.js +776 -0
  261. package/dist/cjs/js/src/pro/whitebit.js +927 -0
  262. package/dist/cjs/js/src/pro/woo.js +769 -0
  263. package/dist/cjs/js/src/probit.js +1867 -0
  264. package/dist/cjs/js/src/static_dependencies/fflake/browser.js +401 -0
  265. package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncrypt.js +195 -0
  266. package/dist/cjs/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +308 -0
  267. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +554 -0
  268. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
  269. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
  270. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
  271. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +16 -0
  272. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1760 -0
  273. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +52 -0
  274. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +81 -0
  275. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +376 -0
  276. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +70 -0
  277. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1580 -0
  278. package/dist/cjs/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +74 -0
  279. package/dist/cjs/js/src/static_dependencies/noble-curves/_shortw_utils.js +24 -0
  280. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/curve.js +158 -0
  281. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/edwards.js +429 -0
  282. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +176 -0
  283. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/modular.js +324 -0
  284. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/montgomery.js +163 -0
  285. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/utils.js +245 -0
  286. package/dist/cjs/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +1018 -0
  287. package/dist/cjs/js/src/static_dependencies/noble-curves/ed25519.js +383 -0
  288. package/dist/cjs/js/src/static_dependencies/noble-curves/secp256k1.js +258 -0
  289. package/dist/cjs/js/src/static_dependencies/noble-hashes/_assert.js +53 -0
  290. package/dist/cjs/js/src/static_dependencies/noble-hashes/_sha2.js +120 -0
  291. package/dist/cjs/js/src/static_dependencies/noble-hashes/_u64.js +69 -0
  292. package/dist/cjs/js/src/static_dependencies/noble-hashes/crypto.js +7 -0
  293. package/dist/cjs/js/src/static_dependencies/noble-hashes/hmac.js +83 -0
  294. package/dist/cjs/js/src/static_dependencies/noble-hashes/md5.js +240 -0
  295. package/dist/cjs/js/src/static_dependencies/noble-hashes/sha1.js +91 -0
  296. package/dist/cjs/js/src/static_dependencies/noble-hashes/sha256.js +130 -0
  297. package/dist/cjs/js/src/static_dependencies/noble-hashes/sha3.js +214 -0
  298. package/dist/cjs/js/src/static_dependencies/noble-hashes/sha512.js +239 -0
  299. package/dist/cjs/js/src/static_dependencies/noble-hashes/utils.js +93 -0
  300. package/dist/cjs/js/src/static_dependencies/node-fetch/body.js +354 -0
  301. package/dist/cjs/js/src/static_dependencies/node-fetch/errors/abort-error.js +16 -0
  302. package/dist/cjs/js/src/static_dependencies/node-fetch/errors/base.js +20 -0
  303. package/dist/cjs/js/src/static_dependencies/node-fetch/errors/fetch-error.js +30 -0
  304. package/dist/cjs/js/src/static_dependencies/node-fetch/headers.js +239 -0
  305. package/dist/cjs/js/src/static_dependencies/node-fetch/index.js +372 -0
  306. package/dist/cjs/js/src/static_dependencies/node-fetch/request.js +273 -0
  307. package/dist/cjs/js/src/static_dependencies/node-fetch/response.js +139 -0
  308. package/dist/cjs/js/src/static_dependencies/node-fetch/utils/get-search.js +14 -0
  309. package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is-redirect.js +16 -0
  310. package/dist/cjs/js/src/static_dependencies/node-fetch/utils/is.js +81 -0
  311. package/dist/cjs/js/src/static_dependencies/node-fetch/utils/referrer.js +292 -0
  312. package/dist/cjs/js/src/static_dependencies/proxies/agent-base/index.js +103 -0
  313. package/dist/cjs/js/src/static_dependencies/proxies/http-proxy-agent/index.js +140 -0
  314. package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/index.js +175 -0
  315. package/dist/cjs/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
  316. package/dist/cjs/js/src/static_dependencies/qs/index.cjs.js +7 -0
  317. package/dist/cjs/js/src/static_dependencies/scure-base/index.js +383 -0
  318. package/dist/cjs/js/src/timex.js +1562 -0
  319. package/dist/cjs/js/src/tokocrypto.js +2542 -0
  320. package/dist/cjs/js/src/upbit.js +1844 -0
  321. package/dist/cjs/js/src/wavesexchange.js +2607 -0
  322. package/dist/cjs/js/src/wazirx.js +953 -0
  323. package/dist/cjs/js/src/whitebit.js +2309 -0
  324. package/dist/cjs/js/src/woo.js +2765 -0
  325. package/dist/cjs/js/src/yobit.js +1314 -0
  326. package/dist/cjs/js/src/zaif.js +736 -0
  327. package/dist/cjs/js/src/zonda.js +1883 -0
  328. package/js/ccxt.d.ts +1 -1
  329. package/js/ccxt.js +1 -1
  330. package/js/src/abstract/bigone.d.ts +18 -0
  331. package/js/src/abstract/binance.d.ts +2 -0
  332. package/js/src/abstract/binancecoinm.d.ts +2 -0
  333. package/js/src/abstract/binanceus.d.ts +2 -0
  334. package/js/src/abstract/binanceusdm.d.ts +2 -0
  335. package/js/src/abstract/bingx.d.ts +2 -0
  336. package/js/src/abstract/bybit.d.ts +1 -0
  337. package/js/src/abstract/gate.d.ts +11 -0
  338. package/js/src/abstract/gateio.d.ts +11 -0
  339. package/js/src/abstract/okx.d.ts +1 -0
  340. package/js/src/alpaca.js +18 -18
  341. package/js/src/base/Exchange.d.ts +5 -1
  342. package/js/src/base/Exchange.js +101 -12
  343. package/js/src/bigone.d.ts +3 -2
  344. package/js/src/bigone.js +429 -167
  345. package/js/src/binance.js +48 -34
  346. package/js/src/bingx.js +115 -38
  347. package/js/src/bitfinex.d.ts +2 -2
  348. package/js/src/bitfinex.js +2 -3
  349. package/js/src/bitget.js +33 -13
  350. package/js/src/bitmart.d.ts +2 -2
  351. package/js/src/bitmart.js +5 -5
  352. package/js/src/bitmex.js +1 -0
  353. package/js/src/bybit.js +2 -0
  354. package/js/src/coinbase.d.ts +26 -3
  355. package/js/src/coinbase.js +176 -26
  356. package/js/src/coinlist.js +3 -4
  357. package/js/src/coinone.js +1 -1
  358. package/js/src/coinsph.js +2 -3
  359. package/js/src/deribit.js +1 -0
  360. package/js/src/gate.d.ts +4 -4
  361. package/js/src/gate.js +96 -59
  362. package/js/src/gemini.js +1 -1
  363. package/js/src/hitbtc.d.ts +4 -4
  364. package/js/src/hitbtc.js +2 -3
  365. package/js/src/htx.d.ts +1 -0
  366. package/js/src/htx.js +29 -7
  367. package/js/src/huobijp.js +2 -3
  368. package/js/src/independentreserve.js +7 -5
  369. package/js/src/kraken.js +3 -6
  370. package/js/src/lbank.js +59 -33
  371. package/js/src/mexc.js +2 -1
  372. package/js/src/oceanex.js +1 -1
  373. package/js/src/okx.js +14 -3
  374. package/js/src/phemex.js +9 -2
  375. package/js/src/pro/binance.d.ts +2 -23
  376. package/js/src/pro/binance.js +58 -22
  377. package/js/src/pro/coinbase.d.ts +2 -2
  378. package/js/src/pro/coinbase.js +4 -1
  379. package/js/src/pro/coinbasepro.d.ts +2 -2
  380. package/js/src/pro/hitbtc.d.ts +2 -2
  381. package/js/src/pro/kraken.js +1 -1
  382. package/js/src/pro/okx.d.ts +1 -0
  383. package/js/src/pro/okx.js +52 -2
  384. package/js/src/pro/poloniex.d.ts +2 -2
  385. package/js/src/probit.js +4 -2
  386. package/js/src/upbit.d.ts +3 -101
  387. package/js/src/upbit.js +12 -12
  388. package/js/src/wavesexchange.js +1 -1
  389. package/js/src/woo.d.ts +2 -0
  390. package/js/src/woo.js +52 -0
  391. package/package.json +1 -1
  392. package/skip-tests.json +5 -0
@@ -0,0 +1,1364 @@
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;