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,1500 @@
1
+ 'use strict';
2
+
3
+ var krakenfutures$1 = require('../krakenfutures.js');
4
+ var errors = require('../base/errors.js');
5
+ var Cache = require('../base/ws/Cache.js');
6
+ var Precise = require('../base/Precise.js');
7
+ var sha256 = require('../static_dependencies/noble-hashes/sha256.js');
8
+ var sha512 = require('../static_dependencies/noble-hashes/sha512.js');
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // ---------------------------------------------------------------------------
12
+ class krakenfutures extends krakenfutures$1 {
13
+ describe() {
14
+ return this.deepExtend(super.describe(), {
15
+ 'has': {
16
+ 'ws': true,
17
+ 'cancelAllOrdersWs': false,
18
+ 'cancelOrdersWs': false,
19
+ 'cancelOrderWs': false,
20
+ 'createOrderWs': false,
21
+ 'editOrderWs': false,
22
+ 'fetchBalanceWs': false,
23
+ 'fetchOpenOrdersWs': false,
24
+ 'fetchOrderWs': false,
25
+ 'fetchTradesWs': false,
26
+ 'watchOHLCV': false,
27
+ 'watchOrderBook': true,
28
+ 'watchTicker': true,
29
+ 'watchTickers': true,
30
+ 'watchTrades': true,
31
+ 'watchBalance': true,
32
+ // 'watchStatus': true, // https://docs.futures.kraken.com/#websocket-api-public-feeds-heartbeat
33
+ 'watchOrders': true,
34
+ 'watchMyTrades': true,
35
+ 'watchPositions': true,
36
+ },
37
+ 'urls': {
38
+ 'api': {
39
+ 'ws': 'wss://futures.kraken.com/ws/v1',
40
+ },
41
+ 'test': {
42
+ 'ws': 'wss://demo-futures.kraken.com/ws/v1',
43
+ },
44
+ },
45
+ 'options': {
46
+ 'tradesLimit': 1000,
47
+ 'ordersLimit': 1000,
48
+ 'OHLCVLimit': 1000,
49
+ 'connectionLimit': 100,
50
+ 'requestLimit': 100,
51
+ 'watchTicker': {
52
+ 'method': 'ticker', // or ticker_lite
53
+ },
54
+ 'watchTickers': {
55
+ 'method': 'ticker', // or ticker_lite
56
+ },
57
+ 'fetchBalance': {
58
+ 'type': undefined,
59
+ },
60
+ },
61
+ 'streaming': {
62
+ 'keepAlive': 30000,
63
+ },
64
+ });
65
+ }
66
+ async authenticate(params = {}) {
67
+ /**
68
+ * @ignore
69
+ * @method
70
+ * @description authenticates the user to access private web socket channels
71
+ * @see https://docs.futures.kraken.com/#websocket-api-public-feeds-challenge
72
+ * @returns {object} response from exchange
73
+ */
74
+ this.checkRequiredCredentials();
75
+ // Hash the challenge with the SHA-256 algorithm
76
+ // Base64-decode your api_secret
77
+ // Use the result of step 2 to hash the result of step 1 with the HMAC-SHA-512 algorithm
78
+ // Base64-encode the result of step 3
79
+ const url = this.urls['api']['ws'];
80
+ const messageHash = 'challenge';
81
+ const client = this.client(url);
82
+ let future = this.safeValue(client.subscriptions, messageHash);
83
+ if (future === undefined) {
84
+ const request = {
85
+ 'event': 'challenge',
86
+ 'api_key': this.apiKey,
87
+ };
88
+ const message = this.extend(request, params);
89
+ future = await this.watch(url, messageHash, message);
90
+ client.subscriptions[messageHash] = future;
91
+ }
92
+ return future;
93
+ }
94
+ async subscribePublic(name, symbols, params = {}) {
95
+ /**
96
+ * @ignore
97
+ * @method
98
+ * @description Connects to a websocket channel
99
+ * @param {string} name name of the channel
100
+ * @param {string[]} symbols CCXT market symbols
101
+ * @param {object} [params] extra parameters specific to the krakenfutures api
102
+ * @returns {object} data from the websocket stream
103
+ */
104
+ await this.loadMarkets();
105
+ const url = this.urls['api']['ws'];
106
+ const subscribe = {
107
+ 'event': 'subscribe',
108
+ 'feed': name,
109
+ };
110
+ const marketIds = [];
111
+ let messageHash = name;
112
+ if (symbols === undefined) {
113
+ symbols = [];
114
+ }
115
+ for (let i = 0; i < symbols.length; i++) {
116
+ const symbol = symbols[i];
117
+ marketIds.push(this.marketId(symbol));
118
+ }
119
+ const length = symbols.length;
120
+ if (length === 1) {
121
+ const market = this.market(marketIds[0]);
122
+ messageHash = messageHash + ':' + market['symbol'];
123
+ }
124
+ subscribe['product_ids'] = marketIds;
125
+ const request = this.extend(subscribe, params);
126
+ return await this.watch(url, messageHash, request, messageHash);
127
+ }
128
+ async subscribePrivate(name, messageHash, params = {}) {
129
+ /**
130
+ * @ignore
131
+ * @method
132
+ * @description Connects to a websocket channel
133
+ * @param {string} name name of the channel
134
+ * @param {string[]} symbols CCXT market symbols
135
+ * @param {object} [params] extra parameters specific to the krakenfutures api
136
+ * @returns {object} data from the websocket stream
137
+ */
138
+ await this.loadMarkets();
139
+ await this.authenticate();
140
+ const url = this.urls['api']['ws'];
141
+ const subscribe = {
142
+ 'event': 'subscribe',
143
+ 'feed': name,
144
+ 'api_key': this.apiKey,
145
+ 'original_challenge': this.options['challenge'],
146
+ 'signed_challenge': this.options['signedChallenge'],
147
+ };
148
+ const request = this.extend(subscribe, params);
149
+ return await this.watch(url, messageHash, request, messageHash);
150
+ }
151
+ async watchTicker(symbol, params = {}) {
152
+ /**
153
+ * @method
154
+ * @name krakenfutures#watchTicker
155
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
156
+ * @see https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker
157
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
158
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
159
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
160
+ */
161
+ const options = this.safeValue(this.options, 'watchTicker');
162
+ const method = this.safeString(options, 'method', 'ticker'); // or ticker_lite
163
+ const name = this.safeString(params, 'method', method);
164
+ params = this.omit(params, ['method']);
165
+ return await this.subscribePublic(name, [symbol], params);
166
+ }
167
+ async watchTickers(symbols = undefined, params = {}) {
168
+ /**
169
+ * @method
170
+ * @name krakenfutures#watchTicker
171
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
172
+ * @see https://docs.futures.kraken.com/#websocket-api-public-feeds-ticker-lite
173
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
174
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
175
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
176
+ */
177
+ const method = this.safeString(this.options, 'watchTickerMethod', 'ticker'); // or ticker_lite
178
+ const name = this.safeString2(params, 'method', 'watchTickerMethod', method);
179
+ params = this.omit(params, ['watchTickerMethod', 'method']);
180
+ symbols = this.marketSymbols(symbols, undefined, false);
181
+ return await this.subscribePublic(name, symbols, params);
182
+ }
183
+ async watchTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
184
+ /**
185
+ * @method
186
+ * @name krakenfutures#watchTrades
187
+ * @description get the list of most recent trades for a particular symbol
188
+ * @see https://docs.futures.kraken.com/#websocket-api-public-feeds-trade
189
+ * @param {string} symbol unified symbol of the market to fetch trades for
190
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
191
+ * @param {int} [limit] the maximum amount of trades to fetch
192
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
193
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
194
+ */
195
+ await this.loadMarkets();
196
+ const name = 'trade';
197
+ const trades = await this.subscribePublic(name, [symbol], params);
198
+ if (this.newUpdates) {
199
+ limit = trades.getLimit(symbol, limit);
200
+ }
201
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
202
+ }
203
+ async watchOrderBook(symbol, limit = undefined, params = {}) {
204
+ /**
205
+ * @method
206
+ * @name krakenfutures#watchOrderBook
207
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
208
+ * @see https://docs.futures.kraken.com/#websocket-api-public-feeds-book
209
+ * @param {string} symbol unified symbol of the market to fetch the order book for
210
+ * @param {int} [limit] not used by krakenfutures watchOrderBook
211
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
212
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
213
+ */
214
+ const orderbook = await this.subscribePublic('book', [symbol], params);
215
+ return orderbook.limit();
216
+ }
217
+ async watchPositions(symbols = undefined, since = undefined, limit = undefined, params = {}) {
218
+ /**
219
+ * @method
220
+ * @name krakenfutures#watchPositions
221
+ * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions
222
+ * @description watch all open positions
223
+ * @param {string[]|undefined} symbols list of unified market symbols
224
+ * @param {object} params extra parameters specific to the exchange API endpoint
225
+ * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/en/latest/manual.html#position-structure}
226
+ */
227
+ await this.loadMarkets();
228
+ let messageHash = '';
229
+ symbols = this.marketSymbols(symbols);
230
+ if (!this.isEmpty(symbols)) {
231
+ messageHash = '::' + symbols.join(',');
232
+ }
233
+ messageHash = 'positions' + messageHash;
234
+ const newPositions = await this.subscribePrivate('open_positions', messageHash, params);
235
+ if (this.newUpdates) {
236
+ return newPositions;
237
+ }
238
+ return this.filterBySymbolsSinceLimit(this.positions, symbols, since, limit, true);
239
+ }
240
+ handlePositions(client, message) {
241
+ //
242
+ // {
243
+ // feed: 'open_positions',
244
+ // account: '3b111acc-4fcc-45be-a622-57e611fe9f7f',
245
+ // positions: [
246
+ // {
247
+ // instrument: 'PF_LTCUSD',
248
+ // balance: 0.5,
249
+ // pnl: -0.8628305877699987,
250
+ // entry_price: 70.53,
251
+ // mark_price: 68.80433882446,
252
+ // index_price: 68.8091,
253
+ // liquidation_threshold: 0,
254
+ // effective_leverage: 0.007028866753648637,
255
+ // return_on_equity: -1.2233525985679834,
256
+ // unrealized_funding: 0.0000690610530935388,
257
+ // initial_margin: 0.7053,
258
+ // initial_margin_with_orders: 0.7053,
259
+ // maintenance_margin: 0.35265,
260
+ // pnl_currency: 'USD'
261
+ // }
262
+ // ],
263
+ // seq: 0,
264
+ // timestamp: 1698608414910
265
+ // }
266
+ //
267
+ if (this.positions === undefined) {
268
+ this.positions = new Cache.ArrayCacheBySymbolById();
269
+ }
270
+ const cache = this.positions;
271
+ const rawPositions = this.safeValue(message, 'positions', []);
272
+ const newPositions = [];
273
+ for (let i = 0; i < rawPositions.length; i++) {
274
+ const rawPosition = rawPositions[i];
275
+ const position = this.parseWsPosition(rawPosition);
276
+ const timestamp = this.safeInteger(message, 'timestamp');
277
+ position['timestamp'] = timestamp;
278
+ position['datetime'] = this.iso8601(timestamp);
279
+ newPositions.push(position);
280
+ cache.append(position);
281
+ }
282
+ const messageHashes = this.findMessageHashes(client, 'positions::');
283
+ for (let i = 0; i < messageHashes.length; i++) {
284
+ const messageHash = messageHashes[i];
285
+ const parts = messageHash.split('::');
286
+ const symbolsString = parts[1];
287
+ const symbols = symbolsString.split(',');
288
+ const positions = this.filterByArray(newPositions, 'symbol', symbols, false);
289
+ if (!this.isEmpty(positions)) {
290
+ client.resolve(positions, messageHash);
291
+ }
292
+ }
293
+ client.resolve(newPositions, 'positions');
294
+ }
295
+ parseWsPosition(position, market = undefined) {
296
+ //
297
+ // {
298
+ // instrument: 'PF_LTCUSD',
299
+ // balance: 0.5,
300
+ // pnl: -0.8628305877699987,
301
+ // entry_price: 70.53,
302
+ // mark_price: 68.80433882446,
303
+ // index_price: 68.8091,
304
+ // liquidation_threshold: 0,
305
+ // effective_leverage: 0.007028866753648637,
306
+ // return_on_equity: -1.2233525985679834,
307
+ // unrealized_funding: 0.0000690610530935388,
308
+ // initial_margin: 0.7053,
309
+ // initial_margin_with_orders: 0.7053,
310
+ // maintenance_margin: 0.35265,
311
+ // pnl_currency: 'USD'
312
+ // }
313
+ //
314
+ const marketId = this.safeString(position, 'instrument');
315
+ const hedged = 'both';
316
+ const balance = this.safeNumber(position, 'balance');
317
+ const side = (balance > 0) ? 'long' : 'short';
318
+ return this.safePosition({
319
+ 'info': position,
320
+ 'id': undefined,
321
+ 'symbol': this.safeSymbol(marketId),
322
+ 'notional': undefined,
323
+ 'marginMode': undefined,
324
+ 'liquidationPrice': this.safeNumber(position, 'liquidation_threshold'),
325
+ 'entryPrice': this.safeNumber(position, 'entry_price'),
326
+ 'unrealizedPnl': this.safeNumber(position, 'pnl'),
327
+ 'percentage': this.safeNumber(position, 'return_on_equity'),
328
+ 'contracts': this.parseNumber(Precise["default"].stringAbs(this.numberToString(balance))),
329
+ 'contractSize': undefined,
330
+ 'markPrice': this.safeNumber(position, 'mark_price'),
331
+ 'side': side,
332
+ 'hedged': hedged,
333
+ 'timestamp': undefined,
334
+ 'datetime': undefined,
335
+ 'maintenanceMargin': this.safeNumber(position, 'maintenance_margin'),
336
+ 'maintenanceMarginPercentage': undefined,
337
+ 'collateral': undefined,
338
+ 'initialMargin': this.safeNumber(position, 'initial_margin'),
339
+ 'initialMarginPercentage': undefined,
340
+ 'leverage': undefined,
341
+ 'marginRatio': undefined,
342
+ });
343
+ }
344
+ async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
345
+ /**
346
+ * @method
347
+ * @name krakenfutures#watchOrders
348
+ * @description watches information on multiple orders made by the user
349
+ * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders
350
+ * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-open-orders-verbose
351
+ * @param {string} symbol not used by krakenfutures watchOrders
352
+ * @param {int} [since] not used by krakenfutures watchOrders
353
+ * @param {int} [limit] not used by krakenfutures watchOrders
354
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
355
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
356
+ */
357
+ await this.loadMarkets();
358
+ const name = 'open_orders';
359
+ let messageHash = 'orders';
360
+ if (symbol !== undefined) {
361
+ const market = this.market(symbol);
362
+ messageHash += ':' + market['symbol'];
363
+ }
364
+ const orders = await this.subscribePrivate(name, messageHash, params);
365
+ if (this.newUpdates) {
366
+ limit = orders.getLimit(symbol, limit);
367
+ }
368
+ return this.filterBySinceLimit(orders, since, limit, 'timestamp', true);
369
+ }
370
+ async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
371
+ /**
372
+ * @method
373
+ * @name krakenfutures#watchMyTrades
374
+ * @description watches information on multiple trades made by the user
375
+ * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-fills
376
+ * @param {string} symbol unified market symbol of the market orders were made in
377
+ * @param {int} [since] the earliest time in ms to fetch orders for
378
+ * @param {int} [limit] the maximum number of order structures to retrieve
379
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
380
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
381
+ */
382
+ await this.loadMarkets();
383
+ const name = 'fills';
384
+ let messageHash = 'myTrades';
385
+ if (symbol !== undefined) {
386
+ const market = this.market(symbol);
387
+ messageHash += ':' + market['symbol'];
388
+ }
389
+ const trades = await this.subscribePrivate(name, messageHash, params);
390
+ if (this.newUpdates) {
391
+ limit = trades.getLimit(symbol, limit);
392
+ }
393
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
394
+ }
395
+ async watchBalance(params = {}) {
396
+ /**
397
+ * @method
398
+ * @name krakenfutures#watchOrders
399
+ * @description watches information on multiple orders made by the user
400
+ * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-balances
401
+ * @param {string} symbol not used by krakenfutures watchBalance
402
+ * @param {int} [since] not used by krakenfutures watchBalance
403
+ * @param {int} [limit] not used by krakenfutures watchBalance
404
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
405
+ * @param {string} [params.account] can be either 'futures' or 'flex_futures'
406
+ * @returns {object} a object of wallet types each with a balance structure {@link https://docs.ccxt.com/#/?id=balance-structure}
407
+ */
408
+ await this.loadMarkets();
409
+ const name = 'balances';
410
+ let messageHash = name;
411
+ let account = undefined;
412
+ [account, params] = this.handleOptionAndParams(params, 'watchBalance', 'account');
413
+ if (account !== undefined) {
414
+ if (account !== 'futures' && account !== 'flex_futures') {
415
+ throw new errors.ArgumentsRequired(this.id + ' watchBalance account must be either \'futures\' or \'flex_futures\'');
416
+ }
417
+ messageHash += ':' + account;
418
+ }
419
+ return await this.subscribePrivate(name, messageHash, params);
420
+ }
421
+ handleTrade(client, message) {
422
+ //
423
+ // snapshot
424
+ //
425
+ // {
426
+ // "feed": "trade_snapshot",
427
+ // "product_id": "PI_XBTUSD",
428
+ // "trades": [
429
+ // {
430
+ // "feed": "trade",
431
+ // "product_id": "PI_XBTUSD",
432
+ // "uid": "caa9c653-420b-4c24-a9f1-462a054d86f1",
433
+ // "side": "sell",
434
+ // "type": "fill",
435
+ // "seq": 655508,
436
+ // "time": 1612269657781,
437
+ // "qty": 440,
438
+ // "price": 34893
439
+ // },
440
+ // ...
441
+ // ]
442
+ // }
443
+ //
444
+ // update
445
+ //
446
+ // {
447
+ // "feed": "trade",
448
+ // "product_id": "PI_XBTUSD",
449
+ // "uid": "05af78ac-a774-478c-a50c-8b9c234e071e",
450
+ // "side": "sell",
451
+ // "type": "fill",
452
+ // "seq": 653355,
453
+ // "time": 1612266317519,
454
+ // "qty": 15000,
455
+ // "price": 34969.5
456
+ // }
457
+ //
458
+ const channel = this.safeString(message, 'feed');
459
+ const marketId = this.safeString(message, 'product_id');
460
+ if (marketId !== undefined) {
461
+ const market = this.market(marketId);
462
+ const symbol = market['symbol'];
463
+ const messageHash = 'trade:' + symbol;
464
+ let tradesArray = this.safeValue(this.trades, symbol);
465
+ if (tradesArray === undefined) {
466
+ const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
467
+ tradesArray = new Cache.ArrayCache(tradesLimit);
468
+ this.trades[symbol] = tradesArray;
469
+ }
470
+ if (channel === 'trade_snapshot') {
471
+ const trades = this.safeValue(message, 'trades', []);
472
+ for (let i = 0; i < trades.length; i++) {
473
+ const item = trades[i];
474
+ const trade = this.parseWsTrade(item);
475
+ tradesArray.append(trade);
476
+ }
477
+ }
478
+ else {
479
+ const trade = this.parseWsTrade(message);
480
+ tradesArray.append(trade);
481
+ }
482
+ client.resolve(tradesArray, messageHash);
483
+ }
484
+ return message;
485
+ }
486
+ parseWsTrade(trade, market = undefined) {
487
+ //
488
+ // {
489
+ // "feed": "trade",
490
+ // "product_id": "PI_XBTUSD",
491
+ // "uid": "caa9c653-420b-4c24-a9f1-462a054d86f1",
492
+ // "side": "sell",
493
+ // "type": "fill",
494
+ // "seq": 655508,
495
+ // "time": 1612269657781,
496
+ // "qty": 440,
497
+ // "price": 34893
498
+ // }
499
+ //
500
+ const marketId = this.safeString(trade, 'product_id');
501
+ market = this.safeMarket(marketId, market);
502
+ const timestamp = this.safeInteger(trade, 'time');
503
+ return this.safeTrade({
504
+ 'info': trade,
505
+ 'id': this.safeString(trade, 'uid'),
506
+ 'symbol': this.safeString(market, 'symbol'),
507
+ 'timestamp': timestamp,
508
+ 'datetime': this.iso8601(timestamp),
509
+ 'order': undefined,
510
+ 'type': this.safeString(trade, 'type'),
511
+ 'side': this.safeString(trade, 'side'),
512
+ 'takerOrMaker': 'taker',
513
+ 'price': this.safeString(trade, 'price'),
514
+ 'amount': this.safeString(trade, 'qty'),
515
+ 'cost': undefined,
516
+ 'fee': {
517
+ 'rate': undefined,
518
+ 'cost': undefined,
519
+ 'currency': undefined,
520
+ },
521
+ }, market);
522
+ }
523
+ parseWsOrderTrade(trade, market = undefined) {
524
+ //
525
+ // {
526
+ // "symbol": "BTC_USDT",
527
+ // "type": "LIMIT",
528
+ // "quantity": "1",
529
+ // "orderId": "32471407854219264",
530
+ // "tradeFee": "0",
531
+ // "clientOrderId": "",
532
+ // "accountType": "SPOT",
533
+ // "feeCurrency": "",
534
+ // "eventType": "place",
535
+ // "source": "API",
536
+ // "side": "BUY",
537
+ // "filledQuantity": "0",
538
+ // "filledAmount": "0",
539
+ // "matchRole": "MAKER",
540
+ // "state": "NEW",
541
+ // "tradeTime": 0,
542
+ // "tradeAmount": "0",
543
+ // "orderAmount": "0",
544
+ // "createTime": 1648708186922,
545
+ // "price": "47112.1",
546
+ // "tradeQty": "0",
547
+ // "tradePrice": "0",
548
+ // "tradeId": "0",
549
+ // "ts": 1648708187469
550
+ // }
551
+ //
552
+ const timestamp = this.safeInteger(trade, 'tradeTime');
553
+ const marketId = this.safeString(trade, 'symbol');
554
+ return this.safeTrade({
555
+ 'info': trade,
556
+ 'id': this.safeString(trade, 'tradeId'),
557
+ 'symbol': this.safeSymbol(marketId, market),
558
+ 'timestamp': timestamp,
559
+ 'datetime': this.iso8601(timestamp),
560
+ 'order': this.safeString(trade, 'orderId'),
561
+ 'type': this.safeStringLower(trade, 'type'),
562
+ 'side': this.safeString(trade, 'side'),
563
+ 'takerOrMaker': this.safeString(trade, 'matchRole'),
564
+ 'price': this.safeString(trade, 'price'),
565
+ 'amount': this.safeString(trade, 'tradeAmount'),
566
+ 'cost': undefined,
567
+ 'fee': {
568
+ 'rate': undefined,
569
+ 'cost': this.safeString(trade, 'tradeFee'),
570
+ 'currency': this.safeString(trade, 'feeCurrency'),
571
+ },
572
+ }, market);
573
+ }
574
+ handleOrder(client, message) {
575
+ //
576
+ // update (verbose)
577
+ //
578
+ // {
579
+ // "feed": "open_orders_verbose",
580
+ // "order": {
581
+ // "instrument": "PI_XBTUSD",
582
+ // "time": 1567597581495,
583
+ // "last_update_time": 1567597581495,
584
+ // "qty": 102.0,
585
+ // "filled": 0.0,
586
+ // "limit_price": 10601.0,
587
+ // "stop_price": 0.0,
588
+ // "type": "limit",
589
+ // "order_id": "fa9806c9-cba9-4661-9f31-8c5fd045a95d",
590
+ // "direction": 0,
591
+ // "reduce_only": false
592
+ // },
593
+ // "is_cancel": true,
594
+ // "reason": "post_order_failed_because_it_would_be_filled"
595
+ // }
596
+ //
597
+ // update
598
+ //
599
+ // {
600
+ // "feed": "open_orders",
601
+ // "order": {
602
+ // "instrument": "PI_XBTUSD",
603
+ // "time": 1567702877410,
604
+ // "last_update_time": 1567702877410,
605
+ // "qty": 304.0,
606
+ // "filled": 0.0,
607
+ // "limit_price": 10640.0,
608
+ // "stop_price": 0.0,
609
+ // "type": "limit",
610
+ // "order_id": "59302619-41d2-4f0b-941f-7e7914760ad3",
611
+ // "direction": 1,
612
+ // "reduce_only": true
613
+ // },
614
+ // "is_cancel": false,
615
+ // "reason": "new_placed_order_by_user"
616
+ // }
617
+ // {
618
+ // "feed": "open_orders",
619
+ // "order_id": "ea8a7144-37db-449b-bb4a-b53c814a0f43",
620
+ // "is_cancel": true,
621
+ // "reason": "cancelled_by_user"
622
+ // }
623
+ //
624
+ // {
625
+ // "feed": 'open_orders',
626
+ // "order": {
627
+ // "instrument": 'PF_XBTUSD',
628
+ // "time": 1698159920097,
629
+ // "last_update_time": 1699835622988,
630
+ // "qty": 1.1,
631
+ // "filled": 0,
632
+ // "limit_price": 20000,
633
+ // "stop_price": 0,
634
+ // "type": 'limit',
635
+ // "order_id": '0eaf02b0-855d-4451-a3b7-e2b3070c1fa4',
636
+ // "direction": 0,
637
+ // "reduce_only": false
638
+ // },
639
+ // "is_cancel": false,
640
+ // "reason": 'edited_by_user'
641
+ // }
642
+ //
643
+ let orders = this.orders;
644
+ if (orders === undefined) {
645
+ const limit = this.safeInteger(this.options, 'ordersLimit');
646
+ orders = new Cache.ArrayCacheBySymbolById(limit);
647
+ this.orders = orders;
648
+ }
649
+ const order = this.safeValue(message, 'order');
650
+ if (order !== undefined) {
651
+ const marketId = this.safeString(order, 'instrument');
652
+ const messageHash = 'orders';
653
+ const symbol = this.safeSymbol(marketId);
654
+ const orderId = this.safeString(order, 'order_id');
655
+ const previousOrders = this.safeValue(orders.hashmap, symbol, {});
656
+ const previousOrder = this.safeValue(previousOrders, orderId);
657
+ const reason = this.safeString(message, 'reason');
658
+ if ((previousOrder === undefined) || (reason === 'edited_by_user')) {
659
+ const parsed = this.parseWsOrder(order);
660
+ orders.append(parsed);
661
+ client.resolve(orders, messageHash);
662
+ client.resolve(orders, messageHash + ':' + symbol);
663
+ }
664
+ else {
665
+ const trade = this.parseWsTrade(order);
666
+ if (previousOrder['trades'] === undefined) {
667
+ previousOrder['trades'] = [];
668
+ }
669
+ previousOrder['trades'].push(trade);
670
+ previousOrder['lastTradeTimestamp'] = trade['timestamp'];
671
+ let totalCost = '0';
672
+ let totalAmount = '0';
673
+ const trades = previousOrder['trades'];
674
+ for (let i = 0; i < trades.length; i++) {
675
+ const currentTrade = trades[i];
676
+ totalCost = Precise["default"].stringAdd(totalCost, this.numberToString(currentTrade['cost']));
677
+ totalAmount = Precise["default"].stringAdd(totalAmount, this.numberToString(currentTrade['amount']));
678
+ }
679
+ if (Precise["default"].stringGt(totalAmount, '0')) {
680
+ previousOrder['average'] = Precise["default"].stringDiv(totalCost, totalAmount);
681
+ }
682
+ previousOrder['cost'] = totalCost;
683
+ if (previousOrder['filled'] !== undefined) {
684
+ const stringOrderFilled = this.numberToString(previousOrder['filled']);
685
+ previousOrder['filled'] = Precise["default"].stringAdd(stringOrderFilled, this.numberToString(trade['amount']));
686
+ if (previousOrder['amount'] !== undefined) {
687
+ previousOrder['remaining'] = Precise["default"].stringSub(this.numberToString(previousOrder['amount']), stringOrderFilled);
688
+ }
689
+ }
690
+ if (previousOrder['fee'] === undefined) {
691
+ previousOrder['fee'] = {
692
+ 'rate': undefined,
693
+ 'cost': '0',
694
+ 'currency': this.numberToString(trade['fee']['currency']),
695
+ };
696
+ }
697
+ if ((previousOrder['fee']['cost'] !== undefined) && (trade['fee']['cost'] !== undefined)) {
698
+ const stringOrderCost = this.numberToString(previousOrder['fee']['cost']);
699
+ const stringTradeCost = this.numberToString(trade['fee']['cost']);
700
+ previousOrder['fee']['cost'] = Precise["default"].stringAdd(stringOrderCost, stringTradeCost);
701
+ }
702
+ // update the newUpdates count
703
+ orders.append(this.safeOrder(previousOrder));
704
+ client.resolve(orders, messageHash + ':' + symbol);
705
+ client.resolve(orders, messageHash);
706
+ }
707
+ }
708
+ else {
709
+ const isCancel = this.safeValue(message, 'is_cancel');
710
+ if (isCancel) {
711
+ // get order without symbol
712
+ for (let i = 0; i < orders.length; i++) {
713
+ const currentOrder = orders[i];
714
+ if (currentOrder['id'] === message['order_id']) {
715
+ orders[i] = this.extend(currentOrder, {
716
+ 'status': 'canceled',
717
+ });
718
+ client.resolve(orders, 'orders');
719
+ client.resolve(orders, 'orders:' + currentOrder['symbol']);
720
+ break;
721
+ }
722
+ }
723
+ }
724
+ }
725
+ return message;
726
+ }
727
+ handleOrderSnapshot(client, message) {
728
+ //
729
+ // verbose
730
+ //
731
+ // {
732
+ // "feed": "open_orders_verbose_snapshot",
733
+ // "account": "0f9c23b8-63e2-40e4-9592-6d5aa57c12ba",
734
+ // "orders": [
735
+ // {
736
+ // "instrument": "PI_XBTUSD",
737
+ // "time": 1567428848005,
738
+ // "last_update_time": 1567428848005,
739
+ // "qty": 100.0,
740
+ // "filled": 0.0,
741
+ // "limit_price": 8500.0,
742
+ // "stop_price": 0.0,
743
+ // "type": "limit",
744
+ // "order_id": "566942c8-a3b5-4184-a451-622b09493129",
745
+ // "direction": 0,
746
+ // "reduce_only": false
747
+ // },
748
+ // ...
749
+ // ]
750
+ // }
751
+ //
752
+ // regular
753
+ //
754
+ // {
755
+ // "feed": "open_orders_snapshot",
756
+ // "account": "e258dba9-4dd4-4da5-bfef-75beb91c098e",
757
+ // "orders": [
758
+ // {
759
+ // "instrument": "PI_XBTUSD",
760
+ // "time": 1612275024153,
761
+ // "last_update_time": 1612275024153,
762
+ // "qty": 1000,
763
+ // "filled": 0,
764
+ // "limit_price": 34900,
765
+ // "stop_price": 13789,
766
+ // "type": "stop",
767
+ // "order_id": "723ba95f-13b7-418b-8fcf-ab7ba6620555",
768
+ // "direction": 1,
769
+ // "reduce_only": false,
770
+ // "triggerSignal": "last"
771
+ // },
772
+ // ...
773
+ // ]
774
+ // }
775
+ const orders = this.safeValue(message, 'orders', []);
776
+ const limit = this.safeInteger(this.options, 'ordersLimit');
777
+ this.orders = new Cache.ArrayCacheBySymbolById(limit);
778
+ const symbols = {};
779
+ const cachedOrders = this.orders;
780
+ for (let i = 0; i < orders.length; i++) {
781
+ const order = orders[i];
782
+ const parsed = this.parseWsOrder(order);
783
+ const symbol = parsed['symbol'];
784
+ symbols[symbol] = true;
785
+ cachedOrders.append(parsed);
786
+ }
787
+ const length = this.orders.length;
788
+ if (length > 0) {
789
+ client.resolve(this.orders, 'orders');
790
+ const keys = Object.keys(symbols);
791
+ for (let i = 0; i < keys.length; i++) {
792
+ const symbol = keys[i];
793
+ const messageHash = 'orders:' + symbol;
794
+ client.resolve(this.orders, messageHash);
795
+ }
796
+ }
797
+ }
798
+ parseWsOrder(order, market = undefined) {
799
+ //
800
+ // update
801
+ //
802
+ // {
803
+ // "feed": "open_orders_verbose",
804
+ // "order": {
805
+ // "instrument": "PI_XBTUSD",
806
+ // "time": 1567597581495,
807
+ // "last_update_time": 1567597581495,
808
+ // "qty": 102.0,
809
+ // "filled": 0.0,
810
+ // "limit_price": 10601.0,
811
+ // "stop_price": 0.0,
812
+ // "type": "limit",
813
+ // "order_id": "fa9806c9-cba9-4661-9f31-8c5fd045a95d",
814
+ // "direction": 0,
815
+ // "reduce_only": false
816
+ // },
817
+ // "is_cancel": true,
818
+ // "reason": "post_order_failed_because_it_would_be_filled"
819
+ // }
820
+ //
821
+ // snapshot
822
+ //
823
+ // {
824
+ // "instrument": "PI_XBTUSD",
825
+ // "time": 1567597581495,
826
+ // "last_update_time": 1567597581495,
827
+ // "qty": 102.0,
828
+ // "filled": 0.0,
829
+ // "limit_price": 10601.0,
830
+ // "stop_price": 0.0,
831
+ // "type": "limit",
832
+ // "order_id": "fa9806c9-cba9-4661-9f31-8c5fd045a95d",
833
+ // "direction": 0,
834
+ // "reduce_only": false
835
+ // }
836
+ //
837
+ const isCancelled = this.safeValue(order, 'is_cancel');
838
+ let unparsedOrder = order;
839
+ let status = undefined;
840
+ if (isCancelled !== undefined) {
841
+ unparsedOrder = this.safeValue(order, 'order');
842
+ if (isCancelled === true) {
843
+ status = 'cancelled';
844
+ }
845
+ }
846
+ const marketId = this.safeString(unparsedOrder, 'instrument');
847
+ const timestamp = this.safeString(unparsedOrder, 'time');
848
+ const direction = this.safeInteger(unparsedOrder, 'direction');
849
+ return this.safeOrder({
850
+ 'info': order,
851
+ 'symbol': this.safeSymbol(marketId, market),
852
+ 'id': this.safeString(unparsedOrder, 'order_id'),
853
+ 'clientOrderId': undefined,
854
+ 'timestamp': timestamp,
855
+ 'datetime': this.iso8601(timestamp),
856
+ 'lastTradeTimestamp': undefined,
857
+ 'type': this.safeString(unparsedOrder, 'type'),
858
+ 'timeInForce': undefined,
859
+ 'postOnly': undefined,
860
+ 'side': (direction === 0) ? 'buy' : 'sell',
861
+ 'price': this.safeString(unparsedOrder, 'limit_price'),
862
+ 'stopPrice': this.safeString(unparsedOrder, 'stop_price'),
863
+ 'triggerPrice': this.safeString(unparsedOrder, 'stop_price'),
864
+ 'amount': this.safeString(unparsedOrder, 'qty'),
865
+ 'cost': undefined,
866
+ 'average': undefined,
867
+ 'filled': this.safeString(unparsedOrder, 'filled'),
868
+ 'remaining': undefined,
869
+ 'status': status,
870
+ 'fee': {
871
+ 'rate': undefined,
872
+ 'cost': undefined,
873
+ 'currency': undefined,
874
+ },
875
+ 'trades': undefined,
876
+ });
877
+ }
878
+ handleTicker(client, message) {
879
+ //
880
+ // {
881
+ // "time": 1680811086487,
882
+ // "product_id": "PI_XBTUSD",
883
+ // "funding_rate": 7.792297e-12,
884
+ // "funding_rate_prediction": -4.2671095e-11,
885
+ // "relative_funding_rate": 2.18013888889e-7,
886
+ // "relative_funding_rate_prediction": -0.0000011974,
887
+ // "next_funding_rate_time": 1680811200000,
888
+ // "feed": "ticker",
889
+ // "bid": 28060,
890
+ // "ask": 28070,
891
+ // "bid_size": 2844,
892
+ // "ask_size": 1902,
893
+ // "volume": 19628180,
894
+ // "dtm": 0,
895
+ // "leverage": "50x",
896
+ // "index": 28062.14,
897
+ // "premium": 0,
898
+ // "last": 28053.5,
899
+ // "change": -0.7710945651981715,
900
+ // "suspended": false,
901
+ // "tag": "perpetual",
902
+ // "pair": "XBT:USD",
903
+ // "openInterest": 28875946,
904
+ // "markPrice": 28064.92082724592,
905
+ // "maturityTime": 0,
906
+ // "post_only": false,
907
+ // "volumeQuote": 19628180
908
+ // }
909
+ //
910
+ // ticker_lite
911
+ //
912
+ // {
913
+ // "feed": "ticker_lite",
914
+ // "product_id": "FI_ETHUSD_210625",
915
+ // "bid": 1753.45,
916
+ // "ask": 1760.35,
917
+ // "change": 13.448175559936647,
918
+ // "premium": 9.1,
919
+ // "volume": 6899673.0,
920
+ // "tag": "semiannual",
921
+ // "pair": "ETH:USD",
922
+ // "dtm": 141,
923
+ // "maturityTime": 1624633200000,
924
+ // "volumeQuote": 6899673.0
925
+ // }
926
+ //
927
+ const marketId = this.safeString(message, 'product_id');
928
+ const feed = this.safeString(message, 'feed');
929
+ if (marketId !== undefined) {
930
+ const ticker = this.parseWsTicker(message);
931
+ const symbol = ticker['symbol'];
932
+ this.tickers[symbol] = ticker;
933
+ const messageHash = feed + ':' + symbol;
934
+ client.resolve(ticker, messageHash);
935
+ }
936
+ client.resolve(this.tickers, feed);
937
+ return message;
938
+ }
939
+ parseWsTicker(ticker, market = undefined) {
940
+ //
941
+ // {
942
+ // "time": 1680811086487,
943
+ // "product_id": "PI_XBTUSD",
944
+ // "funding_rate": 7.792297e-12,
945
+ // "funding_rate_prediction": -4.2671095e-11,
946
+ // "relative_funding_rate": 2.18013888889e-7,
947
+ // "relative_funding_rate_prediction": -0.0000011974,
948
+ // "next_funding_rate_time": 1680811200000,
949
+ // "feed": "ticker",
950
+ // "bid": 28060,
951
+ // "ask": 28070,
952
+ // "bid_size": 2844,
953
+ // "ask_size": 1902,
954
+ // "volume": 19628180,
955
+ // "dtm": 0,
956
+ // "leverage": "50x",
957
+ // "index": 28062.14,
958
+ // "premium": 0,
959
+ // "last": 28053.5,
960
+ // "change": -0.7710945651981715,
961
+ // "suspended": false,
962
+ // "tag": "perpetual",
963
+ // "pair": "XBT:USD",
964
+ // "openInterest": 28875946,
965
+ // "markPrice": 28064.92082724592,
966
+ // "maturityTime": 0,
967
+ // "post_only": false,
968
+ // "volumeQuote": 19628180
969
+ // }
970
+ //
971
+ // ticker_lite
972
+ //
973
+ // {
974
+ // "feed": "ticker_lite",
975
+ // "product_id": "FI_ETHUSD_210625",
976
+ // "bid": 1753.45,
977
+ // "ask": 1760.35,
978
+ // "change": 13.448175559936647,
979
+ // "premium": 9.1,
980
+ // "volume": 6899673.0,
981
+ // "tag": "semiannual",
982
+ // "pair": "ETH:USD",
983
+ // "dtm": 141,
984
+ // "maturityTime": 1624633200000,
985
+ // "volumeQuote": 6899673.0
986
+ // }
987
+ //
988
+ const marketId = this.safeString(ticker, 'product_id');
989
+ market = this.safeMarket(marketId, market);
990
+ const symbol = market['symbol'];
991
+ const timestamp = this.parse8601(this.safeString(ticker, 'lastTime'));
992
+ const last = this.safeString(ticker, 'last');
993
+ return this.safeTicker({
994
+ 'info': ticker,
995
+ 'symbol': symbol,
996
+ 'timestamp': timestamp,
997
+ 'datetime': this.iso8601(timestamp),
998
+ 'high': undefined,
999
+ 'low': undefined,
1000
+ 'bid': this.safeString(ticker, 'bid'),
1001
+ 'bidVolume': this.safeString(ticker, 'bid_size'),
1002
+ 'ask': this.safeString(ticker, 'ask'),
1003
+ 'askVolume': this.safeString(ticker, 'ask_size'),
1004
+ 'vwap': undefined,
1005
+ 'open': undefined,
1006
+ 'close': last,
1007
+ 'last': last,
1008
+ 'previousClose': undefined,
1009
+ 'change': this.safeString(ticker, 'change'),
1010
+ 'percentage': undefined,
1011
+ 'average': undefined,
1012
+ 'baseVolume': this.safeString(ticker, 'volume'),
1013
+ 'quoteVolume': this.safeString(ticker, 'volumeQuote'),
1014
+ });
1015
+ }
1016
+ handleOrderBookSnapshot(client, message) {
1017
+ //
1018
+ // {
1019
+ // "feed": "book_snapshot",
1020
+ // "product_id": "PI_XBTUSD",
1021
+ // "timestamp": 1612269825817,
1022
+ // "seq": 326072249,
1023
+ // "tickSize": null,
1024
+ // "bids": [
1025
+ // {
1026
+ // "price": 34892.5,
1027
+ // "qty": 6385
1028
+ // },
1029
+ // {
1030
+ // "price": 34892,
1031
+ // "qty": 10924
1032
+ // },
1033
+ // ],
1034
+ // "asks": [
1035
+ // {
1036
+ // "price": 34911.5,
1037
+ // "qty": 20598
1038
+ // },
1039
+ // {
1040
+ // "price": 34912,
1041
+ // "qty": 2300
1042
+ // },
1043
+ // ]
1044
+ // }
1045
+ //
1046
+ const marketId = this.safeString(message, 'product_id');
1047
+ const market = this.safeMarket(marketId);
1048
+ const symbol = market['symbol'];
1049
+ const messageHash = 'book:' + symbol;
1050
+ const subscription = this.safeValue(client.subscriptions, messageHash, {});
1051
+ const limit = this.safeInteger(subscription, 'limit');
1052
+ const timestamp = this.safeInteger(message, 'timestamp');
1053
+ this.orderbooks[symbol] = this.orderBook({}, limit);
1054
+ const orderbook = this.orderbooks[symbol];
1055
+ const bids = this.safeValue(message, 'bids');
1056
+ const asks = this.safeValue(message, 'asks');
1057
+ for (let i = 0; i < bids.length; i++) {
1058
+ const bid = bids[i];
1059
+ const price = this.safeNumber(bid, 'price');
1060
+ const qty = this.safeNumber(bid, 'qty');
1061
+ orderbook['bids'].store(price, qty);
1062
+ }
1063
+ for (let i = 0; i < asks.length; i++) {
1064
+ const ask = asks[i];
1065
+ const price = this.safeNumber(ask, 'price');
1066
+ const qty = this.safeNumber(ask, 'qty');
1067
+ orderbook['asks'].store(price, qty);
1068
+ }
1069
+ orderbook['timestamp'] = timestamp;
1070
+ orderbook['datetime'] = this.iso8601(timestamp);
1071
+ orderbook['symbol'] = symbol;
1072
+ client.resolve(orderbook, messageHash);
1073
+ }
1074
+ handleOrderBook(client, message) {
1075
+ //
1076
+ // {
1077
+ // "feed": "book",
1078
+ // "product_id": "PI_XBTUSD",
1079
+ // "side": "sell",
1080
+ // "seq": 326094134,
1081
+ // "price": 34981,
1082
+ // "qty": 0,
1083
+ // "timestamp": 1612269953629
1084
+ // }
1085
+ //
1086
+ const marketId = this.safeString(message, 'product_id');
1087
+ const market = this.safeMarket(marketId);
1088
+ const symbol = market['symbol'];
1089
+ const messageHash = 'book:' + symbol;
1090
+ const orderbook = this.orderbooks[symbol];
1091
+ const side = this.safeString(message, 'side');
1092
+ const price = this.safeNumber(message, 'price');
1093
+ const qty = this.safeNumber(message, 'qty');
1094
+ const timestamp = this.safeInteger(message, 'timestamp');
1095
+ if (side === 'sell') {
1096
+ orderbook['asks'].store(price, qty);
1097
+ }
1098
+ else {
1099
+ orderbook['bids'].store(price, qty);
1100
+ }
1101
+ orderbook['timestamp'] = timestamp;
1102
+ orderbook['datetime'] = this.iso8601(timestamp);
1103
+ client.resolve(orderbook, messageHash);
1104
+ }
1105
+ handleBalance(client, message) {
1106
+ //
1107
+ // snapshot
1108
+ //
1109
+ // {
1110
+ // "feed": "balances_snapshot",
1111
+ // "account": "4a012c31-df95-484a-9473-d51e4a0c4ae7",
1112
+ // "holding": {
1113
+ // "USDT": 4997.5012493753,
1114
+ // "XBT": 0.1285407184,
1115
+ // ...
1116
+ // },
1117
+ // "futures": {
1118
+ // "F-ETH:EUR": {
1119
+ // "name": "F-ETH:EUR",
1120
+ // "pair": "ETH/EUR",
1121
+ // "unit": "EUR",
1122
+ // "portfolio_value": 0.0,
1123
+ // "balance": 0.0,
1124
+ // "maintenance_margin": 0.0,
1125
+ // "initial_margin": 0.0,
1126
+ // "available": 0.0,
1127
+ // "unrealized_funding": 0.0,
1128
+ // "pnl": 0.0
1129
+ // },
1130
+ // ...
1131
+ // },
1132
+ // "flex_futures": {
1133
+ // "currencies": {
1134
+ // "USDT": {
1135
+ // "quantity": 0.0,
1136
+ // "value": 0.0,
1137
+ // "collateral_value": 0.0,
1138
+ // "available": 0.0,
1139
+ // "haircut": 0.0,
1140
+ // "conversion_spread": 0.0
1141
+ // },
1142
+ // ...
1143
+ // },
1144
+ // "balance_value":0.0,
1145
+ // "portfolio_value":0.0,
1146
+ // "collateral_value":0.0,
1147
+ // "initial_margin":0.0,
1148
+ // "initial_margin_without_orders":0.0,
1149
+ // "maintenance_margin":0.0,
1150
+ // "pnl":0.0,
1151
+ // "unrealized_funding":0.0,
1152
+ // "total_unrealized":0.0,
1153
+ // "total_unrealized_as_margin":0.0,
1154
+ // "margin_equity":0.0,
1155
+ // "available_margin":0.0
1156
+ // "isolated":{
1157
+ // },
1158
+ // "cross":{
1159
+ // "balance_value":9963.66,
1160
+ // "portfolio_value":9963.66,
1161
+ // "collateral_value":9963.66,
1162
+ // "initial_margin":0.0,
1163
+ // "initial_margin_without_orders":0.0,
1164
+ // "maintenance_margin":0.0,
1165
+ // "pnl":0.0,
1166
+ // "unrealized_funding":0.0,
1167
+ // "total_unrealized":0.0,
1168
+ // "total_unrealized_as_margin":0.0,
1169
+ // "margin_equity":9963.66,
1170
+ // "available_margin":9963.66,
1171
+ // "effective_leverage":0.0
1172
+ // },
1173
+ // },
1174
+ // "timestamp":1640995200000,
1175
+ // "seq":0
1176
+ // }
1177
+ //
1178
+ // update
1179
+ //
1180
+ // Holding Wallet
1181
+ //
1182
+ // {
1183
+ // "feed": "balances",
1184
+ // "account": "7a641082-55c7-4411-a85f-930ec2e09617",
1185
+ // "holding": {
1186
+ // "USD": 5000.0
1187
+ // },
1188
+ // "futures": {},
1189
+ // "timestamp": 1640995200000,
1190
+ // "seq": 83
1191
+ // }
1192
+ //
1193
+ // Multi-Collateral
1194
+ //
1195
+ // {
1196
+ // "feed": "balances"
1197
+ // "account": "7a641082-55c7-4411-a85f-930ec2e09617"
1198
+ // "flex_futures": {
1199
+ // "currencies": {
1200
+ // "USDT": {
1201
+ // "quantity": 0.0,
1202
+ // "value": 0.0,
1203
+ // "collateral_value": 0.0,
1204
+ // "available": 0.0,
1205
+ // "haircut": 0.0,
1206
+ // "conversion_spread": 0.0
1207
+ // },
1208
+ // ...
1209
+ // },
1210
+ // "balance_value": 5000.0,
1211
+ // "portfolio_value": 5000.0,
1212
+ // "collateral_value": 5000.0,
1213
+ // "initial_margin": 0.0,
1214
+ // "initial_margin_without_orders": 0.0,
1215
+ // "maintenance_margin": 0.0,
1216
+ // "pnl": 0.0,
1217
+ // "unrealized_funding": 0.0,
1218
+ // "total_unrealized": 0.0,
1219
+ // "total_unrealized_as_margin": 0.0,
1220
+ // "margin_equity": 5000.0,
1221
+ // "available_margin": 5000.0
1222
+ // },
1223
+ // "timestamp": 1640995200000,
1224
+ // "seq": 1
1225
+ // }
1226
+ //
1227
+ // Sample Single-Collateral Balance Delta
1228
+ //
1229
+ // {
1230
+ // "feed": "balances",
1231
+ // "account": "7a641082-55c7-4411-a85f-930ec2e09617",
1232
+ // "holding": {},
1233
+ // "futures": {
1234
+ // "F-XBT:USD": {
1235
+ // "name": "F-XBT:USD",
1236
+ // "pair": "XBT/USD",
1237
+ // "unit": "XBT",
1238
+ // "portfolio_value": 0.1219368845,
1239
+ // "balance": 0.1219368845,
1240
+ // "maintenance_margin": 0.0,
1241
+ // "initial_margin": 0.0,
1242
+ // "available": 0.1219368845,
1243
+ // "unrealized_funding": 0.0,
1244
+ // "pnl": 0.0
1245
+ // }
1246
+ // },
1247
+ // "timestamp": 1640995200000,
1248
+ // "seq": 2
1249
+ // }
1250
+ //
1251
+ const holding = this.safeValue(message, 'holding');
1252
+ const futures = this.safeValue(message, 'futures');
1253
+ const flexFutures = this.safeValue(message, 'flex_futures');
1254
+ const messageHash = 'balances';
1255
+ const timestamp = this.safeInteger(message, 'timestamp');
1256
+ if (holding !== undefined) {
1257
+ const holdingKeys = Object.keys(holding); // cashAccount
1258
+ const holdingResult = {
1259
+ 'info': message,
1260
+ 'timestamp': timestamp,
1261
+ 'datetime': this.iso8601(timestamp),
1262
+ };
1263
+ for (let i = 0; i < holdingKeys.length; i++) {
1264
+ const key = holdingKeys[i];
1265
+ const code = this.safeCurrencyCode(key);
1266
+ const newAccount = this.account();
1267
+ newAccount['total'] = this.safeString(holding, key);
1268
+ holdingResult[code] = newAccount;
1269
+ }
1270
+ this.balance['cash'] = holdingResult;
1271
+ this.balance['cash'] = this.safeBalance(this.balance['cash']);
1272
+ client.resolve(holdingResult, messageHash);
1273
+ }
1274
+ if (futures !== undefined) {
1275
+ const futuresKeys = Object.keys(futures); // marginAccount
1276
+ const futuresResult = {
1277
+ 'info': message,
1278
+ 'timestamp': timestamp,
1279
+ 'datetime': this.iso8601(timestamp),
1280
+ };
1281
+ for (let i = 0; i < futuresKeys.length; i++) {
1282
+ const key = futuresKeys[i];
1283
+ const symbol = this.safeSymbol(key);
1284
+ const newAccount = this.account();
1285
+ const future = this.safeValue(futures, key);
1286
+ const currencyId = this.safeString(future, 'unit');
1287
+ const code = this.safeCurrencyCode(currencyId);
1288
+ newAccount['free'] = this.safeString(future, 'available');
1289
+ newAccount['used'] = this.safeString(future, 'initial_margin');
1290
+ newAccount['total'] = this.safeString(future, 'balance');
1291
+ futuresResult[symbol] = {};
1292
+ futuresResult[symbol][code] = newAccount;
1293
+ }
1294
+ this.balance['margin'] = futuresResult;
1295
+ this.balance['margin'] = this.safeBalance(this.balance['margin']);
1296
+ client.resolve(this.balance['margin'], messageHash + 'futures');
1297
+ }
1298
+ if (flexFutures !== undefined) {
1299
+ const flexFutureCurrencies = this.safeValue(flexFutures, 'currencies', {});
1300
+ const flexFuturesKeys = Object.keys(flexFutureCurrencies); // multi-collateral margin account
1301
+ const flexFuturesResult = {
1302
+ 'info': message,
1303
+ 'timestamp': timestamp,
1304
+ 'datetime': this.iso8601(timestamp),
1305
+ };
1306
+ for (let i = 0; i < flexFuturesKeys.length; i++) {
1307
+ const key = flexFuturesKeys[i];
1308
+ const flexFuture = this.safeValue(flexFutureCurrencies, key);
1309
+ const code = this.safeCurrencyCode(key);
1310
+ const newAccount = this.account();
1311
+ newAccount['free'] = this.safeString(flexFuture, 'available');
1312
+ newAccount['used'] = this.safeString(flexFuture, 'collateral_value');
1313
+ newAccount['total'] = this.safeString(flexFuture, 'quantity');
1314
+ flexFuturesResult[code] = newAccount;
1315
+ }
1316
+ this.balance['flex'] = flexFuturesResult;
1317
+ this.balance['flex'] = this.safeBalance(this.balance['flex']);
1318
+ client.resolve(this.balance['flex'], messageHash + 'flex_futures');
1319
+ }
1320
+ client.resolve(this.balance, messageHash);
1321
+ }
1322
+ handleMyTrades(client, message) {
1323
+ //
1324
+ // {
1325
+ // "feed": "fills_snapshot",
1326
+ // "account": "DemoUser",
1327
+ // "fills": [
1328
+ // {
1329
+ // "instrument": "FI_XBTUSD_200925",
1330
+ // "time": 1600256910739,
1331
+ // "price": 10937.5,
1332
+ // "seq": 36,
1333
+ // "buy": true,
1334
+ // "qty": 5000.0,
1335
+ // "order_id": "9e30258b-5a98-4002-968a-5b0e149bcfbf",
1336
+ // "cli_ord_id": "8b58d9da-fcaf-4f60-91bc-9973a3eba48d", // only on update, not on snapshot
1337
+ // "fill_id": "cad76f07-814e-4dc6-8478-7867407b6bff",
1338
+ // "fill_type": "maker",
1339
+ // "fee_paid": -0.00009142857,
1340
+ // "fee_currency": "BTC",
1341
+ // "taker_order_type": "ioc",
1342
+ // "order_type": "limit"
1343
+ // },
1344
+ // ...
1345
+ // ]
1346
+ // }
1347
+ //
1348
+ const trades = this.safeValue(message, 'fills', []);
1349
+ let stored = this.myTrades;
1350
+ if (stored === undefined) {
1351
+ const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
1352
+ stored = new Cache.ArrayCacheBySymbolById(limit);
1353
+ this.myTrades = stored;
1354
+ }
1355
+ const tradeSymbols = {};
1356
+ for (let i = 0; i < trades.length; i++) {
1357
+ const trade = trades[i];
1358
+ const parsedTrade = this.parseWsMyTrade(trade);
1359
+ tradeSymbols[parsedTrade['symbol']] = true;
1360
+ stored.append(parsedTrade);
1361
+ }
1362
+ const tradeSymbolKeys = Object.keys(tradeSymbols);
1363
+ for (let i = 0; i < tradeSymbolKeys.length; i++) {
1364
+ const symbol = tradeSymbolKeys[i];
1365
+ const messageHash = 'myTrades:' + symbol;
1366
+ client.resolve(stored, messageHash);
1367
+ }
1368
+ client.resolve(stored, 'myTrades');
1369
+ }
1370
+ parseWsMyTrade(trade, market = undefined) {
1371
+ //
1372
+ // {
1373
+ // "instrument": "FI_XBTUSD_200925",
1374
+ // "time": 1600256910739,
1375
+ // "price": 10937.5,
1376
+ // "seq": 36,
1377
+ // "buy": true,
1378
+ // "qty": 5000.0,
1379
+ // "order_id": "9e30258b-5a98-4002-968a-5b0e149bcfbf",
1380
+ // "cli_ord_id": "8b58d9da-fcaf-4f60-91bc-9973a3eba48d", // only on update, not on snapshot
1381
+ // "fill_id": "cad76f07-814e-4dc6-8478-7867407b6bff",
1382
+ // "fill_type": "maker",
1383
+ // "fee_paid": -0.00009142857,
1384
+ // "fee_currency": "BTC",
1385
+ // "taker_order_type": "ioc",
1386
+ // "order_type": "limit"
1387
+ // }
1388
+ //
1389
+ const timestamp = this.safeInteger(trade, 'time');
1390
+ const marketId = this.safeString(trade, 'instrument');
1391
+ market = this.safeMarket(marketId, market);
1392
+ const isBuy = this.safeValue(trade, 'buy');
1393
+ const feeCurrencyId = this.safeString(trade, 'fee_currency');
1394
+ return this.safeTrade({
1395
+ 'info': trade,
1396
+ 'id': this.safeString(trade, 'fill_id'),
1397
+ 'timestamp': timestamp,
1398
+ 'datetime': this.iso8601(timestamp),
1399
+ 'symbol': this.safeString(market, 'symbol'),
1400
+ 'order': this.safeString(trade, 'order_id'),
1401
+ 'type': this.safeString(trade, 'type'),
1402
+ 'side': isBuy ? 'buy' : 'sell',
1403
+ 'takerOrMaker': this.safeString(trade, 'fill_type'),
1404
+ 'price': this.safeString(trade, 'price'),
1405
+ 'amount': this.safeString(trade, 'qty'),
1406
+ 'cost': undefined,
1407
+ 'fee': {
1408
+ 'currency': this.safeCurrencyCode(feeCurrencyId),
1409
+ 'cost': this.safeString(trade, 'fee_paid'),
1410
+ 'rate': undefined,
1411
+ },
1412
+ });
1413
+ }
1414
+ handleErrorMessage(client, message) {
1415
+ //
1416
+ // {
1417
+ // event: 'alert',
1418
+ // message: 'Failed to subscribe to authenticated feed'
1419
+ // }
1420
+ //
1421
+ const errMsg = this.safeString(message, 'message');
1422
+ try {
1423
+ throw new errors.ExchangeError(this.id + ' ' + errMsg);
1424
+ }
1425
+ catch (error) {
1426
+ client.reject(error);
1427
+ }
1428
+ }
1429
+ handleMessage(client, message) {
1430
+ const event = this.safeString(message, 'event');
1431
+ if (event === 'challenge') {
1432
+ this.handleAuthenticate(client, message);
1433
+ }
1434
+ else if (event === 'alert') {
1435
+ return this.handleErrorMessage(client, message);
1436
+ }
1437
+ else if (event === 'pong') {
1438
+ client.lastPong = this.milliseconds();
1439
+ }
1440
+ else if (event === undefined) {
1441
+ const feed = this.safeString(message, 'feed');
1442
+ const methods = {
1443
+ 'ticker': this.handleTicker,
1444
+ 'trade': this.handleTrade,
1445
+ 'trade_snapshot': this.handleTrade,
1446
+ // 'heartbeat': this.handleStatus,
1447
+ 'ticker_lite': this.handleTicker,
1448
+ 'book': this.handleOrderBook,
1449
+ 'book_snapshot': this.handleOrderBookSnapshot,
1450
+ 'open_orders_verbose': this.handleOrder,
1451
+ 'open_orders_verbose_snapshot': this.handleOrderSnapshot,
1452
+ 'fills': this.handleMyTrades,
1453
+ 'fills_snapshot': this.handleMyTrades,
1454
+ 'open_orders': this.handleOrder,
1455
+ 'open_orders_snapshot': this.handleOrderSnapshot,
1456
+ 'balances': this.handleBalance,
1457
+ 'balances_snapshot': this.handleBalance,
1458
+ 'open_positions': this.handlePositions,
1459
+ };
1460
+ const method = this.safeValue(methods, feed);
1461
+ if (method !== undefined) {
1462
+ return method.call(this, client, message);
1463
+ }
1464
+ }
1465
+ }
1466
+ handleAuthenticate(client, message) {
1467
+ /**
1468
+ * @ignore
1469
+ * @method
1470
+ * @see https://docs.futures.kraken.com/#websocket-api-websocket-api-introduction-sign-challenge-challenge
1471
+ */
1472
+ //
1473
+ // {
1474
+ // "event": "challenge",
1475
+ // "message": "226aee50-88fc-4618-a42a-34f7709570b2"
1476
+ // }
1477
+ //
1478
+ const event = this.safeValue(message, 'event');
1479
+ const messageHash = 'challenge';
1480
+ if (event !== 'error') {
1481
+ const challenge = this.safeValue(message, 'message');
1482
+ const hashedChallenge = this.hash(this.encode(challenge), sha256.sha256, 'binary');
1483
+ const base64Secret = this.base64ToBinary(this.secret);
1484
+ const signature = this.hmac(hashedChallenge, base64Secret, sha512.sha512, 'base64');
1485
+ this.options['challenge'] = challenge;
1486
+ this.options['signedChallenge'] = signature;
1487
+ client.resolve(message, messageHash);
1488
+ }
1489
+ else {
1490
+ const error = new errors.AuthenticationError(this.id + ' ' + this.json(message));
1491
+ client.reject(error, messageHash);
1492
+ if (messageHash in client.subscriptions) {
1493
+ delete client.subscriptions[messageHash];
1494
+ }
1495
+ }
1496
+ return message;
1497
+ }
1498
+ }
1499
+
1500
+ module.exports = krakenfutures;