ccxt 4.5.46 → 4.5.48

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 (1009) hide show
  1. package/README.md +117 -116
  2. package/dist/ccxt.browser.min.js +10 -10
  3. package/dist/cjs/ccxt.js +6 -6
  4. package/dist/cjs/src/abstract/aftermath.js +1 -1
  5. package/dist/cjs/src/abstract/alpaca.js +1 -1
  6. package/dist/cjs/src/abstract/apex.js +1 -1
  7. package/dist/cjs/src/abstract/arkham.js +1 -1
  8. package/dist/cjs/src/abstract/ascendex.js +1 -1
  9. package/dist/cjs/src/abstract/aster.js +1 -1
  10. package/dist/cjs/src/abstract/backpack.js +1 -1
  11. package/dist/cjs/src/abstract/bigone.js +1 -1
  12. package/dist/cjs/src/abstract/binance.js +1 -1
  13. package/dist/cjs/src/abstract/bingx.js +1 -1
  14. package/dist/cjs/src/abstract/bit2c.js +1 -1
  15. package/dist/cjs/src/abstract/bitbank.js +1 -1
  16. package/dist/cjs/src/abstract/bitbns.js +1 -1
  17. package/dist/cjs/src/abstract/bitfinex.js +1 -1
  18. package/dist/cjs/src/abstract/bitflyer.js +1 -1
  19. package/dist/cjs/src/abstract/bitget.js +1 -1
  20. package/dist/cjs/src/abstract/bithumb.js +1 -1
  21. package/dist/cjs/src/abstract/bitmart.js +1 -1
  22. package/dist/cjs/src/abstract/bitmex.js +1 -1
  23. package/dist/cjs/src/abstract/bitopro.js +1 -1
  24. package/dist/cjs/src/abstract/bitrue.js +1 -1
  25. package/dist/cjs/src/abstract/bitso.js +1 -1
  26. package/dist/cjs/src/abstract/bitstamp.js +1 -1
  27. package/dist/cjs/src/abstract/bitteam.js +1 -1
  28. package/dist/cjs/src/abstract/bittrade.js +1 -1
  29. package/dist/cjs/src/abstract/bitvavo.js +1 -1
  30. package/dist/cjs/src/abstract/blockchaincom.js +1 -1
  31. package/dist/cjs/src/abstract/blofin.js +1 -1
  32. package/dist/cjs/src/abstract/btcbox.js +1 -1
  33. package/dist/cjs/src/abstract/btcmarkets.js +1 -1
  34. package/dist/cjs/src/abstract/btcturk.js +1 -1
  35. package/dist/cjs/src/abstract/bullish.js +1 -1
  36. package/dist/cjs/src/abstract/bybit.js +1 -1
  37. package/dist/cjs/src/abstract/bydfi.js +1 -1
  38. package/dist/cjs/src/abstract/cex.js +1 -1
  39. package/dist/cjs/src/abstract/coinbase.js +1 -1
  40. package/dist/cjs/src/abstract/coinbaseexchange.js +1 -1
  41. package/dist/cjs/src/abstract/coinbaseinternational.js +1 -1
  42. package/dist/cjs/src/abstract/coincheck.js +1 -1
  43. package/dist/cjs/src/abstract/coinex.js +1 -1
  44. package/dist/cjs/src/abstract/coinmate.js +1 -1
  45. package/dist/cjs/src/abstract/coinmetro.js +1 -1
  46. package/dist/cjs/src/abstract/coinone.js +1 -1
  47. package/dist/cjs/src/abstract/coinsph.js +1 -1
  48. package/dist/cjs/src/abstract/coinspot.js +1 -1
  49. package/dist/cjs/src/abstract/cryptocom.js +1 -1
  50. package/dist/cjs/src/abstract/cryptomus.js +1 -1
  51. package/dist/cjs/src/abstract/deepcoin.js +1 -1
  52. package/dist/cjs/src/abstract/delta.js +1 -1
  53. package/dist/cjs/src/abstract/deribit.js +1 -1
  54. package/dist/cjs/src/abstract/derive.js +1 -1
  55. package/dist/cjs/src/abstract/digifinex.js +1 -1
  56. package/dist/cjs/src/abstract/dydx.js +1 -1
  57. package/dist/cjs/src/abstract/exmo.js +1 -1
  58. package/dist/cjs/src/abstract/foxbit.js +1 -1
  59. package/dist/cjs/src/abstract/gate.js +1 -1
  60. package/dist/cjs/src/abstract/gemini.js +1 -1
  61. package/dist/cjs/src/abstract/grvt.js +1 -1
  62. package/dist/cjs/src/abstract/hashkey.js +1 -1
  63. package/dist/cjs/src/abstract/hibachi.js +1 -1
  64. package/dist/cjs/src/abstract/hitbtc.js +1 -1
  65. package/dist/cjs/src/abstract/hollaex.js +1 -1
  66. package/dist/cjs/src/abstract/htx.js +1 -1
  67. package/dist/cjs/src/abstract/hyperliquid.js +1 -1
  68. package/dist/cjs/src/abstract/independentreserve.js +1 -1
  69. package/dist/cjs/src/abstract/indodax.js +1 -1
  70. package/dist/cjs/src/abstract/kraken.js +1 -1
  71. package/dist/cjs/src/abstract/krakenfutures.js +1 -1
  72. package/dist/cjs/src/abstract/kucoin.js +1 -1
  73. package/dist/cjs/src/abstract/latoken.js +1 -1
  74. package/dist/cjs/src/abstract/lbank.js +1 -1
  75. package/dist/cjs/src/abstract/lighter.js +1 -1
  76. package/dist/cjs/src/abstract/luno.js +1 -1
  77. package/dist/cjs/src/abstract/mercado.js +1 -1
  78. package/dist/cjs/src/abstract/mexc.js +1 -1
  79. package/dist/cjs/src/abstract/modetrade.js +1 -1
  80. package/dist/cjs/src/abstract/ndax.js +1 -1
  81. package/dist/cjs/src/abstract/novadax.js +1 -1
  82. package/dist/cjs/src/abstract/okx.js +1 -1
  83. package/dist/cjs/src/abstract/onetrading.js +1 -1
  84. package/dist/cjs/src/abstract/oxfun.js +1 -1
  85. package/dist/cjs/src/abstract/p2b.js +1 -1
  86. package/dist/cjs/src/abstract/{coincatch.js → pacifica.js} +1 -1
  87. package/dist/cjs/src/abstract/paradex.js +1 -1
  88. package/dist/cjs/src/abstract/paymium.js +1 -1
  89. package/dist/cjs/src/abstract/phemex.js +1 -1
  90. package/dist/cjs/src/abstract/poloniex.js +1 -1
  91. package/dist/cjs/src/abstract/tokocrypto.js +1 -1
  92. package/dist/cjs/src/abstract/toobit.js +1 -1
  93. package/dist/cjs/src/abstract/upbit.js +1 -1
  94. package/dist/cjs/src/abstract/wavesexchange.js +1 -1
  95. package/dist/cjs/src/abstract/whitebit.js +1 -1
  96. package/dist/cjs/src/abstract/woo.js +1 -1
  97. package/dist/cjs/src/abstract/woofipro.js +1 -1
  98. package/dist/cjs/src/abstract/xt.js +1 -1
  99. package/dist/cjs/src/abstract/yobit.js +1 -1
  100. package/dist/cjs/src/abstract/zaif.js +1 -1
  101. package/dist/cjs/src/abstract/zebpay.js +1 -1
  102. package/dist/cjs/src/abstract/zonda.js +1 -1
  103. package/dist/cjs/src/aftermath.js +2 -1
  104. package/dist/cjs/src/alpaca.js +1 -1
  105. package/dist/cjs/src/apex.js +1 -1
  106. package/dist/cjs/src/arkham.js +1 -1
  107. package/dist/cjs/src/ascendex.js +1 -1
  108. package/dist/cjs/src/aster.js +53 -1
  109. package/dist/cjs/src/backpack.js +2 -2
  110. package/dist/cjs/src/base/Exchange.js +31 -0
  111. package/dist/cjs/src/base/Precise.js +6 -0
  112. package/dist/cjs/src/base/errors.js +6 -0
  113. package/dist/cjs/src/base/functions/crypto.js +1 -1
  114. package/dist/cjs/src/base/functions/encode.js +1 -1
  115. package/dist/cjs/src/base/functions/io.js +1 -1
  116. package/dist/cjs/src/base/functions/misc.js +1 -0
  117. package/dist/cjs/src/base/functions/number.js +6 -0
  118. package/dist/cjs/src/base/functions/platform.js +6 -0
  119. package/dist/cjs/src/base/functions/rsa.js +1 -0
  120. package/dist/cjs/src/base/functions/string.js +6 -0
  121. package/dist/cjs/src/base/functions/throttle.js +1 -1
  122. package/dist/cjs/src/base/functions/time.js +6 -0
  123. package/dist/cjs/src/base/functions/totp.js +1 -0
  124. package/dist/cjs/src/base/functions/type.js +6 -0
  125. package/dist/cjs/src/base/functions.js +1 -1
  126. package/dist/cjs/src/base/ws/Cache.js +6 -0
  127. package/dist/cjs/src/base/ws/Client.js +1 -0
  128. package/dist/cjs/src/base/ws/Future.js +1 -1
  129. package/dist/cjs/src/base/ws/OrderBook.js +1 -1
  130. package/dist/cjs/src/base/ws/OrderBookSide.js +6 -0
  131. package/dist/cjs/src/base/ws/WsClient.js +1 -1
  132. package/dist/cjs/src/bequant.js +1 -1
  133. package/dist/cjs/src/bigone.js +1 -1
  134. package/dist/cjs/src/binance.js +14 -19
  135. package/dist/cjs/src/binancecoinm.js +1 -1
  136. package/dist/cjs/src/binanceus.js +1 -1
  137. package/dist/cjs/src/binanceusdm.js +1 -1
  138. package/dist/cjs/src/bingx.js +1 -1
  139. package/dist/cjs/src/bit2c.js +1 -1
  140. package/dist/cjs/src/bitbank.js +1 -1
  141. package/dist/cjs/src/bitbns.js +1 -1
  142. package/dist/cjs/src/bitfinex.js +45 -54
  143. package/dist/cjs/src/bitflyer.js +1 -1
  144. package/dist/cjs/src/bitget.js +7 -4
  145. package/dist/cjs/src/bithumb.js +1 -1
  146. package/dist/cjs/src/bitmart.js +1 -1
  147. package/dist/cjs/src/bitmex.js +47 -1
  148. package/dist/cjs/src/bitopro.js +1 -1
  149. package/dist/cjs/src/bitrue.js +1 -1
  150. package/dist/cjs/src/bitso.js +1 -1
  151. package/dist/cjs/src/bitstamp.js +15 -2
  152. package/dist/cjs/src/bitteam.js +1 -1
  153. package/dist/cjs/src/bittrade.js +2 -2
  154. package/dist/cjs/src/blockchaincom.js +1 -1
  155. package/dist/cjs/src/blofin.js +153 -32
  156. package/dist/cjs/src/btcbox.js +1 -1
  157. package/dist/cjs/src/btcmarkets.js +1 -1
  158. package/dist/cjs/src/btcturk.js +1 -1
  159. package/dist/cjs/src/bullish.js +1 -1
  160. package/dist/cjs/src/bybit.js +1 -1
  161. package/dist/cjs/src/bydfi.js +1 -1
  162. package/dist/cjs/src/cex.js +1 -1
  163. package/dist/cjs/src/coinbaseadvanced.js +1 -1
  164. package/dist/cjs/src/coincheck.js +1 -1
  165. package/dist/cjs/src/coinex.js +1 -1
  166. package/dist/cjs/src/coinmate.js +1 -1
  167. package/dist/cjs/src/coinmetro.js +1 -1
  168. package/dist/cjs/src/coinone.js +1 -1
  169. package/dist/cjs/src/coinsph.js +5 -0
  170. package/dist/cjs/src/coinspot.js +1 -1
  171. package/dist/cjs/src/cryptocom.js +1 -1
  172. package/dist/cjs/src/cryptomus.js +1 -1
  173. package/dist/cjs/src/deepcoin.js +1 -1
  174. package/dist/cjs/src/delta.js +1 -1
  175. package/dist/cjs/src/deribit.js +1 -1
  176. package/dist/cjs/src/derive.js +1 -1
  177. package/dist/cjs/src/digifinex.js +1 -1
  178. package/dist/cjs/src/dydx.js +1 -1
  179. package/dist/cjs/src/exmo.js +1 -1
  180. package/dist/cjs/src/fmfwio.js +1 -1
  181. package/dist/cjs/src/foxbit.js +1 -1
  182. package/dist/cjs/src/gate.js +1 -1
  183. package/dist/cjs/src/gateio.js +1 -1
  184. package/dist/cjs/src/gemini.js +1 -1
  185. package/dist/cjs/src/grvt.js +1 -1
  186. package/dist/cjs/src/hashkey.js +1 -1
  187. package/dist/cjs/src/hibachi.js +1 -1
  188. package/dist/cjs/src/hitbtc.js +1 -0
  189. package/dist/cjs/src/hollaex.js +2 -2
  190. package/dist/cjs/src/htx.js +1 -1
  191. package/dist/cjs/src/huobi.js +1 -1
  192. package/dist/cjs/src/hyperliquid.js +1 -1
  193. package/dist/cjs/src/independentreserve.js +1 -1
  194. package/dist/cjs/src/indodax.js +1 -1
  195. package/dist/cjs/src/kraken.js +40 -32
  196. package/dist/cjs/src/krakenfutures.js +1 -1
  197. package/dist/cjs/src/kucoin.js +2112 -415
  198. package/dist/cjs/src/kucoinfutures.js +1 -1
  199. package/dist/cjs/src/latoken.js +1 -1
  200. package/dist/cjs/src/lbank.js +1 -1
  201. package/dist/cjs/src/lighter.js +199 -74
  202. package/dist/cjs/src/luno.js +1 -1
  203. package/dist/cjs/src/mercado.js +1 -1
  204. package/dist/cjs/src/mexc.js +50 -1
  205. package/dist/cjs/src/modetrade.js +1 -1
  206. package/dist/cjs/src/myokx.js +1 -1
  207. package/dist/cjs/src/ndax.js +1 -1
  208. package/dist/cjs/src/novadax.js +1 -1
  209. package/dist/cjs/src/okx.js +7 -6
  210. package/dist/cjs/src/okxus.js +1 -1
  211. package/dist/cjs/src/onetrading.js +1 -1
  212. package/dist/cjs/src/oxfun.js +1 -1
  213. package/dist/cjs/src/p2b.js +1 -1
  214. package/dist/cjs/src/pacifica.js +3254 -0
  215. package/dist/cjs/src/paradex.js +1 -1
  216. package/dist/cjs/src/paymium.js +1 -1
  217. package/dist/cjs/src/poloniex.js +1 -1
  218. package/dist/cjs/src/pro/alpaca.js +1 -1
  219. package/dist/cjs/src/pro/apex.js +1 -1
  220. package/dist/cjs/src/pro/arkham.js +1 -1
  221. package/dist/cjs/src/pro/ascendex.js +1 -1
  222. package/dist/cjs/src/pro/aster.js +1 -1
  223. package/dist/cjs/src/pro/backpack.js +1 -1
  224. package/dist/cjs/src/pro/bequant.js +1 -1
  225. package/dist/cjs/src/pro/binance.js +12 -1
  226. package/dist/cjs/src/pro/binancecoinm.js +1 -1
  227. package/dist/cjs/src/pro/binanceus.js +1 -1
  228. package/dist/cjs/src/pro/binanceusdm.js +1 -1
  229. package/dist/cjs/src/pro/bingx.js +2 -2
  230. package/dist/cjs/src/pro/bitfinex.js +1 -1
  231. package/dist/cjs/src/pro/bitget.js +1 -1
  232. package/dist/cjs/src/pro/bithumb.js +1 -1
  233. package/dist/cjs/src/pro/bitmart.js +5 -4
  234. package/dist/cjs/src/pro/bitmex.js +1 -1
  235. package/dist/cjs/src/pro/bitrue.js +1 -1
  236. package/dist/cjs/src/pro/bitstamp.js +1 -1
  237. package/dist/cjs/src/pro/bittrade.js +4 -0
  238. package/dist/cjs/src/pro/bitvavo.js +9 -1
  239. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  240. package/dist/cjs/src/pro/blofin.js +1 -1
  241. package/dist/cjs/src/pro/bullish.js +1 -1
  242. package/dist/cjs/src/pro/bybit.js +1 -1
  243. package/dist/cjs/src/pro/bydfi.js +1 -1
  244. package/dist/cjs/src/pro/cex.js +1 -1
  245. package/dist/cjs/src/pro/coinbase.js +1 -1
  246. package/dist/cjs/src/pro/coinbaseadvanced.js +1 -1
  247. package/dist/cjs/src/pro/coinbaseexchange.js +1 -1
  248. package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
  249. package/dist/cjs/src/pro/coincheck.js +1 -1
  250. package/dist/cjs/src/pro/coinex.js +1 -1
  251. package/dist/cjs/src/pro/coinone.js +1 -1
  252. package/dist/cjs/src/pro/cryptocom.js +1 -1
  253. package/dist/cjs/src/pro/deepcoin.js +1 -1
  254. package/dist/cjs/src/pro/deribit.js +1 -1
  255. package/dist/cjs/src/pro/dydx.js +1 -1
  256. package/dist/cjs/src/pro/exmo.js +1 -1
  257. package/dist/cjs/src/pro/gate.js +4 -1
  258. package/dist/cjs/src/pro/gateio.js +1 -1
  259. package/dist/cjs/src/pro/gemini.js +1 -1
  260. package/dist/cjs/src/pro/grvt.js +2 -2
  261. package/dist/cjs/src/pro/hashkey.js +1 -1
  262. package/dist/cjs/src/pro/hitbtc.js +1 -1
  263. package/dist/cjs/src/pro/hollaex.js +1 -1
  264. package/dist/cjs/src/pro/htx.js +1 -1
  265. package/dist/cjs/src/pro/huobi.js +1 -1
  266. package/dist/cjs/src/pro/hyperliquid.js +1 -1
  267. package/dist/cjs/src/pro/independentreserve.js +1 -1
  268. package/dist/cjs/src/pro/kraken.js +1 -1
  269. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  270. package/dist/cjs/src/pro/kucoin.js +1 -1
  271. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  272. package/dist/cjs/src/pro/lbank.js +1 -0
  273. package/dist/cjs/src/pro/lighter.js +37 -18
  274. package/dist/cjs/src/pro/luno.js +1 -1
  275. package/dist/cjs/src/pro/mexc.js +1 -1
  276. package/dist/cjs/src/pro/myokx.js +1 -1
  277. package/dist/cjs/src/pro/ndax.js +1 -1
  278. package/dist/cjs/src/pro/okx.js +1 -1
  279. package/dist/cjs/src/pro/okxus.js +1 -1
  280. package/dist/cjs/src/pro/onetrading.js +1 -1
  281. package/dist/cjs/src/pro/oxfun.js +1 -1
  282. package/dist/cjs/src/pro/p2b.js +1 -1
  283. package/dist/cjs/src/pro/pacifica.js +1397 -0
  284. package/dist/cjs/src/pro/paradex.js +1 -1
  285. package/dist/cjs/src/pro/phemex.js +1 -1
  286. package/dist/cjs/src/pro/poloniex.js +1 -1
  287. package/dist/cjs/src/pro/toobit.js +1 -1
  288. package/dist/cjs/src/pro/upbit.js +1 -1
  289. package/dist/cjs/src/pro/whitebit.js +1 -1
  290. package/dist/cjs/src/pro/xt.js +1 -1
  291. package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +0 -1
  292. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +1 -0
  293. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +1 -0
  294. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +1 -0
  295. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +1 -0
  296. package/dist/cjs/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +1 -0
  297. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +1 -0
  298. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +1 -0
  299. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +1 -0
  300. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +1 -0
  301. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +1 -0
  302. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +1 -0
  303. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +1 -0
  304. package/dist/cjs/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +1 -0
  305. package/dist/cjs/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +1 -0
  306. package/dist/cjs/src/static_dependencies/dydx-v4-client/helpers.js +6 -0
  307. package/dist/cjs/src/static_dependencies/dydx-v4-client/onboarding.js +1 -0
  308. package/dist/cjs/src/static_dependencies/dydx-v4-client/registry.js +1 -0
  309. package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +6 -0
  310. package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -1
  311. package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +6 -0
  312. package/dist/cjs/src/static_dependencies/ethers/coders/address.js +1 -0
  313. package/dist/cjs/src/static_dependencies/ethers/coders/anonymous.js +1 -0
  314. package/dist/cjs/src/static_dependencies/ethers/coders/array.js +1 -0
  315. package/dist/cjs/src/static_dependencies/ethers/coders/boolean.js +1 -0
  316. package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +1 -0
  317. package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +1 -0
  318. package/dist/cjs/src/static_dependencies/ethers/coders/null.js +1 -0
  319. package/dist/cjs/src/static_dependencies/ethers/coders/number.js +1 -0
  320. package/dist/cjs/src/static_dependencies/ethers/coders/string.js +1 -0
  321. package/dist/cjs/src/static_dependencies/ethers/coders/tuple.js +1 -0
  322. package/dist/cjs/src/static_dependencies/ethers/fragments.js +6 -0
  323. package/dist/cjs/src/static_dependencies/ethers/hash/typed-data.js +6 -0
  324. package/dist/cjs/src/static_dependencies/ethers/index.js +1 -10
  325. package/dist/cjs/src/static_dependencies/ethers/interface.js +6 -0
  326. package/dist/cjs/src/static_dependencies/ethers/typed.js +6 -0
  327. package/dist/cjs/src/static_dependencies/ethers/utils/base58.js +1 -13
  328. package/dist/cjs/src/static_dependencies/ethers/utils/data.js +1 -6
  329. package/dist/cjs/src/static_dependencies/ethers/utils/errors.js +1 -9
  330. package/dist/cjs/src/static_dependencies/ethers/utils/events.js +6 -0
  331. package/dist/cjs/src/static_dependencies/ethers/utils/fixednumber.js +6 -0
  332. package/dist/cjs/src/static_dependencies/ethers/utils/index.js +1 -7
  333. package/dist/cjs/src/static_dependencies/ethers/utils/maths.js +1 -5
  334. package/dist/cjs/src/static_dependencies/ethers/utils/properties.js +6 -0
  335. package/dist/cjs/src/static_dependencies/ethers/utils/utf8.js +1 -8
  336. package/dist/cjs/src/static_dependencies/fflake/browser.js +1 -1
  337. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncrypt.js +1 -0
  338. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +1 -0
  339. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +1 -1
  340. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +6 -0
  341. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +6 -0
  342. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +6 -0
  343. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +1 -0
  344. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1 -1
  345. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +6 -0
  346. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +1 -1
  347. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +1 -1
  348. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/util.js +6 -0
  349. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1 -1
  350. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +6 -0
  351. package/dist/cjs/src/static_dependencies/messagepack/msgpack.js +6 -0
  352. package/dist/cjs/src/static_dependencies/noble-curves/_shortw_utils.js +1 -1
  353. package/dist/cjs/src/static_dependencies/noble-curves/abstract/curve.js +1 -1
  354. package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +1 -1
  355. package/dist/cjs/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +1 -0
  356. package/dist/cjs/src/static_dependencies/noble-curves/abstract/modular.js +1 -1
  357. package/dist/cjs/src/static_dependencies/noble-curves/abstract/montgomery.js +1 -1
  358. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +1 -1
  359. package/dist/cjs/src/static_dependencies/noble-curves/abstract/utils.js +6 -0
  360. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  361. package/dist/cjs/src/static_dependencies/noble-curves/ed25519.js +1 -1
  362. package/dist/cjs/src/static_dependencies/noble-curves/p256.js +1 -1
  363. package/dist/cjs/src/static_dependencies/noble-curves/secp256k1.js +1 -1
  364. package/dist/cjs/src/static_dependencies/noble-hashes/_assert.js +6 -0
  365. package/dist/cjs/src/static_dependencies/noble-hashes/_sha2.js +1 -0
  366. package/dist/cjs/src/static_dependencies/noble-hashes/_u64.js +6 -0
  367. package/dist/cjs/src/static_dependencies/noble-hashes/crypto.js +6 -0
  368. package/dist/cjs/src/static_dependencies/noble-hashes/hmac.js +1 -0
  369. package/dist/cjs/src/static_dependencies/noble-hashes/md5.js +1 -0
  370. package/dist/cjs/src/static_dependencies/noble-hashes/pbkdf2.js +1 -0
  371. package/dist/cjs/src/static_dependencies/noble-hashes/ripemd160.js +1 -0
  372. package/dist/cjs/src/static_dependencies/noble-hashes/sha1.js +1 -0
  373. package/dist/cjs/src/static_dependencies/noble-hashes/sha256.js +1 -0
  374. package/dist/cjs/src/static_dependencies/noble-hashes/sha3.js +1 -0
  375. package/dist/cjs/src/static_dependencies/noble-hashes/sha512.js +1 -0
  376. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +1 -1
  377. package/dist/cjs/src/static_dependencies/node-fetch/body.js +1 -5
  378. package/dist/cjs/src/static_dependencies/node-fetch/errors/abort-error.js +1 -0
  379. package/dist/cjs/src/static_dependencies/node-fetch/errors/base.js +6 -0
  380. package/dist/cjs/src/static_dependencies/node-fetch/errors/fetch-error.js +1 -0
  381. package/dist/cjs/src/static_dependencies/node-fetch/headers.js +1 -5
  382. package/dist/cjs/src/static_dependencies/node-fetch/index.js +1 -7
  383. package/dist/cjs/src/static_dependencies/node-fetch/request.js +1 -7
  384. package/dist/cjs/src/static_dependencies/node-fetch/response.js +1 -5
  385. package/dist/cjs/src/static_dependencies/node-fetch/utils/get-search.js +6 -0
  386. package/dist/cjs/src/static_dependencies/node-fetch/utils/is-redirect.js +6 -0
  387. package/dist/cjs/src/static_dependencies/node-fetch/utils/is.js +6 -0
  388. package/dist/cjs/src/static_dependencies/node-fetch/utils/referrer.js +1 -0
  389. package/dist/cjs/src/static_dependencies/proxies/agent-base/index.js +1 -0
  390. package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +1 -0
  391. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +1 -0
  392. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +6 -0
  393. package/dist/cjs/src/static_dependencies/qs/formats.js +6 -0
  394. package/dist/cjs/src/static_dependencies/qs/index.js +1 -0
  395. package/dist/cjs/src/static_dependencies/qs/parse.js +1 -0
  396. package/dist/cjs/src/static_dependencies/qs/stringify.js +1 -0
  397. package/dist/cjs/src/static_dependencies/qs/utils.js +6 -0
  398. package/dist/cjs/src/static_dependencies/scure-base/index.js +6 -0
  399. package/dist/cjs/src/static_dependencies/scure-bip32/index.js +1 -19
  400. package/dist/cjs/src/static_dependencies/scure-bip39/index.js +1 -1
  401. package/dist/cjs/src/static_dependencies/scure-bip39/wordlists/english.js +6 -0
  402. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +1 -1
  403. package/dist/cjs/src/static_dependencies/starknet/constants.js +1 -1
  404. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +6 -0
  405. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +6 -0
  406. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +6 -0
  407. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +6 -0
  408. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +6 -0
  409. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +6 -0
  410. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +1 -1
  411. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +1 -1
  412. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +1 -1
  413. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +1 -0
  414. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +1 -0
  415. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +6 -0
  416. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +6 -0
  417. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +6 -0
  418. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +1 -0
  419. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +1 -1
  420. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +1 -0
  421. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +1 -0
  422. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +6 -0
  423. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +1 -0
  424. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +1 -0
  425. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +1 -0
  426. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +1 -1
  427. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +1 -4
  428. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +1 -0
  429. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +1 -3
  430. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +1 -0
  431. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +1 -0
  432. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +1 -0
  433. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +1 -0
  434. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +1 -1
  435. package/dist/cjs/src/static_dependencies/watchable/src/unpromise.js +6 -0
  436. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +6 -0
  437. package/dist/cjs/src/tokocrypto.js +1 -1
  438. package/dist/cjs/src/toobit.js +1 -1
  439. package/dist/cjs/src/upbit.js +1 -1
  440. package/dist/cjs/src/wavesexchange.js +1 -1
  441. package/dist/cjs/src/whitebit.js +22 -3
  442. package/dist/cjs/src/woo.js +1 -1
  443. package/dist/cjs/src/woofipro.js +1 -1
  444. package/dist/cjs/src/xt.js +1 -1
  445. package/dist/cjs/src/yobit.js +1 -1
  446. package/dist/cjs/src/zaif.js +1 -1
  447. package/dist/cjs/src/zebpay.js +1 -1
  448. package/dist/cjs/src/zonda.js +1 -1
  449. package/js/ccxt.d.ts +8 -8
  450. package/js/ccxt.js +12 -6
  451. package/js/src/abstract/aftermath.js +6 -0
  452. package/js/src/abstract/alpaca.js +6 -0
  453. package/js/src/abstract/apex.js +6 -0
  454. package/js/src/abstract/arkham.js +6 -0
  455. package/js/src/abstract/ascendex.js +6 -0
  456. package/js/src/abstract/aster.d.ts +52 -0
  457. package/js/src/abstract/aster.js +6 -0
  458. package/js/src/abstract/backpack.js +6 -0
  459. package/js/src/abstract/bequant.js +6 -0
  460. package/js/src/abstract/bigone.js +6 -0
  461. package/js/src/abstract/binance.d.ts +1 -0
  462. package/js/src/abstract/binance.js +6 -0
  463. package/js/src/abstract/binancecoinm.d.ts +1 -0
  464. package/js/src/abstract/binancecoinm.js +6 -0
  465. package/js/src/abstract/binanceus.d.ts +1 -0
  466. package/js/src/abstract/binanceus.js +6 -0
  467. package/js/src/abstract/binanceusdm.d.ts +1 -0
  468. package/js/src/abstract/binanceusdm.js +6 -0
  469. package/js/src/abstract/bingx.js +6 -0
  470. package/js/src/abstract/bit2c.js +6 -0
  471. package/js/src/abstract/bitbank.js +6 -0
  472. package/js/src/abstract/bitbns.js +6 -0
  473. package/js/src/abstract/bitfinex.js +6 -0
  474. package/js/src/abstract/bitflyer.js +6 -0
  475. package/js/src/abstract/bitget.js +6 -0
  476. package/js/src/abstract/bithumb.js +6 -0
  477. package/js/src/abstract/bitmart.js +6 -0
  478. package/js/src/abstract/bitmex.js +6 -0
  479. package/js/src/abstract/bitopro.js +6 -0
  480. package/js/src/abstract/bitrue.js +6 -0
  481. package/js/src/abstract/bitso.js +6 -0
  482. package/js/src/abstract/bitstamp.js +6 -0
  483. package/js/src/abstract/bitteam.js +6 -0
  484. package/js/src/abstract/bittrade.js +6 -0
  485. package/js/src/abstract/bitvavo.js +6 -0
  486. package/js/src/abstract/blockchaincom.js +6 -0
  487. package/js/src/abstract/blofin.d.ts +28 -12
  488. package/js/src/abstract/blofin.js +6 -0
  489. package/js/src/abstract/btcbox.js +6 -0
  490. package/js/src/abstract/btcmarkets.js +6 -0
  491. package/js/src/abstract/btcturk.js +6 -0
  492. package/js/src/abstract/bullish.js +6 -0
  493. package/js/src/abstract/bybit.js +6 -0
  494. package/js/src/abstract/bydfi.js +6 -0
  495. package/js/src/abstract/cex.js +6 -0
  496. package/js/src/abstract/coinbase.js +6 -0
  497. package/js/src/abstract/coinbaseadvanced.js +6 -0
  498. package/js/src/abstract/coinbaseexchange.js +6 -0
  499. package/js/src/abstract/coinbaseinternational.js +6 -0
  500. package/js/src/abstract/coincheck.js +6 -0
  501. package/js/src/abstract/coinex.js +6 -0
  502. package/js/src/abstract/coinmate.js +6 -0
  503. package/js/src/abstract/coinmetro.js +6 -0
  504. package/js/src/abstract/coinone.js +6 -0
  505. package/js/src/abstract/coinsph.js +6 -0
  506. package/js/src/abstract/coinspot.js +6 -0
  507. package/js/src/abstract/cryptocom.js +6 -0
  508. package/js/src/abstract/cryptomus.js +6 -0
  509. package/js/src/abstract/deepcoin.js +6 -0
  510. package/js/src/abstract/delta.js +6 -0
  511. package/js/src/abstract/deribit.js +6 -0
  512. package/js/src/abstract/derive.js +6 -0
  513. package/js/src/abstract/digifinex.js +6 -0
  514. package/js/src/abstract/dydx.js +6 -0
  515. package/js/src/abstract/exmo.js +6 -0
  516. package/js/src/abstract/fmfwio.js +6 -0
  517. package/js/src/abstract/foxbit.js +6 -0
  518. package/js/src/abstract/gate.js +6 -0
  519. package/js/src/abstract/gateio.js +6 -0
  520. package/js/src/abstract/gemini.js +6 -0
  521. package/js/src/abstract/grvt.js +6 -0
  522. package/js/src/abstract/hashkey.js +6 -0
  523. package/js/src/abstract/hibachi.js +6 -0
  524. package/js/src/abstract/hitbtc.js +6 -0
  525. package/js/src/abstract/hollaex.js +6 -0
  526. package/js/src/abstract/htx.js +6 -0
  527. package/js/src/abstract/huobi.js +6 -0
  528. package/js/src/abstract/hyperliquid.js +6 -0
  529. package/js/src/abstract/independentreserve.js +6 -0
  530. package/js/src/abstract/indodax.js +6 -0
  531. package/js/src/abstract/kraken.d.ts +36 -30
  532. package/js/src/abstract/kraken.js +6 -0
  533. package/js/src/abstract/krakenfutures.js +6 -0
  534. package/js/src/abstract/kucoin.d.ts +1 -0
  535. package/js/src/abstract/kucoin.js +6 -0
  536. package/js/src/abstract/kucoinfutures.d.ts +1 -0
  537. package/js/src/abstract/kucoinfutures.js +6 -0
  538. package/js/src/abstract/latoken.js +6 -0
  539. package/js/src/abstract/lbank.js +6 -0
  540. package/js/src/abstract/lighter.js +6 -0
  541. package/js/src/abstract/luno.js +6 -0
  542. package/js/src/abstract/mercado.js +6 -0
  543. package/js/src/abstract/mexc.d.ts +49 -0
  544. package/js/src/abstract/mexc.js +6 -0
  545. package/js/src/abstract/modetrade.js +6 -0
  546. package/js/src/abstract/myokx.js +6 -0
  547. package/js/src/abstract/ndax.js +6 -0
  548. package/js/src/abstract/novadax.js +6 -0
  549. package/js/src/abstract/okx.js +6 -0
  550. package/js/src/abstract/okxus.js +6 -0
  551. package/js/src/abstract/onetrading.js +6 -0
  552. package/js/src/abstract/oxfun.js +6 -0
  553. package/js/src/abstract/p2b.js +6 -0
  554. package/js/src/abstract/pacifica.d.ts +46 -0
  555. package/js/src/abstract/pacifica.js +11 -0
  556. package/js/src/abstract/paradex.js +6 -0
  557. package/js/src/abstract/paymium.js +6 -0
  558. package/js/src/abstract/phemex.js +6 -0
  559. package/js/src/abstract/poloniex.js +6 -0
  560. package/js/src/abstract/tokocrypto.js +6 -0
  561. package/js/src/abstract/toobit.js +6 -0
  562. package/js/src/abstract/upbit.js +6 -0
  563. package/js/src/abstract/wavesexchange.js +6 -0
  564. package/js/src/abstract/whitebit.js +6 -0
  565. package/js/src/abstract/woo.js +6 -0
  566. package/js/src/abstract/woofipro.js +6 -0
  567. package/js/src/abstract/xt.js +6 -0
  568. package/js/src/abstract/yobit.js +6 -0
  569. package/js/src/abstract/zaif.js +6 -0
  570. package/js/src/abstract/zebpay.js +6 -0
  571. package/js/src/abstract/zonda.js +6 -0
  572. package/js/src/aftermath.js +7 -1
  573. package/js/src/alpaca.js +6 -0
  574. package/js/src/apex.js +6 -0
  575. package/js/src/arkham.js +6 -0
  576. package/js/src/ascendex.js +6 -0
  577. package/js/src/aster.js +58 -0
  578. package/js/src/backpack.js +7 -1
  579. package/js/src/base/Exchange.d.ts +3 -0
  580. package/js/src/base/Exchange.js +37 -0
  581. package/js/src/base/Precise.js +6 -0
  582. package/js/src/base/errorHierarchy.js +6 -0
  583. package/js/src/base/errors.js +6 -0
  584. package/js/src/base/functions/crypto.js +6 -0
  585. package/js/src/base/functions/encode.js +6 -0
  586. package/js/src/base/functions/generic.js +6 -0
  587. package/js/src/base/functions/io.js +6 -0
  588. package/js/src/base/functions/misc.js +6 -0
  589. package/js/src/base/functions/number.js +6 -0
  590. package/js/src/base/functions/platform.js +6 -0
  591. package/js/src/base/functions/rsa.js +6 -0
  592. package/js/src/base/functions/string.js +6 -0
  593. package/js/src/base/functions/throttle.js +6 -0
  594. package/js/src/base/functions/time.js +6 -0
  595. package/js/src/base/functions/totp.js +6 -0
  596. package/js/src/base/functions/type.js +6 -0
  597. package/js/src/base/functions.js +6 -0
  598. package/js/src/base/types.js +6 -0
  599. package/js/src/base/ws/Cache.js +6 -0
  600. package/js/src/base/ws/Client.js +6 -0
  601. package/js/src/base/ws/Future.js +6 -0
  602. package/js/src/base/ws/OrderBook.js +6 -0
  603. package/js/src/base/ws/OrderBookSide.js +6 -0
  604. package/js/src/base/ws/WsClient.js +6 -0
  605. package/js/src/base/ws/functions.js +6 -0
  606. package/js/src/bequant.js +6 -0
  607. package/js/src/bigone.js +6 -0
  608. package/js/src/binance.d.ts +0 -1
  609. package/js/src/binance.js +19 -18
  610. package/js/src/binancecoinm.js +6 -0
  611. package/js/src/binanceus.js +6 -0
  612. package/js/src/binanceusdm.js +6 -0
  613. package/js/src/bingx.js +6 -0
  614. package/js/src/bit2c.js +6 -0
  615. package/js/src/bitbank.js +6 -0
  616. package/js/src/bitbns.js +6 -0
  617. package/js/src/bitfinex.js +50 -53
  618. package/js/src/bitflyer.js +6 -0
  619. package/js/src/bitget.d.ts +1 -1
  620. package/js/src/bitget.js +12 -3
  621. package/js/src/bithumb.js +6 -0
  622. package/js/src/bitmart.js +6 -0
  623. package/js/src/bitmex.d.ts +12 -0
  624. package/js/src/bitmex.js +52 -0
  625. package/js/src/bitopro.js +6 -0
  626. package/js/src/bitrue.js +6 -0
  627. package/js/src/bitso.js +6 -0
  628. package/js/src/bitstamp.js +20 -1
  629. package/js/src/bitteam.js +6 -0
  630. package/js/src/bittrade.js +7 -1
  631. package/js/src/bitvavo.js +6 -0
  632. package/js/src/blockchaincom.js +6 -0
  633. package/js/src/blofin.d.ts +4 -1
  634. package/js/src/blofin.js +158 -31
  635. package/js/src/btcbox.js +6 -0
  636. package/js/src/btcmarkets.js +6 -0
  637. package/js/src/btcturk.js +6 -0
  638. package/js/src/bullish.js +6 -0
  639. package/js/src/bybit.js +6 -0
  640. package/js/src/bydfi.js +6 -0
  641. package/js/src/cex.js +6 -0
  642. package/js/src/coinbase.js +6 -0
  643. package/js/src/coinbaseadvanced.js +6 -0
  644. package/js/src/coinbaseexchange.js +6 -0
  645. package/js/src/coinbaseinternational.js +6 -0
  646. package/js/src/coincheck.js +6 -0
  647. package/js/src/coinex.js +6 -0
  648. package/js/src/coinmate.js +6 -0
  649. package/js/src/coinmetro.js +6 -0
  650. package/js/src/coinone.js +6 -0
  651. package/js/src/coinsph.js +10 -0
  652. package/js/src/coinspot.js +6 -0
  653. package/js/src/cryptocom.js +6 -0
  654. package/js/src/cryptomus.js +6 -0
  655. package/js/src/deepcoin.js +6 -0
  656. package/js/src/delta.js +6 -0
  657. package/js/src/deribit.js +6 -0
  658. package/js/src/derive.js +6 -0
  659. package/js/src/digifinex.js +6 -0
  660. package/js/src/dydx.js +6 -0
  661. package/js/src/exmo.js +6 -0
  662. package/js/src/fmfwio.js +6 -0
  663. package/js/src/foxbit.js +6 -0
  664. package/js/src/gate.js +6 -0
  665. package/js/src/gateio.js +6 -0
  666. package/js/src/gemini.js +6 -0
  667. package/js/src/grvt.js +6 -0
  668. package/js/src/hashkey.js +6 -0
  669. package/js/src/hibachi.js +6 -0
  670. package/js/src/hitbtc.js +6 -0
  671. package/js/src/hollaex.js +7 -1
  672. package/js/src/htx.js +6 -0
  673. package/js/src/huobi.js +6 -0
  674. package/js/src/hyperliquid.js +6 -0
  675. package/js/src/independentreserve.js +6 -0
  676. package/js/src/indodax.js +6 -0
  677. package/js/src/kraken.js +45 -31
  678. package/js/src/krakenfutures.js +6 -0
  679. package/js/src/kucoin.d.ts +249 -8
  680. package/js/src/kucoin.js +2164 -461
  681. package/js/src/kucoinfutures.js +6 -0
  682. package/js/src/latoken.js +6 -0
  683. package/js/src/lbank.js +6 -0
  684. package/js/src/lighter.d.ts +4 -2
  685. package/js/src/lighter.js +204 -73
  686. package/js/src/luno.js +6 -0
  687. package/js/src/mercado.js +6 -0
  688. package/js/src/mexc.js +55 -0
  689. package/js/src/modetrade.js +6 -0
  690. package/js/src/myokx.js +6 -0
  691. package/js/src/ndax.js +6 -0
  692. package/js/src/novadax.js +6 -0
  693. package/js/src/okx.js +12 -5
  694. package/js/src/okxus.js +6 -0
  695. package/js/src/onetrading.js +6 -0
  696. package/js/src/oxfun.js +6 -0
  697. package/js/src/p2b.js +6 -0
  698. package/js/src/pacifica.d.ts +531 -0
  699. package/js/src/pacifica.js +3257 -0
  700. package/js/src/paradex.js +6 -0
  701. package/js/src/paymium.js +6 -0
  702. package/js/src/phemex.js +6 -0
  703. package/js/src/poloniex.js +6 -0
  704. package/js/src/pro/aftermath.js +6 -0
  705. package/js/src/pro/alpaca.js +6 -0
  706. package/js/src/pro/apex.js +6 -0
  707. package/js/src/pro/arkham.js +6 -0
  708. package/js/src/pro/ascendex.js +6 -0
  709. package/js/src/pro/aster.js +6 -0
  710. package/js/src/pro/backpack.js +6 -0
  711. package/js/src/pro/bequant.js +6 -0
  712. package/js/src/pro/binance.js +18 -1
  713. package/js/src/pro/binancecoinm.js +6 -0
  714. package/js/src/pro/binanceus.js +6 -0
  715. package/js/src/pro/binanceusdm.js +6 -0
  716. package/js/src/pro/bingx.js +7 -1
  717. package/js/src/pro/bitfinex.js +6 -0
  718. package/js/src/pro/bitget.js +6 -0
  719. package/js/src/pro/bithumb.js +6 -0
  720. package/js/src/pro/bitmart.js +10 -3
  721. package/js/src/pro/bitmex.js +6 -0
  722. package/js/src/pro/bitopro.js +6 -0
  723. package/js/src/pro/bitrue.js +6 -0
  724. package/js/src/pro/bitstamp.js +6 -0
  725. package/js/src/pro/bittrade.js +10 -0
  726. package/js/src/pro/bitvavo.js +14 -0
  727. package/js/src/pro/blockchaincom.js +6 -0
  728. package/js/src/pro/blofin.js +6 -0
  729. package/js/src/pro/bullish.js +6 -0
  730. package/js/src/pro/bybit.js +6 -0
  731. package/js/src/pro/bydfi.js +6 -0
  732. package/js/src/pro/cex.js +6 -0
  733. package/js/src/pro/coinbase.js +6 -0
  734. package/js/src/pro/coinbaseadvanced.js +6 -0
  735. package/js/src/pro/coinbaseexchange.js +6 -0
  736. package/js/src/pro/coinbaseinternational.js +6 -0
  737. package/js/src/pro/coincheck.js +6 -0
  738. package/js/src/pro/coinex.js +6 -0
  739. package/js/src/pro/coinone.js +6 -0
  740. package/js/src/pro/cryptocom.js +6 -0
  741. package/js/src/pro/deepcoin.js +6 -0
  742. package/js/src/pro/deribit.js +6 -0
  743. package/js/src/pro/derive.js +6 -0
  744. package/js/src/pro/dydx.js +6 -0
  745. package/js/src/pro/exmo.js +6 -0
  746. package/js/src/pro/gate.js +9 -0
  747. package/js/src/pro/gateio.js +6 -0
  748. package/js/src/pro/gemini.js +6 -0
  749. package/js/src/pro/grvt.js +7 -1
  750. package/js/src/pro/hashkey.js +6 -0
  751. package/js/src/pro/hitbtc.js +6 -0
  752. package/js/src/pro/hollaex.js +6 -0
  753. package/js/src/pro/htx.js +6 -0
  754. package/js/src/pro/huobi.js +6 -0
  755. package/js/src/pro/hyperliquid.js +6 -0
  756. package/js/src/pro/independentreserve.js +6 -0
  757. package/js/src/pro/kraken.js +6 -0
  758. package/js/src/pro/krakenfutures.js +6 -0
  759. package/js/src/pro/kucoin.js +6 -0
  760. package/js/src/pro/kucoinfutures.js +6 -0
  761. package/js/src/pro/lbank.js +6 -0
  762. package/js/src/pro/lighter.js +42 -17
  763. package/js/src/pro/luno.js +6 -0
  764. package/js/src/pro/mexc.js +6 -0
  765. package/js/src/pro/modetrade.js +6 -0
  766. package/js/src/pro/myokx.js +6 -0
  767. package/js/src/pro/ndax.js +6 -0
  768. package/js/src/pro/okx.js +6 -0
  769. package/js/src/pro/okxus.js +6 -0
  770. package/js/src/pro/onetrading.js +6 -0
  771. package/js/src/pro/oxfun.js +6 -0
  772. package/js/src/pro/p2b.js +6 -0
  773. package/js/src/pro/pacifica.d.ts +267 -0
  774. package/js/src/pro/pacifica.js +1396 -0
  775. package/js/src/pro/paradex.js +6 -0
  776. package/js/src/pro/phemex.js +6 -0
  777. package/js/src/pro/poloniex.js +6 -0
  778. package/js/src/pro/toobit.js +6 -0
  779. package/js/src/pro/upbit.js +6 -0
  780. package/js/src/pro/whitebit.js +6 -0
  781. package/js/src/pro/woo.js +6 -0
  782. package/js/src/pro/woofipro.js +6 -0
  783. package/js/src/pro/xt.js +6 -0
  784. package/js/src/protobuf/mexc/compiled.cjs +6 -0
  785. package/js/src/static_dependencies/dydx-v4-client/cosmos/base/v1beta1/coin.js +6 -0
  786. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/keys.js +6 -0
  787. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/multisig/v1beta1/multisig.js +6 -0
  788. package/js/src/static_dependencies/dydx-v4-client/cosmos/crypto/secp256k1/keys.js +6 -0
  789. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/signing/v1beta1/signing.js +6 -0
  790. package/js/src/static_dependencies/dydx-v4-client/cosmos/tx/v1beta1/tx.js +6 -0
  791. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/accountplus/tx.js +6 -0
  792. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/block_rate_limit_config.js +6 -0
  793. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/clob_pair.js +6 -0
  794. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/equity_tier_limit_config.js +6 -0
  795. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/finalize_block.js +6 -0
  796. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations.js +6 -0
  797. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/liquidations_config.js +6 -0
  798. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/matches.js +6 -0
  799. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order.js +6 -0
  800. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/order_removals.js +6 -0
  801. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/clob/tx.js +6 -0
  802. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/transfer.js +6 -0
  803. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/sending/tx.js +6 -0
  804. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/asset_position.js +6 -0
  805. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/perpetual_position.js +6 -0
  806. package/js/src/static_dependencies/dydx-v4-client/dydxprotocol/subaccounts/subaccount.js +6 -0
  807. package/js/src/static_dependencies/dydx-v4-client/google/protobuf/any.js +6 -0
  808. package/js/src/static_dependencies/dydx-v4-client/helpers.js +6 -0
  809. package/js/src/static_dependencies/dydx-v4-client/long/index.cjs +6 -0
  810. package/js/src/static_dependencies/dydx-v4-client/onboarding.js +6 -0
  811. package/js/src/static_dependencies/dydx-v4-client/registry.js +6 -0
  812. package/js/src/static_dependencies/ethers/abi-coder.js +6 -0
  813. package/js/src/static_dependencies/ethers/address/address.js +6 -0
  814. package/js/src/static_dependencies/ethers/address/checks.js +6 -0
  815. package/js/src/static_dependencies/ethers/address/contract-address.js +6 -0
  816. package/js/src/static_dependencies/ethers/address/index.js +6 -0
  817. package/js/src/static_dependencies/ethers/bytes32.js +6 -0
  818. package/js/src/static_dependencies/ethers/coders/abstract-coder.js +6 -0
  819. package/js/src/static_dependencies/ethers/coders/address.js +6 -0
  820. package/js/src/static_dependencies/ethers/coders/anonymous.js +6 -0
  821. package/js/src/static_dependencies/ethers/coders/array.js +6 -0
  822. package/js/src/static_dependencies/ethers/coders/boolean.js +6 -0
  823. package/js/src/static_dependencies/ethers/coders/bytes.js +6 -0
  824. package/js/src/static_dependencies/ethers/coders/fixed-bytes.js +6 -0
  825. package/js/src/static_dependencies/ethers/coders/null.js +6 -0
  826. package/js/src/static_dependencies/ethers/coders/number.js +6 -0
  827. package/js/src/static_dependencies/ethers/coders/string.js +6 -0
  828. package/js/src/static_dependencies/ethers/coders/tuple.js +6 -0
  829. package/js/src/static_dependencies/ethers/fragments.js +6 -0
  830. package/js/src/static_dependencies/ethers/hash/index.js +6 -0
  831. package/js/src/static_dependencies/ethers/hash/solidity.js +6 -0
  832. package/js/src/static_dependencies/ethers/hash/typed-data.js +6 -0
  833. package/js/src/static_dependencies/ethers/index.js +6 -0
  834. package/js/src/static_dependencies/ethers/interface.js +6 -0
  835. package/js/src/static_dependencies/ethers/typed.js +6 -0
  836. package/js/src/static_dependencies/ethers/utils/base58.js +6 -0
  837. package/js/src/static_dependencies/ethers/utils/base64-browser.js +6 -0
  838. package/js/src/static_dependencies/ethers/utils/base64.js +6 -0
  839. package/js/src/static_dependencies/ethers/utils/data.js +6 -0
  840. package/js/src/static_dependencies/ethers/utils/errors.js +6 -0
  841. package/js/src/static_dependencies/ethers/utils/events.js +6 -0
  842. package/js/src/static_dependencies/ethers/utils/fixednumber.js +6 -0
  843. package/js/src/static_dependencies/ethers/utils/index.js +6 -0
  844. package/js/src/static_dependencies/ethers/utils/maths.js +6 -0
  845. package/js/src/static_dependencies/ethers/utils/properties.js +6 -0
  846. package/js/src/static_dependencies/ethers/utils/rlp-decode.js +6 -0
  847. package/js/src/static_dependencies/ethers/utils/rlp-encode.js +6 -0
  848. package/js/src/static_dependencies/ethers/utils/rlp.js +6 -0
  849. package/js/src/static_dependencies/ethers/utils/units.js +6 -0
  850. package/js/src/static_dependencies/ethers/utils/utf8.js +6 -0
  851. package/js/src/static_dependencies/ethers/utils/uuid.js +6 -0
  852. package/js/src/static_dependencies/fflake/browser.js +6 -0
  853. package/js/src/static_dependencies/jsencrypt/JSEncrypt.js +6 -0
  854. package/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +6 -0
  855. package/js/src/static_dependencies/jsencrypt/index.js +6 -0
  856. package/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +6 -0
  857. package/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +6 -0
  858. package/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +6 -0
  859. package/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +6 -0
  860. package/js/src/static_dependencies/jsencrypt/lib/asn1js/oids.js +6 -0
  861. package/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +6 -0
  862. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +6 -0
  863. package/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +6 -0
  864. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +6 -0
  865. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +6 -0
  866. package/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +6 -0
  867. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +6 -0
  868. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +6 -0
  869. package/js/src/static_dependencies/messagepack/msgpack.js +6 -0
  870. package/js/src/static_dependencies/noble-curves/_shortw_utils.js +6 -0
  871. package/js/src/static_dependencies/noble-curves/abstract/curve.js +6 -0
  872. package/js/src/static_dependencies/noble-curves/abstract/edwards.js +6 -0
  873. package/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +6 -0
  874. package/js/src/static_dependencies/noble-curves/abstract/modular.js +6 -0
  875. package/js/src/static_dependencies/noble-curves/abstract/montgomery.js +6 -0
  876. package/js/src/static_dependencies/noble-curves/abstract/poseidon.js +6 -0
  877. package/js/src/static_dependencies/noble-curves/abstract/utils.js +6 -0
  878. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +6 -0
  879. package/js/src/static_dependencies/noble-curves/bn.js +6 -0
  880. package/js/src/static_dependencies/noble-curves/ed25519.js +6 -0
  881. package/js/src/static_dependencies/noble-curves/ed448.js +6 -0
  882. package/js/src/static_dependencies/noble-curves/index.js +6 -0
  883. package/js/src/static_dependencies/noble-curves/jubjub.js +6 -0
  884. package/js/src/static_dependencies/noble-curves/p256.js +6 -0
  885. package/js/src/static_dependencies/noble-curves/p384.js +6 -0
  886. package/js/src/static_dependencies/noble-curves/p521.js +6 -0
  887. package/js/src/static_dependencies/noble-curves/pasta.js +6 -0
  888. package/js/src/static_dependencies/noble-curves/secp256k1.js +6 -0
  889. package/js/src/static_dependencies/noble-hashes/_assert.js +6 -0
  890. package/js/src/static_dependencies/noble-hashes/_blake2.js +6 -0
  891. package/js/src/static_dependencies/noble-hashes/_sha2.js +6 -0
  892. package/js/src/static_dependencies/noble-hashes/_u64.js +6 -0
  893. package/js/src/static_dependencies/noble-hashes/argon2.js +6 -0
  894. package/js/src/static_dependencies/noble-hashes/blake2b.js +6 -0
  895. package/js/src/static_dependencies/noble-hashes/blake2s.js +6 -0
  896. package/js/src/static_dependencies/noble-hashes/blake3.js +6 -0
  897. package/js/src/static_dependencies/noble-hashes/crypto.js +6 -0
  898. package/js/src/static_dependencies/noble-hashes/cryptoNode.js +6 -0
  899. package/js/src/static_dependencies/noble-hashes/eskdf.js +6 -0
  900. package/js/src/static_dependencies/noble-hashes/hkdf.js +6 -0
  901. package/js/src/static_dependencies/noble-hashes/hmac.js +6 -0
  902. package/js/src/static_dependencies/noble-hashes/index.js +6 -0
  903. package/js/src/static_dependencies/noble-hashes/md5.js +6 -0
  904. package/js/src/static_dependencies/noble-hashes/pbkdf2.js +6 -0
  905. package/js/src/static_dependencies/noble-hashes/ripemd160.js +6 -0
  906. package/js/src/static_dependencies/noble-hashes/scrypt.js +6 -0
  907. package/js/src/static_dependencies/noble-hashes/sha1.js +6 -0
  908. package/js/src/static_dependencies/noble-hashes/sha256.js +6 -0
  909. package/js/src/static_dependencies/noble-hashes/sha3-addons.js +6 -0
  910. package/js/src/static_dependencies/noble-hashes/sha3.js +6 -0
  911. package/js/src/static_dependencies/noble-hashes/sha512.js +6 -0
  912. package/js/src/static_dependencies/noble-hashes/utils.js +6 -0
  913. package/js/src/static_dependencies/node-fetch/body.js +6 -0
  914. package/js/src/static_dependencies/node-fetch/errors/abort-error.js +6 -0
  915. package/js/src/static_dependencies/node-fetch/errors/base.js +6 -0
  916. package/js/src/static_dependencies/node-fetch/errors/fetch-error.js +6 -0
  917. package/js/src/static_dependencies/node-fetch/headers.js +6 -0
  918. package/js/src/static_dependencies/node-fetch/index.js +6 -0
  919. package/js/src/static_dependencies/node-fetch/request.js +6 -0
  920. package/js/src/static_dependencies/node-fetch/response.js +6 -0
  921. package/js/src/static_dependencies/node-fetch/utils/get-search.js +6 -0
  922. package/js/src/static_dependencies/node-fetch/utils/is-redirect.js +6 -0
  923. package/js/src/static_dependencies/node-fetch/utils/is.js +6 -0
  924. package/js/src/static_dependencies/node-fetch/utils/referrer.js +6 -0
  925. package/js/src/static_dependencies/proxies/agent-base/helpers.js +6 -0
  926. package/js/src/static_dependencies/proxies/agent-base/index.js +6 -0
  927. package/js/src/static_dependencies/proxies/http-proxy-agent/index.js +6 -0
  928. package/js/src/static_dependencies/proxies/https-proxy-agent/index.js +6 -0
  929. package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +6 -0
  930. package/js/src/static_dependencies/qs/formats.js +6 -0
  931. package/js/src/static_dependencies/qs/index.js +6 -0
  932. package/js/src/static_dependencies/qs/parse.js +6 -0
  933. package/js/src/static_dependencies/qs/stringify.js +6 -0
  934. package/js/src/static_dependencies/qs/utils.js +6 -0
  935. package/js/src/static_dependencies/scure-base/index.js +6 -0
  936. package/js/src/static_dependencies/scure-bip32/index.js +6 -0
  937. package/js/src/static_dependencies/scure-bip39/index.js +6 -0
  938. package/js/src/static_dependencies/scure-bip39/wordlists/english.js +6 -0
  939. package/js/src/static_dependencies/scure-starknet/index.js +6 -0
  940. package/js/src/static_dependencies/starknet/constants.js +6 -0
  941. package/js/src/static_dependencies/starknet/index.js +6 -0
  942. package/js/src/static_dependencies/starknet/types/cairoEnum.js +6 -0
  943. package/js/src/static_dependencies/starknet/types/calldata.js +6 -0
  944. package/js/src/static_dependencies/starknet/types/index.js +6 -0
  945. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +6 -0
  946. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +6 -0
  947. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +6 -0
  948. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +6 -0
  949. package/js/src/static_dependencies/starknet/types/lib/index.js +6 -0
  950. package/js/src/static_dependencies/starknet/types/typedData.js +6 -0
  951. package/js/src/static_dependencies/starknet/utils/address.js +6 -0
  952. package/js/src/static_dependencies/starknet/utils/assert.js +6 -0
  953. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +6 -0
  954. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +6 -0
  955. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +6 -0
  956. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +6 -0
  957. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +6 -0
  958. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +6 -0
  959. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +6 -0
  960. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +6 -0
  961. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +6 -0
  962. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +6 -0
  963. package/js/src/static_dependencies/starknet/utils/calldata/index.js +6 -0
  964. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +6 -0
  965. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +6 -0
  966. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +6 -0
  967. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +6 -0
  968. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +6 -0
  969. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +6 -0
  970. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +6 -0
  971. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +6 -0
  972. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +6 -0
  973. package/js/src/static_dependencies/starknet/utils/encode.js +6 -0
  974. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +6 -0
  975. package/js/src/static_dependencies/starknet/utils/hash/index.js +6 -0
  976. package/js/src/static_dependencies/starknet/utils/merkle.js +6 -0
  977. package/js/src/static_dependencies/starknet/utils/num.js +6 -0
  978. package/js/src/static_dependencies/starknet/utils/selector.js +6 -0
  979. package/js/src/static_dependencies/starknet/utils/shortString.js +6 -0
  980. package/js/src/static_dependencies/starknet/utils/starknetId.js +6 -0
  981. package/js/src/static_dependencies/starknet/utils/typedData.js +6 -0
  982. package/js/src/static_dependencies/starknet/utils/uint256.js +6 -0
  983. package/js/src/static_dependencies/starknet/utils/url.js +6 -0
  984. package/js/src/static_dependencies/watchable/src/index.js +6 -0
  985. package/js/src/static_dependencies/watchable/src/types.js +6 -0
  986. package/js/src/static_dependencies/watchable/src/unpromise.js +6 -0
  987. package/js/src/static_dependencies/zklink/zklink-sdk-web.js +6 -0
  988. package/js/src/tokocrypto.js +6 -0
  989. package/js/src/toobit.js +6 -0
  990. package/js/src/upbit.js +6 -0
  991. package/js/src/wavesexchange.js +6 -0
  992. package/js/src/whitebit.d.ts +1 -1
  993. package/js/src/whitebit.js +27 -2
  994. package/js/src/woo.js +6 -0
  995. package/js/src/woofipro.js +6 -0
  996. package/js/src/xt.js +6 -0
  997. package/js/src/yobit.js +6 -0
  998. package/js/src/zaif.js +6 -0
  999. package/js/src/zebpay.js +6 -0
  1000. package/js/src/zonda.js +6 -0
  1001. package/package.json +1 -1
  1002. package/dist/cjs/src/coincatch.js +0 -5495
  1003. package/dist/cjs/src/pro/coincatch.js +0 -1563
  1004. package/js/src/abstract/coincatch.d.ts +0 -97
  1005. package/js/src/abstract/coincatch.js +0 -5
  1006. package/js/src/coincatch.d.ts +0 -788
  1007. package/js/src/coincatch.js +0 -5488
  1008. package/js/src/pro/coincatch.d.ts +0 -207
  1009. package/js/src/pro/coincatch.js +0 -1556
package/js/src/kucoin.js CHANGED
@@ -1,3 +1,9 @@
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
+
1
7
  // ---------------------------------------------------------------------------
2
8
  import Exchange from './abstract/kucoin.js';
3
9
  import { AccountSuspended, ArgumentsRequired, AuthenticationError, BadRequest, BadSymbol, ExchangeError, ExchangeNotAvailable, InsufficientFunds, InvalidAddress, InvalidNonce, InvalidOrder, NotSupported, OrderNotFound, PermissionDenied, RateLimitExceeded, RestrictedLocation } from './base/errors.js';
@@ -42,10 +48,13 @@ export default class kucoin extends Exchange {
42
48
  'createMarketSellOrderWithCost': true,
43
49
  'createOrder': true,
44
50
  'createOrders': true,
51
+ 'createOrderWithTakeProfitAndStopLoss': true,
45
52
  'createPostOnlyOrder': true,
46
53
  'createStopLimitOrder': true,
54
+ 'createStopLossOrder': true,
47
55
  'createStopMarketOrder': true,
48
56
  'createStopOrder': true,
57
+ 'createTakeProfitOrder': true,
49
58
  'createTriggerOrder': true,
50
59
  'editOrder': true,
51
60
  'fetchAccounts': true,
@@ -84,8 +93,9 @@ export default class kucoin extends Exchange {
84
93
  'fetchMarkPrices': true,
85
94
  'fetchMyTrades': true,
86
95
  'fetchOHLCV': true,
87
- 'fetchOpenInterest': false,
88
- 'fetchOpenInterestHistory': false,
96
+ 'fetchOpenInterest': true,
97
+ 'fetchOpenInterestHistory': true,
98
+ 'fetchOpenInterests': true,
89
99
  'fetchOpenOrders': true,
90
100
  'fetchOrder': true,
91
101
  'fetchOrderBook': true,
@@ -94,7 +104,7 @@ export default class kucoin extends Exchange {
94
104
  'fetchOrderTrades': true,
95
105
  'fetchPosition': true,
96
106
  'fetchPositionADLRank': true,
97
- 'fetchPositionHistory': false,
107
+ 'fetchPositionHistory': true,
98
108
  'fetchPositionMode': true,
99
109
  'fetchPositions': true,
100
110
  'fetchPositionsADLRank': true,
@@ -562,6 +572,7 @@ export default class kucoin extends Exchange {
562
572
  '{accountMode}/order/execution': 8,
563
573
  '{accountMode}/position/open-list': 6,
564
574
  '{accountMode}/position/history': 4,
575
+ 'position/history': 4,
565
576
  '{accountMode}/position/tiers': 40,
566
577
  'sub-account/balance': 10,
567
578
  'user/fee-rate': 6,
@@ -626,6 +637,7 @@ export default class kucoin extends Exchange {
626
637
  '503': ExchangeNotAvailable,
627
638
  '101030': PermissionDenied,
628
639
  '103000': InvalidOrder,
640
+ '112010': PermissionDenied,
629
641
  '130101': BadRequest,
630
642
  '130102': ExchangeError,
631
643
  '130103': OrderNotFound,
@@ -875,15 +887,14 @@ export default class kucoin extends Exchange {
875
887
  },
876
888
  'options': {
877
889
  'hf': undefined,
890
+ 'uta': undefined,
878
891
  'version': 'v1',
879
892
  'symbolSeparator': '-',
880
893
  'fetchMyTradesMethod': 'private_get_fills',
881
894
  'timeDifference': 0,
882
895
  'adjustForTimeDifference': false,
883
896
  'fetchCurrencies': {
884
- 'webApiEnable': true,
885
- 'webApiRetries': 1,
886
- 'webApiMuteFailure': true,
897
+ 'brokenCurrencies': ['00', 'OPEN_ERROR', 'HUF', 'BDT'], // skip buggy entries: https://t.me/KuCoin_API/217798
887
898
  },
888
899
  'fetchMarkets': {
889
900
  'types': ['spot', 'swap', 'future', 'contract'],
@@ -898,6 +909,13 @@ export default class kucoin extends Exchange {
898
909
  'fetchBalance': {
899
910
  'code': 'USDT', // for contract endpoint
900
911
  },
912
+ 'timeInForce': {
913
+ 'IOC': 'IOC',
914
+ 'FOK': 'FOK',
915
+ 'PO': 'PO',
916
+ 'GTD': 'GTT',
917
+ 'RPI': 'RPI',
918
+ },
901
919
  'timeframes': {
902
920
  'swap': {
903
921
  '1m': 1,
@@ -1061,12 +1079,32 @@ export default class kucoin extends Exchange {
1061
1079
  'mining': 'pool',
1062
1080
  'hf': 'trade_hf',
1063
1081
  'contract': 'contract',
1082
+ 'uta': 'unified',
1083
+ 'unified': 'unified',
1084
+ },
1085
+ 'utaAccountsByType': {
1086
+ 'trade': 'SPOT',
1087
+ 'spot': 'SPOT',
1088
+ 'margin': 'CROSS',
1089
+ 'cross': 'CROSS',
1090
+ 'isolated': 'ISOLATED',
1091
+ 'main': 'FUNDING',
1092
+ 'funding': 'FUNDING',
1093
+ 'future': 'FUTURES',
1094
+ 'swap': 'FUTURES',
1095
+ 'contract': 'FUTURES',
1096
+ 'uta': 'unified',
1097
+ 'unified': 'unified',
1064
1098
  },
1065
1099
  'networks': {
1100
+ 'BTC': 'btc',
1066
1101
  'BRC20': 'btc',
1067
1102
  'BTCNATIVESEGWIT': 'bech32',
1103
+ 'ETH': 'eth',
1068
1104
  'ERC20': 'eth',
1105
+ 'TRX': 'trx',
1069
1106
  'TRC20': 'trx',
1107
+ 'HECO': 'heco',
1070
1108
  'HRC20': 'heco',
1071
1109
  'MATIC': 'matic',
1072
1110
  'KCC': 'kcc',
@@ -1081,6 +1119,7 @@ export default class kucoin extends Exchange {
1081
1119
  'TLOS': 'tlos',
1082
1120
  'CFX': 'cfx',
1083
1121
  'ACA': 'aca',
1122
+ 'OP': 'optimism',
1084
1123
  'OPTIMISM': 'optimism',
1085
1124
  'ONT': 'ont',
1086
1125
  'GLMR': 'glmr',
@@ -1271,6 +1310,14 @@ export default class kucoin extends Exchange {
1271
1310
  // 'KLEVER': 'klv',
1272
1311
  // undetermined: xns(insolar), rhoc, luk (luniverse), kts (klimatas), bchn (bitcoin cash node), god (shallow entry), lit (litmus),
1273
1312
  },
1313
+ 'networksById': {
1314
+ 'btc': 'BTC',
1315
+ 'trx': 'TRC20',
1316
+ 'eth': 'ERC20',
1317
+ 'heco': 'HRC20',
1318
+ 'optimism': 'OP',
1319
+ 'op': 'OP',
1320
+ },
1274
1321
  'marginModes': {
1275
1322
  'cross': 'MARGIN_TRADE',
1276
1323
  'isolated': 'MARGIN_ISOLATED_TRADE',
@@ -1354,7 +1401,11 @@ export default class kucoin extends Exchange {
1354
1401
  'stopLossPrice': true,
1355
1402
  'takeProfitPrice': true,
1356
1403
  'attachedStopLossTakeProfit': {
1357
- 'triggerPriceType': undefined,
1404
+ 'triggerPriceType': {
1405
+ 'last': true,
1406
+ 'mark': true,
1407
+ 'index': true,
1408
+ },
1358
1409
  'price': true,
1359
1410
  },
1360
1411
  'timeInForce': {
@@ -1480,8 +1531,8 @@ export default class kucoin extends Exchange {
1480
1531
  * @returns {object} a [status structure]{@link https://docs.ccxt.com/?id=exchange-status-structure}
1481
1532
  */
1482
1533
  async fetchStatus(params = {}) {
1483
- let uta = undefined;
1484
- [uta, params] = this.handleOptionAndParams(params, 'fetchStatus', 'uta', false);
1534
+ let uta = false;
1535
+ [uta, params] = this.handleOptionAndParams(params, 'fetchStatus', 'uta', uta);
1485
1536
  let type = undefined;
1486
1537
  [type, params] = this.handleMarketTypeAndParams('fetchStatus', undefined, params);
1487
1538
  let response = undefined;
@@ -1552,8 +1603,8 @@ export default class kucoin extends Exchange {
1552
1603
  async fetchMarkets(params = {}) {
1553
1604
  let fetchTickersFees = undefined;
1554
1605
  [fetchTickersFees, params] = this.handleOptionAndParams(params, 'fetchMarkets', 'fetchTickersFees', true);
1555
- let uta = undefined;
1556
- [uta, params] = this.handleOptionAndParams(params, 'fetchMarkets', 'uta', false);
1606
+ let uta = false;
1607
+ [uta, params] = this.handleOptionAndParams(params, 'fetchMarkets', 'uta', uta);
1557
1608
  if (uta) {
1558
1609
  return await this.fetchUTAMarkets(params);
1559
1610
  }
@@ -2089,7 +2140,7 @@ export default class kucoin extends Exchange {
2089
2140
  'strike': undefined,
2090
2141
  'optionType': undefined,
2091
2142
  'precision': {
2092
- 'amount': this.safeNumber(market, 'lotSize'),
2143
+ 'amount': this.safeNumber2(market, 'lotSize', 'baseOrderStep'),
2093
2144
  'price': this.safeNumber(market, 'tickSize'),
2094
2145
  },
2095
2146
  'limits': {
@@ -2161,9 +2212,13 @@ export default class kucoin extends Exchange {
2161
2212
  */
2162
2213
  async fetchCurrencies(params = {}) {
2163
2214
  let uta = false;
2215
+ if (this.checkRequiredCredentials(false)) {
2216
+ uta = await this.isUTAEnabled();
2217
+ }
2164
2218
  [uta, params] = this.handleOptionAndParams(params, 'fetchCurrencies', 'uta', uta);
2165
2219
  let response = undefined;
2166
2220
  if (uta) {
2221
+ response = await this.utaGetAssetCurrencies(params);
2167
2222
  //
2168
2223
  // {
2169
2224
  // "code": "200000",
@@ -2198,7 +2253,6 @@ export default class kucoin extends Exchange {
2198
2253
  // ]
2199
2254
  // }
2200
2255
  //
2201
- response = await this.utaGetAssetCurrencies(params);
2202
2256
  }
2203
2257
  else {
2204
2258
  //
@@ -2241,64 +2295,61 @@ export default class kucoin extends Exchange {
2241
2295
  response = await this.publicGetCurrencies(params);
2242
2296
  }
2243
2297
  const currenciesData = this.safeList(response, 'data', []);
2244
- const brokenCurrencies = this.safeList(this.options, 'brokenCurrencies', ['00', 'OPEN_ERROR', 'HUF', 'BDT']);
2245
- const result = {};
2246
- for (let i = 0; i < currenciesData.length; i++) {
2247
- const entry = currenciesData[i];
2248
- const id = this.safeString(entry, 'currency');
2249
- if (this.inArray(id, brokenCurrencies)) {
2250
- continue; // skip buggy entries: https://t.me/KuCoin_API/217798
2251
- }
2252
- const code = this.safeCurrencyCode(id);
2253
- const networks = {};
2254
- const chains = this.safeList2(entry, 'chains', 'items', []);
2255
- const chainsLength = chains.length;
2256
- for (let j = 0; j < chainsLength; j++) {
2257
- const chain = chains[j];
2258
- const chainId = this.safeString(chain, 'chainId');
2259
- const networkCode = this.networkIdToCode(chainId, code);
2260
- networks[networkCode] = {
2261
- 'info': chain,
2262
- 'id': chainId,
2263
- 'name': this.safeString(chain, 'chainName'),
2264
- 'code': networkCode,
2265
- 'active': undefined,
2266
- 'fee': this.safeNumber2(chain, 'withdrawalMinFee', 'minWithdrawFee'),
2267
- 'deposit': this.safeBool(chain, 'isDepositEnabled'),
2268
- 'withdraw': this.safeBool(chain, 'isWithdrawEnabled'),
2269
- 'precision': this.parseNumber(this.parsePrecision(this.safeString(chain, 'withdrawPrecision'))),
2270
- 'limits': {
2271
- 'withdraw': {
2272
- 'min': this.safeNumber2(chain, 'withdrawalMinSize', 'minWithdrawSize'),
2273
- 'max': this.safeNumber2(chain, 'maxWithdraw', 'maxWithdrawSize'),
2274
- },
2275
- 'deposit': {
2276
- 'min': this.safeNumber2(chain, 'depositMinSize', 'minDepositSize'),
2277
- 'max': this.safeNumber2(chain, 'maxDeposit', 'maxDepositSize'),
2278
- },
2279
- },
2280
- };
2281
- }
2282
- // kucoin has determined 'fiat' currencies with below logic
2283
- const rawPrecision = this.safeString(entry, 'precision');
2284
- const precision = this.parseNumber(this.parsePrecision(rawPrecision));
2285
- const isFiat = chainsLength === 0;
2286
- result[code] = this.safeCurrencyStructure({
2287
- 'id': id,
2288
- 'name': this.safeString(entry, 'fullName'),
2289
- 'code': code,
2290
- 'type': isFiat ? 'fiat' : 'crypto',
2291
- 'precision': precision,
2292
- 'info': entry,
2293
- 'networks': networks,
2294
- 'deposit': undefined,
2295
- 'withdraw': undefined,
2298
+ const brokenCurrencies = this.handleOption('fetchCurrencies', 'brokenCurrencies', []);
2299
+ const filteredCurrencies = this.filterOutByArray(currenciesData, 'currency', brokenCurrencies); // remove broken entries
2300
+ return this.parseCurrencies(filteredCurrencies);
2301
+ }
2302
+ parseCurrency(currency) {
2303
+ const entry = currency;
2304
+ const id = this.safeString(entry, 'currency');
2305
+ const code = this.safeCurrencyCode(id);
2306
+ const networks = {};
2307
+ const chains = this.safeList2(entry, 'chains', 'items', []);
2308
+ const chainsLength = chains.length;
2309
+ for (let j = 0; j < chainsLength; j++) {
2310
+ const chain = chains[j];
2311
+ const chainId = this.safeString(chain, 'chainId');
2312
+ const networkCode = this.networkIdToCode(chainId, code);
2313
+ networks[networkCode] = {
2314
+ 'info': chain,
2315
+ 'id': chainId,
2316
+ 'name': this.safeString(chain, 'chainName'),
2317
+ 'code': networkCode,
2296
2318
  'active': undefined,
2297
- 'fee': undefined,
2298
- 'limits': undefined,
2299
- });
2319
+ 'fee': this.safeNumber2(chain, 'withdrawalMinFee', 'minWithdrawFee'),
2320
+ 'deposit': this.safeBool(chain, 'isDepositEnabled'),
2321
+ 'withdraw': this.safeBool(chain, 'isWithdrawEnabled'),
2322
+ 'precision': this.parseNumber(this.parsePrecision(this.safeString(chain, 'withdrawPrecision'))),
2323
+ 'limits': {
2324
+ 'withdraw': {
2325
+ 'min': this.safeNumber2(chain, 'withdrawalMinSize', 'minWithdrawSize'),
2326
+ 'max': this.safeNumber2(chain, 'maxWithdraw', 'maxWithdrawSize'),
2327
+ },
2328
+ 'deposit': {
2329
+ 'min': this.safeNumber2(chain, 'depositMinSize', 'minDepositSize'),
2330
+ 'max': this.safeNumber2(chain, 'maxDeposit', 'maxDepositSize'),
2331
+ },
2332
+ },
2333
+ };
2300
2334
  }
2301
- return result;
2335
+ // kucoin has determined 'fiat' currencies with below logic
2336
+ const rawPrecision = this.safeString(entry, 'precision');
2337
+ const precision = this.parseNumber(this.parsePrecision(rawPrecision));
2338
+ const isFiat = chainsLength === 0;
2339
+ return this.safeCurrencyStructure({
2340
+ 'id': id,
2341
+ 'name': this.safeString(entry, 'fullName'),
2342
+ 'code': code,
2343
+ 'type': isFiat ? 'fiat' : 'crypto',
2344
+ 'precision': precision,
2345
+ 'info': entry,
2346
+ 'networks': networks,
2347
+ 'deposit': undefined,
2348
+ 'withdraw': undefined,
2349
+ 'active': undefined,
2350
+ 'fee': undefined,
2351
+ 'limits': undefined,
2352
+ });
2302
2353
  }
2303
2354
  /**
2304
2355
  * @method
@@ -2306,41 +2357,68 @@ export default class kucoin extends Exchange {
2306
2357
  * @description fetch all the accounts associated with a profile
2307
2358
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-list-spot
2308
2359
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2360
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
2309
2361
  * @returns {object} a dictionary of [account structures]{@link https://docs.ccxt.com/?id=account-structure} indexed by the account type
2310
2362
  */
2311
2363
  async fetchAccounts(params = {}) {
2312
- const response = await this.privateGetAccounts(params);
2313
- //
2314
- // {
2315
- // "code": "200000",
2316
- // "data": [
2317
- // {
2318
- // "balance": "0.00009788",
2319
- // "available": "0.00009788",
2320
- // "holds": "0",
2321
- // "currency": "BTC",
2322
- // "id": "5c6a4fd399a1d81c4f9cc4d0",
2323
- // "type": "trade"
2324
- // },
2325
- // {
2326
- // "balance": "0.00000001",
2327
- // "available": "0.00000001",
2328
- // "holds": "0",
2329
- // "currency": "ETH",
2330
- // "id": "5c6a49ec99a1d819392e8e9f",
2331
- // "type": "trade"
2332
- // }
2333
- // ]
2334
- // }
2335
- //
2336
- const data = this.safeList(response, 'data', []);
2364
+ let uta = await this.isUTAEnabled();
2365
+ [uta, params] = this.handleOptionAndParams(params, 'fetchAccounts', 'uta', uta);
2366
+ let response = undefined;
2367
+ let data = [];
2368
+ if (uta) {
2369
+ response = await this.utaPrivateGetAccountModeAccountOverview(this.extend(params, { 'accountMode': 'unified' }));
2370
+ //
2371
+ // {
2372
+ // "code": "200000",
2373
+ // "data": {
2374
+ // "accountType": "UNIFIED",
2375
+ // "riskRatio": "0.0000000000",
2376
+ // "equity": "30.0000000000",
2377
+ // "liability": "0.0000000000",
2378
+ // "availableMargin": "30.0000000000",
2379
+ // "adjustedEquity": "30.0000000000",
2380
+ // "im": "0.0000000000",
2381
+ // "mm": "0.0000000000"
2382
+ // }
2383
+ // }
2384
+ //
2385
+ const dataDict = this.safeDict(response, 'data', {});
2386
+ data = [dataDict];
2387
+ }
2388
+ else {
2389
+ //
2390
+ // {
2391
+ // "code": "200000",
2392
+ // "data": [
2393
+ // {
2394
+ // "balance": "0.00009788",
2395
+ // "available": "0.00009788",
2396
+ // "holds": "0",
2397
+ // "currency": "BTC",
2398
+ // "id": "5c6a4fd399a1d81c4f9cc4d0",
2399
+ // "type": "trade"
2400
+ // },
2401
+ // {
2402
+ // "balance": "0.00000001",
2403
+ // "available": "0.00000001",
2404
+ // "holds": "0",
2405
+ // "currency": "ETH",
2406
+ // "id": "5c6a49ec99a1d819392e8e9f",
2407
+ // "type": "trade"
2408
+ // }
2409
+ // ]
2410
+ // }
2411
+ //
2412
+ response = await this.privateGetAccounts(params);
2413
+ data = this.safeList(response, 'data', []);
2414
+ }
2337
2415
  const result = [];
2338
2416
  for (let i = 0; i < data.length; i++) {
2339
2417
  const account = data[i];
2340
2418
  const accountId = this.safeString(account, 'id');
2341
2419
  const currencyId = this.safeString(account, 'currency');
2342
2420
  const code = this.safeCurrencyCode(currencyId);
2343
- const type = this.safeString(account, 'type'); // main or trade
2421
+ const type = this.safeStringLower2(account, 'type', 'accountType'); // main or trade or unified
2344
2422
  result.push({
2345
2423
  'id': accountId,
2346
2424
  'type': type,
@@ -2369,7 +2447,7 @@ export default class kucoin extends Exchange {
2369
2447
  let networkCode = undefined;
2370
2448
  [networkCode, params] = this.handleNetworkCodeAndParams(params);
2371
2449
  if (networkCode !== undefined) {
2372
- request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
2450
+ request['chain'] = this.networkCodeToId(networkCode, currency['code']).toLowerCase();
2373
2451
  }
2374
2452
  const response = await this.privateGetWithdrawalsQuotas(this.extend(request, params));
2375
2453
  const data = this.safeDict(response, 'data', {});
@@ -2400,7 +2478,7 @@ export default class kucoin extends Exchange {
2400
2478
  let networkCode = undefined;
2401
2479
  [networkCode, params] = this.handleNetworkCodeAndParams(params);
2402
2480
  if (networkCode !== undefined) {
2403
- request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
2481
+ request['chain'] = this.networkCodeToId(networkCode, currency['code']).toLowerCase();
2404
2482
  }
2405
2483
  const response = await this.privateGetWithdrawalsQuotas(this.extend(request, params));
2406
2484
  //
@@ -2457,7 +2535,8 @@ export default class kucoin extends Exchange {
2457
2535
  const chains = this.safeList(fee, 'chains', []);
2458
2536
  for (let i = 0; i < chains.length; i++) {
2459
2537
  const chain = chains[i];
2460
- const networkCodeNew = this.networkIdToCode(this.safeString(chain, 'chainId'), this.safeString(currency, 'code'));
2538
+ const chainId = this.safeString(chain, 'chainId');
2539
+ const networkCodeNew = this.networkIdToCode(chainId, this.safeString(currency, 'code'));
2461
2540
  resultNew['networks'][networkCodeNew] = {
2462
2541
  'withdraw': {
2463
2542
  'fee': this.safeNumber2(chain, 'withdrawalMinFee', 'withdrawMinFee'),
@@ -2485,7 +2564,9 @@ export default class kucoin extends Exchange {
2485
2564
  'networks': {},
2486
2565
  };
2487
2566
  const networkId = this.safeString(fee, 'chain');
2488
- const networkCode = this.networkIdToCode(networkId, this.safeString(currency, 'code'));
2567
+ const currencyId = this.safeString(fee, 'currency');
2568
+ currency = this.safeCurrency(currencyId, currency);
2569
+ const networkCode = this.networkIdToCode(networkId, currency['code']);
2489
2570
  result['networks'][networkCode] = {
2490
2571
  'withdraw': minWithdrawFee,
2491
2572
  'deposit': {
@@ -2770,8 +2851,8 @@ export default class kucoin extends Exchange {
2770
2851
  await this.loadMarkets();
2771
2852
  const request = {};
2772
2853
  symbols = this.marketSymbols(symbols, undefined, true, true);
2773
- let uta = undefined;
2774
- [uta, params] = this.handleOptionAndParams(params, 'fetchTickers', 'uta', false);
2854
+ let uta = false;
2855
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTickers', 'uta', uta);
2775
2856
  const tradeType = this.safeString(params, 'tradeType');
2776
2857
  let firstMarket = undefined;
2777
2858
  if (symbols !== undefined) {
@@ -2971,8 +3052,8 @@ export default class kucoin extends Exchange {
2971
3052
  const request = {
2972
3053
  'symbol': market['id'],
2973
3054
  };
2974
- let uta = undefined;
2975
- [uta, params] = this.handleOptionAndParams(params, 'fetchTicker', 'uta', false);
3055
+ let uta = false;
3056
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTicker', 'uta', uta);
2976
3057
  let response = undefined;
2977
3058
  let result = undefined;
2978
3059
  let type = undefined;
@@ -3145,8 +3226,8 @@ export default class kucoin extends Exchange {
3145
3226
  async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
3146
3227
  await this.loadMarkets();
3147
3228
  const market = this.market(symbol);
3148
- let uta = undefined;
3149
- [uta, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'uta', false);
3229
+ let uta = false;
3230
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'uta', uta);
3150
3231
  if (uta) {
3151
3232
  return await this.fetchUTAOHLCV(symbol, timeframe, since, limit, params);
3152
3233
  }
@@ -3367,7 +3448,7 @@ export default class kucoin extends Exchange {
3367
3448
  let networkCode = undefined;
3368
3449
  [networkCode, params] = this.handleNetworkCodeAndParams(params);
3369
3450
  if (networkCode !== undefined) {
3370
- request['chain'] = this.networkCodeToId(networkCode); // docs mention "chain-name", but seems "chain-id" is used, like in "fetchDepositAddress"
3451
+ request['chain'] = this.networkCodeToId(networkCode, currency['code']); // docs mention "chain-name", but seems "chain-id" is used, like in "fetchDepositAddress"
3371
3452
  }
3372
3453
  const response = await this.privatePostDepositAddressCreate(this.extend(request, params));
3373
3454
  // {"code":"260000","msg":"Deposit address already exists."}
@@ -3393,10 +3474,12 @@ export default class kucoin extends Exchange {
3393
3474
  * @name kucoin#fetchDepositAddress
3394
3475
  * @description fetch the deposit address for a currency associated with this account
3395
3476
  * @see https://www.kucoin.com/docs-new/rest/account-info/deposit/get-deposit-address-v3/en
3477
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-deposit-address
3396
3478
  * @param {string} code unified currency code
3397
3479
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3398
3480
  * @param {string} [params.network] the blockchain network name
3399
- * @param {string} [params.accountType] 'main' or 'contract' (default is 'main')
3481
+ * @param {string} [params.accountType] 'main', 'contract' or 'uta' (default is 'main')
3482
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
3400
3483
  * @returns {object} an [address structure]{@link https://docs.ccxt.com/?id=address-structure}
3401
3484
  */
3402
3485
  async fetchDepositAddress(code, params = {}) {
@@ -3405,9 +3488,14 @@ export default class kucoin extends Exchange {
3405
3488
  [accountType, params] = this.handleOptionAndParams(params, 'fetchDepositAddress', 'accountType', accountType);
3406
3489
  const accountsByType = this.safeDict(this.options, 'accountsByType', {});
3407
3490
  accountType = this.safeString(accountsByType, accountType, accountType);
3491
+ let uta = await this.isUTAEnabled();
3492
+ [uta, params] = this.handleOptionAndParams(params, 'fetchDepositAddress', 'uta', uta);
3408
3493
  if (accountType === 'contract') {
3409
3494
  return await this.fetchContractDepositAddress(code, params);
3410
3495
  }
3496
+ else if (uta || (accountType === 'uta') || (accountType === 'unified')) {
3497
+ return await super.fetchDepositAddress(code, this.extend(params, { 'uta': true }));
3498
+ }
3411
3499
  const currency = this.currency(code);
3412
3500
  const request = {
3413
3501
  'currency': currency['id'],
@@ -3418,7 +3506,7 @@ export default class kucoin extends Exchange {
3418
3506
  let networkCode = undefined;
3419
3507
  [networkCode, params] = this.handleNetworkCodeAndParams(params);
3420
3508
  if (networkCode !== undefined) {
3421
- request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
3509
+ request['chain'] = this.networkCodeToId(networkCode, currency['code']).toLowerCase();
3422
3510
  }
3423
3511
  const version = this.options['versions']['private']['GET']['deposit-addresses'];
3424
3512
  this.options['versions']['private']['GET']['deposit-addresses'] = 'v1';
@@ -3486,10 +3574,11 @@ export default class kucoin extends Exchange {
3486
3574
  this.checkAddress(address);
3487
3575
  }
3488
3576
  }
3577
+ const chainId = this.safeString(depositAddress, 'chainId');
3489
3578
  return {
3490
3579
  'info': depositAddress,
3491
3580
  'currency': code,
3492
- 'network': this.networkIdToCode(this.safeString(depositAddress, 'chainId')),
3581
+ 'network': this.networkIdToCode(chainId, code),
3493
3582
  'address': address,
3494
3583
  'tag': this.safeString(depositAddress, 'memo'),
3495
3584
  };
@@ -3498,9 +3587,11 @@ export default class kucoin extends Exchange {
3498
3587
  * @method
3499
3588
  * @name kucoin#fetchDepositAddressesByNetwork
3500
3589
  * @see https://www.kucoin.com/docs-new/rest/account-info/deposit/get-deposit-address-v3/en
3590
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-deposit-address
3501
3591
  * @description fetch the deposit address for a currency associated with this account
3502
3592
  * @param {string} code unified currency code
3503
3593
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3594
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
3504
3595
  * @returns {object} an array of [address structures]{@link https://docs.ccxt.com/?id=address-structure}
3505
3596
  */
3506
3597
  async fetchDepositAddressesByNetwork(code, params = {}) {
@@ -3509,25 +3600,56 @@ export default class kucoin extends Exchange {
3509
3600
  const request = {
3510
3601
  'currency': currency['id'],
3511
3602
  };
3512
- const version = this.options['versions']['private']['GET']['deposit-addresses'];
3513
- this.options['versions']['private']['GET']['deposit-addresses'] = 'v2';
3514
- const response = await this.privateGetDepositAddresses(this.extend(request, params));
3515
- //
3516
- // {
3517
- // "code": "200000",
3518
- // "data": [
3519
- // {
3520
- // "address": "fr1qvus7d4d5fgxj5e7zvqe6yhxd7txm95h2and69r",
3521
- // "memo": "",
3522
- // "chain": "BTC-Segwit",
3523
- // "contractAddress": ""
3524
- // },
3525
- // {"address":"37icNMEWbiF8ZkwUMxmfzMxi2A1MQ44bMn","memo":"","chain":"BTC","contractAddress":""},
3526
- // {"address":"Deposit temporarily blocked","memo":"","chain":"TRC20","contractAddress":""}
3527
- // ]
3528
- // }
3529
- //
3530
- this.options['versions']['private']['GET']['deposit-addresses'] = version;
3603
+ let uta = await this.isUTAEnabled();
3604
+ [uta, params] = this.handleOptionAndParams(params, 'fetchDepositAddressesByNetwork', 'uta', uta);
3605
+ let response = undefined;
3606
+ if (uta) {
3607
+ let networkCode = undefined;
3608
+ [networkCode, params] = this.handleNetworkCodeAndParams(params);
3609
+ if (networkCode !== undefined) {
3610
+ request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
3611
+ }
3612
+ //
3613
+ // {
3614
+ // "code": "200000",
3615
+ // "data": [
3616
+ // {
3617
+ // "address": "0xf30a9b6968183668dbce515bd6449438ab3252b3",
3618
+ // "memo": "",
3619
+ // "remark": "",
3620
+ // "chainId": "eth",
3621
+ // "to": "FUNDING",
3622
+ // "expirationDate": 0,
3623
+ // "currency": "USDT",
3624
+ // "contractAddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
3625
+ // "chainName": "ERC20"
3626
+ // }
3627
+ // ]
3628
+ // }
3629
+ //
3630
+ response = await this.utaPrivateGetAssetDepositAddress(this.extend(request, params));
3631
+ }
3632
+ else {
3633
+ const version = this.options['versions']['private']['GET']['deposit-addresses'];
3634
+ this.options['versions']['private']['GET']['deposit-addresses'] = 'v2';
3635
+ response = await this.privateGetDepositAddresses(this.extend(request, params));
3636
+ //
3637
+ // {
3638
+ // "code": "200000",
3639
+ // "data": [
3640
+ // {
3641
+ // "address": "fr1qvus7d4d5fgxj5e7zvqe6yhxd7txm95h2and69r",
3642
+ // "memo": "",
3643
+ // "chain": "BTC-Segwit",
3644
+ // "contractAddress": ""
3645
+ // },
3646
+ // {"address":"37icNMEWbiF8ZkwUMxmfzMxi2A1MQ44bMn","memo":"","chain":"BTC","contractAddress":""},
3647
+ // {"address":"Deposit temporarily blocked","memo":"","chain":"TRC20","contractAddress":""}
3648
+ // ]
3649
+ // }
3650
+ //
3651
+ this.options['versions']['private']['GET']['deposit-addresses'] = version;
3652
+ }
3531
3653
  const chains = this.safeList(response, 'data', []);
3532
3654
  const parsed = this.parseDepositAddresses(chains, [currency['code']], false, {
3533
3655
  'currency': currency['code'],
@@ -3554,8 +3676,8 @@ export default class kucoin extends Exchange {
3554
3676
  const level = this.safeInteger(params, 'level', 2);
3555
3677
  const request = { 'symbol': market['id'] };
3556
3678
  const isAuthenticated = this.checkRequiredCredentials(false);
3557
- let uta = undefined;
3558
- [uta, params] = this.handleOptionAndParams(params, 'fetchOrderBook', 'uta', false);
3679
+ let uta = false;
3680
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOrderBook', 'uta', uta);
3559
3681
  let response = undefined;
3560
3682
  let type = undefined;
3561
3683
  [type, params] = this.handleMarketTypeAndParams('fetchOrderBook', market, params);
@@ -3709,19 +3831,26 @@ export default class kucoin extends Exchange {
3709
3831
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/add-order
3710
3832
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/add-order-test
3711
3833
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/add-take-profit-and-stop-loss-order
3834
+ * @see https://www.kucoin.com/docs-new/rest/ua/place-order
3712
3835
  * @param {string} symbol Unified CCXT market symbol
3713
3836
  * @param {string} type 'limit' or 'market'
3714
3837
  * @param {string} side 'buy' or 'sell'
3715
3838
  * @param {float} amount the amount of currency to trade
3716
3839
  * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
3717
3840
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3718
- * Check createSpotOrder() and createContractOrder() for more details on the extra parameters that can be used in params
3841
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
3842
+ * Check createSpotOrder(), createContractOrder() and createUtaOrder () for more details on the extra parameters that can be used in params
3719
3843
  * @returns {object} an [order structure]{@link https://docs.ccxt.com/?id=order-structure}
3720
3844
  */
3721
3845
  async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
3722
3846
  await this.loadMarkets();
3723
3847
  const market = this.market(symbol);
3724
- if (market['spot']) {
3848
+ let uta = await this.isUTAEnabled();
3849
+ [uta, params] = this.handleOptionAndParams(params, 'createOrder', 'uta', uta);
3850
+ if (uta) {
3851
+ return await this.createUtaOrder(symbol, type, side, amount, price, params);
3852
+ }
3853
+ else if (market['spot']) {
3725
3854
  return await this.createSpotOrder(symbol, type, side, amount, price, params);
3726
3855
  }
3727
3856
  else if (market['contract']) {
@@ -3751,7 +3880,7 @@ export default class kucoin extends Exchange {
3751
3880
  * @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
3752
3881
  * @param {string} [params.marginMode] 'cross', // cross (cross mode) and isolated (isolated mode), set to cross by default, the isolated mode will be released soon, stay tuned
3753
3882
  * @param {string} [params.timeInForce] GTC, GTT, IOC, or FOK, default is GTC, limit orders only
3754
- * @param {string} [params.postOnly] Post only flag, invalid when timeInForce is IOC or FOK
3883
+ * @param {bool} [params.postOnly] Post only flag, invalid when timeInForce is IOC or FOK
3755
3884
  *
3756
3885
  * EXCHANGE SPECIFIC PARAMETERS
3757
3886
  * @param {string} [params.clientOid] client order id, defaults to uuid if not passed
@@ -3944,7 +4073,7 @@ export default class kucoin extends Exchange {
3944
4073
  * @param {float} [params.takeProfitPrice] price to trigger take-profit orders
3945
4074
  * @param {bool} [params.reduceOnly] A mark to reduce the position size only. Set to false by default. Need to set the position size when reduceOnly is true.
3946
4075
  * @param {string} [params.timeInForce] GTC, GTT, IOC, or FOK, default is GTC, limit orders only
3947
- * @param {string} [params.postOnly] Post only flag, invalid when timeInForce is IOC or FOK
4076
+ * @param {bool} [params.postOnly] Post only flag, invalid when timeInForce is IOC or FOK
3948
4077
  * @param {float} [params.cost] the cost of the order in units of USDT
3949
4078
  * @param {string} [params.marginMode] 'cross' or 'isolated', default is 'isolated'
3950
4079
  * @param {bool} [params.hedged] *swap and future only* true for hedged mode, false for one way mode, default is false
@@ -4114,6 +4243,223 @@ export default class kucoin extends Exchange {
4114
4243
  params = this.omit(params, ['timeInForce', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice', 'reduceOnly', 'hedged']); // Time in force only valid for limit orders, exchange error when gtc for market orders
4115
4244
  return this.extend(request, params);
4116
4245
  }
4246
+ /**
4247
+ * @method
4248
+ * @name kucoin#createUtaOrder
4249
+ * @description helper method for creating uta orders
4250
+ * @see https://www.kucoin.com/docs-new/rest/ua/place-order
4251
+ * @param {string} symbol Unified CCXT market symbol
4252
+ * @param {string} type 'limit' or 'market'
4253
+ * @param {string} side 'buy' or 'sell'
4254
+ * @param {float} amount the amount of currency to trade
4255
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
4256
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
4257
+ * @param {string} [params.clientOrderId] client order id, defaults to uuid if not passed
4258
+ * @param {float} [params.cost] the cost of the order in units of quote currency
4259
+ * @param {string} [params.timeInForce] GTC, GTD, IOC, FOK or PO
4260
+ * @param {bool} [params.postOnly] Post only flag, invalid when timeInForce is IOC or FOK (default is false)
4261
+ * @param {bool} [params.reduceOnly] *contract markets only* A mark to reduce the position size only. Set to false by default
4262
+ * @param {float} [params.triggerPrice] The price a trigger order is triggered at
4263
+ * @param {string} [params.triggerDirection] 'ascending' or 'descending', the direction the triggerPrice is triggered from, requires triggerPrice
4264
+ * @param {string} [params.triggerPriceType] *contract markets only* "last", "mark", "index" - defaults to "mark"
4265
+ * @param {float} [params.stopLossPrice] price to trigger stop-loss orders
4266
+ * @param {float} [params.takeProfitPrice] price to trigger take-profit orders
4267
+ * @param {string} [params.marginMode] 'cross' or 'isolated', (default is 'cross' for margin orders, default is 'isolated' for contract orders)
4268
+ *
4269
+ * Exchange-specific parameters -------------------------------------------------
4270
+ * @param {string} [params.accountMode] 'unified' or 'classic', default is 'unified'
4271
+ * @param {string} [params.stp] '', // self trade prevention, CN, CO, CB or DC
4272
+ * @param {int} [params.cancelAfter] - Cancel After N Seconds (Calculated from the time of entering the matching engine), only effective when timeInForce is GTD
4273
+ * @param {string} [params.sizeUnit] *contracts only* 'BASECCY' (amount of base currency) or 'UNIT' (number of contracts), default is 'UNIT'
4274
+ *
4275
+ * Classic account parameters
4276
+ * @param {bool} [params.autoBorrow] *classic margin orders only*
4277
+ * @param {bool} [params.autoRepay] *classic margin orders only*
4278
+ * @param {string} [params.hedged] *classic contract orders only* true for hedged mode, false for one way mode, default is false
4279
+ * @param {int} [params.leverage] *classic contract orders with isolated marginMode only* Leverage size of the order
4280
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/?id=order-structure}
4281
+ */
4282
+ async createUtaOrder(symbol, type, side, amount, price = undefined, params = {}) {
4283
+ await this.loadMarkets();
4284
+ const request = this.createUtaOrderRequest(symbol, type, side, amount, price, params);
4285
+ const response = await this.utaPrivatePostAccountModeOrderPlace(request);
4286
+ //
4287
+ // {
4288
+ // "code": "200000",
4289
+ // "data": {
4290
+ // "orderId": "426319129738321920",
4291
+ // "tradeType": "SPOT",
4292
+ // "ts": 1774455603216000000,
4293
+ // "clientOid": "b896c118-a674-4863-baf4-a9ea3cd696c5"
4294
+ // }
4295
+ // }
4296
+ //
4297
+ const data = this.safeDict(response, 'data', {});
4298
+ return this.parseOrder(data);
4299
+ }
4300
+ createUtaOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
4301
+ const market = this.market(symbol);
4302
+ const isSpot = market['spot'];
4303
+ const isContract = market['contract'];
4304
+ let accountMode = 'unified';
4305
+ [accountMode, params] = this.handleOptionAndParams(params, 'createOrder', 'accountMode', accountMode);
4306
+ const isUnified = (accountMode === 'unified');
4307
+ let marginMode = undefined;
4308
+ [marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
4309
+ const marginModeDefined = (marginMode !== undefined);
4310
+ const isSpotMargin = (isSpot && marginModeDefined);
4311
+ if (isSpotMargin && isUnified) {
4312
+ throw new NotSupported(this.id + ' createOrder() does not support spot margin orders with unified accountMode');
4313
+ }
4314
+ const tradeType = this.handleTradeType(isContract, marginMode, params);
4315
+ const clientOrderId = this.safeString2(params, 'clientOid', 'clientOrderId', this.uuid());
4316
+ params = this.omit(params, ['clientOid', 'clientOrderId']);
4317
+ const request = {
4318
+ 'accountMode': accountMode,
4319
+ 'tradeType': tradeType,
4320
+ 'clientOid': clientOrderId,
4321
+ 'symbol': market['id'],
4322
+ // 'triggerDirection'- 'UP' or 'DOWN (required for trigger orders, supported for classic-FUTURES and unified-SPOT and unified-FUTURES)
4323
+ // 'triggerPriceType' - 'TP', 'IP', 'MP' (required for trigger orders, supported for classic-FUTURES and unified-SPOT and unified-FUTURES)
4324
+ // 'triggerPrice' (required for trigger orders)
4325
+ 'side': side.toUpperCase(),
4326
+ 'orderType': type.toUpperCase(),
4327
+ // 'size'
4328
+ // 'sizeUnit' - 'BASECCY', 'QUOTECCY' (for market SPOT) or 'UNIT' (for unified-FUTURES)
4329
+ // 'price'
4330
+ // 'timeInForce' - 'GTC', 'IOC', 'FOK', 'GTT' or 'RPI' (GTT is not supported for FUTURES)
4331
+ // 'postOnly'
4332
+ // 'reduceOnly' (only for FUTURES)
4333
+ // 'stp' - 'CN', 'CO', 'CB' or 'DC' (DC is not supported for FUTURES)
4334
+ // 'cancelAfter' - time in seconds (only valid when timeInForce is GTT, not supported for FUTURES)
4335
+ // 'tags'
4336
+ // 'autoBorrow' (only for classic-CROSS and classic-ISOLATED)
4337
+ // 'autoRepay' (only for classic-CROSS and classic-ISOLATED)
4338
+ // 'positionSide' - 'BOTH', 'LONG' or 'SHORT' (only for classic-FUTURES)
4339
+ // 'marginMode' - 'ISOLATED' or 'CROSS' (only for classic-FUTURES, default is 'ISOLATED')
4340
+ // 'leverage' (only for classic-FUTURES-ISOLATED, required)
4341
+ // 'tpTriggerPriceType' - 'TP', 'IP', 'MP' (only for unified-FUTURES and classic-FUTURES)
4342
+ // 'tpTriggerPrice' (only for unified-FUTURES and classic-FUTURES)
4343
+ // 'slTriggerPriceType' - 'TP', 'IP', 'MP' (only for unified-FUTURES and classic-FUTURES)
4344
+ // 'slTriggerPrice' (only for unified-FUTURES and classic-FUTURES)
4345
+ };
4346
+ if (tradeType !== undefined) {
4347
+ request['tradeType'] = tradeType;
4348
+ }
4349
+ request['clientOid'] = clientOrderId;
4350
+ const isMarketOrder = (type === 'market');
4351
+ const cost = this.safeString(params, 'cost');
4352
+ if (cost !== undefined) {
4353
+ params = this.omit(params, 'cost');
4354
+ if (isSpot && isMarketOrder) {
4355
+ request['sizeUnit'] = 'QUOTECCY';
4356
+ request['size'] = this.marketOrderAmountToPrecision(symbol, cost);
4357
+ }
4358
+ else {
4359
+ throw new NotSupported(this.id + ' createOrder() with cost is supported for spot market orders only');
4360
+ }
4361
+ }
4362
+ else {
4363
+ let sizeUnit = 'BASECCY';
4364
+ if (isContract) {
4365
+ [sizeUnit, params] = this.handleOptionAndParams(params, 'createOrder', 'sizeUnit', 'UNIT');
4366
+ }
4367
+ request['sizeUnit'] = sizeUnit;
4368
+ request['size'] = this.amountToPrecision(symbol, amount);
4369
+ }
4370
+ if (!isMarketOrder) {
4371
+ request['price'] = this.priceToPrecision(symbol, price);
4372
+ }
4373
+ let postOnly = undefined;
4374
+ [postOnly, params] = this.handlePostOnly(isMarketOrder, false, params);
4375
+ const timeInForce = this.handleTimeInForce(params);
4376
+ if ((timeInForce !== undefined)) {
4377
+ params = this.omit(params, 'timeInForce');
4378
+ request['timeInForce'] = timeInForce;
4379
+ }
4380
+ if (postOnly) {
4381
+ request['postOnly'] = true;
4382
+ }
4383
+ if (isContract) {
4384
+ if (!isUnified) {
4385
+ if (marginModeDefined) {
4386
+ request['marginMode'] = marginMode.toUpperCase();
4387
+ if (marginMode === 'isolated') {
4388
+ const leverage = this.safeInteger(params, 'leverage');
4389
+ if (leverage === undefined) {
4390
+ request['leverage'] = 1;
4391
+ }
4392
+ }
4393
+ }
4394
+ const reduceOnly = this.safeBool(params, 'reduceOnly', false);
4395
+ let hedged = false;
4396
+ [hedged, params] = this.handleParamBool(params, 'hedged', hedged);
4397
+ if (hedged) {
4398
+ let positionSide = (side === 'buy') ? 'LONG' : 'SHORT';
4399
+ if (reduceOnly) {
4400
+ positionSide = (positionSide === 'LONG') ? 'SHORT' : 'LONG';
4401
+ }
4402
+ request['positionSide'] = positionSide;
4403
+ }
4404
+ }
4405
+ }
4406
+ // handling with coinditional orders
4407
+ const [triggerPrice, stopLossPrice, takeProfitPrice] = this.handleTriggerPrices(params);
4408
+ const stopLoss = this.safeDict(params, 'stopLoss');
4409
+ const takeProfit = this.safeDict(params, 'takeProfit');
4410
+ const hasStopLoss = stopLoss !== undefined;
4411
+ const hasTakeProfit = takeProfit !== undefined;
4412
+ const triggerPriceTypes = {
4413
+ 'mark': 'MP',
4414
+ 'last': 'TP',
4415
+ 'index': 'IP',
4416
+ };
4417
+ if (triggerPrice) {
4418
+ const triggerDirection = this.safeString(params, 'triggerDirection');
4419
+ if (triggerDirection === undefined) {
4420
+ throw new ArgumentsRequired(this.id + ' createOrder() requires a triggerDirection parameter for trigger orders. Provide params.tringgerDirection or use params.stopLossPrice or params.takeProfitPrice instead of params.triggerPrice');
4421
+ }
4422
+ request['triggerDirection'] = (triggerDirection === 'ascending') ? 'UP' : 'DOWN';
4423
+ request['triggerPrice'] = this.priceToPrecision(symbol, triggerPrice);
4424
+ }
4425
+ else if (hasStopLoss || hasTakeProfit) {
4426
+ if (!isContract) {
4427
+ throw new NotSupported(this.id + ' createOrder() stopLoss and takeProfit parameters are only supported for contract orders');
4428
+ }
4429
+ if (hasStopLoss) {
4430
+ const slTriggerPrice = this.safeString2(stopLoss, 'triggerPrice', 'stopPrice');
4431
+ const slTriggerPriceType = this.safeString(stopLoss, 'triggerPriceType', 'mark');
4432
+ request['slTriggerPrice'] = this.priceToPrecision(symbol, slTriggerPrice);
4433
+ request['slTriggerPriceType'] = this.safeString(triggerPriceTypes, slTriggerPriceType, slTriggerPriceType);
4434
+ }
4435
+ if (hasTakeProfit) {
4436
+ const tpTriggerPrice = this.safeString2(takeProfit, 'triggerPrice', 'takeProfitPrice');
4437
+ const tpTriggerPriceType = this.safeString(takeProfit, 'triggerPriceType', 'mark');
4438
+ request['tpTriggerPrice'] = this.priceToPrecision(symbol, tpTriggerPrice);
4439
+ request['tpTriggerPriceType'] = this.safeString(triggerPriceTypes, tpTriggerPriceType, tpTriggerPriceType);
4440
+ }
4441
+ }
4442
+ else if (stopLossPrice || takeProfitPrice) {
4443
+ if (stopLossPrice) {
4444
+ request['triggerDirection'] = (side === 'buy') ? 'UP' : 'DOWN';
4445
+ request['triggerPrice'] = this.priceToPrecision(symbol, stopLossPrice);
4446
+ if (isContract) {
4447
+ const stopLossPriceType = this.safeString2(params, 'stopLossPriceType', 'triggerPriceType', 'mark');
4448
+ request['triggerPriceType'] = this.safeString(triggerPriceTypes, stopLossPriceType, stopLossPriceType);
4449
+ }
4450
+ }
4451
+ else {
4452
+ request['triggerDirection'] = (side === 'buy') ? 'DOWN' : 'UP';
4453
+ request['triggerPrice'] = this.priceToPrecision(symbol, takeProfitPrice);
4454
+ if (isContract) {
4455
+ const takeProfitPriceType = this.safeString2(params, 'takeProfitPriceType', 'triggerPriceType', 'mark');
4456
+ request['triggerPriceType'] = this.safeString(triggerPriceTypes, takeProfitPriceType, takeProfitPriceType);
4457
+ }
4458
+ }
4459
+ }
4460
+ params = this.omit(params, ['triggerPrice', 'stopLossPrice', 'takeProfitPrice', 'stopPriceType', 'stopLossPriceType', 'takeProfitPriceType', 'triggerPriceType', 'triggerDirection', 'stopLoss', 'takeProfit', 'hedged']);
4461
+ return this.extend(request, params);
4462
+ }
4117
4463
  /**
4118
4464
  * @method
4119
4465
  * @name kucoin#createMarketOrderWithCost
@@ -4405,16 +4751,23 @@ export default class kucoin extends Exchange {
4405
4751
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/cancel-stop-order-by-clientoid
4406
4752
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/cancel-order-by-orderld
4407
4753
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/cancel-order-by-clientoid
4754
+ * @see https://www.kucoin.com/docs-new/rest/ua/cancel-order
4408
4755
  * @param {string} id order id
4409
4756
  * @param {string} symbol unified symbol of the market the order was made in
4410
4757
  * @param {object} [params] extra parameters specific to the exchange API endpoint
4411
4758
  * @param {string} [params.type] 'spot' or 'swap', used if symbol is not provided (default is 'spot')
4412
4759
  * @param {string} [params.marginMode] *spot only* 'cross' or 'isolated'
4760
+ * @param {boolean} [params.uta] true for cancelling order with unified account endpoint (default is false)
4413
4761
  * Check cancelSpotOrder() and cancelContractOrder() for more details on the extra parameters that can be used in params
4414
4762
  * @returns Response from the exchange
4415
4763
  */
4416
4764
  async cancelOrder(id, symbol = undefined, params = {}) {
4417
4765
  await this.loadMarkets();
4766
+ let uta = await this.isUTAEnabled();
4767
+ [uta, params] = this.handleOptionAndParams(params, 'cancelOrder', 'uta', uta);
4768
+ if (uta) {
4769
+ return await this.cancelUtaOrder(id, symbol, params);
4770
+ }
4418
4771
  let marketType = undefined;
4419
4772
  let market = undefined;
4420
4773
  if (symbol !== undefined) {
@@ -4631,6 +4984,61 @@ export default class kucoin extends Exchange {
4631
4984
  //
4632
4985
  return this.safeOrder({ 'info': response });
4633
4986
  }
4987
+ /**
4988
+ * @method
4989
+ * @name kucoin#cancelUtaOrder
4990
+ * @description helper method for cancelling uta orders
4991
+ * @see https://www.kucoin.com/docs-new/rest/ua/cancel-order
4992
+ * @param {string} id order id
4993
+ * @param {string} symbol unified symbol of the market the order was made in
4994
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
4995
+ * @param {string} [params.accountMode] 'unified' or 'classic' (default is 'unified')
4996
+ * @param {string} [params.clientOrderId] client order id, required if id is not provided
4997
+ * @param {string} [params.marginMode] 'cross' or 'isolated', required if fetching a margin order
4998
+ * @returns Response from the exchange
4999
+ */
5000
+ async cancelUtaOrder(id, symbol = undefined, params = {}) {
5001
+ if (symbol === undefined) {
5002
+ throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument for uta endpoint');
5003
+ }
5004
+ await this.loadMarkets();
5005
+ const request = {};
5006
+ const clientOrderId = this.safeString2(params, 'clientOid', 'clientOrderId');
5007
+ if (clientOrderId !== undefined) {
5008
+ request['clientOid'] = clientOrderId;
5009
+ params = this.omit(params, ['clientOid', 'clientOrderId']);
5010
+ }
5011
+ else {
5012
+ if (id === undefined) {
5013
+ throw new ArgumentsRequired(this.id + ' fetchOrder() requires an id argument or clientOrderId parameter');
5014
+ }
5015
+ request['orderId'] = id;
5016
+ }
5017
+ await this.loadMarkets();
5018
+ const market = this.market(symbol);
5019
+ request['symbol'] = market['id'];
5020
+ let accountMode = 'unified';
5021
+ [accountMode, params] = this.handleOptionAndParams(params, 'fetchOrder', 'accountMode', accountMode);
5022
+ request['accountMode'] = accountMode;
5023
+ let marginMode = undefined;
5024
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrder', params);
5025
+ const tradeType = this.handleTradeType(market['contract'], marginMode, params);
5026
+ request['tradeType'] = tradeType;
5027
+ const response = await this.utaPrivatePostAccountModeOrderCancel(this.extend(request, params));
5028
+ //
5029
+ // {
5030
+ // "code": "200000",
5031
+ // "data": {
5032
+ // "orderId": "426319129738321920",
5033
+ // "tradeType": "SPOT",
5034
+ // "ts": 1774457628105000000,
5035
+ // "clientOid": "b896c118-a674-4863-baf4-a9ea3cd696c5"
5036
+ // }
5037
+ // }
5038
+ //
5039
+ const data = this.safeDict(response, 'data', {});
5040
+ return this.parseOrder(data, market);
5041
+ }
4634
5042
  /**
4635
5043
  * @method
4636
5044
  * @name kucoin#cancelAllOrders
@@ -4642,14 +5050,22 @@ export default class kucoin extends Exchange {
4642
5050
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/batch-cancel-stop-orders
4643
5051
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/cancel-all-orders
4644
5052
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/cancel-all-stop-orders
5053
+ * @see https://www.kucoin.com/docs-new/rest/ua/batch-cancel-order-by-symbol
4645
5054
  * @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
4646
5055
  * @param {object} [params] extra parameters specific to the exchange API endpoint
4647
5056
  * @param {string} [params.type] 'spot' or 'swap', used if symbol is not provided (default is 'spot')
4648
5057
  * @param {string} [params.marginMode] *spot only* 'cross' or 'isolated'
5058
+ * @param {boolean} [params.uta] true for cancelling orders with unified account endpoint (default is false)
5059
+ * Check cancelAllSpotOrders(), cancelAllContractOrders() and cancelAllUtaOrders() for more details on the extra parameters that can be used in params
4649
5060
  * @returns Response from the exchange
4650
5061
  */
4651
5062
  async cancelAllOrders(symbol = undefined, params = {}) {
4652
5063
  await this.loadMarkets();
5064
+ let uta = await this.isUTAEnabled();
5065
+ [uta, params] = this.handleOptionAndParams(params, 'cancelAllOrders', 'uta', uta);
5066
+ if (uta) {
5067
+ return await this.cancelAllUtaOrders(symbol, params);
5068
+ }
4653
5069
  let marketType = undefined;
4654
5070
  let market = undefined;
4655
5071
  if (symbol !== undefined) {
@@ -4767,26 +5183,78 @@ export default class kucoin extends Exchange {
4767
5183
  }
4768
5184
  /**
4769
5185
  * @method
4770
- * @name kucoin#fetchOrdersByStatus
4771
- * @description fetches a list of orders placed on the exchange
4772
- * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-open-orders
4773
- * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-closed-orders
4774
- * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-stop-orders-list
4775
- * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-open-orders
4776
- * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-closed-orders
4777
- * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-stop-order-list
4778
- * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-order-list
4779
- * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-stop-order-list
4780
- * @param {string} status 'active' or 'closed', only 'active' is valid for stop orders
4781
- * @param {string} symbol unified symbol for the market to retrieve orders from
4782
- * @param {int} [since] timestamp in ms of the earliest order to retrieve
4783
- * @param {int} [limit] The maximum number of orders to retrieve
5186
+ * @name kucoin#cancelAllUtaOrders
5187
+ * @description helper method for cancelling all uta orders
5188
+ * @see https://www.kucoin.com/docs-new/rest/ua/batch-cancel-order-by-symbol
5189
+ * @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
5190
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
5191
+ * @param {bool} [params.trigger] true if cancelling all stop orders
5192
+ * @param {string} [params.marginMode] 'CROSS' or 'ISOLATED'
5193
+ * @returns Response from the exchange
5194
+ */
5195
+ async cancelAllUtaOrders(symbol = undefined, params = {}) {
5196
+ if (symbol === undefined) {
5197
+ throw new ArgumentsRequired(this.id + ' cancelAllOrders() requires a symbol argument for uta endpoint');
5198
+ }
5199
+ await this.loadMarkets();
5200
+ const market = this.market(symbol);
5201
+ const isContract = market['contract'];
5202
+ const tradeType = isContract ? 'FUTURES' : 'SPOT';
5203
+ let trigger = false;
5204
+ [trigger, params] = this.handleParamBool(params, 'trigger', trigger);
5205
+ const orderFilter = trigger ? 'ADVANCED' : 'NORMAL';
5206
+ const request = {
5207
+ 'accountMode': 'unified',
5208
+ 'symbol': market['id'],
5209
+ 'tradeType': tradeType,
5210
+ 'orderFilter': orderFilter,
5211
+ };
5212
+ const response = await this.utaPrivatePostAccountModeOrderCancelAll(this.extend(request, params));
5213
+ //
5214
+ // {
5215
+ // "code": "200000",
5216
+ // "data": {
5217
+ // "tradeType": "SPOT",
5218
+ // "ts": 1774458644140000000,
5219
+ // "items": [
5220
+ // {
5221
+ // "orderId": "426328635071352832"
5222
+ // }
5223
+ // ]
5224
+ // }
5225
+ // }
5226
+ //
5227
+ const data = this.safeDict(response, 'data', {});
5228
+ const orders = this.safeList(data, 'items', []);
5229
+ return this.parseOrders(orders, market, undefined, undefined, { 'status': 'canceled' });
5230
+ }
5231
+ /**
5232
+ * @method
5233
+ * @name kucoin#fetchOrdersByStatus
5234
+ * @description fetches a list of orders placed on the exchange
5235
+ * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-open-orders
5236
+ * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-closed-orders
5237
+ * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-stop-orders-list
5238
+ * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-open-orders
5239
+ * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-closed-orders
5240
+ * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-stop-order-list
5241
+ * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-order-list
5242
+ * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-stop-order-list
5243
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-open-order-list
5244
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-order-history
5245
+ * @param {string} status 'active' or 'closed', only 'active' is valid for stop orders
5246
+ * @param {string} symbol unified symbol for the market to retrieve orders from
5247
+ * @param {int} [since] timestamp in ms of the earliest order to retrieve
5248
+ * @param {int} [limit] The maximum number of orders to retrieve
4784
5249
  * @param {object} [params] exchange specific parameters
4785
- * Check fetchSpotOrdersByStatus() and fetchContractOrdersByStatus() for more details on the extra parameters that can be used in params
5250
+ * @param {boolean} [params.uta] true for fetch orders with uta endpoint (default is false)
5251
+ * Check fetchSpotOrdersByStatus(), fetchContractOrdersByStatus() and fetchUtaOrdersByStatus() for more details on the extra parameters that can be used in params
4786
5252
  * @returns An [array of order structures]{@link https://docs.ccxt.com/?id=order-structure}
4787
5253
  */
4788
5254
  async fetchOrdersByStatus(status, symbol = undefined, since = undefined, limit = undefined, params = {}) {
4789
5255
  await this.loadMarkets();
5256
+ let uta = await this.isUTAEnabled();
5257
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOrdersByStatus', 'uta', uta);
4790
5258
  let marketType = undefined;
4791
5259
  if (symbol === undefined) {
4792
5260
  const type = this.safeString(params, 'type'); // exchange has specific param for order type
@@ -4796,14 +5264,26 @@ export default class kucoin extends Exchange {
4796
5264
  params = this.omit(params, 'type');
4797
5265
  }
4798
5266
  else {
4799
- [marketType, params] = this.handleMarketTypeAndParams('fetchOrdersByStatus', undefined, {});
5267
+ const methodOptions = this.safeDict(this.options, 'fetchOrdersByStatus', {});
5268
+ const methodDefaultType = this.safeString2(methodOptions, 'defaultType', 'type');
5269
+ if (methodDefaultType === undefined) {
5270
+ marketType = this.safeString2(this.options, 'defaultType', 'type', 'spot');
5271
+ }
5272
+ else {
5273
+ marketType = methodDefaultType;
5274
+ }
4800
5275
  }
4801
5276
  }
4802
5277
  else {
4803
5278
  const market = this.market(symbol);
4804
5279
  marketType = market['type'];
4805
5280
  }
4806
- if ((marketType === 'spot') || (marketType === 'margin')) {
5281
+ if (uta) {
5282
+ params = this.omit(params, 'uta');
5283
+ params = this.extend(params, { 'marketType': marketType });
5284
+ return await this.fetchUtaOrdersByStatus(status, symbol, since, limit, params);
5285
+ }
5286
+ else if ((marketType === 'spot') || (marketType === 'margin')) {
4807
5287
  return await this.fetchSpotOrdersByStatus(status, symbol, since, limit, params);
4808
5288
  }
4809
5289
  else {
@@ -5068,6 +5548,128 @@ export default class kucoin extends Exchange {
5068
5548
  const orders = this.safeList(responseData, 'items', []);
5069
5549
  return this.parseOrders(orders, market, since, limit);
5070
5550
  }
5551
+ /**
5552
+ * @method
5553
+ * @name kucoin#fetchUtaOrdersByStatus
5554
+ * @description helper method for fetching orders by status with uta endpoint
5555
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-open-order-list
5556
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-order-history
5557
+ * @param {string} status 'active' or 'closed', only 'active' is valid for stop orders
5558
+ * @param {string} symbol unified symbol for the market to retrieve orders from
5559
+ * @param {int} [since] timestamp in ms of the earliest order to retrieve
5560
+ * @param {int} [limit] The maximum number of orders to retrieve
5561
+ * @param {object} [params] exchange specific parameters
5562
+ * @param {int} [params.until] End time in ms
5563
+ * @param {string} [params.side] *closed orders only* 'BUY' or 'SELL'
5564
+ * @param {string} [params.accountMode] 'unified' or 'classic' (default is unified)
5565
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
5566
+ * @returns An [array of order structures]{@link https://docs.ccxt.com/?id=order-structure}
5567
+ */
5568
+ async fetchUtaOrdersByStatus(status, symbol = undefined, since = undefined, limit = undefined, params = {}) {
5569
+ await this.loadMarkets();
5570
+ let paginate = false;
5571
+ const maxLimit = 200;
5572
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOrdersByStatus', 'paginate');
5573
+ if (paginate) {
5574
+ return await this.fetchPaginatedCallDynamic('fetchOrdersByStatus', symbol, since, limit, params, maxLimit);
5575
+ }
5576
+ let accountMode = 'unified';
5577
+ [accountMode, params] = this.handleOptionAndParams(params, 'fetchUtaOrdersByStatus', 'accountMode', accountMode);
5578
+ let request = {
5579
+ 'accountMode': accountMode,
5580
+ };
5581
+ let marketType = undefined;
5582
+ let market = undefined;
5583
+ if (symbol !== undefined) {
5584
+ market = this.market(symbol);
5585
+ marketType = market['type'];
5586
+ request['symbol'] = market['id'];
5587
+ }
5588
+ else {
5589
+ marketType = this.safeString(params, 'marketType');
5590
+ }
5591
+ params = this.omit(params, 'marketType');
5592
+ const isContract = (marketType !== 'spot') && (marketType !== 'margin');
5593
+ if (!isContract && (symbol === undefined)) {
5594
+ throw new ArgumentsRequired(this.id + ' fetchOrdersByStatus() requires a symbol argument for spot and margin markets when using uta endpoint');
5595
+ }
5596
+ let marginMode = undefined;
5597
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrdersByStatus', params);
5598
+ const tradeType = this.handleTradeType(isContract, marginMode, params);
5599
+ params['tradeType'] = tradeType;
5600
+ if (since !== undefined) {
5601
+ request['startAt'] = since;
5602
+ }
5603
+ [request, params] = this.handleUntilOption('endAt', request, params);
5604
+ if (limit !== undefined) {
5605
+ request['pageSize'] = limit;
5606
+ }
5607
+ let lowercaseStatus = status.toLowerCase();
5608
+ if (lowercaseStatus === 'open') {
5609
+ lowercaseStatus = 'active';
5610
+ }
5611
+ else if (lowercaseStatus === 'closed') {
5612
+ lowercaseStatus = 'done';
5613
+ }
5614
+ let response = undefined;
5615
+ if (lowercaseStatus === 'active') {
5616
+ //
5617
+ // {
5618
+ // "code": "200000",
5619
+ // "data": {
5620
+ // "pageNumber": 1,
5621
+ // "pageSize": 50,
5622
+ // "totalNum": 1,
5623
+ // "totalPage": 1,
5624
+ // "items": [
5625
+ // {
5626
+ // "orderId": "426328635071352832",
5627
+ // "symbol": "ETH-USDT",
5628
+ // "orderType": "LIMIT",
5629
+ // "side": "BUY",
5630
+ // "size": "0.001",
5631
+ // "price": "1000",
5632
+ // "timeInForce": "GTC",
5633
+ // "tags": "partner:ccxt",
5634
+ // "orderTime": 1774457869404794617,
5635
+ // "stp": "",
5636
+ // "cancelAfter": null,
5637
+ // "postOnly": false,
5638
+ // "reduceOnly": false,
5639
+ // "triggerDirection": "",
5640
+ // "triggerPrice": "",
5641
+ // "triggerPriceType": "",
5642
+ // "tpTriggerPrice": "",
5643
+ // "tpTriggerPriceType": "",
5644
+ // "slTriggerPrice": "",
5645
+ // "slTriggerPriceType": "",
5646
+ // "filledSize": "0",
5647
+ // "avgPrice": "0",
5648
+ // "fee": "0",
5649
+ // "feeCurrency": "USDT",
5650
+ // "tax": "0",
5651
+ // "updatedTime": 1774457869469028819,
5652
+ // "triggerOrderId": "",
5653
+ // "cancelReason": "",
5654
+ // "cancelSize": "0",
5655
+ // "clientOid": "708987d5-c346-487a-a70c-ea267377b0ca",
5656
+ // "sizeUnit": "BASECCY",
5657
+ // "status": 2
5658
+ // }
5659
+ // ],
5660
+ // "tradeType": "SPOT"
5661
+ // }
5662
+ // }
5663
+ //
5664
+ response = await this.utaPrivateGetAccountModeOrderOpenList(this.extend(request, params));
5665
+ }
5666
+ else {
5667
+ response = await this.utaPrivateGetAccountModeOrderHistory(this.extend(request, params));
5668
+ }
5669
+ const data = this.safeDict(response, 'data', {});
5670
+ const orders = this.safeList(data, 'items', []);
5671
+ return this.parseOrders(orders, market, since, limit);
5672
+ }
5071
5673
  /**
5072
5674
  * @method
5073
5675
  * @name kucoin#fetchClosedOrders
@@ -5078,6 +5680,7 @@ export default class kucoin extends Exchange {
5078
5680
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-stop-order-list
5079
5681
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-open-orders
5080
5682
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-closed-orders
5683
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-order-history
5081
5684
  * @param {string} symbol unified market symbol of the market orders were made in
5082
5685
  * @param {int} [since] the earliest time in ms to fetch orders for
5083
5686
  * @param {int} [limit] the maximum number of order structures to retrieve
@@ -5111,6 +5714,7 @@ export default class kucoin extends Exchange {
5111
5714
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-open-orders
5112
5715
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-closed-orders
5113
5716
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-stop-order-list
5717
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-open-order-list
5114
5718
  * @param {string} symbol unified market symbol
5115
5719
  * @param {int} [since] the earliest time in ms to fetch open orders for
5116
5720
  * @param {int} [limit] the maximum number of open orders structures to retrieve
@@ -5149,15 +5753,23 @@ export default class kucoin extends Exchange {
5149
5753
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-stop-order-by-clientoid
5150
5754
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-order-by-orderld
5151
5755
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/get-stop-order-by-clientoid
5756
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-order-details
5152
5757
  * @param {string} id order id
5153
5758
  * @param {string} symbol unified symbol of the market the order was made in
5154
5759
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5155
5760
  * @param {string} [params.type] 'spot' or 'swap', used if symbol is not provided (default is 'spot')
5156
- * Check fetchSpotOrder() and fetchContractOrder() for more details on the extra parameters that can be used in params
5761
+ * @param {bool} [params.uta] true if fetching an order with uta endpoint (default is false)
5762
+ * Check fetchSpotOrder(), fetchContractOrder() and fetchUtaOrder() for more details on the extra parameters that can be used in params
5157
5763
  * @returns {object} An [order structure]{@link https://docs.ccxt.com/?id=order-structure}
5158
5764
  */
5159
5765
  async fetchOrder(id, symbol = undefined, params = {}) {
5160
5766
  await this.loadMarkets();
5767
+ let uta = await this.isUTAEnabled();
5768
+ [uta, params] = this.handleOptionAndParams(params, 'fetchOrder', 'uta', uta);
5769
+ if (uta) {
5770
+ params = this.omit(params, 'uta');
5771
+ return await this.fetchUtaOrder(id, symbol, params);
5772
+ }
5161
5773
  let marketType = undefined;
5162
5774
  if (symbol === undefined) {
5163
5775
  [marketType, params] = this.handleMarketTypeAndParams('fetchOrder', undefined, params);
@@ -5348,7 +5960,115 @@ export default class kucoin extends Exchange {
5348
5960
  const responseData = this.safeDict(response, 'data');
5349
5961
  return this.parseOrder(responseData, market);
5350
5962
  }
5963
+ /**
5964
+ * @method
5965
+ * @name kucoin#fetchUtaOrder
5966
+ * @description fetch uta order
5967
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-order-details
5968
+ * @param {string} id order id
5969
+ * @param {string} symbol unified symbol of the market the order was made in
5970
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
5971
+ * @param {string} [params.accountMode] 'unified' or 'classic' (default is 'unified')
5972
+ * @param {string} [params.clientOrderId] client order id, required if id is not provided
5973
+ * @param {string} [params.marginMode] 'cross' or 'isolated', required if fetching a margin order
5974
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/?id=order-structure}
5975
+ */
5976
+ async fetchUtaOrder(id, symbol = undefined, params = {}) {
5977
+ if (symbol === undefined) {
5978
+ throw new ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument for uta orders');
5979
+ }
5980
+ const request = {};
5981
+ const clientOrderId = this.safeString2(params, 'clientOid', 'clientOrderId');
5982
+ if (clientOrderId !== undefined) {
5983
+ request['clientOid'] = clientOrderId;
5984
+ params = this.omit(params, ['clientOid', 'clientOrderId']);
5985
+ }
5986
+ else {
5987
+ if (id === undefined) {
5988
+ throw new ArgumentsRequired(this.id + ' fetchOrder() requires an id argument or clientOrderId parameter');
5989
+ }
5990
+ request['orderId'] = id;
5991
+ }
5992
+ await this.loadMarkets();
5993
+ const market = this.market(symbol);
5994
+ request['symbol'] = market['id'];
5995
+ let accountMode = 'unified';
5996
+ [accountMode, params] = this.handleOptionAndParams(params, 'fetchOrder', 'accountMode', accountMode);
5997
+ request['accountMode'] = accountMode;
5998
+ let marginMode = undefined;
5999
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrder', params);
6000
+ const tradeType = this.handleTradeType(market['contract'], marginMode, params);
6001
+ request['tradeType'] = tradeType;
6002
+ const response = await this.utaPrivateGetAccountModeOrderDetail(this.extend(request, params));
6003
+ //
6004
+ // {
6005
+ // "code": "200000",
6006
+ // "data": {
6007
+ // "orderId": "426319129738321920",
6008
+ // "symbol": "ETH-USDT",
6009
+ // "orderType": "LIMIT",
6010
+ // "side": "BUY",
6011
+ // "size": "0.001",
6012
+ // "price": "1000",
6013
+ // "timeInForce": "GTC",
6014
+ // "tags": "partner:ccxt",
6015
+ // "orderTime": 1774455603156417582,
6016
+ // "stp": "",
6017
+ // "cancelAfter": null,
6018
+ // "postOnly": false,
6019
+ // "reduceOnly": false,
6020
+ // "triggerDirection": "",
6021
+ // "triggerPrice": "",
6022
+ // "triggerPriceType": "",
6023
+ // "tpTriggerPrice": "",
6024
+ // "tpTriggerPriceType": "",
6025
+ // "slTriggerPrice": "",
6026
+ // "slTriggerPriceType": "",
6027
+ // "filledSize": "0",
6028
+ // "avgPrice": "0",
6029
+ // "fee": "0",
6030
+ // "feeCurrency": "USDT",
6031
+ // "tax": "0",
6032
+ // "updatedTime": 1774455603371523690,
6033
+ // "triggerOrderId": "",
6034
+ // "cancelReason": "",
6035
+ // "cancelSize": "0",
6036
+ // "clientOid": "b896c118-a674-4863-baf4-a9ea3cd696c5",
6037
+ // "sizeUnit": "BASECCY",
6038
+ // "tradeType": "SPOT",
6039
+ // "tradeId": "",
6040
+ // "status": 2
6041
+ // }
6042
+ // }
6043
+ //
6044
+ const data = this.safeDict(response, 'data', {});
6045
+ return this.parseOrder(data, market);
6046
+ }
6047
+ handleTradeType(isContractMarket = false, marginMode = undefined, params = {}) {
6048
+ let tradeType = this.safeString(params, 'tradeType');
6049
+ if (tradeType === undefined) {
6050
+ if (isContractMarket) {
6051
+ tradeType = 'FUTURES';
6052
+ }
6053
+ else if (marginMode !== undefined) {
6054
+ tradeType = marginMode.toUpperCase();
6055
+ }
6056
+ else {
6057
+ tradeType = 'SPOT';
6058
+ }
6059
+ }
6060
+ return tradeType;
6061
+ }
5351
6062
  parseOrder(order, market = undefined) {
6063
+ const tradeType = this.safeString(order, 'tradeType');
6064
+ const utaTradeTypes = ['SPOT', 'CROSS', 'ISOLATED', 'FUTURES']; // tradeType specific for uta endpoint
6065
+ let isUtaOrder = this.inArray(tradeType, utaTradeTypes);
6066
+ if ('sizeUnit' in order) { // property specific for uta endpoint
6067
+ isUtaOrder = true;
6068
+ }
6069
+ if (isUtaOrder) {
6070
+ return this.parseUtaOrder(order, market);
6071
+ }
5352
6072
  const marketId = this.safeString(order, 'symbol');
5353
6073
  market = this.safeMarket(marketId, market);
5354
6074
  if ((market !== undefined) && (market['contract'])) {
@@ -5673,6 +6393,128 @@ export default class kucoin extends Exchange {
5673
6393
  'trades': undefined,
5674
6394
  }, market);
5675
6395
  }
6396
+ parseUtaOrder(order, market = undefined) {
6397
+ //
6398
+ // createOrder
6399
+ // {
6400
+ // "orderId": "426319129738321920",
6401
+ // "tradeType": "SPOT",
6402
+ // "ts": 1774455603216000000,
6403
+ // "clientOid": "b896c118-a674-4863-baf4-a9ea3cd696c5"
6404
+ // }
6405
+ //
6406
+ // fetchOrder
6407
+ // {
6408
+ // "orderId": "426319129738321920",
6409
+ // "symbol": "ETH-USDT",
6410
+ // "orderType": "LIMIT",
6411
+ // "side": "BUY",
6412
+ // "size": "0.001",
6413
+ // "price": "1000",
6414
+ // "timeInForce": "GTC",
6415
+ // "tags": "partner:ccxt",
6416
+ // "orderTime": 1774455603156417582,
6417
+ // "stp": "",
6418
+ // "cancelAfter": null,
6419
+ // "postOnly": false,
6420
+ // "reduceOnly": false,
6421
+ // "triggerDirection": "",
6422
+ // "triggerPrice": "",
6423
+ // "triggerPriceType": "",
6424
+ // "tpTriggerPrice": "",
6425
+ // "tpTriggerPriceType": "",
6426
+ // "slTriggerPrice": "",
6427
+ // "slTriggerPriceType": "",
6428
+ // "filledSize": "0",
6429
+ // "avgPrice": "0",
6430
+ // "fee": "0",
6431
+ // "feeCurrency": "USDT",
6432
+ // "tax": "0",
6433
+ // "updatedTime": 1774455603371523690,
6434
+ // "triggerOrderId": "",
6435
+ // "cancelReason": "",
6436
+ // "cancelSize": "0",
6437
+ // "clientOid": "b896c118-a674-4863-baf4-a9ea3cd696c5",
6438
+ // "sizeUnit": "BASECCY",
6439
+ // "tradeType": "SPOT",
6440
+ // "tradeId": "",
6441
+ // "status": 2
6442
+ // }
6443
+ //
6444
+ const marketId = this.safeString(order, 'symbol');
6445
+ market = this.safeMarket(marketId, market);
6446
+ const symbol = market['symbol'];
6447
+ const timestamp = this.safeIntegerProduct2(order, 'orderTime', 'ts', 0.000001);
6448
+ const lastUpdateTimestamp = this.safeIntegerProduct(order, 'updatedTime', 0.000001);
6449
+ const rawTimeInForce = this.safeString(order, 'timeInForce');
6450
+ let amount = undefined;
6451
+ let cost = undefined;
6452
+ const sizeUnit = this.safeString(order, 'sizeUnit');
6453
+ const size = this.safeString(order, 'size');
6454
+ const rawStatus = this.safeString(order, 'status');
6455
+ const average = this.safeString(order, 'avgPrice');
6456
+ let filled = this.safeString(order, 'filledSize'); // might be in base or quote, need to check sizeUnit
6457
+ if ((sizeUnit === 'BASECCY') || (sizeUnit === 'UNIT')) {
6458
+ amount = size;
6459
+ }
6460
+ else {
6461
+ cost = filled;
6462
+ filled = Precise.stringDiv(filled, average);
6463
+ filled = this.amountToPrecision(symbol, filled);
6464
+ }
6465
+ const fee = {
6466
+ 'currency': this.safeCurrencyCode(this.safeString(order, 'feeCurrency')),
6467
+ 'cost': this.safeString(order, 'fee'),
6468
+ };
6469
+ return this.safeOrder({
6470
+ 'id': this.safeString(order, 'orderId'),
6471
+ 'clientOrderId': this.safeString(order, 'clientOid'),
6472
+ 'symbol': symbol,
6473
+ 'type': this.safeStringLower(order, 'orderType'),
6474
+ 'timeInForce': this.parseOrderTimeInForce(rawTimeInForce),
6475
+ 'postOnly': this.safeBool(order, 'postOnly'),
6476
+ 'reduceOnly': this.safeBool(order, 'reduceOnly'),
6477
+ 'side': this.safeStringLower(order, 'side'),
6478
+ 'amount': amount,
6479
+ 'price': this.safeString(order, 'price'),
6480
+ 'triggerPrice': this.safeString2(order, 'stopPrice', 'triggerPrice'),
6481
+ 'cost': cost,
6482
+ 'filled': filled,
6483
+ 'remaining': undefined,
6484
+ 'timestamp': timestamp,
6485
+ 'datetime': this.iso8601(timestamp),
6486
+ 'fee': fee,
6487
+ 'status': this.parseOrderStatus(rawStatus),
6488
+ 'lastTradeTimestamp': undefined,
6489
+ 'lastUpdateTimestamp': lastUpdateTimestamp,
6490
+ 'average': average,
6491
+ 'trades': undefined,
6492
+ 'stopLossPrice': this.safeString(order, 'slTriggerPrice'),
6493
+ 'takeProfitPrice': this.safeString(order, 'tpTriggerPrice'),
6494
+ 'info': order,
6495
+ }, market);
6496
+ }
6497
+ parseOrderTimeInForce(timeInForce) {
6498
+ const timeInForces = {
6499
+ 'GTC': 'GTC',
6500
+ 'IOC': 'IOC',
6501
+ 'FOK': 'FOK',
6502
+ 'GTT': 'GTD',
6503
+ };
6504
+ return this.safeString(timeInForces, timeInForce, timeInForce);
6505
+ }
6506
+ parseOrderStatus(status) {
6507
+ const statuses = {
6508
+ '0': 'open',
6509
+ '1': 'open',
6510
+ '2': 'open',
6511
+ '3': 'closed',
6512
+ '4': 'open',
6513
+ '5': 'canceled',
6514
+ '6': 'closed', // partial canceled
6515
+ };
6516
+ return this.safeString(statuses, status, status);
6517
+ }
5676
6518
  /**
5677
6519
  * @method
5678
6520
  * @name kucoin#fetchOrderTrades
@@ -5680,12 +6522,14 @@ export default class kucoin extends Exchange {
5680
6522
  * @see https://docs.kucoin.com/#list-fills
5681
6523
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/orders/get-trade-history
5682
6524
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-trade-history
6525
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-trade-history
5683
6526
  * @param {string} id order id
5684
6527
  * @param {string} symbol unified market symbol
5685
6528
  * @param {int} [since] the earliest time in ms to fetch trades for
5686
6529
  * @param {int} [limit] the maximum number of trades to retrieve
5687
6530
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5688
6531
  * @param {string} [params.type] 'spot' or 'swap', used if symbol is not provided (default is 'spot')
6532
+ * @param {boolean} [params.uta] set to true if fetching trades from uta endpoint, default is false.
5689
6533
  * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/?id=trade-structure}
5690
6534
  */
5691
6535
  async fetchOrderTrades(id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
@@ -5699,6 +6543,7 @@ export default class kucoin extends Exchange {
5699
6543
  * @name kucoin#fetchMyTrades
5700
6544
  * @see https://www.kucoin.com/docs-new/rest/spot-trading/orders/get-trade-history
5701
6545
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/orders/get-trade-history
6546
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-trade-history
5702
6547
  * @description fetch all trades made by the user
5703
6548
  * @param {string} symbol unified market symbol
5704
6549
  * @param {int} [since] the earliest time in ms to fetch trades for
@@ -5717,6 +6562,12 @@ export default class kucoin extends Exchange {
5717
6562
  market = this.market(symbol);
5718
6563
  }
5719
6564
  [marketType, params] = this.handleMarketTypeAndParams('fetchMyTrades', market, params);
6565
+ let uta = await this.isUTAEnabled();
6566
+ [uta, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'uta', uta);
6567
+ if (uta) {
6568
+ params = this.extend(params, { 'marketType': marketType });
6569
+ return await this.fetchMyUtaTrades(symbol, since, limit, params);
6570
+ }
5720
6571
  if ((marketType === 'spot') || (marketType === 'margin')) {
5721
6572
  return await this.fetchMySpotTrades(symbol, since, limit, params);
5722
6573
  }
@@ -5933,57 +6784,144 @@ export default class kucoin extends Exchange {
5933
6784
  }
5934
6785
  /**
5935
6786
  * @method
5936
- * @name kucoin#fetchTrades
5937
- * @description get the list of most recent trades for a particular symbol
5938
- * @see https://www.kucoin.com/docs-new/rest/spot-trading/market-data/get-trade-history
5939
- * @see https://www.kucoin.com/docs-new/rest/ua/get-trades
5940
- * @see https://www.kucoin.com/docs-new/rest/futures-trading/market-data/get-trade-history
5941
- * @param {string} symbol unified symbol of the market to fetch trades for
5942
- * @param {int} [since] timestamp in ms of the earliest trade to fetch
5943
- * @param {int} [limit] the maximum amount of trades to fetch
6787
+ * @name kucoin#fetchMyUtaTrades
6788
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-trade-history
6789
+ * @description fetch all trades made by the user
6790
+ * @param {string} symbol unified market symbol
6791
+ * @param {int} [since] the earliest time in ms to fetch trades for
6792
+ * @param {int} [limit] the maximum number of trades structures to retrieve (default is 50, max is 200)
5944
6793
  * @param {object} [params] extra parameters specific to the exchange API endpoint
5945
- * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
5946
- * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/?id=public-trades}
6794
+ * @param {int} [params.until] the latest time in ms to fetch entries for
6795
+ * @param {string} [params.accountMode] 'unified' or 'classic', defaults to 'unified'
6796
+ * @param {string} [params.marginMode] 'cross' or 'isolated', only for margin trades
6797
+ * @param {string} [params.side] 'BUY' or 'SELL' (both if not provided)
6798
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
6799
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/?id=trade-structure}
5947
6800
  */
5948
- async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
6801
+ async fetchMyUtaTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
5949
6802
  await this.loadMarkets();
5950
- const market = this.market(symbol);
5951
- const request = {
5952
- 'symbol': market['id'],
5953
- };
5954
- // pagination is not supported on the exchange side anymore
5955
- // if (since !== undefined) {
5956
- // request['startAt'] = Math.floor (since / 1000);
5957
- // }
5958
- // if (limit !== undefined) {
5959
- // request['pageSize'] = limit;
5960
- // }
5961
- let uta = undefined;
5962
- [uta, params] = this.handleOptionAndParams(params, 'fetchTrades', 'uta', false);
5963
- let response = undefined;
5964
- let trades = undefined;
5965
- let type = undefined;
5966
- [type, params] = this.handleMarketTypeAndParams('fetchTrades', market, params);
5967
- if (uta) {
5968
- if ((type === 'spot') || (type === 'margin')) {
5969
- request['tradeType'] = 'SPOT';
5970
- }
5971
- else {
5972
- request['tradeType'] = 'FUTURES';
5973
- }
5974
- response = await this.utaGetMarketTrade(this.extend(request, params));
5975
- //
5976
- // {
5977
- // "code": "200000",
5978
- // "data": {
5979
- // "tradeType": "SPOT",
5980
- // "list": [
5981
- // {
5982
- // "sequence": "18746044393340932",
5983
- // "tradeId": "18746044393340932",
5984
- // "price": "104355.6",
5985
- // "size": "0.00011886",
5986
- // "side": "sell",
6803
+ let paginate = false;
6804
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'paginate');
6805
+ if (paginate) {
6806
+ return await this.fetchPaginatedCallDynamic('fetchMyTrades', symbol, since, limit, params);
6807
+ }
6808
+ const marketType = this.safeString(params, 'marketType');
6809
+ if (marketType !== undefined) {
6810
+ params = this.omit(params, 'marketType');
6811
+ }
6812
+ let request = {};
6813
+ let isContract = false;
6814
+ let market = undefined;
6815
+ if (symbol !== undefined) {
6816
+ market = this.market(symbol);
6817
+ request['symbol'] = market['id'];
6818
+ isContract = market['contract'];
6819
+ }
6820
+ else if ((marketType === 'spot') || (marketType === 'margin')) {
6821
+ throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol parameter for uta spot or margin trades');
6822
+ }
6823
+ else {
6824
+ isContract = true;
6825
+ }
6826
+ let marginMode = undefined;
6827
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
6828
+ const tradeType = this.handleTradeType(isContract, marginMode, params);
6829
+ request['tradeType'] = tradeType;
6830
+ let accountMode = 'unified';
6831
+ [accountMode, params] = this.handleOptionAndParams(params, 'fetchMyTrades', 'accountMode', accountMode);
6832
+ request['accountMode'] = accountMode;
6833
+ if (since !== undefined) {
6834
+ request['startAt'] = since;
6835
+ }
6836
+ if (limit !== undefined) {
6837
+ request['pageSize'] = limit;
6838
+ }
6839
+ [request, params] = this.handleUntilOption('endAt', request, params);
6840
+ const response = await this.utaPrivateGetAccountModeOrderExecution(this.extend(request, params));
6841
+ //
6842
+ // {
6843
+ // "code": "200000",
6844
+ // "data": {
6845
+ // "tradeType": "FUTURES",
6846
+ // "lastId": 30000000000531982,
6847
+ // "items": [
6848
+ // {
6849
+ // "orderId": "426373228194254848",
6850
+ // "symbol": "DOGEUSDTM",
6851
+ // "orderType": "MARKET",
6852
+ // "side": "BUY",
6853
+ // "tradeId": "1711108516570",
6854
+ // "size": "1",
6855
+ // "price": "0.09641",
6856
+ // "value": "9.641",
6857
+ // "executionTime": 1774468501294000000,
6858
+ // "fee": "0.0057846",
6859
+ // "feeCurrency": "USDT",
6860
+ // "tax": "",
6861
+ // "liquidityRole": "TAKER",
6862
+ // "fillType": "NORMAL"
6863
+ // }
6864
+ // ]
6865
+ // }
6866
+ // }
6867
+ //
6868
+ const data = this.safeDict(response, 'data', {});
6869
+ const trades = this.safeList(data, 'items', []);
6870
+ return this.parseTrades(trades, market, since, limit);
6871
+ }
6872
+ /**
6873
+ * @method
6874
+ * @name kucoin#fetchTrades
6875
+ * @description get the list of most recent trades for a particular symbol
6876
+ * @see https://www.kucoin.com/docs-new/rest/spot-trading/market-data/get-trade-history
6877
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-trades
6878
+ * @see https://www.kucoin.com/docs-new/rest/futures-trading/market-data/get-trade-history
6879
+ * @param {string} symbol unified symbol of the market to fetch trades for
6880
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
6881
+ * @param {int} [limit] the maximum amount of trades to fetch
6882
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
6883
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
6884
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/?id=public-trades}
6885
+ */
6886
+ async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
6887
+ await this.loadMarkets();
6888
+ const market = this.market(symbol);
6889
+ const request = {
6890
+ 'symbol': market['id'],
6891
+ };
6892
+ // pagination is not supported on the exchange side anymore
6893
+ // if (since !== undefined) {
6894
+ // request['startAt'] = Math.floor (since / 1000);
6895
+ // }
6896
+ // if (limit !== undefined) {
6897
+ // request['pageSize'] = limit;
6898
+ // }
6899
+ let uta = false;
6900
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTrades', 'uta', uta);
6901
+ let response = undefined;
6902
+ let trades = undefined;
6903
+ let type = undefined;
6904
+ [type, params] = this.handleMarketTypeAndParams('fetchTrades', market, params);
6905
+ if (uta) {
6906
+ if ((type === 'spot') || (type === 'margin')) {
6907
+ request['tradeType'] = 'SPOT';
6908
+ }
6909
+ else {
6910
+ request['tradeType'] = 'FUTURES';
6911
+ }
6912
+ response = await this.utaGetMarketTrade(this.extend(request, params));
6913
+ //
6914
+ // {
6915
+ // "code": "200000",
6916
+ // "data": {
6917
+ // "tradeType": "SPOT",
6918
+ // "list": [
6919
+ // {
6920
+ // "sequence": "18746044393340932",
6921
+ // "tradeId": "18746044393340932",
6922
+ // "price": "104355.6",
6923
+ // "size": "0.00011886",
6924
+ // "side": "sell",
5987
6925
  // "ts": 1762242540829000000
5988
6926
  // },
5989
6927
  // ]
@@ -6035,6 +6973,9 @@ export default class kucoin extends Exchange {
6035
6973
  return this.parseTrades(trades, market, since, limit);
6036
6974
  }
6037
6975
  parseTrade(trade, market = undefined) {
6976
+ if ('liquidityRole' in trade) { // property specific to myTrades from uta endpoint
6977
+ return this.parseMyUtaTrade(trade, market);
6978
+ }
6038
6979
  const marketId = this.safeString(trade, 'symbol');
6039
6980
  market = this.safeMarket(marketId, market);
6040
6981
  if ((market === undefined) || (market['spot'])) {
@@ -6321,23 +7262,97 @@ export default class kucoin extends Exchange {
6321
7262
  'fee': fee,
6322
7263
  }, market);
6323
7264
  }
7265
+ parseMyUtaTrade(trade, market = undefined) {
7266
+ //
7267
+ // {
7268
+ // "orderId": "426373228194254848",
7269
+ // "symbol": "DOGEUSDTM",
7270
+ // "orderType": "MARKET",
7271
+ // "side": "BUY",
7272
+ // "tradeId": "1711108516570",
7273
+ // "size": "1",
7274
+ // "price": "0.09641",
7275
+ // "value": "9.641",
7276
+ // "executionTime": 1774468501294000000,
7277
+ // "fee": "0.0057846",
7278
+ // "feeCurrency": "USDT",
7279
+ // "tax": "",
7280
+ // "liquidityRole": "TAKER",
7281
+ // "fillType": "NORMAL"
7282
+ // }
7283
+ //
7284
+ const marketId = this.safeString(trade, 'symbol');
7285
+ market = this.safeMarket(marketId, market);
7286
+ const timestamp = this.safeIntegerProduct(trade, 'executionTime', 0.000001);
7287
+ const fee = {
7288
+ 'cost': this.safeString(trade, 'fee'),
7289
+ 'currency': this.safeCurrencyCode(this.safeString(trade, 'feeCurrency')),
7290
+ };
7291
+ return this.safeTrade({
7292
+ 'info': trade,
7293
+ 'id': this.safeString(trade, 'tradeId'),
7294
+ 'order': this.safeString(trade, 'orderId'),
7295
+ 'timestamp': timestamp,
7296
+ 'datetime': this.iso8601(timestamp),
7297
+ 'symbol': market['symbol'],
7298
+ 'type': this.safeStringLower(trade, 'orderType'),
7299
+ 'takerOrMaker': this.safeStringLower(trade, 'liquidityRole'),
7300
+ 'side': this.safeStringLower(trade, 'side'),
7301
+ 'price': this.safeString(trade, 'price'),
7302
+ 'amount': this.safeString(trade, 'size'),
7303
+ 'cost': this.safeString(trade, 'value'),
7304
+ 'fee': fee,
7305
+ }, market);
7306
+ }
6324
7307
  /**
6325
7308
  * @method
6326
7309
  * @name kucoin#fetchTradingFee
6327
7310
  * @description fetch the trading fees for a market
6328
7311
  * @see https://www.kucoin.com/docs-new/rest/account-info/trade-fee/get-actual-fee-spot-margin
6329
7312
  * @see https://www.kucoin.com/docs-new/rest/account-info/trade-fee/get-actual-fee-futures
7313
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-actual-fee
6330
7314
  * @param {string} symbol unified market symbol
6331
7315
  * @param {object} [params] extra parameters specific to the exchange API endpoint
7316
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
6332
7317
  * @returns {object} a [fee structure]{@link https://docs.ccxt.com/?id=fee-structure}
6333
7318
  */
6334
7319
  async fetchTradingFee(symbol, params = {}) {
6335
7320
  await this.loadMarkets();
6336
7321
  const market = this.market(symbol);
7322
+ let uta = await this.isUTAEnabled();
7323
+ [uta, params] = this.handleOptionAndParams(params, 'fetchTradingFee', 'uta', uta);
6337
7324
  const request = {};
6338
7325
  let response = undefined;
6339
7326
  let entry = undefined;
6340
- if (market['spot']) {
7327
+ if (uta) {
7328
+ if (market['spot']) {
7329
+ request['tradeType'] = 'SPOT';
7330
+ }
7331
+ else {
7332
+ request['tradeType'] = 'FUTURES';
7333
+ }
7334
+ request['symbol'] = market['id'];
7335
+ response = await this.utaPrivateGetUserFeeRate(this.extend(request, params));
7336
+ //
7337
+ // {
7338
+ // "code": "200000",
7339
+ // "data": {
7340
+ // "tradeType": "SPOT",
7341
+ // "list": [
7342
+ // {
7343
+ // "symbol": "ETH-USDT",
7344
+ // "takerFeeRate": "0.001",
7345
+ // "makerFeeRate": "0.001"
7346
+ // }
7347
+ // ]
7348
+ // }
7349
+ // }
7350
+ //
7351
+ const data = this.safeDict(response, 'data', {});
7352
+ const dataList = this.safeList(data, 'list', []);
7353
+ entry = this.safeDict(dataList, 0);
7354
+ }
7355
+ else if (market['spot']) {
6341
7356
  request['symbols'] = market['id'];
6342
7357
  response = await this.privateGetTradeFees(this.extend(request, params));
6343
7358
  //
@@ -6413,7 +7428,7 @@ export default class kucoin extends Exchange {
6413
7428
  let networkCode = undefined;
6414
7429
  [networkCode, params] = this.handleNetworkCodeAndParams(params);
6415
7430
  if (networkCode !== undefined) {
6416
- request['chain'] = this.networkCodeToId(networkCode).toLowerCase();
7431
+ request['chain'] = this.networkCodeToId(networkCode, currency['code']).toLowerCase();
6417
7432
  }
6418
7433
  request['amount'] = parseFloat(this.currencyToPrecision(code, amount, networkCode));
6419
7434
  let includeFee = undefined;
@@ -6534,12 +7549,13 @@ export default class kucoin extends Exchange {
6534
7549
  }
6535
7550
  const internal = this.safeBool(transaction, 'isInner');
6536
7551
  const tag = this.safeString(transaction, 'memo');
7552
+ const chainId = this.safeString(transaction, 'chain');
6537
7553
  return {
6538
7554
  'info': transaction,
6539
7555
  'id': this.safeString2(transaction, 'id', 'withdrawalId'),
6540
7556
  'timestamp': timestamp,
6541
7557
  'datetime': this.iso8601(timestamp),
6542
- 'network': this.networkIdToCode(this.safeString(transaction, 'chain')),
7558
+ 'network': this.networkIdToCode(chainId, code),
6543
7559
  'address': address,
6544
7560
  'addressTo': address,
6545
7561
  'addressFrom': undefined,
@@ -6731,10 +7747,11 @@ export default class kucoin extends Exchange {
6731
7747
  if (accountType === 'contract') {
6732
7748
  return await this.fetchContractWithdrawals(code, since, limit, params);
6733
7749
  }
7750
+ const maxLimit = 500;
6734
7751
  let paginate = false;
6735
7752
  [paginate, params] = this.handleOptionAndParams(params, 'fetchWithdrawals', 'paginate');
6736
7753
  if (paginate) {
6737
- return await this.fetchPaginatedCallDynamic('fetchWithdrawals', code, since, limit, params, 500);
7754
+ return await this.fetchPaginatedCallDynamic('fetchWithdrawals', code, since, limit, params, maxLimit);
6738
7755
  }
6739
7756
  let request = {};
6740
7757
  let currency = undefined;
@@ -6874,14 +7891,24 @@ export default class kucoin extends Exchange {
6874
7891
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-cross-margin
6875
7892
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-isolated-margin
6876
7893
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-futures
7894
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-currency-assets-uta
7895
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-currency-assets-classic
6877
7896
  * @param {object} [params] extra parameters specific to the exchange API endpoint
6878
7897
  * @param {object} [params.marginMode] 'cross' or 'isolated', margin type for fetching margin balance
6879
7898
  * @param {object} [params.type] extra parameters specific to the exchange API endpoint
6880
7899
  * @param {object} [params.hf] *default if false* if true, the result includes the balance of the high frequency account
7900
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
6881
7901
  * @returns {object} a [balance structure]{@link https://docs.ccxt.com/?id=balance-structure}
6882
7902
  */
6883
7903
  async fetchBalance(params = {}) {
6884
7904
  await this.loadMarkets();
7905
+ let uta = await this.isUTAEnabled();
7906
+ [uta, params] = this.handleOptionAndParams(params, 'fetchBalance', 'uta', uta);
7907
+ if (uta) {
7908
+ return await this.fetchUtaBalance(params);
7909
+ }
7910
+ let response = undefined;
7911
+ const request = {};
6885
7912
  const code = this.safeString(params, 'code');
6886
7913
  let currency = undefined;
6887
7914
  if (code !== undefined) {
@@ -6900,26 +7927,25 @@ export default class kucoin extends Exchange {
6900
7927
  if (hf && (type !== 'main')) {
6901
7928
  type = 'trade_hf';
6902
7929
  }
6903
- const [marginMode, query] = this.handleMarginModeAndParams('fetchBalance', params);
6904
- let response = undefined;
6905
- const request = {};
7930
+ let marginMode = undefined;
7931
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
6906
7932
  const isolated = (marginMode === 'isolated') || (type === 'isolated');
6907
7933
  const cross = (marginMode === 'cross') || (type === 'margin');
6908
7934
  if (isolated) {
6909
7935
  if (currency !== undefined) {
6910
7936
  request['balanceCurrency'] = currency['id'];
6911
7937
  }
6912
- response = await this.privateGetIsolatedAccounts(this.extend(request, query));
7938
+ response = await this.privateGetIsolatedAccounts(this.extend(request, params));
6913
7939
  }
6914
7940
  else if (cross) {
6915
- response = await this.privateGetMarginAccount(this.extend(request, query));
7941
+ response = await this.privateGetMarginAccount(this.extend(request, params));
6916
7942
  }
6917
7943
  else {
6918
7944
  if (currency !== undefined) {
6919
7945
  request['currency'] = currency['id'];
6920
7946
  }
6921
7947
  request['type'] = type;
6922
- response = await this.privateGetAccounts(this.extend(request, query));
7948
+ response = await this.privateGetAccounts(this.extend(request, params));
6923
7949
  }
6924
7950
  //
6925
7951
  // Spot
@@ -7103,11 +8129,260 @@ export default class kucoin extends Exchange {
7103
8129
  result[currencyCode] = account;
7104
8130
  return this.safeBalance(result);
7105
8131
  }
8132
+ /**
8133
+ * @method
8134
+ * @name kucoin#fetchUtaBalance
8135
+ * @description helper method for fetching balance with unified trading account (uta) endpoint
8136
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-currency-assets-uta
8137
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-currency-assets-classic
8138
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
8139
+ * @param {string} [params.type] 'spot', 'unified', 'funding', 'cross', 'isolated' or 'swap' (default is 'spot')
8140
+ * @param {string} [params.marginMode] 'cross' or 'isolated', margin type for fetching margin balance, only applicable if type is margin (default is cross)
8141
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/?id=balance-structure}
8142
+ */
8143
+ async fetchUtaBalance(params = {}) {
8144
+ await this.loadMarkets();
8145
+ let requestedType = undefined;
8146
+ [requestedType, params] = this.handleMarketTypeAndParams('fetchUtaBalance', undefined, params);
8147
+ if (requestedType === 'margin') {
8148
+ // assume cross margin if margin is specified but marginMode is not specified
8149
+ let marginMode = 'cross';
8150
+ [marginMode, params] = this.handleMarginModeAndParams('fetchUtaBalance', params, marginMode);
8151
+ requestedType = marginMode;
8152
+ }
8153
+ const utaAccountsByType = this.safeDict(this.options, 'utaAccountsByType', {});
8154
+ let type = undefined;
8155
+ type = this.safeString(utaAccountsByType, requestedType, type);
8156
+ const isIsolated = (type === 'ISOLATED');
8157
+ const request = {};
8158
+ let response = undefined;
8159
+ if (type === 'unified') {
8160
+ request['accountMode'] = type;
8161
+ // uta
8162
+ // {
8163
+ // "code": "200000",
8164
+ // "data": {
8165
+ // "accountType": "UNIFIED",
8166
+ // "ts": 1764731696945,
8167
+ // "accounts": [
8168
+ // {
8169
+ // "currencies": [
8170
+ // {
8171
+ // "currency": "USDT",
8172
+ // "equity": "97.9936711985",
8173
+ // "hold": "0.0000000000",
8174
+ // "balance": "97.9936711985",
8175
+ // "available": "97.9936711985",
8176
+ // "liability": "0.0000000000"
8177
+ // },
8178
+ // {
8179
+ // "currency": "BTC",
8180
+ // "equity": "0.0000216000",
8181
+ // "hold": "0.0000000000",
8182
+ // "balance": "0.0000216000",
8183
+ // "available": "0.0000216000",
8184
+ // "liability": "0.0000000000"
8185
+ // }
8186
+ // ]
8187
+ // }
8188
+ // ]
8189
+ // }
8190
+ // }
8191
+ //
8192
+ response = await this.utaPrivateGetAccountModeAccountBalance(this.extend(request, params));
8193
+ }
8194
+ else {
8195
+ request['accountType'] = type;
8196
+ //
8197
+ // isolated
8198
+ // {
8199
+ // "code": "200000",
8200
+ // "data": {
8201
+ // "accountType": "ISOLATED",
8202
+ // "ts": 1774244660519,
8203
+ // "accounts": [
8204
+ // {
8205
+ // "accountSubtype": "LTC-USDT",
8206
+ // "riskRatio": "0",
8207
+ // "currencies": [
8208
+ // {
8209
+ // "currency": "LTC",
8210
+ // "hold": "0",
8211
+ // "available": "0",
8212
+ // "liability": "0",
8213
+ // "balance": "0",
8214
+ // "equity": "0"},{
8215
+ // "currency": "USDT",
8216
+ // "hold": "0",
8217
+ // "available": "6",
8218
+ // "liability": "0",
8219
+ // "balance": "6",
8220
+ // "equity": "6"
8221
+ // }
8222
+ // ]
8223
+ // }
8224
+ // ]
8225
+ // }
8226
+ // }
8227
+ //
8228
+ response = await this.utaPrivateGetAccountBalance(this.extend(request, params));
8229
+ }
8230
+ const data = this.safeDict(response, 'data', {});
8231
+ const timestamp = this.safeInteger(data, 'ts');
8232
+ const result = {
8233
+ 'info': response,
8234
+ 'timestamp': timestamp,
8235
+ 'datetime': this.iso8601(timestamp),
8236
+ };
8237
+ const accounts = this.safeList(data, 'accounts', []);
8238
+ if (isIsolated) {
8239
+ for (let i = 0; i < accounts.length; i++) {
8240
+ const entry = accounts[i];
8241
+ const marketId = this.safeString(entry, 'accountSubtype');
8242
+ const symbol = this.safeSymbol(marketId, undefined, '-');
8243
+ const subResult = {};
8244
+ const currencies = this.safeList(entry, 'currencies', []);
8245
+ for (let j = 0; j < currencies.length; j++) {
8246
+ const currencyEntry = this.safeDict(currencies, j, {});
8247
+ const currencyId = this.safeString(currencyEntry, 'currency');
8248
+ const currencyCode = this.safeCurrencyCode(currencyId);
8249
+ subResult[currencyCode] = this.parseBalanceHelper(currencyEntry);
8250
+ }
8251
+ result[symbol] = this.safeBalance(subResult);
8252
+ }
8253
+ }
8254
+ else {
8255
+ const firstAccount = this.safeDict(accounts, 0, {});
8256
+ const currencies = this.safeList(firstAccount, 'currencies', []);
8257
+ for (let i = 0; i < currencies.length; i++) {
8258
+ const currencyEntry = this.safeDict(currencies, i, {});
8259
+ const currencyId = this.safeString(currencyEntry, 'currency');
8260
+ const currencyCode = this.safeCurrencyCode(currencyId);
8261
+ result[currencyCode] = this.parseBalanceHelper(currencyEntry);
8262
+ }
8263
+ }
8264
+ let returnType = result;
8265
+ if (!isIsolated) {
8266
+ returnType = this.safeBalance(result);
8267
+ }
8268
+ return returnType;
8269
+ }
7106
8270
  /**
7107
8271
  * @method
7108
8272
  * @name kucoin#transfer
7109
8273
  * @description transfer currency internally between wallets on the same account
7110
8274
  * @see https://www.kucoin.com/docs-new/rest/account-info/transfer/flex-transfer?lang=en_US&
8275
+ * @see https://www.kucoin.com/docs-new/rest/ua/flex-transfer
8276
+ * @param {string} code unified currency code
8277
+ * @param {float} amount amount to transfer
8278
+ * @param {string} fromAccount account to transfer from
8279
+ * @param {string} toAccount account to transfer to
8280
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
8281
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta) endpoint, defaults to false
8282
+ * Check transferClassic() and transferUta() for more details on params
8283
+ * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/?id=transfer-structure}
8284
+ */
8285
+ async transfer(code, amount, fromAccount, toAccount, params = {}) {
8286
+ await this.loadMarkets();
8287
+ let uta = await this.isUTAEnabled();
8288
+ [uta, params] = this.handleOptionAndParams(params, 'transfer', 'uta', uta);
8289
+ if (uta) {
8290
+ return await this.transferUta(code, amount, fromAccount, toAccount, params);
8291
+ }
8292
+ return await this.transferClassic(code, amount, fromAccount, toAccount, params);
8293
+ }
8294
+ /**
8295
+ * @method
8296
+ * @name kucoin#transferUta
8297
+ * @description transfer currency internally between wallets on the same account with uta endpoint
8298
+ * @see https://www.kucoin.com/docs-new/rest/ua/flex-transfer
8299
+ * @param {string} code unified currency code
8300
+ * @param {float} amount amount to transfer
8301
+ * @param {string} fromAccount account to transfer from
8302
+ * @param {string} toAccount account to transfer to
8303
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
8304
+ * @param {string} [params.transferType] INTERNAL, PARENT_TO_SUB, SUB_TO_PARENT, SUB_TO_SUB (default is INTERNAL)
8305
+ * @param {string} [params.fromUserId] required if transferType is SUB_TO_PARENT or SUB_TO_SUB
8306
+ * @param {string} [params.toUserId] required if transferType is PARENT_TO_SUB or SUB_TO_SUB
8307
+ * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/?id=transfer-structure}
8308
+ */
8309
+ async transferUta(code, amount, fromAccount, toAccount, params = {}) {
8310
+ await this.loadMarkets();
8311
+ const currency = this.currency(code);
8312
+ const requestedAmount = this.currencyToPrecision(code, amount);
8313
+ const request = {
8314
+ 'currency': currency['id'],
8315
+ 'amount': requestedAmount,
8316
+ };
8317
+ let transferType = 'INTERNAL';
8318
+ [transferType, params] = this.handleParamString2(params, 'transferType', 'type', transferType);
8319
+ let fromUserId = undefined;
8320
+ [fromUserId, params] = this.handleParamString2(params, 'fromUserId', 'fromUid', fromUserId);
8321
+ let toUserId = undefined;
8322
+ [toUserId, params] = this.handleParamString2(params, 'toUserId', 'toUid', toUserId);
8323
+ if (transferType === 'PARENT_TO_SUB' || transferType === 'SUB_TO_SUB') {
8324
+ if (toUserId === undefined) {
8325
+ throw new ExchangeError(this.id + ' transfer() requires a toUserId param for PARENT_TO_SUB or SUB_TO_SUB transfers');
8326
+ }
8327
+ else {
8328
+ request['toUid'] = toUserId;
8329
+ }
8330
+ }
8331
+ else if (transferType === 'SUB_TO_PARENT' || transferType === 'SUB_TO_SUB') {
8332
+ if (fromUserId === undefined) {
8333
+ throw new ExchangeError(this.id + ' transfer() requires a fromUserId param for SUB_TO_PARENT or SUB_TO_SUB transfers');
8334
+ }
8335
+ else {
8336
+ request['fromUid'] = fromUserId;
8337
+ }
8338
+ }
8339
+ let clientOid = this.uuid();
8340
+ [clientOid, params] = this.handleParamString2(params, 'clientOid', 'clientOrderId', clientOid);
8341
+ request['clientOid'] = clientOid;
8342
+ let fromId = this.convertTypeToAccount(fromAccount);
8343
+ let toId = this.convertTypeToAccount(toAccount);
8344
+ const fromIsolated = this.inArray(fromId, this.ids);
8345
+ const toIsolated = this.inArray(toId, this.ids);
8346
+ if (fromIsolated) {
8347
+ request['fromAccountSymbol'] = fromId;
8348
+ fromId = 'ISOLATED';
8349
+ }
8350
+ if (toIsolated) {
8351
+ request['toAccountSymbol'] = toId;
8352
+ toId = 'ISOLATED';
8353
+ }
8354
+ const utaAccountsByType = this.safeDict(this.options, 'utaAccountsByType', {});
8355
+ fromId = this.safeString(utaAccountsByType, fromId, fromId);
8356
+ toId = this.safeString(utaAccountsByType, toId, toId);
8357
+ request['fromAccountType'] = fromId.toUpperCase();
8358
+ request['toAccountType'] = toId.toUpperCase();
8359
+ const types = {
8360
+ 'INTERNAL': '0',
8361
+ 'PARENT_TO_SUB': '1',
8362
+ 'SUB_TO_PARENT': '2',
8363
+ 'SUB_TO_SUB': '3',
8364
+ };
8365
+ request['type'] = this.safeString(types, transferType, transferType);
8366
+ const response = await this.utaPrivatePostAccountTransfer(this.extend(request, params));
8367
+ //
8368
+ //
8369
+ const data = this.safeDict(response, 'data');
8370
+ const transfer = this.parseTransfer(data, currency);
8371
+ const transferOptions = this.safeDict(this.options, 'transfer', {});
8372
+ const fillResponseFromRequest = this.safeBool(transferOptions, 'fillResponseFromRequest', true);
8373
+ if (fillResponseFromRequest) {
8374
+ transfer['amount'] = amount;
8375
+ transfer['fromAccount'] = fromAccount;
8376
+ transfer['toAccount'] = toAccount;
8377
+ transfer['status'] = 'ok';
8378
+ }
8379
+ return transfer;
8380
+ }
8381
+ /**
8382
+ * @method
8383
+ * @name kucoin#transferClassic
8384
+ * @description transfer currency internally between wallets on the same account with classic endpoints
8385
+ * @see https://www.kucoin.com/docs-new/rest/account-info/transfer/flex-transfer?lang=en_US&
7111
8386
  * @param {string} code unified currency code
7112
8387
  * @param {float} amount amount to transfer
7113
8388
  * @param {string} fromAccount account to transfer from
@@ -7118,7 +8393,7 @@ export default class kucoin extends Exchange {
7118
8393
  * @param {string} [params.toUserId] required if transferType is PARENT_TO_SUB
7119
8394
  * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/?id=transfer-structure}
7120
8395
  */
7121
- async transfer(code, amount, fromAccount, toAccount, params = {}) {
8396
+ async transferClassic(code, amount, fromAccount, toAccount, params = {}) {
7122
8397
  await this.loadMarkets();
7123
8398
  const currency = this.currency(code);
7124
8399
  const requestedAmount = this.currencyToPrecision(code, amount);
@@ -7332,12 +8607,32 @@ export default class kucoin extends Exchange {
7332
8607
  // 'Pool transactions': 'Pool transactions', // Pool-X transactions
7333
8608
  'Instant Exchange': 'trade',
7334
8609
  'Sub-account transfer': 'transfer',
7335
- 'Liquidation Fees': 'fee', // Liquidation Fees
8610
+ 'Liquidation Fees': 'fee',
7336
8611
  // 'Soft Staking Profits': 'Soft Staking Profits', // Soft Staking Profits
7337
8612
  // 'Voting Earnings': 'Voting Earnings', // Voting Earnings on Pool-X
7338
8613
  // 'Redemption of Voting': 'Redemption of Voting', // Redemption of Voting on Pool-X
7339
8614
  // 'Voting': 'Voting', // Voting on Pool-X
7340
8615
  // 'Convert to KCS': 'Convert to KCS', // Convert to KCS
8616
+ 'RealisedPNL': 'trade',
8617
+ 'TransferIn': 'transfer',
8618
+ 'TransferOut': 'transfer',
8619
+ 'TRADE_EXCHANGE': 'trade',
8620
+ 'TRANSFER': 'transfer',
8621
+ 'SUB_TRANSFER': 'transfer',
8622
+ 'RETURNED_FEES': 'fee',
8623
+ 'DEDUCTION_FEES': 'fee',
8624
+ 'OTHER': 'other',
8625
+ 'SUB_TO_SUB_TRANSFER': 'transfer',
8626
+ 'SPOT_EXCHANGE': 'trade',
8627
+ 'SPOT_EXCHANGE_REBATE': 'rebate',
8628
+ 'FUTURES_EXCHANGE_OPEN': 'trade',
8629
+ 'FUTURES_EXCHANGE_CLOSE': 'trade',
8630
+ 'FUTURES_EXCHANGE_REBATE': 'rebate',
8631
+ 'FUNDING_FEE': 'fee',
8632
+ 'LIABILITY_INTEREST': 'fee',
8633
+ 'KCS_DEDUCTION_FEES': 'fee',
8634
+ 'KCS_RETURNED_FEES': 'fee',
8635
+ 'AUTO_EXCHANGE_USER': 'trade',
7341
8636
  };
7342
8637
  return this.safeString(types, type, type);
7343
8638
  }
@@ -7347,6 +8642,8 @@ export default class kucoin extends Exchange {
7347
8642
  'out': 'out',
7348
8643
  'TransferIn': 'in',
7349
8644
  'TransferOut': 'out',
8645
+ 'IN': 'in',
8646
+ 'OUT': 'out',
7350
8647
  };
7351
8648
  return this.safeString(directions, direction, direction);
7352
8649
  }
@@ -7385,14 +8682,28 @@ export default class kucoin extends Exchange {
7385
8682
  // "currency": "USDT"
7386
8683
  // }
7387
8684
  //
8685
+ // ledger entry from UTA API
8686
+ // {
8687
+ // "accountType": "UNIFIED",
8688
+ // "id": "30000000001200350",
8689
+ // "currency": "USDT",
8690
+ // "direction": "IN",
8691
+ // "businessType": "TRANSFER",
8692
+ // "amount": "30",
8693
+ // "balance": "30",
8694
+ // "fee": "0",
8695
+ // "tax": "0",
8696
+ // "remark": "Funding Account",
8697
+ // "ts": 1774241648267000000
8698
+ // }
8699
+ //
7388
8700
  const id = this.safeString(item, 'id');
7389
8701
  const currencyId = this.safeString(item, 'currency');
7390
8702
  const code = this.safeCurrencyCode(currencyId, currency);
7391
8703
  currency = this.safeCurrency(currencyId, currency);
7392
8704
  const amount = this.safeString(item, 'amount');
7393
- const balanceAfter = undefined;
7394
- // const balanceAfter = this.safeNumber (item, 'balance'); only returns zero string
7395
- const bizType = this.safeString(item, 'bizType');
8705
+ const balanceAfter = this.safeNumberOmitZero(item, 'balance');
8706
+ const bizType = this.safeStringN(item, ['bizType', 'businessType', 'type']);
7396
8707
  const type = this.parseLedgerEntryType(bizType);
7397
8708
  const direction = this.safeString2(item, 'direction', 'type');
7398
8709
  let account = this.safeString(item, 'accountType'); // MAIN, TRADE, MARGIN, or CONTRACT
@@ -7402,6 +8713,9 @@ export default class kucoin extends Exchange {
7402
8713
  if (timestamp !== undefined) {
7403
8714
  account = 'CONTRACT'; // contract ledger entries do not have an accountType field, so we set it to CONTRACT if the time field is present
7404
8715
  }
8716
+ else {
8717
+ timestamp = this.safeIntegerProduct(item, 'ts', 0.000001); // for UTA API
8718
+ }
7405
8719
  }
7406
8720
  const datetime = this.iso8601(timestamp);
7407
8721
  const context = this.safeString(item, 'context'); // contains other information about the ledger entry
@@ -7470,6 +8784,7 @@ export default class kucoin extends Exchange {
7470
8784
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-ledgers-tradehf
7471
8785
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-ledgers-marginhf
7472
8786
  * @see https://www.kucoin.com/docs-new/rest/account-info/account-funding/get-account-ledgers-futures
8787
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-ledger
7473
8788
  * @param {string} [code] unified currency code, default is undefined
7474
8789
  * @param {int} [since] timestamp in ms of the earliest ledger entry, default is undefined
7475
8790
  * @param {int} [limit] max number of ledger entries to return, default is undefined
@@ -7477,18 +8792,50 @@ export default class kucoin extends Exchange {
7477
8792
  * @param {object} [params.type] extra parameters specific to the exchange API endpoint
7478
8793
  * @param {boolean} [params.hf] default false, when true will fetch ledger entries for the high frequency trading account
7479
8794
  * @param {int} [params.until] the latest time in ms to fetch entries for
8795
+ * @param {boolean} [params.uta] default false, when true will fetch ledger entries for the unified trading account (UTA) instead of the regular accounts endpoint
7480
8796
  * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
7481
8797
  * @returns {object} a [ledger structure]{@link https://docs.ccxt.com/?id=ledger-entry-structure}
7482
8798
  */
7483
8799
  async fetchLedger(code = undefined, since = undefined, limit = undefined, params = {}) {
7484
8800
  await this.loadMarkets();
7485
8801
  await this.loadAccounts();
7486
- let paginate = false;
7487
- [paginate, params] = this.handleOptionAndParams(params, 'fetchLedger', 'paginate');
8802
+ let uta = await this.isUTAEnabled();
8803
+ [uta, params] = this.handleOptionAndParams(params, 'fetchLedger', 'uta', uta);
7488
8804
  let hf = undefined;
7489
8805
  [hf, params] = this.handleHfAndParams(params);
8806
+ let requestedType = undefined;
8807
+ [requestedType, params] = this.handleMarketTypeAndParams('fetchLedger', undefined, params);
8808
+ let marginMode = undefined;
8809
+ [marginMode, params] = this.handleMarginModeAndParams('fetchLedger', params);
8810
+ if (uta && (requestedType === 'margin')) {
8811
+ marginMode = (marginMode === undefined) ? 'cross' : marginMode; // default to cross margin for UTA if margin is requested but marginMode is not specified
8812
+ requestedType = marginMode;
8813
+ }
8814
+ let accountsByType = this.safeDict(this.options, 'accountsByType');
8815
+ if (uta) {
8816
+ accountsByType = this.safeDict(this.options, 'utaAccountsByType');
8817
+ }
8818
+ let type = undefined;
8819
+ type = this.safeString(accountsByType, requestedType, requestedType);
8820
+ let maxLimit = 500; // for spot non-uta and margin
8821
+ if (hf) {
8822
+ maxLimit = 200;
8823
+ }
8824
+ else if (type === 'contract') {
8825
+ maxLimit = 50;
8826
+ }
8827
+ else if (uta) {
8828
+ if ((type === 'UNIFIED') || (type === 'SPOT')) {
8829
+ maxLimit = 200;
8830
+ }
8831
+ else if (type === 'FUTURES') {
8832
+ maxLimit = 100;
8833
+ }
8834
+ }
8835
+ let paginate = false;
8836
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchLedger', 'paginate');
7490
8837
  if (paginate) {
7491
- return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params);
8838
+ return await this.fetchPaginatedCallDynamic('fetchLedger', code, since, limit, params, maxLimit);
7492
8839
  }
7493
8840
  let request = {
7494
8841
  // 'currency': currency['id'], // can choose up to 10, if not provided returns for all currencies by default
@@ -7507,14 +8854,23 @@ export default class kucoin extends Exchange {
7507
8854
  request['currency'] = currency['id'];
7508
8855
  }
7509
8856
  [request, params] = this.handleUntilOption('endAt', request, params);
7510
- let marginMode = undefined;
7511
- [marginMode, params] = this.handleMarginModeAndParams('fetchLedger', params);
7512
- let type = undefined;
7513
- [type, params] = this.handleMarketTypeAndParams('fetchLedger', undefined, params);
7514
- const accountsByType = this.safeDict(this.options, 'accountsByType');
7515
- type = this.safeString(accountsByType, type, type);
8857
+ if (limit !== undefined) {
8858
+ if (type === 'contract') {
8859
+ request['maxCount'] = limit;
8860
+ }
8861
+ else if (hf) {
8862
+ request['limit'] = limit;
8863
+ }
8864
+ else {
8865
+ request['pageSize'] = limit;
8866
+ }
8867
+ }
7516
8868
  let response = undefined;
7517
- if (hf) {
8869
+ if (uta) {
8870
+ request['accountType'] = type;
8871
+ response = await this.utaPrivateGetAccountLedger(this.extend(request, params));
8872
+ }
8873
+ else if (hf) {
7518
8874
  if (marginMode !== undefined) {
7519
8875
  response = await this.privateGetHfMarginAccountLedgers(this.extend(request, params));
7520
8876
  }
@@ -7756,12 +9112,14 @@ export default class kucoin extends Exchange {
7756
9112
  // Cross
7757
9113
  //
7758
9114
  // {
7759
- // "currency": "1INCH",
7760
- // "total": "0",
7761
- // "available": "0",
9115
+ // "currency": "DOGE",
9116
+ // "total": "119.99995308",
9117
+ // "available": "119.99995308",
7762
9118
  // "hold": "0",
7763
- // "liability": "0",
7764
- // "maxBorrowSize": "0",
9119
+ // "liability": "10.00004692",
9120
+ // "liabilityPrincipal": "10",
9121
+ // "liabilityInterest": "0.00004692",
9122
+ // "maxBorrowSize": "1140",
7765
9123
  // "borrowEnabled": true,
7766
9124
  // "transferInEnabled": true
7767
9125
  // }
@@ -7769,30 +9127,32 @@ export default class kucoin extends Exchange {
7769
9127
  // Isolated
7770
9128
  //
7771
9129
  // {
7772
- // "symbol": "MANA-USDT",
7773
- // "debtRatio": "0",
7774
- // "status": "BORROW",
9130
+ // "symbol": "DOGE-USDT",
9131
+ // "status": "EFFECTIVE",
9132
+ // "debtRatio": "0.0822",
7775
9133
  // "baseAsset": {
7776
- // "currency": "MANA",
9134
+ // "currency": "DOGE",
7777
9135
  // "borrowEnabled": true,
7778
- // "repayEnabled": true,
7779
- // "transferEnabled": true,
7780
- // "borrowed": "0",
7781
- // "totalAsset": "0",
7782
- // "available": "0",
9136
+ // "transferInEnabled": true,
9137
+ // "liability": "10.00009385",
9138
+ // "liabilityPrincipal": "10.00004692",
9139
+ // "liabilityInterest": "0.00004693",
9140
+ // "total": "10",
9141
+ // "available": "10",
7783
9142
  // "hold": "0",
7784
- // "maxBorrowSize": "1000"
9143
+ // "maxBorrowSize": "990"
7785
9144
  // },
7786
9145
  // "quoteAsset": {
7787
9146
  // "currency": "USDT",
7788
9147
  // "borrowEnabled": true,
7789
- // "repayEnabled": true,
7790
- // "transferEnabled": true,
7791
- // "borrowed": "0",
7792
- // "totalAsset": "0",
7793
- // "available": "0",
9148
+ // "transferInEnabled": true,
9149
+ // "liability": "0",
9150
+ // "liabilityPrincipal": "0",
9151
+ // "liabilityInterest": "0",
9152
+ // "total": "10",
9153
+ // "available": "10",
7794
9154
  // "hold": "0",
7795
- // "maxBorrowSize": "50000"
9155
+ // "maxBorrowSize": "89"
7796
9156
  // }
7797
9157
  // }
7798
9158
  //
@@ -7800,19 +9160,18 @@ export default class kucoin extends Exchange {
7800
9160
  const marginMode = (marketId === undefined) ? 'cross' : 'isolated';
7801
9161
  market = this.safeMarket(marketId, market);
7802
9162
  const symbol = this.safeString(market, 'symbol');
7803
- const timestamp = this.safeInteger(info, 'createdAt');
7804
9163
  const isolatedBase = this.safeDict(info, 'baseAsset', {});
7805
9164
  let amountBorrowed = undefined;
7806
9165
  let interest = undefined;
7807
9166
  let currencyId = undefined;
7808
9167
  if (marginMode === 'isolated') {
7809
- amountBorrowed = this.safeNumber(isolatedBase, 'liability');
7810
- interest = this.safeNumber(isolatedBase, 'interest');
9168
+ amountBorrowed = this.safeNumber(isolatedBase, 'liabilityPrincipal');
9169
+ interest = this.safeNumber(isolatedBase, 'liabilityInterest');
7811
9170
  currencyId = this.safeString(isolatedBase, 'currency');
7812
9171
  }
7813
9172
  else {
7814
- amountBorrowed = this.safeNumber(info, 'liability');
7815
- interest = this.safeNumber(info, 'accruedInterest');
9173
+ amountBorrowed = this.safeNumber(info, 'liabilityPrincipal');
9174
+ interest = this.safeNumber(info, 'liabilityInterest');
7816
9175
  currencyId = this.safeString(info, 'currency');
7817
9176
  }
7818
9177
  return {
@@ -7823,8 +9182,8 @@ export default class kucoin extends Exchange {
7823
9182
  'interestRate': this.safeNumber(info, 'dailyIntRate'),
7824
9183
  'amountBorrowed': amountBorrowed,
7825
9184
  'marginMode': marginMode,
7826
- 'timestamp': timestamp,
7827
- 'datetime': this.iso8601(timestamp),
9185
+ 'timestamp': undefined,
9186
+ 'datetime': undefined,
7828
9187
  };
7829
9188
  }
7830
9189
  /**
@@ -8207,9 +9566,11 @@ export default class kucoin extends Exchange {
8207
9566
  * @description set the level of leverage for a market
8208
9567
  * @see https://www.kucoin.com/docs-new/rest/margin-trading/debit/modify-leverage
8209
9568
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/positions/modify-cross-margin-leverage
9569
+ * @see https://www.kucoin.com/docs-new/rest/ua/modify-leverage-uta
8210
9570
  * @param {int } [leverage] New leverage multiplier. Must be greater than 1 and up to two decimal places, and cannot be less than the user's current debt leverage or greater than the system's maximum leverage
8211
9571
  * @param {string} [symbol] unified market symbol
8212
9572
  * @param {object} [params] extra parameters specific to the exchange API endpoint
9573
+ * @param {boolean} [params.uta] *contract markets only* set to true for the unified trading account (uta)
8213
9574
  * @returns {object} response from the exchange
8214
9575
  */
8215
9576
  async setLeverage(leverage, symbol = undefined, params = {}) {
@@ -8218,11 +9579,19 @@ export default class kucoin extends Exchange {
8218
9579
  let marketType = undefined;
8219
9580
  [marketType, params] = this.handleMarketTypeAndParams('setLeverage', undefined, params);
8220
9581
  if ((symbol !== undefined) || ((marketType !== 'spot') && (marketType !== 'margin'))) {
9582
+ if (symbol === undefined) {
9583
+ throw new ArgumentsRequired(this.id + ' setLeverage requires a symbol argument for contract markets');
9584
+ }
8221
9585
  market = this.market(symbol);
8222
9586
  if (market['contract']) {
8223
9587
  return await this.setContractLeverage(leverage, symbol, params);
8224
9588
  }
8225
9589
  }
9590
+ let uta = await this.isUTAEnabled();
9591
+ [uta, params] = this.handleOptionAndParams(params, 'setLeverage', 'uta', uta);
9592
+ if (uta) {
9593
+ throw new NotSupported(this.id + ' setLeverage with params["uta"] is supported for contract markets only');
9594
+ }
8226
9595
  let marginMode = undefined;
8227
9596
  [marginMode, params] = this.handleMarginModeAndParams('setLeverage', params);
8228
9597
  if (marginMode === undefined) {
@@ -8244,15 +9613,17 @@ export default class kucoin extends Exchange {
8244
9613
  * @name kucoin#setContractLeverage
8245
9614
  * @description set the level of leverage for a market
8246
9615
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/positions/modify-cross-margin-leverage
9616
+ * @see https://www.kucoin.com/docs-new/rest/ua/modify-leverage-uta
8247
9617
  * @param {float} leverage the rate of leverage
8248
9618
  * @param {string} symbol unified market symbol
8249
9619
  * @param {object} [params] extra parameters specific to the exchange API endpoint
9620
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta)
8250
9621
  * @returns {object} response from the exchange
8251
9622
  */
8252
9623
  async setContractLeverage(leverage, symbol = undefined, params = {}) {
8253
9624
  let marginMode = undefined;
8254
9625
  [marginMode, params] = this.handleMarginModeAndParams(symbol, params);
8255
- if (marginMode !== 'cross') {
9626
+ if ((marginMode !== undefined) && (marginMode !== 'cross')) {
8256
9627
  throw new NotSupported(this.id + ' setLeverage() currently supports only params["marginMode"] = "cross" for contracts');
8257
9628
  }
8258
9629
  await this.loadMarkets();
@@ -8261,14 +9632,24 @@ export default class kucoin extends Exchange {
8261
9632
  'symbol': market['id'],
8262
9633
  'leverage': leverage.toString(),
8263
9634
  };
8264
- const response = await this.futuresPrivatePostChangeCrossUserLeverage(this.extend(request, params));
8265
- //
8266
- // {
8267
- // "code": "200000",
8268
- // "data": true
8269
- // }
8270
- //
8271
- const leverageNum = this.safeInteger(response, 'leverage');
9635
+ let uta = await this.isUTAEnabled();
9636
+ [uta, params] = this.handleOptionAndParams(params, 'setLeverage', 'uta', uta);
9637
+ let response = undefined;
9638
+ if (uta) {
9639
+ request['accountMode'] = 'unified';
9640
+ response = await this.utaPrivatePostAccountModeAccountModifyLeverage(this.extend(request, params));
9641
+ }
9642
+ else {
9643
+ //
9644
+ // {
9645
+ // "code": "200000",
9646
+ // "data": true
9647
+ // }
9648
+ //
9649
+ response = await this.futuresPrivatePostChangeCrossUserLeverage(this.extend(request, params));
9650
+ }
9651
+ const data = this.safeDict(response, 'data', {});
9652
+ const leverageNum = this.safeNumber(data, 'leverage');
8272
9653
  return {
8273
9654
  'info': response,
8274
9655
  'symbol': market['symbol'],
@@ -8427,7 +9808,7 @@ export default class kucoin extends Exchange {
8427
9808
  'symbol': market['id'],
8428
9809
  };
8429
9810
  const until = this.safeInteger(params, 'until');
8430
- let uta = true; // for backward compatibility, dafult endpoint is uta
9811
+ let uta = false;
8431
9812
  [uta, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'uta', uta);
8432
9813
  params = this.omit(params, 'until');
8433
9814
  let start = since;
@@ -8582,9 +9963,11 @@ export default class kucoin extends Exchange {
8582
9963
  * @method
8583
9964
  * @name kucoin#fetchPosition
8584
9965
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/positions/get-position-details
9966
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-position-list-uta
8585
9967
  * @description fetch data on an open position
8586
9968
  * @param {string} symbol unified market symbol of the market the position is held in
8587
9969
  * @param {object} [params] extra parameters specific to the exchange API endpoint
9970
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8588
9971
  * @returns {object} a [position structure]{@link https://docs.ccxt.com/?id=position-structure}
8589
9972
  */
8590
9973
  async fetchPosition(symbol, params = {}) {
@@ -8593,112 +9976,157 @@ export default class kucoin extends Exchange {
8593
9976
  const request = {
8594
9977
  'symbol': market['id'],
8595
9978
  };
8596
- const response = await this.futuresPrivateGetPosition(this.extend(request, params));
8597
- //
8598
- // {
8599
- // "code": "200000",
8600
- // "data": {
8601
- // "id": "6505ee6eaff4070001f651c4",
8602
- // "symbol": "XBTUSDTM",
8603
- // "autoDeposit": false,
8604
- // "maintMarginReq": 0,
8605
- // "riskLimit": 200,
8606
- // "realLeverage": 0.0,
8607
- // "crossMode": false,
8608
- // "delevPercentage": 0.0,
8609
- // "currentTimestamp": 1694887534594,
8610
- // "currentQty": 0,
8611
- // "currentCost": 0.0,
8612
- // "currentComm": 0.0,
8613
- // "unrealisedCost": 0.0,
8614
- // "realisedGrossCost": 0.0,
8615
- // "realisedCost": 0.0,
8616
- // "isOpen": false,
8617
- // "markPrice": 26611.71,
8618
- // "markValue": 0.0,
8619
- // "posCost": 0.0,
8620
- // "posCross": 0,
8621
- // "posInit": 0.0,
8622
- // "posComm": 0.0,
8623
- // "posLoss": 0.0,
8624
- // "posMargin": 0.0,
8625
- // "posMaint": 0.0,
8626
- // "maintMargin": 0.0,
8627
- // "realisedGrossPnl": 0.0,
8628
- // "realisedPnl": 0.0,
8629
- // "unrealisedPnl": 0.0,
8630
- // "unrealisedPnlPcnt": 0,
8631
- // "unrealisedRoePcnt": 0,
8632
- // "avgEntryPrice": 0.0,
8633
- // "liquidationPrice": 0.0,
8634
- // "bankruptPrice": 0.0,
8635
- // "settleCurrency": "USDT",
8636
- // "maintainMargin": 0,
8637
- // "riskLimitLevel": 1
8638
- // }
8639
- // }
8640
- //
8641
- const data = this.safeDict(response, 'data', {});
8642
- return this.parsePosition(data, market);
9979
+ let uta = await this.isUTAEnabled();
9980
+ [uta, params] = this.handleOptionAndParams(params, 'fetchPosition', 'uta', uta);
9981
+ let response = undefined;
9982
+ let position = undefined;
9983
+ if (uta) {
9984
+ request['accountMode'] = 'unified';
9985
+ response = await this.utaPrivateGetAccountModePositionOpenList(this.extend(request, params));
9986
+ //
9987
+ // {
9988
+ // "code": "200000",
9989
+ // "data": [
9990
+ // {
9991
+ // "symbol": "DOGEUSDTM",
9992
+ // "id": "30000000000084351",
9993
+ // "marginMode": "CROSS",
9994
+ // "size": "2",
9995
+ // "entryPrice": "0.093795",
9996
+ // "positionValue": "18.298",
9997
+ // "markPrice": "0.09149",
9998
+ // "leverage": "3",
9999
+ // "unrealizedPnL": "-0.461",
10000
+ // "realizedPnL": "-0.01122489",
10001
+ // "initialMargin": "6.0993333327234",
10002
+ // "mmr": "0.007",
10003
+ // "maintenanceMargin": "0.128086",
10004
+ // "creationTime": 1774469753178000000
10005
+ // }
10006
+ // ]
10007
+ // }
10008
+ //
10009
+ const data = this.safeList(response, 'data', []);
10010
+ position = this.safeDict(data, 0, {});
10011
+ }
10012
+ else {
10013
+ response = await this.futuresPrivateGetPosition(this.extend(request, params));
10014
+ //
10015
+ // {
10016
+ // "code": "200000",
10017
+ // "data": {
10018
+ // "id": "6505ee6eaff4070001f651c4",
10019
+ // "symbol": "XBTUSDTM",
10020
+ // "autoDeposit": false,
10021
+ // "maintMarginReq": 0,
10022
+ // "riskLimit": 200,
10023
+ // "realLeverage": 0.0,
10024
+ // "crossMode": false,
10025
+ // "delevPercentage": 0.0,
10026
+ // "currentTimestamp": 1694887534594,
10027
+ // "currentQty": 0,
10028
+ // "currentCost": 0.0,
10029
+ // "currentComm": 0.0,
10030
+ // "unrealisedCost": 0.0,
10031
+ // "realisedGrossCost": 0.0,
10032
+ // "realisedCost": 0.0,
10033
+ // "isOpen": false,
10034
+ // "markPrice": 26611.71,
10035
+ // "markValue": 0.0,
10036
+ // "posCost": 0.0,
10037
+ // "posCross": 0,
10038
+ // "posInit": 0.0,
10039
+ // "posComm": 0.0,
10040
+ // "posLoss": 0.0,
10041
+ // "posMargin": 0.0,
10042
+ // "posMaint": 0.0,
10043
+ // "maintMargin": 0.0,
10044
+ // "realisedGrossPnl": 0.0,
10045
+ // "realisedPnl": 0.0,
10046
+ // "unrealisedPnl": 0.0,
10047
+ // "unrealisedPnlPcnt": 0,
10048
+ // "unrealisedRoePcnt": 0,
10049
+ // "avgEntryPrice": 0.0,
10050
+ // "liquidationPrice": 0.0,
10051
+ // "bankruptPrice": 0.0,
10052
+ // "settleCurrency": "USDT",
10053
+ // "maintainMargin": 0,
10054
+ // "riskLimitLevel": 1
10055
+ // }
10056
+ // }
10057
+ //
10058
+ position = this.safeDict(response, 'data', {});
10059
+ }
10060
+ return this.parsePosition(position, market);
8643
10061
  }
8644
10062
  /**
8645
10063
  * @method
8646
10064
  * @name kucoin#fetchPositions
8647
10065
  * @description fetch all open positions
8648
10066
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/positions/get-position-list
10067
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-position-list-uta
8649
10068
  * @param {string[]|undefined} symbols list of unified market symbols
8650
10069
  * @param {object} [params] extra parameters specific to the exchange API endpoint
10070
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8651
10071
  * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/?id=position-structure}
8652
10072
  */
8653
10073
  async fetchPositions(symbols = undefined, params = {}) {
8654
10074
  await this.loadMarkets();
8655
- const response = await this.futuresPrivateGetPositions(params);
8656
- //
8657
- // {
8658
- // "code": "200000",
8659
- // "data": [
8660
- // {
8661
- // "id": "615ba79f83a3410001cde321",
8662
- // "symbol": "ETHUSDTM",
8663
- // "autoDeposit": false,
8664
- // "maintMarginReq": 0.005,
8665
- // "riskLimit": 1000000,
8666
- // "realLeverage": 18.61,
8667
- // "crossMode": false,
8668
- // "delevPercentage": 0.86,
8669
- // "openingTimestamp": 1638563515618,
8670
- // "currentTimestamp": 1638576872774,
8671
- // "currentQty": 2,
8672
- // "currentCost": 83.64200000,
8673
- // "currentComm": 0.05018520,
8674
- // "unrealisedCost": 83.64200000,
8675
- // "realisedGrossCost": 0.00000000,
8676
- // "realisedCost": 0.05018520,
8677
- // "isOpen": true,
8678
- // "markPrice": 4225.01,
8679
- // "markValue": 84.50020000,
8680
- // "posCost": 83.64200000,
8681
- // "posCross": 0.0000000000,
8682
- // "posInit": 3.63660870,
8683
- // "posComm": 0.05236717,
8684
- // "posLoss": 0.00000000,
8685
- // "posMargin": 3.68897586,
8686
- // "posMaint": 0.50637594,
8687
- // "maintMargin": 4.54717586,
8688
- // "realisedGrossPnl": 0.00000000,
8689
- // "realisedPnl": -0.05018520,
8690
- // "unrealisedPnl": 0.85820000,
8691
- // "unrealisedPnlPcnt": 0.0103,
8692
- // "unrealisedRoePcnt": 0.2360,
8693
- // "avgEntryPrice": 4182.10,
8694
- // "liquidationPrice": 4023.00,
8695
- // "bankruptPrice": 4000.25,
8696
- // "settleCurrency": "USDT",
8697
- // "isInverse": false
8698
- // }
8699
- // ]
8700
- // }
8701
- //
10075
+ let uta = await this.isUTAEnabled();
10076
+ [uta, params] = this.handleOptionAndParams(params, 'fetchPositions', 'uta', uta);
10077
+ let response = undefined;
10078
+ if (uta) {
10079
+ response = await this.utaPrivateGetAccountModePositionOpenList(this.extend(params, { 'accountMode': 'unified' }));
10080
+ }
10081
+ else {
10082
+ response = await this.futuresPrivateGetPositions(params);
10083
+ //
10084
+ // {
10085
+ // "code": "200000",
10086
+ // "data": [
10087
+ // {
10088
+ // "id": "615ba79f83a3410001cde321",
10089
+ // "symbol": "ETHUSDTM",
10090
+ // "autoDeposit": false,
10091
+ // "maintMarginReq": 0.005,
10092
+ // "riskLimit": 1000000,
10093
+ // "realLeverage": 18.61,
10094
+ // "crossMode": false,
10095
+ // "delevPercentage": 0.86,
10096
+ // "openingTimestamp": 1638563515618,
10097
+ // "currentTimestamp": 1638576872774,
10098
+ // "currentQty": 2,
10099
+ // "currentCost": 83.64200000,
10100
+ // "currentComm": 0.05018520,
10101
+ // "unrealisedCost": 83.64200000,
10102
+ // "realisedGrossCost": 0.00000000,
10103
+ // "realisedCost": 0.05018520,
10104
+ // "isOpen": true,
10105
+ // "markPrice": 4225.01,
10106
+ // "markValue": 84.50020000,
10107
+ // "posCost": 83.64200000,
10108
+ // "posCross": 0.0000000000,
10109
+ // "posInit": 3.63660870,
10110
+ // "posComm": 0.05236717,
10111
+ // "posLoss": 0.00000000,
10112
+ // "posMargin": 3.68897586,
10113
+ // "posMaint": 0.50637594,
10114
+ // "maintMargin": 4.54717586,
10115
+ // "realisedGrossPnl": 0.00000000,
10116
+ // "realisedPnl": -0.05018520,
10117
+ // "unrealisedPnl": 0.85820000,
10118
+ // "unrealisedPnlPcnt": 0.0103,
10119
+ // "unrealisedRoePcnt": 0.2360,
10120
+ // "avgEntryPrice": 4182.10,
10121
+ // "liquidationPrice": 4023.00,
10122
+ // "bankruptPrice": 4000.25,
10123
+ // "settleCurrency": "USDT",
10124
+ // "isInverse": false
10125
+ // }
10126
+ // ]
10127
+ // }
10128
+ //
10129
+ }
8702
10130
  const data = this.safeList(response, 'data');
8703
10131
  return this.parsePositions(data, symbols);
8704
10132
  }
@@ -8707,69 +10135,120 @@ export default class kucoin extends Exchange {
8707
10135
  * @name kucoin#fetchPositionsHistory
8708
10136
  * @description fetches historical positions
8709
10137
  * @see https://www.kucoin.com/docs-new/rest/futures-trading/positions/get-positions-history
10138
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-position-history-uta
8710
10139
  * @param {string[]} [symbols] list of unified market symbols
8711
10140
  * @param {int} [since] the earliest time in ms to fetch position history for
8712
10141
  * @param {int} [limit] the maximum number of entries to retrieve
8713
10142
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8714
10143
  * @param {int} [params.until] closing end time
8715
10144
  * @param {int} [params.pageId] page id
10145
+ * @param {boolean} [params.uta] set to true for the unified trading account (uta), defaults to false
8716
10146
  * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/?id=position-structure}
8717
10147
  */
8718
10148
  async fetchPositionsHistory(symbols = undefined, since = undefined, limit = undefined, params = {}) {
8719
10149
  await this.loadMarkets();
8720
- if (limit === undefined) {
8721
- limit = 200;
10150
+ let uta = await this.isUTAEnabled();
10151
+ [uta, params] = this.handleOptionAndParams(params, 'fetchPositionsHistory', 'uta', uta);
10152
+ let response = undefined;
10153
+ let request = {};
10154
+ symbols = this.marketSymbols(symbols);
10155
+ if (symbols !== undefined) {
10156
+ const length = symbols.length;
10157
+ if (length === 1) {
10158
+ const market = this.market(symbols[0]);
10159
+ request['symbol'] = market['id'];
10160
+ }
8722
10161
  }
8723
- const request = {
8724
- 'limit': limit,
8725
- };
8726
- if (since !== undefined) {
8727
- request['from'] = since;
10162
+ if (uta) {
10163
+ if (since !== undefined) {
10164
+ request['startAt'] = since;
10165
+ }
10166
+ if (limit !== undefined) {
10167
+ request['pageSize'] = limit;
10168
+ }
10169
+ [request, params] = this.handleUntilOption('endAt', request, params);
10170
+ //
10171
+ // {
10172
+ // "code": "200000",
10173
+ // "data": {
10174
+ // "items": [
10175
+ // {
10176
+ // "symbol": "DOGEUSDTM",
10177
+ // "closeId": "30000000000162175",
10178
+ // "marginMode": "CROSS",
10179
+ // "side": "LONG",
10180
+ // "entryPrice": "0.09641",
10181
+ // "closePrice": "0.09613",
10182
+ // "maxSize": "1",
10183
+ // "avgClosePrice": "0.09613",
10184
+ // "leverage": "3",
10185
+ // "realizedPnL": "-0.0395524",
10186
+ // "fee": "0.0115524",
10187
+ // "tax": "0",
10188
+ // "fundingFee": "0",
10189
+ // "closingTime": 1774469647311000000,
10190
+ // "creationTime": 1774468501294000000
10191
+ // }
10192
+ // ],
10193
+ // "lastId": 30000000000162175
10194
+ // }
10195
+ // }
10196
+ //
10197
+ response = await this.utaPrivateGetPositionHistory(this.extend(request, params));
8728
10198
  }
8729
- const until = this.safeInteger(params, 'until');
8730
- if (until !== undefined) {
8731
- params = this.omit(params, 'until');
8732
- request['to'] = until;
10199
+ else {
10200
+ if (limit === undefined) {
10201
+ limit = 200;
10202
+ }
10203
+ request['limit'] = limit;
10204
+ if (since !== undefined) {
10205
+ request['from'] = since;
10206
+ }
10207
+ const until = this.safeInteger(params, 'until');
10208
+ if (until !== undefined) {
10209
+ params = this.omit(params, 'until');
10210
+ request['to'] = until;
10211
+ }
10212
+ //
10213
+ // {
10214
+ // "success": true,
10215
+ // "code": "200",
10216
+ // "msg": "success",
10217
+ // "retry": false,
10218
+ // "data": {
10219
+ // "currentPage": 1,
10220
+ // "pageSize": 10,
10221
+ // "totalNum": 25,
10222
+ // "totalPage": 3,
10223
+ // "items": [
10224
+ // {
10225
+ // "closeId": "300000000000000030",
10226
+ // "positionId": "300000000000000009",
10227
+ // "uid": 99996908309485,
10228
+ // "userId": "6527d4fc8c7f3d0001f40f5f",
10229
+ // "symbol": "XBTUSDM",
10230
+ // "settleCurrency": "XBT",
10231
+ // "leverage": "0.0",
10232
+ // "type": "LIQUID_LONG",
10233
+ // "side": null,
10234
+ // "closeSize": null,
10235
+ // "pnl": "-1.0000003793999999",
10236
+ // "realisedGrossCost": "0.9993849748999999",
10237
+ // "withdrawPnl": "0.0",
10238
+ // "roe": null,
10239
+ // "tradeFee": "0.0006154045",
10240
+ // "fundingFee": "0.0",
10241
+ // "openTime": 1713785751181,
10242
+ // "closeTime": 1713785752784,
10243
+ // "openPrice": null,
10244
+ // "closePrice": null
10245
+ // }
10246
+ // ]
10247
+ // }
10248
+ // }
10249
+ //
10250
+ response = await this.futuresPrivateGetHistoryPositions(this.extend(request, params));
8733
10251
  }
8734
- const response = await this.futuresPrivateGetHistoryPositions(this.extend(request, params));
8735
- //
8736
- // {
8737
- // "success": true,
8738
- // "code": "200",
8739
- // "msg": "success",
8740
- // "retry": false,
8741
- // "data": {
8742
- // "currentPage": 1,
8743
- // "pageSize": 10,
8744
- // "totalNum": 25,
8745
- // "totalPage": 3,
8746
- // "items": [
8747
- // {
8748
- // "closeId": "300000000000000030",
8749
- // "positionId": "300000000000000009",
8750
- // "uid": 99996908309485,
8751
- // "userId": "6527d4fc8c7f3d0001f40f5f",
8752
- // "symbol": "XBTUSDM",
8753
- // "settleCurrency": "XBT",
8754
- // "leverage": "0.0",
8755
- // "type": "LIQUID_LONG",
8756
- // "side": null,
8757
- // "closeSize": null,
8758
- // "pnl": "-1.0000003793999999",
8759
- // "realisedGrossCost": "0.9993849748999999",
8760
- // "withdrawPnl": "0.0",
8761
- // "roe": null,
8762
- // "tradeFee": "0.0006154045",
8763
- // "fundingFee": "0.0",
8764
- // "openTime": 1713785751181,
8765
- // "closeTime": 1713785752784,
8766
- // "openPrice": null,
8767
- // "closePrice": null
8768
- // }
8769
- // ]
8770
- // }
8771
- // }
8772
- //
8773
10252
  const data = this.safeDict(response, 'data');
8774
10253
  const items = this.safeList(data, 'items', []);
8775
10254
  return this.parsePositions(items, symbols);
@@ -8844,61 +10323,107 @@ export default class kucoin extends Exchange {
8844
10323
  // "closePrice": null
8845
10324
  // }
8846
10325
  //
10326
+ // uta fetchPositions
10327
+ // {
10328
+ // "symbol": "DOGEUSDTM",
10329
+ // "id": "30000000000084351",
10330
+ // "marginMode": "CROSS",
10331
+ // "size": "2",
10332
+ // "entryPrice": "0.093795",
10333
+ // "positionValue": "18.298",
10334
+ // "markPrice": "0.09149",
10335
+ // "leverage": "3",
10336
+ // "unrealizedPnL": "-0.461",
10337
+ // "realizedPnL": "-0.01122489",
10338
+ // "initialMargin": "6.0993333327234",
10339
+ // "mmr": "0.007",
10340
+ // "maintenanceMargin": "0.128086",
10341
+ // "creationTime": 1774469753178000000
10342
+ // }
10343
+ //
10344
+ // uta fetchPositionsHistory
10345
+ // {
10346
+ // "symbol": "DOGEUSDTM",
10347
+ // "closeId": "30000000000162175",
10348
+ // "marginMode": "CROSS",
10349
+ // "side": "LONG",
10350
+ // "entryPrice": "0.09641",
10351
+ // "closePrice": "0.09613",
10352
+ // "maxSize": "1",
10353
+ // "avgClosePrice": "0.09613",
10354
+ // "leverage": "3",
10355
+ // "realizedPnL": "-0.0395524",
10356
+ // "fee": "0.0115524",
10357
+ // "tax": "0",
10358
+ // "fundingFee": "0",
10359
+ // "closingTime": 1774469647311000000,
10360
+ // "creationTime": 1774468501294000000
10361
+ // }
10362
+ //
8847
10363
  const symbol = this.safeString(position, 'symbol');
8848
10364
  market = this.safeMarket(symbol, market);
8849
- const timestamp = this.safeInteger(position, 'currentTimestamp');
8850
- const size = this.safeString(position, 'currentQty');
8851
- let side = undefined;
8852
- const type = this.safeStringLower(position, 'type');
8853
- if (size !== undefined) {
8854
- if (Precise.stringGt(size, '0')) {
8855
- side = 'long';
8856
- }
8857
- else if (Precise.stringLt(size, '0')) {
8858
- side = 'short';
8859
- }
10365
+ let timestamp = this.safeInteger(position, 'currentTimestamp');
10366
+ if (timestamp === undefined) {
10367
+ timestamp = this.safeIntegerProduct(position, 'creationTime', 0.000001);
8860
10368
  }
8861
- else if (type !== undefined) {
8862
- if (type.indexOf('long') > -1) {
8863
- side = 'long';
10369
+ const size = this.safeStringN(position, ['currentQty', 'size', 'maxSize', 'closeSize']);
10370
+ let side = this.safeStringLower(position, 'side');
10371
+ const type = this.safeStringLower(position, 'type');
10372
+ if (side === undefined) {
10373
+ if (size !== undefined) {
10374
+ if (Precise.stringGt(size, '0')) {
10375
+ side = 'long';
10376
+ }
10377
+ else if (Precise.stringLt(size, '0')) {
10378
+ side = 'short';
10379
+ }
8864
10380
  }
8865
- else {
8866
- side = 'short';
10381
+ else if (type !== undefined) {
10382
+ if (type.indexOf('long') > -1) {
10383
+ side = 'long';
10384
+ }
10385
+ else {
10386
+ side = 'short';
10387
+ }
8867
10388
  }
8868
10389
  }
8869
- const notional = Precise.stringAbs(this.safeString(position, 'posCost'));
8870
- const initialMargin = this.safeString(position, 'posInit');
10390
+ const notional = Precise.stringAbs(this.safeString2(position, 'posCost', 'positionValue'));
10391
+ const initialMargin = this.safeString2(position, 'posInit', 'initialMargin');
8871
10392
  const initialMarginPercentage = Precise.stringDiv(initialMargin, notional);
8872
10393
  // const marginRatio = Precise.stringDiv (maintenanceRate, collateral);
8873
- const unrealisedPnl = this.safeString(position, 'unrealisedPnl');
10394
+ const unrealisedPnl = this.safeString2(position, 'unrealisedPnl', 'unrealizedPnL');
8874
10395
  const crossMode = this.safeValue(position, 'crossMode');
8875
10396
  // currently crossMode is always set to false and only isolated positions are supported
8876
- let marginMode = undefined;
10397
+ let marginMode = this.safeStringLower(position, 'marginMode');
8877
10398
  if (crossMode !== undefined) {
8878
10399
  marginMode = crossMode ? 'cross' : 'isolated';
8879
10400
  }
10401
+ let lastUpdateTimestamp = this.safeInteger(position, 'closeTime');
10402
+ if (lastUpdateTimestamp === undefined) {
10403
+ lastUpdateTimestamp = this.safeIntegerProduct(position, 'closingTime', 0.000001);
10404
+ }
8880
10405
  return this.safePosition({
8881
10406
  'info': position,
8882
- 'id': this.safeString2(position, 'id', 'positionId'),
10407
+ 'id': this.safeStringN(position, ['id', 'positionId', 'closeId']),
8883
10408
  'symbol': this.safeString(market, 'symbol'),
8884
10409
  'timestamp': timestamp,
8885
10410
  'datetime': this.iso8601(timestamp),
8886
- 'lastUpdateTimestamp': this.safeInteger(position, 'closeTime'),
10411
+ 'lastUpdateTimestamp': lastUpdateTimestamp,
8887
10412
  'initialMargin': this.parseNumber(initialMargin),
8888
10413
  'initialMarginPercentage': this.parseNumber(initialMarginPercentage),
8889
- 'maintenanceMargin': this.safeNumber(position, 'posMaint'),
8890
- 'maintenanceMarginPercentage': this.safeNumber(position, 'maintMarginReq'),
8891
- 'entryPrice': this.safeNumber2(position, 'avgEntryPrice', 'openPrice'),
10414
+ 'maintenanceMargin': this.safeNumber2(position, 'posMaint', 'maintenanceMargin'),
10415
+ 'maintenanceMarginPercentage': this.safeNumber2(position, 'maintMarginReq', 'mmr'),
10416
+ 'entryPrice': this.safeNumberN(position, ['avgEntryPrice', 'openPrice', 'entryPrice']),
8892
10417
  'notional': this.parseNumber(notional),
8893
10418
  'leverage': this.safeNumber2(position, 'realLeverage', 'leverage'),
8894
10419
  'unrealizedPnl': this.parseNumber(unrealisedPnl),
8895
10420
  'contracts': this.parseNumber(Precise.stringAbs(size)),
8896
10421
  'contractSize': this.safeValue(market, 'contractSize'),
8897
- 'realizedPnl': this.safeNumber2(position, 'realisedPnl', 'pnl'),
10422
+ 'realizedPnl': this.safeNumberN(position, ['realisedPnl', 'pnl', 'realizedPnL']),
8898
10423
  'marginRatio': undefined,
8899
10424
  'liquidationPrice': this.safeNumber(position, 'liquidationPrice'),
8900
10425
  'markPrice': this.safeNumber(position, 'markPrice'),
8901
- 'lastPrice': undefined,
10426
+ 'lastPrice': this.safeNumber(position, 'closePrice'),
8902
10427
  'collateral': this.safeNumber(position, 'maintMargin'),
8903
10428
  'marginMode': marginMode,
8904
10429
  'side': side,
@@ -8912,18 +10437,31 @@ export default class kucoin extends Exchange {
8912
10437
  * @name kucoin#cancelOrders
8913
10438
  * @description cancel multiple orders for contract markets
8914
10439
  * @see https://www.kucoin.com/docs-new/3470241e0
10440
+ * @see https://www.kucoin.com/docs-new/rest/ua/batch-cancel-order-by-id
8915
10441
  * @param {string[]} ids order ids
8916
10442
  * @param {string} symbol unified symbol of the market the order was made in
8917
10443
  * @param {object} [params] extra parameters specific to the exchange API endpoint
8918
10444
  * @param {string[]} [params.clientOrderIds] client order ids
10445
+ * @param {boolean} [params.uta] set to true to use the unified trading account (uta) endpoint, defaults to false for the contract orders
10446
+ * @param {string} [params.accountMode] *for uta endpoint only* 'unified' or 'classic' (default is 'unified')
10447
+ * @param {string} [params.marginMode] *for margin orders only* 'cross' or 'isolated'
8919
10448
  * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/?id=order-structure}
8920
10449
  */
8921
10450
  async cancelOrders(ids, symbol = undefined, params = {}) {
8922
- // contract markets only
8923
10451
  await this.loadMarkets();
10452
+ let uta = await this.isUTAEnabled();
10453
+ [uta, params] = this.handleOptionAndParams(params, 'cancelOrders', 'uta', uta);
8924
10454
  let market = undefined;
10455
+ let isContractMarket = true; // default to contract market orders if symbol is not provided, uta endpoint requires a symbol to be provided
8925
10456
  if (symbol !== undefined) {
8926
10457
  market = this.market(symbol);
10458
+ isContractMarket = market['contract'];
10459
+ if (!isContractMarket) {
10460
+ uta = true; // spot market orders can only be cancelled via the uta endpoint
10461
+ }
10462
+ }
10463
+ else if (uta) {
10464
+ throw new ArgumentsRequired(this.id + ' cancelOrders() requires a symbol argument for uta endpoint');
8927
10465
  }
8928
10466
  const ordersRequests = [];
8929
10467
  const clientOrderIds = this.safeList2(params, 'clientOrderIds', 'clientOids', []);
@@ -8940,33 +10478,59 @@ export default class kucoin extends Exchange {
8940
10478
  });
8941
10479
  }
8942
10480
  for (let i = 0; i < ids.length; i++) {
8943
- ordersRequests.push(ids[i]);
10481
+ const orderId = ids[i];
10482
+ if (uta) {
10483
+ ordersRequests.push({
10484
+ 'orderId': orderId,
10485
+ 'symbol': market['id'],
10486
+ });
10487
+ }
10488
+ else {
10489
+ ordersRequests.push(ids[i]);
10490
+ }
8944
10491
  }
8945
- const requestKey = useClientorderId ? 'clientOidsList' : 'orderIdsList';
8946
10492
  const request = {};
8947
- request[requestKey] = ordersRequests;
8948
- const response = await this.futuresPrivateDeleteOrdersMultiCancel(this.extend(request, params));
8949
- //
8950
- // {
8951
- // "code": "200000",
8952
- // "data":
8953
- // [
8954
- // {
8955
- // "orderId": "80465574458560512",
8956
- // "clientOid": null,
8957
- // "code": "200",
8958
- // "msg": "success"
8959
- // },
8960
- // {
8961
- // "orderId": "80465575289094144",
8962
- // "clientOid": null,
8963
- // "code": "200",
8964
- // "msg": "success"
8965
- // }
8966
- // ]
8967
- // }
8968
- //
8969
- const orders = this.safeList(response, 'data', []);
10493
+ let response = undefined;
10494
+ let orders = [];
10495
+ if (uta) {
10496
+ let accountMode = 'unified';
10497
+ [accountMode, params] = this.handleOptionAndParams(params, 'cancelOrders', 'accountMode', accountMode);
10498
+ request['accountMode'] = accountMode;
10499
+ let marginMode = undefined;
10500
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrder', params);
10501
+ const tradeType = this.handleTradeType(isContractMarket, marginMode, params);
10502
+ request['tradeType'] = tradeType;
10503
+ request['cancelOrderList'] = ordersRequests;
10504
+ response = await this.utaPrivatePostAccountModeOrderCancelBatch(this.extend(request, params));
10505
+ const data = this.safeDict(response, 'data', {});
10506
+ orders = this.safeList(data, 'items', []);
10507
+ }
10508
+ else {
10509
+ const requestKey = useClientorderId ? 'clientOidsList' : 'orderIdsList';
10510
+ request[requestKey] = ordersRequests;
10511
+ response = await this.futuresPrivateDeleteOrdersMultiCancel(this.extend(request, params));
10512
+ //
10513
+ // {
10514
+ // "code": "200000",
10515
+ // "data":
10516
+ // [
10517
+ // {
10518
+ // "orderId": "80465574458560512",
10519
+ // "clientOid": null,
10520
+ // "code": "200",
10521
+ // "msg": "success"
10522
+ // },
10523
+ // {
10524
+ // "orderId": "80465575289094144",
10525
+ // "clientOid": null,
10526
+ // "code": "200",
10527
+ // "msg": "success"
10528
+ // }
10529
+ // ]
10530
+ // }
10531
+ //
10532
+ orders = this.safeList(response, 'data', []);
10533
+ }
8970
10534
  return this.parseOrders(orders, market);
8971
10535
  }
8972
10536
  /**
@@ -9431,6 +10995,139 @@ export default class kucoin extends Exchange {
9431
10995
  }
9432
10996
  return result;
9433
10997
  }
10998
+ /**
10999
+ * @method
11000
+ * @name kucoin#fetchOpenInterests
11001
+ * @description Retrieves the open interest for a list of symbols
11002
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-futures-open-interset
11003
+ * @param {string[]} [symbols] Unified CCXT market symbol
11004
+ * @param {object} [params] exchange specific parameters
11005
+ * @returns {object} an open interest structure{@link https://docs.ccxt.com/?id=open-interest-structure}
11006
+ */
11007
+ async fetchOpenInterests(symbols = undefined, params = {}) {
11008
+ await this.loadMarkets();
11009
+ symbols = this.marketSymbols(symbols);
11010
+ const request = {};
11011
+ if (symbols !== undefined) {
11012
+ const length = symbols.length;
11013
+ if (length < 11) {
11014
+ // the endpoint does not accept more than 10 symbols at a time
11015
+ // if user provided more than 10 symbols, we will fetch all symbols
11016
+ const marketIds = this.marketIds(symbols);
11017
+ request['symbol'] = marketIds.join(',');
11018
+ }
11019
+ }
11020
+ const response = await this.utaGetMarketOpenInterest(this.extend(request, params));
11021
+ //
11022
+ // {
11023
+ // "code": "200000",
11024
+ // "data": [
11025
+ // {
11026
+ // "symbol": "ETHUSDTM",
11027
+ // "openInterest": "8053960",
11028
+ // "ts": 1774007467050
11029
+ // }
11030
+ // ]
11031
+ // }
11032
+ //
11033
+ const data = this.safeList(response, 'data', []);
11034
+ return this.parseOpenInterests(data, symbols);
11035
+ }
11036
+ parseOpenInterest(interest, market = undefined) {
11037
+ //
11038
+ // {
11039
+ // "symbol": "ETHUSDTM",
11040
+ // "openInterest": "8053960",
11041
+ // "ts": 1774007467050
11042
+ // }
11043
+ //
11044
+ const marketId = this.safeString(interest, 'symbol');
11045
+ market = this.safeMarket(marketId, market);
11046
+ const timestamp = this.safeInteger(interest, 'ts');
11047
+ return this.safeOpenInterest({
11048
+ 'symbol': this.safeSymbol(marketId),
11049
+ 'openInterestAmount': this.safeNumber(interest, 'openInterest'),
11050
+ 'openInterestValue': undefined,
11051
+ 'timestamp': timestamp,
11052
+ 'datetime': this.iso8601(timestamp),
11053
+ 'info': interest,
11054
+ }, market);
11055
+ }
11056
+ /**
11057
+ * @method
11058
+ * @name kucoin#fetchOpenInterestHistory
11059
+ * @description Retrieves the open interest history of a currency
11060
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-futures-open-interset
11061
+ * @param {string} symbol Unified CCXT market symbol
11062
+ * @param {string} timeframe '5m', '15m', '30m', '1h', '4h' or '1d'
11063
+ * @param {int} [since] the time(ms) of the earliest record to retrieve as a unix timestamp
11064
+ * @param {int} [limit] default 30,max 200
11065
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
11066
+ * @param {int} [params.until] the latest time in ms to fetch entries for
11067
+ * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
11068
+ * @returns {object} an array of [open interest structures]{@link https://docs.ccxt.com/?id=open-interest-structure}
11069
+ */
11070
+ async fetchOpenInterestHistory(symbol, timeframe = '5m', since = undefined, limit = undefined, params = {}) {
11071
+ const timeframes = {
11072
+ '5m': '5min',
11073
+ '15m': '15min',
11074
+ '30m': '30min',
11075
+ '1h': '1hour',
11076
+ '4h': '4hour',
11077
+ '1d': '1day',
11078
+ '5min': '5min',
11079
+ '15min': '15min',
11080
+ '30min': '30min',
11081
+ '1hour': '1hour',
11082
+ '4hour': '4hour',
11083
+ '1day': '1day',
11084
+ };
11085
+ const interval = this.safeString(timeframes, timeframe);
11086
+ if (interval === undefined) {
11087
+ throw new BadRequest(this.id + ' fetchOpenInterestHistory() invalid timeframe, supported are 5m, 15m, 30m, 1h, 4h, 1d');
11088
+ }
11089
+ await this.loadMarkets();
11090
+ const market = this.market(symbol);
11091
+ const maxLimit = 200;
11092
+ let paginate = false;
11093
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOpenInterestHistory', 'paginate', paginate);
11094
+ if (paginate) {
11095
+ return await this.fetchPaginatedCallDeterministic('fetchOpenInterestHistory', symbol, since, limit, timeframe, params, maxLimit);
11096
+ }
11097
+ let request = {
11098
+ 'symbol': market['id'],
11099
+ 'interval': interval,
11100
+ };
11101
+ if (since !== undefined) {
11102
+ request['startAt'] = since;
11103
+ }
11104
+ if (limit !== undefined) {
11105
+ request['pageSize'] = limit;
11106
+ }
11107
+ [request, params] = this.handleUntilOption('endAt', request, params);
11108
+ const response = await this.utaGetMarketOpenInterest(this.extend(request, params));
11109
+ const data = this.safeList(response, 'data');
11110
+ return this.parseOpenInterestsHistory(data, market, since, limit);
11111
+ }
11112
+ /**
11113
+ * @method
11114
+ * @name kucoin#isUTAEnabled
11115
+ * @see https://www.kucoin.com/docs-new/rest/ua/get-account-mode
11116
+ * @description returns true or false so the user can check if unified account is enabled
11117
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
11118
+ * @returns {boolean} true if unified account is enabled, false otherwise
11119
+ */
11120
+ async isUTAEnabled(params = {}) {
11121
+ let uta = this.safeBool(this.options, 'uta');
11122
+ if (uta === undefined) {
11123
+ const response = await this.utaPrivateGetAccountMode(params);
11124
+ const data = this.safeDict(response, 'data', {});
11125
+ const accountMode = this.safeString(data, 'selfAccountMode');
11126
+ uta = (accountMode === 'UNIFIED');
11127
+ this.options['uta'] = uta;
11128
+ }
11129
+ return this.safeBool(this.options, 'uta', false);
11130
+ }
9434
11131
  sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
9435
11132
  //
9436
11133
  // the v2 URL is https://openapi-v2.kucoin.com/api/v1/endpoint
@@ -9461,11 +11158,15 @@ export default class kucoin extends Exchange {
9461
11158
  let endpart = '';
9462
11159
  headers = (headers !== undefined) ? headers : {};
9463
11160
  let url = this.urls['api'][api];
11161
+ const tradeType = this.safeString(query, 'tradeType');
9464
11162
  if (!this.isEmpty(query)) {
9465
11163
  if (((method === 'GET') || (method === 'DELETE')) && (path !== 'orders/multi-cancel')) {
9466
11164
  endpoint += '?' + this.rawencode(query);
9467
11165
  }
9468
11166
  else {
11167
+ if (endpoint === '/api/ua/v1/classic/order/place') {
11168
+ endpoint += '?tradeType=' + tradeType;
11169
+ }
9469
11170
  body = this.json(query);
9470
11171
  endpart = body;
9471
11172
  headers['Content-Type'] = 'application/json';
@@ -9496,7 +11197,9 @@ export default class kucoin extends Exchange {
9496
11197
  const signature = this.hmac(this.encode(payload), this.encode(this.secret), sha256, 'base64');
9497
11198
  headers['KC-API-SIGN'] = signature;
9498
11199
  let partner = this.safeDict(this.options, 'partner', {});
9499
- partner = isFuturePrivate ? this.safeValue(partner, 'future', partner) : this.safeValue(partner, 'spot', partner);
11200
+ const isUtaFuturePrivate = isUtaPrivate && (tradeType === 'FUTURES');
11201
+ const isFuturePartner = isFuturePrivate || isUtaFuturePrivate;
11202
+ partner = isFuturePartner ? this.safeValue(partner, 'future', partner) : this.safeValue(partner, 'spot', partner);
9500
11203
  const partnerId = this.safeString(partner, 'id');
9501
11204
  const partnerSecret = this.safeString2(partner, 'secret', 'key');
9502
11205
  if ((partnerId !== undefined) && (partnerSecret !== undefined)) {