ccxt-ir 4.10.0 → 4.11.0

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 (1047) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +4 -1
  4. package/dist/cjs/src/abstract/bidarz.js +11 -0
  5. package/dist/cjs/src/bidarz.js +337 -0
  6. package/dist/cjs/src/bit24.js +4 -3
  7. package/js/ccxt.d.ts +5 -2
  8. package/js/ccxt.js +4 -2
  9. package/js/src/abstract/bidarz.d.ts +9 -0
  10. package/js/src/abstract/bidarz.js +11 -0
  11. package/js/src/bidarz.d.ts +22 -0
  12. package/js/src/bidarz.js +336 -0
  13. package/js/src/bit24.js +4 -3
  14. package/js/src/src/abantether.d.ts +21 -0
  15. package/js/src/src/abantether.js +353 -0
  16. package/js/src/src/abstract/abantether.d.ts +8 -0
  17. package/js/src/src/abstract/abantether.js +11 -0
  18. package/js/src/src/abstract/afratether.d.ts +9 -0
  19. package/js/src/src/abstract/afratether.js +11 -0
  20. package/js/src/src/abstract/alpaca.d.ts +77 -0
  21. package/js/src/src/abstract/alpaca.js +11 -0
  22. package/js/src/src/abstract/apex.d.ts +34 -0
  23. package/js/src/src/abstract/apex.js +11 -0
  24. package/js/src/src/abstract/arzinja.d.ts +8 -0
  25. package/js/src/src/abstract/arzinja.js +11 -0
  26. package/js/src/src/abstract/arzplus.d.ts +11 -0
  27. package/js/src/src/abstract/arzplus.js +11 -0
  28. package/js/src/src/abstract/ascendex.d.ts +80 -0
  29. package/js/src/src/abstract/ascendex.js +11 -0
  30. package/js/src/src/abstract/asretether.d.ts +8 -0
  31. package/js/src/src/abstract/asretether.js +11 -0
  32. package/js/src/src/abstract/bidarz.d.ts +9 -0
  33. package/js/src/src/abstract/bidarz.js +11 -0
  34. package/js/src/src/abstract/bigone.d.ts +48 -0
  35. package/js/src/src/abstract/bigone.js +11 -0
  36. package/js/src/src/abstract/binance.d.ts +773 -0
  37. package/js/src/src/abstract/binance.js +11 -0
  38. package/js/src/src/abstract/bingx.d.ts +165 -0
  39. package/js/src/src/abstract/bingx.js +11 -0
  40. package/js/src/src/abstract/bit24.d.ts +9 -0
  41. package/js/src/src/abstract/bit24.js +11 -0
  42. package/js/src/src/abstract/bit2c.d.ts +30 -0
  43. package/js/src/src/abstract/bit2c.js +11 -0
  44. package/js/src/src/abstract/bitbank.d.ts +35 -0
  45. package/js/src/src/abstract/bitbank.js +11 -0
  46. package/js/src/src/abstract/bitbarg.d.ts +8 -0
  47. package/js/src/src/abstract/bitbarg.js +11 -0
  48. package/js/src/src/abstract/bitbns.d.ts +43 -0
  49. package/js/src/src/abstract/bitbns.js +11 -0
  50. package/js/src/src/abstract/bitfinex.d.ts +143 -0
  51. package/js/src/src/abstract/bitfinex.js +11 -0
  52. package/js/src/src/abstract/bitflyer.d.ts +42 -0
  53. package/js/src/src/abstract/bitflyer.js +11 -0
  54. package/js/src/src/abstract/bitget.d.ts +578 -0
  55. package/js/src/src/abstract/bitget.js +11 -0
  56. package/js/src/src/abstract/bithumb.d.ts +35 -0
  57. package/js/src/src/abstract/bithumb.js +11 -0
  58. package/js/src/src/abstract/bitimen.d.ts +10 -0
  59. package/js/src/src/abstract/bitimen.js +11 -0
  60. package/js/src/src/abstract/bitir.d.ts +10 -0
  61. package/js/src/src/abstract/bitir.js +11 -0
  62. package/js/src/src/abstract/bitmart.d.ts +120 -0
  63. package/js/src/src/abstract/bitmart.js +11 -0
  64. package/js/src/src/abstract/bitmex.d.ts +100 -0
  65. package/js/src/src/abstract/bitmex.js +11 -0
  66. package/js/src/src/abstract/bitopro.d.ts +33 -0
  67. package/js/src/src/abstract/bitopro.js +11 -0
  68. package/js/src/src/abstract/bitpin.d.ts +11 -0
  69. package/js/src/src/abstract/bitpin.js +11 -0
  70. package/js/src/src/abstract/bitrue.d.ts +75 -0
  71. package/js/src/src/abstract/bitrue.js +11 -0
  72. package/js/src/src/abstract/bitso.d.ts +46 -0
  73. package/js/src/src/abstract/bitso.js +11 -0
  74. package/js/src/src/abstract/bitstamp.d.ts +262 -0
  75. package/js/src/src/abstract/bitstamp.js +11 -0
  76. package/js/src/src/abstract/bitteam.d.ts +32 -0
  77. package/js/src/src/abstract/bitteam.js +11 -0
  78. package/js/src/src/abstract/bittrade.d.ts +117 -0
  79. package/js/src/src/abstract/bittrade.js +11 -0
  80. package/js/src/src/abstract/bitunix.d.ts +9 -0
  81. package/js/src/src/abstract/bitunix.js +11 -0
  82. package/js/src/src/abstract/bitvavo.d.ts +30 -0
  83. package/js/src/src/abstract/bitvavo.js +11 -0
  84. package/js/src/src/abstract/blockchaincom.d.ts +31 -0
  85. package/js/src/src/abstract/blockchaincom.js +11 -0
  86. package/js/src/src/abstract/blofin.d.ts +70 -0
  87. package/js/src/src/abstract/blofin.js +11 -0
  88. package/js/src/src/abstract/btcalpha.d.ts +21 -0
  89. package/js/src/src/abstract/btcalpha.js +11 -0
  90. package/js/src/src/abstract/btcbox.d.ts +18 -0
  91. package/js/src/src/abstract/btcbox.js +11 -0
  92. package/js/src/src/abstract/btcmarkets.d.ts +42 -0
  93. package/js/src/src/abstract/btcmarkets.js +11 -0
  94. package/js/src/src/abstract/btcturk.d.ts +23 -0
  95. package/js/src/src/abstract/btcturk.js +11 -0
  96. package/js/src/src/abstract/bybit.d.ts +316 -0
  97. package/js/src/src/abstract/bybit.js +11 -0
  98. package/js/src/src/abstract/bydfi.d.ts +11 -0
  99. package/js/src/src/abstract/bydfi.js +11 -0
  100. package/js/src/src/abstract/cafearz.d.ts +8 -0
  101. package/js/src/src/abstract/cafearz.js +11 -0
  102. package/js/src/src/abstract/cex.d.ts +35 -0
  103. package/js/src/src/abstract/cex.js +11 -0
  104. package/js/src/src/abstract/coinbase.d.ts +97 -0
  105. package/js/src/src/abstract/coinbase.js +11 -0
  106. package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
  107. package/js/src/src/abstract/coinbaseexchange.js +11 -0
  108. package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
  109. package/js/src/src/abstract/coinbaseinternational.js +11 -0
  110. package/js/src/src/abstract/coincatch.d.ts +97 -0
  111. package/js/src/src/abstract/coincatch.js +11 -0
  112. package/js/src/src/abstract/coincheck.d.ts +36 -0
  113. package/js/src/src/abstract/coincheck.js +11 -0
  114. package/js/src/src/abstract/coinex.d.ts +240 -0
  115. package/js/src/src/abstract/coinex.js +11 -0
  116. package/js/src/src/abstract/coinmate.d.ts +65 -0
  117. package/js/src/src/abstract/coinmate.js +11 -0
  118. package/js/src/src/abstract/coinmetro.d.ts +37 -0
  119. package/js/src/src/abstract/coinmetro.js +11 -0
  120. package/js/src/src/abstract/coinone.d.ts +70 -0
  121. package/js/src/src/abstract/coinone.js +11 -0
  122. package/js/src/src/abstract/coinsph.d.ts +57 -0
  123. package/js/src/src/abstract/coinsph.js +11 -0
  124. package/js/src/src/abstract/coinspot.d.ts +31 -0
  125. package/js/src/src/abstract/coinspot.js +11 -0
  126. package/js/src/src/abstract/cryptocom.d.ts +126 -0
  127. package/js/src/src/abstract/cryptocom.js +11 -0
  128. package/js/src/src/abstract/cryptomus.d.ts +23 -0
  129. package/js/src/src/abstract/cryptomus.js +11 -0
  130. package/js/src/src/abstract/defx.d.ts +72 -0
  131. package/js/src/src/abstract/defx.js +11 -0
  132. package/js/src/src/abstract/delta.d.ts +53 -0
  133. package/js/src/src/abstract/delta.js +11 -0
  134. package/js/src/src/abstract/deribit.d.ts +129 -0
  135. package/js/src/src/abstract/deribit.js +11 -0
  136. package/js/src/src/abstract/derive.d.ts +120 -0
  137. package/js/src/src/abstract/derive.js +11 -0
  138. package/js/src/src/abstract/digifinex.d.ts +95 -0
  139. package/js/src/src/abstract/digifinex.js +11 -0
  140. package/js/src/src/abstract/ellipx.d.ts +28 -0
  141. package/js/src/src/abstract/ellipx.js +11 -0
  142. package/js/src/src/abstract/eterex.d.ts +8 -0
  143. package/js/src/src/abstract/eterex.js +11 -0
  144. package/js/src/src/abstract/excoino.d.ts +10 -0
  145. package/js/src/src/abstract/excoino.js +11 -0
  146. package/js/src/src/abstract/exir.d.ts +11 -0
  147. package/js/src/src/abstract/exir.js +11 -0
  148. package/js/src/src/abstract/exmo.d.ts +58 -0
  149. package/js/src/src/abstract/exmo.js +11 -0
  150. package/js/src/src/abstract/exnovin.d.ts +9 -0
  151. package/js/src/src/abstract/exnovin.js +11 -0
  152. package/js/src/src/abstract/farhadexchange.d.ts +8 -0
  153. package/js/src/src/abstract/farhadexchange.js +11 -0
  154. package/js/src/src/abstract/foxbit.d.ts +29 -0
  155. package/js/src/src/abstract/foxbit.js +11 -0
  156. package/js/src/src/abstract/gate.d.ts +287 -0
  157. package/js/src/src/abstract/gate.js +11 -0
  158. package/js/src/src/abstract/gemini.d.ts +62 -0
  159. package/js/src/src/abstract/gemini.js +11 -0
  160. package/js/src/src/abstract/hamtapay.d.ts +9 -0
  161. package/js/src/src/abstract/hamtapay.js +11 -0
  162. package/js/src/src/abstract/hashkey.d.ts +70 -0
  163. package/js/src/src/abstract/hashkey.js +11 -0
  164. package/js/src/src/abstract/hibachi.d.ts +29 -0
  165. package/js/src/src/abstract/hibachi.js +11 -0
  166. package/js/src/src/abstract/hitbtc.d.ts +118 -0
  167. package/js/src/src/abstract/hitbtc.js +11 -0
  168. package/js/src/src/abstract/hitobit.d.ts +11 -0
  169. package/js/src/src/abstract/hitobit.js +11 -0
  170. package/js/src/src/abstract/hollaex.d.ts +36 -0
  171. package/js/src/src/abstract/hollaex.js +11 -0
  172. package/js/src/src/abstract/htx.d.ts +551 -0
  173. package/js/src/src/abstract/htx.js +11 -0
  174. package/js/src/src/abstract/hyperliquid.d.ts +9 -0
  175. package/js/src/src/abstract/hyperliquid.js +11 -0
  176. package/js/src/src/abstract/independentreserve.d.ts +46 -0
  177. package/js/src/src/abstract/independentreserve.js +11 -0
  178. package/js/src/src/abstract/indodax.d.ts +29 -0
  179. package/js/src/src/abstract/indodax.js +11 -0
  180. package/js/src/src/abstract/iranexchange.d.ts +9 -0
  181. package/js/src/src/abstract/iranexchange.js +11 -0
  182. package/js/src/src/abstract/jibitex.d.ts +10 -0
  183. package/js/src/src/abstract/jibitex.js +11 -0
  184. package/js/src/src/abstract/kcex.d.ts +10 -0
  185. package/js/src/src/abstract/kcex.js +11 -0
  186. package/js/src/src/abstract/kifpoolme.d.ts +9 -0
  187. package/js/src/src/abstract/kifpoolme.js +11 -0
  188. package/js/src/src/abstract/kraken.d.ts +61 -0
  189. package/js/src/src/abstract/kraken.js +11 -0
  190. package/js/src/src/abstract/krakenfutures.d.ts +45 -0
  191. package/js/src/src/abstract/krakenfutures.js +11 -0
  192. package/js/src/src/abstract/kucoin.d.ts +227 -0
  193. package/js/src/src/abstract/kucoin.js +11 -0
  194. package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
  195. package/js/src/src/abstract/kucoinfutures.js +11 -0
  196. package/js/src/src/abstract/latoken.d.ts +59 -0
  197. package/js/src/src/abstract/latoken.js +11 -0
  198. package/js/src/src/abstract/lbank.d.ts +65 -0
  199. package/js/src/src/abstract/lbank.js +11 -0
  200. package/js/src/src/abstract/luno.d.ts +41 -0
  201. package/js/src/src/abstract/luno.js +11 -0
  202. package/js/src/src/abstract/mazdax.d.ts +11 -0
  203. package/js/src/src/abstract/mazdax.js +11 -0
  204. package/js/src/src/abstract/mercado.d.ts +28 -0
  205. package/js/src/src/abstract/mercado.js +11 -0
  206. package/js/src/src/abstract/mexc.d.ts +183 -0
  207. package/js/src/src/abstract/mexc.js +11 -0
  208. package/js/src/src/abstract/modetrade.d.ts +122 -0
  209. package/js/src/src/abstract/modetrade.js +11 -0
  210. package/js/src/src/abstract/ndax.d.ts +100 -0
  211. package/js/src/src/abstract/ndax.js +11 -0
  212. package/js/src/src/abstract/nobitex.d.ts +10 -0
  213. package/js/src/src/abstract/nobitex.js +11 -0
  214. package/js/src/src/abstract/novadax.d.ts +32 -0
  215. package/js/src/src/abstract/novadax.js +11 -0
  216. package/js/src/src/abstract/oceanex.d.ts +30 -0
  217. package/js/src/src/abstract/oceanex.js +11 -0
  218. package/js/src/src/abstract/okcoin.d.ts +77 -0
  219. package/js/src/src/abstract/okcoin.js +11 -0
  220. package/js/src/src/abstract/okexchange.d.ts +11 -0
  221. package/js/src/src/abstract/okexchange.js +11 -0
  222. package/js/src/src/abstract/okx.d.ts +352 -0
  223. package/js/src/src/abstract/okx.js +11 -0
  224. package/js/src/src/abstract/ompfinex.d.ts +10 -0
  225. package/js/src/src/abstract/ompfinex.js +11 -0
  226. package/js/src/src/abstract/onetrading.d.ts +26 -0
  227. package/js/src/src/abstract/onetrading.js +11 -0
  228. package/js/src/src/abstract/oxfun.d.ts +37 -0
  229. package/js/src/src/abstract/oxfun.js +11 -0
  230. package/js/src/src/abstract/p2b.d.ts +25 -0
  231. package/js/src/src/abstract/p2b.js +11 -0
  232. package/js/src/src/abstract/paradex.d.ts +66 -0
  233. package/js/src/src/abstract/paradex.js +11 -0
  234. package/js/src/src/abstract/paymium.d.ts +31 -0
  235. package/js/src/src/abstract/paymium.js +11 -0
  236. package/js/src/src/abstract/phemex.d.ts +120 -0
  237. package/js/src/src/abstract/phemex.js +11 -0
  238. package/js/src/src/abstract/pingi.d.ts +9 -0
  239. package/js/src/src/abstract/pingi.js +11 -0
  240. package/js/src/src/abstract/poloniex.d.ts +108 -0
  241. package/js/src/src/abstract/poloniex.js +11 -0
  242. package/js/src/src/abstract/pooleno.d.ts +8 -0
  243. package/js/src/src/abstract/pooleno.js +11 -0
  244. package/js/src/src/abstract/probit.d.ts +26 -0
  245. package/js/src/src/abstract/probit.js +11 -0
  246. package/js/src/src/abstract/raastin.d.ts +11 -0
  247. package/js/src/src/abstract/raastin.js +11 -0
  248. package/js/src/src/abstract/ramzinex.d.ts +10 -0
  249. package/js/src/src/abstract/ramzinex.js +11 -0
  250. package/js/src/src/abstract/sarmayex.d.ts +8 -0
  251. package/js/src/src/abstract/sarmayex.js +11 -0
  252. package/js/src/src/abstract/sarrafex.d.ts +10 -0
  253. package/js/src/src/abstract/sarrafex.js +11 -0
  254. package/js/src/src/abstract/tabdeal.d.ts +10 -0
  255. package/js/src/src/abstract/tabdeal.js +11 -0
  256. package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
  257. package/js/src/src/abstract/tehran_exchange.js +11 -0
  258. package/js/src/src/abstract/tetherland.d.ts +8 -0
  259. package/js/src/src/abstract/tetherland.js +11 -0
  260. package/js/src/src/abstract/timex.d.ts +65 -0
  261. package/js/src/src/abstract/timex.js +11 -0
  262. package/js/src/src/abstract/tokocrypto.d.ts +40 -0
  263. package/js/src/src/abstract/tokocrypto.js +11 -0
  264. package/js/src/src/abstract/toobit.d.ts +10 -0
  265. package/js/src/src/abstract/toobit.js +11 -0
  266. package/js/src/src/abstract/tradeogre.d.ts +21 -0
  267. package/js/src/src/abstract/tradeogre.js +11 -0
  268. package/js/src/src/abstract/twox.d.ts +8 -0
  269. package/js/src/src/abstract/twox.js +11 -0
  270. package/js/src/src/abstract/ubitex.d.ts +10 -0
  271. package/js/src/src/abstract/ubitex.js +11 -0
  272. package/js/src/src/abstract/upbit.d.ts +58 -0
  273. package/js/src/src/abstract/upbit.js +11 -0
  274. package/js/src/src/abstract/vertex.d.ts +22 -0
  275. package/js/src/src/abstract/vertex.js +11 -0
  276. package/js/src/src/abstract/wallex.d.ts +11 -0
  277. package/js/src/src/abstract/wallex.js +11 -0
  278. package/js/src/src/abstract/wavesexchange.d.ts +157 -0
  279. package/js/src/src/abstract/wavesexchange.js +11 -0
  280. package/js/src/src/abstract/whitebit.d.ts +117 -0
  281. package/js/src/src/abstract/whitebit.js +11 -0
  282. package/js/src/src/abstract/woo.d.ts +144 -0
  283. package/js/src/src/abstract/woo.js +11 -0
  284. package/js/src/src/abstract/woofipro.d.ts +122 -0
  285. package/js/src/src/abstract/woofipro.js +11 -0
  286. package/js/src/src/abstract/xt.d.ts +160 -0
  287. package/js/src/src/abstract/xt.js +11 -0
  288. package/js/src/src/abstract/yobit.d.ts +19 -0
  289. package/js/src/src/abstract/yobit.js +11 -0
  290. package/js/src/src/abstract/zaif.d.ts +41 -0
  291. package/js/src/src/abstract/zaif.js +11 -0
  292. package/js/src/src/abstract/zonda.d.ts +56 -0
  293. package/js/src/src/abstract/zonda.js +11 -0
  294. package/js/src/src/afratether.d.ts +21 -0
  295. package/js/src/src/afratether.js +356 -0
  296. package/js/src/src/alpaca.d.ts +332 -0
  297. package/js/src/src/alpaca.js +1908 -0
  298. package/js/src/src/apex.d.ts +333 -0
  299. package/js/src/src/apex.js +1942 -0
  300. package/js/src/src/arzinja.d.ts +21 -0
  301. package/js/src/src/arzinja.js +298 -0
  302. package/js/src/src/arzplus.d.ts +26 -0
  303. package/js/src/src/arzplus.js +581 -0
  304. package/js/src/src/ascendex.d.ts +424 -0
  305. package/js/src/src/ascendex.js +3699 -0
  306. package/js/src/src/asretether.d.ts +21 -0
  307. package/js/src/src/asretether.js +324 -0
  308. package/js/src/src/base/Exchange.d.ts +926 -0
  309. package/js/src/src/base/Exchange.js +7399 -0
  310. package/js/src/src/base/Precise.d.ts +42 -0
  311. package/js/src/src/base/Precise.js +275 -0
  312. package/js/src/src/base/errors.d.ts +168 -0
  313. package/js/src/src/base/errors.js +255 -0
  314. package/js/src/src/base/functions/crypto.d.ts +16 -0
  315. package/js/src/src/base/functions/crypto.js +131 -0
  316. package/js/src/src/base/functions/encode.d.ts +4 -0
  317. package/js/src/src/base/functions/encode.js +32 -0
  318. package/js/src/src/base/functions/generic.d.ts +29 -0
  319. package/js/src/src/base/functions/generic.js +203 -0
  320. package/js/src/src/base/functions/misc.d.ts +9 -0
  321. package/js/src/src/base/functions/misc.js +101 -0
  322. package/js/src/src/base/functions/number.d.ts +27 -0
  323. package/js/src/src/base/functions/number.js +313 -0
  324. package/js/src/src/base/functions/platform.d.ts +7 -0
  325. package/js/src/src/base/functions/platform.js +27 -0
  326. package/js/src/src/base/functions/rsa.d.ts +5 -0
  327. package/js/src/src/base/functions/rsa.js +49 -0
  328. package/js/src/src/base/functions/string.d.ts +7 -0
  329. package/js/src/src/base/functions/string.js +44 -0
  330. package/js/src/src/base/functions/throttle.d.ts +6 -0
  331. package/js/src/src/base/functions/throttle.js +67 -0
  332. package/js/src/src/base/functions/time.d.ts +21 -0
  333. package/js/src/src/base/functions/time.js +171 -0
  334. package/js/src/src/base/functions/totp.d.ts +3 -0
  335. package/js/src/src/base/functions/totp.js +25 -0
  336. package/js/src/src/base/functions/type.d.ts +37 -0
  337. package/js/src/src/base/functions/type.js +179 -0
  338. package/js/src/src/base/functions.d.ts +10 -0
  339. package/js/src/src/base/functions.js +18 -0
  340. package/js/src/src/base/types.d.ts +586 -0
  341. package/js/src/src/base/types.js +7 -0
  342. package/js/src/src/base/ws/Cache.d.ts +27 -0
  343. package/js/src/src/base/ws/Cache.js +260 -0
  344. package/js/src/src/base/ws/Client.d.ts +53 -0
  345. package/js/src/src/base/ws/Client.js +307 -0
  346. package/js/src/src/base/ws/Future.d.ts +8 -0
  347. package/js/src/src/base/ws/Future.js +35 -0
  348. package/js/src/src/base/ws/OrderBook.d.ts +25 -0
  349. package/js/src/src/base/ws/OrderBook.js +130 -0
  350. package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
  351. package/js/src/src/base/ws/OrderBookSide.js +286 -0
  352. package/js/src/src/base/ws/WsClient.d.ts +11 -0
  353. package/js/src/src/base/ws/WsClient.js +69 -0
  354. package/js/src/src/bequant.d.ts +4 -0
  355. package/js/src/src/bequant.js +35 -0
  356. package/js/src/src/bidarz.d.ts +16 -0
  357. package/js/src/src/bidarz.js +327 -0
  358. package/js/src/src/bigone.d.ts +296 -0
  359. package/js/src/src/bigone.js +2340 -0
  360. package/js/src/src/binance.d.ts +1667 -0
  361. package/js/src/src/binance.js +14400 -0
  362. package/js/src/src/binancecoinm.d.ts +6 -0
  363. package/js/src/src/binancecoinm.js +51 -0
  364. package/js/src/src/binanceus.d.ts +4 -0
  365. package/js/src/src/binanceus.js +225 -0
  366. package/js/src/src/binanceusdm.d.ts +6 -0
  367. package/js/src/src/binanceusdm.js +63 -0
  368. package/js/src/src/bingx.d.ts +778 -0
  369. package/js/src/src/bingx.js +6705 -0
  370. package/js/src/src/bit24.d.ts +24 -0
  371. package/js/src/src/bit24.js +520 -0
  372. package/js/src/src/bit2c.d.ts +146 -0
  373. package/js/src/src/bit2c.js +1029 -0
  374. package/js/src/src/bitbank.d.ts +181 -0
  375. package/js/src/src/bitbank.js +1146 -0
  376. package/js/src/src/bitbarg.d.ts +21 -0
  377. package/js/src/src/bitbarg.js +312 -0
  378. package/js/src/src/bitbns.d.ts +184 -0
  379. package/js/src/src/bitbns.js +1288 -0
  380. package/js/src/src/bitfinex.d.ts +516 -0
  381. package/js/src/src/bitfinex.js +3951 -0
  382. package/js/src/src/bitflyer.d.ts +229 -0
  383. package/js/src/src/bitflyer.js +1209 -0
  384. package/js/src/src/bitget.d.ts +1109 -0
  385. package/js/src/src/bitget.js +11033 -0
  386. package/js/src/src/bithumb.d.ts +165 -0
  387. package/js/src/src/bithumb.js +1257 -0
  388. package/js/src/src/bitimen.d.ts +23 -0
  389. package/js/src/src/bitimen.js +424 -0
  390. package/js/src/src/bitir.d.ts +23 -0
  391. package/js/src/src/bitir.js +521 -0
  392. package/js/src/src/bitmart.d.ts +736 -0
  393. package/js/src/src/bitmart.js +5639 -0
  394. package/js/src/src/bitmex.d.ts +395 -0
  395. package/js/src/src/bitmex.js +3088 -0
  396. package/js/src/src/bitopro.d.ts +295 -0
  397. package/js/src/src/bitopro.js +1892 -0
  398. package/js/src/src/bitpin.d.ts +23 -0
  399. package/js/src/src/bitpin.js +487 -0
  400. package/js/src/src/bitrue.d.ts +384 -0
  401. package/js/src/src/bitrue.js +3382 -0
  402. package/js/src/src/bitso.d.ts +270 -0
  403. package/js/src/src/bitso.js +1881 -0
  404. package/js/src/src/bitstamp.d.ts +355 -0
  405. package/js/src/src/bitstamp.js +2445 -0
  406. package/js/src/src/bitteam.d.ts +229 -0
  407. package/js/src/src/bitteam.js +2420 -0
  408. package/js/src/src/bittrade.d.ts +298 -0
  409. package/js/src/src/bittrade.js +2050 -0
  410. package/js/src/src/bitunix.d.ts +21 -0
  411. package/js/src/src/bitunix.js +326 -0
  412. package/js/src/src/bitvavo.d.ts +311 -0
  413. package/js/src/src/bitvavo.js +2204 -0
  414. package/js/src/src/blockchaincom.d.ts +256 -0
  415. package/js/src/src/blockchaincom.js +1259 -0
  416. package/js/src/src/blofin.d.ts +439 -0
  417. package/js/src/src/blofin.js +2576 -0
  418. package/js/src/src/btcalpha.d.ts +209 -0
  419. package/js/src/src/btcalpha.js +1056 -0
  420. package/js/src/src/btcbox.d.ts +144 -0
  421. package/js/src/src/btcbox.js +834 -0
  422. package/js/src/src/btcmarkets.d.ts +253 -0
  423. package/js/src/src/btcmarkets.js +1418 -0
  424. package/js/src/src/btcturk.d.ts +161 -0
  425. package/js/src/src/btcturk.js +1058 -0
  426. package/js/src/src/bybit.d.ts +1097 -0
  427. package/js/src/src/bybit.js +9382 -0
  428. package/js/src/src/bydfi.d.ts +23 -0
  429. package/js/src/src/bydfi.js +434 -0
  430. package/js/src/src/cafearz.d.ts +21 -0
  431. package/js/src/src/cafearz.js +346 -0
  432. package/js/src/src/cex.d.ts +286 -0
  433. package/js/src/src/cex.js +1799 -0
  434. package/js/src/src/coinbase.d.ts +623 -0
  435. package/js/src/src/coinbase.js +5220 -0
  436. package/js/src/src/coinbaseadvanced.d.ts +4 -0
  437. package/js/src/src/coinbaseadvanced.js +18 -0
  438. package/js/src/src/coinbaseexchange.d.ts +334 -0
  439. package/js/src/src/coinbaseexchange.js +2127 -0
  440. package/js/src/src/coinbaseinternational.d.ts +443 -0
  441. package/js/src/src/coinbaseinternational.js +2336 -0
  442. package/js/src/src/coincatch.d.ts +786 -0
  443. package/js/src/src/coincatch.js +5492 -0
  444. package/js/src/src/coincheck.d.ts +147 -0
  445. package/js/src/src/coincheck.js +962 -0
  446. package/js/src/src/coinex.d.ts +719 -0
  447. package/js/src/src/coinex.js +6166 -0
  448. package/js/src/src/coinmate.d.ts +202 -0
  449. package/js/src/src/coinmate.js +1215 -0
  450. package/js/src/src/coinmetro.d.ts +244 -0
  451. package/js/src/src/coinmetro.js +2024 -0
  452. package/js/src/src/coinone.d.ts +158 -0
  453. package/js/src/src/coinone.js +1278 -0
  454. package/js/src/src/coinsph.d.ts +310 -0
  455. package/js/src/src/coinsph.js +2203 -0
  456. package/js/src/src/coinspot.d.ts +108 -0
  457. package/js/src/src/coinspot.js +653 -0
  458. package/js/src/src/cryptocom.d.ts +463 -0
  459. package/js/src/src/cryptocom.js +3549 -0
  460. package/js/src/src/cryptomus.d.ts +158 -0
  461. package/js/src/src/cryptomus.js +1169 -0
  462. package/js/src/src/defx.d.ts +348 -0
  463. package/js/src/src/defx.js +2139 -0
  464. package/js/src/src/delta.d.ts +407 -0
  465. package/js/src/src/delta.js +3654 -0
  466. package/js/src/src/deribit.d.ts +516 -0
  467. package/js/src/src/deribit.js +3790 -0
  468. package/js/src/src/derive.d.ts +324 -0
  469. package/js/src/src/derive.js +2655 -0
  470. package/js/src/src/digifinex.d.ts +544 -0
  471. package/js/src/src/digifinex.js +4453 -0
  472. package/js/src/src/ellipx.d.ts +237 -0
  473. package/js/src/src/ellipx.js +2071 -0
  474. package/js/src/src/eterex.d.ts +21 -0
  475. package/js/src/src/eterex.js +299 -0
  476. package/js/src/src/excoino.d.ts +23 -0
  477. package/js/src/src/excoino.js +426 -0
  478. package/js/src/src/exir.d.ts +23 -0
  479. package/js/src/src/exir.js +403 -0
  480. package/js/src/src/exmo.d.ts +426 -0
  481. package/js/src/src/exmo.js +2825 -0
  482. package/js/src/src/exnovin.d.ts +22 -0
  483. package/js/src/src/exnovin.js +378 -0
  484. package/js/src/src/farhadexchange.d.ts +21 -0
  485. package/js/src/src/farhadexchange.js +280 -0
  486. package/js/src/src/fmfwio.d.ts +4 -0
  487. package/js/src/src/fmfwio.js +35 -0
  488. package/js/src/src/foxbit.d.ts +352 -0
  489. package/js/src/src/foxbit.js +2016 -0
  490. package/js/src/src/gate.d.ts +1071 -0
  491. package/js/src/src/gate.js +8282 -0
  492. package/js/src/src/gateio.d.ts +4 -0
  493. package/js/src/src/gateio.js +17 -0
  494. package/js/src/src/gemini.d.ts +257 -0
  495. package/js/src/src/gemini.js +2006 -0
  496. package/js/src/src/hamtapay.d.ts +21 -0
  497. package/js/src/src/hamtapay.js +303 -0
  498. package/js/src/src/hashkey.d.ts +628 -0
  499. package/js/src/src/hashkey.js +4363 -0
  500. package/js/src/src/hibachi.d.ts +346 -0
  501. package/js/src/src/hibachi.js +2137 -0
  502. package/js/src/src/hitbtc.d.ts +558 -0
  503. package/js/src/src/hitbtc.js +3847 -0
  504. package/js/src/src/hitobit.d.ts +23 -0
  505. package/js/src/src/hitobit.js +412 -0
  506. package/js/src/src/hollaex.d.ts +305 -0
  507. package/js/src/src/hollaex.js +2046 -0
  508. package/js/src/src/htx.d.ts +961 -0
  509. package/js/src/src/htx.js +9668 -0
  510. package/js/src/src/huobi.d.ts +4 -0
  511. package/js/src/src/huobi.js +17 -0
  512. package/js/src/src/hyperliquid.d.ts +651 -0
  513. package/js/src/src/hyperliquid.js +3937 -0
  514. package/js/src/src/independentreserve.d.ts +169 -0
  515. package/js/src/src/independentreserve.js +1115 -0
  516. package/js/src/src/indodax.d.ts +217 -0
  517. package/js/src/src/indodax.js +1454 -0
  518. package/js/src/src/iranexchange.d.ts +21 -0
  519. package/js/src/src/iranexchange.js +399 -0
  520. package/js/src/src/jibitex.d.ts +23 -0
  521. package/js/src/src/jibitex.js +416 -0
  522. package/js/src/src/kcex.d.ts +21 -0
  523. package/js/src/src/kcex.js +335 -0
  524. package/js/src/src/kifpoolme.d.ts +23 -0
  525. package/js/src/src/kifpoolme.js +410 -0
  526. package/js/src/src/kraken.d.ts +484 -0
  527. package/js/src/src/kraken.js +3518 -0
  528. package/js/src/src/krakenfutures.d.ts +362 -0
  529. package/js/src/src/krakenfutures.js +2885 -0
  530. package/js/src/src/kucoin.d.ts +759 -0
  531. package/js/src/src/kucoin.js +5153 -0
  532. package/js/src/src/kucoinfutures.d.ts +521 -0
  533. package/js/src/src/kucoinfutures.js +3381 -0
  534. package/js/src/src/latoken.d.ts +274 -0
  535. package/js/src/src/latoken.js +1824 -0
  536. package/js/src/src/lbank.d.ts +350 -0
  537. package/js/src/src/lbank.js +3146 -0
  538. package/js/src/src/luno.d.ts +252 -0
  539. package/js/src/src/luno.js +1479 -0
  540. package/js/src/src/mazdax.d.ts +23 -0
  541. package/js/src/src/mazdax.js +534 -0
  542. package/js/src/src/mercado.d.ts +160 -0
  543. package/js/src/src/mercado.js +1011 -0
  544. package/js/src/src/mexc.d.ts +768 -0
  545. package/js/src/src/mexc.js +6102 -0
  546. package/js/src/src/modetrade.d.ts +496 -0
  547. package/js/src/src/modetrade.js +2936 -0
  548. package/js/src/src/myokx.d.ts +4 -0
  549. package/js/src/src/myokx.js +54 -0
  550. package/js/src/src/ndax.d.ts +285 -0
  551. package/js/src/src/ndax.js +2598 -0
  552. package/js/src/src/nobitex.d.ts +23 -0
  553. package/js/src/src/nobitex.js +454 -0
  554. package/js/src/src/novadax.d.ts +279 -0
  555. package/js/src/src/novadax.js +1676 -0
  556. package/js/src/src/oceanex.d.ts +231 -0
  557. package/js/src/src/oceanex.js +1123 -0
  558. package/js/src/src/okcoin.d.ts +346 -0
  559. package/js/src/src/okcoin.js +3211 -0
  560. package/js/src/src/okexchange.d.ts +23 -0
  561. package/js/src/src/okexchange.js +373 -0
  562. package/js/src/src/okx.d.ts +1125 -0
  563. package/js/src/src/okx.js +9009 -0
  564. package/js/src/src/okxus.d.ts +4 -0
  565. package/js/src/src/okxus.js +54 -0
  566. package/js/src/src/ompfinex.d.ts +23 -0
  567. package/js/src/src/ompfinex.js +510 -0
  568. package/js/src/src/onetrading.d.ts +228 -0
  569. package/js/src/src/onetrading.js +1769 -0
  570. package/js/src/src/oxfun.d.ts +442 -0
  571. package/js/src/src/oxfun.js +2920 -0
  572. package/js/src/src/p2b.d.ts +189 -0
  573. package/js/src/src/p2b.js +1344 -0
  574. package/js/src/src/paradex.d.ts +389 -0
  575. package/js/src/src/paradex.js +2607 -0
  576. package/js/src/src/paymium.d.ts +133 -0
  577. package/js/src/src/paymium.js +644 -0
  578. package/js/src/src/phemex.d.ts +497 -0
  579. package/js/src/src/phemex.js +5333 -0
  580. package/js/src/src/pingi.d.ts +22 -0
  581. package/js/src/src/pingi.js +446 -0
  582. package/js/src/src/poloniex.d.ts +441 -0
  583. package/js/src/src/poloniex.js +3681 -0
  584. package/js/src/src/pooleno.d.ts +21 -0
  585. package/js/src/src/pooleno.js +347 -0
  586. package/js/src/src/pro/alpaca.d.ts +95 -0
  587. package/js/src/src/pro/alpaca.js +724 -0
  588. package/js/src/src/pro/apex.d.ts +160 -0
  589. package/js/src/src/pro/apex.js +1044 -0
  590. package/js/src/src/pro/ascendex.d.ts +99 -0
  591. package/js/src/src/pro/ascendex.js +1012 -0
  592. package/js/src/src/pro/bequant.d.ts +4 -0
  593. package/js/src/src/pro/bequant.js +42 -0
  594. package/js/src/src/pro/binance.d.ts +796 -0
  595. package/js/src/src/pro/binance.js +4373 -0
  596. package/js/src/src/pro/binancecoinm.d.ts +4 -0
  597. package/js/src/src/pro/binancecoinm.js +32 -0
  598. package/js/src/src/pro/binanceus.d.ts +4 -0
  599. package/js/src/src/pro/binanceus.js +52 -0
  600. package/js/src/src/pro/binanceusdm.d.ts +4 -0
  601. package/js/src/src/pro/binanceusdm.js +37 -0
  602. package/js/src/src/pro/bingx.d.ts +151 -0
  603. package/js/src/src/pro/bingx.js +1568 -0
  604. package/js/src/src/pro/bitfinex.d.ts +99 -0
  605. package/js/src/src/pro/bitfinex.js +1165 -0
  606. package/js/src/src/pro/bitget.d.ts +257 -0
  607. package/js/src/src/pro/bitget.js +2327 -0
  608. package/js/src/src/pro/bithumb.d.ts +59 -0
  609. package/js/src/src/pro/bithumb.js +395 -0
  610. package/js/src/src/pro/bitmart.d.ts +168 -0
  611. package/js/src/src/pro/bitmart.js +1686 -0
  612. package/js/src/src/pro/bitmex.d.ts +170 -0
  613. package/js/src/src/pro/bitmex.js +1760 -0
  614. package/js/src/src/pro/bitopro.d.ts +69 -0
  615. package/js/src/src/pro/bitopro.js +477 -0
  616. package/js/src/src/pro/bitrue.d.ts +40 -0
  617. package/js/src/src/pro/bitrue.js +461 -0
  618. package/js/src/src/pro/bitstamp.d.ts +53 -0
  619. package/js/src/src/pro/bitstamp.js +587 -0
  620. package/js/src/src/pro/bittrade.d.ts +66 -0
  621. package/js/src/src/pro/bittrade.js +606 -0
  622. package/js/src/src/pro/bitvavo.d.ts +321 -0
  623. package/js/src/src/pro/bitvavo.js +1451 -0
  624. package/js/src/src/pro/blockchaincom.d.ts +89 -0
  625. package/js/src/src/pro/blockchaincom.js +777 -0
  626. package/js/src/src/pro/blofin.d.ts +174 -0
  627. package/js/src/src/pro/blofin.js +743 -0
  628. package/js/src/src/pro/bybit.d.ts +397 -0
  629. package/js/src/src/pro/bybit.js +2519 -0
  630. package/js/src/src/pro/cex.d.ts +220 -0
  631. package/js/src/src/pro/cex.js +1535 -0
  632. package/js/src/src/pro/coinbase.d.ts +119 -0
  633. package/js/src/src/pro/coinbase.js +736 -0
  634. package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
  635. package/js/src/src/pro/coinbaseadvanced.js +18 -0
  636. package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
  637. package/js/src/src/pro/coinbaseexchange.js +969 -0
  638. package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
  639. package/js/src/src/pro/coinbaseinternational.js +804 -0
  640. package/js/src/src/pro/coincatch.d.ts +207 -0
  641. package/js/src/src/pro/coincatch.js +1562 -0
  642. package/js/src/src/pro/coincheck.d.ts +33 -0
  643. package/js/src/src/pro/coincheck.js +210 -0
  644. package/js/src/src/pro/coinex.d.ts +147 -0
  645. package/js/src/src/pro/coinex.js +1426 -0
  646. package/js/src/src/pro/coinone.d.ts +51 -0
  647. package/js/src/src/pro/coinone.js +413 -0
  648. package/js/src/src/pro/cryptocom.d.ts +300 -0
  649. package/js/src/src/pro/cryptocom.js +1414 -0
  650. package/js/src/src/pro/defx.d.ts +236 -0
  651. package/js/src/src/pro/defx.js +865 -0
  652. package/js/src/src/pro/deribit.d.ts +163 -0
  653. package/js/src/src/pro/deribit.js +1066 -0
  654. package/js/src/src/pro/derive.d.ts +100 -0
  655. package/js/src/src/pro/derive.js +753 -0
  656. package/js/src/src/pro/exmo.d.ts +97 -0
  657. package/js/src/src/pro/exmo.js +903 -0
  658. package/js/src/src/pro/gate.d.ts +360 -0
  659. package/js/src/src/pro/gate.js +2119 -0
  660. package/js/src/src/pro/gateio.d.ts +4 -0
  661. package/js/src/src/pro/gateio.js +17 -0
  662. package/js/src/src/pro/gemini.d.ts +106 -0
  663. package/js/src/src/pro/gemini.js +932 -0
  664. package/js/src/src/pro/hashkey.d.ts +121 -0
  665. package/js/src/src/pro/hashkey.js +843 -0
  666. package/js/src/src/pro/hitbtc.d.ts +235 -0
  667. package/js/src/src/pro/hitbtc.js +1400 -0
  668. package/js/src/src/pro/hollaex.d.ts +77 -0
  669. package/js/src/src/pro/hollaex.js +604 -0
  670. package/js/src/src/pro/htx.d.ts +141 -0
  671. package/js/src/src/pro/htx.js +2415 -0
  672. package/js/src/src/pro/huobi.d.ts +4 -0
  673. package/js/src/src/pro/huobi.js +17 -0
  674. package/js/src/src/pro/hyperliquid.d.ts +218 -0
  675. package/js/src/src/pro/hyperliquid.js +1126 -0
  676. package/js/src/src/pro/independentreserve.d.ts +36 -0
  677. package/js/src/src/pro/independentreserve.js +287 -0
  678. package/js/src/src/pro/kraken.d.ts +233 -0
  679. package/js/src/src/pro/kraken.js +1785 -0
  680. package/js/src/src/pro/krakenfutures.d.ts +178 -0
  681. package/js/src/src/pro/krakenfutures.js +1592 -0
  682. package/js/src/src/pro/kucoin.d.ts +221 -0
  683. package/js/src/src/pro/kucoin.js +1430 -0
  684. package/js/src/src/pro/kucoinfutures.d.ts +205 -0
  685. package/js/src/src/pro/kucoinfutures.js +1295 -0
  686. package/js/src/src/pro/lbank.d.ts +134 -0
  687. package/js/src/src/pro/lbank.js +950 -0
  688. package/js/src/src/pro/luno.d.ts +44 -0
  689. package/js/src/src/pro/luno.js +322 -0
  690. package/js/src/src/pro/mexc.d.ts +210 -0
  691. package/js/src/src/pro/mexc.js +2009 -0
  692. package/js/src/src/pro/modetrade.d.ts +155 -0
  693. package/js/src/src/pro/modetrade.js +1335 -0
  694. package/js/src/src/pro/myokx.d.ts +4 -0
  695. package/js/src/src/pro/myokx.js +39 -0
  696. package/js/src/src/pro/ndax.d.ts +60 -0
  697. package/js/src/src/pro/ndax.js +545 -0
  698. package/js/src/src/pro/okcoin.d.ts +91 -0
  699. package/js/src/src/pro/okcoin.js +763 -0
  700. package/js/src/src/pro/okx.d.ts +408 -0
  701. package/js/src/src/pro/okx.js +2479 -0
  702. package/js/src/src/pro/okxus.d.ts +4 -0
  703. package/js/src/src/pro/okxus.js +39 -0
  704. package/js/src/src/pro/onetrading.d.ts +107 -0
  705. package/js/src/src/pro/onetrading.js +1343 -0
  706. package/js/src/src/pro/oxfun.d.ts +234 -0
  707. package/js/src/src/pro/oxfun.js +1112 -0
  708. package/js/src/src/pro/p2b.d.ts +104 -0
  709. package/js/src/src/pro/p2b.js +506 -0
  710. package/js/src/src/pro/paradex.d.ts +54 -0
  711. package/js/src/src/pro/paradex.js +370 -0
  712. package/js/src/src/pro/phemex.d.ts +129 -0
  713. package/js/src/src/pro/phemex.js +1569 -0
  714. package/js/src/src/pro/poloniex.d.ts +214 -0
  715. package/js/src/src/pro/poloniex.js +1318 -0
  716. package/js/src/src/pro/probit.d.ts +91 -0
  717. package/js/src/src/pro/probit.js +593 -0
  718. package/js/src/src/pro/tradeogre.d.ts +49 -0
  719. package/js/src/src/pro/tradeogre.js +284 -0
  720. package/js/src/src/pro/upbit.d.ts +124 -0
  721. package/js/src/src/pro/upbit.js +689 -0
  722. package/js/src/src/pro/vertex.d.ts +104 -0
  723. package/js/src/src/pro/vertex.js +999 -0
  724. package/js/src/src/pro/whitebit.d.ts +123 -0
  725. package/js/src/src/pro/whitebit.js +971 -0
  726. package/js/src/src/pro/woo.d.ts +161 -0
  727. package/js/src/src/pro/woo.js +1351 -0
  728. package/js/src/src/pro/woofipro.d.ts +155 -0
  729. package/js/src/src/pro/woofipro.js +1335 -0
  730. package/js/src/src/pro/xt.d.ts +165 -0
  731. package/js/src/src/pro/xt.js +1230 -0
  732. package/js/src/src/probit.d.ts +283 -0
  733. package/js/src/src/probit.js +1935 -0
  734. package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
  735. package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
  736. package/js/src/src/raastin.d.ts +24 -0
  737. package/js/src/src/raastin.js +494 -0
  738. package/js/src/src/ramzinex.d.ts +23 -0
  739. package/js/src/src/ramzinex.js +510 -0
  740. package/js/src/src/sarmayex.d.ts +21 -0
  741. package/js/src/src/sarmayex.js +376 -0
  742. package/js/src/src/sarrafex.d.ts +23 -0
  743. package/js/src/src/sarrafex.js +501 -0
  744. package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
  745. package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
  746. package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
  747. package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
  748. package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
  749. package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
  750. package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
  751. package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
  752. package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
  753. package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
  754. package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
  755. package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
  756. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
  757. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
  758. package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
  759. package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
  760. package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
  761. package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
  762. package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
  763. package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
  764. package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
  765. package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
  766. package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
  767. package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
  768. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
  769. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
  770. package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
  771. package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
  772. package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
  773. package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
  774. package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
  775. package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
  776. package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
  777. package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
  778. package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
  779. package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
  780. package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
  781. package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
  782. package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
  783. package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
  784. package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
  785. package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
  786. package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
  787. package/js/src/src/static_dependencies/ethers/index.js +22 -0
  788. package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
  789. package/js/src/src/static_dependencies/ethers/interface.js +990 -0
  790. package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
  791. package/js/src/src/static_dependencies/ethers/typed.js +608 -0
  792. package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
  793. package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
  794. package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
  795. package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
  796. package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
  797. package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
  798. package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
  799. package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
  800. package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
  801. package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
  802. package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
  803. package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
  804. package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
  805. package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
  806. package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
  807. package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
  808. package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
  809. package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
  810. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
  811. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
  812. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
  813. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
  814. package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
  815. package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
  816. package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
  817. package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
  818. package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
  819. package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
  820. package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
  821. package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
  822. package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
  823. package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
  824. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
  825. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
  826. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
  827. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
  828. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
  829. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
  830. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
  831. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
  832. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
  833. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
  834. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
  835. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
  836. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
  837. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
  838. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
  839. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
  840. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
  841. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
  842. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
  843. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
  844. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
  845. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
  846. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
  847. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
  848. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
  849. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
  850. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
  851. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
  852. package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
  853. package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
  854. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
  855. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
  856. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
  857. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
  858. package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
  859. package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
  860. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
  861. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
  862. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
  863. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
  864. package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
  865. package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
  866. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
  867. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
  868. package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
  869. package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
  870. package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
  871. package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
  872. package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
  873. package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
  874. package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
  875. package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
  876. package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
  877. package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
  878. package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
  879. package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
  880. package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
  881. package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
  882. package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
  883. package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
  884. package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
  885. package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
  886. package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
  887. package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
  888. package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
  889. package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
  890. package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
  891. package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
  892. package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
  893. package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
  894. package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
  895. package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
  896. package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
  897. package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
  898. package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
  899. package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
  900. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
  901. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
  902. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
  903. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
  904. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
  905. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
  906. package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
  907. package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
  908. package/js/src/src/static_dependencies/qs/index.cjs +15 -0
  909. package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
  910. package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
  911. package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
  912. package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
  913. package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
  914. package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
  915. package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
  916. package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
  917. package/js/src/src/static_dependencies/scure-base/index.js +420 -0
  918. package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  919. package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
  920. package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
  921. package/js/src/src/static_dependencies/starknet/constants.js +67 -0
  922. package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
  923. package/js/src/src/static_dependencies/starknet/index.js +9 -0
  924. package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  925. package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  926. package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  927. package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
  928. package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
  929. package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
  930. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  931. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  932. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  933. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  934. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  935. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  936. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  937. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  938. package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  939. package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
  940. package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  941. package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
  942. package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  943. package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
  944. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  945. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  946. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  947. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  948. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  949. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  950. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  951. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  952. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  953. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  954. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  955. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  956. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  957. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  958. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  959. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  960. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  961. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  962. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  963. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  964. package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  965. package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  966. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  967. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  968. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  969. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  970. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  971. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  972. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  973. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  974. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  975. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  976. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  977. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  978. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  979. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  980. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  981. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  982. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  983. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  984. package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  985. package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
  986. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  987. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
  988. package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  989. package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  990. package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  991. package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
  992. package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  993. package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
  994. package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  995. package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
  996. package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  997. package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
  998. package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  999. package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
  1000. package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
  1001. package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
  1002. package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
  1003. package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
  1004. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
  1005. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
  1006. package/js/src/src/tabdeal.d.ts +23 -0
  1007. package/js/src/src/tabdeal.js +387 -0
  1008. package/js/src/src/tehran_exchange.d.ts +21 -0
  1009. package/js/src/src/tehran_exchange.js +333 -0
  1010. package/js/src/src/tetherland.d.ts +21 -0
  1011. package/js/src/src/tetherland.js +367 -0
  1012. package/js/src/src/timex.d.ts +247 -0
  1013. package/js/src/src/timex.js +1792 -0
  1014. package/js/src/src/tokocrypto.d.ts +261 -0
  1015. package/js/src/src/tokocrypto.js +2641 -0
  1016. package/js/src/src/toobit.d.ts +22 -0
  1017. package/js/src/src/toobit.js +445 -0
  1018. package/js/src/src/tradeogre.d.ts +149 -0
  1019. package/js/src/src/tradeogre.js +878 -0
  1020. package/js/src/src/twox.d.ts +21 -0
  1021. package/js/src/src/twox.js +371 -0
  1022. package/js/src/src/ubitex.d.ts +23 -0
  1023. package/js/src/src/ubitex.js +433 -0
  1024. package/js/src/src/upbit.d.ts +377 -0
  1025. package/js/src/src/upbit.js +2340 -0
  1026. package/js/src/src/vertex.d.ts +346 -0
  1027. package/js/src/src/vertex.js +3146 -0
  1028. package/js/src/src/wallex.d.ts +23 -0
  1029. package/js/src/src/wallex.js +467 -0
  1030. package/js/src/src/wavesexchange.d.ts +244 -0
  1031. package/js/src/src/wavesexchange.js +2747 -0
  1032. package/js/src/src/whitebit.d.ts +571 -0
  1033. package/js/src/src/whitebit.js +3437 -0
  1034. package/js/src/src/woo.d.ts +727 -0
  1035. package/js/src/src/woo.js +4183 -0
  1036. package/js/src/src/woofipro.d.ts +497 -0
  1037. package/js/src/src/woofipro.js +2941 -0
  1038. package/js/src/src/xt.d.ts +568 -0
  1039. package/js/src/src/xt.js +5184 -0
  1040. package/js/src/src/yobit.d.ts +197 -0
  1041. package/js/src/src/yobit.js +1453 -0
  1042. package/js/src/src/zaif.d.ts +136 -0
  1043. package/js/src/src/zaif.js +821 -0
  1044. package/js/src/src/zonda.d.ts +214 -0
  1045. package/js/src/src/zonda.js +1984 -0
  1046. package/js/test.js +3 -3
  1047. package/package.json +1 -1
@@ -0,0 +1,2479 @@
1
+ // ----------------------------------------------------------------------------
2
+
3
+ // PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ // https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+ // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
+
7
+ // ---------------------------------------------------------------------------
8
+ import okxRest from '../okx.js';
9
+ import { ArgumentsRequired, BadRequest, ExchangeError, ChecksumError, AuthenticationError, InvalidNonce } from '../base/errors.js';
10
+ import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
11
+ import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
12
+ // ---------------------------------------------------------------------------
13
+ export default class okx extends okxRest {
14
+ describe() {
15
+ return this.deepExtend(super.describe(), {
16
+ 'has': {
17
+ 'ws': true,
18
+ 'watchTicker': true,
19
+ 'watchMarkPrice': true,
20
+ 'watchMarkPrices': true,
21
+ 'watchTickers': true,
22
+ 'watchBidsAsks': true,
23
+ 'watchOrderBook': true,
24
+ 'watchTrades': true,
25
+ 'watchTradesForSymbols': true,
26
+ 'watchOrderBookForSymbols': true,
27
+ 'watchBalance': true,
28
+ 'watchLiquidations': 'emulated',
29
+ 'watchLiquidationsForSymbols': true,
30
+ 'watchMyLiquidations': 'emulated',
31
+ 'watchMyLiquidationsForSymbols': true,
32
+ 'watchOHLCV': true,
33
+ 'watchOHLCVForSymbols': true,
34
+ 'watchOrders': true,
35
+ 'watchMyTrades': true,
36
+ 'watchPositions': true,
37
+ 'watchFundingRate': true,
38
+ 'watchFundingRates': true,
39
+ 'createOrderWs': true,
40
+ 'editOrderWs': true,
41
+ 'cancelOrderWs': true,
42
+ 'cancelOrdersWs': true,
43
+ 'cancelAllOrdersWs': true,
44
+ },
45
+ 'urls': {
46
+ 'api': {
47
+ 'ws': 'wss://ws.okx.com:8443/ws/v5',
48
+ },
49
+ 'test': {
50
+ 'ws': 'wss://wspap.okx.com:8443/ws/v5',
51
+ },
52
+ },
53
+ 'options': {
54
+ 'watchOrderBook': {
55
+ 'checksum': true,
56
+ //
57
+ // bbo-tbt
58
+ // 1. Newly added channel that sends tick-by-tick Level 1 data
59
+ // 2. All API users can subscribe
60
+ // 3. Public depth channel, verification not required
61
+ //
62
+ // books-l2-tbt
63
+ // 1. Only users who're VIP5 and above can subscribe
64
+ // 2. Identity verification required before subscription
65
+ //
66
+ // books50-l2-tbt
67
+ // 1. Only users who're VIP4 and above can subscribe
68
+ // 2. Identity verification required before subscription
69
+ //
70
+ // books
71
+ // 1. All API users can subscribe
72
+ // 2. Public depth channel, verification not required
73
+ //
74
+ // books5
75
+ // 1. All API users can subscribe
76
+ // 2. Public depth channel, verification not required
77
+ // 3. Data feeds will be delivered every 100ms (vs. every 200ms now)
78
+ //
79
+ 'depth': 'books',
80
+ },
81
+ 'watchBalance': 'spot',
82
+ 'watchTicker': {
83
+ 'channel': 'tickers', // tickers, sprd-tickers, index-tickers, block-tickers
84
+ },
85
+ 'watchTickers': {
86
+ 'channel': 'tickers', // tickers, sprd-tickers, index-tickers, block-tickers
87
+ },
88
+ 'watchOrders': {
89
+ 'type': 'ANY', // SPOT, MARGIN, SWAP, FUTURES, OPTION, ANY
90
+ },
91
+ 'watchMyTrades': {
92
+ 'type': 'ANY', // SPOT, MARGIN, SWAP, FUTURES, OPTION, ANY
93
+ },
94
+ 'createOrderWs': {
95
+ 'op': 'batch-orders', // order, batch-orders
96
+ },
97
+ 'editOrderWs': {
98
+ 'op': 'amend-order', // amend-order, batch-amend-orders
99
+ },
100
+ 'ws': {
101
+ // 'inflate': true,
102
+ },
103
+ },
104
+ 'streaming': {
105
+ // okex does not support built-in ws protocol-level ping-pong
106
+ // instead it requires a custom text-based ping-pong
107
+ 'ping': this.ping,
108
+ 'keepAlive': 18000,
109
+ },
110
+ });
111
+ }
112
+ getUrl(channel, access = 'public') {
113
+ // for context: https://www.okx.com/help-center/changes-to-v5-api-websocket-subscription-parameter-and-url
114
+ const isSandbox = this.options['sandboxMode'];
115
+ const sandboxSuffix = isSandbox ? '?brokerId=9999' : '';
116
+ const isBusiness = (access === 'business');
117
+ const isPublic = (access === 'public');
118
+ const url = this.urls['api']['ws'];
119
+ if (isBusiness || (channel.indexOf('candle') > -1) || (channel === 'orders-algo')) {
120
+ return url + '/business' + sandboxSuffix;
121
+ }
122
+ else if (isPublic) {
123
+ return url + '/public' + sandboxSuffix;
124
+ }
125
+ return url + '/private' + sandboxSuffix;
126
+ }
127
+ async subscribeMultiple(access, channel, symbols = undefined, params = {}) {
128
+ await this.loadMarkets();
129
+ if (symbols === undefined) {
130
+ symbols = this.symbols;
131
+ }
132
+ symbols = this.marketSymbols(symbols);
133
+ const url = this.getUrl(channel, access);
134
+ const messageHashes = [];
135
+ const args = [];
136
+ for (let i = 0; i < symbols.length; i++) {
137
+ const marketId = this.marketId(symbols[i]);
138
+ const arg = {
139
+ 'channel': channel,
140
+ 'instId': marketId,
141
+ };
142
+ args.push(this.extend(arg, params));
143
+ messageHashes.push(channel + '::' + symbols[i]);
144
+ }
145
+ const request = {
146
+ 'op': 'subscribe',
147
+ 'args': args,
148
+ };
149
+ return await this.watchMultiple(url, messageHashes, request, messageHashes);
150
+ }
151
+ async subscribe(access, messageHash, channel, symbol, params = {}) {
152
+ await this.loadMarkets();
153
+ const url = this.getUrl(channel, access);
154
+ const firstArgument = {
155
+ 'channel': channel,
156
+ };
157
+ if (symbol !== undefined) {
158
+ const market = this.market(symbol);
159
+ messageHash += ':' + market['id'];
160
+ firstArgument['instId'] = market['id'];
161
+ }
162
+ const request = {
163
+ 'op': 'subscribe',
164
+ 'args': [
165
+ this.deepExtend(firstArgument, params),
166
+ ],
167
+ };
168
+ return await this.watch(url, messageHash, request, messageHash);
169
+ }
170
+ /**
171
+ * @method
172
+ * @name okx#watchTrades
173
+ * @description get the list of most recent trades for a particular symbol
174
+ * @param {string} symbol unified symbol of the market to fetch trades for
175
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
176
+ * @param {int} [limit] the maximum amount of trades to fetch
177
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
178
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
179
+ */
180
+ async watchTrades(symbol, since = undefined, limit = undefined, params = {}) {
181
+ return await this.watchTradesForSymbols([symbol], since, limit, params);
182
+ }
183
+ /**
184
+ * @method
185
+ * @name okx#watchTradesForSymbols
186
+ * @description get the list of most recent trades for a particular symbol
187
+ * @param {string} symbols
188
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
189
+ * @param {int} [limit] the maximum amount of trades to fetch
190
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
191
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
192
+ */
193
+ async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
194
+ const symbolsLength = symbols.length;
195
+ if (symbolsLength === 0) {
196
+ throw new ArgumentsRequired(this.id + ' watchTradesForSymbols() requires a non-empty array of symbols');
197
+ }
198
+ await this.loadMarkets();
199
+ symbols = this.marketSymbols(symbols);
200
+ const channel = 'trades';
201
+ const topics = [];
202
+ const messageHashes = [];
203
+ for (let i = 0; i < symbols.length; i++) {
204
+ const symbol = symbols[i];
205
+ messageHashes.push(channel + ':' + symbol);
206
+ const marketId = this.marketId(symbol);
207
+ const topic = {
208
+ 'channel': channel,
209
+ 'instId': marketId,
210
+ };
211
+ topics.push(topic);
212
+ }
213
+ const request = {
214
+ 'op': 'subscribe',
215
+ 'args': topics,
216
+ };
217
+ const url = this.getUrl(channel, 'public');
218
+ const trades = await this.watchMultiple(url, messageHashes, request, messageHashes);
219
+ if (this.newUpdates) {
220
+ const first = this.safeValue(trades, 0);
221
+ const tradeSymbol = this.safeString(first, 'symbol');
222
+ limit = trades.getLimit(tradeSymbol, limit);
223
+ }
224
+ return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
225
+ }
226
+ /**
227
+ * @method
228
+ * @name okx#unWatchTradesForSymbols
229
+ * @description unWatches from the stream channel
230
+ * @param {string[]} symbols
231
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
232
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
233
+ */
234
+ async unWatchTradesForSymbols(symbols, params = {}) {
235
+ await this.loadMarkets();
236
+ symbols = this.marketSymbols(symbols, undefined, false);
237
+ const channel = 'trades';
238
+ const topics = [];
239
+ const messageHashes = [];
240
+ for (let i = 0; i < symbols.length; i++) {
241
+ const symbol = symbols[i];
242
+ messageHashes.push('unsubscribe:trades:' + symbol);
243
+ const marketId = this.marketId(symbol);
244
+ const topic = {
245
+ 'channel': channel,
246
+ 'instId': marketId,
247
+ };
248
+ topics.push(topic);
249
+ }
250
+ const request = {
251
+ 'op': 'unsubscribe',
252
+ 'args': topics,
253
+ };
254
+ const url = this.getUrl(channel, 'public');
255
+ return await this.watchMultiple(url, messageHashes, request, messageHashes);
256
+ }
257
+ /**
258
+ * @method
259
+ * @name okx#unWatchTrades
260
+ * @description unWatches from the stream channel
261
+ * @param {string} symbol unified symbol of the market to fetch trades for
262
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
263
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
264
+ */
265
+ async unWatchTrades(symbol, params = {}) {
266
+ return await this.unWatchTradesForSymbols([symbol], params);
267
+ }
268
+ handleTrades(client, message) {
269
+ //
270
+ // {
271
+ // "arg": { channel: "trades", instId: "BTC-USDT" },
272
+ // "data": [
273
+ // {
274
+ // "instId": "BTC-USDT",
275
+ // "tradeId": "216970876",
276
+ // "px": "31684.5",
277
+ // "sz": "0.00001186",
278
+ // "side": "buy",
279
+ // "ts": "1626531038288"
280
+ // }
281
+ // ]
282
+ // }
283
+ //
284
+ const arg = this.safeValue(message, 'arg', {});
285
+ const channel = this.safeString(arg, 'channel');
286
+ const marketId = this.safeString(arg, 'instId');
287
+ const symbol = this.safeSymbol(marketId);
288
+ const data = this.safeValue(message, 'data', []);
289
+ const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
290
+ for (let i = 0; i < data.length; i++) {
291
+ const trade = this.parseTrade(data[i]);
292
+ const messageHash = channel + ':' + symbol;
293
+ let stored = this.safeValue(this.trades, symbol);
294
+ if (stored === undefined) {
295
+ stored = new ArrayCache(tradesLimit);
296
+ this.trades[symbol] = stored;
297
+ }
298
+ stored.append(trade);
299
+ client.resolve(stored, messageHash);
300
+ }
301
+ }
302
+ /**
303
+ * @method
304
+ * @name okx#watchFundingRate
305
+ * @description watch the current funding rate
306
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
307
+ * @param {string} symbol unified market symbol
308
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
309
+ * @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
310
+ */
311
+ async watchFundingRate(symbol, params = {}) {
312
+ symbol = this.symbol(symbol);
313
+ const fr = await this.watchFundingRates([symbol], params);
314
+ return fr[symbol];
315
+ }
316
+ /**
317
+ * @method
318
+ * @name coinbaseinternational#watchFundingRates
319
+ * @description watch the funding rate for multiple markets
320
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-funding-rate-channel
321
+ * @param {string[]} symbols list of unified market symbols
322
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
323
+ * @returns {object} a dictionary of [funding rates structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexe by market symbols
324
+ */
325
+ async watchFundingRates(symbols, params = {}) {
326
+ await this.loadMarkets();
327
+ symbols = this.marketSymbols(symbols);
328
+ const channel = 'funding-rate';
329
+ const topics = [];
330
+ const messageHashes = [];
331
+ for (let i = 0; i < symbols.length; i++) {
332
+ const symbol = symbols[i];
333
+ messageHashes.push(channel + ':' + symbol);
334
+ const marketId = this.marketId(symbol);
335
+ const topic = {
336
+ 'channel': channel,
337
+ 'instId': marketId,
338
+ };
339
+ topics.push(topic);
340
+ }
341
+ const request = {
342
+ 'op': 'subscribe',
343
+ 'args': topics,
344
+ };
345
+ const url = this.getUrl(channel, 'public');
346
+ const fundingRate = await this.watchMultiple(url, messageHashes, request, messageHashes);
347
+ if (this.newUpdates) {
348
+ const symbol = this.safeString(fundingRate, 'symbol');
349
+ const result = {};
350
+ result[symbol] = fundingRate;
351
+ return result;
352
+ }
353
+ return this.filterByArray(this.fundingRates, 'symbol', symbols);
354
+ }
355
+ handleFundingRate(client, message) {
356
+ //
357
+ // "data":[
358
+ // {
359
+ // "fundingRate":"0.0001875391284828",
360
+ // "fundingTime":"1700726400000",
361
+ // "instId":"BTC-USD-SWAP",
362
+ // "instType":"SWAP",
363
+ // "method": "next_period",
364
+ // "maxFundingRate":"0.00375",
365
+ // "minFundingRate":"-0.00375",
366
+ // "nextFundingRate":"0.0002608059239328",
367
+ // "nextFundingTime":"1700755200000",
368
+ // "premium": "0.0001233824646391",
369
+ // "settFundingRate":"0.0001699799259033",
370
+ // "settState":"settled",
371
+ // "ts":"1700724675402"
372
+ // }
373
+ // ]
374
+ //
375
+ const data = this.safeList(message, 'data', []);
376
+ for (let i = 0; i < data.length; i++) {
377
+ const rawfr = data[i];
378
+ const fundingRate = this.parseFundingRate(rawfr);
379
+ const symbol = fundingRate['symbol'];
380
+ this.fundingRates[symbol] = fundingRate;
381
+ client.resolve(fundingRate, 'funding-rate' + ':' + fundingRate['symbol']);
382
+ }
383
+ }
384
+ /**
385
+ * @method
386
+ * @name okx#watchTicker
387
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
388
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
389
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
390
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
391
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
392
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
393
+ */
394
+ async watchTicker(symbol, params = {}) {
395
+ let channel = undefined;
396
+ [channel, params] = this.handleOptionAndParams(params, 'watchTicker', 'channel', 'tickers');
397
+ params['channel'] = channel;
398
+ const market = this.market(symbol);
399
+ symbol = market['symbol'];
400
+ const ticker = await this.watchTickers([symbol], params);
401
+ return this.safeValue(ticker, symbol);
402
+ }
403
+ /**
404
+ * @method
405
+ * @name okx#unWatchTicker
406
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
407
+ * @description unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
408
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
409
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
410
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
411
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
412
+ */
413
+ async unWatchTicker(symbol, params = {}) {
414
+ return await this.unWatchTickers([symbol], params);
415
+ }
416
+ /**
417
+ * @method
418
+ * @name okx#watchTickers
419
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
420
+ * @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
421
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
422
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
423
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
424
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
425
+ */
426
+ async watchTickers(symbols = undefined, params = {}) {
427
+ await this.loadMarkets();
428
+ symbols = this.marketSymbols(symbols, undefined, false);
429
+ let channel = undefined;
430
+ [channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'tickers');
431
+ const newTickers = await this.subscribeMultiple('public', channel, symbols, params);
432
+ if (this.newUpdates) {
433
+ return newTickers;
434
+ }
435
+ return this.filterByArray(this.tickers, 'symbol', symbols);
436
+ }
437
+ /**
438
+ * @method
439
+ * @name okx#watchMarkPrice
440
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-channel
441
+ * @description watches a mark price
442
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
443
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
444
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
445
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
446
+ */
447
+ async watchMarkPrice(symbol, params = {}) {
448
+ let channel = undefined;
449
+ [channel, params] = this.handleOptionAndParams(params, 'watchMarkPrice', 'channel', 'mark-price');
450
+ params['channel'] = channel;
451
+ const market = this.market(symbol);
452
+ symbol = market['symbol'];
453
+ const ticker = await this.watchMarkPrices([symbol], params);
454
+ return ticker[symbol];
455
+ }
456
+ /**
457
+ * @method
458
+ * @name okx#watchMarkPrices
459
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-mark-price-channel
460
+ * @description watches mark prices
461
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
462
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
463
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
464
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
465
+ */
466
+ async watchMarkPrices(symbols = undefined, params = {}) {
467
+ await this.loadMarkets();
468
+ symbols = this.marketSymbols(symbols, undefined, false);
469
+ let channel = undefined;
470
+ [channel, params] = this.handleOptionAndParams(params, 'watchMarkPrices', 'channel', 'mark-price');
471
+ const newTickers = await this.subscribeMultiple('public', channel, symbols, params);
472
+ if (this.newUpdates) {
473
+ return newTickers;
474
+ }
475
+ return this.filterByArray(this.tickers, 'symbol', symbols);
476
+ }
477
+ /**
478
+ * @method
479
+ * @name okx#unWatchTickers
480
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
481
+ * @description unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
482
+ * @param {string[]} [symbols] unified symbol of the market to fetch the ticker for
483
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
484
+ * @param {string} [params.channel] the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
485
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
486
+ */
487
+ async unWatchTickers(symbols = undefined, params = {}) {
488
+ await this.loadMarkets();
489
+ symbols = this.marketSymbols(symbols, undefined, false);
490
+ let channel = undefined;
491
+ [channel, params] = this.handleOptionAndParams(params, 'watchTickers', 'channel', 'tickers');
492
+ const topics = [];
493
+ const messageHashes = [];
494
+ for (let i = 0; i < symbols.length; i++) {
495
+ const symbol = symbols[i];
496
+ messageHashes.push('unsubscribe:ticker:' + symbol);
497
+ const marketId = this.marketId(symbol);
498
+ const topic = {
499
+ 'channel': channel,
500
+ 'instId': marketId,
501
+ };
502
+ topics.push(topic);
503
+ }
504
+ const request = {
505
+ 'op': 'unsubscribe',
506
+ 'args': topics,
507
+ };
508
+ const url = this.getUrl(channel, 'public');
509
+ return await this.watchMultiple(url, messageHashes, request, messageHashes);
510
+ }
511
+ handleTicker(client, message) {
512
+ //
513
+ // {
514
+ // "arg": { channel: "tickers", instId: "BTC-USDT" },
515
+ // "data": [
516
+ // {
517
+ // "instType": "SPOT",
518
+ // "instId": "BTC-USDT",
519
+ // "last": "31500.1",
520
+ // "lastSz": "0.00001754",
521
+ // "askPx": "31500.1",
522
+ // "askSz": "0.00998144",
523
+ // "bidPx": "31500",
524
+ // "bidSz": "3.05652439",
525
+ // "open24h": "31697",
526
+ // "high24h": "32248",
527
+ // "low24h": "31165.6",
528
+ // "sodUtc0": "31385.5",
529
+ // "sodUtc8": "32134.9",
530
+ // "volCcy24h": "503403597.38138519",
531
+ // "vol24h": "15937.10781721",
532
+ // "ts": "1626526618762"
533
+ // }
534
+ // ]
535
+ // }
536
+ //
537
+ this.handleBidAsk(client, message);
538
+ const arg = this.safeValue(message, 'arg', {});
539
+ const marketId = this.safeString(arg, 'instId');
540
+ const market = this.safeMarket(marketId, undefined, '-');
541
+ const symbol = market['symbol'];
542
+ const channel = this.safeString(arg, 'channel');
543
+ const data = this.safeValue(message, 'data', []);
544
+ const newTickers = {};
545
+ for (let i = 0; i < data.length; i++) {
546
+ const ticker = this.parseTicker(data[i]);
547
+ this.tickers[symbol] = ticker;
548
+ newTickers[symbol] = ticker;
549
+ }
550
+ const messageHash = channel + '::' + symbol;
551
+ client.resolve(newTickers, messageHash);
552
+ }
553
+ /**
554
+ * @method
555
+ * @name okx#watchBidsAsks
556
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-tickers-channel
557
+ * @description watches best bid & ask for symbols
558
+ * @param {string[]} symbols unified symbol of the market to fetch the ticker for
559
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
560
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
561
+ */
562
+ async watchBidsAsks(symbols = undefined, params = {}) {
563
+ await this.loadMarkets();
564
+ symbols = this.marketSymbols(symbols, undefined, false);
565
+ let channel = undefined;
566
+ [channel, params] = this.handleOptionAndParams(params, 'watchBidsAsks', 'channel', 'tickers');
567
+ const url = this.getUrl(channel, 'public');
568
+ const messageHashes = [];
569
+ const args = [];
570
+ for (let i = 0; i < symbols.length; i++) {
571
+ const marketId = this.marketId(symbols[i]);
572
+ const arg = {
573
+ 'channel': channel,
574
+ 'instId': marketId,
575
+ };
576
+ args.push(this.extend(arg, params));
577
+ messageHashes.push('bidask::' + symbols[i]);
578
+ }
579
+ const request = {
580
+ 'op': 'subscribe',
581
+ 'args': args,
582
+ };
583
+ const newTickers = await this.watchMultiple(url, messageHashes, request, messageHashes);
584
+ if (this.newUpdates) {
585
+ const tickers = {};
586
+ tickers[newTickers['symbol']] = newTickers;
587
+ return tickers;
588
+ }
589
+ return this.filterByArray(this.bidsasks, 'symbol', symbols);
590
+ }
591
+ handleBidAsk(client, message) {
592
+ //
593
+ // {
594
+ // "arg": { channel: "tickers", instId: "BTC-USDT" },
595
+ // "data": [
596
+ // {
597
+ // "instType": "SPOT",
598
+ // "instId": "BTC-USDT",
599
+ // "last": "31500.1",
600
+ // "lastSz": "0.00001754",
601
+ // "askPx": "31500.1",
602
+ // "askSz": "0.00998144",
603
+ // "bidPx": "31500",
604
+ // "bidSz": "3.05652439",
605
+ // "open24h": "31697",
606
+ // "high24h": "32248",
607
+ // "low24h": "31165.6",
608
+ // "sodUtc0": "31385.5",
609
+ // "sodUtc8": "32134.9",
610
+ // "volCcy24h": "503403597.38138519",
611
+ // "vol24h": "15937.10781721",
612
+ // "ts": "1626526618762"
613
+ // }
614
+ // ]
615
+ // }
616
+ //
617
+ const data = this.safeList(message, 'data', []);
618
+ const ticker = this.safeDict(data, 0, {});
619
+ const parsedTicker = this.parseWsBidAsk(ticker);
620
+ const symbol = parsedTicker['symbol'];
621
+ this.bidsasks[symbol] = parsedTicker;
622
+ const messageHash = 'bidask::' + symbol;
623
+ client.resolve(parsedTicker, messageHash);
624
+ }
625
+ parseWsBidAsk(ticker, market = undefined) {
626
+ const marketId = this.safeString(ticker, 'instId');
627
+ market = this.safeMarket(marketId, market);
628
+ const symbol = this.safeString(market, 'symbol');
629
+ const timestamp = this.safeInteger(ticker, 'ts');
630
+ return this.safeTicker({
631
+ 'symbol': symbol,
632
+ 'timestamp': timestamp,
633
+ 'datetime': this.iso8601(timestamp),
634
+ 'ask': this.safeString(ticker, 'askPx'),
635
+ 'askVolume': this.safeString(ticker, 'askSz'),
636
+ 'bid': this.safeString(ticker, 'bidPx'),
637
+ 'bidVolume': this.safeString(ticker, 'bidSz'),
638
+ 'info': ticker,
639
+ }, market);
640
+ }
641
+ /**
642
+ * @method
643
+ * @name okx#watchLiquidationsForSymbols
644
+ * @description watch the public liquidations of a trading pair
645
+ * @see https://www.okx.com/docs-v5/en/#public-data-websocket-liquidation-orders-channel
646
+ * @param {string} symbols
647
+ * @param {int} [since] the earliest time in ms to fetch liquidations for
648
+ * @param {int} [limit] the maximum number of liquidation structures to retrieve
649
+ * @param {object} [params] exchange specific parameters for the okx api endpoint
650
+ * @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
651
+ */
652
+ async watchLiquidationsForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
653
+ await this.loadMarkets();
654
+ symbols = this.marketSymbols(symbols, undefined, true, true);
655
+ const messageHash = 'liquidations';
656
+ const messageHashes = [];
657
+ if (symbols !== undefined) {
658
+ for (let i = 0; i < symbols.length; i++) {
659
+ const symbol = symbols[i];
660
+ messageHashes.push(messageHash + '::' + symbol);
661
+ }
662
+ }
663
+ else {
664
+ messageHashes.push(messageHash);
665
+ }
666
+ const market = this.getMarketFromSymbols(symbols);
667
+ let type = undefined;
668
+ [type, params] = this.handleMarketTypeAndParams('watchliquidationsForSymbols', market, params);
669
+ const channel = 'liquidation-orders';
670
+ if (type === 'spot') {
671
+ type = 'SWAP';
672
+ }
673
+ else if (type === 'future') {
674
+ type = 'futures';
675
+ }
676
+ const uppercaseType = type.toUpperCase();
677
+ const request = {
678
+ 'op': 'subscribe',
679
+ 'args': [
680
+ {
681
+ 'channel': channel,
682
+ 'instType': uppercaseType,
683
+ },
684
+ ],
685
+ };
686
+ const url = this.getUrl(channel, 'public');
687
+ const newLiquidations = await this.watchMultiple(url, messageHashes, request, messageHashes);
688
+ if (this.newUpdates) {
689
+ return newLiquidations;
690
+ }
691
+ return this.filterBySymbolsSinceLimit(this.liquidations, symbols, since, limit, true);
692
+ }
693
+ handleLiquidation(client, message) {
694
+ //
695
+ // {
696
+ // "arg": {
697
+ // "channel": "liquidation-orders",
698
+ // "instType": "SWAP"
699
+ // },
700
+ // "data": [
701
+ // {
702
+ // "details": [
703
+ // {
704
+ // "bkLoss": "0",
705
+ // "bkPx": "0.007831",
706
+ // "ccy": "",
707
+ // "posSide": "short",
708
+ // "side": "buy",
709
+ // "sz": "13",
710
+ // "ts": "1692266434010"
711
+ // }
712
+ // ],
713
+ // "instFamily": "IOST-USDT",
714
+ // "instId": "IOST-USDT-SWAP",
715
+ // "instType": "SWAP",
716
+ // "uly": "IOST-USDT"
717
+ // }
718
+ // ]
719
+ // }
720
+ //
721
+ const rawLiquidations = this.safeList(message, 'data', []);
722
+ for (let i = 0; i < rawLiquidations.length; i++) {
723
+ const rawLiquidation = rawLiquidations[i];
724
+ const liquidation = this.parseWsLiquidation(rawLiquidation);
725
+ const symbol = this.safeString(liquidation, 'symbol');
726
+ let liquidations = this.safeValue(this.liquidations, symbol);
727
+ if (liquidations === undefined) {
728
+ const limit = this.safeInteger(this.options, 'liquidationsLimit', 1000);
729
+ liquidations = new ArrayCache(limit);
730
+ }
731
+ liquidations.append(liquidation);
732
+ this.liquidations[symbol] = liquidations;
733
+ client.resolve([liquidation], 'liquidations');
734
+ client.resolve([liquidation], 'liquidations::' + symbol);
735
+ }
736
+ }
737
+ /**
738
+ * @method
739
+ * @name okx#watchMyLiquidationsForSymbols
740
+ * @description watch the private liquidations of a trading pair
741
+ * @see https://www.okx.com/docs-v5/en/#trading-account-websocket-balance-and-position-channel
742
+ * @param {string[]} symbols
743
+ * @param {int} [since] the earliest time in ms to fetch liquidations for
744
+ * @param {int} [limit] the maximum number of liquidation structures to retrieve
745
+ * @param {object} [params] exchange specific parameters for the okx api endpoint
746
+ * @returns {object} an array of [liquidation structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure}
747
+ */
748
+ async watchMyLiquidationsForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
749
+ await this.loadMarkets();
750
+ const isTrigger = this.safeValue2(params, 'stop', 'trigger', false);
751
+ params = this.omit(params, ['stop', 'trigger']);
752
+ await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
753
+ symbols = this.marketSymbols(symbols, undefined, true, true);
754
+ const messageHash = 'myLiquidations';
755
+ const messageHashes = [];
756
+ if (symbols !== undefined) {
757
+ for (let i = 0; i < symbols.length; i++) {
758
+ const symbol = symbols[i];
759
+ messageHashes.push(messageHash + '::' + symbol);
760
+ }
761
+ }
762
+ else {
763
+ messageHashes.push(messageHash);
764
+ }
765
+ const channel = 'balance_and_position';
766
+ const request = {
767
+ 'op': 'subscribe',
768
+ 'args': [
769
+ {
770
+ 'channel': channel,
771
+ },
772
+ ],
773
+ };
774
+ const url = this.getUrl(channel, 'private');
775
+ const newLiquidations = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), messageHashes);
776
+ if (this.newUpdates) {
777
+ return newLiquidations;
778
+ }
779
+ return this.filterBySymbolsSinceLimit(this.liquidations, symbols, since, limit, true);
780
+ }
781
+ handleMyLiquidation(client, message) {
782
+ //
783
+ // {
784
+ // "arg": {
785
+ // "channel": "balance_and_position",
786
+ // "uid": "77982378738415879"
787
+ // },
788
+ // "data": [{
789
+ // "pTime": "1597026383085",
790
+ // "eventType": "snapshot",
791
+ // "balData": [{
792
+ // "ccy": "BTC",
793
+ // "cashBal": "1",
794
+ // "uTime": "1597026383085"
795
+ // }],
796
+ // "posData": [{
797
+ // "posId": "1111111111",
798
+ // "tradeId": "2",
799
+ // "instId": "BTC-USD-191018",
800
+ // "instType": "FUTURES",
801
+ // "mgnMode": "cross",
802
+ // "posSide": "long",
803
+ // "pos": "10",
804
+ // "ccy": "BTC",
805
+ // "posCcy": "",
806
+ // "avgPx": "3320",
807
+ // "uTIme": "1597026383085"
808
+ // }],
809
+ // "trades": [{
810
+ // "instId": "BTC-USD-191018",
811
+ // "tradeId": "2",
812
+ // }]
813
+ // }]
814
+ // }
815
+ //
816
+ const rawLiquidations = this.safeList(message, 'data', []);
817
+ for (let i = 0; i < rawLiquidations.length; i++) {
818
+ const rawLiquidation = rawLiquidations[i];
819
+ const eventType = this.safeString(rawLiquidation, 'eventType');
820
+ if (eventType !== 'liquidation') {
821
+ return;
822
+ }
823
+ const liquidation = this.parseWsMyLiquidation(rawLiquidation);
824
+ const symbol = this.safeString(liquidation, 'symbol');
825
+ let liquidations = this.safeValue(this.liquidations, symbol);
826
+ if (liquidations === undefined) {
827
+ const limit = this.safeInteger(this.options, 'myLiquidationsLimit', 1000);
828
+ liquidations = new ArrayCache(limit);
829
+ }
830
+ liquidations.append(liquidation);
831
+ this.liquidations[symbol] = liquidations;
832
+ client.resolve([liquidation], 'myLiquidations');
833
+ client.resolve([liquidation], 'myLiquidations::' + symbol);
834
+ }
835
+ }
836
+ parseWsMyLiquidation(liquidation, market = undefined) {
837
+ //
838
+ // {
839
+ // "pTime": "1597026383085",
840
+ // "eventType": "snapshot",
841
+ // "balData": [{
842
+ // "ccy": "BTC",
843
+ // "cashBal": "1",
844
+ // "uTime": "1597026383085"
845
+ // }],
846
+ // "posData": [{
847
+ // "posId": "1111111111",
848
+ // "tradeId": "2",
849
+ // "instId": "BTC-USD-191018",
850
+ // "instType": "FUTURES",
851
+ // "mgnMode": "cross",
852
+ // "posSide": "long",
853
+ // "pos": "10",
854
+ // "ccy": "BTC",
855
+ // "posCcy": "",
856
+ // "avgPx": "3320",
857
+ // "uTIme": "1597026383085"
858
+ // }],
859
+ // "trades": [{
860
+ // "instId": "BTC-USD-191018",
861
+ // "tradeId": "2",
862
+ // }]
863
+ // }
864
+ //
865
+ const posData = this.safeList(liquidation, 'posData', []);
866
+ const firstPosData = this.safeDict(posData, 0, {});
867
+ const marketId = this.safeString(firstPosData, 'instId');
868
+ market = this.safeMarket(marketId, market);
869
+ const timestamp = this.safeInteger(firstPosData, 'uTIme');
870
+ return this.safeLiquidation({
871
+ 'info': liquidation,
872
+ 'symbol': this.safeSymbol(marketId, market),
873
+ 'contracts': this.safeNumber(firstPosData, 'pos'),
874
+ 'contractSize': this.safeNumber(market, 'contractSize'),
875
+ 'price': this.safeNumber(liquidation, 'avgPx'),
876
+ 'baseValue': undefined,
877
+ 'quoteValue': undefined,
878
+ 'timestamp': timestamp,
879
+ 'datetime': this.iso8601(timestamp),
880
+ });
881
+ }
882
+ parseWsLiquidation(liquidation, market = undefined) {
883
+ //
884
+ // public liquidation
885
+ // {
886
+ // "details": [
887
+ // {
888
+ // "bkLoss": "0",
889
+ // "bkPx": "0.007831",
890
+ // "ccy": "",
891
+ // "posSide": "short",
892
+ // "side": "buy",
893
+ // "sz": "13",
894
+ // "ts": "1692266434010"
895
+ // }
896
+ // ],
897
+ // "instFamily": "IOST-USDT",
898
+ // "instId": "IOST-USDT-SWAP",
899
+ // "instType": "SWAP",
900
+ // "uly": "IOST-USDT"
901
+ // }
902
+ //
903
+ const details = this.safeList(liquidation, 'details', []);
904
+ const liquidationDetails = this.safeDict(details, 0, {});
905
+ const marketId = this.safeString(liquidation, 'instId');
906
+ market = this.safeMarket(marketId, market);
907
+ const timestamp = this.safeInteger(liquidationDetails, 'ts');
908
+ return this.safeLiquidation({
909
+ 'info': liquidation,
910
+ 'symbol': this.safeSymbol(marketId, market),
911
+ 'contracts': this.safeNumber(liquidationDetails, 'sz'),
912
+ 'contractSize': this.safeNumber(market, 'contractSize'),
913
+ 'price': this.safeNumber(liquidationDetails, 'bkPx'),
914
+ 'side': this.safeString(liquidationDetails, 'side'),
915
+ 'baseValue': undefined,
916
+ 'quoteValue': undefined,
917
+ 'timestamp': timestamp,
918
+ 'datetime': this.iso8601(timestamp),
919
+ });
920
+ }
921
+ /**
922
+ * @method
923
+ * @name okx#watchOHLCV
924
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
925
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
926
+ * @param {string} timeframe the length of time each candle represents
927
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
928
+ * @param {int} [limit] the maximum amount of candles to fetch
929
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
930
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
931
+ */
932
+ async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
933
+ await this.loadMarkets();
934
+ symbol = this.symbol(symbol);
935
+ const interval = this.safeString(this.timeframes, timeframe, timeframe);
936
+ const name = 'candle' + interval;
937
+ const ohlcv = await this.subscribe('public', name, name, symbol, params);
938
+ if (this.newUpdates) {
939
+ limit = ohlcv.getLimit(symbol, limit);
940
+ }
941
+ return this.filterBySinceLimit(ohlcv, since, limit, 0, true);
942
+ }
943
+ /**
944
+ * @method
945
+ * @name okx#unWatchOHLCV
946
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
947
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
948
+ * @param {string} timeframe the length of time each candle represents
949
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
950
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
951
+ */
952
+ async unWatchOHLCV(symbol, timeframe = '1m', params = {}) {
953
+ await this.loadMarkets();
954
+ return await this.unWatchOHLCVForSymbols([[symbol, timeframe]], params);
955
+ }
956
+ /**
957
+ * @method
958
+ * @name okx#watchOHLCVForSymbols
959
+ * @description watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
960
+ * @param {string[][]} symbolsAndTimeframes array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
961
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
962
+ * @param {int} [limit] the maximum amount of candles to fetch
963
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
964
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
965
+ */
966
+ async watchOHLCVForSymbols(symbolsAndTimeframes, since = undefined, limit = undefined, params = {}) {
967
+ const symbolsLength = symbolsAndTimeframes.length;
968
+ if (symbolsLength === 0 || !Array.isArray(symbolsAndTimeframes[0])) {
969
+ throw new ArgumentsRequired(this.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]");
970
+ }
971
+ await this.loadMarkets();
972
+ const topics = [];
973
+ const messageHashes = [];
974
+ for (let i = 0; i < symbolsAndTimeframes.length; i++) {
975
+ const symbolAndTimeframe = symbolsAndTimeframes[i];
976
+ const sym = symbolAndTimeframe[0];
977
+ const tf = symbolAndTimeframe[1];
978
+ const marketId = this.marketId(sym);
979
+ const interval = this.safeString(this.timeframes, tf, tf);
980
+ const channel = 'candle' + interval;
981
+ const topic = {
982
+ 'channel': channel,
983
+ 'instId': marketId,
984
+ };
985
+ topics.push(topic);
986
+ messageHashes.push('multi:' + channel + ':' + sym);
987
+ }
988
+ const request = {
989
+ 'op': 'subscribe',
990
+ 'args': topics,
991
+ };
992
+ const url = this.getUrl('candle', 'public');
993
+ const [symbol, timeframe, candles] = await this.watchMultiple(url, messageHashes, request, messageHashes);
994
+ if (this.newUpdates) {
995
+ limit = candles.getLimit(symbol, limit);
996
+ }
997
+ const filtered = this.filterBySinceLimit(candles, since, limit, 0, true);
998
+ return this.createOHLCVObject(symbol, timeframe, filtered);
999
+ }
1000
+ /**
1001
+ * @method
1002
+ * @name okx#unWatchOHLCVForSymbols
1003
+ * @description unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1004
+ * @param {string[][]} symbolsAndTimeframes array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
1005
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1006
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
1007
+ */
1008
+ async unWatchOHLCVForSymbols(symbolsAndTimeframes, params = {}) {
1009
+ const symbolsLength = symbolsAndTimeframes.length;
1010
+ if (symbolsLength === 0 || !Array.isArray(symbolsAndTimeframes[0])) {
1011
+ throw new ArgumentsRequired(this.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]");
1012
+ }
1013
+ await this.loadMarkets();
1014
+ const topics = [];
1015
+ const messageHashes = [];
1016
+ for (let i = 0; i < symbolsAndTimeframes.length; i++) {
1017
+ const symbolAndTimeframe = symbolsAndTimeframes[i];
1018
+ const sym = symbolAndTimeframe[0];
1019
+ const tf = symbolAndTimeframe[1];
1020
+ const marketId = this.marketId(sym);
1021
+ const interval = this.safeString(this.timeframes, tf, tf);
1022
+ const channel = 'candle' + interval;
1023
+ const topic = {
1024
+ 'channel': channel,
1025
+ 'instId': marketId,
1026
+ };
1027
+ topics.push(topic);
1028
+ messageHashes.push('unsubscribe:multi:' + channel + ':' + sym);
1029
+ }
1030
+ const request = {
1031
+ 'op': 'unsubscribe',
1032
+ 'args': topics,
1033
+ };
1034
+ const url = this.getUrl('candle', 'public');
1035
+ return await this.watchMultiple(url, messageHashes, request, messageHashes);
1036
+ }
1037
+ handleOHLCV(client, message) {
1038
+ //
1039
+ // {
1040
+ // "arg": { channel: "candle1m", instId: "BTC-USDT" },
1041
+ // "data": [
1042
+ // [
1043
+ // "1626690720000",
1044
+ // "31334",
1045
+ // "31334",
1046
+ // "31334",
1047
+ // "31334",
1048
+ // "0.0077",
1049
+ // "241.2718"
1050
+ // ]
1051
+ // ]
1052
+ // }
1053
+ //
1054
+ const arg = this.safeValue(message, 'arg', {});
1055
+ const channel = this.safeString(arg, 'channel');
1056
+ const data = this.safeValue(message, 'data', []);
1057
+ const marketId = this.safeString(arg, 'instId');
1058
+ const market = this.safeMarket(marketId);
1059
+ const symbol = market['symbol'];
1060
+ const interval = channel.replace('candle', '');
1061
+ // use a reverse lookup in a static map instead
1062
+ const timeframe = this.findTimeframe(interval);
1063
+ for (let i = 0; i < data.length; i++) {
1064
+ const parsed = this.parseOHLCV(data[i], market);
1065
+ this.ohlcvs[symbol] = this.safeValue(this.ohlcvs, symbol, {});
1066
+ let stored = this.safeValue(this.ohlcvs[symbol], timeframe);
1067
+ if (stored === undefined) {
1068
+ const limit = this.safeInteger(this.options, 'OHLCVLimit', 1000);
1069
+ stored = new ArrayCacheByTimestamp(limit);
1070
+ this.ohlcvs[symbol][timeframe] = stored;
1071
+ }
1072
+ stored.append(parsed);
1073
+ const messageHash = channel + ':' + market['id'];
1074
+ client.resolve(stored, messageHash);
1075
+ // for multiOHLCV we need special object, as opposed to other "multi"
1076
+ // methods, because OHLCV response item does not contain symbol
1077
+ // or timeframe, thus otherwise it would be unrecognizable
1078
+ const messageHashForMulti = 'multi:' + channel + ':' + symbol;
1079
+ client.resolve([symbol, timeframe, stored], messageHashForMulti);
1080
+ }
1081
+ }
1082
+ /**
1083
+ * @method
1084
+ * @name okx#watchOrderBook
1085
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
1086
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1087
+ * @param {string} symbol unified symbol of the market to fetch the order book for
1088
+ * @param {int} [limit] the maximum amount of order book entries to return
1089
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1090
+ * @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
1091
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1092
+ */
1093
+ async watchOrderBook(symbol, limit = undefined, params = {}) {
1094
+ //
1095
+ // bbo-tbt
1096
+ // 1. Newly added channel that sends tick-by-tick Level 1 data
1097
+ // 2. All API users can subscribe
1098
+ // 3. Public depth channel, verification not required
1099
+ //
1100
+ // books-l2-tbt
1101
+ // 1. Only users who're VIP5 and above can subscribe
1102
+ // 2. Identity verification required before subscription
1103
+ //
1104
+ // books50-l2-tbt
1105
+ // 1. Only users who're VIP4 and above can subscribe
1106
+ // 2. Identity verification required before subscription
1107
+ //
1108
+ // books
1109
+ // 1. All API users can subscribe
1110
+ // 2. Public depth channel, verification not required
1111
+ //
1112
+ // books5
1113
+ // 1. All API users can subscribe
1114
+ // 2. Public depth channel, verification not required
1115
+ // 3. Data feeds will be delivered every 100ms (vs. every 200ms now)
1116
+ //
1117
+ return await this.watchOrderBookForSymbols([symbol], limit, params);
1118
+ }
1119
+ /**
1120
+ * @method
1121
+ * @name okx#watchOrderBookForSymbols
1122
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
1123
+ * @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1124
+ * @param {string[]} symbols unified array of symbols
1125
+ * @param {int} [limit] 1,5, 400, 50 (l2-tbt, vip4+) or 40000 (vip5+) the maximum amount of order book entries to return
1126
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1127
+ * @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
1128
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1129
+ */
1130
+ async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
1131
+ await this.loadMarkets();
1132
+ symbols = this.marketSymbols(symbols);
1133
+ let depth = undefined;
1134
+ [depth, params] = this.handleOptionAndParams(params, 'watchOrderBook', 'depth', 'books');
1135
+ if (limit !== undefined) {
1136
+ if (limit === 1) {
1137
+ depth = 'bbo-tbt';
1138
+ }
1139
+ else if (limit > 1 && limit <= 5) {
1140
+ depth = 'books5';
1141
+ }
1142
+ else if (limit === 50) {
1143
+ depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
1144
+ }
1145
+ else if (limit === 400) {
1146
+ depth = 'books';
1147
+ }
1148
+ }
1149
+ if ((depth === 'books-l2-tbt') || (depth === 'books50-l2-tbt')) {
1150
+ if (!this.checkRequiredCredentials(false)) {
1151
+ throw new AuthenticationError(this.id + ' watchOrderBook/watchOrderBookForSymbols requires authentication for this depth. Add credentials or change the depth option to books or books5');
1152
+ }
1153
+ await this.authenticate({ 'access': 'public' });
1154
+ }
1155
+ const topics = [];
1156
+ const messageHashes = [];
1157
+ for (let i = 0; i < symbols.length; i++) {
1158
+ const symbol = symbols[i];
1159
+ messageHashes.push(depth + ':' + symbol);
1160
+ const marketId = this.marketId(symbol);
1161
+ const topic = {
1162
+ 'channel': depth,
1163
+ 'instId': marketId,
1164
+ };
1165
+ topics.push(topic);
1166
+ }
1167
+ const request = {
1168
+ 'op': 'subscribe',
1169
+ 'args': topics,
1170
+ };
1171
+ const url = this.getUrl(depth, 'public');
1172
+ const orderbook = await this.watchMultiple(url, messageHashes, request, messageHashes);
1173
+ return orderbook.limit();
1174
+ }
1175
+ /**
1176
+ * @method
1177
+ * @name okx#unWatchOrderBookForSymbols
1178
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
1179
+ * @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1180
+ * @param {string[]} symbols unified array of symbols
1181
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1182
+ * @param {int} [params.limit] the maximum amount of order book entries to return
1183
+ * @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
1184
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1185
+ */
1186
+ async unWatchOrderBookForSymbols(symbols, params = {}) {
1187
+ await this.loadMarkets();
1188
+ symbols = this.marketSymbols(symbols, undefined, false);
1189
+ let depth = undefined;
1190
+ [depth, params] = this.handleOptionAndParams(params, 'watchOrderBook', 'depth', 'books');
1191
+ const limit = this.safeInteger(params, 'limit');
1192
+ if (limit !== undefined) {
1193
+ if (limit === 1) {
1194
+ depth = 'bbo-tbt';
1195
+ }
1196
+ else if (limit > 1 && limit <= 5) {
1197
+ depth = 'books5';
1198
+ }
1199
+ else if (limit === 50) {
1200
+ depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
1201
+ }
1202
+ else if (limit === 400) {
1203
+ depth = 'books';
1204
+ }
1205
+ }
1206
+ const topics = [];
1207
+ const subMessageHashes = [];
1208
+ const messageHashes = [];
1209
+ for (let i = 0; i < symbols.length; i++) {
1210
+ const symbol = symbols[i];
1211
+ subMessageHashes.push(depth + ':' + symbol);
1212
+ messageHashes.push('unsubscribe:orderbook:' + symbol);
1213
+ const marketId = this.marketId(symbol);
1214
+ const topic = {
1215
+ 'channel': depth,
1216
+ 'instId': marketId,
1217
+ };
1218
+ topics.push(topic);
1219
+ }
1220
+ const request = {
1221
+ 'op': 'unsubscribe',
1222
+ 'args': topics,
1223
+ };
1224
+ const url = this.getUrl(depth, 'public');
1225
+ return await this.watchMultiple(url, messageHashes, request, messageHashes);
1226
+ }
1227
+ /**
1228
+ * @method
1229
+ * @name okx#unWatchOrderBook
1230
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-market-data-ws-order-book-channel
1231
+ * @description unWatches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1232
+ * @param {string} symbol unified array of symbols
1233
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1234
+ * @param {int} [params.limit] the maximum amount of order book entries to return
1235
+ * @param {string} [params.depth] okx order book depth, can be books, books5, books-l2-tbt, books50-l2-tbt, bbo-tbt
1236
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1237
+ */
1238
+ async unWatchOrderBook(symbol, params = {}) {
1239
+ return await this.unWatchOrderBookForSymbols([symbol], params);
1240
+ }
1241
+ handleDelta(bookside, delta) {
1242
+ //
1243
+ // [
1244
+ // "31685", // price
1245
+ // "0.78069158", // amount
1246
+ // "0", // liquidated orders
1247
+ // "17" // orders
1248
+ // ]
1249
+ //
1250
+ const price = this.safeFloat(delta, 0);
1251
+ const amount = this.safeFloat(delta, 1);
1252
+ bookside.store(price, amount);
1253
+ }
1254
+ handleDeltas(bookside, deltas) {
1255
+ for (let i = 0; i < deltas.length; i++) {
1256
+ this.handleDelta(bookside, deltas[i]);
1257
+ }
1258
+ }
1259
+ handleOrderBookMessage(client, message, orderbook, messageHash, market = undefined) {
1260
+ //
1261
+ // {
1262
+ // "asks": [
1263
+ // [ '31738.3', '0.05973179', "0", "3" ],
1264
+ // [ '31738.5', '0.11035404', "0", "2" ],
1265
+ // [ '31739.6', '0.01', "0", "1" ],
1266
+ // ],
1267
+ // "bids": [
1268
+ // [ '31738.2', '0.67557666', "0", "9" ],
1269
+ // [ '31738', '0.02466947', "0", "2" ],
1270
+ // [ '31736.3', '0.01705046', "0", "2" ],
1271
+ // ],
1272
+ // "instId": "BTC-USDT",
1273
+ // "ts": "1626537446491"
1274
+ // "checksum": -855196043,
1275
+ // "prevSeqId": 123456,
1276
+ // "seqId": 123457
1277
+ // }
1278
+ //
1279
+ const asks = this.safeValue(message, 'asks', []);
1280
+ const bids = this.safeValue(message, 'bids', []);
1281
+ const storedAsks = orderbook['asks'];
1282
+ const storedBids = orderbook['bids'];
1283
+ this.handleDeltas(storedAsks, asks);
1284
+ this.handleDeltas(storedBids, bids);
1285
+ const marketId = this.safeString(message, 'instId');
1286
+ const symbol = this.safeSymbol(marketId, market);
1287
+ const checksum = this.handleOption('watchOrderBook', 'checksum', true);
1288
+ const seqId = this.safeInteger(message, 'seqId');
1289
+ if (checksum) {
1290
+ const prevSeqId = this.safeInteger(message, 'prevSeqId');
1291
+ const nonce = orderbook['nonce'];
1292
+ const asksLength = storedAsks.length;
1293
+ const bidsLength = storedBids.length;
1294
+ const payloadArray = [];
1295
+ for (let i = 0; i < 25; i++) {
1296
+ if (i < bidsLength) {
1297
+ payloadArray.push(this.numberToString(storedBids[i][0]));
1298
+ payloadArray.push(this.numberToString(storedBids[i][1]));
1299
+ }
1300
+ if (i < asksLength) {
1301
+ payloadArray.push(this.numberToString(storedAsks[i][0]));
1302
+ payloadArray.push(this.numberToString(storedAsks[i][1]));
1303
+ }
1304
+ }
1305
+ const payload = payloadArray.join(':');
1306
+ const responseChecksum = this.safeInteger(message, 'checksum');
1307
+ const localChecksum = this.crc32(payload, true);
1308
+ let error = undefined;
1309
+ if (prevSeqId !== -1 && nonce !== prevSeqId) {
1310
+ error = new InvalidNonce(this.id + ' watchOrderBook received invalid nonce');
1311
+ }
1312
+ if (responseChecksum !== localChecksum) {
1313
+ error = new ChecksumError(this.id + ' ' + this.orderbookChecksumMessage(symbol));
1314
+ }
1315
+ if (error !== undefined) {
1316
+ delete client.subscriptions[messageHash];
1317
+ delete this.orderbooks[symbol];
1318
+ client.reject(error, messageHash);
1319
+ }
1320
+ }
1321
+ const timestamp = this.safeInteger(message, 'ts');
1322
+ orderbook['nonce'] = seqId;
1323
+ orderbook['timestamp'] = timestamp;
1324
+ orderbook['datetime'] = this.iso8601(timestamp);
1325
+ return orderbook;
1326
+ }
1327
+ handleOrderBook(client, message) {
1328
+ //
1329
+ // snapshot
1330
+ //
1331
+ // {
1332
+ // "arg": { channel: 'books-l2-tbt', instId: "BTC-USDT" },
1333
+ // "action": "snapshot",
1334
+ // "data": [
1335
+ // {
1336
+ // "asks": [
1337
+ // [ '31685', '0.78069158', "0", "17" ],
1338
+ // [ '31685.1', '0.0001', "0", "1" ],
1339
+ // [ '31685.6', '0.04543165', "0", "1" ],
1340
+ // ],
1341
+ // "bids": [
1342
+ // [ '31684.9', '0.01', "0", "1" ],
1343
+ // [ '31682.9', '0.0001', "0", "1" ],
1344
+ // [ '31680.7', '0.01', "0", "1" ],
1345
+ // ],
1346
+ // "ts": "1626532416403",
1347
+ // "checksum": -1023440116
1348
+ // }
1349
+ // ]
1350
+ // }
1351
+ //
1352
+ // update
1353
+ //
1354
+ // {
1355
+ // "arg": { channel: 'books-l2-tbt', instId: "BTC-USDT" },
1356
+ // "action": "update",
1357
+ // "data": [
1358
+ // {
1359
+ // "asks": [
1360
+ // [ '31657.7', '0', "0", "0" ],
1361
+ // [ '31659.7', '0.01', "0", "1" ],
1362
+ // [ '31987.3', '0.01', "0", "1" ]
1363
+ // ],
1364
+ // "bids": [
1365
+ // [ '31642.9', '0.50296385', "0", "4" ],
1366
+ // [ '31639.9', '0', "0", "0" ],
1367
+ // [ '31638.7', '0.01', "0", "1" ],
1368
+ // ],
1369
+ // "ts": "1626535709008",
1370
+ // "checksum": 830931827
1371
+ // }
1372
+ // ]
1373
+ // }
1374
+ //
1375
+ // books5
1376
+ //
1377
+ // {
1378
+ // "arg": { channel: "books5", instId: "BTC-USDT" },
1379
+ // "data": [
1380
+ // {
1381
+ // "asks": [
1382
+ // [ '31738.3', '0.05973179', "0", "3" ],
1383
+ // [ '31738.5', '0.11035404', "0", "2" ],
1384
+ // [ '31739.6', '0.01', "0", "1" ],
1385
+ // ],
1386
+ // "bids": [
1387
+ // [ '31738.2', '0.67557666', "0", "9" ],
1388
+ // [ '31738', '0.02466947', "0", "2" ],
1389
+ // [ '31736.3', '0.01705046', "0", "2" ],
1390
+ // ],
1391
+ // "instId": "BTC-USDT",
1392
+ // "ts": "1626537446491"
1393
+ // }
1394
+ // ]
1395
+ // }
1396
+ //
1397
+ // bbo-tbt
1398
+ //
1399
+ // {
1400
+ // "arg":{
1401
+ // "channel":"bbo-tbt",
1402
+ // "instId":"BTC-USDT"
1403
+ // },
1404
+ // "data":[
1405
+ // {
1406
+ // "asks":[["36232.2","1.8826134","0","17"]],
1407
+ // "bids":[["36232.1","0.00572212","0","2"]],
1408
+ // "ts":"1651826598363"
1409
+ // }
1410
+ // ]
1411
+ // }
1412
+ //
1413
+ const arg = this.safeDict(message, 'arg', {});
1414
+ const channel = this.safeString(arg, 'channel');
1415
+ const action = this.safeString(message, 'action');
1416
+ const data = this.safeList(message, 'data', []);
1417
+ const marketId = this.safeString(arg, 'instId');
1418
+ const market = this.safeMarket(marketId);
1419
+ const symbol = market['symbol'];
1420
+ const depths = {
1421
+ 'bbo-tbt': 1,
1422
+ 'books': 400,
1423
+ 'books5': 5,
1424
+ 'books-l2-tbt': 400,
1425
+ 'books50-l2-tbt': 50,
1426
+ };
1427
+ const limit = this.safeInteger(depths, channel);
1428
+ const messageHash = channel + ':' + symbol;
1429
+ if (action === 'snapshot') {
1430
+ for (let i = 0; i < data.length; i++) {
1431
+ const update = data[i];
1432
+ const orderbook = this.orderBook({}, limit);
1433
+ this.orderbooks[symbol] = orderbook;
1434
+ orderbook['symbol'] = symbol;
1435
+ this.handleOrderBookMessage(client, update, orderbook, messageHash);
1436
+ client.resolve(orderbook, messageHash);
1437
+ }
1438
+ }
1439
+ else if (action === 'update') {
1440
+ if (symbol in this.orderbooks) {
1441
+ const orderbook = this.orderbooks[symbol];
1442
+ for (let i = 0; i < data.length; i++) {
1443
+ const update = data[i];
1444
+ this.handleOrderBookMessage(client, update, orderbook, messageHash, market);
1445
+ client.resolve(orderbook, messageHash);
1446
+ }
1447
+ }
1448
+ }
1449
+ else if ((channel === 'books5') || (channel === 'bbo-tbt')) {
1450
+ if (!(symbol in this.orderbooks)) {
1451
+ this.orderbooks[symbol] = this.orderBook({}, limit);
1452
+ }
1453
+ const orderbook = this.orderbooks[symbol];
1454
+ for (let i = 0; i < data.length; i++) {
1455
+ const update = data[i];
1456
+ const timestamp = this.safeInteger(update, 'ts');
1457
+ const snapshot = this.parseOrderBook(update, symbol, timestamp, 'bids', 'asks', 0, 1);
1458
+ orderbook.reset(snapshot);
1459
+ client.resolve(orderbook, messageHash);
1460
+ }
1461
+ }
1462
+ return message;
1463
+ }
1464
+ async authenticate(params = {}) {
1465
+ this.checkRequiredCredentials();
1466
+ const access = this.safeString(params, 'access', 'private');
1467
+ params = this.omit(params, ['access']);
1468
+ const url = this.getUrl('users', access);
1469
+ const messageHash = 'authenticated';
1470
+ const client = this.client(url);
1471
+ const future = client.future(messageHash);
1472
+ const authenticated = this.safeValue(client.subscriptions, messageHash);
1473
+ if (authenticated === undefined) {
1474
+ const timestamp = this.seconds().toString();
1475
+ const method = 'GET';
1476
+ const path = '/users/self/verify';
1477
+ const auth = timestamp + method + path;
1478
+ const signature = this.hmac(this.encode(auth), this.encode(this.secret), sha256, 'base64');
1479
+ const operation = 'login';
1480
+ const request = {
1481
+ 'op': operation,
1482
+ 'args': [
1483
+ {
1484
+ 'apiKey': this.apiKey,
1485
+ 'passphrase': this.password,
1486
+ 'timestamp': timestamp,
1487
+ 'sign': signature,
1488
+ },
1489
+ ],
1490
+ };
1491
+ // Only add params['access'] to prevent sending custom parameters, such as extraParams.
1492
+ if ('access' in params) {
1493
+ request['access'] = params['access'];
1494
+ }
1495
+ this.watch(url, messageHash, request, messageHash);
1496
+ }
1497
+ return await future;
1498
+ }
1499
+ /**
1500
+ * @method
1501
+ * @name okx#watchBalance
1502
+ * @description watch balance and get the amount of funds available for trading or funds locked in orders
1503
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1504
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
1505
+ */
1506
+ async watchBalance(params = {}) {
1507
+ await this.loadMarkets();
1508
+ await this.authenticate();
1509
+ return await this.subscribe('private', 'account', 'account', undefined, params);
1510
+ }
1511
+ handleBalanceAndPosition(client, message) {
1512
+ this.handleMyLiquidation(client, message);
1513
+ }
1514
+ handleBalance(client, message) {
1515
+ //
1516
+ // {
1517
+ // "arg": { channel: "account" },
1518
+ // "data": [
1519
+ // {
1520
+ // "adjEq": '',
1521
+ // "details": [
1522
+ // {
1523
+ // "availBal": '',
1524
+ // "availEq": "8.21009913",
1525
+ // "cashBal": "8.21009913",
1526
+ // "ccy": "USDT",
1527
+ // "coinUsdPrice": "0.99994",
1528
+ // "crossLiab": '',
1529
+ // "disEq": "8.2096065240522",
1530
+ // "eq": "8.21009913",
1531
+ // "eqUsd": "8.2096065240522",
1532
+ // "frozenBal": "0",
1533
+ // "interest": '',
1534
+ // "isoEq": "0",
1535
+ // "isoLiab": '',
1536
+ // "liab": '',
1537
+ // "maxLoan": '',
1538
+ // "mgnRatio": '',
1539
+ // "notionalLever": "0",
1540
+ // "ordFrozen": "0",
1541
+ // "twap": "0",
1542
+ // "uTime": "1621927314996",
1543
+ // "upl": "0"
1544
+ // },
1545
+ // ],
1546
+ // "imr": '',
1547
+ // "isoEq": "0",
1548
+ // "mgnRatio": '',
1549
+ // "mmr": '',
1550
+ // "notionalUsd": '',
1551
+ // "ordFroz": '',
1552
+ // "totalEq": "22.1930992296832",
1553
+ // "uTime": "1626692120916"
1554
+ // }
1555
+ // ]
1556
+ // }
1557
+ //
1558
+ const arg = this.safeValue(message, 'arg', {});
1559
+ const channel = this.safeString(arg, 'channel');
1560
+ const type = 'spot';
1561
+ const balance = this.parseTradingBalance(message);
1562
+ const oldBalance = this.safeValue(this.balance, type, {});
1563
+ const newBalance = this.deepExtend(oldBalance, balance);
1564
+ this.balance[type] = this.safeBalance(newBalance);
1565
+ client.resolve(this.balance[type], channel);
1566
+ }
1567
+ orderToTrade(order, market = undefined) {
1568
+ const info = this.safeValue(order, 'info', {});
1569
+ const timestamp = this.safeInteger(info, 'fillTime');
1570
+ const feeMarketId = this.safeString(info, 'fillFeeCcy');
1571
+ const isTaker = this.safeString(info, 'execType', '') === 'T';
1572
+ return this.safeTrade({
1573
+ 'info': info,
1574
+ 'timestamp': timestamp,
1575
+ 'datetime': this.iso8601(timestamp),
1576
+ 'symbol': this.safeString(order, 'symbol'),
1577
+ 'id': this.safeString(info, 'tradeId'),
1578
+ 'order': this.safeString(order, 'id'),
1579
+ 'type': this.safeString(order, 'type'),
1580
+ 'takerOrMaker': (isTaker) ? 'taker' : 'maker',
1581
+ 'side': this.safeString(order, 'side'),
1582
+ 'price': this.safeNumber(info, 'fillPx'),
1583
+ 'amount': this.safeNumber(info, 'fillSz'),
1584
+ 'cost': this.safeNumber(order, 'cost'),
1585
+ 'fee': {
1586
+ 'cost': this.safeNumber(info, 'fillFee'),
1587
+ 'currency': this.safeCurrencyCode(feeMarketId),
1588
+ },
1589
+ }, market);
1590
+ }
1591
+ /**
1592
+ * @method
1593
+ * @name okx#watchMyTrades
1594
+ * @description watches information on multiple trades made by the user
1595
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-order-channel
1596
+ * @param {string} [symbol] unified market symbol of the market trades were made in
1597
+ * @param {int} [since] the earliest time in ms to fetch trades for
1598
+ * @param {int} [limit] the maximum number of trade structures to retrieve
1599
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1600
+ * @param {bool} [params.trigger] true if fetching trigger or conditional trades
1601
+ * @param {string} [params.type] 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
1602
+ * @param {string} [params.marginMode] 'cross' or 'isolated', for automatically setting the type to spot margin
1603
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1604
+ */
1605
+ async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1606
+ // By default, receive order updates from any instrument type
1607
+ let type = undefined;
1608
+ [type, params] = this.handleOptionAndParams(params, 'watchMyTrades', 'type', 'ANY');
1609
+ const isTrigger = this.safeBool2(params, 'trigger', 'stop', false);
1610
+ params = this.omit(params, ['trigger', 'stop']);
1611
+ await this.loadMarkets();
1612
+ await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
1613
+ const channel = isTrigger ? 'orders-algo' : 'orders';
1614
+ let messageHash = channel + '::myTrades';
1615
+ let market = undefined;
1616
+ if (symbol !== undefined) {
1617
+ market = this.market(symbol);
1618
+ symbol = market['symbol'];
1619
+ type = market['type'];
1620
+ messageHash = messageHash + '::' + symbol;
1621
+ }
1622
+ if (type === 'future') {
1623
+ type = 'futures';
1624
+ }
1625
+ let uppercaseType = type.toUpperCase();
1626
+ let marginMode = undefined;
1627
+ [marginMode, params] = this.handleMarginModeAndParams('watchMyTrades', params);
1628
+ if (uppercaseType === 'SPOT') {
1629
+ if (marginMode !== undefined) {
1630
+ uppercaseType = 'MARGIN';
1631
+ }
1632
+ }
1633
+ const request = {
1634
+ 'instType': uppercaseType,
1635
+ };
1636
+ const orders = await this.subscribe('private', messageHash, channel, undefined, this.extend(request, params));
1637
+ if (this.newUpdates) {
1638
+ limit = orders.getLimit(symbol, limit);
1639
+ }
1640
+ return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
1641
+ }
1642
+ /**
1643
+ * @method
1644
+ * @name okx#watchPositions
1645
+ * @see https://www.okx.com/docs-v5/en/#trading-account-websocket-positions-channel
1646
+ * @description watch all open positions
1647
+ * @param {string[]|undefined} symbols list of unified market symbols
1648
+ * @param since
1649
+ * @param limit
1650
+ * @param {object} params extra parameters specific to the exchange API endpoint
1651
+ * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/en/latest/manual.html#position-structure}
1652
+ */
1653
+ async watchPositions(symbols = undefined, since = undefined, limit = undefined, params = {}) {
1654
+ await this.loadMarkets();
1655
+ await this.authenticate(params);
1656
+ symbols = this.marketSymbols(symbols);
1657
+ const request = {
1658
+ 'instType': 'ANY',
1659
+ };
1660
+ const channel = 'positions';
1661
+ let newPositions = undefined;
1662
+ if (symbols === undefined) {
1663
+ const arg = {
1664
+ 'channel': 'positions',
1665
+ 'instType': 'ANY',
1666
+ };
1667
+ const args = [this.extend(arg, params)];
1668
+ const nonSymbolRequest = {
1669
+ 'op': 'subscribe',
1670
+ 'args': args,
1671
+ };
1672
+ const url = this.getUrl(channel, 'private');
1673
+ newPositions = await this.watch(url, channel, nonSymbolRequest, channel);
1674
+ }
1675
+ else {
1676
+ newPositions = await this.subscribeMultiple('private', channel, symbols, this.extend(request, params));
1677
+ }
1678
+ if (this.newUpdates) {
1679
+ return newPositions;
1680
+ }
1681
+ return this.filterBySymbolsSinceLimit(this.positions, symbols, since, limit, true);
1682
+ }
1683
+ handlePositions(client, message) {
1684
+ //
1685
+ // {
1686
+ // arg: {
1687
+ // channel: 'positions',
1688
+ // instType: 'ANY',
1689
+ // instId: 'XRP-USDT-SWAP',
1690
+ // uid: '464737184507959869'
1691
+ // },
1692
+ // data: [{
1693
+ // adl: '1',
1694
+ // availPos: '',
1695
+ // avgPx: '0.52668',
1696
+ // baseBal: '',
1697
+ // baseBorrowed: '',
1698
+ // baseInterest: '',
1699
+ // bizRefId: '',
1700
+ // bizRefType: '',
1701
+ // cTime: '1693151444408',
1702
+ // ccy: 'USDT',
1703
+ // closeOrderAlgo: [],
1704
+ // deltaBS: '',
1705
+ // deltaPA: '',
1706
+ // gammaBS: '',
1707
+ // gammaPA: '',
1708
+ // idxPx: '0.52683',
1709
+ // imr: '17.564000000000004',
1710
+ // instId: 'XRP-USDT-SWAP',
1711
+ // instType: 'SWAP',
1712
+ // interest: '',
1713
+ // last: '0.52691',
1714
+ // lever: '3',
1715
+ // liab: '',
1716
+ // liabCcy: '',
1717
+ // liqPx: '0.3287514731020614',
1718
+ // margin: '',
1719
+ // markPx: '0.52692',
1720
+ // mgnMode: 'cross',
1721
+ // mgnRatio: '69.00363001456147',
1722
+ // mmr: '0.26346',
1723
+ // notionalUsd: '52.68620388000001',
1724
+ // optVal: '',
1725
+ // pTime: '1693151906023',
1726
+ // pendingCloseOrdLiabVal: '',
1727
+ // pos: '1',
1728
+ // posCcy: '',
1729
+ // posId: '616057041198907393',
1730
+ // posSide: 'net',
1731
+ // quoteBal: '',
1732
+ // quoteBorrowed: '',
1733
+ // quoteInterest: '',
1734
+ // spotInUseAmt: '',
1735
+ // spotInUseCcy: '',
1736
+ // thetaBS: '',
1737
+ // thetaPA: '',
1738
+ // tradeId: '138745402',
1739
+ // uTime: '1693151444408',
1740
+ // upl: '0.0240000000000018',
1741
+ // uplLastPx: '0.0229999999999952',
1742
+ // uplRatio: '0.0013670539986328',
1743
+ // uplRatioLastPx: '0.001310093415356',
1744
+ // usdPx: '',
1745
+ // vegaBS: '',
1746
+ // vegaPA: ''
1747
+ // }]
1748
+ // }
1749
+ //
1750
+ const arg = this.safeValue(message, 'arg', {});
1751
+ const marketId = this.safeString(arg, 'instId');
1752
+ const market = this.safeMarket(marketId, undefined, '-');
1753
+ const symbol = market['symbol'];
1754
+ const channel = this.safeString(arg, 'channel', '');
1755
+ const data = this.safeValue(message, 'data', []);
1756
+ if (this.positions === undefined) {
1757
+ this.positions = new ArrayCacheBySymbolBySide();
1758
+ }
1759
+ const cache = this.positions;
1760
+ const newPositions = [];
1761
+ for (let i = 0; i < data.length; i++) {
1762
+ const rawPosition = data[i];
1763
+ const position = this.parsePosition(rawPosition);
1764
+ if (position['contracts'] === 0) {
1765
+ position['side'] = 'long';
1766
+ const shortPosition = this.clone(position);
1767
+ shortPosition['side'] = 'short';
1768
+ cache.append(shortPosition);
1769
+ newPositions.push(shortPosition);
1770
+ }
1771
+ newPositions.push(position);
1772
+ cache.append(position);
1773
+ }
1774
+ let messageHash = channel;
1775
+ if (symbol !== undefined) {
1776
+ messageHash = channel + '::' + symbol;
1777
+ }
1778
+ client.resolve(newPositions, messageHash);
1779
+ }
1780
+ /**
1781
+ * @method
1782
+ * @name okx#watchOrders
1783
+ * @description watches information on multiple orders made by the user
1784
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-order-channel
1785
+ * @param {string} [symbol] unified market symbol of the market the orders were made in
1786
+ * @param {int} [since] the earliest time in ms to fetch orders for
1787
+ * @param {int} [limit] the maximum number of order structures to retrieve
1788
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1789
+ * @param {bool} [params.trigger] true if fetching trigger or conditional orders
1790
+ * @param {string} [params.type] 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
1791
+ * @param {string} [params.marginMode] 'cross' or 'isolated', for automatically setting the type to spot margin
1792
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1793
+ */
1794
+ async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1795
+ let type = undefined;
1796
+ // By default, receive order updates from any instrument type
1797
+ [type, params] = this.handleOptionAndParams(params, 'watchOrders', 'type', 'ANY');
1798
+ const isTrigger = this.safeValue2(params, 'stop', 'trigger', false);
1799
+ params = this.omit(params, ['stop', 'trigger']);
1800
+ await this.loadMarkets();
1801
+ await this.authenticate({ 'access': isTrigger ? 'business' : 'private' });
1802
+ let market = undefined;
1803
+ if (symbol !== undefined) {
1804
+ market = this.market(symbol);
1805
+ symbol = market['symbol'];
1806
+ type = market['type'];
1807
+ }
1808
+ if (type === 'future') {
1809
+ type = 'futures';
1810
+ }
1811
+ let uppercaseType = type.toUpperCase();
1812
+ let marginMode = undefined;
1813
+ [marginMode, params] = this.handleMarginModeAndParams('watchOrders', params);
1814
+ if (uppercaseType === 'SPOT') {
1815
+ if (marginMode !== undefined) {
1816
+ uppercaseType = 'MARGIN';
1817
+ }
1818
+ }
1819
+ const request = {
1820
+ 'instType': uppercaseType,
1821
+ };
1822
+ const channel = isTrigger ? 'orders-algo' : 'orders';
1823
+ const orders = await this.subscribe('private', channel, channel, symbol, this.extend(request, params));
1824
+ if (this.newUpdates) {
1825
+ limit = orders.getLimit(symbol, limit);
1826
+ }
1827
+ return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
1828
+ }
1829
+ handleOrders(client, message, subscription = undefined) {
1830
+ //
1831
+ // {
1832
+ // "arg":{
1833
+ // "channel":"orders",
1834
+ // "instType":"SPOT"
1835
+ // },
1836
+ // "data":[
1837
+ // {
1838
+ // "accFillSz":"0",
1839
+ // "amendResult":"",
1840
+ // "avgPx":"",
1841
+ // "cTime":"1634548275191",
1842
+ // "category":"normal",
1843
+ // "ccy":"",
1844
+ // "clOrdId":"e847386590ce4dBC330547db94a08ba0",
1845
+ // "code":"0",
1846
+ // "execType":"",
1847
+ // "fee":"0",
1848
+ // "feeCcy":"USDT",
1849
+ // "fillFee":"0",
1850
+ // "fillFeeCcy":"",
1851
+ // "fillNotionalUsd":"",
1852
+ // "fillPx":"",
1853
+ // "fillSz":"0",
1854
+ // "fillTime":"",
1855
+ // "instId":"ETH-USDT",
1856
+ // "instType":"SPOT",
1857
+ // "lever":"",
1858
+ // "msg":"",
1859
+ // "notionalUsd":"451.4516256",
1860
+ // "ordId":"370257534141235201",
1861
+ // "ordType":"limit",
1862
+ // "pnl":"0",
1863
+ // "posSide":"",
1864
+ // "px":"60000",
1865
+ // "rebate":"0",
1866
+ // "rebateCcy":"ETH",
1867
+ // "reqId":"",
1868
+ // "side":"sell",
1869
+ // "slOrdPx":"",
1870
+ // "slTriggerPx":"",
1871
+ // "state":"live",
1872
+ // "sz":"0.007526",
1873
+ // "tag":"",
1874
+ // "tdMode":"cash",
1875
+ // "tgtCcy":"",
1876
+ // "tpOrdPx":"",
1877
+ // "tpTriggerPx":"",
1878
+ // "tradeId":"",
1879
+ // "uTime":"1634548275191"
1880
+ // }
1881
+ // ]
1882
+ // }
1883
+ //
1884
+ this.handleMyTrades(client, message);
1885
+ const arg = this.safeValue(message, 'arg', {});
1886
+ const channel = this.safeString(arg, 'channel');
1887
+ const orders = this.safeValue(message, 'data', []);
1888
+ const ordersLength = orders.length;
1889
+ if (ordersLength > 0) {
1890
+ const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
1891
+ if (this.orders === undefined) {
1892
+ this.orders = new ArrayCacheBySymbolById(limit);
1893
+ this.triggerOrders = new ArrayCacheBySymbolById(limit);
1894
+ }
1895
+ const stored = (channel === 'orders-algo') ? this.triggerOrders : this.orders;
1896
+ const marketIds = [];
1897
+ const parsed = this.parseOrders(orders);
1898
+ for (let i = 0; i < parsed.length; i++) {
1899
+ const order = parsed[i];
1900
+ stored.append(order);
1901
+ const symbol = order['symbol'];
1902
+ const market = this.market(symbol);
1903
+ marketIds.push(market['id']);
1904
+ }
1905
+ client.resolve(stored, channel);
1906
+ for (let i = 0; i < marketIds.length; i++) {
1907
+ const messageHash = channel + ':' + marketIds[i];
1908
+ client.resolve(stored, messageHash);
1909
+ }
1910
+ }
1911
+ }
1912
+ handleMyTrades(client, message) {
1913
+ //
1914
+ // {
1915
+ // "arg":{
1916
+ // "channel":"orders",
1917
+ // "instType":"SPOT"
1918
+ // },
1919
+ // "data":[
1920
+ // {
1921
+ // "accFillSz":"0",
1922
+ // "amendResult":"",
1923
+ // "avgPx":"",
1924
+ // "cTime":"1634548275191",
1925
+ // "category":"normal",
1926
+ // "ccy":"",
1927
+ // "clOrdId":"e847386590ce4dBC330547db94a08ba0",
1928
+ // "code":"0",
1929
+ // "execType":"",
1930
+ // "fee":"0",
1931
+ // "feeCcy":"USDT",
1932
+ // "fillFee":"0",
1933
+ // "fillFeeCcy":"",
1934
+ // "fillNotionalUsd":"",
1935
+ // "fillPx":"",
1936
+ // "fillSz":"0",
1937
+ // "fillTime":"",
1938
+ // "instId":"ETH-USDT",
1939
+ // "instType":"SPOT",
1940
+ // "lever":"",
1941
+ // "msg":"",
1942
+ // "notionalUsd":"451.4516256",
1943
+ // "ordId":"370257534141235201",
1944
+ // "ordType":"limit",
1945
+ // "pnl":"0",
1946
+ // "posSide":"",
1947
+ // "px":"60000",
1948
+ // "rebate":"0",
1949
+ // "rebateCcy":"ETH",
1950
+ // "reqId":"",
1951
+ // "side":"sell",
1952
+ // "slOrdPx":"",
1953
+ // "slTriggerPx":"",
1954
+ // "state":"live",
1955
+ // "sz":"0.007526",
1956
+ // "tag":"",
1957
+ // "tdMode":"cash",
1958
+ // "tgtCcy":"",
1959
+ // "tpOrdPx":"",
1960
+ // "tpTriggerPx":"",
1961
+ // "tradeId":"",
1962
+ // "uTime":"1634548275191"
1963
+ // }
1964
+ // ]
1965
+ // }
1966
+ //
1967
+ const arg = this.safeValue(message, 'arg', {});
1968
+ const channel = this.safeString(arg, 'channel');
1969
+ const rawOrders = this.safeValue(message, 'data', []);
1970
+ const filteredOrders = [];
1971
+ // filter orders with no last trade id
1972
+ for (let i = 0; i < rawOrders.length; i++) {
1973
+ const rawOrder = rawOrders[i];
1974
+ const tradeId = this.safeString(rawOrder, 'tradeId', '');
1975
+ if (tradeId.length > 0) {
1976
+ const order = this.parseOrder(rawOrder);
1977
+ filteredOrders.push(order);
1978
+ }
1979
+ }
1980
+ const tradesLength = filteredOrders.length;
1981
+ if (tradesLength === 0) {
1982
+ return;
1983
+ }
1984
+ if (this.myTrades === undefined) {
1985
+ const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
1986
+ this.myTrades = new ArrayCacheBySymbolById(limit);
1987
+ }
1988
+ const myTrades = this.myTrades;
1989
+ const symbols = {};
1990
+ for (let i = 0; i < filteredOrders.length; i++) {
1991
+ const rawTrade = filteredOrders[i];
1992
+ const trade = this.orderToTrade(rawTrade);
1993
+ myTrades.append(trade);
1994
+ const symbol = trade['symbol'];
1995
+ symbols[symbol] = true;
1996
+ }
1997
+ const messageHash = channel + '::myTrades';
1998
+ client.resolve(this.myTrades, messageHash);
1999
+ const tradeSymbols = Object.keys(symbols);
2000
+ for (let i = 0; i < tradeSymbols.length; i++) {
2001
+ const symbolMessageHash = messageHash + '::' + tradeSymbols[i];
2002
+ client.resolve(this.myTrades, symbolMessageHash);
2003
+ }
2004
+ }
2005
+ requestId() {
2006
+ const ts = this.milliseconds().toString();
2007
+ const randomNumber = this.randNumber(4);
2008
+ const randomPart = randomNumber.toString();
2009
+ return ts + randomPart;
2010
+ }
2011
+ /**
2012
+ * @method
2013
+ * @name okx#createOrderWs
2014
+ * @see https://www.okx.com/docs-v5/en/#websocket-api-trade-place-order
2015
+ * @description create a trade order
2016
+ * @param {string} symbol unified symbol of the market to create an order in
2017
+ * @param {string} type 'market' or 'limit'
2018
+ * @param {string} side 'buy' or 'sell'
2019
+ * @param {float} amount how much of currency you want to trade in units of base currency
2020
+ * @param {float|undefined} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
2021
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2022
+ * @param {boolean} params.test test order, default false
2023
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2024
+ */
2025
+ async createOrderWs(symbol, type, side, amount, price = undefined, params = {}) {
2026
+ await this.loadMarkets();
2027
+ await this.authenticate();
2028
+ const url = this.getUrl('private', 'private');
2029
+ const messageHash = this.requestId();
2030
+ let op = undefined;
2031
+ [op, params] = this.handleOptionAndParams(params, 'createOrderWs', 'op', 'batch-orders');
2032
+ const args = this.createOrderRequest(symbol, type, side, amount, price, params);
2033
+ const ordType = this.safeString(args, 'ordType');
2034
+ if ((ordType === 'trigger') || (ordType === 'conditional') || (type === 'oco') || (type === 'move_order_stop') || (type === 'iceberg') || (type === 'twap')) {
2035
+ throw new BadRequest(this.id + ' createOrderWs() does not support algo trading. this.options["createOrderWs"]["op"] must be either order or batch-order');
2036
+ }
2037
+ if ((op !== 'order') && (op !== 'batch-orders')) {
2038
+ throw new BadRequest(this.id + ' createOrderWs() does not support algo trading. this.options["createOrderWs"]["op"] must be either order or privatePostTradeOrder or privatePostTradeOrderAlgo');
2039
+ }
2040
+ const request = {
2041
+ 'id': messageHash,
2042
+ 'op': op,
2043
+ 'args': [args],
2044
+ };
2045
+ return await this.watch(url, messageHash, request, messageHash);
2046
+ }
2047
+ handlePlaceOrders(client, message) {
2048
+ //
2049
+ // batch-orders/order/cancel-order
2050
+ // {
2051
+ // "id": "1689281055",
2052
+ // "op": "batch-orders",
2053
+ // "code": "0",
2054
+ // "msg": '',
2055
+ // "data": [{
2056
+ // "tag": "e847386590ce4dBC",
2057
+ // "ordId": "599823446566084608",
2058
+ // "clOrdId": "e847386590ce4dBCb939511604f394b0",
2059
+ // "sCode": "0",
2060
+ // "sMsg": "Order successfully placed."
2061
+ // },
2062
+ // ...
2063
+ // ]
2064
+ // }
2065
+ //
2066
+ const messageHash = this.safeString(message, 'id');
2067
+ let args = this.safeValue(message, 'data', []);
2068
+ // filter out partial errors
2069
+ args = this.filterBy(args, 'sCode', '0');
2070
+ // if empty means request failed and handle error
2071
+ if (this.isEmpty(args)) {
2072
+ const method = this.safeString(message, 'op');
2073
+ const stringMsg = this.json(message);
2074
+ this.handleErrors(1, '', client.url, method, {}, stringMsg, message, {}, {});
2075
+ }
2076
+ const orders = this.parseOrders(args, undefined, undefined, undefined);
2077
+ const first = this.safeDict(orders, 0, {});
2078
+ client.resolve(first, messageHash);
2079
+ }
2080
+ /**
2081
+ * @method
2082
+ * @name okx#editOrderWs
2083
+ * @description edit a trade order
2084
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-amend-order
2085
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-amend-multiple-orders
2086
+ * @param {string} id order id
2087
+ * @param {string} symbol unified symbol of the market to create an order in
2088
+ * @param {string} type 'market' or 'limit'
2089
+ * @param {string} side 'buy' or 'sell'
2090
+ * @param {float} amount how much of the currency you want to trade in units of the base currency
2091
+ * @param {float|undefined} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
2092
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2093
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2094
+ */
2095
+ async editOrderWs(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
2096
+ await this.loadMarkets();
2097
+ await this.authenticate();
2098
+ const url = this.getUrl('private', 'private');
2099
+ const messageHash = this.requestId();
2100
+ let op = undefined;
2101
+ [op, params] = this.handleOptionAndParams(params, 'editOrderWs', 'op', 'amend-order');
2102
+ const args = this.editOrderRequest(id, symbol, type, side, amount, price, params);
2103
+ const request = {
2104
+ 'id': messageHash,
2105
+ 'op': op,
2106
+ 'args': [args],
2107
+ };
2108
+ return await this.watch(url, messageHash, this.extend(request, params), messageHash);
2109
+ }
2110
+ /**
2111
+ * @method
2112
+ * @name okx#cancelOrderWs
2113
+ * @see https://okx-docs.github.io/apidocs/websocket_api/en/#cancel-order-trade
2114
+ * @description cancel multiple orders
2115
+ * @param {string} id order id
2116
+ * @param {string} symbol unified market symbol, default is undefined
2117
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2118
+ * @param {string} [params.clOrdId] client order id
2119
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2120
+ */
2121
+ async cancelOrderWs(id, symbol = undefined, params = {}) {
2122
+ if (symbol === undefined) {
2123
+ throw new BadRequest(this.id + ' cancelOrderWs() requires a symbol argument');
2124
+ }
2125
+ await this.loadMarkets();
2126
+ await this.authenticate();
2127
+ const url = this.getUrl('private', 'private');
2128
+ const messageHash = this.requestId();
2129
+ const clientOrderId = this.safeString2(params, 'clOrdId', 'clientOrderId');
2130
+ params = this.omit(params, ['clientOrderId', 'clOrdId']);
2131
+ const arg = {
2132
+ 'instId': this.marketId(symbol),
2133
+ };
2134
+ if (clientOrderId !== undefined) {
2135
+ arg['clOrdId'] = clientOrderId;
2136
+ }
2137
+ else {
2138
+ arg['ordId'] = id;
2139
+ }
2140
+ const request = {
2141
+ 'id': messageHash,
2142
+ 'op': 'cancel-order',
2143
+ 'args': [this.extend(arg, params)],
2144
+ };
2145
+ return await this.watch(url, messageHash, request, messageHash);
2146
+ }
2147
+ /**
2148
+ * @method
2149
+ * @name okx#cancelOrdersWs
2150
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-ws-mass-cancel-order
2151
+ * @description cancel multiple orders
2152
+ * @param {string[]} ids order ids
2153
+ * @param {string} symbol unified market symbol, default is undefined
2154
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2155
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2156
+ */
2157
+ async cancelOrdersWs(ids, symbol = undefined, params = {}) {
2158
+ const idsLength = ids.length;
2159
+ if (idsLength > 20) {
2160
+ throw new BadRequest(this.id + ' cancelOrdersWs() accepts up to 20 ids at a time');
2161
+ }
2162
+ if (symbol === undefined) {
2163
+ throw new BadRequest(this.id + ' cancelOrdersWs() requires a symbol argument');
2164
+ }
2165
+ await this.loadMarkets();
2166
+ await this.authenticate();
2167
+ const url = this.getUrl('private', 'private');
2168
+ const messageHash = this.requestId();
2169
+ const args = [];
2170
+ for (let i = 0; i < idsLength; i++) {
2171
+ const arg = {
2172
+ 'instId': this.marketId(symbol),
2173
+ 'ordId': ids[i],
2174
+ };
2175
+ args.push(arg);
2176
+ }
2177
+ const request = {
2178
+ 'id': messageHash,
2179
+ 'op': 'batch-cancel-orders',
2180
+ 'args': args,
2181
+ };
2182
+ return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
2183
+ }
2184
+ /**
2185
+ * @method
2186
+ * @name okx#cancelAllOrdersWs
2187
+ * @see https://docs.okx.com/websockets/#message-cancelAll
2188
+ * @description cancel all open orders of a type. Only applicable to Option in Portfolio Margin mode, and MMP privilege is required.
2189
+ * @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
2190
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2191
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2192
+ */
2193
+ async cancelAllOrdersWs(symbol = undefined, params = {}) {
2194
+ if (symbol === undefined) {
2195
+ throw new BadRequest(this.id + ' cancelAllOrdersWs() requires a symbol argument');
2196
+ }
2197
+ await this.loadMarkets();
2198
+ await this.authenticate();
2199
+ const market = this.market(symbol);
2200
+ if (market['type'] !== 'option') {
2201
+ throw new BadRequest(this.id + ' cancelAllOrdersWs is only applicable to Option in Portfolio Margin mode, and MMP privilege is required.');
2202
+ }
2203
+ const url = this.getUrl('private', 'private');
2204
+ const messageHash = this.requestId();
2205
+ const request = {
2206
+ 'id': messageHash,
2207
+ 'op': 'mass-cancel',
2208
+ 'args': [this.extend({
2209
+ 'instType': 'OPTION',
2210
+ 'instFamily': market['id'],
2211
+ }, params)],
2212
+ };
2213
+ return await this.watch(url, messageHash, request, messageHash);
2214
+ }
2215
+ handleCancelAllOrders(client, message) {
2216
+ //
2217
+ // {
2218
+ // "id": "1512",
2219
+ // "op": "mass-cancel",
2220
+ // "data": [
2221
+ // {
2222
+ // "result": true
2223
+ // }
2224
+ // ],
2225
+ // "code": "0",
2226
+ // "msg": ""
2227
+ // }
2228
+ //
2229
+ const messageHash = this.safeString(message, 'id');
2230
+ const data = this.safeValue(message, 'data', []);
2231
+ client.resolve(data, messageHash);
2232
+ }
2233
+ handleSubscriptionStatus(client, message) {
2234
+ //
2235
+ // { event: 'subscribe', arg: { channel: "tickers", instId: "BTC-USDT" } }
2236
+ //
2237
+ // const channel = this.safeString (message, "channel");
2238
+ // client.subscriptions[channel] = message;
2239
+ return message;
2240
+ }
2241
+ handleAuthenticate(client, message) {
2242
+ //
2243
+ // { event: "login", success: true }
2244
+ //
2245
+ const future = this.safeValue(client.futures, 'authenticated');
2246
+ future.resolve(true);
2247
+ }
2248
+ ping(client) {
2249
+ // OKX does not support the built-in WebSocket protocol-level ping-pong.
2250
+ // Instead, it requires a custom text-based ping-pong mechanism.
2251
+ return 'ping';
2252
+ }
2253
+ handlePong(client, message) {
2254
+ client.lastPong = this.milliseconds();
2255
+ return message;
2256
+ }
2257
+ handleErrorMessage(client, message) {
2258
+ //
2259
+ // { event: 'error', msg: "Illegal request: {"op":"subscribe","args":["spot/ticker:BTC-USDT"]}", code: "60012" }
2260
+ // { event: 'error", msg: "channel:ticker,instId:BTC-USDT doesn"t exist", code: "60018" }
2261
+ // {"event":"error","msg":"Illegal request: {\\"id\\":\\"17321173472466905\\",\\"op\\":\\"amend-order\\",\\"args\\":[{\\"instId\\":\\"ETH-USDC\\",\\"ordId\\":\\"2000345622407479296\\",\\"newSz\\":\\"0.050857\\",\\"newPx\\":\\"2949.4\\",\\"postOnly\\":true}],\\"postOnly\\":true}","code":"60012","connId":"0808af6c"}
2262
+ //
2263
+ let errorCode = this.safeString(message, 'code');
2264
+ try {
2265
+ if (errorCode && errorCode !== '0') {
2266
+ const feedback = this.id + ' ' + this.json(message);
2267
+ if (errorCode !== '1') {
2268
+ this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
2269
+ }
2270
+ let messageString = this.safeValue(message, 'msg');
2271
+ if (messageString !== undefined) {
2272
+ this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
2273
+ }
2274
+ else {
2275
+ const data = this.safeList(message, 'data', []);
2276
+ for (let i = 0; i < data.length; i++) {
2277
+ const d = data[i];
2278
+ errorCode = this.safeString(d, 'sCode');
2279
+ if (errorCode !== undefined) {
2280
+ this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
2281
+ }
2282
+ messageString = this.safeValue(message, 'sMsg');
2283
+ if (messageString !== undefined) {
2284
+ this.throwBroadlyMatchedException(this.exceptions['broad'], messageString, feedback);
2285
+ }
2286
+ }
2287
+ }
2288
+ throw new ExchangeError(feedback);
2289
+ }
2290
+ }
2291
+ catch (e) {
2292
+ // if the message contains an id, it means it is a response to a request
2293
+ // so we only reject that promise, instead of deleting all futures, destroying the authentication future
2294
+ let id = this.safeString(message, 'id');
2295
+ if (id === undefined) {
2296
+ // try to parse it from the stringified json inside msg
2297
+ const msg = this.safeString(message, 'msg');
2298
+ if (msg !== undefined && msg.startsWith('Illegal request: {')) {
2299
+ const stringifiedJson = msg.replace('Illegal request: ', '');
2300
+ const parsedJson = this.parseJson(stringifiedJson);
2301
+ id = this.safeString(parsedJson, 'id');
2302
+ }
2303
+ }
2304
+ if (id !== undefined) {
2305
+ client.reject(e, id);
2306
+ return false;
2307
+ }
2308
+ client.reject(e);
2309
+ return false;
2310
+ }
2311
+ return true;
2312
+ }
2313
+ handleMessage(client, message) {
2314
+ if (!this.handleErrorMessage(client, message)) {
2315
+ return;
2316
+ }
2317
+ //
2318
+ // { event: 'subscribe', arg: { channel: "tickers", instId: "BTC-USDT" } }
2319
+ // { event: 'login", msg: '", code: "0" }
2320
+ //
2321
+ // {
2322
+ // "arg": { channel: "tickers", instId: "BTC-USDT" },
2323
+ // "data": [
2324
+ // {
2325
+ // "instType": "SPOT",
2326
+ // "instId": "BTC-USDT",
2327
+ // "last": "31500.1",
2328
+ // "lastSz": "0.00001754",
2329
+ // "askPx": "31500.1",
2330
+ // "askSz": "0.00998144",
2331
+ // "bidPx": "31500",
2332
+ // "bidSz": "3.05652439",
2333
+ // "open24h": "31697",
2334
+ // "high24h": "32248",
2335
+ // "low24h": "31165.6",
2336
+ // "sodUtc0": "31385.5",
2337
+ // "sodUtc8": "32134.9",
2338
+ // "volCcy24h": "503403597.38138519",
2339
+ // "vol24h": "15937.10781721",
2340
+ // "ts": "1626526618762"
2341
+ // }
2342
+ // ]
2343
+ // }
2344
+ //
2345
+ // { event: 'error', msg: "Illegal request: {"op":"subscribe","args":["spot/ticker:BTC-USDT"]}", code: "60012" }
2346
+ // { event: 'error", msg: "channel:ticker,instId:BTC-USDT doesn"t exist", code: "60018" }
2347
+ // { event: 'error', msg: "Invalid OK_ACCESS_KEY", code: "60005" }
2348
+ // {
2349
+ // "event": "error",
2350
+ // "msg": "Illegal request: {"op":"login","args":["de89b035-b233-44b2-9a13-0ccdd00bda0e","7KUcc8YzQhnxBE3K","1626691289","H57N99mBt5NvW8U19FITrPdOxycAERFMaapQWRqLaSE="]}",
2351
+ // "code": "60012"
2352
+ // }
2353
+ //
2354
+ //
2355
+ //
2356
+ if (message === 'pong') {
2357
+ this.handlePong(client, message);
2358
+ return;
2359
+ }
2360
+ // const table = this.safeString (message, 'table');
2361
+ // if (table === undefined) {
2362
+ const event = this.safeString2(message, 'event', 'op');
2363
+ if (event !== undefined) {
2364
+ const methods = {
2365
+ // 'info': this.handleSystemStatus,
2366
+ // 'book': 'handleOrderBook',
2367
+ 'login': this.handleAuthenticate,
2368
+ 'subscribe': this.handleSubscriptionStatus,
2369
+ 'unsubscribe': this.handleUnsubscription,
2370
+ 'order': this.handlePlaceOrders,
2371
+ 'batch-orders': this.handlePlaceOrders,
2372
+ 'amend-order': this.handlePlaceOrders,
2373
+ 'batch-amend-orders': this.handlePlaceOrders,
2374
+ 'cancel-order': this.handlePlaceOrders,
2375
+ 'mass-cancel': this.handleCancelAllOrders,
2376
+ };
2377
+ const method = this.safeValue(methods, event);
2378
+ if (method !== undefined) {
2379
+ method.call(this, client, message);
2380
+ }
2381
+ }
2382
+ else {
2383
+ const arg = this.safeValue(message, 'arg', {});
2384
+ const channel = this.safeString(arg, 'channel');
2385
+ const methods = {
2386
+ 'bbo-tbt': this.handleOrderBook,
2387
+ 'books': this.handleOrderBook,
2388
+ 'books5': this.handleOrderBook,
2389
+ 'books50-l2-tbt': this.handleOrderBook,
2390
+ 'books-l2-tbt': this.handleOrderBook,
2391
+ 'tickers': this.handleTicker,
2392
+ 'mark-price': this.handleTicker,
2393
+ 'positions': this.handlePositions,
2394
+ 'index-tickers': this.handleTicker,
2395
+ 'sprd-tickers': this.handleTicker,
2396
+ 'block-tickers': this.handleTicker,
2397
+ 'trades': this.handleTrades,
2398
+ 'account': this.handleBalance,
2399
+ 'funding-rate': this.handleFundingRate,
2400
+ // 'margin_account': this.handleBalance,
2401
+ 'orders': this.handleOrders,
2402
+ 'orders-algo': this.handleOrders,
2403
+ 'liquidation-orders': this.handleLiquidation,
2404
+ 'balance_and_position': this.handleBalanceAndPosition,
2405
+ };
2406
+ const method = this.safeValue(methods, channel);
2407
+ if (method === undefined) {
2408
+ if (channel.indexOf('candle') === 0) {
2409
+ this.handleOHLCV(client, message);
2410
+ }
2411
+ }
2412
+ else {
2413
+ method.call(this, client, message);
2414
+ }
2415
+ }
2416
+ }
2417
+ handleUnSubscriptionTrades(client, symbol) {
2418
+ const subMessageHash = 'trades:' + symbol;
2419
+ const messageHash = 'unsubscribe:trades:' + symbol;
2420
+ this.cleanUnsubscription(client, subMessageHash, messageHash);
2421
+ if (symbol in this.trades) {
2422
+ delete this.trades[symbol];
2423
+ }
2424
+ }
2425
+ handleUnsubscriptionOrderBook(client, symbol, channel) {
2426
+ const subMessageHash = channel + ':' + symbol;
2427
+ const messageHash = 'unsubscribe:orderbook:' + symbol;
2428
+ this.cleanUnsubscription(client, subMessageHash, messageHash);
2429
+ if (symbol in this.orderbooks) {
2430
+ delete this.orderbooks[symbol];
2431
+ }
2432
+ }
2433
+ handleUnsubscriptionOHLCV(client, symbol, channel) {
2434
+ const tf = channel.replace('candle', '');
2435
+ const timeframe = this.findTimeframe(tf);
2436
+ const subMessageHash = 'multi:' + channel + ':' + symbol;
2437
+ const messageHash = 'unsubscribe:' + subMessageHash;
2438
+ this.cleanUnsubscription(client, subMessageHash, messageHash);
2439
+ if (timeframe in this.ohlcvs[symbol]) {
2440
+ delete this.ohlcvs[symbol][timeframe];
2441
+ }
2442
+ }
2443
+ handleUnsubscriptionTicker(client, symbol, channel) {
2444
+ const subMessageHash = channel + '::' + symbol;
2445
+ const messageHash = 'unsubscribe:ticker:' + symbol;
2446
+ this.cleanUnsubscription(client, subMessageHash, messageHash);
2447
+ if (symbol in this.tickers) {
2448
+ delete this.tickers[symbol];
2449
+ }
2450
+ }
2451
+ handleUnsubscription(client, message) {
2452
+ //
2453
+ // {
2454
+ // "event": "unsubscribe",
2455
+ // "arg": {
2456
+ // "channel": "tickers",
2457
+ // "instId": "LTC-USD-200327"
2458
+ // },
2459
+ // "connId": "a4d3ae55"
2460
+ // }
2461
+ // arg might be an array or list
2462
+ const arg = this.safeDict(message, 'arg', {});
2463
+ const channel = this.safeString(arg, 'channel', '');
2464
+ const marketId = this.safeString(arg, 'instId');
2465
+ const symbol = this.safeSymbol(marketId);
2466
+ if (channel === 'trades') {
2467
+ this.handleUnSubscriptionTrades(client, symbol);
2468
+ }
2469
+ else if (channel.startsWith('bbo') || channel.startsWith('book')) {
2470
+ this.handleUnsubscriptionOrderBook(client, symbol, channel);
2471
+ }
2472
+ else if (channel.indexOf('tickers') > -1) {
2473
+ this.handleUnsubscriptionTicker(client, symbol, channel);
2474
+ }
2475
+ else if (channel.startsWith('candle')) {
2476
+ this.handleUnsubscriptionOHLCV(client, symbol, channel);
2477
+ }
2478
+ }
2479
+ }