ccxt 4.2.11 → 4.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/README.md +5 -5
  2. package/build.sh +2 -2
  3. package/dist/ccxt.browser.js +640 -261
  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 +2142 -0
  125. package/dist/cjs/js/src/binance.js +9729 -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 +3737 -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 +8284 -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 +3274 -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 +7054 -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 +9024 -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 +759 -0
  185. package/dist/cjs/js/src/indodax.js +1069 -0
  186. package/dist/cjs/js/src/kraken.js +2861 -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 +2825 -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 +7329 -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 +4715 -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 +1558 -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 +1865 -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 +2715 -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/bybit.d.ts +1 -0
  336. package/js/src/abstract/gate.d.ts +11 -0
  337. package/js/src/abstract/gateio.d.ts +11 -0
  338. package/js/src/alpaca.js +18 -18
  339. package/js/src/base/Exchange.d.ts +5 -1
  340. package/js/src/base/Exchange.js +101 -12
  341. package/js/src/bigone.d.ts +1 -2
  342. package/js/src/bigone.js +340 -145
  343. package/js/src/binance.js +15 -8
  344. package/js/src/bingx.js +9 -2
  345. package/js/src/bitfinex.d.ts +2 -2
  346. package/js/src/bitfinex.js +2 -3
  347. package/js/src/bitget.js +21 -8
  348. package/js/src/bitmart.d.ts +2 -2
  349. package/js/src/bitmart.js +3 -3
  350. package/js/src/bitmex.js +1 -0
  351. package/js/src/bybit.js +2 -0
  352. package/js/src/coinlist.js +2 -3
  353. package/js/src/coinsph.js +2 -3
  354. package/js/src/deribit.js +1 -0
  355. package/js/src/gate.d.ts +4 -4
  356. package/js/src/gate.js +22 -3
  357. package/js/src/hitbtc.d.ts +4 -4
  358. package/js/src/hitbtc.js +2 -3
  359. package/js/src/htx.js +4 -7
  360. package/js/src/huobijp.js +2 -3
  361. package/js/src/kraken.js +1 -0
  362. package/js/src/mexc.js +2 -1
  363. package/js/src/okx.js +13 -3
  364. package/js/src/pro/binance.d.ts +2 -23
  365. package/js/src/pro/binance.js +58 -22
  366. package/js/src/pro/coinbase.d.ts +2 -2
  367. package/js/src/pro/coinbase.js +4 -1
  368. package/js/src/pro/coinbasepro.d.ts +2 -2
  369. package/js/src/pro/hitbtc.d.ts +2 -2
  370. package/js/src/pro/poloniex.d.ts +2 -2
  371. package/js/src/upbit.d.ts +3 -101
  372. package/js/src/upbit.js +12 -12
  373. package/js/src/woo.js +2 -0
  374. package/package.json +1 -1
  375. package/skip-tests.json +5 -0
@@ -0,0 +1,1510 @@
1
+ 'use strict';
2
+
3
+ var cex$1 = require('../cex.js');
4
+ var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
5
+ var errors = require('../base/errors.js');
6
+ var Precise = require('../base/Precise.js');
7
+ var Cache = require('../base/ws/Cache.js');
8
+
9
+ // ---------------------------------------------------------------------------
10
+ // ---------------------------------------------------------------------------
11
+ class cex extends cex$1 {
12
+ describe() {
13
+ return this.deepExtend(super.describe(), {
14
+ 'has': {
15
+ 'ws': true,
16
+ 'watchBalance': true,
17
+ 'watchTicker': true,
18
+ 'watchTickers': true,
19
+ 'watchTrades': true,
20
+ 'watchMyTrades': true,
21
+ 'watchOrders': true,
22
+ 'watchOrderBook': true,
23
+ 'watchOHLCV': true,
24
+ 'watchPosition': undefined,
25
+ 'createOrderWs': true,
26
+ 'editOrderWs': true,
27
+ 'cancelOrderWs': true,
28
+ 'cancelOrdersWs': true,
29
+ 'fetchOrderWs': true,
30
+ 'fetchOpenOrdersWs': true,
31
+ 'fetchTickerWs': true,
32
+ 'fetchBalanceWs': true,
33
+ },
34
+ 'urls': {
35
+ 'api': {
36
+ 'ws': 'wss://ws.cex.io/ws',
37
+ },
38
+ },
39
+ 'options': {
40
+ 'orderbook': {},
41
+ },
42
+ 'streaming': {},
43
+ 'exceptions': {},
44
+ });
45
+ }
46
+ requestId() {
47
+ const requestId = this.sum(this.safeInteger(this.options, 'requestId', 0), 1);
48
+ this.options['requestId'] = requestId;
49
+ return requestId.toString();
50
+ }
51
+ async watchBalance(params = {}) {
52
+ /**
53
+ * @method
54
+ * @name cex#watchBalance
55
+ * @description watch balance and get the amount of funds available for trading or funds locked in orders
56
+ * @see https://cex.io/websocket-api#get-balance
57
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
58
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
59
+ */
60
+ await this.authenticate(params);
61
+ const messageHash = this.requestId();
62
+ const url = this.urls['api']['ws'];
63
+ const subscribe = {
64
+ 'e': 'get-balance',
65
+ 'data': {},
66
+ 'oid': this.requestId(),
67
+ };
68
+ const request = this.deepExtend(subscribe, params);
69
+ return await this.watch(url, messageHash, request, messageHash, request);
70
+ }
71
+ handleBalance(client, message) {
72
+ //
73
+ // {
74
+ // "e": "get-balance",
75
+ // "data": {
76
+ // "balance": {
77
+ // "BTC": "0.00000000",
78
+ // "USD": "0.00",
79
+ // ...
80
+ // },
81
+ // "obalance": {
82
+ // "BTC": "0.00000000",
83
+ // "USD": "0.00",
84
+ // ...
85
+ // },
86
+ // "time": 1663761159605
87
+ // },
88
+ // "oid": 1,
89
+ // "ok": "ok"
90
+ // }
91
+ //
92
+ const data = this.safeValue(message, 'data', {});
93
+ const freeBalance = this.safeValue(data, 'balance', {});
94
+ const usedBalance = this.safeValue(data, 'obalance', {});
95
+ const result = {
96
+ 'info': data,
97
+ };
98
+ const currencyIds = Object.keys(freeBalance);
99
+ for (let i = 0; i < currencyIds.length; i++) {
100
+ const currencyId = currencyIds[i];
101
+ const account = this.account();
102
+ account['free'] = this.safeString(freeBalance, currencyId);
103
+ account['used'] = this.safeString(usedBalance, currencyId);
104
+ const code = this.safeCurrencyCode(currencyId);
105
+ result[code] = account;
106
+ }
107
+ this.balance = this.safeBalance(result);
108
+ const messageHash = this.safeString(message, 'oid');
109
+ client.resolve(this.balance, messageHash);
110
+ }
111
+ async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
112
+ /**
113
+ * @method
114
+ * @name cex#watchTrades
115
+ * @description get the list of most recent trades for a particular symbol. Note: can only watch one symbol at a time.
116
+ * @see https://cex.io/websocket-api#old-pair-room
117
+ * @param {string} symbol unified symbol of the market to fetch trades for
118
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
119
+ * @param {int} [limit] the maximum amount of trades to fetch
120
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
121
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
122
+ */
123
+ await this.loadMarkets();
124
+ const market = this.market(symbol);
125
+ symbol = market['symbol'];
126
+ const url = this.urls['api']['ws'];
127
+ const messageHash = 'trades';
128
+ const subscriptionHash = 'old:' + symbol;
129
+ const client = this.safeValue(this.clients, url);
130
+ if (client !== undefined) {
131
+ const subscriptionKeys = Object.keys(client.subscriptions);
132
+ for (let i = 0; i < subscriptionKeys.length; i++) {
133
+ let subscriptionKey = subscriptionKeys[i];
134
+ if (subscriptionKey === subscriptionHash) {
135
+ continue;
136
+ }
137
+ subscriptionKey = subscriptionKey.slice(0, 3);
138
+ if (subscriptionKey === 'old') {
139
+ throw new errors.ExchangeError(this.id + ' watchTrades() only supports watching one symbol at a time.');
140
+ }
141
+ }
142
+ }
143
+ const message = {
144
+ 'e': 'subscribe',
145
+ 'rooms': ['pair-' + market['base'] + '-' + market['quote']],
146
+ };
147
+ const request = this.deepExtend(message, params);
148
+ const trades = await this.watch(url, messageHash, request, subscriptionHash);
149
+ // assing symbol to the trades as message does not contain symbol information
150
+ for (let i = 0; i < trades.length; i++) {
151
+ trades[i]['symbol'] = symbol;
152
+ }
153
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
154
+ }
155
+ handleTradesSnapshot(client, message) {
156
+ //
157
+ // {
158
+ // "e": "history",
159
+ // "data": [
160
+ // "sell:1665467367741:3888551:19058.8:14541219",
161
+ // "buy:1665467367741:1059339:19071.5:14541218",
162
+ // ]
163
+ // }
164
+ //
165
+ const data = this.safeValue(message, 'data', []);
166
+ const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
167
+ const stored = new Cache.ArrayCache(limit);
168
+ for (let i = 0; i < data.length; i++) {
169
+ const rawTrade = data[i];
170
+ const parsed = this.parseWsOldTrade(rawTrade);
171
+ stored.append(parsed);
172
+ }
173
+ const messageHash = 'trades';
174
+ this.trades = stored;
175
+ client.resolve(this.trades, messageHash);
176
+ }
177
+ parseWsOldTrade(trade, market = undefined) {
178
+ //
179
+ // snapshot trade
180
+ // "sell:1665467367741:3888551:19058.8:14541219"
181
+ // update trade
182
+ // ['buy', '1665467516704', '98070', "19057.7", "14541220"]
183
+ //
184
+ if (!Array.isArray(trade)) {
185
+ trade = trade.split(':');
186
+ }
187
+ const side = this.safeString(trade, 0);
188
+ const timestamp = this.safeNumber(trade, 1);
189
+ const amount = this.safeString(trade, 2);
190
+ const price = this.safeString(trade, 3);
191
+ const id = this.safeString(trade, 4);
192
+ return this.safeTrade({
193
+ 'info': trade,
194
+ 'id': id,
195
+ 'timestamp': timestamp,
196
+ 'datetime': this.iso8601(timestamp),
197
+ 'symbol': undefined,
198
+ 'type': undefined,
199
+ 'side': side,
200
+ 'order': undefined,
201
+ 'takerOrMaker': undefined,
202
+ 'price': price,
203
+ 'amount': amount,
204
+ 'cost': undefined,
205
+ 'fee': undefined,
206
+ }, market);
207
+ }
208
+ handleTrade(client, message) {
209
+ //
210
+ // {
211
+ // "e": "history-update",
212
+ // "data": [
213
+ // ['buy', '1665467516704', '98070', "19057.7", "14541220"]
214
+ // ]
215
+ // }
216
+ //
217
+ const data = this.safeValue(message, 'data', []);
218
+ const stored = this.trades;
219
+ for (let i = 0; i < data.length; i++) {
220
+ const rawTrade = data[i];
221
+ const parsed = this.parseWsOldTrade(rawTrade);
222
+ stored.append(parsed);
223
+ }
224
+ const messageHash = 'trades';
225
+ this.trades = stored;
226
+ client.resolve(this.trades, messageHash);
227
+ }
228
+ async watchTicker(symbol, params = {}) {
229
+ /**
230
+ * @method
231
+ * @name cex#watchTicker
232
+ * @see https://cex.io/websocket-api#ticker-subscription
233
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
234
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
235
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
236
+ * @param {string} [params.method] public or private
237
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
238
+ */
239
+ await this.loadMarkets();
240
+ const market = this.market(symbol);
241
+ symbol = market['symbol'];
242
+ const url = this.urls['api']['ws'];
243
+ const messageHash = 'ticker:' + symbol;
244
+ const method = this.safeString(params, 'method', 'private'); // default to private because the specified ticker is received quicker
245
+ let message = {
246
+ 'e': 'subscribe',
247
+ 'rooms': [
248
+ 'tickers',
249
+ ],
250
+ };
251
+ let subscriptionHash = 'tickers';
252
+ if (method === 'private') {
253
+ await this.authenticate();
254
+ message = {
255
+ 'e': 'ticker',
256
+ 'data': [
257
+ market['baseId'], market['quoteId'],
258
+ ],
259
+ 'oid': this.requestId(),
260
+ };
261
+ subscriptionHash = 'ticker:' + symbol;
262
+ }
263
+ const request = this.deepExtend(message, params);
264
+ return await this.watch(url, messageHash, request, subscriptionHash);
265
+ }
266
+ async watchTickers(symbols = undefined, params = {}) {
267
+ /**
268
+ * @method
269
+ * @name cex#watchTickers
270
+ * @see https://cex.io/websocket-api#ticker-subscription
271
+ * @description watches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
272
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
273
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
274
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
275
+ */
276
+ await this.loadMarkets();
277
+ symbols = this.marketSymbols(symbols);
278
+ const url = this.urls['api']['ws'];
279
+ const messageHash = 'tickers';
280
+ const message = {
281
+ 'e': 'subscribe',
282
+ 'rooms': [
283
+ 'tickers',
284
+ ],
285
+ };
286
+ const request = this.deepExtend(message, params);
287
+ const ticker = await this.watch(url, messageHash, request, messageHash);
288
+ const tickerSymbol = ticker['symbol'];
289
+ if (symbols !== undefined && !this.inArray(tickerSymbol, symbols)) {
290
+ return await this.watchTickers(symbols, params);
291
+ }
292
+ if (this.newUpdates) {
293
+ const result = {};
294
+ result[tickerSymbol] = ticker;
295
+ return result;
296
+ }
297
+ return this.filterByArray(this.tickers, 'symbol', symbols);
298
+ }
299
+ async fetchTickerWs(symbol, params = {}) {
300
+ /**
301
+ * @method
302
+ * @name cex#fetchTickerWs
303
+ * @see https://docs.cex.io/#ws-api-ticker-deprecated
304
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
305
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
306
+ * @param {object} [params] extra parameters specific to the cex api endpoint
307
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
308
+ */
309
+ await this.loadMarkets();
310
+ const market = this.market(symbol);
311
+ const url = this.urls['api']['ws'];
312
+ const messageHash = this.requestId();
313
+ const request = this.extend({
314
+ 'e': 'ticker',
315
+ 'oid': messageHash,
316
+ 'data': [market['base'], market['quote']],
317
+ }, params);
318
+ return await this.watch(url, messageHash, request, messageHash);
319
+ }
320
+ handleTicker(client, message) {
321
+ //
322
+ // {
323
+ // "e": "tick",
324
+ // "data": {
325
+ // "symbol1": "LRC",
326
+ // "symbol2": "USD",
327
+ // "price": "0.305",
328
+ // "open24": "0.301",
329
+ // "volume": "241421.641700"
330
+ // }
331
+ // }
332
+ //
333
+ const data = this.safeValue(message, 'data', {});
334
+ const ticker = this.parseWsTicker(data);
335
+ const symbol = ticker['symbol'];
336
+ this.tickers[symbol] = ticker;
337
+ let messageHash = 'ticker:' + symbol;
338
+ client.resolve(ticker, messageHash);
339
+ client.resolve(ticker, 'tickers');
340
+ messageHash = this.safeString(message, 'oid');
341
+ client.resolve(ticker, messageHash);
342
+ }
343
+ parseWsTicker(ticker, market = undefined) {
344
+ //
345
+ // public
346
+ // {
347
+ // "symbol1": "LRC",
348
+ // "symbol2": "USD",
349
+ // "price": "0.305",
350
+ // "open24": "0.301",
351
+ // "volume": "241421.641700"
352
+ // }
353
+ // private
354
+ // {
355
+ // "timestamp": "1663764969",
356
+ // "low": "18756.3",
357
+ // "high": "19200",
358
+ // "last": "19200",
359
+ // "volume": "0.94735907",
360
+ // "volume30d": "64.61299999",
361
+ // "bid": 19217.2,
362
+ // "ask": 19247.5,
363
+ // "priceChange": "44.3",
364
+ // "priceChangePercentage": "0.23",
365
+ // "pair": ["BTC", "USDT"]
366
+ // }
367
+ const pair = this.safeValue(ticker, 'pair', []);
368
+ let baseId = this.safeString(ticker, 'symbol1');
369
+ if (baseId === undefined) {
370
+ baseId = this.safeString(pair, 0);
371
+ }
372
+ let quoteId = this.safeString(ticker, 'symbol2');
373
+ if (quoteId === undefined) {
374
+ quoteId = this.safeString(pair, 1);
375
+ }
376
+ const base = this.safeCurrencyCode(baseId);
377
+ const quote = this.safeCurrencyCode(quoteId);
378
+ const symbol = base + '/' + quote;
379
+ let timestamp = this.safeInteger(ticker, 'timestamp');
380
+ if (timestamp !== undefined) {
381
+ timestamp = timestamp * 1000;
382
+ }
383
+ return this.safeTicker({
384
+ 'symbol': symbol,
385
+ 'timestamp': timestamp,
386
+ 'datetime': this.iso8601(timestamp),
387
+ 'high': this.safeString(ticker, 'high'),
388
+ 'low': this.safeString(ticker, 'low'),
389
+ 'bid': this.safeString(ticker, 'bid'),
390
+ 'bidVolume': undefined,
391
+ 'ask': this.safeString(ticker, 'ask'),
392
+ 'askVolume': undefined,
393
+ 'vwap': undefined,
394
+ 'open': this.safeString(ticker, 'open24'),
395
+ 'close': undefined,
396
+ 'last': this.safeString2(ticker, 'price', 'last'),
397
+ 'previousClose': undefined,
398
+ 'change': this.safeString(ticker, 'priceChange'),
399
+ 'percentage': this.safeString(ticker, 'priceChangePercentage'),
400
+ 'average': undefined,
401
+ 'baseVolume': undefined,
402
+ 'quoteVolume': this.safeString(ticker, 'volume'),
403
+ 'info': ticker,
404
+ }, market);
405
+ }
406
+ async fetchBalanceWs(params = {}) {
407
+ /**
408
+ * @method
409
+ * @name cex#fetchBalanceWs
410
+ * @see https://docs.cex.io/#ws-api-get-balance
411
+ * @description query for balance and get the amount of funds available for trading or funds locked in orders
412
+ * @param {object} [params] extra parameters specific to the cex api endpoint
413
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
414
+ */
415
+ await this.loadMarkets();
416
+ await this.authenticate();
417
+ const url = this.urls['api']['ws'];
418
+ const messageHash = this.requestId();
419
+ const request = this.extend({
420
+ 'e': 'get-balance',
421
+ 'oid': messageHash,
422
+ }, params);
423
+ return await this.watch(url, messageHash, request, messageHash);
424
+ }
425
+ async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
426
+ /**
427
+ * @method
428
+ * @name cex#watchOrders
429
+ * @description get the list of orders associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods (~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
430
+ * @see https://docs.cex.io/#ws-api-open-orders
431
+ * @param {string} symbol unified symbol of the market to fetch trades for
432
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
433
+ * @param {int} [limit] the maximum amount of trades to fetch
434
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
435
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
436
+ */
437
+ if (symbol === undefined) {
438
+ throw new errors.ArgumentsRequired(this.id + ' watchOrders() requires a symbol argument');
439
+ }
440
+ await this.loadMarkets();
441
+ await this.authenticate(params);
442
+ const url = this.urls['api']['ws'];
443
+ const market = this.market(symbol);
444
+ symbol = market['symbol'];
445
+ const messageHash = 'orders:' + symbol;
446
+ const message = {
447
+ 'e': 'open-orders',
448
+ 'data': {
449
+ 'pair': [
450
+ market['baseId'],
451
+ market['quoteId'],
452
+ ],
453
+ },
454
+ 'oid': symbol,
455
+ };
456
+ const request = this.deepExtend(message, params);
457
+ const orders = await this.watch(url, messageHash, request, messageHash, request);
458
+ if (this.newUpdates) {
459
+ limit = orders.getLimit(symbol, limit);
460
+ }
461
+ return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
462
+ }
463
+ async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
464
+ /**
465
+ * @method
466
+ * @name cex#watchMyTrades
467
+ * @description get the list of trades associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods (~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
468
+ * @see https://docs.cex.io/#ws-api-open-orders
469
+ * @param {string} symbol unified symbol of the market to fetch trades for
470
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
471
+ * @param {int} [limit] the maximum amount of trades to fetch
472
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
473
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
474
+ */
475
+ if (symbol === undefined) {
476
+ throw new errors.ArgumentsRequired(this.id + ' watchMyTrades() requires a symbol argument');
477
+ }
478
+ await this.loadMarkets();
479
+ await this.authenticate(params);
480
+ const url = this.urls['api']['ws'];
481
+ const market = this.market(symbol);
482
+ const messageHash = 'myTrades:' + market['symbol'];
483
+ const subscriptionHash = 'orders:' + market['symbol'];
484
+ const message = {
485
+ 'e': 'open-orders',
486
+ 'data': {
487
+ 'pair': [
488
+ market['baseId'],
489
+ market['quoteId'],
490
+ ],
491
+ },
492
+ 'oid': market['symbol'],
493
+ };
494
+ const request = this.deepExtend(message, params);
495
+ const orders = await this.watch(url, messageHash, request, subscriptionHash, request);
496
+ return this.filterBySymbolSinceLimit(orders, market['symbol'], since, limit);
497
+ }
498
+ handleTransaction(client, message) {
499
+ const data = this.safeValue(message, 'data');
500
+ const symbol2 = this.safeString(data, 'symbol2');
501
+ if (symbol2 === undefined) {
502
+ return;
503
+ }
504
+ this.handleOrderUpdate(client, message);
505
+ this.handleMyTrades(client, message);
506
+ }
507
+ handleMyTrades(client, message) {
508
+ //
509
+ // {
510
+ // "e": "tx",
511
+ // "data": {
512
+ // "d": "order:59091012956:a:USD",
513
+ // "c": "user:up105393824:a:USD",
514
+ // "a": "0.01",
515
+ // "ds": 0,
516
+ // "cs": "15.27",
517
+ // "user": "up105393824",
518
+ // "symbol": "USD",
519
+ // "order": 59091012956,
520
+ // "amount": "-18.49",
521
+ // "type": "buy",
522
+ // "time": "2022-09-24T19:36:18.466Z",
523
+ // "balance": "15.27",
524
+ // "id": "59091012966"
525
+ // }
526
+ // }
527
+ // {
528
+ // "e": "tx",
529
+ // "data": {
530
+ // "d": "order:59091012956:a:BTC",
531
+ // "c": "user:up105393824:a:BTC",
532
+ // "a": "0.00096420",
533
+ // "ds": 0,
534
+ // "cs": "0.00096420",
535
+ // "user": "up105393824",
536
+ // "symbol": "BTC",
537
+ // "symbol2": "USD",
538
+ // "amount": "0.00096420",
539
+ // "buy": 59091012956,
540
+ // "order": 59091012956,
541
+ // "sell": 59090796005,
542
+ // "price": 19135,
543
+ // "type": "buy",
544
+ // "time": "2022-09-24T19:36:18.466Z",
545
+ // "balance": "0.00096420",
546
+ // "fee_amount": "0.05",
547
+ // "id": "59091012962"
548
+ // }
549
+ // }
550
+ const data = this.safeValue(message, 'data', {});
551
+ let stored = this.myTrades;
552
+ if (stored === undefined) {
553
+ const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
554
+ stored = new Cache.ArrayCacheBySymbolById(limit);
555
+ this.myTrades = stored;
556
+ }
557
+ const trade = this.parseWsTrade(data);
558
+ stored.append(trade);
559
+ const messageHash = 'myTrades:' + trade['symbol'];
560
+ client.resolve(stored, messageHash);
561
+ }
562
+ parseWsTrade(trade, market = undefined) {
563
+ //
564
+ // {
565
+ // "d": "order:59091012956:a:BTC",
566
+ // "c": "user:up105393824:a:BTC",
567
+ // "a": "0.00096420",
568
+ // "ds": 0,
569
+ // "cs": "0.00096420",
570
+ // "user": "up105393824",
571
+ // "symbol": "BTC",
572
+ // "symbol2": "USD",
573
+ // "amount": "0.00096420",
574
+ // "buy": 59091012956,
575
+ // "order": 59091012956,
576
+ // "sell": 59090796005,
577
+ // "price": 19135,
578
+ // "type": "buy",
579
+ // "time": "2022-09-24T19:36:18.466Z",
580
+ // "balance": "0.00096420",
581
+ // "fee_amount": "0.05",
582
+ // "id": "59091012962"
583
+ // }
584
+ // Note symbol and symbol2 are inverse on sell and ammount is in symbol currency.
585
+ //
586
+ const side = this.safeString(trade, 'type');
587
+ const price = this.safeString(trade, 'price');
588
+ const datetime = this.safeString(trade, 'time');
589
+ const baseId = this.safeString(trade, 'symbol');
590
+ const quoteId = this.safeString(trade, 'symbol2');
591
+ const base = this.safeCurrencyCode(baseId);
592
+ const quote = this.safeCurrencyCode(quoteId);
593
+ let symbol = base + '/' + quote;
594
+ let amount = this.safeString(trade, 'amount');
595
+ if (side === 'sell') {
596
+ symbol = quote + '/' + base;
597
+ amount = Precise["default"].stringDiv(amount, price); // due to rounding errors amount in not exact to trade
598
+ }
599
+ const parsedTrade = {
600
+ 'id': this.safeString(trade, 'id'),
601
+ 'order': this.safeString(trade, 'order'),
602
+ 'info': trade,
603
+ 'timestamp': this.parse8601(datetime),
604
+ 'datetime': datetime,
605
+ 'symbol': symbol,
606
+ 'type': undefined,
607
+ 'side': side,
608
+ 'takerOrMaker': undefined,
609
+ 'price': price,
610
+ 'cost': undefined,
611
+ 'amount': amount,
612
+ 'fee': undefined,
613
+ };
614
+ const fee = this.safeString(trade, 'fee_amount');
615
+ if (fee !== undefined) {
616
+ parsedTrade['fee'] = {
617
+ 'cost': fee,
618
+ 'currency': quote,
619
+ 'rate': undefined,
620
+ };
621
+ }
622
+ return this.safeTrade(parsedTrade, market);
623
+ }
624
+ handleOrderUpdate(client, message) {
625
+ //
626
+ // partialExecution
627
+ // {
628
+ // "e": "order",
629
+ // "data": {
630
+ // "id": "150714937",
631
+ // "remains": "1000000",
632
+ // "price": "17513",
633
+ // "amount": 2000000, As Precision
634
+ // "time": "1654506118448",
635
+ // "type": "buy",
636
+ // "pair": {
637
+ // "symbol1": "BTC",
638
+ // "symbol2": "USD"
639
+ // },
640
+ // "fee": "0.15"
641
+ // }
642
+ // }
643
+ // canceled order
644
+ // {
645
+ // "e": "order",
646
+ // "data": {
647
+ // "id": "6310857",
648
+ // "remains": "200000000"
649
+ // "fremains": "2.00000000"
650
+ // "cancel": true,
651
+ // "pair": {
652
+ // "symbol1": "BTC",
653
+ // "symbol2": "USD"
654
+ // }
655
+ // }
656
+ // }
657
+ // fullfilledOrder
658
+ // {
659
+ // "e": "order",
660
+ // "data": {
661
+ // "id": "59098421630",
662
+ // "remains": "0",
663
+ // "pair": {
664
+ // "symbol1": "BTC",
665
+ // "symbol2": "USD"
666
+ // }
667
+ // }
668
+ // }
669
+ // {
670
+ // "e": "tx",
671
+ // "data": {
672
+ // "d": "order:59425993014:a:BTC",
673
+ // "c": "user:up105393824:a:BTC",
674
+ // "a": "0.00098152",
675
+ // "ds": 0,
676
+ // "cs": "0.00098152",
677
+ // "user": "up105393824",
678
+ // "symbol": "BTC",
679
+ // "symbol2": "USD",
680
+ // "amount": "0.00098152",
681
+ // "buy": 59425993014,
682
+ // "order": 59425993014,
683
+ // "sell": 59425986168,
684
+ // "price": 19306.6,
685
+ // "type": "buy",
686
+ // "time": "2022-10-02T01:11:15.148Z",
687
+ // "balance": "0.00098152",
688
+ // "fee_amount": "0.05",
689
+ // "id": "59425993020"
690
+ // }
691
+ // }
692
+ //
693
+ const data = this.safeValue(message, 'data', {});
694
+ const isTransaction = this.safeString(message, 'e') === 'tx';
695
+ const orderId = this.safeString2(data, 'id', 'order');
696
+ let remains = this.safeString(data, 'remains');
697
+ let baseId = this.safeString(data, 'symbol');
698
+ let quoteId = this.safeString(data, 'symbol2');
699
+ const pair = this.safeValue(data, 'pair');
700
+ if (pair !== undefined) {
701
+ baseId = this.safeString(pair, 'symbol1');
702
+ quoteId = this.safeString(pair, 'symbol2');
703
+ }
704
+ const base = this.safeCurrencyCode(baseId);
705
+ const quote = this.safeCurrencyCode(quoteId);
706
+ const symbol = base + '/' + quote;
707
+ const market = this.safeMarket(symbol);
708
+ remains = this.currencyFromPrecision(base, remains);
709
+ if (this.orders === undefined) {
710
+ const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
711
+ this.orders = new Cache.ArrayCacheBySymbolById(limit);
712
+ }
713
+ const storedOrders = this.orders;
714
+ const ordersBySymbol = this.safeValue(storedOrders.hashmap, symbol, {});
715
+ let order = this.safeValue(ordersBySymbol, orderId);
716
+ if (order === undefined) {
717
+ order = this.parseWsOrderUpdate(data, market);
718
+ }
719
+ order['remaining'] = remains;
720
+ const canceled = this.safeValue(data, 'cancel', false);
721
+ if (canceled) {
722
+ order['status'] = 'canceled';
723
+ }
724
+ if (isTransaction) {
725
+ order['status'] = 'closed';
726
+ }
727
+ const fee = this.safeNumber(data, 'fee');
728
+ if (fee !== undefined) {
729
+ order['fee'] = {
730
+ 'cost': fee,
731
+ 'currency': quote,
732
+ 'rate': undefined,
733
+ };
734
+ }
735
+ const timestamp = this.safeInteger(data, 'time');
736
+ order['timestamp'] = timestamp;
737
+ order['datetime'] = this.iso8601(timestamp);
738
+ order = this.safeOrder(order);
739
+ storedOrders.append(order);
740
+ const messageHash = 'orders:' + symbol;
741
+ client.resolve(storedOrders, messageHash);
742
+ }
743
+ parseWsOrderUpdate(order, market = undefined) {
744
+ //
745
+ // {
746
+ // "id": "150714937",
747
+ // "remains": "1000000",
748
+ // "price": "17513",
749
+ // "amount": 2000000, As Precision
750
+ // "time": "1654506118448",
751
+ // "type": "buy",
752
+ // "pair": {
753
+ // "symbol1": "BTC",
754
+ // "symbol2": "USD"
755
+ // },
756
+ // "fee": "0.15"
757
+ // }
758
+ // transaction
759
+ // {
760
+ // "d": "order:59425993014:a:BTC",
761
+ // "c": "user:up105393824:a:BTC",
762
+ // "a": "0.00098152",
763
+ // "ds": 0,
764
+ // "cs": "0.00098152",
765
+ // "user": "up105393824",
766
+ // "symbol": "BTC",
767
+ // "symbol2": "USD",
768
+ // "amount": "0.00098152",
769
+ // "buy": 59425993014,
770
+ // "order": 59425993014,
771
+ // "sell": 59425986168,
772
+ // "price": 19306.6,
773
+ // "type": "buy",
774
+ // "time": "2022-10-02T01:11:15.148Z",
775
+ // "balance": "0.00098152",
776
+ // "fee_amount": "0.05",
777
+ // "id": "59425993020"
778
+ // }
779
+ //
780
+ const isTransaction = this.safeValue(order, 'd') !== undefined;
781
+ const remainsPrecision = this.safeString(order, 'remains');
782
+ let remaining = undefined;
783
+ if (remainsPrecision !== undefined) {
784
+ remaining = this.currencyFromPrecision(market['base'], remainsPrecision);
785
+ }
786
+ const amount = this.safeString(order, 'amount');
787
+ if (!isTransaction) {
788
+ this.currencyFromPrecision(market['base'], amount);
789
+ }
790
+ let baseId = this.safeString(order, 'symbol');
791
+ let quoteId = this.safeString(order, 'symbol2');
792
+ const pair = this.safeValue(order, 'pair');
793
+ if (pair !== undefined) {
794
+ baseId = this.safeString(order, 'symbol1');
795
+ quoteId = this.safeString(order, 'symbol2');
796
+ }
797
+ const base = this.safeCurrencyCode(baseId);
798
+ const quote = this.safeCurrencyCode(quoteId);
799
+ let symbol = undefined;
800
+ if (base !== undefined && quote !== undefined) {
801
+ symbol = base + '/' + quote;
802
+ }
803
+ market = this.safeMarket(symbol, market);
804
+ const time = this.safeInteger(order, 'time', this.milliseconds());
805
+ let timestamp = time;
806
+ if (isTransaction) {
807
+ timestamp = this.parse8601(time);
808
+ }
809
+ const canceled = this.safeValue(order, 'cancel', false);
810
+ let status = 'open';
811
+ if (canceled) {
812
+ status = 'canceled';
813
+ }
814
+ else if (isTransaction) {
815
+ status = 'closed';
816
+ }
817
+ const parsedOrder = {
818
+ 'id': this.safeString2(order, 'id', 'order'),
819
+ 'clientOrderId': undefined,
820
+ 'info': order,
821
+ 'timestamp': timestamp,
822
+ 'datetime': this.iso8601(timestamp),
823
+ 'lastTradeTimestamp': undefined,
824
+ 'status': status,
825
+ 'symbol': symbol,
826
+ 'type': undefined,
827
+ 'timeInForce': undefined,
828
+ 'postOnly': undefined,
829
+ 'side': this.safeString(order, 'type'),
830
+ 'price': this.safeNumber(order, 'price'),
831
+ 'stopPrice': undefined,
832
+ 'triggerPrice': undefined,
833
+ 'average': undefined,
834
+ 'cost': undefined,
835
+ 'amount': amount,
836
+ 'filled': undefined,
837
+ 'remaining': remaining,
838
+ 'fee': {
839
+ 'cost': this.safeNumber2(order, 'fee', 'fee_amount'),
840
+ 'currency': quote,
841
+ 'rate': undefined,
842
+ },
843
+ 'trades': undefined,
844
+ };
845
+ if (isTransaction) {
846
+ parsedOrder['trades'] = this.parseWsTrade(order, market);
847
+ }
848
+ return this.safeOrder(parsedOrder, market);
849
+ }
850
+ fromPrecision(amount, scale) {
851
+ if (amount === undefined) {
852
+ return undefined;
853
+ }
854
+ const precise = new Precise["default"](amount);
855
+ precise.decimals = this.sum(precise.decimals, scale);
856
+ precise.reduce();
857
+ return precise.toString();
858
+ }
859
+ currencyFromPrecision(currency, amount) {
860
+ const scale = this.safeInteger(this.currencies[currency], 'precision', 0);
861
+ return this.fromPrecision(amount, scale);
862
+ }
863
+ handleOrdersSnapshot(client, message) {
864
+ //
865
+ // {
866
+ // "e": "open-orders",
867
+ // "data": [{
868
+ // "id": "59098421630",
869
+ // "time": "1664062285425",
870
+ // "type": "buy",
871
+ // "price": "18920",
872
+ // "amount": "0.00100000",
873
+ // "pending": "0.00100000"
874
+ // }],
875
+ // "oid": 1,
876
+ // "ok": "ok"
877
+ // }
878
+ //
879
+ const symbol = this.safeString(message, 'oid'); // symbol is set as requestId in watchOrders
880
+ const rawOrders = this.safeValue(message, 'data', []);
881
+ let myOrders = this.orders;
882
+ if (this.orders === undefined) {
883
+ const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
884
+ myOrders = new Cache.ArrayCacheBySymbolById(limit);
885
+ }
886
+ for (let i = 0; i < rawOrders.length; i++) {
887
+ const rawOrder = rawOrders[i];
888
+ const market = this.safeMarket(symbol);
889
+ const order = this.parseOrder(rawOrder, market);
890
+ order['status'] = 'open';
891
+ myOrders.append(order);
892
+ }
893
+ this.orders = myOrders;
894
+ const messageHash = 'orders:' + symbol;
895
+ const ordersLength = myOrders.length;
896
+ if (ordersLength > 0) {
897
+ client.resolve(myOrders, messageHash);
898
+ }
899
+ }
900
+ async watchOrderBook(symbol, limit = undefined, params = {}) {
901
+ /**
902
+ * @method
903
+ * @name cex#watchOrderBook
904
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
905
+ * @see https://cex.io/websocket-api#orderbook-subscribe
906
+ * @param {string} symbol unified symbol of the market to fetch the order book for
907
+ * @param {int} [limit] the maximum amount of order book entries to return
908
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
909
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
910
+ */
911
+ await this.loadMarkets();
912
+ await this.authenticate();
913
+ const market = this.market(symbol);
914
+ symbol = market['symbol'];
915
+ const url = this.urls['api']['ws'];
916
+ const messageHash = 'orderbook:' + symbol;
917
+ const depth = (limit === undefined) ? 0 : limit;
918
+ const subscribe = {
919
+ 'e': 'order-book-subscribe',
920
+ 'data': {
921
+ 'pair': [
922
+ market['baseId'],
923
+ market['quoteId'],
924
+ ],
925
+ 'subscribe': true,
926
+ 'depth': depth,
927
+ },
928
+ 'oid': this.requestId(),
929
+ };
930
+ const request = this.deepExtend(subscribe, params);
931
+ const orderbook = await this.watch(url, messageHash, request, messageHash);
932
+ return orderbook.limit();
933
+ }
934
+ handleOrderBookSnapshot(client, message) {
935
+ //
936
+ // {
937
+ // "e": "order-book-subscribe",
938
+ // "data": {
939
+ // "timestamp": 1663762032,
940
+ // "timestamp_ms": 1663762031680,
941
+ // "bids": [
942
+ // [ 241.947, 155.91626 ],
943
+ // [ 241, 154 ],
944
+ // ],
945
+ // "asks": [
946
+ // [ 242.947, 155.91626 ],
947
+ // [ 243, 154 ], ],
948
+ // "pair": "BTC:USDT",
949
+ // "id": 616267120,
950
+ // "sell_total": "13.59066946",
951
+ // "buy_total": "163553.625948"
952
+ // },
953
+ // "oid": "1",
954
+ // "ok": "ok"
955
+ // }
956
+ //
957
+ const data = this.safeValue(message, 'data', {});
958
+ const pair = this.safeString(data, 'pair');
959
+ const symbol = this.pairToSymbol(pair);
960
+ const messageHash = 'orderbook:' + symbol;
961
+ const timestamp = this.safeInteger2(data, 'timestamp_ms', 'timestamp');
962
+ const incrementalId = this.safeNumber(data, 'id');
963
+ const storedOrderBook = this.orderBook({});
964
+ const snapshot = this.parseOrderBook(data, symbol, timestamp, 'bids', 'asks');
965
+ snapshot['nonce'] = incrementalId;
966
+ storedOrderBook.reset(snapshot);
967
+ this.options['orderbook'][symbol] = {
968
+ 'incrementalId': incrementalId,
969
+ };
970
+ this.orderbooks[symbol] = storedOrderBook;
971
+ client.resolve(storedOrderBook, messageHash);
972
+ }
973
+ pairToSymbol(pair) {
974
+ const parts = pair.split(':');
975
+ const baseId = this.safeString(parts, 0);
976
+ const quoteId = this.safeString(parts, 1);
977
+ const base = this.safeCurrencyCode(baseId);
978
+ const quote = this.safeCurrencyCode(quoteId);
979
+ const symbol = base + '/' + quote;
980
+ return symbol;
981
+ }
982
+ handleOrderBookUpdate(client, message) {
983
+ //
984
+ // {
985
+ // "e": "md_update",
986
+ // "data": {
987
+ // "id": 616267121,
988
+ // "pair": "BTC:USDT",
989
+ // "time": 1663762031719,
990
+ // "bids": [],
991
+ // "asks": [
992
+ // [122, 23]
993
+ // ]
994
+ // }
995
+ // }
996
+ //
997
+ const data = this.safeValue(message, 'data', {});
998
+ const incrementalId = this.safeNumber(data, 'id');
999
+ const pair = this.safeString(data, 'pair', '');
1000
+ const symbol = this.pairToSymbol(pair);
1001
+ const storedOrderBook = this.safeValue(this.orderbooks, symbol);
1002
+ const messageHash = 'orderbook:' + symbol;
1003
+ if (incrementalId !== storedOrderBook['nonce'] + 1) {
1004
+ delete client.subscriptions[messageHash];
1005
+ client.reject(this.id + ' watchOrderBook() skipped a message', messageHash);
1006
+ }
1007
+ const timestamp = this.safeInteger(data, 'time');
1008
+ const asks = this.safeValue(data, 'asks', []);
1009
+ const bids = this.safeValue(data, 'bids', []);
1010
+ this.handleDeltas(storedOrderBook['asks'], asks);
1011
+ this.handleDeltas(storedOrderBook['bids'], bids);
1012
+ storedOrderBook['timestamp'] = timestamp;
1013
+ storedOrderBook['datetime'] = this.iso8601(timestamp);
1014
+ storedOrderBook['nonce'] = incrementalId;
1015
+ client.resolve(storedOrderBook, messageHash);
1016
+ }
1017
+ handleDelta(bookside, delta) {
1018
+ const bidAsk = this.parseBidAsk(delta, 0, 1);
1019
+ bookside.storeArray(bidAsk);
1020
+ }
1021
+ handleDeltas(bookside, deltas) {
1022
+ for (let i = 0; i < deltas.length; i++) {
1023
+ this.handleDelta(bookside, deltas[i]);
1024
+ }
1025
+ }
1026
+ async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
1027
+ /**
1028
+ * @method
1029
+ * @name cex#watchOHLCV
1030
+ * @see https://cex.io/websocket-api#minute-data
1031
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. It will return the last 120 minutes with the selected timeframe and then 1m candle updates after that.
1032
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
1033
+ * @param {string} timeframe the length of time each candle represents.
1034
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
1035
+ * @param {int} [limit] the maximum amount of candles to fetch
1036
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1037
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
1038
+ */
1039
+ await this.loadMarkets();
1040
+ const market = this.market(symbol);
1041
+ symbol = market['symbol'];
1042
+ const messageHash = 'ohlcv:' + symbol;
1043
+ const url = this.urls['api']['ws'];
1044
+ const request = {
1045
+ 'e': 'init-ohlcv',
1046
+ 'i': timeframe,
1047
+ 'rooms': [
1048
+ 'pair-' + market['baseId'] + '-' + market['quoteId'],
1049
+ ],
1050
+ };
1051
+ const ohlcv = await this.watch(url, messageHash, this.extend(request, params), messageHash);
1052
+ if (this.newUpdates) {
1053
+ limit = ohlcv.getLimit(symbol, limit);
1054
+ }
1055
+ return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
1056
+ }
1057
+ handleInitOHLCV(client, message) {
1058
+ //
1059
+ // {
1060
+ // "e": "init-ohlcv-data",
1061
+ // "data": [
1062
+ // [
1063
+ // 1663660680,
1064
+ // "19396.4",
1065
+ // "19396.4",
1066
+ // "19396.4",
1067
+ // "19396.4",
1068
+ // "1262861"
1069
+ // ],
1070
+ // ...
1071
+ // ],
1072
+ // "pair": "BTC:USDT"
1073
+ // }
1074
+ //
1075
+ const pair = this.safeString(message, 'pair');
1076
+ const parts = pair.split(':');
1077
+ const baseId = this.safeString(parts, 0);
1078
+ const quoteId = this.safeString(parts, 1);
1079
+ const base = this.safeCurrencyCode(baseId);
1080
+ const quote = this.safeCurrencyCode(quoteId);
1081
+ const symbol = base + '/' + quote;
1082
+ const market = this.safeMarket(symbol);
1083
+ const messageHash = 'ohlcv:' + symbol;
1084
+ const data = this.safeValue(message, 'data', []);
1085
+ const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
1086
+ const stored = new Cache.ArrayCacheByTimestamp(limit);
1087
+ const sorted = this.sortBy(data, 0);
1088
+ for (let i = 0; i < sorted.length; i++) {
1089
+ stored.append(this.parseOHLCV(sorted[i], market));
1090
+ }
1091
+ this.ohlcvs[symbol] = stored;
1092
+ client.resolve(stored, messageHash);
1093
+ }
1094
+ handleOHLCV24(client, message) {
1095
+ //
1096
+ // {
1097
+ // "e": "ohlcv24",
1098
+ // "data": [ '18793.2', '19630', '18793.2', "19104.1", "314157273" ],
1099
+ // "pair": "BTC:USDT"
1100
+ // }
1101
+ //
1102
+ return message;
1103
+ }
1104
+ handleOHLCV1m(client, message) {
1105
+ //
1106
+ // {
1107
+ // "e": "ohlcv1m",
1108
+ // "data": {
1109
+ // "pair": "BTC:USD",
1110
+ // "time": "1665436800",
1111
+ // "o": "19279.6",
1112
+ // "h": "19279.6",
1113
+ // "l": "19266.7",
1114
+ // "c": "19266.7",
1115
+ // "v": 3343884,
1116
+ // "d": 3343884
1117
+ // }
1118
+ // }
1119
+ //
1120
+ const data = this.safeValue(message, 'data', {});
1121
+ const pair = this.safeString(data, 'pair');
1122
+ const symbol = this.pairToSymbol(pair);
1123
+ const messageHash = 'ohlcv:' + symbol;
1124
+ const ohlcv = [
1125
+ this.safeTimestamp(data, 'time'),
1126
+ this.safeNumber(data, 'o'),
1127
+ this.safeNumber(data, 'h'),
1128
+ this.safeNumber(data, 'l'),
1129
+ this.safeNumber(data, 'c'),
1130
+ this.safeNumber(data, 'v'),
1131
+ ];
1132
+ const stored = this.safeValue(this.ohlcvs, symbol);
1133
+ stored.append(ohlcv);
1134
+ client.resolve(stored, messageHash);
1135
+ }
1136
+ handleOHLCV(client, message) {
1137
+ //
1138
+ // {
1139
+ // "e": "ohlcv",
1140
+ // "data": [
1141
+ // [1665461100, '19068.2', '19068.2', '19068.2', "19068.2", 268478]
1142
+ // ],
1143
+ // "pair": "BTC:USD"
1144
+ // }
1145
+ //
1146
+ const data = this.safeValue(message, 'data', []);
1147
+ const pair = this.safeString(message, 'pair');
1148
+ const symbol = this.pairToSymbol(pair);
1149
+ const messageHash = 'ohlcv:' + symbol;
1150
+ const stored = this.safeValue(this.ohlcvs, symbol);
1151
+ for (let i = 0; i < data.length; i++) {
1152
+ const ohlcv = [
1153
+ this.safeTimestamp(data[i], 0),
1154
+ this.safeNumber(data[i], 1),
1155
+ this.safeNumber(data[i], 2),
1156
+ this.safeNumber(data[i], 3),
1157
+ this.safeNumber(data[i], 4),
1158
+ this.safeNumber(data[i], 5),
1159
+ ];
1160
+ stored.append(ohlcv);
1161
+ }
1162
+ const dataLength = data.length;
1163
+ if (dataLength > 0) {
1164
+ client.resolve(stored, messageHash);
1165
+ }
1166
+ }
1167
+ async fetchOrderWs(id, symbol = undefined, params = {}) {
1168
+ /**
1169
+ * @method
1170
+ * @name cex#fetchOrderWs
1171
+ * @description fetches information on an order made by the user
1172
+ * @see https://docs.cex.io/#ws-api-get-order
1173
+ * @param {string} symbol not used by cex fetchOrder
1174
+ * @param {object} [params] extra parameters specific to the cex api endpoint
1175
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1176
+ */
1177
+ await this.loadMarkets();
1178
+ await this.authenticate();
1179
+ let market = undefined;
1180
+ if (symbol !== undefined) {
1181
+ market = this.market(symbol);
1182
+ }
1183
+ const data = this.extend({
1184
+ 'order_id': id.toString(),
1185
+ }, params);
1186
+ const url = this.urls['api']['ws'];
1187
+ const messageHash = this.requestId();
1188
+ const request = {
1189
+ 'e': 'get-order',
1190
+ 'oid': messageHash,
1191
+ 'data': data,
1192
+ };
1193
+ const response = await this.watch(url, messageHash, request, messageHash);
1194
+ return this.parseOrder(response, market);
1195
+ }
1196
+ async fetchOpenOrdersWs(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1197
+ /**
1198
+ * @method
1199
+ * @name cex#fetchOpenOrdersWs
1200
+ * @see https://docs.cex.io/#ws-api-open-orders
1201
+ * @description fetch all unfilled currently open orders
1202
+ * @param {string} symbol unified market symbol
1203
+ * @param {int} [since] the earliest time in ms to fetch open orders for
1204
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
1205
+ * @param {object} [params] extra parameters specific to the cex api endpoint
1206
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1207
+ */
1208
+ if (symbol === undefined) {
1209
+ throw new errors.ArgumentsRequired(this.id + 'fetchOpenOrdersWs requires a symbol.');
1210
+ }
1211
+ await this.loadMarkets();
1212
+ await this.authenticate();
1213
+ const market = this.market(symbol);
1214
+ const url = this.urls['api']['ws'];
1215
+ const messageHash = this.requestId();
1216
+ const data = this.extend({
1217
+ 'pair': [market['baseId'], market['quoteId']],
1218
+ }, params);
1219
+ const request = {
1220
+ 'e': 'open-orders',
1221
+ 'oid': messageHash,
1222
+ 'data': data,
1223
+ };
1224
+ const response = await this.watch(url, messageHash, request, messageHash);
1225
+ return this.parseOrders(response, market, since, limit, params);
1226
+ }
1227
+ async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
1228
+ /**
1229
+ * @method
1230
+ * @name cex#createOrderWs
1231
+ * @see https://docs.cex.io/#ws-api-order-placement
1232
+ * @description create a trade order
1233
+ * @param {string} symbol unified symbol of the market to create an order in
1234
+ * @param {string} type 'market' or 'limit'
1235
+ * @param {string} side 'buy' or 'sell'
1236
+ * @param {float} amount how much of currency you want to trade in units of base currency
1237
+ * @param {float} price the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1238
+ * @param {object} [params] extra parameters specific to the kraken api endpoint
1239
+ * @param {boolean} [params.maker_only] Optional, maker only places an order only if offers best sell (<= max) or buy(>= max) price for this pair, if not order placement will be rejected with an error - "Order is not maker"
1240
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/en/latest/manual.html#order-structure}
1241
+ */
1242
+ if (price === undefined) {
1243
+ throw new errors.BadRequest(this.id + ' createOrderWs requires a price argument');
1244
+ }
1245
+ await this.loadMarkets();
1246
+ await this.authenticate();
1247
+ const market = this.market(symbol);
1248
+ const url = this.urls['api']['ws'];
1249
+ const messageHash = this.requestId();
1250
+ const data = this.extend({
1251
+ 'pair': [market['baseId'], market['quoteId']],
1252
+ 'amount': amount,
1253
+ 'price': price,
1254
+ 'type': side,
1255
+ }, params);
1256
+ const request = {
1257
+ 'e': 'place-order',
1258
+ 'oid': messageHash,
1259
+ 'data': data,
1260
+ };
1261
+ const rawOrder = await this.watch(url, messageHash, request, messageHash);
1262
+ return this.parseOrder(rawOrder, market);
1263
+ }
1264
+ async editOrderWs(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
1265
+ /**
1266
+ * @method
1267
+ * @name cex#editOrderWs
1268
+ * @description edit a trade order
1269
+ * @see https://docs.cex.io/#ws-api-cancel-replace
1270
+ * @param {string} id order id
1271
+ * @param {string} symbol unified symbol of the market to create an order in
1272
+ * @param {string} type 'market' or 'limit'
1273
+ * @param {string} side 'buy' or 'sell'
1274
+ * @param {float} amount how much of the currency you want to trade in units of the base currency
1275
+ * @param {float|undefined} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1276
+ * @param {object} [params] extra parameters specific to the cex api endpoint
1277
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/en/latest/manual.html#order-structure}
1278
+ */
1279
+ if (amount === undefined) {
1280
+ throw new errors.ArgumentsRequired(this.id + ' editOrder() requires a amount argument');
1281
+ }
1282
+ if (price === undefined) {
1283
+ throw new errors.ArgumentsRequired(this.id + ' editOrder() requires a price argument');
1284
+ }
1285
+ await this.loadMarkets();
1286
+ await this.authenticate();
1287
+ const market = this.market(symbol);
1288
+ const data = this.extend({
1289
+ 'pair': [market['baseId'], market['quoteId']],
1290
+ 'type': side,
1291
+ 'amount': amount,
1292
+ 'price': price,
1293
+ 'order_id': id,
1294
+ }, params);
1295
+ const messageHash = this.requestId();
1296
+ const url = this.urls['api']['ws'];
1297
+ const request = {
1298
+ 'e': 'cancel-replace-order',
1299
+ 'oid': messageHash,
1300
+ 'data': data,
1301
+ };
1302
+ const response = await this.watch(url, messageHash, request, messageHash, messageHash);
1303
+ return this.parseOrder(response, market);
1304
+ }
1305
+ async cancelOrderWs(id, symbol = undefined, params = {}) {
1306
+ /**
1307
+ * @method
1308
+ * @name cex#cancelOrderWs
1309
+ * @see https://docs.cex.io/#ws-api-order-cancel
1310
+ * @description cancels an open order
1311
+ * @param {string} id order id
1312
+ * @param {string} symbol not used by cex cancelOrder ()
1313
+ * @param {object} [params] extra parameters specific to the cex api endpoint
1314
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1315
+ */
1316
+ await this.loadMarkets();
1317
+ await this.authenticate();
1318
+ let market = undefined;
1319
+ if (symbol !== undefined) {
1320
+ market = this.market(symbol);
1321
+ }
1322
+ const data = this.extend({
1323
+ 'order_id': id,
1324
+ }, params);
1325
+ const messageHash = this.requestId();
1326
+ const url = this.urls['api']['ws'];
1327
+ const request = {
1328
+ 'e': 'cancel-order',
1329
+ 'oid': messageHash,
1330
+ 'data': data,
1331
+ };
1332
+ const response = await this.watch(url, messageHash, request, messageHash, messageHash);
1333
+ return this.parseOrder(response, market);
1334
+ }
1335
+ async cancelOrdersWs(ids, symbol = undefined, params = {}) {
1336
+ /**
1337
+ * @method
1338
+ * @name cex#cancelOrdersWs
1339
+ * @description cancel multiple orders
1340
+ * @see https://docs.cex.io/#ws-api-mass-cancel-place
1341
+ * @param {string[]} ids order ids
1342
+ * @param {string} symbol not used by cex cancelOrders()
1343
+ * @param {object} [params] extra parameters specific to the cex api endpoint
1344
+ * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1345
+ */
1346
+ if (symbol !== undefined) {
1347
+ throw new errors.BadRequest(this.id + ' cancelOrderWs does not allow filtering by symbol');
1348
+ }
1349
+ await this.loadMarkets();
1350
+ await this.authenticate();
1351
+ const messageHash = this.requestId();
1352
+ const data = this.extend({
1353
+ 'cancel-orders': ids,
1354
+ }, params);
1355
+ const url = this.urls['api']['ws'];
1356
+ const request = {
1357
+ 'e': 'mass-cancel-place-orders',
1358
+ 'oid': messageHash,
1359
+ 'data': data,
1360
+ };
1361
+ const response = await this.watch(url, messageHash, request, messageHash, messageHash);
1362
+ //
1363
+ // {
1364
+ // "cancel-orders": [{
1365
+ // "order_id": 69202557979,
1366
+ // "fremains": "0.15000000"
1367
+ // }],
1368
+ // "place-orders": [],
1369
+ // "placed-cancelled": []
1370
+ // }
1371
+ //
1372
+ const canceledOrders = this.safeValue(response, 'cancel-orders');
1373
+ return this.parseOrders(canceledOrders, undefined, undefined, undefined, params);
1374
+ }
1375
+ resolveData(client, message) {
1376
+ //
1377
+ // "e": "open-orders",
1378
+ // "data": [
1379
+ // {
1380
+ // "id": "2477098",
1381
+ // "time": "1435927928618",
1382
+ // "type": "buy",
1383
+ // "price": "241.9477",
1384
+ // "amount": "0.02000000",
1385
+ // "pending": "0.02000000"
1386
+ // },
1387
+ // ...
1388
+ // ],
1389
+ // "oid": "1435927928274_9_open-orders",
1390
+ // "ok": "ok"
1391
+ // }
1392
+ //
1393
+ const data = this.safeValue(message, 'data');
1394
+ const messageHash = this.safeString(message, 'oid');
1395
+ client.resolve(data, messageHash);
1396
+ }
1397
+ handleConnected(client, message) {
1398
+ //
1399
+ // {
1400
+ // "e": "connected"
1401
+ // }
1402
+ //
1403
+ return message;
1404
+ }
1405
+ handleErrorMessage(client, message) {
1406
+ //
1407
+ // {
1408
+ // "e": "get-balance",
1409
+ // "data": { error: "Please Login" },
1410
+ // "oid": 1,
1411
+ // "ok": "error"
1412
+ // }
1413
+ //
1414
+ try {
1415
+ const data = this.safeValue(message, 'data', {});
1416
+ const error = this.safeString(data, 'error');
1417
+ const event = this.safeString(message, 'e', '');
1418
+ const feedback = this.id + ' ' + event + ' ' + error;
1419
+ this.throwExactlyMatchedException(this.exceptions['exact'], error, feedback);
1420
+ this.throwBroadlyMatchedException(this.exceptions['broad'], error, feedback);
1421
+ throw new errors.ExchangeError(feedback);
1422
+ }
1423
+ catch (error) {
1424
+ const messageHash = this.safeString(message, 'oid');
1425
+ const future = this.safeValue(client['futures'], messageHash);
1426
+ if (future !== undefined) {
1427
+ client.reject(error, messageHash);
1428
+ }
1429
+ else {
1430
+ throw error;
1431
+ }
1432
+ }
1433
+ }
1434
+ handleMessage(client, message) {
1435
+ const ok = this.safeString(message, 'ok');
1436
+ if (ok === 'error') {
1437
+ return this.handleErrorMessage(client, message);
1438
+ }
1439
+ const event = this.safeString(message, 'e');
1440
+ const handlers = {
1441
+ 'auth': this.handleAuthenticationMessage,
1442
+ 'connected': this.handleConnected,
1443
+ 'tick': this.handleTicker,
1444
+ 'ticker': this.handleTicker,
1445
+ 'init-ohlcv-data': this.handleInitOHLCV,
1446
+ 'ohlcv24': this.handleOHLCV24,
1447
+ 'ohlcv1m': this.handleOHLCV1m,
1448
+ 'ohlcv': this.handleOHLCV,
1449
+ 'get-balance': this.handleBalance,
1450
+ 'order-book-subscribe': this.handleOrderBookSnapshot,
1451
+ 'md_update': this.handleOrderBookUpdate,
1452
+ 'open-orders': this.resolveData,
1453
+ 'order': this.handleOrderUpdate,
1454
+ 'history-update': this.handleTrade,
1455
+ 'history': this.handleTradesSnapshot,
1456
+ 'tx': this.handleTransaction,
1457
+ 'place-order': this.resolveData,
1458
+ 'cancel-replace-order': this.resolveData,
1459
+ 'cancel-order': this.resolveData,
1460
+ 'mass-cancel-place-orders': this.resolveData,
1461
+ 'get-order': this.resolveData,
1462
+ };
1463
+ const handler = this.safeValue(handlers, event);
1464
+ if (handler !== undefined) {
1465
+ return handler.call(this, client, message);
1466
+ }
1467
+ return message;
1468
+ }
1469
+ handleAuthenticationMessage(client, message) {
1470
+ //
1471
+ // {
1472
+ // "e": "auth",
1473
+ // "data": {
1474
+ // "ok": "ok"
1475
+ // },
1476
+ // "ok": "ok",
1477
+ // "timestamp":1448034593
1478
+ // }
1479
+ //
1480
+ const future = this.safeValue(client.futures, 'authenticated');
1481
+ if (future !== undefined) {
1482
+ future.resolve(true);
1483
+ }
1484
+ }
1485
+ async authenticate(params = {}) {
1486
+ const url = this.urls['api']['ws'];
1487
+ const client = this.client(url);
1488
+ const messageHash = 'authenticated';
1489
+ const future = client.future('authenticated');
1490
+ const authenticated = this.safeValue(client.subscriptions, messageHash);
1491
+ if (authenticated === undefined) {
1492
+ this.checkRequiredCredentials();
1493
+ const nonce = this.seconds().toString();
1494
+ const auth = nonce + this.apiKey;
1495
+ const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256.sha256);
1496
+ const request = {
1497
+ 'e': 'auth',
1498
+ 'auth': {
1499
+ 'key': this.apiKey,
1500
+ 'signature': signature.toUpperCase(),
1501
+ 'timestamp': nonce,
1502
+ },
1503
+ };
1504
+ await this.watch(url, messageHash, this.extend(request, params), messageHash);
1505
+ }
1506
+ return await future;
1507
+ }
1508
+ }
1509
+
1510
+ module.exports = cex;