ccxt-ir 4.10.0 → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1047) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +2 -2
  3. package/dist/cjs/ccxt.js +4 -1
  4. package/dist/cjs/src/abstract/bidarz.js +11 -0
  5. package/dist/cjs/src/bidarz.js +337 -0
  6. package/dist/cjs/src/bit24.js +4 -3
  7. package/js/ccxt.d.ts +5 -2
  8. package/js/ccxt.js +4 -2
  9. package/js/src/abstract/bidarz.d.ts +9 -0
  10. package/js/src/abstract/bidarz.js +11 -0
  11. package/js/src/bidarz.d.ts +22 -0
  12. package/js/src/bidarz.js +336 -0
  13. package/js/src/bit24.js +4 -3
  14. package/js/src/src/abantether.d.ts +21 -0
  15. package/js/src/src/abantether.js +353 -0
  16. package/js/src/src/abstract/abantether.d.ts +8 -0
  17. package/js/src/src/abstract/abantether.js +11 -0
  18. package/js/src/src/abstract/afratether.d.ts +9 -0
  19. package/js/src/src/abstract/afratether.js +11 -0
  20. package/js/src/src/abstract/alpaca.d.ts +77 -0
  21. package/js/src/src/abstract/alpaca.js +11 -0
  22. package/js/src/src/abstract/apex.d.ts +34 -0
  23. package/js/src/src/abstract/apex.js +11 -0
  24. package/js/src/src/abstract/arzinja.d.ts +8 -0
  25. package/js/src/src/abstract/arzinja.js +11 -0
  26. package/js/src/src/abstract/arzplus.d.ts +11 -0
  27. package/js/src/src/abstract/arzplus.js +11 -0
  28. package/js/src/src/abstract/ascendex.d.ts +80 -0
  29. package/js/src/src/abstract/ascendex.js +11 -0
  30. package/js/src/src/abstract/asretether.d.ts +8 -0
  31. package/js/src/src/abstract/asretether.js +11 -0
  32. package/js/src/src/abstract/bidarz.d.ts +9 -0
  33. package/js/src/src/abstract/bidarz.js +11 -0
  34. package/js/src/src/abstract/bigone.d.ts +48 -0
  35. package/js/src/src/abstract/bigone.js +11 -0
  36. package/js/src/src/abstract/binance.d.ts +773 -0
  37. package/js/src/src/abstract/binance.js +11 -0
  38. package/js/src/src/abstract/bingx.d.ts +165 -0
  39. package/js/src/src/abstract/bingx.js +11 -0
  40. package/js/src/src/abstract/bit24.d.ts +9 -0
  41. package/js/src/src/abstract/bit24.js +11 -0
  42. package/js/src/src/abstract/bit2c.d.ts +30 -0
  43. package/js/src/src/abstract/bit2c.js +11 -0
  44. package/js/src/src/abstract/bitbank.d.ts +35 -0
  45. package/js/src/src/abstract/bitbank.js +11 -0
  46. package/js/src/src/abstract/bitbarg.d.ts +8 -0
  47. package/js/src/src/abstract/bitbarg.js +11 -0
  48. package/js/src/src/abstract/bitbns.d.ts +43 -0
  49. package/js/src/src/abstract/bitbns.js +11 -0
  50. package/js/src/src/abstract/bitfinex.d.ts +143 -0
  51. package/js/src/src/abstract/bitfinex.js +11 -0
  52. package/js/src/src/abstract/bitflyer.d.ts +42 -0
  53. package/js/src/src/abstract/bitflyer.js +11 -0
  54. package/js/src/src/abstract/bitget.d.ts +578 -0
  55. package/js/src/src/abstract/bitget.js +11 -0
  56. package/js/src/src/abstract/bithumb.d.ts +35 -0
  57. package/js/src/src/abstract/bithumb.js +11 -0
  58. package/js/src/src/abstract/bitimen.d.ts +10 -0
  59. package/js/src/src/abstract/bitimen.js +11 -0
  60. package/js/src/src/abstract/bitir.d.ts +10 -0
  61. package/js/src/src/abstract/bitir.js +11 -0
  62. package/js/src/src/abstract/bitmart.d.ts +120 -0
  63. package/js/src/src/abstract/bitmart.js +11 -0
  64. package/js/src/src/abstract/bitmex.d.ts +100 -0
  65. package/js/src/src/abstract/bitmex.js +11 -0
  66. package/js/src/src/abstract/bitopro.d.ts +33 -0
  67. package/js/src/src/abstract/bitopro.js +11 -0
  68. package/js/src/src/abstract/bitpin.d.ts +11 -0
  69. package/js/src/src/abstract/bitpin.js +11 -0
  70. package/js/src/src/abstract/bitrue.d.ts +75 -0
  71. package/js/src/src/abstract/bitrue.js +11 -0
  72. package/js/src/src/abstract/bitso.d.ts +46 -0
  73. package/js/src/src/abstract/bitso.js +11 -0
  74. package/js/src/src/abstract/bitstamp.d.ts +262 -0
  75. package/js/src/src/abstract/bitstamp.js +11 -0
  76. package/js/src/src/abstract/bitteam.d.ts +32 -0
  77. package/js/src/src/abstract/bitteam.js +11 -0
  78. package/js/src/src/abstract/bittrade.d.ts +117 -0
  79. package/js/src/src/abstract/bittrade.js +11 -0
  80. package/js/src/src/abstract/bitunix.d.ts +9 -0
  81. package/js/src/src/abstract/bitunix.js +11 -0
  82. package/js/src/src/abstract/bitvavo.d.ts +30 -0
  83. package/js/src/src/abstract/bitvavo.js +11 -0
  84. package/js/src/src/abstract/blockchaincom.d.ts +31 -0
  85. package/js/src/src/abstract/blockchaincom.js +11 -0
  86. package/js/src/src/abstract/blofin.d.ts +70 -0
  87. package/js/src/src/abstract/blofin.js +11 -0
  88. package/js/src/src/abstract/btcalpha.d.ts +21 -0
  89. package/js/src/src/abstract/btcalpha.js +11 -0
  90. package/js/src/src/abstract/btcbox.d.ts +18 -0
  91. package/js/src/src/abstract/btcbox.js +11 -0
  92. package/js/src/src/abstract/btcmarkets.d.ts +42 -0
  93. package/js/src/src/abstract/btcmarkets.js +11 -0
  94. package/js/src/src/abstract/btcturk.d.ts +23 -0
  95. package/js/src/src/abstract/btcturk.js +11 -0
  96. package/js/src/src/abstract/bybit.d.ts +316 -0
  97. package/js/src/src/abstract/bybit.js +11 -0
  98. package/js/src/src/abstract/bydfi.d.ts +11 -0
  99. package/js/src/src/abstract/bydfi.js +11 -0
  100. package/js/src/src/abstract/cafearz.d.ts +8 -0
  101. package/js/src/src/abstract/cafearz.js +11 -0
  102. package/js/src/src/abstract/cex.d.ts +35 -0
  103. package/js/src/src/abstract/cex.js +11 -0
  104. package/js/src/src/abstract/coinbase.d.ts +97 -0
  105. package/js/src/src/abstract/coinbase.js +11 -0
  106. package/js/src/src/abstract/coinbaseexchange.d.ts +71 -0
  107. package/js/src/src/abstract/coinbaseexchange.js +11 -0
  108. package/js/src/src/abstract/coinbaseinternational.d.ts +42 -0
  109. package/js/src/src/abstract/coinbaseinternational.js +11 -0
  110. package/js/src/src/abstract/coincatch.d.ts +97 -0
  111. package/js/src/src/abstract/coincatch.js +11 -0
  112. package/js/src/src/abstract/coincheck.d.ts +36 -0
  113. package/js/src/src/abstract/coincheck.js +11 -0
  114. package/js/src/src/abstract/coinex.d.ts +240 -0
  115. package/js/src/src/abstract/coinex.js +11 -0
  116. package/js/src/src/abstract/coinmate.d.ts +65 -0
  117. package/js/src/src/abstract/coinmate.js +11 -0
  118. package/js/src/src/abstract/coinmetro.d.ts +37 -0
  119. package/js/src/src/abstract/coinmetro.js +11 -0
  120. package/js/src/src/abstract/coinone.d.ts +70 -0
  121. package/js/src/src/abstract/coinone.js +11 -0
  122. package/js/src/src/abstract/coinsph.d.ts +57 -0
  123. package/js/src/src/abstract/coinsph.js +11 -0
  124. package/js/src/src/abstract/coinspot.d.ts +31 -0
  125. package/js/src/src/abstract/coinspot.js +11 -0
  126. package/js/src/src/abstract/cryptocom.d.ts +126 -0
  127. package/js/src/src/abstract/cryptocom.js +11 -0
  128. package/js/src/src/abstract/cryptomus.d.ts +23 -0
  129. package/js/src/src/abstract/cryptomus.js +11 -0
  130. package/js/src/src/abstract/defx.d.ts +72 -0
  131. package/js/src/src/abstract/defx.js +11 -0
  132. package/js/src/src/abstract/delta.d.ts +53 -0
  133. package/js/src/src/abstract/delta.js +11 -0
  134. package/js/src/src/abstract/deribit.d.ts +129 -0
  135. package/js/src/src/abstract/deribit.js +11 -0
  136. package/js/src/src/abstract/derive.d.ts +120 -0
  137. package/js/src/src/abstract/derive.js +11 -0
  138. package/js/src/src/abstract/digifinex.d.ts +95 -0
  139. package/js/src/src/abstract/digifinex.js +11 -0
  140. package/js/src/src/abstract/ellipx.d.ts +28 -0
  141. package/js/src/src/abstract/ellipx.js +11 -0
  142. package/js/src/src/abstract/eterex.d.ts +8 -0
  143. package/js/src/src/abstract/eterex.js +11 -0
  144. package/js/src/src/abstract/excoino.d.ts +10 -0
  145. package/js/src/src/abstract/excoino.js +11 -0
  146. package/js/src/src/abstract/exir.d.ts +11 -0
  147. package/js/src/src/abstract/exir.js +11 -0
  148. package/js/src/src/abstract/exmo.d.ts +58 -0
  149. package/js/src/src/abstract/exmo.js +11 -0
  150. package/js/src/src/abstract/exnovin.d.ts +9 -0
  151. package/js/src/src/abstract/exnovin.js +11 -0
  152. package/js/src/src/abstract/farhadexchange.d.ts +8 -0
  153. package/js/src/src/abstract/farhadexchange.js +11 -0
  154. package/js/src/src/abstract/foxbit.d.ts +29 -0
  155. package/js/src/src/abstract/foxbit.js +11 -0
  156. package/js/src/src/abstract/gate.d.ts +287 -0
  157. package/js/src/src/abstract/gate.js +11 -0
  158. package/js/src/src/abstract/gemini.d.ts +62 -0
  159. package/js/src/src/abstract/gemini.js +11 -0
  160. package/js/src/src/abstract/hamtapay.d.ts +9 -0
  161. package/js/src/src/abstract/hamtapay.js +11 -0
  162. package/js/src/src/abstract/hashkey.d.ts +70 -0
  163. package/js/src/src/abstract/hashkey.js +11 -0
  164. package/js/src/src/abstract/hibachi.d.ts +29 -0
  165. package/js/src/src/abstract/hibachi.js +11 -0
  166. package/js/src/src/abstract/hitbtc.d.ts +118 -0
  167. package/js/src/src/abstract/hitbtc.js +11 -0
  168. package/js/src/src/abstract/hitobit.d.ts +11 -0
  169. package/js/src/src/abstract/hitobit.js +11 -0
  170. package/js/src/src/abstract/hollaex.d.ts +36 -0
  171. package/js/src/src/abstract/hollaex.js +11 -0
  172. package/js/src/src/abstract/htx.d.ts +551 -0
  173. package/js/src/src/abstract/htx.js +11 -0
  174. package/js/src/src/abstract/hyperliquid.d.ts +9 -0
  175. package/js/src/src/abstract/hyperliquid.js +11 -0
  176. package/js/src/src/abstract/independentreserve.d.ts +46 -0
  177. package/js/src/src/abstract/independentreserve.js +11 -0
  178. package/js/src/src/abstract/indodax.d.ts +29 -0
  179. package/js/src/src/abstract/indodax.js +11 -0
  180. package/js/src/src/abstract/iranexchange.d.ts +9 -0
  181. package/js/src/src/abstract/iranexchange.js +11 -0
  182. package/js/src/src/abstract/jibitex.d.ts +10 -0
  183. package/js/src/src/abstract/jibitex.js +11 -0
  184. package/js/src/src/abstract/kcex.d.ts +10 -0
  185. package/js/src/src/abstract/kcex.js +11 -0
  186. package/js/src/src/abstract/kifpoolme.d.ts +9 -0
  187. package/js/src/src/abstract/kifpoolme.js +11 -0
  188. package/js/src/src/abstract/kraken.d.ts +61 -0
  189. package/js/src/src/abstract/kraken.js +11 -0
  190. package/js/src/src/abstract/krakenfutures.d.ts +45 -0
  191. package/js/src/src/abstract/krakenfutures.js +11 -0
  192. package/js/src/src/abstract/kucoin.d.ts +227 -0
  193. package/js/src/src/abstract/kucoin.js +11 -0
  194. package/js/src/src/abstract/kucoinfutures.d.ts +254 -0
  195. package/js/src/src/abstract/kucoinfutures.js +11 -0
  196. package/js/src/src/abstract/latoken.d.ts +59 -0
  197. package/js/src/src/abstract/latoken.js +11 -0
  198. package/js/src/src/abstract/lbank.d.ts +65 -0
  199. package/js/src/src/abstract/lbank.js +11 -0
  200. package/js/src/src/abstract/luno.d.ts +41 -0
  201. package/js/src/src/abstract/luno.js +11 -0
  202. package/js/src/src/abstract/mazdax.d.ts +11 -0
  203. package/js/src/src/abstract/mazdax.js +11 -0
  204. package/js/src/src/abstract/mercado.d.ts +28 -0
  205. package/js/src/src/abstract/mercado.js +11 -0
  206. package/js/src/src/abstract/mexc.d.ts +183 -0
  207. package/js/src/src/abstract/mexc.js +11 -0
  208. package/js/src/src/abstract/modetrade.d.ts +122 -0
  209. package/js/src/src/abstract/modetrade.js +11 -0
  210. package/js/src/src/abstract/ndax.d.ts +100 -0
  211. package/js/src/src/abstract/ndax.js +11 -0
  212. package/js/src/src/abstract/nobitex.d.ts +10 -0
  213. package/js/src/src/abstract/nobitex.js +11 -0
  214. package/js/src/src/abstract/novadax.d.ts +32 -0
  215. package/js/src/src/abstract/novadax.js +11 -0
  216. package/js/src/src/abstract/oceanex.d.ts +30 -0
  217. package/js/src/src/abstract/oceanex.js +11 -0
  218. package/js/src/src/abstract/okcoin.d.ts +77 -0
  219. package/js/src/src/abstract/okcoin.js +11 -0
  220. package/js/src/src/abstract/okexchange.d.ts +11 -0
  221. package/js/src/src/abstract/okexchange.js +11 -0
  222. package/js/src/src/abstract/okx.d.ts +352 -0
  223. package/js/src/src/abstract/okx.js +11 -0
  224. package/js/src/src/abstract/ompfinex.d.ts +10 -0
  225. package/js/src/src/abstract/ompfinex.js +11 -0
  226. package/js/src/src/abstract/onetrading.d.ts +26 -0
  227. package/js/src/src/abstract/onetrading.js +11 -0
  228. package/js/src/src/abstract/oxfun.d.ts +37 -0
  229. package/js/src/src/abstract/oxfun.js +11 -0
  230. package/js/src/src/abstract/p2b.d.ts +25 -0
  231. package/js/src/src/abstract/p2b.js +11 -0
  232. package/js/src/src/abstract/paradex.d.ts +66 -0
  233. package/js/src/src/abstract/paradex.js +11 -0
  234. package/js/src/src/abstract/paymium.d.ts +31 -0
  235. package/js/src/src/abstract/paymium.js +11 -0
  236. package/js/src/src/abstract/phemex.d.ts +120 -0
  237. package/js/src/src/abstract/phemex.js +11 -0
  238. package/js/src/src/abstract/pingi.d.ts +9 -0
  239. package/js/src/src/abstract/pingi.js +11 -0
  240. package/js/src/src/abstract/poloniex.d.ts +108 -0
  241. package/js/src/src/abstract/poloniex.js +11 -0
  242. package/js/src/src/abstract/pooleno.d.ts +8 -0
  243. package/js/src/src/abstract/pooleno.js +11 -0
  244. package/js/src/src/abstract/probit.d.ts +26 -0
  245. package/js/src/src/abstract/probit.js +11 -0
  246. package/js/src/src/abstract/raastin.d.ts +11 -0
  247. package/js/src/src/abstract/raastin.js +11 -0
  248. package/js/src/src/abstract/ramzinex.d.ts +10 -0
  249. package/js/src/src/abstract/ramzinex.js +11 -0
  250. package/js/src/src/abstract/sarmayex.d.ts +8 -0
  251. package/js/src/src/abstract/sarmayex.js +11 -0
  252. package/js/src/src/abstract/sarrafex.d.ts +10 -0
  253. package/js/src/src/abstract/sarrafex.js +11 -0
  254. package/js/src/src/abstract/tabdeal.d.ts +10 -0
  255. package/js/src/src/abstract/tabdeal.js +11 -0
  256. package/js/src/src/abstract/tehran_exchange.d.ts +9 -0
  257. package/js/src/src/abstract/tehran_exchange.js +11 -0
  258. package/js/src/src/abstract/tetherland.d.ts +8 -0
  259. package/js/src/src/abstract/tetherland.js +11 -0
  260. package/js/src/src/abstract/timex.d.ts +65 -0
  261. package/js/src/src/abstract/timex.js +11 -0
  262. package/js/src/src/abstract/tokocrypto.d.ts +40 -0
  263. package/js/src/src/abstract/tokocrypto.js +11 -0
  264. package/js/src/src/abstract/toobit.d.ts +10 -0
  265. package/js/src/src/abstract/toobit.js +11 -0
  266. package/js/src/src/abstract/tradeogre.d.ts +21 -0
  267. package/js/src/src/abstract/tradeogre.js +11 -0
  268. package/js/src/src/abstract/twox.d.ts +8 -0
  269. package/js/src/src/abstract/twox.js +11 -0
  270. package/js/src/src/abstract/ubitex.d.ts +10 -0
  271. package/js/src/src/abstract/ubitex.js +11 -0
  272. package/js/src/src/abstract/upbit.d.ts +58 -0
  273. package/js/src/src/abstract/upbit.js +11 -0
  274. package/js/src/src/abstract/vertex.d.ts +22 -0
  275. package/js/src/src/abstract/vertex.js +11 -0
  276. package/js/src/src/abstract/wallex.d.ts +11 -0
  277. package/js/src/src/abstract/wallex.js +11 -0
  278. package/js/src/src/abstract/wavesexchange.d.ts +157 -0
  279. package/js/src/src/abstract/wavesexchange.js +11 -0
  280. package/js/src/src/abstract/whitebit.d.ts +117 -0
  281. package/js/src/src/abstract/whitebit.js +11 -0
  282. package/js/src/src/abstract/woo.d.ts +144 -0
  283. package/js/src/src/abstract/woo.js +11 -0
  284. package/js/src/src/abstract/woofipro.d.ts +122 -0
  285. package/js/src/src/abstract/woofipro.js +11 -0
  286. package/js/src/src/abstract/xt.d.ts +160 -0
  287. package/js/src/src/abstract/xt.js +11 -0
  288. package/js/src/src/abstract/yobit.d.ts +19 -0
  289. package/js/src/src/abstract/yobit.js +11 -0
  290. package/js/src/src/abstract/zaif.d.ts +41 -0
  291. package/js/src/src/abstract/zaif.js +11 -0
  292. package/js/src/src/abstract/zonda.d.ts +56 -0
  293. package/js/src/src/abstract/zonda.js +11 -0
  294. package/js/src/src/afratether.d.ts +21 -0
  295. package/js/src/src/afratether.js +356 -0
  296. package/js/src/src/alpaca.d.ts +332 -0
  297. package/js/src/src/alpaca.js +1908 -0
  298. package/js/src/src/apex.d.ts +333 -0
  299. package/js/src/src/apex.js +1942 -0
  300. package/js/src/src/arzinja.d.ts +21 -0
  301. package/js/src/src/arzinja.js +298 -0
  302. package/js/src/src/arzplus.d.ts +26 -0
  303. package/js/src/src/arzplus.js +581 -0
  304. package/js/src/src/ascendex.d.ts +424 -0
  305. package/js/src/src/ascendex.js +3699 -0
  306. package/js/src/src/asretether.d.ts +21 -0
  307. package/js/src/src/asretether.js +324 -0
  308. package/js/src/src/base/Exchange.d.ts +926 -0
  309. package/js/src/src/base/Exchange.js +7399 -0
  310. package/js/src/src/base/Precise.d.ts +42 -0
  311. package/js/src/src/base/Precise.js +275 -0
  312. package/js/src/src/base/errors.d.ts +168 -0
  313. package/js/src/src/base/errors.js +255 -0
  314. package/js/src/src/base/functions/crypto.d.ts +16 -0
  315. package/js/src/src/base/functions/crypto.js +131 -0
  316. package/js/src/src/base/functions/encode.d.ts +4 -0
  317. package/js/src/src/base/functions/encode.js +32 -0
  318. package/js/src/src/base/functions/generic.d.ts +29 -0
  319. package/js/src/src/base/functions/generic.js +203 -0
  320. package/js/src/src/base/functions/misc.d.ts +9 -0
  321. package/js/src/src/base/functions/misc.js +101 -0
  322. package/js/src/src/base/functions/number.d.ts +27 -0
  323. package/js/src/src/base/functions/number.js +313 -0
  324. package/js/src/src/base/functions/platform.d.ts +7 -0
  325. package/js/src/src/base/functions/platform.js +27 -0
  326. package/js/src/src/base/functions/rsa.d.ts +5 -0
  327. package/js/src/src/base/functions/rsa.js +49 -0
  328. package/js/src/src/base/functions/string.d.ts +7 -0
  329. package/js/src/src/base/functions/string.js +44 -0
  330. package/js/src/src/base/functions/throttle.d.ts +6 -0
  331. package/js/src/src/base/functions/throttle.js +67 -0
  332. package/js/src/src/base/functions/time.d.ts +21 -0
  333. package/js/src/src/base/functions/time.js +171 -0
  334. package/js/src/src/base/functions/totp.d.ts +3 -0
  335. package/js/src/src/base/functions/totp.js +25 -0
  336. package/js/src/src/base/functions/type.d.ts +37 -0
  337. package/js/src/src/base/functions/type.js +179 -0
  338. package/js/src/src/base/functions.d.ts +10 -0
  339. package/js/src/src/base/functions.js +18 -0
  340. package/js/src/src/base/types.d.ts +586 -0
  341. package/js/src/src/base/types.js +7 -0
  342. package/js/src/src/base/ws/Cache.d.ts +27 -0
  343. package/js/src/src/base/ws/Cache.js +260 -0
  344. package/js/src/src/base/ws/Client.d.ts +53 -0
  345. package/js/src/src/base/ws/Client.js +307 -0
  346. package/js/src/src/base/ws/Future.d.ts +8 -0
  347. package/js/src/src/base/ws/Future.js +35 -0
  348. package/js/src/src/base/ws/OrderBook.d.ts +25 -0
  349. package/js/src/src/base/ws/OrderBook.js +130 -0
  350. package/js/src/src/base/ws/OrderBookSide.d.ts +40 -0
  351. package/js/src/src/base/ws/OrderBookSide.js +286 -0
  352. package/js/src/src/base/ws/WsClient.d.ts +11 -0
  353. package/js/src/src/base/ws/WsClient.js +69 -0
  354. package/js/src/src/bequant.d.ts +4 -0
  355. package/js/src/src/bequant.js +35 -0
  356. package/js/src/src/bidarz.d.ts +16 -0
  357. package/js/src/src/bidarz.js +327 -0
  358. package/js/src/src/bigone.d.ts +296 -0
  359. package/js/src/src/bigone.js +2340 -0
  360. package/js/src/src/binance.d.ts +1667 -0
  361. package/js/src/src/binance.js +14400 -0
  362. package/js/src/src/binancecoinm.d.ts +6 -0
  363. package/js/src/src/binancecoinm.js +51 -0
  364. package/js/src/src/binanceus.d.ts +4 -0
  365. package/js/src/src/binanceus.js +225 -0
  366. package/js/src/src/binanceusdm.d.ts +6 -0
  367. package/js/src/src/binanceusdm.js +63 -0
  368. package/js/src/src/bingx.d.ts +778 -0
  369. package/js/src/src/bingx.js +6705 -0
  370. package/js/src/src/bit24.d.ts +24 -0
  371. package/js/src/src/bit24.js +520 -0
  372. package/js/src/src/bit2c.d.ts +146 -0
  373. package/js/src/src/bit2c.js +1029 -0
  374. package/js/src/src/bitbank.d.ts +181 -0
  375. package/js/src/src/bitbank.js +1146 -0
  376. package/js/src/src/bitbarg.d.ts +21 -0
  377. package/js/src/src/bitbarg.js +312 -0
  378. package/js/src/src/bitbns.d.ts +184 -0
  379. package/js/src/src/bitbns.js +1288 -0
  380. package/js/src/src/bitfinex.d.ts +516 -0
  381. package/js/src/src/bitfinex.js +3951 -0
  382. package/js/src/src/bitflyer.d.ts +229 -0
  383. package/js/src/src/bitflyer.js +1209 -0
  384. package/js/src/src/bitget.d.ts +1109 -0
  385. package/js/src/src/bitget.js +11033 -0
  386. package/js/src/src/bithumb.d.ts +165 -0
  387. package/js/src/src/bithumb.js +1257 -0
  388. package/js/src/src/bitimen.d.ts +23 -0
  389. package/js/src/src/bitimen.js +424 -0
  390. package/js/src/src/bitir.d.ts +23 -0
  391. package/js/src/src/bitir.js +521 -0
  392. package/js/src/src/bitmart.d.ts +736 -0
  393. package/js/src/src/bitmart.js +5639 -0
  394. package/js/src/src/bitmex.d.ts +395 -0
  395. package/js/src/src/bitmex.js +3088 -0
  396. package/js/src/src/bitopro.d.ts +295 -0
  397. package/js/src/src/bitopro.js +1892 -0
  398. package/js/src/src/bitpin.d.ts +23 -0
  399. package/js/src/src/bitpin.js +487 -0
  400. package/js/src/src/bitrue.d.ts +384 -0
  401. package/js/src/src/bitrue.js +3382 -0
  402. package/js/src/src/bitso.d.ts +270 -0
  403. package/js/src/src/bitso.js +1881 -0
  404. package/js/src/src/bitstamp.d.ts +355 -0
  405. package/js/src/src/bitstamp.js +2445 -0
  406. package/js/src/src/bitteam.d.ts +229 -0
  407. package/js/src/src/bitteam.js +2420 -0
  408. package/js/src/src/bittrade.d.ts +298 -0
  409. package/js/src/src/bittrade.js +2050 -0
  410. package/js/src/src/bitunix.d.ts +21 -0
  411. package/js/src/src/bitunix.js +326 -0
  412. package/js/src/src/bitvavo.d.ts +311 -0
  413. package/js/src/src/bitvavo.js +2204 -0
  414. package/js/src/src/blockchaincom.d.ts +256 -0
  415. package/js/src/src/blockchaincom.js +1259 -0
  416. package/js/src/src/blofin.d.ts +439 -0
  417. package/js/src/src/blofin.js +2576 -0
  418. package/js/src/src/btcalpha.d.ts +209 -0
  419. package/js/src/src/btcalpha.js +1056 -0
  420. package/js/src/src/btcbox.d.ts +144 -0
  421. package/js/src/src/btcbox.js +834 -0
  422. package/js/src/src/btcmarkets.d.ts +253 -0
  423. package/js/src/src/btcmarkets.js +1418 -0
  424. package/js/src/src/btcturk.d.ts +161 -0
  425. package/js/src/src/btcturk.js +1058 -0
  426. package/js/src/src/bybit.d.ts +1097 -0
  427. package/js/src/src/bybit.js +9382 -0
  428. package/js/src/src/bydfi.d.ts +23 -0
  429. package/js/src/src/bydfi.js +434 -0
  430. package/js/src/src/cafearz.d.ts +21 -0
  431. package/js/src/src/cafearz.js +346 -0
  432. package/js/src/src/cex.d.ts +286 -0
  433. package/js/src/src/cex.js +1799 -0
  434. package/js/src/src/coinbase.d.ts +623 -0
  435. package/js/src/src/coinbase.js +5220 -0
  436. package/js/src/src/coinbaseadvanced.d.ts +4 -0
  437. package/js/src/src/coinbaseadvanced.js +18 -0
  438. package/js/src/src/coinbaseexchange.d.ts +334 -0
  439. package/js/src/src/coinbaseexchange.js +2127 -0
  440. package/js/src/src/coinbaseinternational.d.ts +443 -0
  441. package/js/src/src/coinbaseinternational.js +2336 -0
  442. package/js/src/src/coincatch.d.ts +786 -0
  443. package/js/src/src/coincatch.js +5492 -0
  444. package/js/src/src/coincheck.d.ts +147 -0
  445. package/js/src/src/coincheck.js +962 -0
  446. package/js/src/src/coinex.d.ts +719 -0
  447. package/js/src/src/coinex.js +6166 -0
  448. package/js/src/src/coinmate.d.ts +202 -0
  449. package/js/src/src/coinmate.js +1215 -0
  450. package/js/src/src/coinmetro.d.ts +244 -0
  451. package/js/src/src/coinmetro.js +2024 -0
  452. package/js/src/src/coinone.d.ts +158 -0
  453. package/js/src/src/coinone.js +1278 -0
  454. package/js/src/src/coinsph.d.ts +310 -0
  455. package/js/src/src/coinsph.js +2203 -0
  456. package/js/src/src/coinspot.d.ts +108 -0
  457. package/js/src/src/coinspot.js +653 -0
  458. package/js/src/src/cryptocom.d.ts +463 -0
  459. package/js/src/src/cryptocom.js +3549 -0
  460. package/js/src/src/cryptomus.d.ts +158 -0
  461. package/js/src/src/cryptomus.js +1169 -0
  462. package/js/src/src/defx.d.ts +348 -0
  463. package/js/src/src/defx.js +2139 -0
  464. package/js/src/src/delta.d.ts +407 -0
  465. package/js/src/src/delta.js +3654 -0
  466. package/js/src/src/deribit.d.ts +516 -0
  467. package/js/src/src/deribit.js +3790 -0
  468. package/js/src/src/derive.d.ts +324 -0
  469. package/js/src/src/derive.js +2655 -0
  470. package/js/src/src/digifinex.d.ts +544 -0
  471. package/js/src/src/digifinex.js +4453 -0
  472. package/js/src/src/ellipx.d.ts +237 -0
  473. package/js/src/src/ellipx.js +2071 -0
  474. package/js/src/src/eterex.d.ts +21 -0
  475. package/js/src/src/eterex.js +299 -0
  476. package/js/src/src/excoino.d.ts +23 -0
  477. package/js/src/src/excoino.js +426 -0
  478. package/js/src/src/exir.d.ts +23 -0
  479. package/js/src/src/exir.js +403 -0
  480. package/js/src/src/exmo.d.ts +426 -0
  481. package/js/src/src/exmo.js +2825 -0
  482. package/js/src/src/exnovin.d.ts +22 -0
  483. package/js/src/src/exnovin.js +378 -0
  484. package/js/src/src/farhadexchange.d.ts +21 -0
  485. package/js/src/src/farhadexchange.js +280 -0
  486. package/js/src/src/fmfwio.d.ts +4 -0
  487. package/js/src/src/fmfwio.js +35 -0
  488. package/js/src/src/foxbit.d.ts +352 -0
  489. package/js/src/src/foxbit.js +2016 -0
  490. package/js/src/src/gate.d.ts +1071 -0
  491. package/js/src/src/gate.js +8282 -0
  492. package/js/src/src/gateio.d.ts +4 -0
  493. package/js/src/src/gateio.js +17 -0
  494. package/js/src/src/gemini.d.ts +257 -0
  495. package/js/src/src/gemini.js +2006 -0
  496. package/js/src/src/hamtapay.d.ts +21 -0
  497. package/js/src/src/hamtapay.js +303 -0
  498. package/js/src/src/hashkey.d.ts +628 -0
  499. package/js/src/src/hashkey.js +4363 -0
  500. package/js/src/src/hibachi.d.ts +346 -0
  501. package/js/src/src/hibachi.js +2137 -0
  502. package/js/src/src/hitbtc.d.ts +558 -0
  503. package/js/src/src/hitbtc.js +3847 -0
  504. package/js/src/src/hitobit.d.ts +23 -0
  505. package/js/src/src/hitobit.js +412 -0
  506. package/js/src/src/hollaex.d.ts +305 -0
  507. package/js/src/src/hollaex.js +2046 -0
  508. package/js/src/src/htx.d.ts +961 -0
  509. package/js/src/src/htx.js +9668 -0
  510. package/js/src/src/huobi.d.ts +4 -0
  511. package/js/src/src/huobi.js +17 -0
  512. package/js/src/src/hyperliquid.d.ts +651 -0
  513. package/js/src/src/hyperliquid.js +3937 -0
  514. package/js/src/src/independentreserve.d.ts +169 -0
  515. package/js/src/src/independentreserve.js +1115 -0
  516. package/js/src/src/indodax.d.ts +217 -0
  517. package/js/src/src/indodax.js +1454 -0
  518. package/js/src/src/iranexchange.d.ts +21 -0
  519. package/js/src/src/iranexchange.js +399 -0
  520. package/js/src/src/jibitex.d.ts +23 -0
  521. package/js/src/src/jibitex.js +416 -0
  522. package/js/src/src/kcex.d.ts +21 -0
  523. package/js/src/src/kcex.js +335 -0
  524. package/js/src/src/kifpoolme.d.ts +23 -0
  525. package/js/src/src/kifpoolme.js +410 -0
  526. package/js/src/src/kraken.d.ts +484 -0
  527. package/js/src/src/kraken.js +3518 -0
  528. package/js/src/src/krakenfutures.d.ts +362 -0
  529. package/js/src/src/krakenfutures.js +2885 -0
  530. package/js/src/src/kucoin.d.ts +759 -0
  531. package/js/src/src/kucoin.js +5153 -0
  532. package/js/src/src/kucoinfutures.d.ts +521 -0
  533. package/js/src/src/kucoinfutures.js +3381 -0
  534. package/js/src/src/latoken.d.ts +274 -0
  535. package/js/src/src/latoken.js +1824 -0
  536. package/js/src/src/lbank.d.ts +350 -0
  537. package/js/src/src/lbank.js +3146 -0
  538. package/js/src/src/luno.d.ts +252 -0
  539. package/js/src/src/luno.js +1479 -0
  540. package/js/src/src/mazdax.d.ts +23 -0
  541. package/js/src/src/mazdax.js +534 -0
  542. package/js/src/src/mercado.d.ts +160 -0
  543. package/js/src/src/mercado.js +1011 -0
  544. package/js/src/src/mexc.d.ts +768 -0
  545. package/js/src/src/mexc.js +6102 -0
  546. package/js/src/src/modetrade.d.ts +496 -0
  547. package/js/src/src/modetrade.js +2936 -0
  548. package/js/src/src/myokx.d.ts +4 -0
  549. package/js/src/src/myokx.js +54 -0
  550. package/js/src/src/ndax.d.ts +285 -0
  551. package/js/src/src/ndax.js +2598 -0
  552. package/js/src/src/nobitex.d.ts +23 -0
  553. package/js/src/src/nobitex.js +454 -0
  554. package/js/src/src/novadax.d.ts +279 -0
  555. package/js/src/src/novadax.js +1676 -0
  556. package/js/src/src/oceanex.d.ts +231 -0
  557. package/js/src/src/oceanex.js +1123 -0
  558. package/js/src/src/okcoin.d.ts +346 -0
  559. package/js/src/src/okcoin.js +3211 -0
  560. package/js/src/src/okexchange.d.ts +23 -0
  561. package/js/src/src/okexchange.js +373 -0
  562. package/js/src/src/okx.d.ts +1125 -0
  563. package/js/src/src/okx.js +9009 -0
  564. package/js/src/src/okxus.d.ts +4 -0
  565. package/js/src/src/okxus.js +54 -0
  566. package/js/src/src/ompfinex.d.ts +23 -0
  567. package/js/src/src/ompfinex.js +510 -0
  568. package/js/src/src/onetrading.d.ts +228 -0
  569. package/js/src/src/onetrading.js +1769 -0
  570. package/js/src/src/oxfun.d.ts +442 -0
  571. package/js/src/src/oxfun.js +2920 -0
  572. package/js/src/src/p2b.d.ts +189 -0
  573. package/js/src/src/p2b.js +1344 -0
  574. package/js/src/src/paradex.d.ts +389 -0
  575. package/js/src/src/paradex.js +2607 -0
  576. package/js/src/src/paymium.d.ts +133 -0
  577. package/js/src/src/paymium.js +644 -0
  578. package/js/src/src/phemex.d.ts +497 -0
  579. package/js/src/src/phemex.js +5333 -0
  580. package/js/src/src/pingi.d.ts +22 -0
  581. package/js/src/src/pingi.js +446 -0
  582. package/js/src/src/poloniex.d.ts +441 -0
  583. package/js/src/src/poloniex.js +3681 -0
  584. package/js/src/src/pooleno.d.ts +21 -0
  585. package/js/src/src/pooleno.js +347 -0
  586. package/js/src/src/pro/alpaca.d.ts +95 -0
  587. package/js/src/src/pro/alpaca.js +724 -0
  588. package/js/src/src/pro/apex.d.ts +160 -0
  589. package/js/src/src/pro/apex.js +1044 -0
  590. package/js/src/src/pro/ascendex.d.ts +99 -0
  591. package/js/src/src/pro/ascendex.js +1012 -0
  592. package/js/src/src/pro/bequant.d.ts +4 -0
  593. package/js/src/src/pro/bequant.js +42 -0
  594. package/js/src/src/pro/binance.d.ts +796 -0
  595. package/js/src/src/pro/binance.js +4373 -0
  596. package/js/src/src/pro/binancecoinm.d.ts +4 -0
  597. package/js/src/src/pro/binancecoinm.js +32 -0
  598. package/js/src/src/pro/binanceus.d.ts +4 -0
  599. package/js/src/src/pro/binanceus.js +52 -0
  600. package/js/src/src/pro/binanceusdm.d.ts +4 -0
  601. package/js/src/src/pro/binanceusdm.js +37 -0
  602. package/js/src/src/pro/bingx.d.ts +151 -0
  603. package/js/src/src/pro/bingx.js +1568 -0
  604. package/js/src/src/pro/bitfinex.d.ts +99 -0
  605. package/js/src/src/pro/bitfinex.js +1165 -0
  606. package/js/src/src/pro/bitget.d.ts +257 -0
  607. package/js/src/src/pro/bitget.js +2327 -0
  608. package/js/src/src/pro/bithumb.d.ts +59 -0
  609. package/js/src/src/pro/bithumb.js +395 -0
  610. package/js/src/src/pro/bitmart.d.ts +168 -0
  611. package/js/src/src/pro/bitmart.js +1686 -0
  612. package/js/src/src/pro/bitmex.d.ts +170 -0
  613. package/js/src/src/pro/bitmex.js +1760 -0
  614. package/js/src/src/pro/bitopro.d.ts +69 -0
  615. package/js/src/src/pro/bitopro.js +477 -0
  616. package/js/src/src/pro/bitrue.d.ts +40 -0
  617. package/js/src/src/pro/bitrue.js +461 -0
  618. package/js/src/src/pro/bitstamp.d.ts +53 -0
  619. package/js/src/src/pro/bitstamp.js +587 -0
  620. package/js/src/src/pro/bittrade.d.ts +66 -0
  621. package/js/src/src/pro/bittrade.js +606 -0
  622. package/js/src/src/pro/bitvavo.d.ts +321 -0
  623. package/js/src/src/pro/bitvavo.js +1451 -0
  624. package/js/src/src/pro/blockchaincom.d.ts +89 -0
  625. package/js/src/src/pro/blockchaincom.js +777 -0
  626. package/js/src/src/pro/blofin.d.ts +174 -0
  627. package/js/src/src/pro/blofin.js +743 -0
  628. package/js/src/src/pro/bybit.d.ts +397 -0
  629. package/js/src/src/pro/bybit.js +2519 -0
  630. package/js/src/src/pro/cex.d.ts +220 -0
  631. package/js/src/src/pro/cex.js +1535 -0
  632. package/js/src/src/pro/coinbase.d.ts +119 -0
  633. package/js/src/src/pro/coinbase.js +736 -0
  634. package/js/src/src/pro/coinbaseadvanced.d.ts +4 -0
  635. package/js/src/src/pro/coinbaseadvanced.js +18 -0
  636. package/js/src/src/pro/coinbaseexchange.d.ts +133 -0
  637. package/js/src/src/pro/coinbaseexchange.js +969 -0
  638. package/js/src/src/pro/coinbaseinternational.d.ts +143 -0
  639. package/js/src/src/pro/coinbaseinternational.js +804 -0
  640. package/js/src/src/pro/coincatch.d.ts +207 -0
  641. package/js/src/src/pro/coincatch.js +1562 -0
  642. package/js/src/src/pro/coincheck.d.ts +33 -0
  643. package/js/src/src/pro/coincheck.js +210 -0
  644. package/js/src/src/pro/coinex.d.ts +147 -0
  645. package/js/src/src/pro/coinex.js +1426 -0
  646. package/js/src/src/pro/coinone.d.ts +51 -0
  647. package/js/src/src/pro/coinone.js +413 -0
  648. package/js/src/src/pro/cryptocom.d.ts +300 -0
  649. package/js/src/src/pro/cryptocom.js +1414 -0
  650. package/js/src/src/pro/defx.d.ts +236 -0
  651. package/js/src/src/pro/defx.js +865 -0
  652. package/js/src/src/pro/deribit.d.ts +163 -0
  653. package/js/src/src/pro/deribit.js +1066 -0
  654. package/js/src/src/pro/derive.d.ts +100 -0
  655. package/js/src/src/pro/derive.js +753 -0
  656. package/js/src/src/pro/exmo.d.ts +97 -0
  657. package/js/src/src/pro/exmo.js +903 -0
  658. package/js/src/src/pro/gate.d.ts +360 -0
  659. package/js/src/src/pro/gate.js +2119 -0
  660. package/js/src/src/pro/gateio.d.ts +4 -0
  661. package/js/src/src/pro/gateio.js +17 -0
  662. package/js/src/src/pro/gemini.d.ts +106 -0
  663. package/js/src/src/pro/gemini.js +932 -0
  664. package/js/src/src/pro/hashkey.d.ts +121 -0
  665. package/js/src/src/pro/hashkey.js +843 -0
  666. package/js/src/src/pro/hitbtc.d.ts +235 -0
  667. package/js/src/src/pro/hitbtc.js +1400 -0
  668. package/js/src/src/pro/hollaex.d.ts +77 -0
  669. package/js/src/src/pro/hollaex.js +604 -0
  670. package/js/src/src/pro/htx.d.ts +141 -0
  671. package/js/src/src/pro/htx.js +2415 -0
  672. package/js/src/src/pro/huobi.d.ts +4 -0
  673. package/js/src/src/pro/huobi.js +17 -0
  674. package/js/src/src/pro/hyperliquid.d.ts +218 -0
  675. package/js/src/src/pro/hyperliquid.js +1126 -0
  676. package/js/src/src/pro/independentreserve.d.ts +36 -0
  677. package/js/src/src/pro/independentreserve.js +287 -0
  678. package/js/src/src/pro/kraken.d.ts +233 -0
  679. package/js/src/src/pro/kraken.js +1785 -0
  680. package/js/src/src/pro/krakenfutures.d.ts +178 -0
  681. package/js/src/src/pro/krakenfutures.js +1592 -0
  682. package/js/src/src/pro/kucoin.d.ts +221 -0
  683. package/js/src/src/pro/kucoin.js +1430 -0
  684. package/js/src/src/pro/kucoinfutures.d.ts +205 -0
  685. package/js/src/src/pro/kucoinfutures.js +1295 -0
  686. package/js/src/src/pro/lbank.d.ts +134 -0
  687. package/js/src/src/pro/lbank.js +950 -0
  688. package/js/src/src/pro/luno.d.ts +44 -0
  689. package/js/src/src/pro/luno.js +322 -0
  690. package/js/src/src/pro/mexc.d.ts +210 -0
  691. package/js/src/src/pro/mexc.js +2009 -0
  692. package/js/src/src/pro/modetrade.d.ts +155 -0
  693. package/js/src/src/pro/modetrade.js +1335 -0
  694. package/js/src/src/pro/myokx.d.ts +4 -0
  695. package/js/src/src/pro/myokx.js +39 -0
  696. package/js/src/src/pro/ndax.d.ts +60 -0
  697. package/js/src/src/pro/ndax.js +545 -0
  698. package/js/src/src/pro/okcoin.d.ts +91 -0
  699. package/js/src/src/pro/okcoin.js +763 -0
  700. package/js/src/src/pro/okx.d.ts +408 -0
  701. package/js/src/src/pro/okx.js +2479 -0
  702. package/js/src/src/pro/okxus.d.ts +4 -0
  703. package/js/src/src/pro/okxus.js +39 -0
  704. package/js/src/src/pro/onetrading.d.ts +107 -0
  705. package/js/src/src/pro/onetrading.js +1343 -0
  706. package/js/src/src/pro/oxfun.d.ts +234 -0
  707. package/js/src/src/pro/oxfun.js +1112 -0
  708. package/js/src/src/pro/p2b.d.ts +104 -0
  709. package/js/src/src/pro/p2b.js +506 -0
  710. package/js/src/src/pro/paradex.d.ts +54 -0
  711. package/js/src/src/pro/paradex.js +370 -0
  712. package/js/src/src/pro/phemex.d.ts +129 -0
  713. package/js/src/src/pro/phemex.js +1569 -0
  714. package/js/src/src/pro/poloniex.d.ts +214 -0
  715. package/js/src/src/pro/poloniex.js +1318 -0
  716. package/js/src/src/pro/probit.d.ts +91 -0
  717. package/js/src/src/pro/probit.js +593 -0
  718. package/js/src/src/pro/tradeogre.d.ts +49 -0
  719. package/js/src/src/pro/tradeogre.js +284 -0
  720. package/js/src/src/pro/upbit.d.ts +124 -0
  721. package/js/src/src/pro/upbit.js +689 -0
  722. package/js/src/src/pro/vertex.d.ts +104 -0
  723. package/js/src/src/pro/vertex.js +999 -0
  724. package/js/src/src/pro/whitebit.d.ts +123 -0
  725. package/js/src/src/pro/whitebit.js +971 -0
  726. package/js/src/src/pro/woo.d.ts +161 -0
  727. package/js/src/src/pro/woo.js +1351 -0
  728. package/js/src/src/pro/woofipro.d.ts +155 -0
  729. package/js/src/src/pro/woofipro.js +1335 -0
  730. package/js/src/src/pro/xt.d.ts +165 -0
  731. package/js/src/src/pro/xt.js +1230 -0
  732. package/js/src/src/probit.d.ts +283 -0
  733. package/js/src/src/probit.js +1935 -0
  734. package/js/src/src/protobuf/mexc/compiled.cjs +7186 -0
  735. package/js/src/src/protobuf/mexc/compiled.d.cts +8 -0
  736. package/js/src/src/raastin.d.ts +24 -0
  737. package/js/src/src/raastin.js +494 -0
  738. package/js/src/src/ramzinex.d.ts +23 -0
  739. package/js/src/src/ramzinex.js +510 -0
  740. package/js/src/src/sarmayex.d.ts +21 -0
  741. package/js/src/src/sarmayex.js +376 -0
  742. package/js/src/src/sarrafex.d.ts +23 -0
  743. package/js/src/src/sarrafex.js +501 -0
  744. package/js/src/src/static_dependencies/ethers/abi-coder.d.ts +50 -0
  745. package/js/src/src/static_dependencies/ethers/abi-coder.js +148 -0
  746. package/js/src/src/static_dependencies/ethers/address/address.d.ts +55 -0
  747. package/js/src/src/static_dependencies/ethers/address/address.js +162 -0
  748. package/js/src/src/static_dependencies/ethers/address/checks.d.ts +80 -0
  749. package/js/src/src/static_dependencies/ethers/address/checks.js +119 -0
  750. package/js/src/src/static_dependencies/ethers/address/contract-address.d.ts +47 -0
  751. package/js/src/src/static_dependencies/ethers/address/contract-address.js +73 -0
  752. package/js/src/src/static_dependencies/ethers/address/index.d.ts +48 -0
  753. package/js/src/src/static_dependencies/ethers/address/index.js +24 -0
  754. package/js/src/src/static_dependencies/ethers/bytes32.d.ts +14 -0
  755. package/js/src/src/static_dependencies/ethers/bytes32.js +45 -0
  756. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.d.ts +120 -0
  757. package/js/src/src/static_dependencies/ethers/coders/abstract-coder.js +424 -0
  758. package/js/src/src/static_dependencies/ethers/coders/address.d.ts +12 -0
  759. package/js/src/src/static_dependencies/ethers/coders/address.js +34 -0
  760. package/js/src/src/static_dependencies/ethers/coders/anonymous.d.ts +14 -0
  761. package/js/src/src/static_dependencies/ethers/coders/anonymous.js +27 -0
  762. package/js/src/src/static_dependencies/ethers/coders/array.d.ts +24 -0
  763. package/js/src/src/static_dependencies/ethers/coders/array.js +162 -0
  764. package/js/src/src/static_dependencies/ethers/coders/boolean.d.ts +12 -0
  765. package/js/src/src/static_dependencies/ethers/coders/boolean.js +26 -0
  766. package/js/src/src/static_dependencies/ethers/coders/bytes.d.ts +18 -0
  767. package/js/src/src/static_dependencies/ethers/coders/bytes.js +39 -0
  768. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.d.ts +14 -0
  769. package/js/src/src/static_dependencies/ethers/coders/fixed-bytes.js +32 -0
  770. package/js/src/src/static_dependencies/ethers/coders/null.d.ts +11 -0
  771. package/js/src/src/static_dependencies/ethers/coders/null.js +29 -0
  772. package/js/src/src/static_dependencies/ethers/coders/number.d.ts +15 -0
  773. package/js/src/src/static_dependencies/ethers/coders/number.js +48 -0
  774. package/js/src/src/static_dependencies/ethers/coders/string.d.ts +12 -0
  775. package/js/src/src/static_dependencies/ethers/coders/string.js +26 -0
  776. package/js/src/src/static_dependencies/ethers/coders/tuple.d.ts +15 -0
  777. package/js/src/src/static_dependencies/ethers/coders/tuple.js +67 -0
  778. package/js/src/src/static_dependencies/ethers/fragments.d.ts +458 -0
  779. package/js/src/src/static_dependencies/ethers/fragments.js +1252 -0
  780. package/js/src/src/static_dependencies/ethers/hash/index.d.ts +10 -0
  781. package/js/src/src/static_dependencies/ethers/hash/index.js +15 -0
  782. package/js/src/src/static_dependencies/ethers/hash/solidity.d.ts +30 -0
  783. package/js/src/src/static_dependencies/ethers/hash/solidity.js +107 -0
  784. package/js/src/src/static_dependencies/ethers/hash/typed-data.d.ts +144 -0
  785. package/js/src/src/static_dependencies/ethers/hash/typed-data.js +490 -0
  786. package/js/src/src/static_dependencies/ethers/index.d.ts +19 -0
  787. package/js/src/src/static_dependencies/ethers/index.js +22 -0
  788. package/js/src/src/static_dependencies/ethers/interface.d.ts +380 -0
  789. package/js/src/src/static_dependencies/ethers/interface.js +990 -0
  790. package/js/src/src/static_dependencies/ethers/typed.d.ts +569 -0
  791. package/js/src/src/static_dependencies/ethers/typed.js +608 -0
  792. package/js/src/src/static_dependencies/ethers/utils/base58.d.ts +22 -0
  793. package/js/src/src/static_dependencies/ethers/utils/base58.js +68 -0
  794. package/js/src/src/static_dependencies/ethers/utils/base64.d.ts +39 -0
  795. package/js/src/src/static_dependencies/ethers/utils/base64.js +58 -0
  796. package/js/src/src/static_dependencies/ethers/utils/data.d.ts +92 -0
  797. package/js/src/src/static_dependencies/ethers/utils/data.js +175 -0
  798. package/js/src/src/static_dependencies/ethers/utils/errors.d.ts +509 -0
  799. package/js/src/src/static_dependencies/ethers/utils/errors.js +227 -0
  800. package/js/src/src/static_dependencies/ethers/utils/events.d.ts +76 -0
  801. package/js/src/src/static_dependencies/ethers/utils/events.js +52 -0
  802. package/js/src/src/static_dependencies/ethers/utils/fixednumber.d.ts +251 -0
  803. package/js/src/src/static_dependencies/ethers/utils/fixednumber.js +529 -0
  804. package/js/src/src/static_dependencies/ethers/utils/index.d.ts +30 -0
  805. package/js/src/src/static_dependencies/ethers/utils/index.js +38 -0
  806. package/js/src/src/static_dependencies/ethers/utils/maths.d.ts +65 -0
  807. package/js/src/src/static_dependencies/ethers/utils/maths.js +220 -0
  808. package/js/src/src/static_dependencies/ethers/utils/properties.d.ts +22 -0
  809. package/js/src/src/static_dependencies/ethers/utils/properties.js +59 -0
  810. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.d.ts +5 -0
  811. package/js/src/src/static_dependencies/ethers/utils/rlp-decode.js +84 -0
  812. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.d.ts +5 -0
  813. package/js/src/src/static_dependencies/ethers/utils/rlp-encode.js +54 -0
  814. package/js/src/src/static_dependencies/ethers/utils/rlp.d.ts +16 -0
  815. package/js/src/src/static_dependencies/ethers/utils/rlp.js +14 -0
  816. package/js/src/src/static_dependencies/ethers/utils/units.d.ts +23 -0
  817. package/js/src/src/static_dependencies/ethers/utils/units.js +88 -0
  818. package/js/src/src/static_dependencies/ethers/utils/utf8.d.ts +95 -0
  819. package/js/src/src/static_dependencies/ethers/utils/utf8.js +225 -0
  820. package/js/src/src/static_dependencies/ethers/utils/uuid.d.ts +7 -0
  821. package/js/src/src/static_dependencies/ethers/utils/uuid.js +35 -0
  822. package/js/src/src/static_dependencies/fflake/browser.d.ts +222 -0
  823. package/js/src/src/static_dependencies/fflake/browser.js +2578 -0
  824. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.d.ts +116 -0
  825. package/js/src/src/static_dependencies/jsencrypt/JSEncrypt.js +194 -0
  826. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.d.ts +142 -0
  827. package/js/src/src/static_dependencies/jsencrypt/JSEncryptRSAKey.js +307 -0
  828. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.d.ts +51 -0
  829. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/asn1.js +565 -0
  830. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.d.ts +5 -0
  831. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/base64.js +94 -0
  832. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.d.ts +3 -0
  833. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/hex.js +70 -0
  834. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.d.ts +9 -0
  835. package/js/src/src/static_dependencies/jsencrypt/lib/asn1js/int10.js +91 -0
  836. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.d.ts +3 -0
  837. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/base64.js +25 -0
  838. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +101 -0
  839. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.js +1757 -0
  840. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.d.ts +10 -0
  841. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/prng4.js +50 -0
  842. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.d.ts +3 -0
  843. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rng.js +80 -0
  844. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.d.ts +23 -0
  845. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/rsa.js +377 -0
  846. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.d.ts +7 -0
  847. package/js/src/src/static_dependencies/jsencrypt/lib/jsbn/util.js +64 -0
  848. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.d.ts +24 -0
  849. package/js/src/src/static_dependencies/jsencrypt/lib/jsrsasign/asn1-1.0.js +1627 -0
  850. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.d.ts +60 -0
  851. package/js/src/src/static_dependencies/noble-curves/_shortw_utils.js +22 -0
  852. package/js/src/src/static_dependencies/noble-curves/abstract/curve.d.ts +67 -0
  853. package/js/src/src/static_dependencies/noble-curves/abstract/curve.js +157 -0
  854. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.d.ts +79 -0
  855. package/js/src/src/static_dependencies/noble-curves/abstract/edwards.js +432 -0
  856. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.d.ts +56 -0
  857. package/js/src/src/static_dependencies/noble-curves/abstract/hash-to-curve.js +171 -0
  858. package/js/src/src/static_dependencies/noble-curves/abstract/modular.d.ts +68 -0
  859. package/js/src/src/static_dependencies/noble-curves/abstract/modular.js +351 -0
  860. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.d.ts +25 -0
  861. package/js/src/src/static_dependencies/noble-curves/abstract/montgomery.js +162 -0
  862. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.d.ts +29 -0
  863. package/js/src/src/static_dependencies/noble-curves/abstract/poseidon.js +115 -0
  864. package/js/src/src/static_dependencies/noble-curves/abstract/utils.d.ts +53 -0
  865. package/js/src/src/static_dependencies/noble-curves/abstract/utils.js +227 -0
  866. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.d.ts +204 -0
  867. package/js/src/src/static_dependencies/noble-curves/abstract/weierstrass.js +1016 -0
  868. package/js/src/src/static_dependencies/noble-curves/ed25519.d.ts +53 -0
  869. package/js/src/src/static_dependencies/noble-curves/ed25519.js +402 -0
  870. package/js/src/src/static_dependencies/noble-curves/p256.d.ts +103 -0
  871. package/js/src/src/static_dependencies/noble-curves/p256.js +47 -0
  872. package/js/src/src/static_dependencies/noble-curves/secp256k1.d.ts +91 -0
  873. package/js/src/src/static_dependencies/noble-curves/secp256k1.js +257 -0
  874. package/js/src/src/static_dependencies/noble-hashes/_assert.d.ts +21 -0
  875. package/js/src/src/static_dependencies/noble-hashes/_assert.js +48 -0
  876. package/js/src/src/static_dependencies/noble-hashes/_sha2.d.ts +23 -0
  877. package/js/src/src/static_dependencies/noble-hashes/_sha2.js +119 -0
  878. package/js/src/src/static_dependencies/noble-hashes/_u64.d.ts +35 -0
  879. package/js/src/src/static_dependencies/noble-hashes/_u64.js +66 -0
  880. package/js/src/src/static_dependencies/noble-hashes/crypto.d.ts +1 -0
  881. package/js/src/src/static_dependencies/noble-hashes/crypto.js +7 -0
  882. package/js/src/src/static_dependencies/noble-hashes/hmac.d.ts +26 -0
  883. package/js/src/src/static_dependencies/noble-hashes/hmac.js +82 -0
  884. package/js/src/src/static_dependencies/noble-hashes/md5.d.ts +18 -0
  885. package/js/src/src/static_dependencies/noble-hashes/md5.js +242 -0
  886. package/js/src/src/static_dependencies/noble-hashes/sha1.d.ts +21 -0
  887. package/js/src/src/static_dependencies/noble-hashes/sha1.js +90 -0
  888. package/js/src/src/static_dependencies/noble-hashes/sha256.d.ts +34 -0
  889. package/js/src/src/static_dependencies/noble-hashes/sha256.js +129 -0
  890. package/js/src/src/static_dependencies/noble-hashes/sha3.d.ts +97 -0
  891. package/js/src/src/static_dependencies/noble-hashes/sha3.js +211 -0
  892. package/js/src/src/static_dependencies/noble-hashes/sha512.d.ts +66 -0
  893. package/js/src/src/static_dependencies/noble-hashes/sha512.js +236 -0
  894. package/js/src/src/static_dependencies/noble-hashes/utils.d.ts +77 -0
  895. package/js/src/src/static_dependencies/noble-hashes/utils.js +147 -0
  896. package/js/src/src/static_dependencies/proxies/agent-base/helpers.d.ts +14 -0
  897. package/js/src/src/static_dependencies/proxies/agent-base/helpers.js +42 -0
  898. package/js/src/src/static_dependencies/proxies/agent-base/index.d.ts +33 -0
  899. package/js/src/src/static_dependencies/proxies/agent-base/index.js +82 -0
  900. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.d.ts +40 -0
  901. package/js/src/src/static_dependencies/proxies/http-proxy-agent/index.js +119 -0
  902. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.d.ts +45 -0
  903. package/js/src/src/static_dependencies/proxies/https-proxy-agent/index.js +150 -0
  904. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.d.ts +15 -0
  905. package/js/src/src/static_dependencies/proxies/https-proxy-agent/parse-proxy-response.js +95 -0
  906. package/js/src/src/static_dependencies/qs/formats.cjs +22 -0
  907. package/js/src/src/static_dependencies/qs/formats.d.cts +14 -0
  908. package/js/src/src/static_dependencies/qs/index.cjs +15 -0
  909. package/js/src/src/static_dependencies/qs/index.d.cts +10 -0
  910. package/js/src/src/static_dependencies/qs/parse.cjs +208 -0
  911. package/js/src/src/static_dependencies/qs/parse.d.cts +8 -0
  912. package/js/src/src/static_dependencies/qs/stringify.cjs +192 -0
  913. package/js/src/src/static_dependencies/qs/stringify.d.cts +8 -0
  914. package/js/src/src/static_dependencies/qs/utils.cjs +202 -0
  915. package/js/src/src/static_dependencies/qs/utils.d.cts +15 -0
  916. package/js/src/src/static_dependencies/scure-base/index.d.ts +92 -0
  917. package/js/src/src/static_dependencies/scure-base/index.js +420 -0
  918. package/js/src/src/static_dependencies/scure-starknet/index.d.ts +79 -0
  919. package/js/src/src/static_dependencies/scure-starknet/index.js +323 -0
  920. package/js/src/src/static_dependencies/starknet/constants.d.ts +61 -0
  921. package/js/src/src/static_dependencies/starknet/constants.js +67 -0
  922. package/js/src/src/static_dependencies/starknet/index.d.ts +3 -0
  923. package/js/src/src/static_dependencies/starknet/index.js +9 -0
  924. package/js/src/src/static_dependencies/starknet/types/cairoEnum.d.ts +2 -0
  925. package/js/src/src/static_dependencies/starknet/types/cairoEnum.js +7 -0
  926. package/js/src/src/static_dependencies/starknet/types/calldata.d.ts +19 -0
  927. package/js/src/src/static_dependencies/starknet/types/calldata.js +28 -0
  928. package/js/src/src/static_dependencies/starknet/types/index.d.ts +13 -0
  929. package/js/src/src/static_dependencies/starknet/types/index.js +16 -0
  930. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.d.ts +71 -0
  931. package/js/src/src/static_dependencies/starknet/types/lib/contract/abi.js +13 -0
  932. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.d.ts +24 -0
  933. package/js/src/src/static_dependencies/starknet/types/lib/contract/index.js +16 -0
  934. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.d.ts +33 -0
  935. package/js/src/src/static_dependencies/starknet/types/lib/contract/legacy.js +7 -0
  936. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.d.ts +52 -0
  937. package/js/src/src/static_dependencies/starknet/types/lib/contract/sierra.js +7 -0
  938. package/js/src/src/static_dependencies/starknet/types/lib/index.d.ts +248 -0
  939. package/js/src/src/static_dependencies/starknet/types/lib/index.js +52 -0
  940. package/js/src/src/static_dependencies/starknet/types/typedData.d.ts +44 -0
  941. package/js/src/src/static_dependencies/starknet/types/typedData.js +19 -0
  942. package/js/src/src/static_dependencies/starknet/utils/assert.d.ts +7 -0
  943. package/js/src/src/static_dependencies/starknet/utils/assert.js +17 -0
  944. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.d.ts +6 -0
  945. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/felt.js +43 -0
  946. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.d.ts +72 -0
  947. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint256.js +117 -0
  948. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.d.ts +76 -0
  949. package/js/src/src/static_dependencies/starknet/utils/cairoDataTypes/uint512.js +136 -0
  950. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.d.ts +32 -0
  951. package/js/src/src/static_dependencies/starknet/utils/calldata/byteArray.js +59 -0
  952. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.d.ts +183 -0
  953. package/js/src/src/static_dependencies/starknet/utils/calldata/cairo.js +229 -0
  954. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.d.ts +38 -0
  955. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoCustomEnum.js +57 -0
  956. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.d.ts +35 -0
  957. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoOption.js +64 -0
  958. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.d.ts +34 -0
  959. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/CairoResult.js +63 -0
  960. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.d.ts +3 -0
  961. package/js/src/src/static_dependencies/starknet/utils/calldata/enum/index.js +9 -0
  962. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.d.ts +9 -0
  963. package/js/src/src/static_dependencies/starknet/utils/calldata/formatter.js +67 -0
  964. package/js/src/src/static_dependencies/starknet/utils/calldata/index.d.ts +89 -0
  965. package/js/src/src/static_dependencies/starknet/utils/calldata/index.js +280 -0
  966. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +5 -0
  967. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/index.js +30 -0
  968. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.d.ts +20 -0
  969. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/interface.js +8 -0
  970. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.d.ts +24 -0
  971. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-0-1.1.0.js +36 -0
  972. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.d.ts +23 -0
  973. package/js/src/src/static_dependencies/starknet/utils/calldata/parser/parser-2.0.0.js +40 -0
  974. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.d.ts +2 -0
  975. package/js/src/src/static_dependencies/starknet/utils/calldata/propertyOrder.js +155 -0
  976. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.d.ts +11 -0
  977. package/js/src/src/static_dependencies/starknet/utils/calldata/requestParser.js +248 -0
  978. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.d.ts +11 -0
  979. package/js/src/src/static_dependencies/starknet/utils/calldata/responseParser.js +214 -0
  980. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.d.ts +6 -0
  981. package/js/src/src/static_dependencies/starknet/utils/calldata/tuple.js +113 -0
  982. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.d.ts +6 -0
  983. package/js/src/src/static_dependencies/starknet/utils/calldata/validate.js +208 -0
  984. package/js/src/src/static_dependencies/starknet/utils/encode.d.ts +207 -0
  985. package/js/src/src/static_dependencies/starknet/utils/encode.js +282 -0
  986. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.d.ts +57 -0
  987. package/js/src/src/static_dependencies/starknet/utils/hash/classHash.js +223 -0
  988. package/js/src/src/static_dependencies/starknet/utils/hash/index.d.ts +6 -0
  989. package/js/src/src/static_dependencies/starknet/utils/hash/index.js +13 -0
  990. package/js/src/src/static_dependencies/starknet/utils/merkle.d.ts +35 -0
  991. package/js/src/src/static_dependencies/starknet/utils/merkle.js +84 -0
  992. package/js/src/src/static_dependencies/starknet/utils/num.d.ts +182 -0
  993. package/js/src/src/static_dependencies/starknet/utils/num.js +244 -0
  994. package/js/src/src/static_dependencies/starknet/utils/selector.d.ts +48 -0
  995. package/js/src/src/static_dependencies/starknet/utils/selector.js +85 -0
  996. package/js/src/src/static_dependencies/starknet/utils/shortString.d.ts +57 -0
  997. package/js/src/src/static_dependencies/starknet/utils/shortString.js +96 -0
  998. package/js/src/src/static_dependencies/starknet/utils/typedData.d.ts +54 -0
  999. package/js/src/src/static_dependencies/starknet/utils/typedData.js +321 -0
  1000. package/js/src/src/static_dependencies/watchable/src/types.d.ts +28 -0
  1001. package/js/src/src/static_dependencies/watchable/src/types.js +8 -0
  1002. package/js/src/src/static_dependencies/watchable/src/unpromise.d.ts +120 -0
  1003. package/js/src/src/static_dependencies/watchable/src/unpromise.js +297 -0
  1004. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.d.ts +1279 -0
  1005. package/js/src/src/static_dependencies/zklink/zklink-sdk-web.js +4282 -0
  1006. package/js/src/src/tabdeal.d.ts +23 -0
  1007. package/js/src/src/tabdeal.js +387 -0
  1008. package/js/src/src/tehran_exchange.d.ts +21 -0
  1009. package/js/src/src/tehran_exchange.js +333 -0
  1010. package/js/src/src/tetherland.d.ts +21 -0
  1011. package/js/src/src/tetherland.js +367 -0
  1012. package/js/src/src/timex.d.ts +247 -0
  1013. package/js/src/src/timex.js +1792 -0
  1014. package/js/src/src/tokocrypto.d.ts +261 -0
  1015. package/js/src/src/tokocrypto.js +2641 -0
  1016. package/js/src/src/toobit.d.ts +22 -0
  1017. package/js/src/src/toobit.js +445 -0
  1018. package/js/src/src/tradeogre.d.ts +149 -0
  1019. package/js/src/src/tradeogre.js +878 -0
  1020. package/js/src/src/twox.d.ts +21 -0
  1021. package/js/src/src/twox.js +371 -0
  1022. package/js/src/src/ubitex.d.ts +23 -0
  1023. package/js/src/src/ubitex.js +433 -0
  1024. package/js/src/src/upbit.d.ts +377 -0
  1025. package/js/src/src/upbit.js +2340 -0
  1026. package/js/src/src/vertex.d.ts +346 -0
  1027. package/js/src/src/vertex.js +3146 -0
  1028. package/js/src/src/wallex.d.ts +23 -0
  1029. package/js/src/src/wallex.js +467 -0
  1030. package/js/src/src/wavesexchange.d.ts +244 -0
  1031. package/js/src/src/wavesexchange.js +2747 -0
  1032. package/js/src/src/whitebit.d.ts +571 -0
  1033. package/js/src/src/whitebit.js +3437 -0
  1034. package/js/src/src/woo.d.ts +727 -0
  1035. package/js/src/src/woo.js +4183 -0
  1036. package/js/src/src/woofipro.d.ts +497 -0
  1037. package/js/src/src/woofipro.js +2941 -0
  1038. package/js/src/src/xt.d.ts +568 -0
  1039. package/js/src/src/xt.js +5184 -0
  1040. package/js/src/src/yobit.d.ts +197 -0
  1041. package/js/src/src/yobit.js +1453 -0
  1042. package/js/src/src/zaif.d.ts +136 -0
  1043. package/js/src/src/zaif.js +821 -0
  1044. package/js/src/src/zonda.d.ts +214 -0
  1045. package/js/src/src/zonda.js +1984 -0
  1046. package/js/test.js +3 -3
  1047. package/package.json +1 -1
@@ -0,0 +1,2825 @@
1
+ // ----------------------------------------------------------------------------
2
+
3
+ // PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ // https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+ // EDIT THE CORRESPONDENT .ts FILE INSTEAD
6
+
7
+ // ---------------------------------------------------------------------------
8
+ import Exchange from './abstract/exmo.js';
9
+ import { ArgumentsRequired, ExchangeError, OrderNotFound, AuthenticationError, InsufficientFunds, InvalidOrder, InvalidNonce, OnMaintenance, RateLimitExceeded, BadRequest, PermissionDenied } from './base/errors.js';
10
+ import { Precise } from './base/Precise.js';
11
+ import { TICK_SIZE } from './base/functions/number.js';
12
+ import { sha512 } from './static_dependencies/noble-hashes/sha512.js';
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * @class exmo
16
+ * @augments Exchange
17
+ */
18
+ export default class exmo extends Exchange {
19
+ describe() {
20
+ return this.deepExtend(super.describe(), {
21
+ 'id': 'exmo',
22
+ 'name': 'EXMO',
23
+ 'countries': ['LT'],
24
+ 'rateLimit': 100,
25
+ 'version': 'v1.1',
26
+ 'has': {
27
+ 'CORS': undefined,
28
+ 'spot': true,
29
+ 'margin': true,
30
+ 'swap': false,
31
+ 'future': false,
32
+ 'option': false,
33
+ 'addMargin': true,
34
+ 'cancelOrder': true,
35
+ 'cancelOrders': false,
36
+ 'createDepositAddress': false,
37
+ 'createMarketBuyOrder': true,
38
+ 'createMarketBuyOrderWithCost': true,
39
+ 'createMarketOrderWithCost': true,
40
+ 'createOrder': true,
41
+ 'createStopLimitOrder': true,
42
+ 'createStopMarketOrder': true,
43
+ 'createStopOrder': true,
44
+ 'editOrder': true,
45
+ 'fetchAccounts': false,
46
+ 'fetchBalance': true,
47
+ 'fetchCanceledOrders': true,
48
+ 'fetchCurrencies': true,
49
+ 'fetchDeposit': true,
50
+ 'fetchDepositAddress': true,
51
+ 'fetchDepositAddresses': false,
52
+ 'fetchDepositAddressesByNetwork': false,
53
+ 'fetchDeposits': true,
54
+ 'fetchDepositsWithdrawals': true,
55
+ 'fetchDepositWithdrawFee': 'emulated',
56
+ 'fetchDepositWithdrawFees': true,
57
+ 'fetchFundingHistory': false,
58
+ 'fetchFundingRate': false,
59
+ 'fetchFundingRateHistory': false,
60
+ 'fetchFundingRates': false,
61
+ 'fetchIndexOHLCV': false,
62
+ 'fetchMarginMode': false,
63
+ 'fetchMarkets': true,
64
+ 'fetchMarkOHLCV': false,
65
+ 'fetchMyTrades': true,
66
+ 'fetchOHLCV': true,
67
+ 'fetchOpenInterestHistory': false,
68
+ 'fetchOpenOrders': true,
69
+ 'fetchOrder': 'emulated',
70
+ 'fetchOrderBook': true,
71
+ 'fetchOrderBooks': true,
72
+ 'fetchOrderTrades': true,
73
+ 'fetchPosition': false,
74
+ 'fetchPositionHistory': false,
75
+ 'fetchPositionMode': false,
76
+ 'fetchPositions': false,
77
+ 'fetchPositionsHistory': false,
78
+ 'fetchPositionsRisk': false,
79
+ 'fetchPremiumIndexOHLCV': false,
80
+ 'fetchTicker': true,
81
+ 'fetchTickers': true,
82
+ 'fetchTrades': true,
83
+ 'fetchTradingFee': false,
84
+ 'fetchTradingFees': true,
85
+ 'fetchTransactionFees': true,
86
+ 'fetchTransactions': 'emulated',
87
+ 'fetchTransfer': false,
88
+ 'fetchTransfers': false,
89
+ 'fetchWithdrawal': true,
90
+ 'fetchWithdrawals': true,
91
+ 'reduceMargin': true,
92
+ 'setMargin': false,
93
+ 'transfer': false,
94
+ 'withdraw': true,
95
+ },
96
+ 'timeframes': {
97
+ '1m': '1',
98
+ '5m': '5',
99
+ '15m': '15',
100
+ '30m': '30',
101
+ '45m': '45',
102
+ '1h': '60',
103
+ '2h': '120',
104
+ '3h': '180',
105
+ '4h': '240',
106
+ '1d': 'D',
107
+ '1w': 'W',
108
+ '1M': 'M',
109
+ },
110
+ 'urls': {
111
+ 'logo': 'https://user-images.githubusercontent.com/1294454/27766491-1b0ea956-5eda-11e7-9225-40d67b481b8d.jpg',
112
+ 'api': {
113
+ 'public': 'https://api.exmo.com',
114
+ 'private': 'https://api.exmo.com',
115
+ 'web': 'https://exmo.me',
116
+ },
117
+ 'www': 'https://exmo.me',
118
+ 'referral': 'https://exmo.me/?ref=131685',
119
+ 'doc': [
120
+ 'https://exmo.me/en/api_doc?ref=131685',
121
+ ],
122
+ 'fees': 'https://exmo.com/en/docs/fees',
123
+ },
124
+ 'api': {
125
+ 'web': {
126
+ 'get': [
127
+ 'ctrl/feesAndLimits',
128
+ 'en/docs/fees',
129
+ ],
130
+ },
131
+ 'public': {
132
+ 'get': [
133
+ 'currency',
134
+ 'currency/list/extended',
135
+ 'order_book',
136
+ 'pair_settings',
137
+ 'ticker',
138
+ 'trades',
139
+ 'candles_history',
140
+ 'required_amount',
141
+ 'payments/providers/crypto/list',
142
+ ],
143
+ },
144
+ 'private': {
145
+ 'post': [
146
+ 'user_info',
147
+ 'order_create',
148
+ 'order_cancel',
149
+ 'stop_market_order_create',
150
+ 'stop_market_order_cancel',
151
+ 'user_open_orders',
152
+ 'user_trades',
153
+ 'user_cancelled_orders',
154
+ 'order_trades',
155
+ 'deposit_address',
156
+ 'withdraw_crypt',
157
+ 'withdraw_get_txid',
158
+ 'excode_create',
159
+ 'excode_load',
160
+ 'code_check',
161
+ 'wallet_history',
162
+ 'wallet_operations',
163
+ 'margin/user/order/create',
164
+ 'margin/user/order/update',
165
+ 'margin/user/order/cancel',
166
+ 'margin/user/position/close',
167
+ 'margin/user/position/margin_add',
168
+ 'margin/user/position/margin_remove',
169
+ 'margin/currency/list',
170
+ 'margin/pair/list',
171
+ 'margin/settings',
172
+ 'margin/funding/list',
173
+ 'margin/user/info',
174
+ 'margin/user/order/list',
175
+ 'margin/user/order/history',
176
+ 'margin/user/order/trades',
177
+ 'margin/user/order/max_quantity',
178
+ 'margin/user/position/list',
179
+ 'margin/user/position/margin_remove_info',
180
+ 'margin/user/position/margin_add_info',
181
+ 'margin/user/wallet/list',
182
+ 'margin/user/wallet/history',
183
+ 'margin/user/trade/list',
184
+ 'margin/trades',
185
+ 'margin/liquidation/feed',
186
+ ],
187
+ },
188
+ },
189
+ 'fees': {
190
+ 'trading': {
191
+ 'feeSide': 'get',
192
+ 'tierBased': true,
193
+ 'percentage': true,
194
+ 'maker': this.parseNumber('0.004'),
195
+ 'taker': this.parseNumber('0.004'),
196
+ },
197
+ 'transaction': {
198
+ 'tierBased': false,
199
+ 'percentage': false, // fixed transaction fees for crypto, see fetchDepositWithdrawFees below
200
+ },
201
+ },
202
+ 'options': {
203
+ 'networks': {
204
+ 'ETH': 'ERC20',
205
+ 'TRX': 'TRC20',
206
+ },
207
+ 'fetchTradingFees': {
208
+ 'method': 'fetchPrivateTradingFees', // or 'fetchPublicTradingFees'
209
+ },
210
+ 'margin': {
211
+ 'fillResponseFromRequest': true,
212
+ },
213
+ },
214
+ 'features': {
215
+ 'spot': {
216
+ 'sandbox': false,
217
+ 'createOrder': {
218
+ 'marginMode': true,
219
+ 'triggerPrice': true,
220
+ 'triggerPriceType': undefined,
221
+ 'triggerDirection': false,
222
+ 'stopLossPrice': false,
223
+ 'takeProfitPrice': false,
224
+ 'attachedStopLossTakeProfit': undefined,
225
+ 'timeInForce': {
226
+ 'IOC': true,
227
+ 'FOK': true,
228
+ 'PO': true,
229
+ 'GTD': true,
230
+ },
231
+ 'hedged': false,
232
+ 'selfTradePrevention': false,
233
+ 'trailing': false,
234
+ 'leverage': true,
235
+ 'marketBuyByCost': true,
236
+ 'marketBuyRequiresPrice': false,
237
+ 'iceberg': false,
238
+ },
239
+ 'createOrders': undefined,
240
+ 'fetchMyTrades': {
241
+ 'marginMode': true,
242
+ 'limit': 100,
243
+ 'daysBack': undefined,
244
+ 'untilDays': undefined,
245
+ 'symbolRequired': true,
246
+ },
247
+ 'fetchOrder': {
248
+ 'marginMode': false,
249
+ 'trigger': false,
250
+ 'trailing': false,
251
+ 'symbolRequired': false,
252
+ },
253
+ 'fetchOpenOrders': {
254
+ 'marginMode': false,
255
+ 'limit': undefined,
256
+ 'trigger': false,
257
+ 'trailing': false,
258
+ 'symbolRequired': false,
259
+ },
260
+ 'fetchOrders': undefined,
261
+ 'fetchClosedOrders': undefined,
262
+ 'fetchOHLCV': {
263
+ 'limit': 1000, // todo, not in request
264
+ },
265
+ },
266
+ 'swap': {
267
+ 'linear': undefined,
268
+ 'inverse': undefined,
269
+ },
270
+ 'future': {
271
+ 'linear': undefined,
272
+ 'inverse': undefined,
273
+ },
274
+ },
275
+ 'commonCurrencies': {
276
+ 'GMT': 'GMT Token',
277
+ },
278
+ 'precisionMode': TICK_SIZE,
279
+ 'exceptions': {
280
+ 'exact': {
281
+ '140333': InvalidOrder,
282
+ '140434': BadRequest,
283
+ '40005': AuthenticationError,
284
+ '40009': InvalidNonce,
285
+ '40015': ExchangeError,
286
+ '40016': OnMaintenance,
287
+ '40017': AuthenticationError,
288
+ '40032': PermissionDenied,
289
+ '40033': PermissionDenied,
290
+ '40034': RateLimitExceeded,
291
+ '50052': InsufficientFunds,
292
+ '50054': InsufficientFunds,
293
+ '50304': OrderNotFound,
294
+ '50173': OrderNotFound,
295
+ '50277': InvalidOrder,
296
+ '50319': InvalidOrder,
297
+ '50321': InvalidOrder,
298
+ '50381': InvalidOrder, // {"result":false,"error":"Error 50381: More than 2 decimal places are not permitted for pair BTC_USD"}
299
+ },
300
+ 'broad': {
301
+ 'range period is too long': BadRequest,
302
+ 'invalid syntax': BadRequest,
303
+ 'API rate limit exceeded': RateLimitExceeded, // {"result":false,"error":"API rate limit exceeded for x.x.x.x. Retry after 60 sec.","history":[],"begin":1579392000,"end":1579478400}
304
+ },
305
+ },
306
+ });
307
+ }
308
+ async modifyMarginHelper(symbol, amount, type, params = {}) {
309
+ await this.loadMarkets();
310
+ const market = this.market(symbol);
311
+ const request = {
312
+ 'position_id': market['id'],
313
+ 'quantity': amount,
314
+ };
315
+ let response = undefined;
316
+ if (type === 'add') {
317
+ response = await this.privatePostMarginUserPositionMarginAdd(this.extend(request, params));
318
+ }
319
+ else if (type === 'reduce') {
320
+ response = await this.privatePostMarginUserPositionMarginRemove(this.extend(request, params));
321
+ }
322
+ //
323
+ // {}
324
+ //
325
+ const margin = this.parseMarginModification(response, market);
326
+ const options = this.safeValue(this.options, 'margin', {});
327
+ const fillResponseFromRequest = this.safeBool(options, 'fillResponseFromRequest', true);
328
+ if (fillResponseFromRequest) {
329
+ margin['type'] = type;
330
+ margin['amount'] = amount;
331
+ }
332
+ return margin;
333
+ }
334
+ parseMarginModification(data, market = undefined) {
335
+ //
336
+ // {}
337
+ //
338
+ return {
339
+ 'info': data,
340
+ 'symbol': this.safeSymbol(undefined, market),
341
+ 'type': undefined,
342
+ 'marginMode': 'isolated',
343
+ 'amount': undefined,
344
+ 'total': undefined,
345
+ 'code': this.safeValue(market, 'quote'),
346
+ 'status': 'ok',
347
+ 'timestamp': undefined,
348
+ 'datetime': undefined,
349
+ };
350
+ }
351
+ /**
352
+ * @method
353
+ * @name exmo#reduceMargin
354
+ * @description remove margin from a position
355
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#eebf9f25-0289-4946-9482-89872c738449
356
+ * @param {string} symbol unified market symbol
357
+ * @param {float} amount the amount of margin to remove
358
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
359
+ * @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=reduce-margin-structure}
360
+ */
361
+ async reduceMargin(symbol, amount, params = {}) {
362
+ return await this.modifyMarginHelper(symbol, amount, 'reduce', params);
363
+ }
364
+ /**
365
+ * @method
366
+ * @name exmo#addMargin
367
+ * @description add margin
368
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#143ef808-79ca-4e49-9e79-a60ea4d8c0e3
369
+ * @param {string} symbol unified market symbol
370
+ * @param {float} amount amount of margin to add
371
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
372
+ * @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=add-margin-structure}
373
+ */
374
+ async addMargin(symbol, amount, params = {}) {
375
+ return await this.modifyMarginHelper(symbol, amount, 'add', params);
376
+ }
377
+ /**
378
+ * @method
379
+ * @name exmo#fetchTradingFees
380
+ * @description fetch the trading fees for multiple markets
381
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#90927062-256c-4b03-900f-2b99131f9a54
382
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
383
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
384
+ * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
385
+ */
386
+ async fetchTradingFees(params = {}) {
387
+ const options = this.safeValue(this.options, 'fetchTradingFees', {});
388
+ const defaultMethod = this.safeString(options, 'method', 'fetchPrivateTradingFees');
389
+ const method = this.safeString(params, 'method', defaultMethod);
390
+ params = this.omit(params, 'method');
391
+ if (method === 'fetchPrivateTradingFees') {
392
+ return await this.fetchPrivateTradingFees(params);
393
+ }
394
+ else {
395
+ return await this.fetchPublicTradingFees(params);
396
+ }
397
+ }
398
+ async fetchPrivateTradingFees(params = {}) {
399
+ await this.loadMarkets();
400
+ const response = await this.privatePostMarginPairList(params);
401
+ //
402
+ // {
403
+ // "pairs": [{
404
+ // "name": "EXM_USD",
405
+ // "buy_price": "0.02728391",
406
+ // "sell_price": "0.0276",
407
+ // "last_trade_price": "0.0276",
408
+ // "ticker_updated": "1646956050056696046",
409
+ // "is_fair_price": true,
410
+ // "max_price_precision": "8",
411
+ // "min_order_quantity": "1",
412
+ // "max_order_quantity": "50000",
413
+ // "min_order_price": "0.00000001",
414
+ // "max_order_price": "1000",
415
+ // "max_position_quantity": "50000",
416
+ // "trade_taker_fee": "0.05",
417
+ // "trade_maker_fee": "0",
418
+ // "liquidation_fee": "0.5",
419
+ // "max_leverage": "3",
420
+ // "default_leverage": "3",
421
+ // "liquidation_level": "5",
422
+ // "margin_call_level": "7.5",
423
+ // "position": "1",
424
+ // "updated": "1638976144797807397"
425
+ // }
426
+ // ...
427
+ // ]
428
+ // }
429
+ //
430
+ const pairs = this.safeValue(response, 'pairs', []);
431
+ const result = {};
432
+ for (let i = 0; i < pairs.length; i++) {
433
+ const pair = pairs[i];
434
+ const marketId = this.safeString(pair, 'name');
435
+ const symbol = this.safeSymbol(marketId, undefined, '_');
436
+ const makerString = this.safeString(pair, 'trade_maker_fee');
437
+ const takerString = this.safeString(pair, 'trade_taker_fee');
438
+ const maker = this.parseNumber(Precise.stringDiv(makerString, '100'));
439
+ const taker = this.parseNumber(Precise.stringDiv(takerString, '100'));
440
+ result[symbol] = {
441
+ 'info': pair,
442
+ 'symbol': symbol,
443
+ 'maker': maker,
444
+ 'taker': taker,
445
+ 'percentage': true,
446
+ 'tierBased': true,
447
+ };
448
+ }
449
+ return result;
450
+ }
451
+ async fetchPublicTradingFees(params = {}) {
452
+ await this.loadMarkets();
453
+ const response = await this.publicGetPairSettings(params);
454
+ //
455
+ // {
456
+ // "BTC_USD": {
457
+ // "min_quantity": "0.00002",
458
+ // "max_quantity": "1000",
459
+ // "min_price": "1",
460
+ // "max_price": "150000",
461
+ // "max_amount": "500000",
462
+ // "min_amount": "1",
463
+ // "price_precision": "2",
464
+ // "commission_taker_percent": "0.3",
465
+ // "commission_maker_percent": "0.3"
466
+ // },
467
+ // }
468
+ //
469
+ const result = {};
470
+ for (let i = 0; i < this.symbols.length; i++) {
471
+ const symbol = this.symbols[i];
472
+ const market = this.market(symbol);
473
+ const fee = this.safeValue(response, market['id'], {});
474
+ const makerString = this.safeString(fee, 'commission_maker_percent');
475
+ const takerString = this.safeString(fee, 'commission_taker_percent');
476
+ const maker = this.parseNumber(Precise.stringDiv(makerString, '100'));
477
+ const taker = this.parseNumber(Precise.stringDiv(takerString, '100'));
478
+ result[symbol] = {
479
+ 'info': fee,
480
+ 'symbol': symbol,
481
+ 'maker': maker,
482
+ 'taker': taker,
483
+ 'percentage': true,
484
+ 'tierBased': true,
485
+ };
486
+ }
487
+ return result;
488
+ }
489
+ parseFixedFloatValue(input) {
490
+ if ((input === undefined) || (input === '-')) {
491
+ return undefined;
492
+ }
493
+ if (input === '') {
494
+ return 0;
495
+ }
496
+ const isPercentage = (input.indexOf('%') >= 0);
497
+ const parts = input.split(' ');
498
+ const value = parts[0].replace('%', '');
499
+ const result = parseFloat(value);
500
+ if ((result > 0) && isPercentage) {
501
+ throw new ExchangeError(this.id + ' parseFixedFloatValue() detected an unsupported non-zero percentage-based fee ' + input);
502
+ }
503
+ return result;
504
+ }
505
+ /**
506
+ * @method
507
+ * @name exmo#fetchTransactionFees
508
+ * @deprecated
509
+ * @description please use fetchDepositWithdrawFees instead
510
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
511
+ * @param {string[]|undefined} codes list of unified currency codes
512
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
513
+ * @returns {object} a list of [transaction fees structures]{@link https://docs.ccxt.com/#/?id=fees-structure}
514
+ */
515
+ async fetchTransactionFees(codes = undefined, params = {}) {
516
+ await this.loadMarkets();
517
+ const cryptoList = await this.publicGetPaymentsProvidersCryptoList(params);
518
+ //
519
+ // {
520
+ // "BTC":[
521
+ // { "type":"deposit", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
522
+ // { "type":"withdraw", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"350", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.0005 BTC", "currency_confirmations":6 }
523
+ // ],
524
+ // "ETH":[
525
+ // { "type":"withdraw", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"500", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.004 ETH", "currency_confirmations":4 },
526
+ // { "type":"deposit", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.01 ETH. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 }
527
+ // ],
528
+ // "USDT":[
529
+ // { "type":"deposit", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":false,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
530
+ // { "type":"withdraw", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":false,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"5 USDT", "currency_confirmations":6 },
531
+ // { "type":"deposit", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
532
+ // {
533
+ // "type":"withdraw",
534
+ // "name":"USDT (ERC20)",
535
+ // "currency_name":"USDT",
536
+ // "min":"55",
537
+ // "max":"200000",
538
+ // "enabled":true,
539
+ // "comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Recommendation: Due to the high load of ERC20 network, using TRC20 address for withdrawal is recommended.",
540
+ // "commission_desc":"10 USDT",
541
+ // "currency_confirmations":6
542
+ // },
543
+ // { "type":"deposit", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":true,"comment":"Minimum deposit amount is 10 USDT. Only TRON main network supported", "commission_desc":"0%", "currency_confirmations":2 },
544
+ // { "type":"withdraw", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"150000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Only TRON main network supported.", "commission_desc":"1 USDT", "currency_confirmations":6 }
545
+ // ],
546
+ // "XLM":[
547
+ // { "type":"deposit", "name":"XLM", "currency_name":"XLM", "min":"1", "max":"1000000", "enabled":true,"comment":"Attention! A deposit without memo(invoice) will not be credited. Minimum deposit amount is 1 XLM. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
548
+ // { "type":"withdraw", "name":"XLM", "currency_name":"XLM", "min":"21", "max":"1000000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales.", "commission_desc":"0.01 XLM", "currency_confirmations":1 }
549
+ // ],
550
+ // }
551
+ //
552
+ const result = {};
553
+ const cryptoListKeys = Object.keys(cryptoList);
554
+ for (let i = 0; i < cryptoListKeys.length; i++) {
555
+ const code = cryptoListKeys[i];
556
+ if (codes !== undefined && !this.inArray(code, codes)) {
557
+ continue;
558
+ }
559
+ result[code] = {
560
+ 'deposit': undefined,
561
+ 'withdraw': undefined,
562
+ };
563
+ const currency = this.currency(code);
564
+ const currencyId = this.safeString(currency, 'id');
565
+ const providers = this.safeValue(cryptoList, currencyId, []);
566
+ for (let j = 0; j < providers.length; j++) {
567
+ const provider = providers[j];
568
+ const typeInner = this.safeString(provider, 'type');
569
+ const commissionDesc = this.safeString(provider, 'commission_desc');
570
+ const fee = this.parseFixedFloatValue(commissionDesc);
571
+ result[code][typeInner] = fee;
572
+ }
573
+ result[code]['info'] = providers;
574
+ }
575
+ // cache them for later use
576
+ this.options['transactionFees'] = result;
577
+ return result;
578
+ }
579
+ /**
580
+ * @method
581
+ * @name exmo#fetchDepositWithdrawFees
582
+ * @description fetch deposit and withdraw fees
583
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
584
+ * @param {string[]|undefined} codes list of unified currency codes
585
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
586
+ * @returns {object} a list of [transaction fees structures]{@link https://docs.ccxt.com/#/?id=fees-structure}
587
+ */
588
+ async fetchDepositWithdrawFees(codes = undefined, params = {}) {
589
+ await this.loadMarkets();
590
+ const response = await this.publicGetPaymentsProvidersCryptoList(params);
591
+ //
592
+ // {
593
+ // "USDT": [
594
+ // {
595
+ // "type": "deposit", // or "withdraw"
596
+ // "name": "USDT (ERC20)",
597
+ // "currency_name": "USDT",
598
+ // "min": "10",
599
+ // "max": "0",
600
+ // "enabled": true,
601
+ // "comment": "Minimum deposit amount is 10 USDT",
602
+ // "commission_desc": "0%",
603
+ // "currency_confirmations": 2
604
+ // },
605
+ // ...
606
+ // ],
607
+ // ...
608
+ // }
609
+ //
610
+ const result = this.parseDepositWithdrawFees(response, codes);
611
+ // cache them for later use
612
+ this.options['transactionFees'] = result;
613
+ return result;
614
+ }
615
+ parseDepositWithdrawFee(fee, currency = undefined) {
616
+ //
617
+ // [
618
+ // {
619
+ // "type": "deposit", // or "withdraw"
620
+ // "name": "BTC",
621
+ // "currency_name": "BTC",
622
+ // "min": "0.001",
623
+ // "max": "0",
624
+ // "enabled": true,
625
+ // "comment": "Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds",
626
+ // "commission_desc": "0%",
627
+ // "currency_confirmations": 1
628
+ // },
629
+ // ...
630
+ // ]
631
+ //
632
+ const result = this.depositWithdrawFee(fee);
633
+ for (let i = 0; i < fee.length; i++) {
634
+ const provider = fee[i];
635
+ const type = this.safeString(provider, 'type');
636
+ const networkId = this.safeString(provider, 'name');
637
+ const networkCode = this.networkIdToCode(networkId, this.safeString(currency, 'code'));
638
+ const commissionDesc = this.safeString(provider, 'commission_desc');
639
+ let splitCommissionDesc = [];
640
+ let percentage = undefined;
641
+ if (commissionDesc !== undefined) {
642
+ splitCommissionDesc = commissionDesc.split('%');
643
+ const splitCommissionDescLength = splitCommissionDesc.length;
644
+ percentage = splitCommissionDescLength >= 2;
645
+ }
646
+ const network = this.safeValue(result['networks'], networkCode);
647
+ if (network === undefined) {
648
+ result['networks'][networkCode] = {
649
+ 'withdraw': {
650
+ 'fee': undefined,
651
+ 'percentage': undefined,
652
+ },
653
+ 'deposit': {
654
+ 'fee': undefined,
655
+ 'percentage': undefined,
656
+ },
657
+ };
658
+ }
659
+ result['networks'][networkCode][type] = {
660
+ 'fee': this.parseFixedFloatValue(this.safeString(splitCommissionDesc, 0)),
661
+ 'percentage': percentage,
662
+ };
663
+ }
664
+ return this.assignDefaultDepositWithdrawFees(result);
665
+ }
666
+ /**
667
+ * @method
668
+ * @name exmo#fetchCurrencies
669
+ * @description fetches all available currencies on an exchange
670
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7cdf0ca8-9ff6-4cf3-aa33-bcec83155c49
671
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4190035d-24b1-453d-833b-37e0a52f88e2
672
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
673
+ * @returns {object} an associative dictionary of currencies
674
+ */
675
+ async fetchCurrencies(params = {}) {
676
+ const promises = [];
677
+ //
678
+ promises.push(this.publicGetCurrencyListExtended(params));
679
+ //
680
+ // [
681
+ // {"name":"VLX","description":"Velas"},
682
+ // {"name":"RUB","description":"Russian Ruble"},
683
+ // {"name":"BTC","description":"Bitcoin"},
684
+ // {"name":"USD","description":"US Dollar"}
685
+ // ]
686
+ //
687
+ promises.push(this.publicGetPaymentsProvidersCryptoList(params));
688
+ //
689
+ // {
690
+ // "BTC":[
691
+ // { "type":"deposit", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.001 BTC. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
692
+ // { "type":"withdraw", "name":"BTC", "currency_name":"BTC", "min":"0.001", "max":"350", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.0005 BTC", "currency_confirmations":6 }
693
+ // ],
694
+ // "ETH":[
695
+ // { "type":"withdraw", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"500", "enabled":true,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"0.004 ETH", "currency_confirmations":4 },
696
+ // { "type":"deposit", "name":"ETH", "currency_name":"ETH", "min":"0.01", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 0.01 ETH. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 }
697
+ // ],
698
+ // "USDT":[
699
+ // { "type":"deposit", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":false,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
700
+ // { "type":"withdraw", "name":"USDT (OMNI)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":false,"comment":"Do not withdraw directly to the Crowdfunding or ICO address as your account will not be credited with tokens from such sales.", "commission_desc":"5 USDT", "currency_confirmations":6 },
701
+ // { "type":"deposit", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"10", "max":"0", "enabled":true,"comment":"Minimum deposit amount is 10 USDT", "commission_desc":"0%", "currency_confirmations":2 },
702
+ // { "type":"withdraw", "name":"USDT (ERC20)", "currency_name":"USDT", "min":"55", "max":"200000", "enabled":true, "comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Recommendation: Due to the high load of ERC20 network, using TRC20 address for withdrawal is recommended.", "commission_desc":"10 USDT", "currency_confirmations":6 },
703
+ // { "type":"deposit", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"100000", "enabled":true,"comment":"Minimum deposit amount is 10 USDT. Only TRON main network supported", "commission_desc":"0%", "currency_confirmations":2 },
704
+ // { "type":"withdraw", "name":"USDT (TRC20)", "currency_name":"USDT", "min":"10", "max":"150000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales. Only TRON main network supported.", "commission_desc":"1 USDT", "currency_confirmations":6 }
705
+ // ],
706
+ // "XLM":[
707
+ // { "type":"deposit", "name":"XLM", "currency_name":"XLM", "min":"1", "max":"1000000", "enabled":true,"comment":"Attention! A deposit without memo(invoice) will not be credited. Minimum deposit amount is 1 XLM. We do not support BSC and BEP20 network, please consider this when sending funds", "commission_desc":"0%", "currency_confirmations":1 },
708
+ // { "type":"withdraw", "name":"XLM", "currency_name":"XLM", "min":"21", "max":"1000000", "enabled":true,"comment":"Caution! Do not withdraw directly to a crowdfund or ICO address, as your account will not be credited with tokens from such sales.", "commission_desc":"0.01 XLM", "currency_confirmations":1 }
709
+ // ],
710
+ // }
711
+ //
712
+ const responses = await Promise.all(promises);
713
+ const currencyList = responses[0];
714
+ const cryptoList = responses[1];
715
+ const result = {};
716
+ for (let i = 0; i < currencyList.length; i++) {
717
+ const currency = currencyList[i];
718
+ const currencyId = this.safeString(currency, 'name');
719
+ const code = this.safeCurrencyCode(currencyId);
720
+ let type = 'crypto';
721
+ const networks = {};
722
+ const providers = this.safeList(cryptoList, currencyId);
723
+ if (providers === undefined) {
724
+ type = 'fiat';
725
+ }
726
+ else {
727
+ for (let j = 0; j < providers.length; j++) {
728
+ const provider = providers[j];
729
+ const name = this.safeString(provider, 'name');
730
+ // get network-id by removing extra things
731
+ let networkId = name.replace(currencyId + ' ', '');
732
+ networkId = networkId.replace('(', '');
733
+ const replaceChar = ')'; // transpiler trick
734
+ networkId = networkId.replace(replaceChar, '');
735
+ const networkCode = this.networkIdToCode(networkId);
736
+ if (!(networkCode in networks)) {
737
+ networks[networkCode] = {
738
+ 'id': networkId,
739
+ 'network': networkCode,
740
+ 'active': undefined,
741
+ 'deposit': undefined,
742
+ 'withdraw': undefined,
743
+ 'fee': undefined,
744
+ 'limits': {
745
+ 'withdraw': {
746
+ 'min': undefined,
747
+ 'max': undefined,
748
+ },
749
+ 'deposit': {
750
+ 'min': undefined,
751
+ 'max': undefined,
752
+ },
753
+ },
754
+ 'info': [], // set as array, because of multiple network sub-entries
755
+ };
756
+ }
757
+ const typeInner = this.safeString(provider, 'type');
758
+ const minValue = this.safeString(provider, 'min');
759
+ const maxValue = this.safeString(provider, 'max');
760
+ const activeProvider = this.safeBool(provider, 'enabled');
761
+ const networkEntry = networks[networkCode];
762
+ if (typeInner === 'deposit') {
763
+ networkEntry['deposit'] = activeProvider;
764
+ networkEntry['limits']['deposit']['min'] = minValue;
765
+ networkEntry['limits']['deposit']['max'] = maxValue;
766
+ }
767
+ else if (typeInner === 'withdraw') {
768
+ networkEntry['withdraw'] = activeProvider;
769
+ networkEntry['limits']['withdraw']['min'] = minValue;
770
+ networkEntry['limits']['withdraw']['max'] = maxValue;
771
+ }
772
+ const info = this.safeList(networkEntry, 'info');
773
+ info.push(provider);
774
+ networkEntry['info'] = info;
775
+ networks[networkCode] = networkEntry;
776
+ }
777
+ }
778
+ result[code] = this.safeCurrencyStructure({
779
+ 'id': currencyId,
780
+ 'code': code,
781
+ 'name': this.safeString(currency, 'description'),
782
+ 'type': type,
783
+ 'active': undefined,
784
+ 'deposit': undefined,
785
+ 'withdraw': undefined,
786
+ 'fee': undefined,
787
+ 'precision': this.parseNumber('1e-8'),
788
+ 'limits': {
789
+ 'withdraw': {
790
+ 'min': undefined,
791
+ 'max': undefined,
792
+ },
793
+ 'deposit': {
794
+ 'min': undefined,
795
+ 'max': undefined,
796
+ },
797
+ },
798
+ 'info': {
799
+ 'currency': currency,
800
+ 'providers': providers,
801
+ },
802
+ 'networks': networks,
803
+ });
804
+ }
805
+ return result;
806
+ }
807
+ /**
808
+ * @method
809
+ * @name exmo#fetchMarkets
810
+ * @description retrieves data on all markets for exmo
811
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#7de7e75c-5833-45a8-b937-c2276d235aaa
812
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
813
+ * @returns {object[]} an array of objects representing market data
814
+ */
815
+ async fetchMarkets(params = {}) {
816
+ const promises = [];
817
+ promises.push(this.publicGetPairSettings(params));
818
+ //
819
+ // {
820
+ // "BTC_USD":{
821
+ // "min_quantity":"0.0001",
822
+ // "max_quantity":"1000",
823
+ // "min_price":"1",
824
+ // "max_price":"30000",
825
+ // "max_amount":"500000",
826
+ // "min_amount":"1",
827
+ // "price_precision":8,
828
+ // "commission_taker_percent":"0.4",
829
+ // "commission_maker_percent":"0.4"
830
+ // },
831
+ // }
832
+ //
833
+ let marginPairsDict = {};
834
+ const fetchMargin = this.checkRequiredCredentials(false);
835
+ if (fetchMargin) {
836
+ promises.push(this.privatePostMarginPairList(params));
837
+ //
838
+ // {
839
+ // "pairs": [
840
+ // {
841
+ // "buy_price": "55978.85",
842
+ // "default_leverage": "3",
843
+ // "is_fair_price": true,
844
+ // "last_trade_price": "55999.23",
845
+ // "liquidation_fee": "2",
846
+ // "liquidation_level": "10",
847
+ // "margin_call_level": "15",
848
+ // "max_leverage": "3",
849
+ // "max_order_price": "150000",
850
+ // "max_order_quantity": "1",
851
+ // "max_position_quantity": "1",
852
+ // "max_price_precision": 2,
853
+ // "min_order_price": "1",
854
+ // "min_order_quantity": "0.00002",
855
+ // "name": "BTC_USD",
856
+ // "position": 1,
857
+ // "sell_price": "55985.51",
858
+ // "ticker_updated": "1619019818936107989",
859
+ // "trade_maker_fee": "0",
860
+ // "trade_taker_fee": "0.05",
861
+ // "updated": "1619008608955599013"
862
+ // }
863
+ // ]
864
+ // }
865
+ //
866
+ }
867
+ const responses = await Promise.all(promises);
868
+ const spotResponse = responses[0];
869
+ if (fetchMargin) {
870
+ const marginPairs = responses[1];
871
+ const pairs = this.safeList(marginPairs, 'pairs');
872
+ marginPairsDict = this.indexBy(pairs, 'name');
873
+ }
874
+ const keys = Object.keys(spotResponse);
875
+ const result = [];
876
+ for (let i = 0; i < keys.length; i++) {
877
+ const id = keys[i];
878
+ const market = spotResponse[id];
879
+ const marginMarket = this.safeDict(marginPairsDict, id);
880
+ const symbol = id.replace('_', '/');
881
+ const [baseId, quoteId] = symbol.split('/');
882
+ const base = this.safeCurrencyCode(baseId);
883
+ const quote = this.safeCurrencyCode(quoteId);
884
+ const takerString = this.safeString(market, 'commission_taker_percent');
885
+ const makerString = this.safeString(market, 'commission_maker_percent');
886
+ const maxQuantity = this.safeString(market, 'max_quantity');
887
+ const marginMaxQuantity = this.safeString(marginMarket, 'max_order_quantity');
888
+ result.push({
889
+ 'id': id,
890
+ 'symbol': symbol,
891
+ 'base': base,
892
+ 'quote': quote,
893
+ 'settle': undefined,
894
+ 'baseId': baseId,
895
+ 'quoteId': quoteId,
896
+ 'settleId': undefined,
897
+ 'type': 'spot',
898
+ 'spot': true,
899
+ 'margin': marginMarket !== undefined,
900
+ 'swap': false,
901
+ 'future': false,
902
+ 'option': false,
903
+ 'active': undefined,
904
+ 'contract': false,
905
+ 'linear': undefined,
906
+ 'inverse': undefined,
907
+ 'taker': this.parseNumber(Precise.stringDiv(takerString, '100')),
908
+ 'maker': this.parseNumber(Precise.stringDiv(makerString, '100')),
909
+ 'contractSize': undefined,
910
+ 'expiry': undefined,
911
+ 'expiryDatetime': undefined,
912
+ 'strike': undefined,
913
+ 'optionType': undefined,
914
+ 'precision': {
915
+ 'amount': this.parseNumber('1e-8'),
916
+ 'price': this.parseNumber(this.parsePrecision(this.safeString(market, 'price_precision'))),
917
+ },
918
+ 'limits': {
919
+ 'leverage': {
920
+ 'min': undefined,
921
+ 'max': this.safeNumber(market, 'leverage'),
922
+ },
923
+ 'amount': {
924
+ 'min': this.safeNumber(market, 'min_quantity'),
925
+ 'max': this.parseNumber(Precise.stringMax(maxQuantity, marginMaxQuantity)),
926
+ },
927
+ 'price': {
928
+ 'min': this.safeNumber(market, 'min_price'),
929
+ 'max': this.safeNumber(market, 'max_price'),
930
+ },
931
+ 'cost': {
932
+ 'min': this.safeNumber(market, 'min_amount'),
933
+ 'max': this.safeNumber(market, 'max_amount'),
934
+ },
935
+ },
936
+ 'created': undefined,
937
+ 'info': market,
938
+ });
939
+ }
940
+ return result;
941
+ }
942
+ /**
943
+ * @method
944
+ * @name exmo#fetchOHLCV
945
+ * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
946
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#65eeb949-74e5-4631-9184-c38387fe53e8
947
+ * @param {string} symbol unified symbol of the market to fetch OHLCV data for
948
+ * @param {string} timeframe the length of time each candle represents
949
+ * @param {int} [since] timestamp in ms of the earliest candle to fetch
950
+ * @param {int} [limit] the maximum amount of candles to fetch
951
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
952
+ * @param {int} [params.until] timestamp in ms of the latest candle to fetch
953
+ * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
954
+ */
955
+ async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
956
+ await this.loadMarkets();
957
+ const market = this.market(symbol);
958
+ const until = this.safeIntegerProduct(params, 'until', 0.001);
959
+ const untilIsDefined = (until !== undefined);
960
+ const request = {
961
+ 'symbol': market['id'],
962
+ 'resolution': this.safeString(this.timeframes, timeframe, timeframe),
963
+ };
964
+ const maxLimit = 3000;
965
+ const duration = this.parseTimeframe(timeframe);
966
+ const now = this.parseToInt(this.milliseconds() / 1000);
967
+ if (since === undefined) {
968
+ const to = untilIsDefined ? Math.min(until, now) : now;
969
+ if (limit === undefined) {
970
+ limit = 1000; // cap default at generous amount
971
+ }
972
+ else {
973
+ limit = Math.min(limit, maxLimit);
974
+ }
975
+ request['from'] = to - (limit * duration) - 1;
976
+ request['to'] = to;
977
+ }
978
+ else {
979
+ request['from'] = this.parseToInt(since / 1000);
980
+ if (untilIsDefined) {
981
+ request['to'] = Math.min(until, now);
982
+ }
983
+ else {
984
+ if (limit === undefined) {
985
+ limit = maxLimit;
986
+ }
987
+ else {
988
+ limit = Math.min(limit, maxLimit);
989
+ }
990
+ const to = this.sum(since, limit * duration);
991
+ request['to'] = Math.min(to, now);
992
+ }
993
+ }
994
+ params = this.omit(params, 'until');
995
+ const response = await this.publicGetCandlesHistory(this.extend(request, params));
996
+ //
997
+ // {
998
+ // "candles":[
999
+ // {"t":1584057600000,"o":0.02235144,"c":0.02400233,"h":0.025171,"l":0.02221,"v":5988.34031761},
1000
+ // {"t":1584144000000,"o":0.0240373,"c":0.02367413,"h":0.024399,"l":0.0235,"v":2027.82522329},
1001
+ // {"t":1584230400000,"o":0.02363458,"c":0.02319242,"h":0.0237948,"l":0.02223196,"v":1707.96944997},
1002
+ // ]
1003
+ // }
1004
+ //
1005
+ const candles = this.safeList(response, 'candles', []);
1006
+ return this.parseOHLCVs(candles, market, timeframe, since, limit);
1007
+ }
1008
+ parseOHLCV(ohlcv, market = undefined) {
1009
+ //
1010
+ // {
1011
+ // "t":1584057600000,
1012
+ // "o":0.02235144,
1013
+ // "c":0.02400233,
1014
+ // "h":0.025171,
1015
+ // "l":0.02221,
1016
+ // "v":5988.34031761
1017
+ // }
1018
+ //
1019
+ return [
1020
+ this.safeInteger(ohlcv, 't'),
1021
+ this.safeNumber(ohlcv, 'o'),
1022
+ this.safeNumber(ohlcv, 'h'),
1023
+ this.safeNumber(ohlcv, 'l'),
1024
+ this.safeNumber(ohlcv, 'c'),
1025
+ this.safeNumber(ohlcv, 'v'),
1026
+ ];
1027
+ }
1028
+ parseBalance(response) {
1029
+ const result = { 'info': response };
1030
+ const wallets = this.safeValue(response, 'wallets');
1031
+ if (wallets !== undefined) {
1032
+ const currencyIds = Object.keys(wallets);
1033
+ for (let i = 0; i < currencyIds.length; i++) {
1034
+ const currencyId = currencyIds[i];
1035
+ const item = wallets[currencyId];
1036
+ const currency = this.safeCurrencyCode(currencyId);
1037
+ const account = this.account();
1038
+ account['used'] = this.safeString(item, 'used');
1039
+ account['free'] = this.safeString(item, 'free');
1040
+ account['total'] = this.safeString(item, 'balance');
1041
+ result[currency] = account;
1042
+ }
1043
+ }
1044
+ else {
1045
+ const free = this.safeValue(response, 'balances', {});
1046
+ const used = this.safeValue(response, 'reserved', {});
1047
+ const currencyIds = Object.keys(free);
1048
+ for (let i = 0; i < currencyIds.length; i++) {
1049
+ const currencyId = currencyIds[i];
1050
+ const code = this.safeCurrencyCode(currencyId);
1051
+ const account = this.account();
1052
+ if (currencyId in free) {
1053
+ account['free'] = this.safeString(free, currencyId);
1054
+ }
1055
+ if (currencyId in used) {
1056
+ account['used'] = this.safeString(used, currencyId);
1057
+ }
1058
+ result[code] = account;
1059
+ }
1060
+ }
1061
+ return this.safeBalance(result);
1062
+ }
1063
+ /**
1064
+ * @method
1065
+ * @name exmo#fetchBalance
1066
+ * @description query for balance and get the amount of funds available for trading or funds locked in orders
1067
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#59c5160f-27a1-4d9a-8cfb-7979c7ffaac6
1068
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8388df7-1f9f-4d41-81c4-5a387d171dc6
1069
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1070
+ * @param {string} [params.marginMode] *isolated* fetches the isolated margin balance
1071
+ * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
1072
+ */
1073
+ async fetchBalance(params = {}) {
1074
+ await this.loadMarkets();
1075
+ let marginMode = undefined;
1076
+ [marginMode, params] = this.handleMarginModeAndParams('fetchBalance', params);
1077
+ if (marginMode === 'cross') {
1078
+ throw new BadRequest(this.id + ' does not support cross margin');
1079
+ }
1080
+ let response = undefined;
1081
+ if (marginMode === 'isolated') {
1082
+ response = await this.privatePostMarginUserWalletList(params);
1083
+ //
1084
+ // {
1085
+ // "wallets": {
1086
+ // "USD": {
1087
+ // "balance": "1000",
1088
+ // "free": "600",
1089
+ // "used": "400"
1090
+ // }
1091
+ // }
1092
+ // }
1093
+ //
1094
+ }
1095
+ else {
1096
+ response = await this.privatePostUserInfo(params);
1097
+ //
1098
+ // {
1099
+ // "uid":131685,
1100
+ // "server_date":1628999600,
1101
+ // "balances":{
1102
+ // "EXM":"0",
1103
+ // "USD":"0",
1104
+ // "EUR":"0",
1105
+ // "GBP":"0",
1106
+ // },
1107
+ // }
1108
+ //
1109
+ }
1110
+ return this.parseBalance(response);
1111
+ }
1112
+ /**
1113
+ * @method
1114
+ * @name exmo#fetchOrderBook
1115
+ * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
1116
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1117
+ * @param {string} symbol unified symbol of the market to fetch the order book for
1118
+ * @param {int} [limit] the maximum amount of order book entries to return
1119
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1120
+ * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
1121
+ */
1122
+ async fetchOrderBook(symbol, limit = undefined, params = {}) {
1123
+ await this.loadMarkets();
1124
+ const market = this.market(symbol);
1125
+ const request = {
1126
+ 'pair': market['id'],
1127
+ };
1128
+ if (limit !== undefined) {
1129
+ request['limit'] = limit;
1130
+ }
1131
+ const response = await this.publicGetOrderBook(this.extend(request, params));
1132
+ const result = this.safeDict(response, market['id']);
1133
+ return this.parseOrderBook(result, market['symbol'], undefined, 'bid', 'ask');
1134
+ }
1135
+ /**
1136
+ * @method
1137
+ * @name exmo#fetchOrderBooks
1138
+ * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data for multiple markets
1139
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c60c51a8-e683-4f45-a000-820723d37871
1140
+ * @param {string[]|undefined} symbols list of unified market symbols, all symbols fetched if undefined, default is undefined
1141
+ * @param {int} [limit] max number of entries per orderbook to return, default is undefined
1142
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1143
+ * @returns {object} a dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbol
1144
+ */
1145
+ async fetchOrderBooks(symbols = undefined, limit = undefined, params = {}) {
1146
+ await this.loadMarkets();
1147
+ let ids = undefined;
1148
+ if (symbols === undefined) {
1149
+ ids = this.ids.join(',');
1150
+ // max URL length is 2083 symbols, including http schema, hostname, tld, etc...
1151
+ if (ids.length > 2048) {
1152
+ const numIds = this.ids.length;
1153
+ throw new ExchangeError(this.id + ' fetchOrderBooks() has ' + numIds.toString() + ' symbols exceeding max URL length, you are required to specify a list of symbols in the first argument to fetchOrderBooks');
1154
+ }
1155
+ }
1156
+ else {
1157
+ ids = this.marketIds(symbols);
1158
+ ids = ids.join(',');
1159
+ }
1160
+ const request = {
1161
+ 'pair': ids,
1162
+ };
1163
+ if (limit !== undefined) {
1164
+ request['limit'] = limit;
1165
+ }
1166
+ const response = await this.publicGetOrderBook(this.extend(request, params));
1167
+ const result = {};
1168
+ const marketIds = Object.keys(response);
1169
+ for (let i = 0; i < marketIds.length; i++) {
1170
+ const marketId = marketIds[i];
1171
+ const symbol = this.safeSymbol(marketId);
1172
+ result[symbol] = this.parseOrderBook(response[marketId], symbol, undefined, 'bid', 'ask');
1173
+ }
1174
+ return result;
1175
+ }
1176
+ parseTicker(ticker, market = undefined) {
1177
+ //
1178
+ // {
1179
+ // "buy_price":"0.00002996",
1180
+ // "sell_price":"0.00003002",
1181
+ // "last_trade":"0.00002992",
1182
+ // "high":"0.00003028",
1183
+ // "low":"0.00002935",
1184
+ // "avg":"0.00002963",
1185
+ // "vol":"1196546.3163222",
1186
+ // "vol_curr":"35.80066578",
1187
+ // "updated":1642291733
1188
+ // }
1189
+ //
1190
+ const timestamp = this.safeTimestamp(ticker, 'updated');
1191
+ market = this.safeMarket(undefined, market);
1192
+ const last = this.safeString(ticker, 'last_trade');
1193
+ return this.safeTicker({
1194
+ 'symbol': market['symbol'],
1195
+ 'timestamp': timestamp,
1196
+ 'datetime': this.iso8601(timestamp),
1197
+ 'high': this.safeString(ticker, 'high'),
1198
+ 'low': this.safeString(ticker, 'low'),
1199
+ 'bid': this.safeString(ticker, 'buy_price'),
1200
+ 'bidVolume': undefined,
1201
+ 'ask': this.safeString(ticker, 'sell_price'),
1202
+ 'askVolume': undefined,
1203
+ 'vwap': undefined,
1204
+ 'open': undefined,
1205
+ 'close': last,
1206
+ 'last': last,
1207
+ 'previousClose': undefined,
1208
+ 'change': undefined,
1209
+ 'percentage': undefined,
1210
+ 'average': this.safeString(ticker, 'avg'),
1211
+ 'baseVolume': this.safeString(ticker, 'vol'),
1212
+ 'quoteVolume': this.safeString(ticker, 'vol_curr'),
1213
+ 'info': ticker,
1214
+ }, market);
1215
+ }
1216
+ /**
1217
+ * @method
1218
+ * @name exmo#fetchTickers
1219
+ * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1220
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1221
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1222
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1223
+ * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
1224
+ */
1225
+ async fetchTickers(symbols = undefined, params = {}) {
1226
+ await this.loadMarkets();
1227
+ symbols = this.marketSymbols(symbols);
1228
+ const response = await this.publicGetTicker(params);
1229
+ //
1230
+ // {
1231
+ // "ADA_BTC":{
1232
+ // "buy_price":"0.00002996",
1233
+ // "sell_price":"0.00003002",
1234
+ // "last_trade":"0.00002992",
1235
+ // "high":"0.00003028",
1236
+ // "low":"0.00002935",
1237
+ // "avg":"0.00002963",
1238
+ // "vol":"1196546.3163222",
1239
+ // "vol_curr":"35.80066578",
1240
+ // "updated":1642291733
1241
+ // }
1242
+ // }
1243
+ //
1244
+ const result = {};
1245
+ const marketIds = Object.keys(response);
1246
+ for (let i = 0; i < marketIds.length; i++) {
1247
+ const marketId = marketIds[i];
1248
+ const market = this.safeMarket(marketId, undefined, '_');
1249
+ const symbol = market['symbol'];
1250
+ const ticker = this.safeValue(response, marketId);
1251
+ result[symbol] = this.parseTicker(ticker, market);
1252
+ }
1253
+ return this.filterByArrayTickers(result, 'symbol', symbols);
1254
+ }
1255
+ /**
1256
+ * @method
1257
+ * @name exmo#fetchTicker
1258
+ * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1259
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#4c8e6459-3503-4361-b012-c34bb9f7e385
1260
+ * @param {string} symbol unified symbol of the market to fetch the ticker for
1261
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1262
+ * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
1263
+ */
1264
+ async fetchTicker(symbol, params = {}) {
1265
+ await this.loadMarkets();
1266
+ const response = await this.publicGetTicker(params);
1267
+ const market = this.market(symbol);
1268
+ return this.parseTicker(response[market['id']], market);
1269
+ }
1270
+ parseTrade(trade, market = undefined) {
1271
+ //
1272
+ // fetchTrades (public)
1273
+ //
1274
+ // {
1275
+ // "trade_id":165087520,
1276
+ // "date":1587470005,
1277
+ // "type":"buy",
1278
+ // "quantity":"1.004",
1279
+ // "price":"0.02491461",
1280
+ // "amount":"0.02501426"
1281
+ // },
1282
+ //
1283
+ // fetchMyTrades, fetchOrderTrades
1284
+ //
1285
+ // {
1286
+ // "trade_id": 3,
1287
+ // "date": 1435488248,
1288
+ // "type": "buy",
1289
+ // "pair": "BTC_USD",
1290
+ // "order_id": 12345,
1291
+ // "quantity": 1,
1292
+ // "price": 100,
1293
+ // "amount": 100,
1294
+ // "exec_type": "taker",
1295
+ // "commission_amount": "0.02",
1296
+ // "commission_currency": "BTC",
1297
+ // "commission_percent": "0.2"
1298
+ // }
1299
+ //
1300
+ // fetchMyTrades (margin)
1301
+ //
1302
+ // {
1303
+ // "trade_id": "692861757015952517",
1304
+ // "trade_dt": "1693951853197811824",
1305
+ // "trade_type": "buy",
1306
+ // "pair": "ADA_USDT",
1307
+ // "quantity": "1.96607879",
1308
+ // "price": "0.2568",
1309
+ // "amount": "0.50488903"
1310
+ // }
1311
+ //
1312
+ const timestamp = this.safeTimestamp(trade, 'date');
1313
+ const id = this.safeString(trade, 'trade_id');
1314
+ const orderId = this.safeString(trade, 'order_id');
1315
+ const priceString = this.safeString(trade, 'price');
1316
+ const amountString = this.safeString(trade, 'quantity');
1317
+ const costString = this.safeString(trade, 'amount');
1318
+ const side = this.safeString2(trade, 'type', 'trade_type');
1319
+ const type = undefined;
1320
+ const marketId = this.safeString(trade, 'pair');
1321
+ market = this.safeMarket(marketId, market, '_');
1322
+ const symbol = market['symbol'];
1323
+ const isMaker = this.safeValue(trade, 'is_maker');
1324
+ let takerOrMakerDefault = undefined;
1325
+ if (isMaker !== undefined) {
1326
+ takerOrMakerDefault = isMaker ? 'maker' : 'taker';
1327
+ }
1328
+ const takerOrMaker = this.safeString(trade, 'exec_type', takerOrMakerDefault);
1329
+ let fee = undefined;
1330
+ const feeCostString = this.safeString(trade, 'commission_amount');
1331
+ if (feeCostString !== undefined) {
1332
+ const feeCurrencyId = this.safeString(trade, 'commission_currency');
1333
+ const feeCurrencyCode = this.safeCurrencyCode(feeCurrencyId);
1334
+ let feeRateString = this.safeString(trade, 'commission_percent');
1335
+ if (feeRateString !== undefined) {
1336
+ feeRateString = Precise.stringDiv(feeRateString, '1000', 18);
1337
+ }
1338
+ fee = {
1339
+ 'cost': feeCostString,
1340
+ 'currency': feeCurrencyCode,
1341
+ 'rate': feeRateString,
1342
+ };
1343
+ }
1344
+ return this.safeTrade({
1345
+ 'id': id,
1346
+ 'info': trade,
1347
+ 'timestamp': timestamp,
1348
+ 'datetime': this.iso8601(timestamp),
1349
+ 'symbol': symbol,
1350
+ 'order': orderId,
1351
+ 'type': type,
1352
+ 'side': side,
1353
+ 'takerOrMaker': takerOrMaker,
1354
+ 'price': priceString,
1355
+ 'amount': amountString,
1356
+ 'cost': costString,
1357
+ 'fee': fee,
1358
+ }, market);
1359
+ }
1360
+ /**
1361
+ * @method
1362
+ * @name exmo#fetchTrades
1363
+ * @description get the list of most recent trades for a particular symbol
1364
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#5a5a9c0d-cf17-47f6-9d62-6d4404ebd5ac
1365
+ * @param {string} symbol unified symbol of the market to fetch trades for
1366
+ * @param {int} [since] timestamp in ms of the earliest trade to fetch
1367
+ * @param {int} [limit] the maximum amount of trades to fetch
1368
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1369
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
1370
+ */
1371
+ async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
1372
+ await this.loadMarkets();
1373
+ const market = this.market(symbol);
1374
+ const request = {
1375
+ 'pair': market['id'],
1376
+ };
1377
+ const response = await this.publicGetTrades(this.extend(request, params));
1378
+ //
1379
+ // {
1380
+ // "ETH_BTC":[
1381
+ // {
1382
+ // "trade_id":165087520,
1383
+ // "date":1587470005,
1384
+ // "type":"buy",
1385
+ // "quantity":"1.004",
1386
+ // "price":"0.02491461",
1387
+ // "amount":"0.02501426"
1388
+ // },
1389
+ // {
1390
+ // "trade_id":165087369,
1391
+ // "date":1587469938,
1392
+ // "type":"buy",
1393
+ // "quantity":"0.94",
1394
+ // "price":"0.02492348",
1395
+ // "amount":"0.02342807"
1396
+ // }
1397
+ // ]
1398
+ // }
1399
+ //
1400
+ const data = this.safeList(response, market['id'], []);
1401
+ return this.parseTrades(data, market, since, limit);
1402
+ }
1403
+ /**
1404
+ * @method
1405
+ * @name exmo#fetchMyTrades
1406
+ * @description fetch all trades made by the user
1407
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#b8d8d9af-4f46-46a1-939b-ad261d79f452 // spot
1408
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#f4b1aaf8-399f-403b-ab5e-4926d967a106 // margin
1409
+ * @param {string} symbol a symbol is required but it can be a single string, or a non-empty array
1410
+ * @param {int} [since] the earliest time in ms to fetch trades for
1411
+ * @param {int} [limit] *required for margin orders* the maximum number of trades structures to retrieve
1412
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1413
+ *
1414
+ * EXCHANGE SPECIFIC PARAMETERS
1415
+ * @param {int} [params.offset] last deal offset, default = 0
1416
+ * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1417
+ */
1418
+ async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1419
+ if (symbol === undefined) {
1420
+ throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
1421
+ }
1422
+ let marginMode = undefined;
1423
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
1424
+ if (marginMode === 'cross') {
1425
+ throw new BadRequest(this.id + ' only isolated margin is supported');
1426
+ }
1427
+ await this.loadMarkets();
1428
+ const market = this.market(symbol);
1429
+ const pair = market['id'];
1430
+ const isSpot = marginMode !== 'isolated';
1431
+ if (limit === undefined) {
1432
+ limit = 100;
1433
+ }
1434
+ const request = {};
1435
+ if (isSpot) {
1436
+ request['pair'] = pair;
1437
+ }
1438
+ else {
1439
+ request['pair_name'] = pair;
1440
+ }
1441
+ if (limit !== undefined) {
1442
+ request['limit'] = limit;
1443
+ }
1444
+ const offset = this.safeInteger(params, 'offset', 0);
1445
+ request['offset'] = offset;
1446
+ let response = undefined;
1447
+ if (isSpot) {
1448
+ response = await this.privatePostUserTrades(this.extend(request, params));
1449
+ //
1450
+ // {
1451
+ // "BTC_USD": [
1452
+ // {
1453
+ // "trade_id": 20056872,
1454
+ // "client_id": 100500,
1455
+ // "date": 1435488248,
1456
+ // "type": "buy",
1457
+ // "pair": "BTC_USD",
1458
+ // "quantity": "1",
1459
+ // "price": "100",
1460
+ // "amount": "100",
1461
+ // "order_id": 7,
1462
+ // "parent_order_id": 117684023830293,
1463
+ // "exec_type": "taker",
1464
+ // "commission_amount": "0.02",
1465
+ // "commission_currency": "BTC",
1466
+ // "commission_percent": "0.2"
1467
+ // }
1468
+ // ],
1469
+ // ...
1470
+ // }
1471
+ //
1472
+ }
1473
+ else {
1474
+ const responseFromExchange = await this.privatePostMarginTrades(this.extend(request, params));
1475
+ //
1476
+ // {
1477
+ // "trades": {
1478
+ // "ADA_USDT": [
1479
+ // {
1480
+ // "trade_id": "692861757015952517",
1481
+ // "trade_dt": "1693951853197811824",
1482
+ // "trade_type": "buy",
1483
+ // "pair": "ADA_USDT",
1484
+ // "quantity": "1.96607879",
1485
+ // "price": "0.2568",
1486
+ // "amount": "0.50488903"
1487
+ // },
1488
+ // ]
1489
+ // ...
1490
+ // }
1491
+ // }
1492
+ //
1493
+ response = this.safeValue(responseFromExchange, 'trades');
1494
+ }
1495
+ let result = [];
1496
+ const marketIdsInner = Object.keys(response);
1497
+ for (let i = 0; i < marketIdsInner.length; i++) {
1498
+ const marketId = marketIdsInner[i];
1499
+ const resultMarket = this.safeMarket(marketId, undefined, '_');
1500
+ const items = response[marketId];
1501
+ const trades = this.parseTrades(items, resultMarket, since, limit);
1502
+ result = this.arrayConcat(result, trades);
1503
+ }
1504
+ return this.filterBySinceLimit(result, since, limit);
1505
+ }
1506
+ /**
1507
+ * @method
1508
+ * @name exmo#createMarketOrderWithCost
1509
+ * @description create a market order by providing the symbol, side and cost
1510
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1511
+ * @param {string} symbol unified symbol of the market to create an order in
1512
+ * @param {string} side 'buy' or 'sell'
1513
+ * @param {float} cost how much you want to trade in units of the quote currency
1514
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1515
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1516
+ */
1517
+ async createMarketOrderWithCost(symbol, side, cost, params = {}) {
1518
+ await this.loadMarkets();
1519
+ params = this.extend(params, { 'cost': cost });
1520
+ return await this.createOrder(symbol, 'market', side, cost, undefined, params);
1521
+ }
1522
+ /**
1523
+ * @method
1524
+ * @name exmo#createMarketBuyOrderWithCost
1525
+ * @description create a market buy order by providing the symbol and cost
1526
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1527
+ * @param {string} symbol unified symbol of the market to create an order in
1528
+ * @param {float} cost how much you want to trade in units of the quote currency
1529
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1530
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1531
+ */
1532
+ async createMarketBuyOrderWithCost(symbol, cost, params = {}) {
1533
+ await this.loadMarkets();
1534
+ params = this.extend(params, { 'cost': cost });
1535
+ return await this.createOrder(symbol, 'market', 'buy', cost, undefined, params);
1536
+ }
1537
+ /**
1538
+ * @method
1539
+ * @name exmo#createMarketSellOrderWithCost
1540
+ * @description create a market sell order by providing the symbol and cost
1541
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1542
+ * @param {string} symbol unified symbol of the market to create an order in
1543
+ * @param {float} cost how much you want to trade in units of the quote currency
1544
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1545
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1546
+ */
1547
+ async createMarketSellOrderWithCost(symbol, cost, params = {}) {
1548
+ await this.loadMarkets();
1549
+ params = this.extend(params, { 'cost': cost });
1550
+ return await this.createOrder(symbol, 'market', 'sell', cost, undefined, params);
1551
+ }
1552
+ /**
1553
+ * @method
1554
+ * @name exmo#createOrder
1555
+ * @description create a trade order
1556
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#80daa469-ec59-4d0a-b229-6a311d8dd1cd
1557
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#de6f4321-eeac-468c-87f7-c4ad7062e265 // stop market
1558
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#3561b86c-9ff1-436e-8e68-ac926b7eb523 // margin
1559
+ * @param {string} symbol unified symbol of the market to create an order in
1560
+ * @param {string} type 'market' or 'limit'
1561
+ * @param {string} side 'buy' or 'sell'
1562
+ * @param {float} amount how much of currency you want to trade in units of base currency
1563
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1564
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1565
+ * @param {float} [params.triggerPrice] the price at which a trigger order is triggered at
1566
+ * @param {string} [params.timeInForce] *spot only* 'fok', 'ioc' or 'post_only'
1567
+ * @param {boolean} [params.postOnly] *spot only* true for post only orders
1568
+ * @param {float} [params.cost] *spot only* *market orders only* the cost of the order in the quote currency for market orders
1569
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1570
+ */
1571
+ async createOrder(symbol, type, side, amount, price = undefined, params = {}) {
1572
+ await this.loadMarkets();
1573
+ const market = this.market(symbol);
1574
+ const isMarket = (type === 'market') && (price === undefined);
1575
+ let marginMode = undefined;
1576
+ [marginMode, params] = this.handleMarginModeAndParams('createOrder', params);
1577
+ if (marginMode === 'cross') {
1578
+ throw new BadRequest(this.id + ' only supports isolated margin');
1579
+ }
1580
+ const isSpot = (marginMode !== 'isolated');
1581
+ const triggerPrice = this.safeStringN(params, ['triggerPrice', 'stopPrice', 'stop_price']);
1582
+ const cost = this.safeString(params, 'cost');
1583
+ const request = {
1584
+ 'pair': market['id'],
1585
+ // 'leverage': 2,
1586
+ // 'quantity': this.amountToPrecision (market['symbol'], amount),
1587
+ // spot - buy, sell, market_buy, market_sell, market_buy_total, market_sell_total
1588
+ // margin - limit_buy, limit_sell, market_buy, market_sell, stop_buy, stop_sell, stop_limit_buy, stop_limit_sell, trailing_stop_buy, trailing_stop_sell
1589
+ // 'stop_price': this.priceToPrecision (symbol, stopPrice),
1590
+ // 'distance': 0, // distance for trailing stop orders
1591
+ // 'expire': 0, // expiration timestamp in UTC timezone for the order, unless expire is 0
1592
+ // 'client_id': 123, // optional, must be a positive integer
1593
+ // 'comment': '', // up to 50 latin symbols, whitespaces, underscores
1594
+ };
1595
+ if (cost === undefined) {
1596
+ request['quantity'] = this.amountToPrecision(market['symbol'], amount);
1597
+ }
1598
+ else {
1599
+ request['quantity'] = this.costToPrecision(market['symbol'], cost);
1600
+ }
1601
+ let clientOrderId = this.safeValue2(params, 'client_id', 'clientOrderId');
1602
+ if (clientOrderId !== undefined) {
1603
+ clientOrderId = this.safeInteger2(params, 'client_id', 'clientOrderId');
1604
+ if (clientOrderId === undefined) {
1605
+ throw new BadRequest(this.id + ' createOrder() client order id must be an integer / numeric literal');
1606
+ }
1607
+ else {
1608
+ request['client_id'] = clientOrderId;
1609
+ }
1610
+ }
1611
+ const leverage = this.safeNumber(params, 'leverage');
1612
+ if (!isSpot && (leverage === undefined)) {
1613
+ throw new ArgumentsRequired(this.id + ' createOrder requires an extra param params["leverage"] for margin orders');
1614
+ }
1615
+ params = this.omit(params, ['stopPrice', 'stop_price', 'triggerPrice', 'timeInForce', 'client_id', 'clientOrderId', 'cost']);
1616
+ if (price !== undefined) {
1617
+ request['price'] = this.priceToPrecision(market['symbol'], price);
1618
+ }
1619
+ let response = undefined;
1620
+ if (isSpot) {
1621
+ if (triggerPrice !== undefined) {
1622
+ if (type === 'limit') {
1623
+ throw new BadRequest(this.id + ' createOrder () cannot create stop limit orders for spot, only stop market');
1624
+ }
1625
+ else {
1626
+ request['type'] = side;
1627
+ request['trigger_price'] = this.priceToPrecision(symbol, triggerPrice);
1628
+ }
1629
+ response = await this.privatePostStopMarketOrderCreate(this.extend(request, params));
1630
+ }
1631
+ else {
1632
+ const execType = this.safeString(params, 'exec_type');
1633
+ let isPostOnly = undefined;
1634
+ [isPostOnly, params] = this.handlePostOnly(type === 'market', execType === 'post_only', params);
1635
+ const timeInForce = this.safeString(params, 'timeInForce');
1636
+ request['price'] = isMarket ? 0 : this.priceToPrecision(market['symbol'], price);
1637
+ if (type === 'limit') {
1638
+ request['type'] = side;
1639
+ }
1640
+ else if (type === 'market') {
1641
+ const marketSuffix = (cost !== undefined) ? '_total' : '';
1642
+ request['type'] = 'market_' + side + marketSuffix;
1643
+ }
1644
+ if (isPostOnly) {
1645
+ request['exec_type'] = 'post_only';
1646
+ }
1647
+ else if (timeInForce !== undefined) {
1648
+ request['exec_type'] = timeInForce;
1649
+ }
1650
+ response = await this.privatePostOrderCreate(this.extend(request, params));
1651
+ }
1652
+ }
1653
+ else {
1654
+ if (triggerPrice !== undefined) {
1655
+ request['stop_price'] = this.priceToPrecision(symbol, triggerPrice);
1656
+ if (type === 'limit') {
1657
+ request['type'] = 'stop_limit_' + side;
1658
+ }
1659
+ else if (type === 'market') {
1660
+ request['type'] = 'stop_' + side;
1661
+ }
1662
+ else {
1663
+ request['type'] = type;
1664
+ }
1665
+ }
1666
+ else {
1667
+ if (type === 'limit' || type === 'market') {
1668
+ request['type'] = type + '_' + side;
1669
+ }
1670
+ else {
1671
+ request['type'] = type;
1672
+ }
1673
+ }
1674
+ response = await this.privatePostMarginUserOrderCreate(this.extend(request, params));
1675
+ }
1676
+ return this.parseOrder(response, market);
1677
+ }
1678
+ /**
1679
+ * @method
1680
+ * @name exmo#cancelOrder
1681
+ * @description cancels an open order
1682
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#1f710d4b-75bc-4b65-ad68-006f863a3f26
1683
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a4d0aae8-28f7-41ac-94fd-c4030130453d // stop market
1684
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#705dfec5-2b35-4667-862b-faf54eca6209 // margin
1685
+ * @param {string} id order id
1686
+ * @param {string} symbol not used by exmo cancelOrder ()
1687
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1688
+ * @param {boolean} [params.trigger] true to cancel a trigger order
1689
+ * @param {string} [params.marginMode] set to 'cross' or 'isolated' to cancel a margin order
1690
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1691
+ */
1692
+ async cancelOrder(id, symbol = undefined, params = {}) {
1693
+ await this.loadMarkets();
1694
+ const request = {};
1695
+ const trigger = this.safeValue2(params, 'trigger', 'stop');
1696
+ params = this.omit(params, ['trigger', 'stop']);
1697
+ let marginMode = undefined;
1698
+ [marginMode, params] = this.handleMarginModeAndParams('cancelOrder', params);
1699
+ if (marginMode === 'cross') {
1700
+ throw new BadRequest(this.id + ' only supports isolated margin');
1701
+ }
1702
+ let response = undefined;
1703
+ if ((marginMode === 'isolated')) {
1704
+ request['order_id'] = id;
1705
+ response = await this.privatePostMarginUserOrderCancel(this.extend(request, params));
1706
+ //
1707
+ // {}
1708
+ //
1709
+ }
1710
+ else {
1711
+ if (trigger) {
1712
+ request['parent_order_id'] = id;
1713
+ response = await this.privatePostStopMarketOrderCancel(this.extend(request, params));
1714
+ //
1715
+ // {}
1716
+ //
1717
+ }
1718
+ else {
1719
+ request['order_id'] = id;
1720
+ response = await this.privatePostOrderCancel(this.extend(request, params));
1721
+ //
1722
+ // {
1723
+ // "error": '',
1724
+ // "result": True
1725
+ // }
1726
+ //
1727
+ }
1728
+ }
1729
+ return this.parseOrder(response);
1730
+ }
1731
+ /**
1732
+ * @method
1733
+ * @name exmo#fetchOrder
1734
+ * @description *spot only* fetches information on an order made by the user
1735
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 // spot
1736
+ * @param {string} id order id
1737
+ * @param {string} symbol not used by exmo fetchOrder
1738
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1739
+ * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
1740
+ */
1741
+ async fetchOrder(id, symbol = undefined, params = {}) {
1742
+ await this.loadMarkets();
1743
+ const request = {
1744
+ 'order_id': id.toString(),
1745
+ };
1746
+ const response = await this.privatePostOrderTrades(this.extend(request, params));
1747
+ //
1748
+ // {
1749
+ // "type": "buy",
1750
+ // "in_currency": "BTC",
1751
+ // "in_amount": "1",
1752
+ // "out_currency": "USD",
1753
+ // "out_amount": "100",
1754
+ // "trades": [
1755
+ // {
1756
+ // "trade_id": 3,
1757
+ // "date": 1435488248,
1758
+ // "type": "buy",
1759
+ // "pair": "BTC_USD",
1760
+ // "order_id": 12345,
1761
+ // "quantity": 1,
1762
+ // "price": 100,
1763
+ // "amount": 100
1764
+ // }
1765
+ // ]
1766
+ // }
1767
+ //
1768
+ const order = this.parseOrder(response);
1769
+ order['id'] = id.toString();
1770
+ return order;
1771
+ }
1772
+ /**
1773
+ * @method
1774
+ * @name exmo#fetchOrderTrades
1775
+ * @description fetch all the trades made from a single order
1776
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#cf27781e-28e5-4b39-a52d-3110f5d22459 // spot
1777
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#00810661-9119-46c5-aec5-55abe9cb42c7 // margin
1778
+ * @param {string} id order id
1779
+ * @param {string} symbol unified market symbol
1780
+ * @param {int} [since] the earliest time in ms to fetch trades for
1781
+ * @param {int} [limit] the maximum number of trades to retrieve
1782
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1783
+ * @param {string} [params.marginMode] set to "isolated" to fetch trades for a margin order
1784
+ * @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
1785
+ */
1786
+ async fetchOrderTrades(id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
1787
+ let marginMode = undefined;
1788
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrderTrades', params);
1789
+ if (marginMode === 'cross') {
1790
+ throw new BadRequest(this.id + ' only supports isolated margin');
1791
+ }
1792
+ let market = undefined;
1793
+ if (symbol !== undefined) {
1794
+ market = this.market(symbol);
1795
+ }
1796
+ const request = {
1797
+ 'order_id': id.toString(),
1798
+ };
1799
+ let response = undefined;
1800
+ if (marginMode === 'isolated') {
1801
+ response = await this.privatePostMarginUserOrderTrades(this.extend(request, params));
1802
+ //
1803
+ // {
1804
+ // "trades": [
1805
+ // {
1806
+ // "is_maker": false,
1807
+ // "order_id": "123",
1808
+ // "pair": "BTC_USD",
1809
+ // "price": "54122.25",
1810
+ // "quantity": "0.00069994",
1811
+ // "trade_dt": "1619069561718824428",
1812
+ // "trade_id": "692842802860135010",
1813
+ // "type": "sell"
1814
+ // }
1815
+ // ]
1816
+ // }
1817
+ //
1818
+ }
1819
+ else {
1820
+ response = await this.privatePostOrderTrades(this.extend(request, params));
1821
+ //
1822
+ // {
1823
+ // "type": "buy",
1824
+ // "in_currency": "BTC",
1825
+ // "in_amount": "1",
1826
+ // "out_currency": "USD",
1827
+ // "out_amount": "100",
1828
+ // "trades": [
1829
+ // {
1830
+ // "trade_id": 3,
1831
+ // "date": 1435488248,
1832
+ // "type": "buy",
1833
+ // "pair": "BTC_USD",
1834
+ // "order_id": 12345,
1835
+ // "quantity": 1,
1836
+ // "price": 100,
1837
+ // "amount": 100,
1838
+ // "exec_type": "taker",
1839
+ // "commission_amount": "0.02",
1840
+ // "commission_currency": "BTC",
1841
+ // "commission_percent": "0.2"
1842
+ // }
1843
+ // ]
1844
+ // }
1845
+ //
1846
+ }
1847
+ const trades = this.safeList(response, 'trades');
1848
+ return this.parseTrades(trades, market, since, limit);
1849
+ }
1850
+ /**
1851
+ * @method
1852
+ * @name exmo#fetchOpenOrders
1853
+ * @description fetch all unfilled currently open orders
1854
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#0e135370-daa4-4689-8acd-b6876dee9ba1 // spot open orders
1855
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a7cfd4f0-476e-4675-b33f-22a46902f245 // margin
1856
+ * @param {string} symbol unified market symbol
1857
+ * @param {int} [since] the earliest time in ms to fetch open orders for
1858
+ * @param {int} [limit] the maximum number of open orders structures to retrieve
1859
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1860
+ * @param {string} [params.marginMode] set to "isolated" for margin orders
1861
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1862
+ */
1863
+ async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1864
+ await this.loadMarkets();
1865
+ let market = undefined;
1866
+ if (symbol !== undefined) {
1867
+ market = this.market(symbol);
1868
+ symbol = market['symbol'];
1869
+ }
1870
+ let marginMode = undefined;
1871
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOpenOrders', params);
1872
+ const isMargin = ((marginMode === 'cross') || (marginMode === 'isolated'));
1873
+ let response = undefined;
1874
+ let orders = [];
1875
+ if (isMargin) {
1876
+ response = await this.privatePostMarginUserOrderList(params);
1877
+ //
1878
+ // {
1879
+ // "orders": [
1880
+ // {
1881
+ // "client_id": "0",
1882
+ // "comment": "",
1883
+ // "created": "1619068707985325495",
1884
+ // "distance": "0",
1885
+ // "expire": 0,
1886
+ // "funding_currency": "BTC",
1887
+ // "funding_quantity": "0.01",
1888
+ // "funding_rate": "0.02",
1889
+ // "leverage": "2",
1890
+ // "order_id": "123",
1891
+ // "pair": "BTC_USD",
1892
+ // "previous_type": "limit_sell",
1893
+ // "price": "58000",
1894
+ // "quantity": "0.01",
1895
+ // "src": 0,
1896
+ // "stop_price": "0",
1897
+ // "trigger_price": "58000",
1898
+ // "type": "limit_sell",
1899
+ // "updated": 1619068707989411800
1900
+ // }
1901
+ // ]
1902
+ // }
1903
+ //
1904
+ params = this.extend(params, {
1905
+ 'status': 'open',
1906
+ });
1907
+ const responseOrders = this.safeValue(response, 'orders');
1908
+ orders = this.parseOrders(responseOrders, market, since, limit, params);
1909
+ }
1910
+ else {
1911
+ response = await this.privatePostUserOpenOrders(params);
1912
+ //
1913
+ // {
1914
+ // "USDT_USD": [
1915
+ // {
1916
+ // "parent_order_id": "507061384740151010",
1917
+ // "client_id": "100500",
1918
+ // "created": "1589547391",
1919
+ // "type": "stop_market_buy",
1920
+ // "pair": "USDT_USD",
1921
+ // "quantity": "1",
1922
+ // "trigger_price": "5",
1923
+ // "amount": "5"
1924
+ // }
1925
+ // ],
1926
+ // ...
1927
+ // }
1928
+ //
1929
+ const marketIds = Object.keys(response);
1930
+ for (let i = 0; i < marketIds.length; i++) {
1931
+ const marketId = marketIds[i];
1932
+ const marketInner = this.safeMarket(marketId);
1933
+ params = this.extend(params, {
1934
+ 'status': 'open',
1935
+ });
1936
+ const parsedOrders = this.parseOrders(response[marketId], marketInner, since, limit, params);
1937
+ orders = this.arrayConcat(orders, parsedOrders);
1938
+ }
1939
+ }
1940
+ return orders;
1941
+ }
1942
+ parseStatus(status) {
1943
+ if (status === undefined) {
1944
+ return undefined;
1945
+ }
1946
+ const statuses = {
1947
+ 'cancel_started': 'canceled',
1948
+ };
1949
+ if (status.indexOf('cancel') >= 0) {
1950
+ status = 'canceled';
1951
+ }
1952
+ return this.safeString(statuses, status, status);
1953
+ }
1954
+ parseSide(orderType) {
1955
+ const side = {
1956
+ 'limit_buy': 'buy',
1957
+ 'limit_sell': 'sell',
1958
+ 'market_buy': 'buy',
1959
+ 'market_sell': 'sell',
1960
+ 'stop_buy': 'buy',
1961
+ 'stop_sell': 'sell',
1962
+ 'stop_limit_buy': 'buy',
1963
+ 'stop_limit_sell': 'sell',
1964
+ 'trailing_stop_buy': 'buy',
1965
+ 'trailing_stop_sell': 'sell',
1966
+ 'stop_market_sell': 'sell',
1967
+ 'stop_market_buy': 'buy',
1968
+ 'buy': 'buy',
1969
+ 'sell': 'sell',
1970
+ };
1971
+ return this.safeString(side, orderType, orderType);
1972
+ }
1973
+ parseOrder(order, market = undefined) {
1974
+ //
1975
+ // fetchOrders, fetchOpenOrders, fetchClosedOrders, fetchCanceledOrders
1976
+ //
1977
+ // {
1978
+ // "order_id": "14",
1979
+ // "created": "1435517311",
1980
+ // "type": "buy",
1981
+ // "pair": "BTC_USD",
1982
+ // "price": "100",
1983
+ // "quantity": "1",
1984
+ // "amount": "100"
1985
+ // }
1986
+ //
1987
+ // fetchOrder
1988
+ //
1989
+ // {
1990
+ // "type": "buy",
1991
+ // "in_currency": "BTC",
1992
+ // "in_amount": "1",
1993
+ // "out_currency": "USD",
1994
+ // "out_amount": "100",
1995
+ // "trades": [
1996
+ // {
1997
+ // "trade_id": 3,
1998
+ // "date": 1435488248,
1999
+ // "type": "buy",
2000
+ // "pair": "BTC_USD",
2001
+ // "order_id": 12345,
2002
+ // "quantity": 1,
2003
+ // "price": 100,
2004
+ // "amount": 100
2005
+ // }
2006
+ // ]
2007
+ // }
2008
+ //
2009
+ // Margin fetchOpenOrders
2010
+ //
2011
+ // {
2012
+ // "client_id": "0",
2013
+ // "comment": "",
2014
+ // "created": "1619068707985325495",
2015
+ // "distance": "0",
2016
+ // "expire": 0,
2017
+ // "funding_currency": "BTC",
2018
+ // "funding_quantity": "0.01",
2019
+ // "funding_rate": "0.02",
2020
+ // "leverage": "2",
2021
+ // "order_id": "123",
2022
+ // "pair": "BTC_USD",
2023
+ // "previous_type": "limit_sell",
2024
+ // "price": "58000",
2025
+ // "quantity": "0.01",
2026
+ // "src": 0,
2027
+ // "stop_price": "0",
2028
+ // "trigger_price": "58000",
2029
+ // "type": "limit_sell",
2030
+ // "updated": 1619068707989411800
2031
+ // }
2032
+ //
2033
+ // Margin fetchClosedOrders
2034
+ //
2035
+ // {
2036
+ // "distance": "0",
2037
+ // "event_id": "692842802860022508",
2038
+ // "event_time": "1619069531190173720",
2039
+ // "event_type": "OrderCancelStarted",
2040
+ // "order_id": "123",
2041
+ // "order_status": "cancel_started",
2042
+ // "order_type": "limit_sell",
2043
+ // "pair": "BTC_USD",
2044
+ // "price": "54115",
2045
+ // "quantity": "0.001",
2046
+ // "stop_price": "0",
2047
+ // "trade_id": "0",
2048
+ // "trade_price": "0",
2049
+ // "trade_quantity": "0",
2050
+ // "trade_type": ""
2051
+ // },
2052
+ //
2053
+ const id = this.safeString2(order, 'order_id', 'parent_order_id');
2054
+ const eventTime = this.safeIntegerProduct2(order, 'event_time', 'created', 0.000001);
2055
+ const timestamp = this.safeTimestamp(order, 'created', eventTime);
2056
+ const orderType = this.safeString2(order, 'type', 'order_type');
2057
+ const side = this.parseSide(orderType);
2058
+ let marketId = undefined;
2059
+ if ('pair' in order) {
2060
+ marketId = order['pair'];
2061
+ }
2062
+ else if (('in_currency' in order) && ('out_currency' in order)) {
2063
+ if (side === 'buy') {
2064
+ marketId = order['in_currency'] + '_' + order['out_currency'];
2065
+ }
2066
+ else {
2067
+ marketId = order['out_currency'] + '_' + order['in_currency'];
2068
+ }
2069
+ }
2070
+ market = this.safeMarket(marketId, market);
2071
+ const symbol = market['symbol'];
2072
+ let amount = this.safeString(order, 'quantity');
2073
+ if (amount === undefined) {
2074
+ const amountField = (side === 'buy') ? 'in_amount' : 'out_amount';
2075
+ amount = this.safeString(order, amountField);
2076
+ }
2077
+ const price = this.safeString(order, 'price');
2078
+ const cost = this.safeString(order, 'amount');
2079
+ const transactions = this.safeValue(order, 'trades', []);
2080
+ const clientOrderId = this.safeInteger(order, 'client_id');
2081
+ let triggerPrice = this.safeString(order, 'stop_price');
2082
+ if (triggerPrice === '0') {
2083
+ triggerPrice = undefined;
2084
+ }
2085
+ let type = undefined;
2086
+ if ((orderType !== 'buy') && (orderType !== 'sell')) {
2087
+ type = orderType;
2088
+ }
2089
+ return this.safeOrder({
2090
+ 'id': id,
2091
+ 'clientOrderId': clientOrderId,
2092
+ 'datetime': this.iso8601(timestamp),
2093
+ 'timestamp': timestamp,
2094
+ 'lastTradeTimestamp': this.safeIntegerProduct(order, 'updated', 0.000001),
2095
+ 'status': this.parseStatus(this.safeString(order, 'order_status')),
2096
+ 'symbol': symbol,
2097
+ 'type': type,
2098
+ 'timeInForce': undefined,
2099
+ 'postOnly': undefined,
2100
+ 'side': side,
2101
+ 'price': price,
2102
+ 'triggerPrice': triggerPrice,
2103
+ 'cost': cost,
2104
+ 'amount': amount,
2105
+ 'filled': undefined,
2106
+ 'remaining': undefined,
2107
+ 'average': undefined,
2108
+ 'trades': transactions,
2109
+ 'fee': undefined,
2110
+ 'info': order,
2111
+ }, market);
2112
+ }
2113
+ /**
2114
+ * @method
2115
+ * @name exmo#fetchCanceledOrders
2116
+ * @description fetches information on multiple canceled orders made by the user
2117
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#1d2524dd-ae6d-403a-a067-77b50d13fbe5 // margin
2118
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#a51be1d0-af5f-44e4-99d7-f7b04c6067d0 // spot canceled orders
2119
+ * @param {string} symbol unified market symbol of the market orders were made in
2120
+ * @param {int} [since] timestamp in ms of the earliest order, default is undefined
2121
+ * @param {int} [limit] max number of orders to return, default is undefined
2122
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2123
+ * @param {string} [params.marginMode] set to "isolated" for margin orders
2124
+ * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2125
+ */
2126
+ async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2127
+ await this.loadMarkets();
2128
+ let marginMode = undefined;
2129
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrders', params);
2130
+ if (marginMode === 'cross') {
2131
+ throw new BadRequest(this.id + ' only supports isolated margin');
2132
+ }
2133
+ if (limit === undefined) {
2134
+ limit = 100;
2135
+ }
2136
+ const isSpot = (marginMode !== 'isolated');
2137
+ if (symbol !== undefined) {
2138
+ const marketInner = this.market(symbol);
2139
+ symbol = marketInner['symbol'];
2140
+ }
2141
+ const request = {
2142
+ 'limit': limit,
2143
+ };
2144
+ request['offset'] = (since !== undefined) ? limit : 0;
2145
+ request['limit'] = limit;
2146
+ let market = undefined;
2147
+ if (symbol !== undefined) {
2148
+ market = this.market(symbol);
2149
+ }
2150
+ let response = undefined;
2151
+ if (isSpot) {
2152
+ response = await this.privatePostUserCancelledOrders(this.extend(request, params));
2153
+ //
2154
+ // [
2155
+ // {
2156
+ // "order_id": "27056153840",
2157
+ // "client_id": "0",
2158
+ // "created": "1653428646",
2159
+ // "type": "buy",
2160
+ // "pair": "BTC_USDT",
2161
+ // "quantity": "0.1",
2162
+ // "price": "10",
2163
+ // "amount": "1"
2164
+ // }
2165
+ // ]
2166
+ //
2167
+ params = this.extend(params, {
2168
+ 'status': 'canceled',
2169
+ });
2170
+ return this.parseOrders(response, market, since, limit, params);
2171
+ }
2172
+ else {
2173
+ const responseSwap = await this.privatePostMarginUserOrderHistory(this.extend(request, params));
2174
+ //
2175
+ // {
2176
+ // "items": [
2177
+ // {
2178
+ // "event_id": "692862104574106858",
2179
+ // "event_time": "1694116400173489405",
2180
+ // "event_type": "OrderCancelStarted",
2181
+ // "order_id": "692862104561289319",
2182
+ // "order_type": "stop_limit_sell",
2183
+ // "order_status": "cancel_started",
2184
+ // "trade_id": "0",
2185
+ // "trade_type":"",
2186
+ // "trade_quantity": "0",
2187
+ // "trade_price": "0",
2188
+ // "pair": "ADA_USDT",
2189
+ // "quantity": "12",
2190
+ // "price": "0.23",
2191
+ // "stop_price": "0.22",
2192
+ // "distance": "0"
2193
+ // }
2194
+ // ...
2195
+ // ]
2196
+ // }
2197
+ //
2198
+ const items = this.safeValue(responseSwap, 'items');
2199
+ const orders = this.parseOrders(items, market, since, limit, params);
2200
+ const result = [];
2201
+ for (let i = 0; i < orders.length; i++) {
2202
+ const order = orders[i];
2203
+ if (order['status'] === 'canceled') {
2204
+ result.push(order);
2205
+ }
2206
+ }
2207
+ return result;
2208
+ }
2209
+ }
2210
+ /**
2211
+ * @method
2212
+ * @name exmo#editOrder
2213
+ * @description *margin only* edit a trade order
2214
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#f27ee040-c75f-4b59-b608-d05bd45b7899 // margin
2215
+ * @param {string} id order id
2216
+ * @param {string} symbol unified CCXT market symbol
2217
+ * @param {string} type not used by exmo editOrder
2218
+ * @param {string} side not used by exmo editOrder
2219
+ * @param {float} [amount] how much of the currency you want to trade in units of the base currency
2220
+ * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
2221
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2222
+ * @param {float} [params.triggerPrice] stop price for stop-market and stop-limit orders
2223
+ * @param {string} params.marginMode must be set to isolated
2224
+ *
2225
+ * EXCHANGE SPECIFIC PARAMETERS
2226
+ * @param {int} [params.distance] distance for trailing stop orders
2227
+ * @param {int} [params.expire] expiration timestamp in UTC timezone for the order. order will not be expired if expire is 0
2228
+ * @param {string} [params.comment] optional comment for order. up to 50 latin symbols, whitespaces, underscores
2229
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2230
+ */
2231
+ async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
2232
+ await this.loadMarkets();
2233
+ const market = this.market(symbol);
2234
+ let marginMode = undefined;
2235
+ [marginMode, params] = this.handleMarginModeAndParams('editOrder', params);
2236
+ if (marginMode !== 'isolated') {
2237
+ throw new BadRequest(this.id + ' editOrder() can only be used for isolated margin orders');
2238
+ }
2239
+ const triggerPrice = this.safeNumberN(params, ['triggerPrice', 'stopPrice', 'stop_price']);
2240
+ params = this.omit(params, ['triggerPrice', 'stopPrice']);
2241
+ const request = {
2242
+ 'order_id': id, // id of the open order
2243
+ };
2244
+ if (amount !== undefined) {
2245
+ request['quantity'] = amount;
2246
+ }
2247
+ if (price !== undefined) {
2248
+ request['price'] = this.priceToPrecision(market['symbol'], price);
2249
+ }
2250
+ if (triggerPrice !== undefined) {
2251
+ request['stop_price'] = this.priceToPrecision(market['symbol'], triggerPrice);
2252
+ }
2253
+ const response = await this.privatePostMarginUserOrderUpdate(this.extend(request, params));
2254
+ return this.parseOrder(response);
2255
+ }
2256
+ /**
2257
+ * @method
2258
+ * @name exmo#fetchDepositAddress
2259
+ * @description fetch the deposit address for a currency associated with this account
2260
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#c8f9ced9-7ab6-4383-a6a4-bc54469ba60e
2261
+ * @param {string} code unified currency code
2262
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2263
+ * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
2264
+ */
2265
+ async fetchDepositAddress(code, params = {}) {
2266
+ await this.loadMarkets();
2267
+ const response = await this.privatePostDepositAddress(params);
2268
+ //
2269
+ // {
2270
+ // "TRX":"TBnwrf4ZdoYXE3C8L2KMs7YPSL3fg6q6V9",
2271
+ // "USDTTRC20":"TBnwrf4ZdoYXE3C8L2KMs7YPSL3fg6q6V9"
2272
+ // }
2273
+ //
2274
+ const depositAddress = this.safeString(response, code);
2275
+ let address = undefined;
2276
+ let tag = undefined;
2277
+ if (depositAddress) {
2278
+ const addressAndTag = depositAddress.split(',');
2279
+ address = addressAndTag[0];
2280
+ const numParts = addressAndTag.length;
2281
+ if (numParts > 1) {
2282
+ tag = addressAndTag[1];
2283
+ }
2284
+ }
2285
+ this.checkAddress(address);
2286
+ return {
2287
+ 'info': response,
2288
+ 'currency': code,
2289
+ 'network': undefined,
2290
+ 'address': address,
2291
+ 'tag': tag,
2292
+ };
2293
+ }
2294
+ getMarketFromTrades(trades) {
2295
+ const tradesBySymbol = this.indexBy(trades, 'pair');
2296
+ const symbols = Object.keys(tradesBySymbol);
2297
+ const numSymbols = symbols.length;
2298
+ if (numSymbols === 1) {
2299
+ return this.markets[symbols[0]];
2300
+ }
2301
+ return undefined;
2302
+ }
2303
+ /**
2304
+ * @method
2305
+ * @name exmo#withdraw
2306
+ * @description make a withdrawal
2307
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#3ab9c34d-ad58-4f87-9c57-2e2ea88a8325
2308
+ * @param {string} code unified currency code
2309
+ * @param {float} amount the amount to withdraw
2310
+ * @param {string} address the address to withdraw to
2311
+ * @param {string} tag
2312
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2313
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2314
+ */
2315
+ async withdraw(code, amount, address, tag = undefined, params = {}) {
2316
+ [tag, params] = this.handleWithdrawTagAndParams(tag, params);
2317
+ await this.loadMarkets();
2318
+ const currency = this.currency(code);
2319
+ const request = {
2320
+ 'amount': amount,
2321
+ 'currency': currency['id'],
2322
+ 'address': address,
2323
+ };
2324
+ if (tag !== undefined) {
2325
+ request['invoice'] = tag;
2326
+ }
2327
+ const networks = this.safeValue(this.options, 'networks', {});
2328
+ let network = this.safeStringUpper(params, 'network'); // this line allows the user to specify either ERC20 or ETH
2329
+ network = this.safeString(networks, network, network); // handle ERC20>ETH alias
2330
+ if (network !== undefined) {
2331
+ request['transport'] = network;
2332
+ params = this.omit(params, 'network');
2333
+ }
2334
+ const response = await this.privatePostWithdrawCrypt(this.extend(request, params));
2335
+ return this.parseTransaction(response, currency);
2336
+ }
2337
+ parseTransactionStatus(status) {
2338
+ const statuses = {
2339
+ 'transferred': 'ok',
2340
+ 'paid': 'ok',
2341
+ 'pending': 'pending',
2342
+ 'processing': 'pending',
2343
+ 'verifying': 'pending',
2344
+ };
2345
+ return this.safeString(statuses, status, status);
2346
+ }
2347
+ parseTransaction(transaction, currency = undefined) {
2348
+ //
2349
+ // fetchDepositsWithdrawals
2350
+ //
2351
+ // {
2352
+ // "dt": 1461841192,
2353
+ // "type": "deposit",
2354
+ // "curr": "RUB",
2355
+ // "status": "processing",
2356
+ // "provider": "Qiwi (LA) [12345]",
2357
+ // "amount": "1",
2358
+ // "account": "",
2359
+ // "txid": "ec46f784ad976fd7f7539089d1a129fe46...",
2360
+ // }
2361
+ //
2362
+ // fetchWithdrawals
2363
+ //
2364
+ // {
2365
+ // "operation_id": 47412538520634344,
2366
+ // "created": 1573760013,
2367
+ // "updated": 1573760013,
2368
+ // "type": "withdraw",
2369
+ // "currency": "DOGE",
2370
+ // "status": "Paid",
2371
+ // "amount": "300",
2372
+ // "provider": "DOGE",
2373
+ // "commission": "0",
2374
+ // "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2375
+ // "order_id": 69670170,
2376
+ // "provider_type": "crypto",
2377
+ // "crypto_address": "DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2378
+ // "card_number": "",
2379
+ // "wallet_address": "",
2380
+ // "email": "",
2381
+ // "phone": "",
2382
+ // "extra": {
2383
+ // "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
2384
+ // "confirmations": null,
2385
+ // "excode": "",
2386
+ // "invoice": ""
2387
+ // },
2388
+ // "error": ""
2389
+ // }
2390
+ //
2391
+ // withdraw
2392
+ //
2393
+ // {
2394
+ // "result": true,
2395
+ // "error": "",
2396
+ // "task_id": 11775077
2397
+ // }
2398
+ //
2399
+ const timestamp = this.safeTimestamp2(transaction, 'dt', 'created');
2400
+ let amountString = this.safeString(transaction, 'amount');
2401
+ if (amountString !== undefined) {
2402
+ amountString = Precise.stringAbs(amountString);
2403
+ }
2404
+ let txid = this.safeString(transaction, 'txid');
2405
+ if (txid === undefined) {
2406
+ const extra = this.safeValue(transaction, 'extra', {});
2407
+ const extraTxid = this.safeString(extra, 'txid');
2408
+ if (extraTxid !== '') {
2409
+ txid = extraTxid;
2410
+ }
2411
+ }
2412
+ const type = this.safeString(transaction, 'type');
2413
+ const currencyId = this.safeString2(transaction, 'curr', 'currency');
2414
+ const code = this.safeCurrencyCode(currencyId, currency);
2415
+ let address = undefined;
2416
+ let comment = undefined;
2417
+ const account = this.safeString(transaction, 'account');
2418
+ if (type === 'deposit') {
2419
+ comment = account;
2420
+ }
2421
+ else if (type === 'withdrawal') {
2422
+ address = account;
2423
+ if (address !== undefined) {
2424
+ const parts = address.split(':');
2425
+ const numParts = parts.length;
2426
+ if (numParts === 2) {
2427
+ address = this.safeString(parts, 1);
2428
+ address = address.replace(' ', '');
2429
+ }
2430
+ }
2431
+ }
2432
+ const fee = {
2433
+ 'currency': undefined,
2434
+ 'cost': undefined,
2435
+ 'rate': undefined,
2436
+ };
2437
+ // fixed funding fees only (for now)
2438
+ if (!this.fees['transaction']['percentage']) {
2439
+ const key = (type === 'withdrawal') ? 'withdraw' : 'deposit';
2440
+ let feeCost = this.safeString(transaction, 'commission');
2441
+ if (feeCost === undefined) {
2442
+ const transactionFees = this.safeValue(this.options, 'transactionFees', {});
2443
+ const codeFees = this.safeValue(transactionFees, code, {});
2444
+ feeCost = this.safeString(codeFees, key);
2445
+ }
2446
+ // users don't pay for cashbacks, no fees for that
2447
+ const provider = this.safeString(transaction, 'provider');
2448
+ if (provider === 'cashback') {
2449
+ feeCost = '0';
2450
+ }
2451
+ if (feeCost !== undefined) {
2452
+ // withdrawal amount includes the fee
2453
+ if (type === 'withdrawal') {
2454
+ amountString = Precise.stringSub(amountString, feeCost);
2455
+ }
2456
+ fee['cost'] = this.parseNumber(feeCost);
2457
+ fee['currency'] = code;
2458
+ }
2459
+ }
2460
+ return {
2461
+ 'info': transaction,
2462
+ 'id': this.safeString2(transaction, 'order_id', 'task_id'),
2463
+ 'txid': txid,
2464
+ 'type': type,
2465
+ 'currency': code,
2466
+ 'network': this.safeString(transaction, 'provider'),
2467
+ 'amount': this.parseNumber(amountString),
2468
+ 'status': this.parseTransactionStatus(this.safeStringLower(transaction, 'status')),
2469
+ 'timestamp': timestamp,
2470
+ 'datetime': this.iso8601(timestamp),
2471
+ 'address': address,
2472
+ 'addressFrom': undefined,
2473
+ 'addressTo': address,
2474
+ 'tag': undefined,
2475
+ 'tagFrom': undefined,
2476
+ 'tagTo': undefined,
2477
+ 'updated': this.safeTimestamp(transaction, 'updated'),
2478
+ 'comment': comment,
2479
+ 'internal': undefined,
2480
+ 'fee': fee,
2481
+ };
2482
+ }
2483
+ /**
2484
+ * @method
2485
+ * @name exmo#fetchDepositsWithdrawals
2486
+ * @description fetch history of deposits and withdrawals
2487
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#31e69a33-4849-4e6a-b4b4-6d574238f6a7
2488
+ * @param {string} [code] unified currency code for the currency of the deposit/withdrawals, default is undefined
2489
+ * @param {int} [since] timestamp in ms of the earliest deposit/withdrawal, default is undefined
2490
+ * @param {int} [limit] max number of deposit/withdrawals to return, default is undefined
2491
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2492
+ * @returns {object} a list of [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2493
+ */
2494
+ async fetchDepositsWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
2495
+ await this.loadMarkets();
2496
+ const request = {};
2497
+ if (since !== undefined) {
2498
+ request['date'] = this.parseToInt(since / 1000);
2499
+ }
2500
+ let currency = undefined;
2501
+ if (code !== undefined) {
2502
+ currency = this.currency(code);
2503
+ }
2504
+ const response = await this.privatePostWalletHistory(this.extend(request, params));
2505
+ //
2506
+ // {
2507
+ // "result": true,
2508
+ // "error": "",
2509
+ // "begin": "1493942400",
2510
+ // "end": "1494028800",
2511
+ // "history": [
2512
+ // {
2513
+ // "dt": 1461841192,
2514
+ // "type": "deposit",
2515
+ // "curr": "RUB",
2516
+ // "status": "processing",
2517
+ // "provider": "Qiwi (LA) [12345]",
2518
+ // "amount": "1",
2519
+ // "account": "",
2520
+ // "txid": "ec46f784ad976fd7f7539089d1a129fe46...",
2521
+ // },
2522
+ // {
2523
+ // "dt": 1463414785,
2524
+ // "type": "withdrawal",
2525
+ // "curr": "USD",
2526
+ // "status": "paid",
2527
+ // "provider": "EXCODE",
2528
+ // "amount": "-1",
2529
+ // "account": "EX-CODE_19371_USDda...",
2530
+ // "txid": "",
2531
+ // },
2532
+ // ],
2533
+ // }
2534
+ //
2535
+ return this.parseTransactions(response['history'], currency, since, limit);
2536
+ }
2537
+ /**
2538
+ * @method
2539
+ * @name exmo#fetchWithdrawals
2540
+ * @description fetch all withdrawals made from an account
2541
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2542
+ * @param {string} code unified currency code
2543
+ * @param {int} [since] the earliest time in ms to fetch withdrawals for
2544
+ * @param {int} [limit] the maximum number of withdrawals structures to retrieve
2545
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2546
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2547
+ */
2548
+ async fetchWithdrawals(code = undefined, since = undefined, limit = undefined, params = {}) {
2549
+ await this.loadMarkets();
2550
+ let currency = undefined;
2551
+ const request = {
2552
+ 'type': 'withdraw',
2553
+ };
2554
+ if (limit !== undefined) {
2555
+ request['limit'] = limit; // default: 100, maximum: 100
2556
+ }
2557
+ if (code !== undefined) {
2558
+ currency = this.currency(code);
2559
+ request['currency'] = currency['id'];
2560
+ }
2561
+ const response = await this.privatePostWalletOperations(this.extend(request, params));
2562
+ //
2563
+ // {
2564
+ // "items": [
2565
+ // {
2566
+ // "operation_id": 47412538520634344,
2567
+ // "created": 1573760013,
2568
+ // "updated": 1573760013,
2569
+ // "type": "withdraw",
2570
+ // "currency": "DOGE",
2571
+ // "status": "Paid",
2572
+ // "amount": "300",
2573
+ // "provider": "DOGE",
2574
+ // "commission": "0",
2575
+ // "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2576
+ // "order_id": 69670170,
2577
+ // "extra": {
2578
+ // "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
2579
+ // "excode": "",
2580
+ // "invoice": ""
2581
+ // },
2582
+ // "error": ""
2583
+ // },
2584
+ // ],
2585
+ // "count": 23
2586
+ // }
2587
+ //
2588
+ const items = this.safeList(response, 'items', []);
2589
+ return this.parseTransactions(items, currency, since, limit);
2590
+ }
2591
+ /**
2592
+ * @method
2593
+ * @name exmo#fetchWithdrawal
2594
+ * @description fetch data on a currency withdrawal via the withdrawal id
2595
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2596
+ * @param {string} id withdrawal id
2597
+ * @param {string} code unified currency code of the currency withdrawn, default is undefined
2598
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2599
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2600
+ */
2601
+ async fetchWithdrawal(id, code = undefined, params = {}) {
2602
+ await this.loadMarkets();
2603
+ let currency = undefined;
2604
+ const request = {
2605
+ 'order_id': id,
2606
+ 'type': 'withdraw',
2607
+ };
2608
+ if (code !== undefined) {
2609
+ currency = this.currency(code);
2610
+ request['currency'] = currency['id'];
2611
+ }
2612
+ const response = await this.privatePostWalletOperations(this.extend(request, params));
2613
+ //
2614
+ // {
2615
+ // "items": [
2616
+ // {
2617
+ // "operation_id": 47412538520634344,
2618
+ // "created": 1573760013,
2619
+ // "updated": 1573760013,
2620
+ // "type": "deposit",
2621
+ // "currency": "DOGE",
2622
+ // "status": "Paid",
2623
+ // "amount": "300",
2624
+ // "provider": "DOGE",
2625
+ // "commission": "0",
2626
+ // "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2627
+ // "order_id": 69670170,
2628
+ // "extra": {
2629
+ // "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
2630
+ // "excode": "",
2631
+ // "invoice": ""
2632
+ // },
2633
+ // "error": ""
2634
+ // },
2635
+ // ],
2636
+ // "count": 23
2637
+ // }
2638
+ //
2639
+ const items = this.safeValue(response, 'items', []);
2640
+ const first = this.safeDict(items, 0, {});
2641
+ return this.parseTransaction(first, currency);
2642
+ }
2643
+ /**
2644
+ * @method
2645
+ * @name exmo#fetchDeposit
2646
+ * @description fetch information on a deposit
2647
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2648
+ * @param {string} id deposit id
2649
+ * @param {string} code unified currency code, default is undefined
2650
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2651
+ * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2652
+ */
2653
+ async fetchDeposit(id, code = undefined, params = {}) {
2654
+ await this.loadMarkets();
2655
+ let currency = undefined;
2656
+ const request = {
2657
+ 'order_id': id,
2658
+ 'type': 'deposit',
2659
+ };
2660
+ if (code !== undefined) {
2661
+ currency = this.currency(code);
2662
+ request['currency'] = currency['id'];
2663
+ }
2664
+ const response = await this.privatePostWalletOperations(this.extend(request, params));
2665
+ //
2666
+ // {
2667
+ // "items": [
2668
+ // {
2669
+ // "operation_id": 47412538520634344,
2670
+ // "created": 1573760013,
2671
+ // "updated": 1573760013,
2672
+ // "type": "deposit",
2673
+ // "currency": "DOGE",
2674
+ // "status": "Paid",
2675
+ // "amount": "300",
2676
+ // "provider": "DOGE",
2677
+ // "commission": "0",
2678
+ // "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2679
+ // "order_id": 69670170,
2680
+ // "extra": {
2681
+ // "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
2682
+ // "excode": "",
2683
+ // "invoice": ""
2684
+ // },
2685
+ // "error": ""
2686
+ // },
2687
+ // ],
2688
+ // "count": 23
2689
+ // }
2690
+ //
2691
+ const items = this.safeValue(response, 'items', []);
2692
+ const first = this.safeDict(items, 0, {});
2693
+ return this.parseTransaction(first, currency);
2694
+ }
2695
+ /**
2696
+ * @method
2697
+ * @name exmo#fetchDeposits
2698
+ * @description fetch all deposits made to an account
2699
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#97f1becd-7aad-4e0e-babe-7bbe09e33706
2700
+ * @param {string} code unified currency code
2701
+ * @param {int} [since] the earliest time in ms to fetch deposits for
2702
+ * @param {int} [limit] the maximum number of deposits structures to retrieve
2703
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2704
+ * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
2705
+ */
2706
+ async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
2707
+ await this.loadMarkets();
2708
+ let currency = undefined;
2709
+ const request = {
2710
+ 'type': 'deposit',
2711
+ };
2712
+ if (limit !== undefined) {
2713
+ request['limit'] = limit; // default: 100, maximum: 100
2714
+ }
2715
+ if (code !== undefined) {
2716
+ currency = this.currency(code);
2717
+ request['currency'] = currency['id'];
2718
+ }
2719
+ const response = await this.privatePostWalletOperations(this.extend(request, params));
2720
+ //
2721
+ // {
2722
+ // "items": [
2723
+ // {
2724
+ // "operation_id": 47412538520634344,
2725
+ // "created": 1573760013,
2726
+ // "updated": 1573760013,
2727
+ // "type": "deposit",
2728
+ // "currency": "DOGE",
2729
+ // "status": "Paid",
2730
+ // "amount": "300",
2731
+ // "provider": "DOGE",
2732
+ // "commission": "0",
2733
+ // "account": "DOGE: DBVy8pF1f8yxaCVEHqHeR7kkcHecLQ8nRS",
2734
+ // "order_id": 69670170,
2735
+ // "extra": {
2736
+ // "txid": "f2b66259ae1580f371d38dd27e31a23fff8c04122b65ee3ab5a3f612d579c792",
2737
+ // "excode": "",
2738
+ // "invoice": ""
2739
+ // },
2740
+ // "error": ""
2741
+ // },
2742
+ // ],
2743
+ // "count": 23
2744
+ // }
2745
+ //
2746
+ const items = this.safeList(response, 'items', []);
2747
+ return this.parseTransactions(items, currency, since, limit);
2748
+ }
2749
+ sign(path, api = 'public', method = 'GET', params = {}, headers = undefined, body = undefined) {
2750
+ let url = this.urls['api'][api] + '/';
2751
+ if (api !== 'web') {
2752
+ url += this.version + '/';
2753
+ }
2754
+ url += path;
2755
+ if ((api === 'public') || (api === 'web')) {
2756
+ if (Object.keys(params).length) {
2757
+ url += '?' + this.urlencode(params);
2758
+ }
2759
+ }
2760
+ else if (api === 'private') {
2761
+ this.checkRequiredCredentials();
2762
+ const nonce = this.nonce();
2763
+ body = this.urlencode(this.extend({ 'nonce': nonce }, params));
2764
+ headers = {
2765
+ 'Content-Type': 'application/x-www-form-urlencoded',
2766
+ 'Key': this.apiKey,
2767
+ 'Sign': this.hmac(this.encode(body), this.encode(this.secret), sha512),
2768
+ };
2769
+ }
2770
+ return { 'url': url, 'method': method, 'body': body, 'headers': headers };
2771
+ }
2772
+ nonce() {
2773
+ return this.milliseconds();
2774
+ }
2775
+ handleErrors(httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody) {
2776
+ if (response === undefined) {
2777
+ return undefined; // fallback to default error handler
2778
+ }
2779
+ if (('error' in response) && !('result' in response)) {
2780
+ // error: {
2781
+ // "code": "140434",
2782
+ // "msg": "Your margin balance is not sufficient to place the order for '5 TON'. Please top up your margin wallet by "2.5 USDT"."
2783
+ // }
2784
+ //
2785
+ const errorCode = this.safeValue(response, 'error', {});
2786
+ const messageError = this.safeString(errorCode, 'msg');
2787
+ const code = this.safeString(errorCode, 'code');
2788
+ const feedback = this.id + ' ' + body;
2789
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
2790
+ this.throwBroadlyMatchedException(this.exceptions['broad'], messageError, feedback);
2791
+ throw new ExchangeError(feedback);
2792
+ }
2793
+ if (('result' in response) || ('errmsg' in response)) {
2794
+ //
2795
+ // {"result":false,"error":"Error 50052: Insufficient funds"}
2796
+ // {"s":"error","errmsg":"strconv.ParseInt: parsing \"\": invalid syntax"}
2797
+ //
2798
+ let success = this.safeBool(response, 'result', false);
2799
+ if (typeof success === 'string') {
2800
+ if ((success === 'true') || (success === '1')) {
2801
+ success = true;
2802
+ }
2803
+ else {
2804
+ success = false;
2805
+ }
2806
+ }
2807
+ if (!success) {
2808
+ let code = undefined;
2809
+ const message = this.safeString2(response, 'error', 'errmsg');
2810
+ const errorParts = message.split(':');
2811
+ const numParts = errorParts.length;
2812
+ if (numParts > 1) {
2813
+ const errorSubParts = errorParts[0].split(' ');
2814
+ const numSubParts = errorSubParts.length;
2815
+ code = (numSubParts > 1) ? errorSubParts[1] : errorSubParts[0];
2816
+ }
2817
+ const feedback = this.id + ' ' + body;
2818
+ this.throwExactlyMatchedException(this.exceptions['exact'], code, feedback);
2819
+ this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
2820
+ throw new ExchangeError(feedback);
2821
+ }
2822
+ }
2823
+ return undefined;
2824
+ }
2825
+ }