ccxt 4.5.12 → 4.5.14

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 (914) hide show
  1. package/README.md +7 -6
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +31 -2
  4. package/dist/cjs/src/abstract/alpaca.js +1 -1
  5. package/dist/cjs/src/abstract/apex.js +1 -1
  6. package/dist/cjs/src/abstract/arkham.js +11 -0
  7. package/dist/cjs/src/abstract/ascendex.js +1 -1
  8. package/dist/cjs/src/abstract/backpack.js +1 -1
  9. package/dist/cjs/src/abstract/bigone.js +1 -1
  10. package/dist/cjs/src/abstract/binance.js +1 -1
  11. package/dist/cjs/src/abstract/bingx.js +1 -1
  12. package/dist/cjs/src/abstract/bit2c.js +1 -1
  13. package/dist/cjs/src/abstract/bitbank.js +1 -1
  14. package/dist/cjs/src/abstract/bitbns.js +1 -1
  15. package/dist/cjs/src/abstract/bitfinex.js +1 -1
  16. package/dist/cjs/src/abstract/bitflyer.js +1 -1
  17. package/dist/cjs/src/abstract/bitget.js +1 -1
  18. package/dist/cjs/src/abstract/bithumb.js +1 -1
  19. package/dist/cjs/src/abstract/bitmart.js +1 -1
  20. package/dist/cjs/src/abstract/bitmex.js +1 -1
  21. package/dist/cjs/src/abstract/bitopro.js +1 -1
  22. package/dist/cjs/src/abstract/bitrue.js +1 -1
  23. package/dist/cjs/src/abstract/bitso.js +1 -1
  24. package/dist/cjs/src/abstract/bitstamp.js +1 -1
  25. package/dist/cjs/src/abstract/bitteam.js +1 -1
  26. package/dist/cjs/src/abstract/bittrade.js +1 -1
  27. package/dist/cjs/src/abstract/bitvavo.js +1 -1
  28. package/dist/cjs/src/abstract/blockchaincom.js +1 -1
  29. package/dist/cjs/src/abstract/blofin.js +1 -1
  30. package/dist/cjs/src/abstract/btcalpha.js +1 -1
  31. package/dist/cjs/src/abstract/btcbox.js +1 -1
  32. package/dist/cjs/src/abstract/btcmarkets.js +1 -1
  33. package/dist/cjs/src/abstract/btcturk.js +1 -1
  34. package/dist/cjs/src/abstract/bybit.js +1 -1
  35. package/dist/cjs/src/abstract/cex.js +1 -1
  36. package/dist/cjs/src/abstract/coinbase.js +1 -1
  37. package/dist/cjs/src/abstract/coinbaseexchange.js +1 -1
  38. package/dist/cjs/src/abstract/coinbaseinternational.js +1 -1
  39. package/dist/cjs/src/abstract/coincatch.js +1 -1
  40. package/dist/cjs/src/abstract/coincheck.js +1 -1
  41. package/dist/cjs/src/abstract/coinex.js +1 -1
  42. package/dist/cjs/src/abstract/coinmate.js +1 -1
  43. package/dist/cjs/src/abstract/coinmetro.js +1 -1
  44. package/dist/cjs/src/abstract/coinone.js +1 -1
  45. package/dist/cjs/src/abstract/coinsph.js +1 -1
  46. package/dist/cjs/src/abstract/coinspot.js +1 -1
  47. package/dist/cjs/src/abstract/cryptocom.js +1 -1
  48. package/dist/cjs/src/abstract/cryptomus.js +1 -1
  49. package/dist/cjs/src/abstract/defx.js +1 -1
  50. package/dist/cjs/src/abstract/delta.js +1 -1
  51. package/dist/cjs/src/abstract/deribit.js +1 -1
  52. package/dist/cjs/src/abstract/derive.js +1 -1
  53. package/dist/cjs/src/abstract/digifinex.js +1 -1
  54. package/dist/cjs/src/abstract/exmo.js +1 -1
  55. package/dist/cjs/src/abstract/foxbit.js +1 -1
  56. package/dist/cjs/src/abstract/gate.js +1 -1
  57. package/dist/cjs/src/abstract/gemini.js +1 -1
  58. package/dist/cjs/src/abstract/hashkey.js +1 -1
  59. package/dist/cjs/src/abstract/hibachi.js +1 -1
  60. package/dist/cjs/src/abstract/hitbtc.js +1 -1
  61. package/dist/cjs/src/abstract/hollaex.js +1 -1
  62. package/dist/cjs/src/abstract/htx.js +1 -1
  63. package/dist/cjs/src/abstract/hyperliquid.js +1 -1
  64. package/dist/cjs/src/abstract/independentreserve.js +1 -1
  65. package/dist/cjs/src/abstract/indodax.js +1 -1
  66. package/dist/cjs/src/abstract/kraken.js +1 -1
  67. package/dist/cjs/src/abstract/krakenfutures.js +1 -1
  68. package/dist/cjs/src/abstract/kucoin.js +1 -1
  69. package/dist/cjs/src/abstract/kucoinfutures.js +1 -1
  70. package/dist/cjs/src/abstract/latoken.js +1 -1
  71. package/dist/cjs/src/abstract/lbank.js +1 -1
  72. package/dist/cjs/src/abstract/luno.js +1 -1
  73. package/dist/cjs/src/abstract/mercado.js +1 -1
  74. package/dist/cjs/src/abstract/mexc.js +1 -1
  75. package/dist/cjs/src/abstract/modetrade.js +1 -1
  76. package/dist/cjs/src/abstract/ndax.js +1 -1
  77. package/dist/cjs/src/abstract/novadax.js +1 -1
  78. package/dist/cjs/src/abstract/oceanex.js +1 -1
  79. package/dist/cjs/src/abstract/okx.js +1 -1
  80. package/dist/cjs/src/abstract/onetrading.js +1 -1
  81. package/dist/cjs/src/abstract/oxfun.js +1 -1
  82. package/dist/cjs/src/abstract/p2b.js +1 -1
  83. package/dist/cjs/src/abstract/paradex.js +1 -1
  84. package/dist/cjs/src/abstract/paymium.js +1 -1
  85. package/dist/cjs/src/abstract/phemex.js +1 -1
  86. package/dist/cjs/src/abstract/poloniex.js +1 -1
  87. package/dist/cjs/src/abstract/probit.js +1 -1
  88. package/dist/cjs/src/abstract/timex.js +1 -1
  89. package/dist/cjs/src/abstract/tokocrypto.js +1 -1
  90. package/dist/cjs/src/abstract/toobit.js +1 -1
  91. package/dist/cjs/src/abstract/upbit.js +1 -1
  92. package/dist/cjs/src/abstract/wavesexchange.js +1 -1
  93. package/dist/cjs/src/abstract/whitebit.js +1 -1
  94. package/dist/cjs/src/abstract/woo.js +1 -1
  95. package/dist/cjs/src/abstract/woofipro.js +1 -1
  96. package/dist/cjs/src/abstract/xt.js +1 -1
  97. package/dist/cjs/src/abstract/yobit.js +1 -1
  98. package/dist/cjs/src/abstract/zaif.js +1 -1
  99. package/dist/cjs/src/abstract/zonda.js +1 -1
  100. package/dist/cjs/src/alpaca.js +1 -1
  101. package/dist/cjs/src/apex.js +1 -1
  102. package/dist/cjs/src/arkham.js +2462 -0
  103. package/dist/cjs/src/ascendex.js +1 -1
  104. package/dist/cjs/src/backpack.js +1 -1
  105. package/dist/cjs/src/base/Precise.js +0 -6
  106. package/dist/cjs/src/base/errors.js +0 -6
  107. package/dist/cjs/src/base/functions/crypto.js +1 -1
  108. package/dist/cjs/src/base/functions/encode.js +1 -1
  109. package/dist/cjs/src/base/functions/misc.js +0 -1
  110. package/dist/cjs/src/base/functions/number.js +0 -6
  111. package/dist/cjs/src/base/functions/platform.js +0 -6
  112. package/dist/cjs/src/base/functions/rsa.js +0 -1
  113. package/dist/cjs/src/base/functions/string.js +0 -6
  114. package/dist/cjs/src/base/functions/throttle.js +1 -1
  115. package/dist/cjs/src/base/functions/time.js +0 -6
  116. package/dist/cjs/src/base/functions/totp.js +0 -1
  117. package/dist/cjs/src/base/functions/type.js +0 -6
  118. package/dist/cjs/src/base/functions.js +1 -1
  119. package/dist/cjs/src/base/ws/Cache.js +0 -6
  120. package/dist/cjs/src/base/ws/Client.js +0 -1
  121. package/dist/cjs/src/base/ws/Future.js +1 -1
  122. package/dist/cjs/src/base/ws/OrderBook.js +1 -1
  123. package/dist/cjs/src/base/ws/OrderBookSide.js +0 -6
  124. package/dist/cjs/src/base/ws/WsClient.js +1 -1
  125. package/dist/cjs/src/bequant.js +1 -1
  126. package/dist/cjs/src/bigone.js +1 -1
  127. package/dist/cjs/src/binance.js +9 -3
  128. package/dist/cjs/src/binancecoinm.js +1 -1
  129. package/dist/cjs/src/binanceus.js +1 -1
  130. package/dist/cjs/src/binanceusdm.js +1 -1
  131. package/dist/cjs/src/bingx.js +1 -1
  132. package/dist/cjs/src/bit2c.js +1 -1
  133. package/dist/cjs/src/bitbank.js +1 -1
  134. package/dist/cjs/src/bitbns.js +1 -1
  135. package/dist/cjs/src/bitfinex.js +1 -1
  136. package/dist/cjs/src/bitflyer.js +1 -1
  137. package/dist/cjs/src/bitget.js +76 -35
  138. package/dist/cjs/src/bithumb.js +1 -1
  139. package/dist/cjs/src/bitmart.js +17 -10
  140. package/dist/cjs/src/bitmex.js +1 -1
  141. package/dist/cjs/src/bitopro.js +1 -1
  142. package/dist/cjs/src/bitrue.js +1 -1
  143. package/dist/cjs/src/bitso.js +1 -1
  144. package/dist/cjs/src/bitstamp.js +1 -1
  145. package/dist/cjs/src/bitteam.js +1 -1
  146. package/dist/cjs/src/bittrade.js +1 -1
  147. package/dist/cjs/src/blockchaincom.js +1 -1
  148. package/dist/cjs/src/blofin.js +1 -1
  149. package/dist/cjs/src/btcalpha.js +1 -1
  150. package/dist/cjs/src/btcbox.js +1 -1
  151. package/dist/cjs/src/btcmarkets.js +1 -1
  152. package/dist/cjs/src/btcturk.js +1 -1
  153. package/dist/cjs/src/bybit.js +9 -1
  154. package/dist/cjs/src/cex.js +1 -1
  155. package/dist/cjs/src/coinbaseadvanced.js +1 -1
  156. package/dist/cjs/src/coincatch.js +1 -1
  157. package/dist/cjs/src/coincheck.js +1 -1
  158. package/dist/cjs/src/coinex.js +1 -1
  159. package/dist/cjs/src/coinmate.js +1 -1
  160. package/dist/cjs/src/coinmetro.js +1 -1
  161. package/dist/cjs/src/coinone.js +1 -1
  162. package/dist/cjs/src/coinsph.js +0 -1
  163. package/dist/cjs/src/coinspot.js +1 -1
  164. package/dist/cjs/src/cryptocom.js +23 -19
  165. package/dist/cjs/src/cryptomus.js +1 -1
  166. package/dist/cjs/src/defx.js +4 -3
  167. package/dist/cjs/src/delta.js +1 -1
  168. package/dist/cjs/src/deribit.js +1 -1
  169. package/dist/cjs/src/derive.js +1 -1
  170. package/dist/cjs/src/digifinex.js +1 -1
  171. package/dist/cjs/src/exmo.js +1 -1
  172. package/dist/cjs/src/fmfwio.js +1 -1
  173. package/dist/cjs/src/foxbit.js +1 -1
  174. package/dist/cjs/src/gate.js +80 -28
  175. package/dist/cjs/src/gateio.js +1 -1
  176. package/dist/cjs/src/gemini.js +1 -1
  177. package/dist/cjs/src/hashkey.js +1 -1
  178. package/dist/cjs/src/hibachi.js +4 -4
  179. package/dist/cjs/src/hitbtc.js +0 -1
  180. package/dist/cjs/src/hollaex.js +1 -1
  181. package/dist/cjs/src/htx.js +1 -1
  182. package/dist/cjs/src/huobi.js +1 -1
  183. package/dist/cjs/src/hyperliquid.js +116 -15
  184. package/dist/cjs/src/independentreserve.js +1 -1
  185. package/dist/cjs/src/indodax.js +1 -1
  186. package/dist/cjs/src/kraken.js +1 -1
  187. package/dist/cjs/src/krakenfutures.js +46 -34
  188. package/dist/cjs/src/kucoin.js +42 -4
  189. package/dist/cjs/src/kucoinfutures.js +1 -1
  190. package/dist/cjs/src/latoken.js +1 -1
  191. package/dist/cjs/src/lbank.js +1 -1
  192. package/dist/cjs/src/luno.js +1 -1
  193. package/dist/cjs/src/mercado.js +1 -1
  194. package/dist/cjs/src/mexc.js +1 -1
  195. package/dist/cjs/src/modetrade.js +1 -1
  196. package/dist/cjs/src/myokx.js +1 -1
  197. package/dist/cjs/src/ndax.js +1 -1
  198. package/dist/cjs/src/novadax.js +1 -1
  199. package/dist/cjs/src/oceanex.js +1 -1
  200. package/dist/cjs/src/okx.js +10 -2
  201. package/dist/cjs/src/okxus.js +1 -1
  202. package/dist/cjs/src/onetrading.js +1 -1
  203. package/dist/cjs/src/oxfun.js +1 -1
  204. package/dist/cjs/src/p2b.js +1 -1
  205. package/dist/cjs/src/paradex.js +1 -1
  206. package/dist/cjs/src/paymium.js +1 -1
  207. package/dist/cjs/src/poloniex.js +1 -1
  208. package/dist/cjs/src/pro/alpaca.js +1 -1
  209. package/dist/cjs/src/pro/apex.js +1 -1
  210. package/dist/cjs/src/pro/arkham.js +715 -0
  211. package/dist/cjs/src/pro/ascendex.js +1 -1
  212. package/dist/cjs/src/pro/backpack.js +1 -1
  213. package/dist/cjs/src/pro/bequant.js +1 -1
  214. package/dist/cjs/src/pro/binance.js +6 -6
  215. package/dist/cjs/src/pro/binancecoinm.js +1 -1
  216. package/dist/cjs/src/pro/binanceus.js +1 -1
  217. package/dist/cjs/src/pro/binanceusdm.js +1 -1
  218. package/dist/cjs/src/pro/bingx.js +1 -1
  219. package/dist/cjs/src/pro/bitfinex.js +10 -7
  220. package/dist/cjs/src/pro/bitget.js +1 -1
  221. package/dist/cjs/src/pro/bithumb.js +263 -7
  222. package/dist/cjs/src/pro/bitmart.js +1 -1
  223. package/dist/cjs/src/pro/bitmex.js +1 -1
  224. package/dist/cjs/src/pro/bitrue.js +1 -1
  225. package/dist/cjs/src/pro/bitstamp.js +1 -1
  226. package/dist/cjs/src/pro/bitvavo.js +1 -1
  227. package/dist/cjs/src/pro/blockchaincom.js +1 -1
  228. package/dist/cjs/src/pro/blofin.js +1 -1
  229. package/dist/cjs/src/pro/bybit.js +1 -1
  230. package/dist/cjs/src/pro/cex.js +1 -1
  231. package/dist/cjs/src/pro/coinbase.js +1 -1
  232. package/dist/cjs/src/pro/coinbaseadvanced.js +1 -1
  233. package/dist/cjs/src/pro/coinbaseexchange.js +1 -1
  234. package/dist/cjs/src/pro/coinbaseinternational.js +1 -1
  235. package/dist/cjs/src/pro/coincatch.js +1 -1
  236. package/dist/cjs/src/pro/coincheck.js +1 -1
  237. package/dist/cjs/src/pro/coinex.js +1 -1
  238. package/dist/cjs/src/pro/coinone.js +1 -1
  239. package/dist/cjs/src/pro/cryptocom.js +1 -1
  240. package/dist/cjs/src/pro/defx.js +1 -1
  241. package/dist/cjs/src/pro/deribit.js +3 -2
  242. package/dist/cjs/src/pro/exmo.js +1 -1
  243. package/dist/cjs/src/pro/gate.js +1 -1
  244. package/dist/cjs/src/pro/gateio.js +1 -1
  245. package/dist/cjs/src/pro/gemini.js +1 -1
  246. package/dist/cjs/src/pro/hashkey.js +1 -1
  247. package/dist/cjs/src/pro/hitbtc.js +1 -1
  248. package/dist/cjs/src/pro/hollaex.js +1 -1
  249. package/dist/cjs/src/pro/htx.js +9 -7
  250. package/dist/cjs/src/pro/huobi.js +1 -1
  251. package/dist/cjs/src/pro/hyperliquid.js +1 -1
  252. package/dist/cjs/src/pro/independentreserve.js +1 -1
  253. package/dist/cjs/src/pro/kraken.js +1 -1
  254. package/dist/cjs/src/pro/krakenfutures.js +1 -1
  255. package/dist/cjs/src/pro/kucoin.js +1 -1
  256. package/dist/cjs/src/pro/kucoinfutures.js +1 -1
  257. package/dist/cjs/src/pro/lbank.js +0 -1
  258. package/dist/cjs/src/pro/luno.js +1 -1
  259. package/dist/cjs/src/pro/mexc.js +1 -1
  260. package/dist/cjs/src/pro/myokx.js +1 -1
  261. package/dist/cjs/src/pro/ndax.js +1 -1
  262. package/dist/cjs/src/pro/okx.js +1 -1
  263. package/dist/cjs/src/pro/okxus.js +1 -1
  264. package/dist/cjs/src/pro/onetrading.js +1 -1
  265. package/dist/cjs/src/pro/oxfun.js +1 -1
  266. package/dist/cjs/src/pro/p2b.js +1 -1
  267. package/dist/cjs/src/pro/paradex.js +1 -1
  268. package/dist/cjs/src/pro/phemex.js +1 -1
  269. package/dist/cjs/src/pro/poloniex.js +1 -1
  270. package/dist/cjs/src/pro/probit.js +1 -1
  271. package/dist/cjs/src/pro/toobit.js +4 -3
  272. package/dist/cjs/src/pro/upbit.js +2 -2
  273. package/dist/cjs/src/pro/whitebit.js +1 -1
  274. package/dist/cjs/src/pro/xt.js +1 -1
  275. package/dist/cjs/src/probit.js +1 -1
  276. package/dist/cjs/src/protobuf/mexc/compiled.cjs.js +1 -0
  277. package/dist/cjs/src/static_dependencies/ethers/abi-coder.js +0 -6
  278. package/dist/cjs/src/static_dependencies/ethers/address/address.js +1 -1
  279. package/dist/cjs/src/static_dependencies/ethers/coders/abstract-coder.js +0 -6
  280. package/dist/cjs/src/static_dependencies/ethers/coders/address.js +0 -1
  281. package/dist/cjs/src/static_dependencies/ethers/coders/anonymous.js +0 -1
  282. package/dist/cjs/src/static_dependencies/ethers/coders/array.js +0 -1
  283. package/dist/cjs/src/static_dependencies/ethers/coders/boolean.js +0 -1
  284. package/dist/cjs/src/static_dependencies/ethers/coders/bytes.js +0 -1
  285. package/dist/cjs/src/static_dependencies/ethers/coders/fixed-bytes.js +0 -1
  286. package/dist/cjs/src/static_dependencies/ethers/coders/null.js +0 -1
  287. package/dist/cjs/src/static_dependencies/ethers/coders/number.js +0 -1
  288. package/dist/cjs/src/static_dependencies/ethers/coders/string.js +0 -1
  289. package/dist/cjs/src/static_dependencies/ethers/coders/tuple.js +0 -1
  290. package/dist/cjs/src/static_dependencies/ethers/fragments.js +0 -6
  291. package/dist/cjs/src/static_dependencies/ethers/hash/typed-data.js +0 -6
  292. package/dist/cjs/src/static_dependencies/ethers/index.js +10 -1
  293. package/dist/cjs/src/static_dependencies/ethers/interface.js +0 -6
  294. package/dist/cjs/src/static_dependencies/ethers/typed.js +0 -6
  295. package/dist/cjs/src/static_dependencies/ethers/utils/base58.js +13 -1
  296. package/dist/cjs/src/static_dependencies/ethers/utils/data.js +6 -1
  297. package/dist/cjs/src/static_dependencies/ethers/utils/errors.js +9 -1
  298. package/dist/cjs/src/static_dependencies/ethers/utils/events.js +0 -6
  299. package/dist/cjs/src/static_dependencies/ethers/utils/fixednumber.js +0 -6
  300. package/dist/cjs/src/static_dependencies/ethers/utils/index.js +7 -1
  301. package/dist/cjs/src/static_dependencies/ethers/utils/maths.js +5 -1
  302. package/dist/cjs/src/static_dependencies/ethers/utils/properties.js +0 -6
  303. package/dist/cjs/src/static_dependencies/ethers/utils/utf8.js +8 -1
  304. package/dist/cjs/src/static_dependencies/fflake/browser.js +1 -1
  305. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -1
  306. package/dist/cjs/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -1
  307. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +1 -1
  308. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -6
  309. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -6
  310. package/dist/cjs/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -6
  311. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -1
  312. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1 -1
  313. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -6
  314. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +1 -1
  315. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +1 -1
  316. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -6
  317. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1 -1
  318. package/dist/cjs/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -6
  319. package/dist/cjs/src/static_dependencies/messagepack/msgpack.js +0 -6
  320. package/dist/cjs/src/static_dependencies/noble-curves/_shortw_utils.js +1 -1
  321. package/dist/cjs/src/static_dependencies/noble-curves/abstract/curve.js +1 -1
  322. package/dist/cjs/src/static_dependencies/noble-curves/abstract/edwards.js +1 -1
  323. package/dist/cjs/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -1
  324. package/dist/cjs/src/static_dependencies/noble-curves/abstract/modular.js +1 -1
  325. package/dist/cjs/src/static_dependencies/noble-curves/abstract/montgomery.js +1 -1
  326. package/dist/cjs/src/static_dependencies/noble-curves/abstract/poseidon.js +1 -1
  327. package/dist/cjs/src/static_dependencies/noble-curves/abstract/utils.js +0 -6
  328. package/dist/cjs/src/static_dependencies/noble-curves/abstract/weierstrass.js +1 -1
  329. package/dist/cjs/src/static_dependencies/noble-curves/ed25519.js +1 -1
  330. package/dist/cjs/src/static_dependencies/noble-curves/p256.js +1 -1
  331. package/dist/cjs/src/static_dependencies/noble-curves/secp256k1.js +1 -1
  332. package/dist/cjs/src/static_dependencies/noble-hashes/_assert.js +0 -6
  333. package/dist/cjs/src/static_dependencies/noble-hashes/_sha2.js +0 -1
  334. package/dist/cjs/src/static_dependencies/noble-hashes/_u64.js +0 -6
  335. package/dist/cjs/src/static_dependencies/noble-hashes/crypto.js +0 -6
  336. package/dist/cjs/src/static_dependencies/noble-hashes/hmac.js +0 -1
  337. package/dist/cjs/src/static_dependencies/noble-hashes/md5.js +0 -1
  338. package/dist/cjs/src/static_dependencies/noble-hashes/sha1.js +0 -1
  339. package/dist/cjs/src/static_dependencies/noble-hashes/sha256.js +0 -1
  340. package/dist/cjs/src/static_dependencies/noble-hashes/sha3.js +0 -1
  341. package/dist/cjs/src/static_dependencies/noble-hashes/sha512.js +0 -1
  342. package/dist/cjs/src/static_dependencies/noble-hashes/utils.js +1 -1
  343. package/dist/cjs/src/static_dependencies/node-fetch/body.js +5 -1
  344. package/dist/cjs/src/static_dependencies/node-fetch/errors/abort-error.js +0 -1
  345. package/dist/cjs/src/static_dependencies/node-fetch/errors/base.js +0 -6
  346. package/dist/cjs/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -1
  347. package/dist/cjs/src/static_dependencies/node-fetch/headers.js +5 -1
  348. package/dist/cjs/src/static_dependencies/node-fetch/index.js +7 -1
  349. package/dist/cjs/src/static_dependencies/node-fetch/request.js +7 -1
  350. package/dist/cjs/src/static_dependencies/node-fetch/response.js +5 -1
  351. package/dist/cjs/src/static_dependencies/node-fetch/utils/get-search.js +0 -6
  352. package/dist/cjs/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -6
  353. package/dist/cjs/src/static_dependencies/node-fetch/utils/is.js +0 -6
  354. package/dist/cjs/src/static_dependencies/node-fetch/utils/referrer.js +0 -1
  355. package/dist/cjs/src/static_dependencies/proxies/agent-base/index.js +0 -1
  356. package/dist/cjs/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -1
  357. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -1
  358. package/dist/cjs/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -6
  359. package/dist/cjs/src/static_dependencies/qs/formats.js +0 -6
  360. package/dist/cjs/src/static_dependencies/qs/index.js +0 -1
  361. package/dist/cjs/src/static_dependencies/qs/parse.js +0 -1
  362. package/dist/cjs/src/static_dependencies/qs/stringify.js +0 -1
  363. package/dist/cjs/src/static_dependencies/qs/utils.js +0 -6
  364. package/dist/cjs/src/static_dependencies/scure-base/index.js +0 -6
  365. package/dist/cjs/src/static_dependencies/scure-starknet/index.js +1 -1
  366. package/dist/cjs/src/static_dependencies/starknet/constants.js +1 -1
  367. package/dist/cjs/src/static_dependencies/starknet/types/calldata.js +0 -6
  368. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/abi.js +0 -6
  369. package/dist/cjs/src/static_dependencies/starknet/types/lib/contract/index.js +0 -6
  370. package/dist/cjs/src/static_dependencies/starknet/types/lib/index.js +0 -6
  371. package/dist/cjs/src/static_dependencies/starknet/types/typedData.js +0 -6
  372. package/dist/cjs/src/static_dependencies/starknet/utils/assert.js +0 -6
  373. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +1 -1
  374. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +1 -1
  375. package/dist/cjs/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +1 -1
  376. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/byteArray.js +0 -1
  377. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/cairo.js +0 -1
  378. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +0 -6
  379. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +0 -6
  380. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +0 -6
  381. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/formatter.js +0 -1
  382. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/index.js +1 -1
  383. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/index.js +0 -1
  384. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +0 -1
  385. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +0 -6
  386. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +0 -1
  387. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/requestParser.js +0 -1
  388. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/responseParser.js +0 -1
  389. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/tuple.js +1 -1
  390. package/dist/cjs/src/static_dependencies/starknet/utils/calldata/validate.js +4 -1
  391. package/dist/cjs/src/static_dependencies/starknet/utils/encode.js +0 -1
  392. package/dist/cjs/src/static_dependencies/starknet/utils/hash/classHash.js +3 -1
  393. package/dist/cjs/src/static_dependencies/starknet/utils/merkle.js +0 -1
  394. package/dist/cjs/src/static_dependencies/starknet/utils/num.js +0 -1
  395. package/dist/cjs/src/static_dependencies/starknet/utils/selector.js +0 -1
  396. package/dist/cjs/src/static_dependencies/starknet/utils/shortString.js +0 -1
  397. package/dist/cjs/src/static_dependencies/starknet/utils/typedData.js +1 -1
  398. package/dist/cjs/src/static_dependencies/watchable/src/unpromise.js +0 -6
  399. package/dist/cjs/src/static_dependencies/zklink/zklink-sdk-web.js +0 -6
  400. package/dist/cjs/src/timex.js +0 -1
  401. package/dist/cjs/src/tokocrypto.js +1 -1
  402. package/dist/cjs/src/toobit.js +2 -2
  403. package/dist/cjs/src/upbit.js +1 -1
  404. package/dist/cjs/src/wavesexchange.js +1 -1
  405. package/dist/cjs/src/whitebit.js +1 -1
  406. package/dist/cjs/src/woo.js +1 -1
  407. package/dist/cjs/src/woofipro.js +1 -1
  408. package/dist/cjs/src/xt.js +1 -1
  409. package/dist/cjs/src/yobit.js +1 -1
  410. package/dist/cjs/src/zaif.js +1 -1
  411. package/dist/cjs/src/zonda.js +1 -1
  412. package/js/ccxt.d.ts +8 -2
  413. package/js/ccxt.js +6 -8
  414. package/js/src/abstract/alpaca.js +0 -6
  415. package/js/src/abstract/apex.js +0 -6
  416. package/js/src/abstract/arkham.d.ts +121 -0
  417. package/js/src/abstract/arkham.js +5 -0
  418. package/js/src/abstract/ascendex.js +0 -6
  419. package/js/src/abstract/backpack.js +0 -6
  420. package/js/src/abstract/bequant.js +0 -6
  421. package/js/src/abstract/bigone.js +0 -6
  422. package/js/src/abstract/binance.d.ts +1 -0
  423. package/js/src/abstract/binance.js +0 -6
  424. package/js/src/abstract/binancecoinm.d.ts +1 -0
  425. package/js/src/abstract/binancecoinm.js +0 -6
  426. package/js/src/abstract/binanceus.d.ts +1 -0
  427. package/js/src/abstract/binanceus.js +0 -6
  428. package/js/src/abstract/binanceusdm.d.ts +1 -0
  429. package/js/src/abstract/binanceusdm.js +0 -6
  430. package/js/src/abstract/bingx.js +0 -6
  431. package/js/src/abstract/bit2c.js +0 -6
  432. package/js/src/abstract/bitbank.js +0 -6
  433. package/js/src/abstract/bitbns.js +0 -6
  434. package/js/src/abstract/bitfinex.js +0 -6
  435. package/js/src/abstract/bitflyer.js +0 -6
  436. package/js/src/abstract/bitget.js +0 -6
  437. package/js/src/abstract/bithumb.js +0 -6
  438. package/js/src/abstract/bitmart.js +0 -6
  439. package/js/src/abstract/bitmex.js +0 -6
  440. package/js/src/abstract/bitopro.js +0 -6
  441. package/js/src/abstract/bitrue.js +0 -6
  442. package/js/src/abstract/bitso.js +0 -6
  443. package/js/src/abstract/bitstamp.js +0 -6
  444. package/js/src/abstract/bitteam.js +0 -6
  445. package/js/src/abstract/bittrade.js +0 -6
  446. package/js/src/abstract/bitvavo.js +0 -6
  447. package/js/src/abstract/blockchaincom.js +0 -6
  448. package/js/src/abstract/blofin.js +0 -6
  449. package/js/src/abstract/btcalpha.js +0 -6
  450. package/js/src/abstract/btcbox.js +0 -6
  451. package/js/src/abstract/btcmarkets.js +0 -6
  452. package/js/src/abstract/btcturk.js +0 -6
  453. package/js/src/abstract/bybit.d.ts +8 -0
  454. package/js/src/abstract/bybit.js +0 -6
  455. package/js/src/abstract/cex.js +0 -6
  456. package/js/src/abstract/coinbase.js +0 -6
  457. package/js/src/abstract/coinbaseadvanced.js +0 -6
  458. package/js/src/abstract/coinbaseexchange.js +0 -6
  459. package/js/src/abstract/coinbaseinternational.js +0 -6
  460. package/js/src/abstract/coincatch.js +0 -6
  461. package/js/src/abstract/coincheck.js +0 -6
  462. package/js/src/abstract/coinex.js +0 -6
  463. package/js/src/abstract/coinmate.js +0 -6
  464. package/js/src/abstract/coinmetro.js +0 -6
  465. package/js/src/abstract/coinone.js +0 -6
  466. package/js/src/abstract/coinsph.js +0 -6
  467. package/js/src/abstract/coinspot.js +0 -6
  468. package/js/src/abstract/cryptocom.js +0 -6
  469. package/js/src/abstract/cryptomus.js +0 -6
  470. package/js/src/abstract/defx.js +0 -6
  471. package/js/src/abstract/delta.js +0 -6
  472. package/js/src/abstract/deribit.js +0 -6
  473. package/js/src/abstract/derive.js +0 -6
  474. package/js/src/abstract/digifinex.js +0 -6
  475. package/js/src/abstract/exmo.js +0 -6
  476. package/js/src/abstract/fmfwio.js +0 -6
  477. package/js/src/abstract/foxbit.js +0 -6
  478. package/js/src/abstract/gate.d.ts +62 -18
  479. package/js/src/abstract/gate.js +0 -6
  480. package/js/src/abstract/gateio.d.ts +62 -18
  481. package/js/src/abstract/gateio.js +0 -6
  482. package/js/src/abstract/gemini.js +0 -6
  483. package/js/src/abstract/hashkey.js +0 -6
  484. package/js/src/abstract/hibachi.js +0 -6
  485. package/js/src/abstract/hitbtc.js +0 -6
  486. package/js/src/abstract/hollaex.js +0 -6
  487. package/js/src/abstract/htx.js +0 -6
  488. package/js/src/abstract/huobi.js +0 -6
  489. package/js/src/abstract/hyperliquid.js +0 -6
  490. package/js/src/abstract/independentreserve.js +0 -6
  491. package/js/src/abstract/indodax.js +0 -6
  492. package/js/src/abstract/kraken.js +0 -6
  493. package/js/src/abstract/krakenfutures.js +0 -6
  494. package/js/src/abstract/kucoin.d.ts +30 -0
  495. package/js/src/abstract/kucoin.js +0 -6
  496. package/js/src/abstract/kucoinfutures.d.ts +30 -0
  497. package/js/src/abstract/kucoinfutures.js +0 -6
  498. package/js/src/abstract/latoken.js +0 -6
  499. package/js/src/abstract/lbank.js +0 -6
  500. package/js/src/abstract/luno.js +0 -6
  501. package/js/src/abstract/mercado.js +0 -6
  502. package/js/src/abstract/mexc.js +0 -6
  503. package/js/src/abstract/modetrade.js +0 -6
  504. package/js/src/abstract/myokx.js +0 -6
  505. package/js/src/abstract/ndax.js +0 -6
  506. package/js/src/abstract/novadax.js +0 -6
  507. package/js/src/abstract/oceanex.js +0 -6
  508. package/js/src/abstract/okx.js +0 -6
  509. package/js/src/abstract/okxus.js +0 -6
  510. package/js/src/abstract/onetrading.js +0 -6
  511. package/js/src/abstract/oxfun.js +0 -6
  512. package/js/src/abstract/p2b.js +0 -6
  513. package/js/src/abstract/paradex.js +0 -6
  514. package/js/src/abstract/paymium.js +0 -6
  515. package/js/src/abstract/phemex.js +0 -6
  516. package/js/src/abstract/poloniex.js +0 -6
  517. package/js/src/abstract/probit.js +0 -6
  518. package/js/src/abstract/timex.js +0 -6
  519. package/js/src/abstract/tokocrypto.js +0 -6
  520. package/js/src/abstract/toobit.js +0 -6
  521. package/js/src/abstract/upbit.js +0 -6
  522. package/js/src/abstract/wavesexchange.js +0 -6
  523. package/js/src/abstract/whitebit.js +0 -6
  524. package/js/src/abstract/woo.js +0 -6
  525. package/js/src/abstract/woofipro.js +0 -6
  526. package/js/src/abstract/xt.js +0 -6
  527. package/js/src/abstract/yobit.js +0 -6
  528. package/js/src/abstract/zaif.js +0 -6
  529. package/js/src/abstract/zonda.js +0 -6
  530. package/js/src/alpaca.js +0 -6
  531. package/js/src/apex.js +0 -6
  532. package/js/src/arkham.d.ts +358 -0
  533. package/js/src/arkham.js +2455 -0
  534. package/js/src/ascendex.js +0 -6
  535. package/js/src/backpack.js +0 -6
  536. package/js/src/base/Exchange.d.ts +9 -11
  537. package/js/src/base/Exchange.js +0 -6
  538. package/js/src/base/Precise.js +0 -6
  539. package/js/src/base/errorHierarchy.js +0 -6
  540. package/js/src/base/errors.js +0 -6
  541. package/js/src/base/functions/crypto.js +0 -6
  542. package/js/src/base/functions/encode.js +0 -6
  543. package/js/src/base/functions/generic.js +0 -6
  544. package/js/src/base/functions/misc.js +0 -6
  545. package/js/src/base/functions/number.js +0 -6
  546. package/js/src/base/functions/platform.js +0 -6
  547. package/js/src/base/functions/rsa.js +0 -6
  548. package/js/src/base/functions/string.js +0 -6
  549. package/js/src/base/functions/throttle.js +0 -6
  550. package/js/src/base/functions/time.js +0 -6
  551. package/js/src/base/functions/totp.js +0 -6
  552. package/js/src/base/functions/type.js +0 -6
  553. package/js/src/base/functions.js +0 -6
  554. package/js/src/base/types.js +0 -6
  555. package/js/src/base/ws/Cache.js +0 -6
  556. package/js/src/base/ws/Client.js +0 -6
  557. package/js/src/base/ws/Future.js +0 -6
  558. package/js/src/base/ws/OrderBook.js +0 -6
  559. package/js/src/base/ws/OrderBookSide.js +0 -6
  560. package/js/src/base/ws/WsClient.js +0 -6
  561. package/js/src/base/ws/functions.js +0 -6
  562. package/js/src/bequant.js +0 -6
  563. package/js/src/bigone.js +0 -6
  564. package/js/src/binance.js +8 -8
  565. package/js/src/binancecoinm.js +0 -6
  566. package/js/src/binanceus.js +0 -6
  567. package/js/src/binanceusdm.js +0 -6
  568. package/js/src/bingx.js +0 -6
  569. package/js/src/bit2c.js +0 -6
  570. package/js/src/bitbank.js +0 -6
  571. package/js/src/bitbns.js +0 -6
  572. package/js/src/bitfinex.js +0 -6
  573. package/js/src/bitflyer.js +0 -6
  574. package/js/src/bitget.d.ts +12 -0
  575. package/js/src/bitget.js +75 -40
  576. package/js/src/bithumb.js +0 -6
  577. package/js/src/bitmart.js +16 -15
  578. package/js/src/bitmex.js +0 -6
  579. package/js/src/bitopro.js +0 -6
  580. package/js/src/bitrue.js +0 -6
  581. package/js/src/bitso.js +0 -6
  582. package/js/src/bitstamp.js +0 -6
  583. package/js/src/bitteam.js +0 -6
  584. package/js/src/bittrade.js +0 -6
  585. package/js/src/bitvavo.js +0 -6
  586. package/js/src/blockchaincom.js +0 -6
  587. package/js/src/blofin.js +0 -6
  588. package/js/src/btcalpha.js +0 -6
  589. package/js/src/btcbox.js +0 -6
  590. package/js/src/btcmarkets.js +0 -6
  591. package/js/src/btcturk.js +0 -6
  592. package/js/src/bybit.js +8 -6
  593. package/js/src/cex.js +0 -6
  594. package/js/src/coinbase.js +0 -6
  595. package/js/src/coinbaseadvanced.js +0 -6
  596. package/js/src/coinbaseexchange.js +0 -6
  597. package/js/src/coinbaseinternational.js +0 -6
  598. package/js/src/coincatch.js +0 -6
  599. package/js/src/coincheck.js +0 -6
  600. package/js/src/coinex.js +0 -6
  601. package/js/src/coinmate.js +0 -6
  602. package/js/src/coinmetro.js +0 -6
  603. package/js/src/coinone.js +0 -6
  604. package/js/src/coinsph.js +0 -6
  605. package/js/src/coinspot.js +0 -6
  606. package/js/src/cryptocom.js +22 -24
  607. package/js/src/cryptomus.js +0 -6
  608. package/js/src/defx.js +3 -8
  609. package/js/src/delta.js +0 -6
  610. package/js/src/deribit.js +0 -6
  611. package/js/src/derive.js +0 -6
  612. package/js/src/digifinex.js +0 -6
  613. package/js/src/exmo.js +0 -6
  614. package/js/src/fmfwio.js +0 -6
  615. package/js/src/foxbit.js +0 -6
  616. package/js/src/gate.js +79 -33
  617. package/js/src/gateio.js +0 -6
  618. package/js/src/gemini.js +0 -6
  619. package/js/src/hashkey.js +0 -6
  620. package/js/src/hibachi.js +3 -9
  621. package/js/src/hitbtc.js +0 -6
  622. package/js/src/hollaex.js +0 -6
  623. package/js/src/htx.js +0 -6
  624. package/js/src/huobi.js +0 -6
  625. package/js/src/hyperliquid.d.ts +3 -1
  626. package/js/src/hyperliquid.js +115 -20
  627. package/js/src/independentreserve.js +0 -6
  628. package/js/src/indodax.js +0 -6
  629. package/js/src/kraken.js +0 -6
  630. package/js/src/krakenfutures.js +45 -39
  631. package/js/src/kucoin.js +41 -9
  632. package/js/src/kucoinfutures.js +0 -6
  633. package/js/src/latoken.js +0 -6
  634. package/js/src/lbank.js +0 -6
  635. package/js/src/luno.js +0 -6
  636. package/js/src/mercado.js +0 -6
  637. package/js/src/mexc.js +0 -6
  638. package/js/src/modetrade.js +0 -6
  639. package/js/src/myokx.js +0 -6
  640. package/js/src/ndax.js +0 -6
  641. package/js/src/novadax.js +0 -6
  642. package/js/src/oceanex.js +0 -6
  643. package/js/src/okx.js +9 -7
  644. package/js/src/okxus.js +0 -6
  645. package/js/src/onetrading.js +0 -6
  646. package/js/src/oxfun.js +0 -6
  647. package/js/src/p2b.js +0 -6
  648. package/js/src/paradex.js +0 -6
  649. package/js/src/paymium.js +0 -6
  650. package/js/src/phemex.js +0 -6
  651. package/js/src/poloniex.js +0 -6
  652. package/js/src/pro/alpaca.js +0 -6
  653. package/js/src/pro/apex.js +0 -6
  654. package/js/src/pro/arkham.d.ts +105 -0
  655. package/js/src/pro/arkham.js +708 -0
  656. package/js/src/pro/ascendex.js +0 -6
  657. package/js/src/pro/backpack.js +0 -6
  658. package/js/src/pro/bequant.js +0 -6
  659. package/js/src/pro/binance.js +6 -12
  660. package/js/src/pro/binancecoinm.js +0 -6
  661. package/js/src/pro/binanceus.js +0 -6
  662. package/js/src/pro/binanceusdm.js +0 -6
  663. package/js/src/pro/bingx.js +0 -6
  664. package/js/src/pro/bitfinex.js +9 -12
  665. package/js/src/pro/bitget.js +0 -6
  666. package/js/src/pro/bithumb.d.ts +28 -1
  667. package/js/src/pro/bithumb.js +263 -13
  668. package/js/src/pro/bitmart.js +0 -6
  669. package/js/src/pro/bitmex.js +0 -6
  670. package/js/src/pro/bitopro.js +0 -6
  671. package/js/src/pro/bitrue.js +0 -6
  672. package/js/src/pro/bitstamp.js +0 -6
  673. package/js/src/pro/bittrade.js +0 -6
  674. package/js/src/pro/bitvavo.js +0 -6
  675. package/js/src/pro/blockchaincom.js +0 -6
  676. package/js/src/pro/blofin.js +0 -6
  677. package/js/src/pro/bybit.js +0 -6
  678. package/js/src/pro/cex.js +0 -6
  679. package/js/src/pro/coinbase.js +0 -6
  680. package/js/src/pro/coinbaseadvanced.js +0 -6
  681. package/js/src/pro/coinbaseexchange.js +0 -6
  682. package/js/src/pro/coinbaseinternational.js +0 -6
  683. package/js/src/pro/coincatch.js +0 -6
  684. package/js/src/pro/coincheck.js +0 -6
  685. package/js/src/pro/coinex.js +0 -6
  686. package/js/src/pro/coinone.js +0 -6
  687. package/js/src/pro/cryptocom.js +0 -6
  688. package/js/src/pro/defx.js +0 -6
  689. package/js/src/pro/deribit.js +2 -7
  690. package/js/src/pro/derive.js +0 -6
  691. package/js/src/pro/exmo.js +0 -6
  692. package/js/src/pro/gate.js +0 -6
  693. package/js/src/pro/gateio.js +0 -6
  694. package/js/src/pro/gemini.js +0 -6
  695. package/js/src/pro/hashkey.js +0 -6
  696. package/js/src/pro/hitbtc.js +0 -6
  697. package/js/src/pro/hollaex.js +0 -6
  698. package/js/src/pro/htx.js +8 -12
  699. package/js/src/pro/huobi.js +0 -6
  700. package/js/src/pro/hyperliquid.js +0 -6
  701. package/js/src/pro/independentreserve.js +0 -6
  702. package/js/src/pro/kraken.js +0 -6
  703. package/js/src/pro/krakenfutures.js +0 -6
  704. package/js/src/pro/kucoin.js +0 -6
  705. package/js/src/pro/kucoinfutures.js +0 -6
  706. package/js/src/pro/lbank.js +0 -6
  707. package/js/src/pro/luno.js +0 -6
  708. package/js/src/pro/mexc.js +0 -6
  709. package/js/src/pro/modetrade.js +0 -6
  710. package/js/src/pro/myokx.js +0 -6
  711. package/js/src/pro/ndax.js +0 -6
  712. package/js/src/pro/okx.js +0 -6
  713. package/js/src/pro/okxus.js +0 -6
  714. package/js/src/pro/onetrading.js +0 -6
  715. package/js/src/pro/oxfun.js +0 -6
  716. package/js/src/pro/p2b.js +0 -6
  717. package/js/src/pro/paradex.js +0 -6
  718. package/js/src/pro/phemex.js +0 -6
  719. package/js/src/pro/poloniex.js +0 -6
  720. package/js/src/pro/probit.js +0 -6
  721. package/js/src/pro/toobit.js +3 -8
  722. package/js/src/pro/upbit.js +1 -7
  723. package/js/src/pro/whitebit.js +0 -6
  724. package/js/src/pro/woo.js +0 -6
  725. package/js/src/pro/woofipro.js +0 -6
  726. package/js/src/pro/xt.js +0 -6
  727. package/js/src/probit.js +0 -6
  728. package/js/src/protobuf/mexc/compiled.cjs +0 -6
  729. package/js/src/static_dependencies/ethers/abi-coder.js +0 -6
  730. package/js/src/static_dependencies/ethers/address/address.js +0 -6
  731. package/js/src/static_dependencies/ethers/address/checks.js +0 -6
  732. package/js/src/static_dependencies/ethers/address/contract-address.js +0 -6
  733. package/js/src/static_dependencies/ethers/address/index.js +0 -6
  734. package/js/src/static_dependencies/ethers/bytes32.js +0 -6
  735. package/js/src/static_dependencies/ethers/coders/abstract-coder.js +0 -6
  736. package/js/src/static_dependencies/ethers/coders/address.js +0 -6
  737. package/js/src/static_dependencies/ethers/coders/anonymous.js +0 -6
  738. package/js/src/static_dependencies/ethers/coders/array.js +0 -6
  739. package/js/src/static_dependencies/ethers/coders/boolean.js +0 -6
  740. package/js/src/static_dependencies/ethers/coders/bytes.js +0 -6
  741. package/js/src/static_dependencies/ethers/coders/fixed-bytes.js +0 -6
  742. package/js/src/static_dependencies/ethers/coders/null.js +0 -6
  743. package/js/src/static_dependencies/ethers/coders/number.js +0 -6
  744. package/js/src/static_dependencies/ethers/coders/string.js +0 -6
  745. package/js/src/static_dependencies/ethers/coders/tuple.js +0 -6
  746. package/js/src/static_dependencies/ethers/fragments.js +0 -6
  747. package/js/src/static_dependencies/ethers/hash/index.js +0 -6
  748. package/js/src/static_dependencies/ethers/hash/solidity.js +0 -6
  749. package/js/src/static_dependencies/ethers/hash/typed-data.js +0 -6
  750. package/js/src/static_dependencies/ethers/index.js +0 -6
  751. package/js/src/static_dependencies/ethers/interface.js +0 -6
  752. package/js/src/static_dependencies/ethers/typed.js +0 -6
  753. package/js/src/static_dependencies/ethers/utils/base58.js +0 -6
  754. package/js/src/static_dependencies/ethers/utils/base64-browser.js +0 -6
  755. package/js/src/static_dependencies/ethers/utils/base64.js +0 -6
  756. package/js/src/static_dependencies/ethers/utils/data.js +0 -6
  757. package/js/src/static_dependencies/ethers/utils/errors.js +0 -6
  758. package/js/src/static_dependencies/ethers/utils/events.js +0 -6
  759. package/js/src/static_dependencies/ethers/utils/fixednumber.js +0 -6
  760. package/js/src/static_dependencies/ethers/utils/index.js +0 -6
  761. package/js/src/static_dependencies/ethers/utils/maths.js +0 -6
  762. package/js/src/static_dependencies/ethers/utils/properties.js +0 -6
  763. package/js/src/static_dependencies/ethers/utils/rlp-decode.js +0 -6
  764. package/js/src/static_dependencies/ethers/utils/rlp-encode.js +0 -6
  765. package/js/src/static_dependencies/ethers/utils/rlp.js +0 -6
  766. package/js/src/static_dependencies/ethers/utils/units.js +0 -6
  767. package/js/src/static_dependencies/ethers/utils/utf8.js +0 -6
  768. package/js/src/static_dependencies/ethers/utils/uuid.js +0 -6
  769. package/js/src/static_dependencies/fflake/browser.js +0 -6
  770. package/js/src/static_dependencies/jsencrypt/JSEncrypt.js +0 -6
  771. package/js/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +0 -6
  772. package/js/src/static_dependencies/jsencrypt/index.js +0 -6
  773. package/js/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +0 -6
  774. package/js/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +0 -6
  775. package/js/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +0 -6
  776. package/js/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +0 -6
  777. package/js/src/static_dependencies/jsencrypt/lib/asn1js/oids.js +0 -6
  778. package/js/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +0 -6
  779. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +0 -6
  780. package/js/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +0 -6
  781. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +0 -6
  782. package/js/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +0 -6
  783. package/js/src/static_dependencies/jsencrypt/lib/jsbn/util.js +0 -6
  784. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +0 -6
  785. package/js/src/static_dependencies/jsencrypt/lib/jsrsasign/yahoo.js +0 -6
  786. package/js/src/static_dependencies/messagepack/msgpack.js +0 -6
  787. package/js/src/static_dependencies/noble-curves/_shortw_utils.js +0 -6
  788. package/js/src/static_dependencies/noble-curves/abstract/curve.js +0 -6
  789. package/js/src/static_dependencies/noble-curves/abstract/edwards.js +0 -6
  790. package/js/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +0 -6
  791. package/js/src/static_dependencies/noble-curves/abstract/modular.js +0 -6
  792. package/js/src/static_dependencies/noble-curves/abstract/montgomery.js +0 -6
  793. package/js/src/static_dependencies/noble-curves/abstract/poseidon.js +0 -6
  794. package/js/src/static_dependencies/noble-curves/abstract/utils.js +0 -6
  795. package/js/src/static_dependencies/noble-curves/abstract/weierstrass.js +0 -6
  796. package/js/src/static_dependencies/noble-curves/bn.js +0 -6
  797. package/js/src/static_dependencies/noble-curves/ed25519.js +0 -6
  798. package/js/src/static_dependencies/noble-curves/ed448.js +0 -6
  799. package/js/src/static_dependencies/noble-curves/index.js +0 -6
  800. package/js/src/static_dependencies/noble-curves/jubjub.js +0 -6
  801. package/js/src/static_dependencies/noble-curves/p256.js +0 -6
  802. package/js/src/static_dependencies/noble-curves/p384.js +0 -6
  803. package/js/src/static_dependencies/noble-curves/p521.js +0 -6
  804. package/js/src/static_dependencies/noble-curves/pasta.js +0 -6
  805. package/js/src/static_dependencies/noble-curves/secp256k1.js +0 -6
  806. package/js/src/static_dependencies/noble-hashes/_assert.js +0 -6
  807. package/js/src/static_dependencies/noble-hashes/_blake2.js +0 -6
  808. package/js/src/static_dependencies/noble-hashes/_sha2.js +0 -6
  809. package/js/src/static_dependencies/noble-hashes/_u64.js +0 -6
  810. package/js/src/static_dependencies/noble-hashes/argon2.js +0 -6
  811. package/js/src/static_dependencies/noble-hashes/blake2b.js +0 -6
  812. package/js/src/static_dependencies/noble-hashes/blake2s.js +0 -6
  813. package/js/src/static_dependencies/noble-hashes/blake3.js +0 -6
  814. package/js/src/static_dependencies/noble-hashes/crypto.js +0 -6
  815. package/js/src/static_dependencies/noble-hashes/cryptoNode.js +0 -6
  816. package/js/src/static_dependencies/noble-hashes/eskdf.js +0 -6
  817. package/js/src/static_dependencies/noble-hashes/hkdf.js +0 -6
  818. package/js/src/static_dependencies/noble-hashes/hmac.js +0 -6
  819. package/js/src/static_dependencies/noble-hashes/index.js +0 -6
  820. package/js/src/static_dependencies/noble-hashes/md5.js +0 -6
  821. package/js/src/static_dependencies/noble-hashes/pbkdf2.js +0 -6
  822. package/js/src/static_dependencies/noble-hashes/ripemd160.js +0 -6
  823. package/js/src/static_dependencies/noble-hashes/scrypt.js +0 -6
  824. package/js/src/static_dependencies/noble-hashes/sha1.js +0 -6
  825. package/js/src/static_dependencies/noble-hashes/sha256.js +0 -6
  826. package/js/src/static_dependencies/noble-hashes/sha3-addons.js +0 -6
  827. package/js/src/static_dependencies/noble-hashes/sha3.js +0 -6
  828. package/js/src/static_dependencies/noble-hashes/sha512.js +0 -6
  829. package/js/src/static_dependencies/noble-hashes/utils.js +0 -6
  830. package/js/src/static_dependencies/node-fetch/body.js +0 -6
  831. package/js/src/static_dependencies/node-fetch/errors/abort-error.js +0 -6
  832. package/js/src/static_dependencies/node-fetch/errors/base.js +0 -6
  833. package/js/src/static_dependencies/node-fetch/errors/fetch-error.js +0 -6
  834. package/js/src/static_dependencies/node-fetch/headers.js +0 -6
  835. package/js/src/static_dependencies/node-fetch/index.js +0 -6
  836. package/js/src/static_dependencies/node-fetch/request.js +0 -6
  837. package/js/src/static_dependencies/node-fetch/response.js +0 -6
  838. package/js/src/static_dependencies/node-fetch/utils/get-search.js +0 -6
  839. package/js/src/static_dependencies/node-fetch/utils/is-redirect.js +0 -6
  840. package/js/src/static_dependencies/node-fetch/utils/is.js +0 -6
  841. package/js/src/static_dependencies/node-fetch/utils/referrer.js +0 -6
  842. package/js/src/static_dependencies/proxies/agent-base/helpers.js +0 -6
  843. package/js/src/static_dependencies/proxies/agent-base/index.js +0 -6
  844. package/js/src/static_dependencies/proxies/http-proxy-agent/index.js +0 -6
  845. package/js/src/static_dependencies/proxies/https-proxy-agent/index.js +0 -6
  846. package/js/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +0 -6
  847. package/js/src/static_dependencies/qs/formats.js +0 -6
  848. package/js/src/static_dependencies/qs/index.js +0 -6
  849. package/js/src/static_dependencies/qs/parse.js +0 -6
  850. package/js/src/static_dependencies/qs/stringify.js +0 -6
  851. package/js/src/static_dependencies/qs/utils.js +0 -6
  852. package/js/src/static_dependencies/scure-base/index.js +0 -6
  853. package/js/src/static_dependencies/scure-starknet/index.js +0 -6
  854. package/js/src/static_dependencies/starknet/constants.js +0 -6
  855. package/js/src/static_dependencies/starknet/index.js +0 -6
  856. package/js/src/static_dependencies/starknet/types/cairoEnum.js +0 -6
  857. package/js/src/static_dependencies/starknet/types/calldata.js +0 -6
  858. package/js/src/static_dependencies/starknet/types/index.js +0 -6
  859. package/js/src/static_dependencies/starknet/types/lib/contract/abi.js +0 -6
  860. package/js/src/static_dependencies/starknet/types/lib/contract/index.js +0 -6
  861. package/js/src/static_dependencies/starknet/types/lib/contract/legacy.js +0 -6
  862. package/js/src/static_dependencies/starknet/types/lib/contract/sierra.js +0 -6
  863. package/js/src/static_dependencies/starknet/types/lib/index.js +0 -6
  864. package/js/src/static_dependencies/starknet/types/typedData.js +0 -6
  865. package/js/src/static_dependencies/starknet/utils/address.js +0 -6
  866. package/js/src/static_dependencies/starknet/utils/assert.js +0 -6
  867. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +0 -6
  868. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +0 -6
  869. package/js/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +0 -6
  870. package/js/src/static_dependencies/starknet/utils/calldata/byteArray.js +0 -6
  871. package/js/src/static_dependencies/starknet/utils/calldata/cairo.js +0 -6
  872. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +0 -6
  873. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +0 -6
  874. package/js/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +0 -6
  875. package/js/src/static_dependencies/starknet/utils/calldata/enum/index.js +0 -6
  876. package/js/src/static_dependencies/starknet/utils/calldata/formatter.js +0 -6
  877. package/js/src/static_dependencies/starknet/utils/calldata/index.js +0 -6
  878. package/js/src/static_dependencies/starknet/utils/calldata/parser/index.js +0 -6
  879. package/js/src/static_dependencies/starknet/utils/calldata/parser/interface.js +0 -6
  880. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +0 -6
  881. package/js/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +0 -6
  882. package/js/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +0 -6
  883. package/js/src/static_dependencies/starknet/utils/calldata/requestParser.js +0 -6
  884. package/js/src/static_dependencies/starknet/utils/calldata/responseParser.js +0 -6
  885. package/js/src/static_dependencies/starknet/utils/calldata/tuple.js +0 -6
  886. package/js/src/static_dependencies/starknet/utils/calldata/validate.js +0 -6
  887. package/js/src/static_dependencies/starknet/utils/encode.js +0 -6
  888. package/js/src/static_dependencies/starknet/utils/hash/classHash.js +0 -6
  889. package/js/src/static_dependencies/starknet/utils/hash/index.js +0 -6
  890. package/js/src/static_dependencies/starknet/utils/merkle.js +0 -6
  891. package/js/src/static_dependencies/starknet/utils/num.js +0 -6
  892. package/js/src/static_dependencies/starknet/utils/selector.js +0 -6
  893. package/js/src/static_dependencies/starknet/utils/shortString.js +0 -6
  894. package/js/src/static_dependencies/starknet/utils/starknetId.js +0 -6
  895. package/js/src/static_dependencies/starknet/utils/typedData.js +0 -6
  896. package/js/src/static_dependencies/starknet/utils/uint256.js +0 -6
  897. package/js/src/static_dependencies/starknet/utils/url.js +0 -6
  898. package/js/src/static_dependencies/watchable/src/index.js +0 -6
  899. package/js/src/static_dependencies/watchable/src/types.js +0 -6
  900. package/js/src/static_dependencies/watchable/src/unpromise.js +0 -6
  901. package/js/src/static_dependencies/zklink/zklink-sdk-web.js +0 -6
  902. package/js/src/timex.js +0 -6
  903. package/js/src/tokocrypto.js +0 -6
  904. package/js/src/toobit.js +1 -7
  905. package/js/src/upbit.js +0 -6
  906. package/js/src/wavesexchange.js +0 -6
  907. package/js/src/whitebit.js +0 -6
  908. package/js/src/woo.js +0 -6
  909. package/js/src/woofipro.js +0 -6
  910. package/js/src/xt.js +0 -6
  911. package/js/src/yobit.js +0 -6
  912. package/js/src/zaif.js +0 -6
  913. package/js/src/zonda.js +0 -6
  914. package/package.json +1 -1
@@ -0,0 +1,2455 @@
1
+ // ---------------------------------------------------------------------------
2
+ import Exchange from './abstract/arkham.js';
3
+ import { Precise } from './base/Precise.js';
4
+ import { ExchangeError, BadRequest, ArgumentsRequired, InvalidAddress, OperationRejected, BadSymbol, OperationFailed, AuthenticationError, RateLimitExceeded, PermissionDenied, InvalidOrder, InsufficientFunds, OrderNotFound } from './base/errors.js';
5
+ import { TICK_SIZE } from './base/functions/number.js';
6
+ import { sha256 } from './static_dependencies/noble-hashes/sha256.js';
7
+ /**
8
+ * @class arkham
9
+ * @augments Exchange
10
+ */
11
+ export default class arkham extends Exchange {
12
+ describe() {
13
+ return this.deepExtend(super.describe(), {
14
+ 'id': 'arkham',
15
+ 'name': 'ARKHAM',
16
+ 'countries': ['US'],
17
+ 'version': 'v1',
18
+ 'rateLimit': 20 / 3,
19
+ 'certified': false,
20
+ 'pro': true,
21
+ 'has': {
22
+ 'CORS': false,
23
+ 'spot': true,
24
+ 'margin': false,
25
+ 'swap': true,
26
+ 'future': false,
27
+ 'option': false,
28
+ 'cancelAllOrders': true,
29
+ 'cancelOrder': true,
30
+ 'createDepositAddress': true,
31
+ 'createOrder': true,
32
+ 'fetchAccounts': true,
33
+ 'fetchBalance': true,
34
+ 'fetchClosedOrders': true,
35
+ 'fetchCurrencies': true,
36
+ 'fetchDepositAddress': false,
37
+ 'fetchDepositAddressesByNetwork': true,
38
+ 'fetchDeposits': true,
39
+ 'fetchFundingHistory': true,
40
+ 'fetchLeverage': true,
41
+ 'fetchLeverageTiers': true,
42
+ 'fetchMyTrades': true,
43
+ 'fetchOHLCV': true,
44
+ 'fetchOpenOrders': true,
45
+ 'fetchOrder': true,
46
+ 'fetchOrderBook': true,
47
+ 'fetchPositions': true,
48
+ 'fetchTicker': true,
49
+ 'fetchTickers': true,
50
+ 'fetchTime': true,
51
+ 'fetchTrades': true,
52
+ 'fetchTradingFees': true,
53
+ 'fetchWithdrawals': true,
54
+ 'sandbox': false,
55
+ 'setLeverage': true,
56
+ 'withdraw': true,
57
+ },
58
+ 'timeframes': {
59
+ // enums are wrong in DOCS, these string values need to be in request
60
+ '1m': '1m',
61
+ '5m': '5m',
62
+ '15m': '15m',
63
+ '30m': '30m',
64
+ '1h': '1h',
65
+ '6h': '6h',
66
+ '1d': '24h',
67
+ },
68
+ 'urls': {
69
+ 'logo': 'https://github.com/user-attachments/assets/5cefdcfb-2c10-445b-835c-fa21317bf5ac',
70
+ 'api': {
71
+ 'v1': 'https://arkm.com/api',
72
+ },
73
+ 'www': 'https://arkm.com/',
74
+ 'referral': {
75
+ 'url': 'https://arkm.com/register?ref=ccxt',
76
+ 'discount': 0,
77
+ },
78
+ 'doc': [
79
+ 'https://arkm.com/limits-api',
80
+ 'https://info.arkm.com/api-platform',
81
+ ],
82
+ 'fees': 'https://arkm.com/fees',
83
+ },
84
+ 'api': {
85
+ 'v1': {
86
+ 'public': {
87
+ 'get': {
88
+ 'alerts': 1,
89
+ 'announcements': 1,
90
+ 'assets': 1,
91
+ 'book': 1,
92
+ 'candles': 1,
93
+ 'chains': 1,
94
+ 'contracts': 1,
95
+ 'index-price': 1,
96
+ 'index-prices': 1,
97
+ 'margin-schedules': 1,
98
+ 'marketcapchart': 1,
99
+ 'marketcaps': 1,
100
+ 'pair': 1,
101
+ 'pairs': 1,
102
+ 'server-time': 1,
103
+ 'ticker': 1,
104
+ 'tickers': 1,
105
+ 'trades': 1,
106
+ },
107
+ },
108
+ 'private': {
109
+ // for orders: spot 20/s, todo: perp 40/s
110
+ 'get': {
111
+ 'user': 7.5,
112
+ 'orders': 7.5,
113
+ 'orders/by-client-order-id': 7.5,
114
+ 'orders/history': 7.5,
115
+ 'orders/history/by-client-order-id': 7.5,
116
+ 'orders/history_offset': 7.5,
117
+ 'orders/{id}': 7.5,
118
+ 'trades': 7.5,
119
+ 'trades/history': 7.5,
120
+ 'trades/time': 7.5,
121
+ 'trigger-orders': 7.5,
122
+ 'account/airdrops': 7.5,
123
+ 'account/balance-updates': 7.5,
124
+ 'account/balances': 7.5,
125
+ 'account/balances/ll': 7.5,
126
+ 'account/balances/history': 7.5,
127
+ 'account/balances/commissions': 7.5,
128
+ 'account/deposit/addresses': 7.5,
129
+ 'account/deposits': 7.5,
130
+ 'account/fees': 7.5,
131
+ 'account/funding-rate-payments': 7.5,
132
+ 'account/leverage': 7.5,
133
+ 'account/lsp-assignments': 7.5,
134
+ 'account/margin': 7.5,
135
+ 'account/margin/all': 7.5,
136
+ 'account/notifications': 7.5,
137
+ 'account/position-updates': 7.5,
138
+ 'account/positions': 7.5,
139
+ 'account/realized-pnl': 7.5,
140
+ 'account/rebates': 7.5,
141
+ 'account/referral-links': 7.5,
142
+ 'account/sessions': 7.5,
143
+ 'account/settings': 7.5,
144
+ 'account/settings/price-alert': 7.5,
145
+ 'account/transfers': 7.5,
146
+ 'account/unsubscribe': 7.5,
147
+ 'account/watchlist': 7.5,
148
+ 'account/withdrawal/addresses': 7.5,
149
+ 'account/withdrawal/addresses/{id}': 7.5,
150
+ 'account/withdrawals': 7.5,
151
+ 'subaccounts': 7.5,
152
+ 'airdrop': 7.5,
153
+ 'airdrop/claim': 7.5,
154
+ 'affiliate-dashboard/commission-earned': 7.5,
155
+ 'affiliate-dashboard/min-arkm-last-30d': 7.5,
156
+ 'affiliate-dashboard/points': 7.5,
157
+ 'affiliate-dashboard/points-season-1': 7.5,
158
+ 'affiliate-dashboard/points-season-2': 7.5,
159
+ 'affiliate-dashboard/realized-pnl': 7.5,
160
+ 'affiliate-dashboard/rebate-balance': 7.5,
161
+ 'affiliate-dashboard/referral-count': 7.5,
162
+ 'affiliate-dashboard/referrals-season-1': 7.5,
163
+ 'affiliate-dashboard/referrals-season-2': 7.5,
164
+ 'affiliate-dashboard/trading-volume-stats': 7.5,
165
+ 'affiliate-dashboard/volume-season-1': 7.5,
166
+ 'affiliate-dashboard/volume-season-2': 7.5,
167
+ 'affiliate-dashboard/api-key': 7.5,
168
+ 'competitions/opt-in-status': 7.5,
169
+ 'rewards/info': 7.5,
170
+ 'rewards/vouchers': 7.5,
171
+ },
172
+ 'post': {
173
+ 'orders/new': 7.5,
174
+ 'trigger-orders/new': 7.5,
175
+ 'orders/cancel': 7.5,
176
+ 'trigger-orders/cancel': 7.5,
177
+ 'orders/cancel/all': 7.5,
178
+ 'trigger-orders/cancel/all': 7.5,
179
+ 'orders/new/simple': 7.5,
180
+ 'account/deposit/addresses/new': 7.5,
181
+ 'account/leverage': 7.5,
182
+ 'account/notifications/read': 7.5,
183
+ 'account/referral-links': 7.5,
184
+ 'account/sessions/delete': 7.5,
185
+ 'account/sessions/terminate-all': 7.5,
186
+ 'account/settings/update': 7.5,
187
+ 'account/watchlist/add': 7.5,
188
+ 'account/watchlist/remove': 7.5,
189
+ 'account/withdraw': 7.5,
190
+ 'account/withdrawal/addresses/confirm': 7.5,
191
+ 'subaccounts': 7.5,
192
+ 'subaccounts/transfer': 7.5,
193
+ 'subaccounts/perp-transfer': 7.5,
194
+ 'subaccounts/update-settings': 7.5,
195
+ 'airdrop': 7.5,
196
+ 'api-key/create': 7.5,
197
+ 'authenticate': 7.5,
198
+ 'competitions/opt-in': 7.5,
199
+ 'rewards/vouchers/claim': 7.5,
200
+ },
201
+ 'put': {
202
+ 'account/referral-links/{id}/slug': 7.5,
203
+ 'account/settings/price-alert': 7.5,
204
+ 'account/withdrawal/addresses/{id}': 7.5,
205
+ 'subaccounts': 7.5,
206
+ 'api-key/update/{id}': 7.5,
207
+ },
208
+ 'delete': {
209
+ 'account/settings/price-alert': 7.5,
210
+ 'account/withdrawal/addresses/{id}': 7.5,
211
+ 'subaccounts/{subaccountId}': 7.5,
212
+ 'api-key/{id}': 7.5,
213
+ },
214
+ },
215
+ },
216
+ },
217
+ 'options': {
218
+ 'networks': {
219
+ 'ETH': 'ETH',
220
+ 'ERC20': 'ETH',
221
+ 'BTC': 'BTC',
222
+ 'SOL': 'SOL',
223
+ 'TON': 'TON',
224
+ 'DOGE': 'DOGE',
225
+ 'SUI': 'SUI',
226
+ 'XRP': 'XRP',
227
+ 'OP': 'OP',
228
+ 'AVAXC': 'AVAX',
229
+ 'ARBONE': 'ARB',
230
+ },
231
+ 'networksById': {
232
+ 'ETH': 'ERC20',
233
+ 'ERC20': 'ERC20',
234
+ },
235
+ 'requestExpiration': 5000,
236
+ 'timeframeDurations': {
237
+ '1m': 60000000,
238
+ '5m': 300000000,
239
+ '15m': 900000000,
240
+ '30m': 1800000000,
241
+ '1h': 3600000000,
242
+ '6h': 21600000000,
243
+ '1d': 86400000000,
244
+ },
245
+ },
246
+ 'features': {
247
+ 'default': {
248
+ 'sandbox': false,
249
+ 'createOrder': {
250
+ 'marginMode': false,
251
+ 'triggerPrice': true,
252
+ 'triggerPriceType': {
253
+ 'mark': true,
254
+ 'index': true,
255
+ 'last': true,
256
+ },
257
+ 'triggerDirection': true,
258
+ 'stopLossPrice': true,
259
+ 'takeProfitPrice': true,
260
+ 'attachedStopLossTakeProfit': undefined,
261
+ 'timeInForce': {
262
+ 'IOC': true,
263
+ 'FOK': true,
264
+ 'PO': true,
265
+ 'GTD': false,
266
+ },
267
+ 'hedged': false,
268
+ 'selfTradePrevention': false,
269
+ 'trailing': false,
270
+ 'iceberg': false,
271
+ 'leverage': false,
272
+ 'marketBuyByCost': false,
273
+ 'marketBuyRequiresPrice': false,
274
+ },
275
+ 'createOrders': undefined,
276
+ 'fetchMyTrades': {
277
+ 'marginMode': false,
278
+ 'limit': 100,
279
+ 'daysBack': undefined,
280
+ 'untilDays': 1,
281
+ 'symbolRequired': false,
282
+ },
283
+ 'fetchOrder': {
284
+ 'marginMode': false,
285
+ 'trigger': false,
286
+ 'trailing': false,
287
+ 'symbolRequired': false,
288
+ },
289
+ 'fetchOpenOrders': {
290
+ 'marginMode': true,
291
+ 'limit': undefined,
292
+ 'trigger': false,
293
+ 'trailing': false,
294
+ 'symbolRequired': false,
295
+ },
296
+ 'fetchOrders': undefined,
297
+ 'fetchClosedOrders': {
298
+ 'marginMode': false,
299
+ 'limit': 100,
300
+ 'daysBack': undefined,
301
+ 'daysBackCanceled': undefined,
302
+ 'untilDays': undefined,
303
+ 'trigger': false,
304
+ 'trailing': false,
305
+ 'symbolRequired': false,
306
+ },
307
+ 'fetchOHLCV': {
308
+ 'limit': 365,
309
+ },
310
+ },
311
+ 'spot': {
312
+ 'extends': 'default',
313
+ },
314
+ 'swap': {
315
+ 'linear': {
316
+ 'extends': 'default',
317
+ },
318
+ 'inverse': undefined,
319
+ },
320
+ 'future': {
321
+ 'linear': {
322
+ 'extends': 'default',
323
+ },
324
+ 'inverse': undefined,
325
+ },
326
+ },
327
+ 'precisionMode': TICK_SIZE,
328
+ 'exceptions': {
329
+ 'exact': {
330
+ // 1XXXX General Errors
331
+ // These errors can occur for a variety of reasons and may be returned by the API or Websocket on any endpoint.
332
+ '10000': OperationFailed,
333
+ '10001': BadRequest,
334
+ '10002': AuthenticationError,
335
+ '10003': BadSymbol,
336
+ '10004': ArgumentsRequired,
337
+ '10005': RateLimitExceeded,
338
+ '10006': PermissionDenied,
339
+ '10007': PermissionDenied,
340
+ '10008': RateLimitExceeded,
341
+ '10009': PermissionDenied,
342
+ '10010': PermissionDenied,
343
+ '10011': AuthenticationError,
344
+ '10012': PermissionDenied,
345
+ '10013': PermissionDenied,
346
+ '10014': AuthenticationError,
347
+ '10015': PermissionDenied,
348
+ '10016': PermissionDenied,
349
+ '10017': PermissionDenied,
350
+ '10018': AuthenticationError,
351
+ '10019': AuthenticationError,
352
+ '10020': PermissionDenied,
353
+ '10021': PermissionDenied,
354
+ '10022': ExchangeError,
355
+ '10023': BadRequest,
356
+ '10024': ExchangeError,
357
+ '10025': BadRequest,
358
+ // #2XXXX General Websocket Errors
359
+ '20001': BadRequest,
360
+ '20002': ArgumentsRequired,
361
+ '20003': BadRequest,
362
+ '20004': ArgumentsRequired,
363
+ '20005': BadRequest,
364
+ // #3XXXX Trading Errors
365
+ '30001': InvalidOrder,
366
+ '30002': InvalidOrder,
367
+ '30003': InvalidOrder,
368
+ '30004': InvalidOrder,
369
+ '30005': InvalidOrder,
370
+ '30006': InvalidOrder,
371
+ '30007': BadSymbol,
372
+ '30008': OperationRejected,
373
+ '30009': OperationRejected,
374
+ '30010': InsufficientFunds,
375
+ '30011': BadSymbol,
376
+ '30012': OperationRejected,
377
+ '30013': OperationRejected,
378
+ '30014': InvalidOrder,
379
+ '30015': OrderNotFound,
380
+ '30016': InvalidOrder,
381
+ '30017': InvalidOrder,
382
+ '30018': InvalidOrder,
383
+ '30019': OperationRejected,
384
+ '30020': InvalidOrder,
385
+ '30021': InvalidOrder,
386
+ '30022': InvalidOrder,
387
+ '30023': InvalidOrder,
388
+ '30024': InvalidOrder,
389
+ '30025': BadRequest,
390
+ '30026': PermissionDenied,
391
+ '30027': PermissionDenied,
392
+ '30028': OrderNotFound,
393
+ // #4XXXX Funding Errors
394
+ '40001': OperationRejected,
395
+ '40002': BadRequest,
396
+ '40003': InvalidAddress,
397
+ '40004': OperationRejected,
398
+ '40005': BadRequest,
399
+ '40006': PermissionDenied,
400
+ '40007': OperationRejected,
401
+ '40008': OperationRejected,
402
+ '40009': OperationRejected,
403
+ '40010': BadRequest,
404
+ '40011': OperationRejected,
405
+ '40012': BadRequest,
406
+ '40013': BadRequest,
407
+ // #9XXXX Other Errors
408
+ '90001': BadRequest,
409
+ '90002': BadRequest,
410
+ '90003': OperationRejected,
411
+ '90004': BadRequest,
412
+ '90005': BadRequest,
413
+ '90006': RateLimitExceeded,
414
+ '90007': AuthenticationError,
415
+ '90008': RateLimitExceeded,
416
+ '90009': PermissionDenied,
417
+ '90010': BadRequest,
418
+ '90011': RateLimitExceeded,
419
+ },
420
+ 'broad': {
421
+ 'less than min withdrawal ': OperationRejected, // {"message":"amount 1 less than min withdrawal 5"}
422
+ },
423
+ },
424
+ });
425
+ }
426
+ /**
427
+ * @method
428
+ * @name arkham#fetchCurrencies
429
+ * @description fetches all available currencies on an exchange
430
+ * @see https://arkm.com/docs#get/public/assets
431
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
432
+ * @returns {object} an associative dictionary of currencies
433
+ */
434
+ async fetchCurrencies(params = {}) {
435
+ const response = await this.v1PublicGetAssets(params);
436
+ //
437
+ // [
438
+ // {
439
+ // "symbol": "USDT",
440
+ // "name": "Tether",
441
+ // "imageUrl": "https://static.arkhamintelligence.com/tokens/tether.png",
442
+ // "stablecoin": true,
443
+ // "featuredPair": "BTC_USDT",
444
+ // "chains": [
445
+ // {
446
+ // "symbol": "ETH",
447
+ // "assetSymbol": "ETH",
448
+ // "name": "Ethereum",
449
+ // "type": "1",
450
+ // "confirmations": "6",
451
+ // "blockTime": "12000000"
452
+ // }
453
+ // ],
454
+ // "status": "listed",
455
+ // "minDeposit": "5",
456
+ // "minWithdrawal": "5",
457
+ // "withdrawalFee": "2"
458
+ // },
459
+ // ...
460
+ //
461
+ const result = {};
462
+ for (let i = 0; i < response.length; i++) {
463
+ const currency = response[i];
464
+ const id = this.safeString(currency, 'symbol');
465
+ const code = this.safeCurrencyCode(id);
466
+ const networks = {};
467
+ const chains = this.safeList(currency, 'chains', []);
468
+ for (let j = 0; j < chains.length; j++) {
469
+ const chain = chains[j];
470
+ const networkId = this.safeString(chain, 'symbol');
471
+ const network = this.networkIdToCode(networkId);
472
+ networks[network] = {
473
+ 'info': chain,
474
+ 'id': networkId,
475
+ 'network': network,
476
+ 'title': this.safeString(chain, 'name'),
477
+ 'active': undefined,
478
+ 'deposit': undefined,
479
+ 'withdraw': undefined,
480
+ 'fee': undefined,
481
+ 'precision': undefined,
482
+ 'limits': {
483
+ 'withdraw': {
484
+ 'min': undefined,
485
+ 'max': undefined,
486
+ },
487
+ },
488
+ };
489
+ }
490
+ result[code] = this.safeCurrencyStructure({
491
+ 'info': currency,
492
+ 'id': id,
493
+ 'code': code,
494
+ 'name': this.safeString(currency, 'name'),
495
+ 'active': this.safeString(currency, 'status') === 'listed',
496
+ 'deposit': undefined,
497
+ 'withdraw': undefined,
498
+ 'fee': this.safeNumber(currency, 'withdrawalFee'),
499
+ 'precision': undefined,
500
+ 'limits': {
501
+ 'amount': {
502
+ 'min': undefined,
503
+ 'max': undefined,
504
+ },
505
+ 'withdraw': {
506
+ 'min': this.safeNumber(currency, 'minWithdrawal'),
507
+ 'max': undefined,
508
+ },
509
+ 'deposit': {
510
+ 'min': this.safeNumber(currency, 'minDeposit'),
511
+ 'max': undefined,
512
+ },
513
+ },
514
+ 'type': 'crypto',
515
+ 'networks': networks,
516
+ });
517
+ }
518
+ return result;
519
+ }
520
+ /**
521
+ * @method
522
+ * @name arkham#fetchMarkets
523
+ * @see https://arkm.com/docs#get/public/pairs
524
+ * @description retrieves data on all markets for arkm
525
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
526
+ * @returns {object[]} an array of objects representing market data
527
+ */
528
+ async fetchMarkets(params = {}) {
529
+ const response = await this.v1PublicGetPairs(params);
530
+ //
531
+ // [
532
+ // {
533
+ // "symbol": "BTC_USDT",
534
+ // "baseSymbol": "BTC",
535
+ // "baseImageUrl": "https://static.arkhamintelligence.com/tokens/bitcoin.png",
536
+ // "baseIsStablecoin": false,
537
+ // "baseName": "Bitcoin",
538
+ // "quoteSymbol": "USDT",
539
+ // "quoteImageUrl": "https://static.arkhamintelligence.com/tokens/tether.png",
540
+ // "quoteIsStablecoin": true,
541
+ // "quoteName": "Tether",
542
+ // "minTickPrice": "0.01",
543
+ // "minLotSize": "0.00001",
544
+ // "minSize": "0.00001",
545
+ // "maxSize": "9000",
546
+ // "minPrice": "0.01",
547
+ // "maxPrice": "1000000",
548
+ // "minNotional": "5",
549
+ // "maxPriceScalarUp": "1.8",
550
+ // "maxPriceScalarDown": "0.2",
551
+ // "pairType": "spot", // atm, always 'spot' value
552
+ // "maxLeverage": "0",
553
+ // "status": "listed"
554
+ // },
555
+ // {
556
+ // "symbol": "BTC_USDT_PERP",
557
+ // "baseSymbol": "BTC.P",
558
+ // "baseImageUrl": "https://static.arkhamintelligence.com/tokens/bitcoin.png",
559
+ // "baseIsStablecoin": false,
560
+ // "baseName": "Bitcoin Perpetual",
561
+ // "quoteSymbol": "USDT",
562
+ // "quoteImageUrl": "https://static.arkhamintelligence.com/tokens/tether.png",
563
+ // "quoteIsStablecoin": true,
564
+ // "quoteName": "Tether",
565
+ // "minTickPrice": "0.01",
566
+ // "minLotSize": "0.00001",
567
+ // "minSize": "0.00001",
568
+ // "maxSize": "9000",
569
+ // "minPrice": "0.01",
570
+ // "maxPrice": "1000000",
571
+ // "minNotional": "5",
572
+ // "maxPriceScalarUp": "1.5",
573
+ // "maxPriceScalarDown": "0.5",
574
+ // "pairType": "perpetual",
575
+ // "marginSchedule": "C",
576
+ // "maxLeverage": "25",
577
+ // "status": "listed"
578
+ // },
579
+ // ...
580
+ //
581
+ const result = [];
582
+ for (let i = 0; i < response.length; i++) {
583
+ const market = response[i];
584
+ const id = this.safeString(market, 'symbol');
585
+ const baseId = this.safeString(market, 'baseSymbol');
586
+ const quoteId = this.safeString(market, 'quoteSymbol');
587
+ let base = this.safeCurrencyCode(baseId);
588
+ const quote = this.safeCurrencyCode(quoteId);
589
+ let marketType = undefined;
590
+ let symbol = undefined;
591
+ const pairType = this.safeString(market, 'pairType');
592
+ const isSpot = pairType === 'spot';
593
+ const isPerpetual = pairType === 'perpetual';
594
+ let settle = undefined;
595
+ let settleId = undefined;
596
+ if (isSpot) {
597
+ marketType = 'spot';
598
+ symbol = base + '/' + quote;
599
+ }
600
+ else if (isPerpetual) {
601
+ marketType = 'swap';
602
+ base = base.replace('.P', '');
603
+ settle = quote;
604
+ settleId = quoteId;
605
+ symbol = base + '/' + quote + ':' + settle;
606
+ }
607
+ result.push({
608
+ 'id': id,
609
+ 'symbol': symbol,
610
+ 'base': base,
611
+ 'quote': quote,
612
+ 'settle': settle,
613
+ 'baseId': baseId,
614
+ 'quoteId': quoteId,
615
+ 'settleId': settleId,
616
+ 'type': marketType,
617
+ 'spot': isSpot,
618
+ 'margin': undefined,
619
+ 'swap': isPerpetual,
620
+ 'future': false,
621
+ 'option': false,
622
+ 'active': this.safeString(market, 'status') === 'listed',
623
+ 'contract': isPerpetual,
624
+ 'linear': isPerpetual ? true : undefined,
625
+ 'inverse': isPerpetual ? false : undefined,
626
+ 'contractSize': isSpot ? undefined : 1,
627
+ 'expiry': undefined,
628
+ 'expiryDatetime': undefined,
629
+ 'strike': undefined,
630
+ 'optionType': undefined,
631
+ 'precision': {
632
+ 'price': this.safeNumber(market, 'minTickPrice'),
633
+ 'amount': this.safeNumber(market, 'minLotSize'),
634
+ },
635
+ 'limits': {
636
+ 'leverage': {
637
+ 'min': undefined,
638
+ 'max': undefined,
639
+ },
640
+ 'amount': {
641
+ 'min': this.safeNumber(market, 'minSize'),
642
+ 'max': this.safeNumber(market, 'maxSize'),
643
+ },
644
+ 'price': {
645
+ 'min': this.safeNumber(market, 'minPrice'),
646
+ 'max': this.safeNumber(market, 'maxPrice'),
647
+ },
648
+ 'cost': {
649
+ 'min': this.safeNumber(market, 'minNotional'),
650
+ 'max': undefined,
651
+ },
652
+ },
653
+ 'created': undefined,
654
+ 'info': market,
655
+ });
656
+ }
657
+ return result;
658
+ }
659
+ /**
660
+ * @method
661
+ * @name arkham#fetchTime
662
+ * @description fetches the current integer timestamp in milliseconds from the exchange server
663
+ * @see https://arkm.com/docs#get/public/server-time
664
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
665
+ * @returns {int} the current integer timestamp in milliseconds from the exchange server
666
+ */
667
+ async fetchTime(params = {}) {
668
+ const response = await this.v1PublicGetServerTime(params);
669
+ //
670
+ // {
671
+ // "serverTime": "1753465832770820"
672
+ // }
673
+ //
674
+ return this.safeIntegerProduct(response, 'serverTime', 0.001);
675
+ }
676
+ /**
677
+ * @method
678
+ * @name arkham#fetchOrderBook
679
+ * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
680
+ * @see https://arkm.com/docs#get/public/book
681
+ * @param {string} symbol unified symbol of the market to fetch the order book for
682
+ * @param {int} [limit] the number of order book entries to return, max 50
683
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
684
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
685
+ */
686
+ async fetchOrderBook(symbol, limit = undefined, params = {}) {
687
+ await this.loadMarkets();
688
+ const market = this.market(symbol);
689
+ const request = {
690
+ 'symbol': market['id'],
691
+ };
692
+ if (limit !== undefined) {
693
+ request['limit'] = limit;
694
+ }
695
+ const response = await this.v1PublicGetBook(this.extend(request, params));
696
+ //
697
+ // {
698
+ // "symbol": "BTC_USDT",
699
+ // "group": "0.01",
700
+ // "asks": [
701
+ // {
702
+ // "price": "122900.43",
703
+ // "size": "0.0243"
704
+ // },
705
+ // {
706
+ // "price": "121885.53",
707
+ // "size": "0.00116"
708
+ // },
709
+ // ...
710
+ // ],
711
+ // "bids": [
712
+ // {
713
+ // "price": "20400",
714
+ // "size": "0.00316"
715
+ // },
716
+ // {
717
+ // "price": "30000",
718
+ // "size": "0.00116"
719
+ // },
720
+ // ...
721
+ // ],
722
+ // "lastTime": "1753419275604353"
723
+ // }
724
+ //
725
+ const timestamp = this.safeIntegerProduct(response, 'lastTime', 0.001);
726
+ const marketId = this.safeString(response, 'symbol');
727
+ return this.parseOrderBook(response, this.safeSymbol(marketId, market), timestamp, 'bids', 'asks', 'price', 'size');
728
+ }
729
+ /**
730
+ * @method
731
+ * @name arkham#fetchOHLCV
732
+ * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
733
+ * @see https://arkm.com/docs#get/public/candles
734
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
735
+ * @param {string} timeframe the length of time each candle represents
736
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
737
+ * @param {int} [limit] the maximum amount of candles to fetch
738
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
739
+ * @param {int} [params.until] timestamp in ms for the ending date filter, default is the current time
740
+ * @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)
741
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
742
+ */
743
+ async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
744
+ const maxLimit = 365;
745
+ await this.loadMarkets();
746
+ let paginate = false;
747
+ [paginate, params] = this.handleOptionAndParams(params, 'fetchOHLCV', 'paginate', false);
748
+ if (paginate) {
749
+ return await this.fetchPaginatedCallDeterministic('fetchOHLCV', symbol, since, limit, timeframe, params, maxLimit);
750
+ }
751
+ const market = this.market(symbol);
752
+ const request = {
753
+ 'symbol': market['id'],
754
+ 'duration': this.safeString(this.timeframes, timeframe, timeframe),
755
+ };
756
+ const durationMs = this.parseTimeframe(timeframe) * 1000;
757
+ const until = this.safeInteger(params, 'until');
758
+ params = this.omit(params, ['until']);
759
+ const selectedLimit = (limit !== undefined) ? Math.min(limit, maxLimit) : maxLimit;
760
+ if (since !== undefined) {
761
+ request['start'] = since;
762
+ request['end'] = this.sum(since, selectedLimit * durationMs);
763
+ }
764
+ else {
765
+ const now = this.milliseconds();
766
+ request['end'] = (until !== undefined) ? until : now;
767
+ request['start'] = request['end'] - selectedLimit * durationMs;
768
+ }
769
+ // exchange needs microseconds
770
+ request['start'] = request['start'] * 1000;
771
+ request['end'] = request['end'] * 1000;
772
+ const response = await this.v1PublicGetCandles(this.extend(request, params));
773
+ //
774
+ // [
775
+ // {
776
+ // "symbol": "BTC_USDT_PERP",
777
+ // "time": "1753464720000000",
778
+ // "duration": "60000000",
779
+ // "open": "116051.35",
780
+ // "high": "116060.27",
781
+ // "low": "116051.35",
782
+ // "close": "116060.27",
783
+ // "volume": "0.0257",
784
+ // "quoteVolume": "2982.6724054"
785
+ // },
786
+ // ...
787
+ // ]
788
+ //
789
+ return this.parseOHLCVs(response, market, timeframe, since, limit);
790
+ }
791
+ parseOHLCV(ohlcv, market = undefined) {
792
+ //
793
+ // {
794
+ // "symbol": "BTC_USDT_PERP",
795
+ // "time": "1753464720000000",
796
+ // "duration": "60000000",
797
+ // "open": "116051.35",
798
+ // "high": "116060.27",
799
+ // "low": "116051.35",
800
+ // "close": "116060.27",
801
+ // "volume": "0.0257",
802
+ // "quoteVolume": "2982.6724054"
803
+ // }
804
+ //
805
+ return [
806
+ this.safeIntegerProduct(ohlcv, 'time', 0.001),
807
+ this.safeNumber(ohlcv, 'open'),
808
+ this.safeNumber(ohlcv, 'high'),
809
+ this.safeNumber(ohlcv, 'low'),
810
+ this.safeNumber(ohlcv, 'close'),
811
+ this.safeNumber(ohlcv, 'volume'),
812
+ ];
813
+ }
814
+ async fetchTickers(symbols = undefined, params = {}) {
815
+ const response = await this.v1PublicGetTickers(params);
816
+ //
817
+ // [
818
+ // {
819
+ // "symbol": "BTC_USDT_PERP",
820
+ // "baseSymbol": "BTC.P",
821
+ // "quoteSymbol": "USDT",
822
+ // "indexCurrency": "USDT",
823
+ // "price": "118806.89",
824
+ // "price24hAgo": "118212.29",
825
+ // "high24h": "119468.05",
826
+ // "low24h": "117104.44",
827
+ // "volume24h": "180.99438",
828
+ // "quoteVolume24h": "21430157.5928827",
829
+ // "markPrice": "118814.71",
830
+ // "indexPrice": "118804.222610343",
831
+ // "fundingRate": "0.000007",
832
+ // "nextFundingRate": "0.000006",
833
+ // "nextFundingTime": "1753390800000000",
834
+ // "productType": "perpetual",
835
+ // "openInterest": "2.55847",
836
+ // "usdVolume24h": "21430157.5928827",
837
+ // "openInterestUSD": "303963.8638583"
838
+ // },
839
+ // ...
840
+ //
841
+ return this.parseTickers(response, symbols);
842
+ }
843
+ /**
844
+ * @method
845
+ * @name arkham#fetchTicker
846
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
847
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
848
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
849
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
850
+ */
851
+ async fetchTicker(symbol, params = {}) {
852
+ await this.loadMarkets();
853
+ const market = this.market(symbol);
854
+ const request = {
855
+ 'symbol': market['id'],
856
+ };
857
+ const response = await this.v1PublicGetTicker(this.extend(request, params));
858
+ //
859
+ // {
860
+ // "symbol": "BTC_USDT_PERP",
861
+ // "baseSymbol": "BTC.P",
862
+ // "quoteSymbol": "USDT",
863
+ // "indexCurrency": "USDT",
864
+ // "price": "118806.89",
865
+ // "price24hAgo": "118212.29",
866
+ // "high24h": "119468.05",
867
+ // "low24h": "117104.44",
868
+ // "volume24h": "180.99438",
869
+ // "quoteVolume24h": "21430157.5928827",
870
+ // "markPrice": "118814.71",
871
+ // "indexPrice": "118804.222610343",
872
+ // "fundingRate": "0.000007",
873
+ // "nextFundingRate": "0.000006",
874
+ // "nextFundingTime": "1753390800000000",
875
+ // "productType": "perpetual",
876
+ // "openInterest": "2.55847",
877
+ // "usdVolume24h": "21430157.5928827",
878
+ // "openInterestUSD": "303963.8638583"
879
+ // }
880
+ //
881
+ return this.parseTicker(response, market);
882
+ }
883
+ parseTicker(ticker, market = undefined) {
884
+ const marketId = this.safeString(ticker, 'symbol');
885
+ market = this.safeMarket(marketId, market);
886
+ return this.safeTicker({
887
+ 'info': ticker,
888
+ 'symbol': this.safeSymbol(marketId, market),
889
+ 'high': this.safeNumber(ticker, 'high24h'),
890
+ 'low': this.safeNumber(ticker, 'low24h'),
891
+ 'bid': this.safeNumber(ticker, 'bid'),
892
+ 'last': this.safeNumber(ticker, 'price'),
893
+ 'open': this.safeNumber(ticker, 'price24hAgo'),
894
+ 'change': this.safeNumber(ticker, 'priceChange'),
895
+ 'percentage': this.safeNumber(ticker, 'priceChangePercent'),
896
+ 'baseVolume': this.safeNumber(ticker, 'volume24h'),
897
+ 'quoteVolume': this.safeNumber(ticker, 'usdVolume24h'),
898
+ 'markPrice': this.safeNumber(ticker, 'markPrice'),
899
+ 'indexPrice': this.safeNumber(ticker, 'indexPrice'),
900
+ 'vwap': undefined,
901
+ 'average': undefined,
902
+ 'previousClose': undefined,
903
+ 'askVolume': undefined,
904
+ 'bidVolume': undefined,
905
+ });
906
+ }
907
+ /**
908
+ * @method
909
+ * @name arkham#fetchTrades
910
+ * @description get the list of most recent trades for a particular symbol
911
+ * @see https://arkm.com/docs#get/public/trades
912
+ * @param {string} symbol unified symbol of the market to fetch trades for
913
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
914
+ * @param {int} [limit] the maximum amount of trades to fetch
915
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
916
+ * @param {string} [params.loc] crypto location, default: us
917
+ * @param {string} [params.method] method, default: marketPublicGetV1beta3CryptoLocTrades
918
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
919
+ */
920
+ async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
921
+ await this.loadMarkets();
922
+ const market = this.market(symbol);
923
+ const marketId = market['id'];
924
+ const request = {
925
+ 'symbol': marketId,
926
+ };
927
+ if (limit !== undefined) {
928
+ request['limit'] = limit;
929
+ }
930
+ const response = await this.v1PublicGetTrades(this.extend(request, params));
931
+ //
932
+ // [
933
+ // {
934
+ // "symbol": "BTC_USDT_PERP",
935
+ // "revisionId": "1130514101",
936
+ // "size": "0.01668",
937
+ // "price": "116309.57",
938
+ // "takerSide": "sell",
939
+ // "time": "1753439710374047"
940
+ // },
941
+ // ...
942
+ // ]
943
+ //
944
+ return this.parseTrades(response, market, since, limit);
945
+ }
946
+ parseTrade(trade, market = undefined) {
947
+ //
948
+ // fetchTrades
949
+ //
950
+ // {
951
+ // "symbol": "BTC_USDT_PERP",
952
+ // "revisionId": "1130514101",
953
+ // "size": "0.01668",
954
+ // "price": "116309.57",
955
+ // "takerSide": "sell",
956
+ // "time": "1753439710374047"
957
+ // }
958
+ //
959
+ // fetchMyTrades
960
+ //
961
+ // {
962
+ // "symbol": "SOL_USDT",
963
+ // "revisionId": "891839406",
964
+ // "size": "0.042",
965
+ // "price": "185.06",
966
+ // "takerSide": "sell",
967
+ // "time": "1753773952039342",
968
+ // "orderId": "3717304929194",
969
+ // "userSide": "sell",
970
+ // "quoteFee": "0.00777252",
971
+ // "arkmFee": "0",
972
+ // "clientOrderId": ""
973
+ // }
974
+ //
975
+ const marketId = this.safeString(trade, 'symbol');
976
+ market = this.safeMarket(marketId, market);
977
+ const timestamp = this.safeIntegerProduct(trade, 'time', 0.001);
978
+ const quoteFee = this.safeNumber(trade, 'quoteFee');
979
+ const arkmFee = this.safeNumber(trade, 'arkmFee');
980
+ let fee = undefined;
981
+ if (quoteFee !== undefined) {
982
+ fee = {
983
+ 'cost': quoteFee,
984
+ 'currency': market['quote'],
985
+ };
986
+ }
987
+ else if (arkmFee !== undefined) {
988
+ fee = {
989
+ 'cost': arkmFee,
990
+ 'currency': 'ARKM',
991
+ };
992
+ }
993
+ return this.safeTrade({
994
+ 'info': trade,
995
+ 'id': this.safeString(trade, 'revisionId'),
996
+ 'timestamp': timestamp,
997
+ 'datetime': this.iso8601(timestamp),
998
+ 'symbol': market['symbol'],
999
+ 'type': undefined,
1000
+ 'side': this.safeString2(trade, 'userSide', 'takerSide'),
1001
+ 'takerOrMaker': undefined,
1002
+ 'price': this.safeString(trade, 'price'),
1003
+ 'amount': this.safeString(trade, 'size'),
1004
+ 'cost': undefined,
1005
+ 'fee': fee,
1006
+ 'order': this.safeString(trade, 'orderId'),
1007
+ }, market);
1008
+ }
1009
+ /**
1010
+ * @method
1011
+ * @name arkmm#fetchOrder
1012
+ * @description fetches information on an order made by the user
1013
+ * @see https://arkm.com/docs#get/orders/by-client-order-id
1014
+ * @param {string} id the order id
1015
+ * @param {string} symbol unified symbol of the market the order was made in
1016
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1017
+ * @param {string} [params.clientOrderId] a unique id for the order
1018
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1019
+ */
1020
+ async fetchOrder(id, symbol = undefined, params = {}) {
1021
+ const request = {
1022
+ 'id': parseInt(id),
1023
+ };
1024
+ const response = await this.v1PrivateGetOrdersId(this.extend(request, params));
1025
+ //
1026
+ // {
1027
+ // "orderId": "3690478767430",
1028
+ // "userId": "2959123",
1029
+ // "subaccountId": "0",
1030
+ // "symbol": "SOL_USDT",
1031
+ // "time": "1753696843913970",
1032
+ // "side": "sell",
1033
+ // "type": "limitGtc",
1034
+ // "size": "0.066",
1035
+ // "price": "293.2",
1036
+ // "postOnly": false,
1037
+ // "reduceOnly": false,
1038
+ // "executedSize": "0",
1039
+ // "status": "booked",
1040
+ // "avgPrice": "0",
1041
+ // "executedNotional": "0",
1042
+ // "creditFeePaid": "0",
1043
+ // "marginBonusFeePaid": "0",
1044
+ // "quoteFeePaid": "0",
1045
+ // "arkmFeePaid": "0",
1046
+ // "revisionId": "887956326",
1047
+ // "lastTime": "1753696843914830",
1048
+ // "clientOrderId": "",
1049
+ // "lastSize": "0",
1050
+ // "lastPrice": "0",
1051
+ // "lastCreditFee": "0",
1052
+ // "lastMarginBonusFee": "0",
1053
+ // "lastQuoteFee": "0",
1054
+ // "lastArkmFee": "0"
1055
+ // }
1056
+ //
1057
+ return this.parseOrder(response);
1058
+ }
1059
+ /**
1060
+ * @method
1061
+ * @name arkham#fetchClosedOrders
1062
+ * @description fetches information on multiple closed orders made by the user
1063
+ * @see https://arkm.com/docs#get/orders/history
1064
+ * @param {string} symbol unified market symbol of the market orders were made in
1065
+ * @param {int} [since] the earliest time in ms to fetch orders for
1066
+ * @param {int} [limit] the maximum number of order structures to retrieve
1067
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1068
+ * @param {int} [params.until] the latest time in ms to fetch orders for
1069
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1070
+ */
1071
+ async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1072
+ await this.loadMarkets();
1073
+ const request = {};
1074
+ let market = undefined;
1075
+ if (symbol !== undefined) {
1076
+ market = this.market(symbol);
1077
+ request['symbol'] = market['id'];
1078
+ }
1079
+ if (limit !== undefined) {
1080
+ request['limit'] = limit; // note, API does not work for this param
1081
+ }
1082
+ const response = await this.v1PrivateGetOrdersHistory(this.extend(request, params));
1083
+ //
1084
+ // [
1085
+ // {
1086
+ // "orderId": "3690478767430",
1087
+ // "userId": "2959123",
1088
+ // "subaccountId": "0",
1089
+ // "symbol": "SOL_USDT",
1090
+ // "time": "1753696843913970",
1091
+ // "side": "sell",
1092
+ // "type": "limitGtc",
1093
+ // "size": "0.066",
1094
+ // "price": "293.2",
1095
+ // "postOnly": false,
1096
+ // "reduceOnly": false,
1097
+ // "executedSize": "0",
1098
+ // "status": "closed",
1099
+ // "avgPrice": "0",
1100
+ // "executedNotional": "0",
1101
+ // "creditFeePaid": "0",
1102
+ // "marginBonusFeePaid": "0",
1103
+ // "quoteFeePaid": "0",
1104
+ // "arkmFeePaid": "0",
1105
+ // "revisionId": "888084076",
1106
+ // "lastTime": "1753701350088305",
1107
+ // "clientOrderId": "",
1108
+ // "lastSize": "0",
1109
+ // "lastPrice": "0",
1110
+ // "lastCreditFee": "0",
1111
+ // "lastMarginBonusFee": "0",
1112
+ // "lastQuoteFee": "0",
1113
+ // "lastArkmFee": "0"
1114
+ // }
1115
+ // ]
1116
+ //
1117
+ return this.parseOrders(response, market, since, limit);
1118
+ }
1119
+ /**
1120
+ * @method
1121
+ * @name arkham#fetchOpenOrders
1122
+ * @description fetch all unfilled currently open orders
1123
+ * @see https://arkm.com/docs#get/orders
1124
+ * @param {string} symbol unified market symbol of the market orders were made in
1125
+ * @param {int} [since] the earliest time in ms to fetch orders for
1126
+ * @param {int} [limit] the maximum number of order structures to retrieve
1127
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1128
+ * @param {int} [params.until] the latest time in ms to fetch orders for
1129
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1130
+ */
1131
+ async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1132
+ await this.loadMarkets();
1133
+ let market = undefined;
1134
+ if (symbol !== undefined) {
1135
+ market = this.market(symbol);
1136
+ }
1137
+ const isTriggerOrder = this.safeBool(params, 'trigger');
1138
+ params = this.omit(params, 'trigger');
1139
+ let response = undefined;
1140
+ if (isTriggerOrder) {
1141
+ response = await this.v1PrivateGetTriggerOrders(this.extend({}, params));
1142
+ //
1143
+ // [
1144
+ // {
1145
+ // "subaccountId": "0",
1146
+ // "symbol": "SOL_USDT",
1147
+ // "side": "sell",
1148
+ // "type": "market",
1149
+ // "size": "0.045",
1150
+ // "price": "99.9",
1151
+ // "postOnly": false,
1152
+ // "reduceOnly": false,
1153
+ // "time": "1753768103780063",
1154
+ // "triggerOrderId": "3715847222127",
1155
+ // "triggerType": "stopLoss",
1156
+ // "triggerPriceType": "last",
1157
+ // "triggerPrice": "111",
1158
+ // "clientOrderId": "",
1159
+ // "status": "staged"
1160
+ // },
1161
+ // ]
1162
+ //
1163
+ }
1164
+ else {
1165
+ response = await this.v1PrivateGetOrders(this.extend({}, params));
1166
+ //
1167
+ // [
1168
+ // {
1169
+ // "orderId": "3690478767430",
1170
+ // "userId": "2959123",
1171
+ // "subaccountId": "0",
1172
+ // "symbol": "SOL_USDT",
1173
+ // "time": "1753696843913970",
1174
+ // "side": "sell",
1175
+ // "type": "limitGtc",
1176
+ // "size": "0.066",
1177
+ // "price": "293.2",
1178
+ // "postOnly": false,
1179
+ // "reduceOnly": false,
1180
+ // "executedSize": "0",
1181
+ // "status": "booked",
1182
+ // "avgPrice": "0",
1183
+ // "executedNotional": "0",
1184
+ // "creditFeePaid": "0",
1185
+ // "marginBonusFeePaid": "0",
1186
+ // "quoteFeePaid": "0",
1187
+ // "arkmFeePaid": "0",
1188
+ // "revisionId": "887956326",
1189
+ // "lastTime": "1753696843914830",
1190
+ // "clientOrderId": "",
1191
+ // "lastSize": "0",
1192
+ // "lastPrice": "0",
1193
+ // "lastCreditFee": "0",
1194
+ // "lastMarginBonusFee": "0",
1195
+ // "lastQuoteFee": "0",
1196
+ // "lastArkmFee": "0"
1197
+ // }
1198
+ // ]
1199
+ //
1200
+ }
1201
+ return this.parseOrders(response, market, since, limit);
1202
+ }
1203
+ /**
1204
+ * @method
1205
+ * @name arkham#cancelOrder
1206
+ * @description cancels an open order
1207
+ * @see https://arkm.com/docs#post/orders/cancel
1208
+ * @param {string} id order id
1209
+ * @param {string} symbol unified symbol of the market the order was made in
1210
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1211
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1212
+ */
1213
+ async cancelOrder(id, symbol = undefined, params = {}) {
1214
+ const isTriggerOrder = this.safeBool(params, 'trigger');
1215
+ params = this.omit(params, 'trigger');
1216
+ let response = undefined;
1217
+ const request = {};
1218
+ const clientOrderId = this.safeInteger(params, 'clientOrderId');
1219
+ if (clientOrderId !== undefined) {
1220
+ params = this.omit(params, 'clientOrderId');
1221
+ request['clientOrderId'] = clientOrderId;
1222
+ }
1223
+ else {
1224
+ if (isTriggerOrder) {
1225
+ request['triggerOrderId'] = parseInt(id);
1226
+ }
1227
+ else {
1228
+ request['orderId'] = parseInt(id);
1229
+ }
1230
+ }
1231
+ if (isTriggerOrder) {
1232
+ if (symbol === undefined) {
1233
+ throw new ArgumentsRequired(this.id + ' cancelOrder() requires a symbol argument for trigger orders');
1234
+ }
1235
+ const market = this.market(symbol);
1236
+ request['symbol'] = market['id'];
1237
+ response = await this.v1PrivatePostTriggerOrdersCancel(this.extend(request, params));
1238
+ }
1239
+ else {
1240
+ response = await this.v1PrivatePostOrdersCancel(this.extend(request, params));
1241
+ }
1242
+ //
1243
+ // {"orderId":3691703758327}
1244
+ //
1245
+ return this.parseOrder(response);
1246
+ }
1247
+ /**
1248
+ * @method
1249
+ * @name arkham#cancelAllOrders
1250
+ * @description cancel all open orders in a market
1251
+ * @see https://arkm.com/docs#post/orders/cancel/all
1252
+ * @param {string} symbol cancel alls open orders
1253
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1254
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1255
+ */
1256
+ async cancelAllOrders(symbol = undefined, params = {}) {
1257
+ if (symbol !== undefined) {
1258
+ throw new BadRequest(this.id + ' cancelAllOrders() does not support a symbol argument, use cancelOrder() or fetchOpenOrders() instead');
1259
+ }
1260
+ const isTriggerOrder = this.safeBool(params, 'trigger');
1261
+ params = this.omit(params, 'trigger');
1262
+ let response = undefined;
1263
+ if (isTriggerOrder) {
1264
+ response = await this.v1PrivatePostTriggerOrdersCancelAll(params);
1265
+ }
1266
+ else {
1267
+ response = await this.v1PrivatePostOrdersCancelAll(params);
1268
+ }
1269
+ //
1270
+ // [] returns an empty array, even when successfully cancels orders
1271
+ //
1272
+ return this.parseOrders(response, undefined);
1273
+ }
1274
+ /**
1275
+ * @method
1276
+ * @name arkham#createOrder
1277
+ * @description create a trade order on the exchange
1278
+ * @see https://arkm.com/docs#post/orders/new
1279
+ * @param {string} symbol unified CCXT market symbol
1280
+ * @param {string} type "limit" or "market"
1281
+ * @param {string} side "buy" or "sell"
1282
+ * @param {float} amount the amount of currency to trade
1283
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1284
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1285
+ * @param {string} [params.timeInForce] "GTC", "IOC", "FOK", or "PO"
1286
+ * @param {float} [params.triggerPrice] price for a trigger (conditional) order
1287
+ * @param {float} [params.stopLossPrice] price for a stoploss order
1288
+ * @param {float} [params.takeProfitPrice] price for a takeprofit order
1289
+ * @param {string} [params.triggerDirection] the direction for trigger orders, 'ascending' or 'descending'
1290
+ * @param {string} [params.triggerPriceType] mark, index or last
1291
+ * @param {bool} [params.postOnly] true or false whether the order is post-only
1292
+ * @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
1293
+ * @returns [An order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1294
+ */
1295
+ async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1296
+ await this.loadMarkets();
1297
+ const market = this.market(symbol);
1298
+ const isTriggerOrder = this.safeNumberN(params, ['triggerPrice', 'stopLossPrice', 'takeProfitPrice']) !== undefined;
1299
+ const request = this.createOrderRequest(symbol, type, side, amount, price, params);
1300
+ let response = undefined;
1301
+ if (isTriggerOrder) {
1302
+ response = await this.v1PrivatePostTriggerOrdersNew(request);
1303
+ //
1304
+ // {
1305
+ // "triggerOrderId": "3716436645573",
1306
+ // "symbol": "SOL_USDT_PERP",
1307
+ // "side": "buy",
1308
+ // "type": "limitGtc",
1309
+ // "size": "0.05",
1310
+ // "price": "150"
1311
+ // }
1312
+ //
1313
+ }
1314
+ else {
1315
+ response = await this.v1PrivatePostOrdersNew(request);
1316
+ //
1317
+ // {
1318
+ // "orderId": "3694872060678",
1319
+ // "clientOrderId": "test123",
1320
+ // "symbol": "SOL_USDT",
1321
+ // "subaccountId": "0",
1322
+ // "side": "buy",
1323
+ // "type": "limitGtc",
1324
+ // "size": "0.05",
1325
+ // "price": "170",
1326
+ // "time": "1753710501474043"
1327
+ // }
1328
+ //
1329
+ }
1330
+ return this.parseOrder(response, market);
1331
+ }
1332
+ createOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
1333
+ const market = this.market(symbol);
1334
+ symbol = market['symbol'];
1335
+ const request = {
1336
+ 'symbol': market['id'],
1337
+ 'side': side,
1338
+ 'size': this.amountToPrecision(symbol, amount),
1339
+ };
1340
+ const isBuy = (side === 'buy');
1341
+ const stopLossPrice = this.safeNumber(params, 'stopLossPrice');
1342
+ const takeProfitPrice = this.safeNumber(params, 'takeProfitPrice');
1343
+ const triggerPriceAny = this.safeStringN(params, ['triggerPrice', 'stopLossPrice', 'takeProfitPrice']);
1344
+ if (triggerPriceAny !== undefined) {
1345
+ request['triggerPrice'] = this.priceToPrecision(symbol, triggerPriceAny);
1346
+ if (stopLossPrice !== undefined) {
1347
+ request['triggerType'] = isBuy ? 'stopLoss' : 'takeProfit';
1348
+ }
1349
+ else if (takeProfitPrice !== undefined) {
1350
+ request['triggerType'] = isBuy ? 'takeProfit' : 'stopLoss';
1351
+ }
1352
+ else {
1353
+ const triggerDirection = this.safeString(params, 'triggerDirection');
1354
+ if (triggerDirection === undefined) {
1355
+ throw new ArgumentsRequired(this.id + ' createOrder() requires a triggerDirection parameter when triggerPrice is specified, must be "ascending" or "descending"');
1356
+ }
1357
+ if (triggerDirection !== undefined) {
1358
+ if (triggerDirection === 'ascending') {
1359
+ request['triggerType'] = isBuy ? 'stopLoss' : 'takeProfit';
1360
+ }
1361
+ else if (triggerDirection === 'descending') {
1362
+ request['triggerType'] = isBuy ? 'takeProfit' : 'stopLoss';
1363
+ }
1364
+ }
1365
+ }
1366
+ // mandatory triggerPriceType
1367
+ if (this.safeString(params, 'triggerPriceType') === undefined) {
1368
+ request['triggerPriceType'] = 'last'; // default
1369
+ }
1370
+ }
1371
+ const isMarketOrder = (type === 'market');
1372
+ const isLimitOrder = (type === 'limit');
1373
+ const isLimitExchangeSpecific = this.inArray(type, ['limitGtc', 'limitIoc', 'limitFok']);
1374
+ const postOnly = this.isPostOnly(isMarketOrder, false, params);
1375
+ const timeInForce = this.safeString(params, 'timeInForce');
1376
+ params = this.omit(params, ['postOnly', 'timeInForce', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerDirection']);
1377
+ if (postOnly) {
1378
+ request['postOnly'] = true;
1379
+ }
1380
+ if (isLimitOrder || isLimitExchangeSpecific) {
1381
+ request['price'] = this.priceToPrecision(symbol, price);
1382
+ //
1383
+ if (timeInForce === 'IOC') {
1384
+ request['type'] = 'limitIoc';
1385
+ }
1386
+ else if (timeInForce === 'FOK') {
1387
+ request['type'] = 'limitFok';
1388
+ }
1389
+ else {
1390
+ request['type'] = 'limitGtc';
1391
+ }
1392
+ }
1393
+ else if (isMarketOrder) {
1394
+ request['type'] = 'market';
1395
+ }
1396
+ // we don't need to manually handle `reduceOnly`, `clientOrderId`, `triggerPriceType` here as exchange-specific keyname & values matches
1397
+ return this.extend(request, params);
1398
+ }
1399
+ parseOrder(order, market = undefined) {
1400
+ //
1401
+ // createOrder
1402
+ //
1403
+ // {
1404
+ // "orderId": "3694872060678",
1405
+ // "clientOrderId": "test123",
1406
+ // "symbol": "SOL_USDT",
1407
+ // "subaccountId": "0",
1408
+ // "side": "buy",
1409
+ // "type": "limitGtc",
1410
+ // "size": "0.05",
1411
+ // "price": "170",
1412
+ // "time": "1753710501474043"
1413
+ // }
1414
+ //
1415
+ // fetchOrder, fetchOpenOrders, fetchClosedOrders
1416
+ //
1417
+ // {
1418
+ // "orderId": "3690478767430",
1419
+ // "userId": "2959123",
1420
+ // "subaccountId": "0",
1421
+ // "symbol": "SOL_USDT",
1422
+ // "time": "1753696843913970",
1423
+ // "side": "sell",
1424
+ // "type": "limitGtc",
1425
+ // "size": "0.066",
1426
+ // "price": "293.2",
1427
+ // "postOnly": false,
1428
+ // "reduceOnly": false,
1429
+ // "executedSize": "0",
1430
+ // "status": "booked",
1431
+ // "avgPrice": "0",
1432
+ // "executedNotional": "0",
1433
+ // "creditFeePaid": "0",
1434
+ // "marginBonusFeePaid": "0",
1435
+ // "quoteFeePaid": "0",
1436
+ // "arkmFeePaid": "0",
1437
+ // "revisionId": "887956326",
1438
+ // "lastTime": "1753696843914830",
1439
+ // "clientOrderId": "",
1440
+ // "lastSize": "0",
1441
+ // "lastPrice": "0",
1442
+ // "lastCreditFee": "0",
1443
+ // "lastMarginBonusFee": "0",
1444
+ // "lastQuoteFee": "0",
1445
+ // "lastArkmFee": "0"
1446
+ // }
1447
+ //
1448
+ // trigger-orders: createOrder
1449
+ //
1450
+ // {
1451
+ // "triggerOrderId": "3716436645573",
1452
+ // "symbol": "SOL_USDT_PERP",
1453
+ // "side": "buy",
1454
+ // "type": "limitGtc",
1455
+ // "size": "0.05",
1456
+ // "price": "150"
1457
+ // }
1458
+ //
1459
+ // trigger-orders: fetchOpenOrders
1460
+ //
1461
+ // {
1462
+ // "subaccountId": "0",
1463
+ // "symbol": "SOL_USDT",
1464
+ // "side": "sell",
1465
+ // "type": "market",
1466
+ // "size": "0.045",
1467
+ // "price": "99.9",
1468
+ // "postOnly": false,
1469
+ // "reduceOnly": false,
1470
+ // "time": "1753768103780063",
1471
+ // "triggerOrderId": "3715847222127",
1472
+ // "triggerType": "stopLoss",
1473
+ // "triggerPriceType": "last",
1474
+ // "triggerPrice": "111",
1475
+ // "clientOrderId": "",
1476
+ // "status": "staged"
1477
+ // }
1478
+ //
1479
+ const marketId = this.safeString(order, 'symbol');
1480
+ market = this.safeMarket(marketId, market);
1481
+ const isPostOnly = this.safeBool(order, 'postOnly');
1482
+ const typeRaw = this.safeString(order, 'type');
1483
+ const orderType = isPostOnly ? 'limit' : this.parseOrderType(typeRaw);
1484
+ const timeInForce = isPostOnly ? 'PO' : this.parseTimeInForce(typeRaw);
1485
+ const quoteFeePaid = this.safeString(order, 'quoteFeePaid');
1486
+ const arkmFeePaid = this.safeString(order, 'arkmFeePaid');
1487
+ const fees = [];
1488
+ if (quoteFeePaid !== undefined) {
1489
+ fees.push({
1490
+ 'cost': quoteFeePaid,
1491
+ 'currency': this.safeString(market, 'quote'),
1492
+ });
1493
+ }
1494
+ if (arkmFeePaid !== undefined) {
1495
+ fees.push({
1496
+ 'cost': arkmFeePaid,
1497
+ 'currency': 'ARKM',
1498
+ });
1499
+ }
1500
+ const timestamp = this.safeIntegerProduct(order, 'time', 0.001);
1501
+ return this.safeOrder({
1502
+ 'id': this.safeString2(order, 'orderId', 'triggerOrderId'),
1503
+ 'clientOrderId': this.safeString(order, 'clientOrderId'),
1504
+ 'timestamp': timestamp,
1505
+ 'datetime': this.iso8601(timestamp),
1506
+ 'lastTradeTimeStamp': undefined,
1507
+ 'lastUpdateTimestamp': this.safeIntegerProduct(order, 'lastTime', 0.001),
1508
+ 'status': this.parseOrderStatus(this.safeString(order, 'status')),
1509
+ 'symbol': market['symbol'],
1510
+ 'type': orderType,
1511
+ 'timeInForce': timeInForce,
1512
+ 'postOnly': undefined,
1513
+ 'side': this.safeString(order, 'side'),
1514
+ 'price': this.safeNumber(order, 'price'),
1515
+ 'triggerPrice': undefined,
1516
+ 'cost': this.safeNumber(order, 'executedNotional'),
1517
+ 'average': this.safeNumberOmitZero(order, 'avgPrice'),
1518
+ 'amount': this.safeNumber(order, 'size'),
1519
+ 'filled': this.safeNumber(order, ''),
1520
+ 'remaining': undefined,
1521
+ 'trades': undefined,
1522
+ 'fees': fees,
1523
+ 'reduceOnly': this.safeBool(order, 'reduceOnly'),
1524
+ 'info': order,
1525
+ }, market);
1526
+ }
1527
+ parseOrderType(type) {
1528
+ const types = {
1529
+ 'limitGtc': 'limit',
1530
+ 'limitIoc': 'limit',
1531
+ 'limitFok': 'limit',
1532
+ 'market': 'market',
1533
+ };
1534
+ return this.safeStringUpper(types, type, type);
1535
+ }
1536
+ parseTimeInForce(type) {
1537
+ const types = {
1538
+ 'limitGtc': 'GTC',
1539
+ 'limitIoc': 'IOC',
1540
+ 'limitFok': 'FOK',
1541
+ 'market': 'IOC',
1542
+ };
1543
+ return this.safeStringUpper(types, type, type);
1544
+ }
1545
+ parseOrderStatus(status) {
1546
+ const statuses = {
1547
+ 'new': 'pending',
1548
+ 'staged': 'open',
1549
+ 'booked': 'open',
1550
+ 'taker': 'closed',
1551
+ 'maker': 'closed',
1552
+ 'cancelled': 'canceled',
1553
+ 'closed': 'closed',
1554
+ };
1555
+ return this.safeString(statuses, status, status);
1556
+ }
1557
+ /**
1558
+ * @method
1559
+ * @name arkham#fetchMyTrades
1560
+ * @description fetch all trades made by the user
1561
+ * @see https://arkm.com/docs#get/trades/time
1562
+ * @param {string} [symbol] unified market symbol
1563
+ * @param {int} [since] the earliest time in ms to fetch trades for
1564
+ * @param {int} [limit] the maximum number of trade structures to retrieve
1565
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1566
+ * @param {int} [params.until] the latest time in ms to fetch trades for
1567
+ * @param {string} [params.page_token] page_token - used for paging
1568
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1569
+ */
1570
+ async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1571
+ await this.loadMarkets();
1572
+ let request = {};
1573
+ if (limit !== undefined) {
1574
+ request['limit'] = limit;
1575
+ }
1576
+ // exchange needs to obtain some `from & to` values, otherwise it does not return any result
1577
+ const defaultRange = 24 * 60 * 60 * 1000; // default to last 24 hours
1578
+ if (since !== undefined) {
1579
+ request['from'] = since * 1000; // convert ms to microseconds
1580
+ }
1581
+ else {
1582
+ request['from'] = (this.milliseconds() - defaultRange) * 1000; // default to last 24 hours
1583
+ }
1584
+ const until = this.safeInteger(params, 'until');
1585
+ if (until !== undefined) {
1586
+ params = this.omit(params, 'until');
1587
+ request['to'] = until * 1000; // convert ms to microseconds
1588
+ }
1589
+ else {
1590
+ request['to'] = this.sum(request['from'], defaultRange * 1000);
1591
+ }
1592
+ [request, params] = this.handleUntilOption('until', request, params);
1593
+ const response = await this.v1PrivateGetTradesTime(this.extend(request, params));
1594
+ //
1595
+ // [
1596
+ // {
1597
+ // "symbol": "SOL_USDT",
1598
+ // "revisionId": "891839406",
1599
+ // "size": "0.042",
1600
+ // "price": "185.06",
1601
+ // "takerSide": "sell",
1602
+ // "time": "1753773952039342",
1603
+ // "orderId": "3717304929194",
1604
+ // "userSide": "sell",
1605
+ // "quoteFee": "0.00777252",
1606
+ // "arkmFee": "0",
1607
+ // "clientOrderId": ""
1608
+ // },
1609
+ // ...
1610
+ //
1611
+ return this.parseTrades(response, undefined, since, limit);
1612
+ }
1613
+ /**
1614
+ * @method
1615
+ * @name arkham#fetchAccounts
1616
+ * @description fetch all the accounts associated with a profile
1617
+ * @see https://arkm.com/docs#get/user
1618
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1619
+ * @returns {object} a dictionary of [account structures]{@link https://docs.ccxt.com/#/?id=account-structure} indexed by the account type
1620
+ */
1621
+ async fetchAccounts(params = {}) {
1622
+ await this.loadMarkets();
1623
+ const request = {};
1624
+ let accountId = undefined;
1625
+ [accountId, params] = this.handleOptionAndParams(params, 'fetchAccounts', 'accountId');
1626
+ if (accountId !== undefined) {
1627
+ request['subAccountId'] = accountId;
1628
+ }
1629
+ const response = await this.v1PrivateGetUser(this.extend(request, params));
1630
+ //
1631
+ // {
1632
+ // "id": "2959123",
1633
+ // "email": "xyz@gmail.com",
1634
+ // "username": "t.123",
1635
+ // "requireMFA": true,
1636
+ // "kycVerifiedAt": "1753434515850673",
1637
+ // "pmm": false,
1638
+ // "dmm": false,
1639
+ // "becameVipAt": "0",
1640
+ // "subaccounts": [
1641
+ // {
1642
+ // "id": "0",
1643
+ // "name": "Primary",
1644
+ // "pinned": true,
1645
+ // "isLsp": false,
1646
+ // "futuresEnabled": true,
1647
+ // "payFeesInArkm": false,
1648
+ // "lspSettings": []
1649
+ // }
1650
+ // ],
1651
+ // "settings": {
1652
+ // "autogenDepositAddresses": false,
1653
+ // "hideBalances": false,
1654
+ // "confirmBeforePlaceOrder": false,
1655
+ // "tickerTapeScroll": true,
1656
+ // "updatesFlash": true,
1657
+ // "notifyOrderFills": false,
1658
+ // "notifyAnnouncements": false,
1659
+ // "notifyMarginUsage": false,
1660
+ // "marginUsageThreshold": "0.5",
1661
+ // "notifyWithdrawals": true,
1662
+ // "notifyDeposits": true,
1663
+ // "notifySendEmail": true,
1664
+ // "notifyRebates": true,
1665
+ // "notifyCommissions": true,
1666
+ // "allowSequenceEmails": true,
1667
+ // "language": "en"
1668
+ // },
1669
+ // "airdropKycAt": null
1670
+ // }
1671
+ //
1672
+ const subAccounts = this.safeList(response, 'subaccounts', []);
1673
+ return this.parseAccounts(subAccounts, params);
1674
+ }
1675
+ parseAccount(account) {
1676
+ //
1677
+ // {
1678
+ // "id": "0",
1679
+ // "name": "Primary",
1680
+ // "pinned": true,
1681
+ // "isLsp": false,
1682
+ // "futuresEnabled": true,
1683
+ // "payFeesInArkm": false,
1684
+ // "lspSettings": []
1685
+ // }
1686
+ //
1687
+ return {
1688
+ 'id': this.safeString(account, 'id'),
1689
+ 'type': undefined,
1690
+ 'code': undefined,
1691
+ 'info': account,
1692
+ };
1693
+ }
1694
+ /**
1695
+ * @method
1696
+ * @name arkham#fetchBalance
1697
+ * @description query for account info
1698
+ * @see https://arkm.com/docs#get/account/balances
1699
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1700
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
1701
+ */
1702
+ async fetchBalance(params = {}) {
1703
+ await this.loadMarkets();
1704
+ const response = await this.v1PrivateGetAccountBalances(params);
1705
+ //
1706
+ // [
1707
+ // {
1708
+ // "subaccountId": "0",
1709
+ // "symbol": "USDT",
1710
+ // "balance": "19.66494694",
1711
+ // "free": "19.66494694",
1712
+ // "priceUSDT": "1",
1713
+ // "balanceUSDT": "19.66494694",
1714
+ // "freeUSDT": "19.66494694",
1715
+ // "lastUpdateReason": "orderFill",
1716
+ // "lastUpdateTime": "1753773952039342",
1717
+ // "lastUpdateId": "248507437",
1718
+ // "lastUpdateAmount": "7.77252"
1719
+ // },
1720
+ // {
1721
+ // "subaccountId": "0",
1722
+ // "symbol": "SOL",
1723
+ // "balance": "0",
1724
+ // "free": "0",
1725
+ // "priceUSDT": "186.025584673",
1726
+ // "balanceUSDT": "0",
1727
+ // "freeUSDT": "0",
1728
+ // "lastUpdateReason": "orderFill",
1729
+ // "lastUpdateTime": "1753773952039342",
1730
+ // "lastUpdateId": "248507435",
1731
+ // "lastUpdateAmount": "-0.042"
1732
+ // }
1733
+ // ]
1734
+ //
1735
+ return this.parseBalance(response);
1736
+ }
1737
+ parseBalance(response) {
1738
+ const timestamp = this.safeIntegerProduct(response, 'lastUpdateTime', 0.001);
1739
+ const result = {
1740
+ 'info': response,
1741
+ 'timestamp': timestamp,
1742
+ 'datetime': this.iso8601(timestamp),
1743
+ };
1744
+ for (let i = 0; i < response.length; i++) {
1745
+ const balance = response[i];
1746
+ const symbol = this.safeString(balance, 'symbol');
1747
+ const code = this.safeCurrencyCode(symbol);
1748
+ const account = this.account();
1749
+ account['total'] = this.safeString(balance, 'balance');
1750
+ account['free'] = this.safeString(balance, 'free');
1751
+ result[code] = account;
1752
+ }
1753
+ return this.safeBalance(result);
1754
+ }
1755
+ /**
1756
+ * @method
1757
+ * @name arkham#createDepositAddress
1758
+ * @description create a currency deposit address
1759
+ * @see https://arkm.com/docs#post/account/deposit/addresses/new
1760
+ * @param {string} code unified currency code of the currency for the deposit address
1761
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1762
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
1763
+ */
1764
+ async createDepositAddress(code, params = {}) {
1765
+ await this.loadMarkets();
1766
+ let networkCode = undefined;
1767
+ [networkCode, params] = this.handleNetworkCodeAndParams(params);
1768
+ if (networkCode === undefined) {
1769
+ throw new ArgumentsRequired(this.id + ' createDepositAddress() requires a "network" param');
1770
+ }
1771
+ const request = {
1772
+ 'chain': networkCode,
1773
+ };
1774
+ const response = await this.v1PrivatePostAccountDepositAddressesNew(this.extend(request, params));
1775
+ //
1776
+ // {
1777
+ // "addresses": "12NauJ26TUT9aYkpId7YdePJJDRMGbAsEMVoTVUvBErV"
1778
+ // }
1779
+ //
1780
+ const address = this.safeString(response, 'addresses');
1781
+ return this.parseDepositAddress(address, this.currency(code));
1782
+ }
1783
+ /**
1784
+ * @method
1785
+ * @name arkham#fetchDepositAddressesByNetwork
1786
+ * @description fetch the deposit addresses for a currency associated with this account
1787
+ * @see https://arkm.com/docs#get/account/deposit/addresses
1788
+ * @param {string} code unified currency code
1789
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1790
+ * @returns {object} a dictionary [address structures]{@link https://docs.ccxt.com/#/?id=address-structure}, indexed by the network
1791
+ */
1792
+ async fetchDepositAddressesByNetwork(code, params = {}) {
1793
+ await this.loadMarkets();
1794
+ let networkCode = undefined;
1795
+ [networkCode, params] = this.handleNetworkCodeAndParams(params);
1796
+ if (networkCode === undefined) {
1797
+ throw new ArgumentsRequired(this.id + ' fetchDepositAddressesByNetwork() requires a "network" param');
1798
+ }
1799
+ const request = {
1800
+ 'chain': this.networkCodeToId(networkCode),
1801
+ };
1802
+ const response = await this.v1PrivateGetAccountDepositAddresses(this.extend(request, params));
1803
+ //
1804
+ // {
1805
+ // "addresses": [
1806
+ // "12NauJ26TUT9aYkpId7YdePJJDRMGbAsEMVoTVUvBErV"
1807
+ // ]
1808
+ // }
1809
+ //
1810
+ const data = this.safeList(response, 'addresses');
1811
+ const parsed = this.parseDepositAddresses(data, undefined, false, { 'network': networkCode });
1812
+ return this.indexBy(parsed, 'network');
1813
+ }
1814
+ parseDepositAddress(entry, currency = undefined) {
1815
+ //
1816
+ // "12NauJ26TUT9aYkpId7YdePJJDRMGbAsEMVoTVUvBErV"
1817
+ //
1818
+ return {
1819
+ 'info': entry,
1820
+ 'currency': this.safeString(currency, 'code'),
1821
+ 'network': undefined,
1822
+ 'address': entry,
1823
+ 'tag': undefined,
1824
+ };
1825
+ }
1826
+ /**
1827
+ * @method
1828
+ * @name arkham#fetchDepositAddress
1829
+ * @description fetch the deposit address for a currency associated with this account
1830
+ * @see https://arkm.com/docs#get/account/deposit/addresses
1831
+ * @param {string} code unified currency code
1832
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1833
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
1834
+ */
1835
+ async fetchDepositAddress(code, params = {}) {
1836
+ await this.loadMarkets();
1837
+ const currency = this.currency(code);
1838
+ const networkCodeAndParams = this.handleNetworkCodeAndParams(params);
1839
+ const networkCode = networkCodeAndParams[0];
1840
+ const indexedAddresses = await this.fetchDepositAddressesByNetwork(code, params);
1841
+ const selectedNetworkCode = this.selectNetworkCodeFromUnifiedNetworks(currency['code'], networkCode, indexedAddresses);
1842
+ const address = this.safeDict(indexedAddresses, selectedNetworkCode);
1843
+ if (address === undefined) {
1844
+ throw new InvalidAddress(this.id + ' fetchDepositAddress() could not find a deposit address for ' + code);
1845
+ }
1846
+ return address;
1847
+ }
1848
+ /**
1849
+ * @method
1850
+ * @name arkham#fetchDeposits
1851
+ * @description fetch all deposits made to an account
1852
+ * @see https://arkm.com/docs#get/account/deposits
1853
+ * @param {string} code unified currency code
1854
+ * @param {int} [since] the earliest time in ms to fetch deposits for
1855
+ * @param {int} [limit] the maximum number of deposits structures to retrieve
1856
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1857
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
1858
+ */
1859
+ async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
1860
+ await this.loadMarkets();
1861
+ const request = {};
1862
+ if (limit !== undefined) {
1863
+ request['limit'] = limit;
1864
+ }
1865
+ const response = await this.v1PrivateGetAccountDeposits(this.extend(request, params));
1866
+ //
1867
+ // [
1868
+ // {
1869
+ // "id": "238644",
1870
+ // "symbol": "SOL",
1871
+ // "amount": "0.104",
1872
+ // "time": "1753436404000000",
1873
+ // "confirmed": true,
1874
+ // "transactionHash": "1DRxbbyePTsMuB82SDf2fG5gLXH5iYnY8TQDstDPLULpLtjMJtF1ug1T4Mf8B6DSb8fp2sb5YtdbyqieZ2tkE1Ve",
1875
+ // "chain": "Solana",
1876
+ // "depositAddress": "12NauJ26TUT9aYkpId7YdePJJDRMGbAsEMVoTVUvBErV",
1877
+ // "price": "180.322010164"
1878
+ // }
1879
+ // ]
1880
+ //
1881
+ let currency = undefined;
1882
+ if (code !== undefined) {
1883
+ currency = this.currency(code);
1884
+ }
1885
+ return this.parseTransactions(response, currency, since, limit);
1886
+ }
1887
+ parseTransaction(transaction, currency = undefined) {
1888
+ //
1889
+ // {
1890
+ // "id": "238644",
1891
+ // "symbol": "SOL",
1892
+ // "amount": "0.104",
1893
+ // "time": "1753436404000000",
1894
+ // "confirmed": true,
1895
+ // "transactionHash": "1DRxbbyePTsMuB82SDf2fG5gLXH5iYnY8TQDstDPLULpLtjMJtF1ug1T4Mf8B6DSb8fp2sb5YtdbyqieZ2tkE1Ve",
1896
+ // "chain": "Solana",
1897
+ // "depositAddress": "12NauJ26TUT9aYkpId7YdePJJDRMGbAsEMVoTVUvBErV",
1898
+ // "price": "180.322010164"
1899
+ // }
1900
+ //
1901
+ const address = this.safeString(transaction, 'depositAddress');
1902
+ const timestamp = this.safeIntegerProduct(transaction, 'time', 0.001);
1903
+ const confirmd = this.safeBool(transaction, 'confirmed');
1904
+ let status = undefined;
1905
+ if (confirmd) {
1906
+ status = 'ok';
1907
+ }
1908
+ const currencyId = this.safeString(transaction, 'symbol');
1909
+ const code = this.safeCurrencyCode(currencyId, currency);
1910
+ return {
1911
+ 'info': transaction,
1912
+ 'id': this.safeString(transaction, 'id'),
1913
+ 'txid': this.safeString(transaction, 'transactionHash'),
1914
+ 'type': undefined,
1915
+ 'currency': code,
1916
+ 'network': this.networkIdToCode(this.safeString(transaction, 'chain')),
1917
+ 'amount': this.safeNumber(transaction, 'amount'),
1918
+ 'status': status,
1919
+ 'timestamp': timestamp,
1920
+ 'datetime': this.iso8601(timestamp),
1921
+ 'address': address,
1922
+ 'addressFrom': undefined,
1923
+ 'addressTo': address,
1924
+ 'tag': undefined,
1925
+ 'tagFrom': undefined,
1926
+ 'tagTo': undefined,
1927
+ 'updated': undefined,
1928
+ 'comment': undefined,
1929
+ 'fee': undefined,
1930
+ 'internal': false,
1931
+ };
1932
+ }
1933
+ /**
1934
+ * @method
1935
+ * @name arkham#fetchTradingFees
1936
+ * @description fetch the trading fees for multiple markets
1937
+ * @see https://arkm.com/docs#get/account/fees
1938
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1939
+ * @param {string} [params.subType] "linear" or "inverse"
1940
+ * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
1941
+ */
1942
+ async fetchTradingFees(params = {}) {
1943
+ await this.loadMarkets();
1944
+ const response = await this.v1PrivateGetAccountFees(params);
1945
+ //
1946
+ // {
1947
+ // "perpMakerFee": "1.23",
1948
+ // "perpTakerFee": "1.23",
1949
+ // "spotMakerFee": "1.23",
1950
+ // "spotTakerFee": "1.23"
1951
+ // }
1952
+ //
1953
+ const symbols = Object.keys(this.markets);
1954
+ const result = {};
1955
+ const spotMaker = this.safeNumber(response, 'spotMakerFee');
1956
+ const spotTaker = this.safeNumber(response, 'spotTakerFee');
1957
+ const perpMaker = this.safeNumber(response, 'perpMakerFee');
1958
+ const perpTaker = this.safeNumber(response, 'perpTakerFee');
1959
+ for (let i = 0; i < symbols.length; i++) {
1960
+ const symbol = symbols[i];
1961
+ const market = this.markets[symbol];
1962
+ result[symbol] = {
1963
+ 'info': response,
1964
+ 'symbol': symbol,
1965
+ };
1966
+ if (market['spot']) {
1967
+ result[symbol]['maker'] = spotMaker;
1968
+ result[symbol]['taker'] = spotTaker;
1969
+ }
1970
+ else if (market['swap'] || market['future']) {
1971
+ result[symbol]['maker'] = perpMaker;
1972
+ result[symbol]['taker'] = perpTaker;
1973
+ }
1974
+ }
1975
+ return result;
1976
+ }
1977
+ /**
1978
+ * @method
1979
+ * @name arkham#fetchFundingHistory
1980
+ * @description fetch the history of funding payments paid and received on this account
1981
+ * @see https://arkm.com/docs#get/account/funding-rate-payments
1982
+ * @param {string} [symbol] unified market symbol
1983
+ * @param {int} [since] the earliest time in ms to fetch funding history for
1984
+ * @param {int} [limit] the maximum number of funding history structures to retrieve
1985
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1986
+ * @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)
1987
+ * @returns {object} a [funding history structure]{@link https://docs.ccxt.com/#/?id=funding-history-structure}
1988
+ */
1989
+ async fetchFundingHistory(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1990
+ await this.loadMarkets();
1991
+ let market = undefined;
1992
+ if (symbol !== undefined) {
1993
+ market = this.market(symbol);
1994
+ }
1995
+ const request = {};
1996
+ if (limit !== undefined) {
1997
+ request['limit'] = limit;
1998
+ }
1999
+ const response = await this.v1PrivateGetAccountFundingRatePayments(this.extend(request, params));
2000
+ //
2001
+ // [
2002
+ // {
2003
+ // "amount": "20.1",
2004
+ // "assetSymbol": "BTC",
2005
+ // "indexPrice": "1.23",
2006
+ // "pairSymbol": "BTC_USDT",
2007
+ // "time": 1704067200000000,
2008
+ // "id": 1,
2009
+ // "subaccountId": 1,
2010
+ // "userId": 1
2011
+ // },
2012
+ // ...
2013
+ // ]
2014
+ //
2015
+ return this.parseIncomes(response, market, since, limit);
2016
+ }
2017
+ parseIncome(income, market = undefined) {
2018
+ //
2019
+ // {
2020
+ // "amount": "20.1",
2021
+ // "assetSymbol": "BTC",
2022
+ // "indexPrice": "1.23",
2023
+ // "pairSymbol": "BTC_USDT",
2024
+ // "time": 1704067200000000,
2025
+ // "id": 1,
2026
+ // "subaccountId": 1,
2027
+ // "userId": 1
2028
+ // }
2029
+ //
2030
+ const marketId = this.safeString(income, 'pairSymbol');
2031
+ const currencyId = this.safeString(income, 'assetSymbol');
2032
+ const timestamp = this.safeIntegerProduct(income, 'time', 0.001);
2033
+ return {
2034
+ 'info': income,
2035
+ 'symbol': this.safeSymbol(marketId, market),
2036
+ 'code': this.safeCurrencyCode(currencyId),
2037
+ 'timestamp': timestamp,
2038
+ 'datetime': this.iso8601(timestamp),
2039
+ 'id': this.safeString(income, 'id'),
2040
+ 'amount': this.safeNumber(income, 'amount'),
2041
+ };
2042
+ }
2043
+ /**
2044
+ * @method
2045
+ * @name arkham#fetchLeverage
2046
+ * @description fetch the set leverage for a market
2047
+ * @see https://arkm.com/docs#get/account/leverage
2048
+ * @param {string} symbol unified market symbol
2049
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2050
+ * @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
2051
+ */
2052
+ async fetchLeverage(symbol, params = {}) {
2053
+ await this.loadMarkets();
2054
+ const market = this.market(symbol);
2055
+ const marketId = this.safeString(market, 'id');
2056
+ const request = {
2057
+ 'symbol': marketId,
2058
+ };
2059
+ const response = await this.v1PrivateGetAccountLeverage(this.extend(request, params));
2060
+ //
2061
+ // might be empty if not changed from default value (which is 1x)
2062
+ //
2063
+ // [
2064
+ // {
2065
+ // "symbol": "BTC_USDT_PERP",
2066
+ // "leverage": "7"
2067
+ // },
2068
+ // {
2069
+ // "symbol": "ETH_USDT_PERP",
2070
+ // "leverage": "5"
2071
+ // }
2072
+ // ]
2073
+ //
2074
+ const indexed = this.indexBy(response, 'symbol');
2075
+ const data = this.safeDict(indexed, marketId, {});
2076
+ return this.parseLeverage(data, market);
2077
+ }
2078
+ parseLeverage(leverage, market = undefined) {
2079
+ //
2080
+ // {
2081
+ // "symbol": "ETH_USDT_PERP",
2082
+ // "leverage": "5"
2083
+ // }
2084
+ //
2085
+ const marketId = this.safeString(leverage, 'symbol');
2086
+ const leverageNum = this.safeNumber(leverage, 'leverage'); // default leverage is 1 typically
2087
+ return {
2088
+ 'info': leverage,
2089
+ 'symbol': this.safeSymbol(marketId, market),
2090
+ 'marginMode': undefined,
2091
+ 'longLeverage': leverageNum,
2092
+ 'shortLeverage': leverageNum,
2093
+ };
2094
+ }
2095
+ /**
2096
+ * @method
2097
+ * @name arkham#setLeverage
2098
+ * @description set the level of leverage for a market
2099
+ * @see https://arkm.com/docs#post/account/leverage
2100
+ * @param {float} leverage the rate of leverage
2101
+ * @param {string} symbol unified market symbol
2102
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2103
+ * @returns {object} response from the exchange
2104
+ */
2105
+ async setLeverage(leverage, symbol = undefined, params = {}) {
2106
+ if (symbol === undefined) {
2107
+ throw new ArgumentsRequired(this.id + ' setLeverage() requires a symbol argument');
2108
+ }
2109
+ await this.loadMarkets();
2110
+ const market = this.market(symbol);
2111
+ const leverageString = this.numberToString(leverage);
2112
+ const marketId = this.safeString(market, 'id');
2113
+ const request = {
2114
+ 'symbol': marketId,
2115
+ 'leverage': leverageString,
2116
+ };
2117
+ const response = await this.v1PrivatePostAccountLeverage(this.extend(request, params));
2118
+ //
2119
+ // response is just empty string
2120
+ //
2121
+ return this.parseLeverage(response, market);
2122
+ }
2123
+ /**
2124
+ * @method
2125
+ * @name arkkm#fetchPositions
2126
+ * @description fetch all open positions
2127
+ * @see https://arkm.com/docs#get/account/positions
2128
+ * @param {string[]|undefined} symbols list of unified market symbols
2129
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2130
+ * @param {boolean} [params.standard] whether to fetch standard contract positions
2131
+ * @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
2132
+ */
2133
+ async fetchPositions(symbols = undefined, params = {}) {
2134
+ await this.loadMarkets();
2135
+ symbols = this.marketSymbols(symbols);
2136
+ const response = await this.v1PrivateGetAccountPositions(params);
2137
+ //
2138
+ // [
2139
+ // {
2140
+ // "subaccountId": "0",
2141
+ // "symbol": "SOL_USDT_PERP",
2142
+ // "base": "0.037",
2143
+ // "quote": "-6.44614",
2144
+ // "openBuySize": "0",
2145
+ // "openSellSize": "0",
2146
+ // "openBuyNotional": "0",
2147
+ // "openSellNotional": "0",
2148
+ // "lastUpdateReason": "orderFill",
2149
+ // "lastUpdateTime": "1753903829389966",
2150
+ // "lastUpdateId": "250434684",
2151
+ // "lastUpdateBaseDelta": "0.037",
2152
+ // "lastUpdateQuoteDelta": "-6.44614",
2153
+ // "breakEvenPrice": "174.22",
2154
+ // "markPrice": "174.33",
2155
+ // "value": "6.45021",
2156
+ // "pnl": "0.00407",
2157
+ // "initialMargin": "0.645021",
2158
+ // "maintenanceMargin": "0.3870126",
2159
+ // "averageEntryPrice": "174.22"
2160
+ // }
2161
+ // ]
2162
+ //
2163
+ return this.parsePositions(response, symbols);
2164
+ }
2165
+ parsePosition(position, market = undefined) {
2166
+ //
2167
+ // {
2168
+ // "subaccountId": "0",
2169
+ // "symbol": "SOL_USDT_PERP",
2170
+ // "base": "0.037", // negative for short position
2171
+ // "quote": "-6.44614", // negative for long position
2172
+ // "openBuySize": "0",
2173
+ // "openSellSize": "0",
2174
+ // "openBuyNotional": "0",
2175
+ // "openSellNotional": "0",
2176
+ // "lastUpdateReason": "orderFill",
2177
+ // "lastUpdateTime": "1753903829389966",
2178
+ // "lastUpdateId": "250434684",
2179
+ // "lastUpdateBaseDelta": "0.037",
2180
+ // "lastUpdateQuoteDelta": "-6.44614",
2181
+ // "breakEvenPrice": "174.22",
2182
+ // "markPrice": "174.33",
2183
+ // "value": "6.45021",
2184
+ // "pnl": "0.00407",
2185
+ // "initialMargin": "0.645021",
2186
+ // "maintenanceMargin": "0.3870126",
2187
+ // "averageEntryPrice": "174.22"
2188
+ // }
2189
+ //
2190
+ const base = this.safeString(position, 'base');
2191
+ const baseAbs = Precise.stringAbs(base);
2192
+ const isLong = Precise.stringGe(base, '0');
2193
+ const side = isLong ? 'long' : 'short';
2194
+ const marketId = this.safeString(position, 'symbol');
2195
+ const notional = this.safeString(position, 'value');
2196
+ return this.safePosition({
2197
+ 'info': position,
2198
+ 'id': undefined,
2199
+ 'symbol': this.safeSymbol(marketId, market),
2200
+ 'notional': this.parseNumber(Precise.stringAbs(notional)),
2201
+ 'marginMode': undefined,
2202
+ 'liquidationPrice': undefined,
2203
+ 'entryPrice': this.safeNumber(position, 'averageEntryPrice'),
2204
+ 'unrealizedPnl': this.safeNumber(position, 'pnl'),
2205
+ 'realizedPnl': undefined,
2206
+ 'percentage': undefined,
2207
+ 'contracts': this.parseNumber(baseAbs),
2208
+ 'contractSize': undefined,
2209
+ 'markPrice': this.safeNumber(position, 'markPrice'),
2210
+ 'lastPrice': undefined,
2211
+ 'side': side,
2212
+ 'hedged': undefined,
2213
+ 'timestamp': undefined,
2214
+ 'datetime': undefined,
2215
+ 'lastUpdateTimestamp': this.safeInteger(position, 'lastUpdateTime'),
2216
+ 'maintenanceMargin': this.safeNumber(position, 'maintenanceMargin'),
2217
+ 'maintenanceMarginPercentage': undefined,
2218
+ 'collateral': undefined,
2219
+ 'initialMargin': this.safeNumber(position, 'initialMargin'),
2220
+ 'initialMarginPercentage': undefined,
2221
+ 'leverage': undefined,
2222
+ 'marginRatio': undefined,
2223
+ 'stopLossPrice': undefined,
2224
+ 'takeProfitPrice': undefined,
2225
+ });
2226
+ }
2227
+ /**
2228
+ * @method
2229
+ * @name arkkm#withdraw
2230
+ * @description make a withdrawal
2231
+ * @see https://arkm.com/docs#post/account/withdraw
2232
+ * @see https://arkm.com/docs#get/account/withdrawal/addresses
2233
+ * @param {string} code unified currency code
2234
+ * @param {float} amount the amount to withdraw
2235
+ * @param {string} address the address to withdraw to
2236
+ * @param {string} tag
2237
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2238
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2239
+ */
2240
+ async withdraw(code, amount, address, tag = undefined, params = {}) {
2241
+ [tag, params] = this.handleWithdrawTagAndParams(tag, params);
2242
+ await this.loadMarkets();
2243
+ const withdrawalAddresses = await this.v1PrivateGetAccountWithdrawalAddresses();
2244
+ //
2245
+ // [
2246
+ // {
2247
+ // "id": "12345",
2248
+ // "chain": "ETH",
2249
+ // "address": "0x743f79D65EA07AA222F4a83c10dee4210A920a6e",
2250
+ // "label": "my_binance",
2251
+ // "createdAt": "1753905200074355",
2252
+ // "updatedAt": "1753905213464278",
2253
+ // "confirmed": true
2254
+ // }
2255
+ // ]
2256
+ //
2257
+ const currency = this.currency(code);
2258
+ const request = {
2259
+ 'symbol': currency['id'],
2260
+ 'amount': this.currencyToPrecision(code, amount),
2261
+ 'subaccountId': this.safeInteger(params, 'subAccountId', 0),
2262
+ };
2263
+ let networkCode = undefined;
2264
+ [networkCode, params] = this.handleNetworkCodeAndParams(params);
2265
+ if (networkCode === undefined) {
2266
+ throw new ArgumentsRequired(this.id + ' withdraw() requires a "network" param');
2267
+ }
2268
+ const indexedList = this.groupBy(withdrawalAddresses, 'address');
2269
+ if (!(address in indexedList)) {
2270
+ throw new InvalidAddress(this.id + ' withdraw() requires an address that has been previously added to the whitelisted addresses');
2271
+ }
2272
+ const withdrawalObjects = indexedList[address];
2273
+ let foundWithdrawalObject = undefined;
2274
+ for (let i = 0; i < withdrawalObjects.length; i++) {
2275
+ const withdrawalObject = withdrawalObjects[i];
2276
+ if (withdrawalObject['chain'] === networkCode) {
2277
+ foundWithdrawalObject = withdrawalObject;
2278
+ break;
2279
+ }
2280
+ }
2281
+ if (foundWithdrawalObject === undefined) {
2282
+ throw new InvalidAddress(this.id + ' withdraw() can not find whitelisted withdrawal address for ' + address + ' with network ' + networkCode);
2283
+ }
2284
+ request['addressId'] = this.safeInteger(foundWithdrawalObject, 'id');
2285
+ const response = await this.v1PrivatePostAccountWithdraw(this.extend(request, params));
2286
+ //
2287
+ // response is a weird string like:
2288
+ //
2289
+ // "1234709779980\\n"
2290
+ //
2291
+ const responseString = response.replace('\n', '');
2292
+ const data = { 'id': responseString };
2293
+ return this.parseTransaction(data, currency);
2294
+ }
2295
+ /**
2296
+ * @method
2297
+ * @name arkham#fetchLeverageTiers
2298
+ * @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes
2299
+ * @see https://arkm.com/docs#get/public/margin-schedules
2300
+ * @param {string[]|undefined} symbols list of unified market symbols
2301
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2302
+ * @returns {object} a dictionary of [leverage tiers structures]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}, indexed by market symbols
2303
+ */
2304
+ async fetchLeverageTiers(symbols = undefined, params = {}) {
2305
+ await this.loadMarkets();
2306
+ if (symbols === undefined) {
2307
+ throw new ArgumentsRequired(this.id + ' fetchLeverageTiers() requires a symbols argument');
2308
+ }
2309
+ symbols = this.marketSymbols(symbols);
2310
+ const response = await this.v1PublicGetMarginSchedules(params);
2311
+ //
2312
+ // [
2313
+ // {
2314
+ // "name": "A",
2315
+ // "bands": [
2316
+ // {
2317
+ // "positionLimit": "1000000",
2318
+ // "leverageRate": "50",
2319
+ // "marginRate": "0.02",
2320
+ // "rebate": "0"
2321
+ // },
2322
+ // {
2323
+ // "positionLimit": "2000000",
2324
+ // "leverageRate": "25",
2325
+ // "marginRate": "0.04",
2326
+ // "rebate": "20000"
2327
+ // },
2328
+ // {
2329
+ // "positionLimit": "5000000",
2330
+ // "leverageRate": "20",
2331
+ // "marginRate": "0.05",
2332
+ // "rebate": "40000"
2333
+ // }
2334
+ // ]
2335
+ // },
2336
+ // {
2337
+ // "name": "B",
2338
+ // ...
2339
+ //
2340
+ return this.parseLeverageTiers(response, symbols);
2341
+ }
2342
+ parseLeverageTiers(response, symbols = undefined, marketIdKey = undefined) {
2343
+ // overloaded method
2344
+ const indexed = this.indexBy(response, 'name');
2345
+ symbols = this.marketSymbols(symbols);
2346
+ const tiers = {};
2347
+ for (let i = 0; i < symbols.length; i++) {
2348
+ const symbol = symbols[i];
2349
+ const market = this.market(symbol);
2350
+ const marginSchedule = this.safeString(market['info'], 'marginSchedule');
2351
+ if (marginSchedule === undefined) {
2352
+ throw new BadSymbol(this.id + ' fetchLeverageTiers() could not find marginSchedule for ' + symbol);
2353
+ }
2354
+ const selectedDict = this.safeDict(indexed, marginSchedule, {});
2355
+ const bands = this.safeList(selectedDict, 'bands', []);
2356
+ tiers[symbol] = this.parseMarketLeverageTiers(bands, market);
2357
+ }
2358
+ return tiers;
2359
+ }
2360
+ parseMarketLeverageTiers(info, market = undefined) {
2361
+ const tiers = [];
2362
+ const brackets = info;
2363
+ let minNotional = 0;
2364
+ for (let i = 0; i < brackets.length; i++) {
2365
+ const tier = brackets[i];
2366
+ const marketId = this.safeString(info, 'market');
2367
+ market = this.safeMarket(marketId, market, undefined, 'swap');
2368
+ const maxNotional = this.safeNumber(tier, 'positionLimit');
2369
+ tiers.push({
2370
+ 'tier': this.sum(i, 1),
2371
+ 'symbol': this.safeSymbol(marketId, market, undefined, 'swap'),
2372
+ 'currency': market['linear'] ? market['base'] : market['quote'],
2373
+ 'minNotional': minNotional,
2374
+ 'maxNotional': maxNotional,
2375
+ 'maintenanceMarginRate': this.safeNumber(tier, 'marginRate'),
2376
+ 'maxLeverage': this.safeInteger(tier, 'leverageRate'),
2377
+ 'info': tier,
2378
+ });
2379
+ minNotional = maxNotional;
2380
+ }
2381
+ return tiers;
2382
+ }
2383
+ findTimeframeByDuration(duration) {
2384
+ // this method is used to find the timeframe by duration in seconds
2385
+ const timeframes = this.safeDict(this.options, 'timeframeDurations', {});
2386
+ const keys = Object.keys(timeframes);
2387
+ for (let i = 0; i < keys.length; i++) {
2388
+ const timeframe = keys[i];
2389
+ const durationInMicroseconds = this.safeInteger(timeframes, timeframe);
2390
+ if (durationInMicroseconds === duration) {
2391
+ return timeframe;
2392
+ }
2393
+ }
2394
+ return undefined;
2395
+ }
2396
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
2397
+ const type = this.safeString(api, 0);
2398
+ const access = this.safeString(api, 1);
2399
+ const accessPart = (access === 'public') ? access + '/' : '';
2400
+ const query = this.omit(params, this.extractParams(path));
2401
+ path = this.implodeParams(path, params);
2402
+ let url = this.urls['api'][type] + '/' + accessPart + path;
2403
+ let queryString = '';
2404
+ if (method === 'GET') {
2405
+ if (Object.keys(query).length) {
2406
+ queryString = this.urlencode(query);
2407
+ url += '?' + queryString;
2408
+ }
2409
+ }
2410
+ if (access === 'private') {
2411
+ this.checkRequiredCredentials();
2412
+ const expires = (this.milliseconds() + this.safeInteger(this.options, 'requestExpiration', 5000)) * 1000; // need macroseconds
2413
+ if (method === 'POST') {
2414
+ body = this.json(params);
2415
+ }
2416
+ if (queryString !== '') {
2417
+ path = path + '?' + queryString;
2418
+ }
2419
+ const bodyStr = (body !== undefined) ? body : '';
2420
+ const payload = this.apiKey + expires.toString() + method.toUpperCase() + '/' + path + bodyStr;
2421
+ const decodedSecret = this.base64ToBinary(this.secret);
2422
+ const signature = this.hmac(this.encode(payload), decodedSecret, sha256, 'base64');
2423
+ headers = {
2424
+ 'Content-Type': 'application/json',
2425
+ 'Accept': 'application/json',
2426
+ 'Arkham-Api-Key': this.apiKey,
2427
+ 'Arkham-Expires': expires.toString(),
2428
+ 'Arkham-Signature': signature,
2429
+ 'Arkham-Broker-Id': '1001',
2430
+ };
2431
+ }
2432
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
2433
+ }
2434
+ handleErrors(code, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2435
+ //
2436
+ // error example:
2437
+ //
2438
+ // {
2439
+ // "id": "30005",
2440
+ // "name": "InvalidNotional",
2441
+ // "message": "order validation failed: invalid notional: notional 0.25 is less than min notional 1"
2442
+ // }
2443
+ //
2444
+ const message = this.safeString(response, 'message');
2445
+ if (message !== undefined) {
2446
+ const errorCode = this.safeString(response, 'id');
2447
+ const feedback = this.id + ' ' + body;
2448
+ this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
2449
+ this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
2450
+ this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
2451
+ throw new ExchangeError(this.id + ' ' + body);
2452
+ }
2453
+ return undefined;
2454
+ }
2455
+ }