ccxt-ir 4.3.46.0.1__py2.py3-none-any.whl

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 (772) hide show
  1. ccxt/__init__.py +358 -0
  2. ccxt/abantether.py +316 -0
  3. ccxt/abstract/__init__.py +0 -0
  4. ccxt/abstract/abantether.py +5 -0
  5. ccxt/abstract/ace.py +15 -0
  6. ccxt/abstract/afratether.py +6 -0
  7. ccxt/abstract/alpaca.py +70 -0
  8. ccxt/abstract/arzinja.py +5 -0
  9. ccxt/abstract/arzplus.py +7 -0
  10. ccxt/abstract/ascendex.py +77 -0
  11. ccxt/abstract/bequant.py +115 -0
  12. ccxt/abstract/bigone.py +45 -0
  13. ccxt/abstract/binance.py +712 -0
  14. ccxt/abstract/binancecoinm.py +712 -0
  15. ccxt/abstract/binanceus.py +764 -0
  16. ccxt/abstract/binanceusdm.py +712 -0
  17. ccxt/abstract/bingx.py +113 -0
  18. ccxt/abstract/bit2c.py +27 -0
  19. ccxt/abstract/bitbank.py +27 -0
  20. ccxt/abstract/bitbay.py +53 -0
  21. ccxt/abstract/bitbns.py +40 -0
  22. ccxt/abstract/bitcoincom.py +115 -0
  23. ccxt/abstract/bitfinex.py +69 -0
  24. ccxt/abstract/bitfinex2.py +139 -0
  25. ccxt/abstract/bitflyer.py +38 -0
  26. ccxt/abstract/bitget.py +508 -0
  27. ccxt/abstract/bithumb.py +32 -0
  28. ccxt/abstract/bitimen.py +7 -0
  29. ccxt/abstract/bitir.py +7 -0
  30. ccxt/abstract/bitmart.py +99 -0
  31. ccxt/abstract/bitmex.py +97 -0
  32. ccxt/abstract/bitopro.py +29 -0
  33. ccxt/abstract/bitpanda.py +35 -0
  34. ccxt/abstract/bitpin.py +7 -0
  35. ccxt/abstract/bitrue.py +72 -0
  36. ccxt/abstract/bitso.py +43 -0
  37. ccxt/abstract/bitstamp.py +258 -0
  38. ccxt/abstract/bitteam.py +29 -0
  39. ccxt/abstract/bitvavo.py +27 -0
  40. ccxt/abstract/bl3p.py +19 -0
  41. ccxt/abstract/blockchaincom.py +28 -0
  42. ccxt/abstract/blofin.py +37 -0
  43. ccxt/abstract/btcalpha.py +18 -0
  44. ccxt/abstract/btcbox.py +13 -0
  45. ccxt/abstract/btcmarkets.py +39 -0
  46. ccxt/abstract/btcturk.py +20 -0
  47. ccxt/abstract/bybit.py +298 -0
  48. ccxt/abstract/cex.py +33 -0
  49. ccxt/abstract/coinbase.py +94 -0
  50. ccxt/abstract/coinbaseadvanced.py +94 -0
  51. ccxt/abstract/coinbaseexchange.py +67 -0
  52. ccxt/abstract/coinbaseinternational.py +39 -0
  53. ccxt/abstract/coincatch.py +94 -0
  54. ccxt/abstract/coincheck.py +33 -0
  55. ccxt/abstract/coinex.py +237 -0
  56. ccxt/abstract/coinlist.py +54 -0
  57. ccxt/abstract/coinmate.py +62 -0
  58. ccxt/abstract/coinmetro.py +34 -0
  59. ccxt/abstract/coinone.py +67 -0
  60. ccxt/abstract/coinsph.py +54 -0
  61. ccxt/abstract/coinspot.py +28 -0
  62. ccxt/abstract/cryptocom.py +107 -0
  63. ccxt/abstract/currencycom.py +68 -0
  64. ccxt/abstract/delta.py +50 -0
  65. ccxt/abstract/deribit.py +125 -0
  66. ccxt/abstract/digifinex.py +91 -0
  67. ccxt/abstract/eterex.py +5 -0
  68. ccxt/abstract/excoino.py +7 -0
  69. ccxt/abstract/exir.py +8 -0
  70. ccxt/abstract/exmo.py +55 -0
  71. ccxt/abstract/exnovin.py +6 -0
  72. ccxt/abstract/farhadexchange.py +5 -0
  73. ccxt/abstract/fmfwio.py +115 -0
  74. ccxt/abstract/gate.py +265 -0
  75. ccxt/abstract/gateio.py +265 -0
  76. ccxt/abstract/gemini.py +58 -0
  77. ccxt/abstract/hashkey.py +67 -0
  78. ccxt/abstract/hitbtc.py +115 -0
  79. ccxt/abstract/hitbtc3.py +115 -0
  80. ccxt/abstract/hitobit.py +8 -0
  81. ccxt/abstract/hollaex.py +33 -0
  82. ccxt/abstract/htx.py +548 -0
  83. ccxt/abstract/huobi.py +548 -0
  84. ccxt/abstract/huobijp.py +114 -0
  85. ccxt/abstract/hyperliquid.py +6 -0
  86. ccxt/abstract/idex.py +26 -0
  87. ccxt/abstract/independentreserve.py +37 -0
  88. ccxt/abstract/indodax.py +26 -0
  89. ccxt/abstract/jibitex.py +7 -0
  90. ccxt/abstract/kraken.py +57 -0
  91. ccxt/abstract/krakenfutures.py +38 -0
  92. ccxt/abstract/kucoin.py +214 -0
  93. ccxt/abstract/kucoinfutures.py +233 -0
  94. ccxt/abstract/kuna.py +182 -0
  95. ccxt/abstract/latoken.py +56 -0
  96. ccxt/abstract/lbank.py +61 -0
  97. ccxt/abstract/luno.py +37 -0
  98. ccxt/abstract/lykke.py +29 -0
  99. ccxt/abstract/mercado.py +25 -0
  100. ccxt/abstract/mexc.py +178 -0
  101. ccxt/abstract/ndax.py +97 -0
  102. ccxt/abstract/nobitex.py +7 -0
  103. ccxt/abstract/novadax.py +29 -0
  104. ccxt/abstract/oceanex.py +22 -0
  105. ccxt/abstract/okcoin.py +74 -0
  106. ccxt/abstract/okexchange.py +8 -0
  107. ccxt/abstract/okx.py +324 -0
  108. ccxt/abstract/ompfinex.py +7 -0
  109. ccxt/abstract/onetrading.py +35 -0
  110. ccxt/abstract/oxfun.py +34 -0
  111. ccxt/abstract/p2b.py +22 -0
  112. ccxt/abstract/paradex.py +40 -0
  113. ccxt/abstract/paymium.py +28 -0
  114. ccxt/abstract/phemex.py +115 -0
  115. ccxt/abstract/poloniex.py +69 -0
  116. ccxt/abstract/poloniexfutures.py +48 -0
  117. ccxt/abstract/probit.py +23 -0
  118. ccxt/abstract/ramzinex.py +7 -0
  119. ccxt/abstract/sarmayex.py +5 -0
  120. ccxt/abstract/sarrafex.py +7 -0
  121. ccxt/abstract/tabdeal.py +7 -0
  122. ccxt/abstract/tetherland.py +5 -0
  123. ccxt/abstract/timex.py +62 -0
  124. ccxt/abstract/tokocrypto.py +37 -0
  125. ccxt/abstract/tradeogre.py +16 -0
  126. ccxt/abstract/twox.py +5 -0
  127. ccxt/abstract/ubitex.py +7 -0
  128. ccxt/abstract/upbit.py +38 -0
  129. ccxt/abstract/vertex.py +19 -0
  130. ccxt/abstract/wallex.py +8 -0
  131. ccxt/abstract/wavesexchange.py +154 -0
  132. ccxt/abstract/wazirx.py +30 -0
  133. ccxt/abstract/whitebit.py +98 -0
  134. ccxt/abstract/woo.py +83 -0
  135. ccxt/abstract/woofipro.py +119 -0
  136. ccxt/abstract/xt.py +152 -0
  137. ccxt/abstract/yobit.py +16 -0
  138. ccxt/abstract/zaif.py +38 -0
  139. ccxt/abstract/zonda.py +53 -0
  140. ccxt/ace.py +1012 -0
  141. ccxt/afratether.py +293 -0
  142. ccxt/alpaca.py +1083 -0
  143. ccxt/arzinja.py +285 -0
  144. ccxt/arzplus.py +412 -0
  145. ccxt/ascendex.py +3330 -0
  146. ccxt/async_support/__init__.py +337 -0
  147. ccxt/async_support/abantether.py +316 -0
  148. ccxt/async_support/ace.py +1012 -0
  149. ccxt/async_support/afratether.py +293 -0
  150. ccxt/async_support/alpaca.py +1083 -0
  151. ccxt/async_support/arzinja.py +285 -0
  152. ccxt/async_support/arzplus.py +412 -0
  153. ccxt/async_support/ascendex.py +3330 -0
  154. ccxt/async_support/base/__init__.py +1 -0
  155. ccxt/async_support/base/exchange.py +1966 -0
  156. ccxt/async_support/base/throttler.py +50 -0
  157. ccxt/async_support/base/ws/__init__.py +38 -0
  158. ccxt/async_support/base/ws/aiohttp_client.py +125 -0
  159. ccxt/async_support/base/ws/cache.py +212 -0
  160. ccxt/async_support/base/ws/client.py +193 -0
  161. ccxt/async_support/base/ws/fast_client.py +96 -0
  162. ccxt/async_support/base/ws/functions.py +59 -0
  163. ccxt/async_support/base/ws/future.py +58 -0
  164. ccxt/async_support/base/ws/order_book.py +78 -0
  165. ccxt/async_support/base/ws/order_book_side.py +174 -0
  166. ccxt/async_support/bequant.py +33 -0
  167. ccxt/async_support/bigone.py +2113 -0
  168. ccxt/async_support/binance.py +12234 -0
  169. ccxt/async_support/binancecoinm.py +45 -0
  170. ccxt/async_support/binanceus.py +211 -0
  171. ccxt/async_support/binanceusdm.py +58 -0
  172. ccxt/async_support/bingx.py +4325 -0
  173. ccxt/async_support/bit2c.py +866 -0
  174. ccxt/async_support/bitbank.py +1001 -0
  175. ccxt/async_support/bitbay.py +17 -0
  176. ccxt/async_support/bitbns.py +1154 -0
  177. ccxt/async_support/bitcoincom.py +17 -0
  178. ccxt/async_support/bitfinex.py +1617 -0
  179. ccxt/async_support/bitfinex2.py +3552 -0
  180. ccxt/async_support/bitflyer.py +995 -0
  181. ccxt/async_support/bitget.py +8273 -0
  182. ccxt/async_support/bithumb.py +1061 -0
  183. ccxt/async_support/bitimen.py +401 -0
  184. ccxt/async_support/bitir.py +490 -0
  185. ccxt/async_support/bitmart.py +4415 -0
  186. ccxt/async_support/bitmex.py +2756 -0
  187. ccxt/async_support/bitopro.py +1630 -0
  188. ccxt/async_support/bitpanda.py +16 -0
  189. ccxt/async_support/bitpin.py +454 -0
  190. ccxt/async_support/bitrue.py +3027 -0
  191. ccxt/async_support/bitso.py +1670 -0
  192. ccxt/async_support/bitstamp.py +2203 -0
  193. ccxt/async_support/bitteam.py +2239 -0
  194. ccxt/async_support/bitvavo.py +1968 -0
  195. ccxt/async_support/bl3p.py +485 -0
  196. ccxt/async_support/blockchaincom.py +1104 -0
  197. ccxt/async_support/blofin.py +2066 -0
  198. ccxt/async_support/btcalpha.py +891 -0
  199. ccxt/async_support/btcbox.py +544 -0
  200. ccxt/async_support/btcmarkets.py +1221 -0
  201. ccxt/async_support/btcturk.py +911 -0
  202. ccxt/async_support/bybit.py +8159 -0
  203. ccxt/async_support/cex.py +1605 -0
  204. ccxt/async_support/coinbase.py +4475 -0
  205. ccxt/async_support/coinbaseadvanced.py +17 -0
  206. ccxt/async_support/coinbaseexchange.py +1734 -0
  207. ccxt/async_support/coinbaseinternational.py +1899 -0
  208. ccxt/async_support/coincatch.py +5069 -0
  209. ccxt/async_support/coincheck.py +815 -0
  210. ccxt/async_support/coinex.py +5526 -0
  211. ccxt/async_support/coinlist.py +2243 -0
  212. ccxt/async_support/coinmate.py +1067 -0
  213. ccxt/async_support/coinmetro.py +1797 -0
  214. ccxt/async_support/coinone.py +1127 -0
  215. ccxt/async_support/coinsph.py +1850 -0
  216. ccxt/async_support/coinspot.py +534 -0
  217. ccxt/async_support/cryptocom.py +2822 -0
  218. ccxt/async_support/currencycom.py +1950 -0
  219. ccxt/async_support/delta.py +3376 -0
  220. ccxt/async_support/deribit.py +3437 -0
  221. ccxt/async_support/digifinex.py +3960 -0
  222. ccxt/async_support/eterex.py +286 -0
  223. ccxt/async_support/excoino.py +399 -0
  224. ccxt/async_support/exir.py +375 -0
  225. ccxt/async_support/exmo.py +2462 -0
  226. ccxt/async_support/exnovin.py +360 -0
  227. ccxt/async_support/farhadexchange.py +266 -0
  228. ccxt/async_support/fmfwio.py +34 -0
  229. ccxt/async_support/gate.py +6976 -0
  230. ccxt/async_support/gateio.py +16 -0
  231. ccxt/async_support/gemini.py +1825 -0
  232. ccxt/async_support/hashkey.py +4150 -0
  233. ccxt/async_support/hitbtc.py +3423 -0
  234. ccxt/async_support/hitbtc3.py +16 -0
  235. ccxt/async_support/hitobit.py +391 -0
  236. ccxt/async_support/hollaex.py +1813 -0
  237. ccxt/async_support/htx.py +8506 -0
  238. ccxt/async_support/huobi.py +16 -0
  239. ccxt/async_support/huobijp.py +1801 -0
  240. ccxt/async_support/hyperliquid.py +2431 -0
  241. ccxt/async_support/idex.py +1766 -0
  242. ccxt/async_support/independentreserve.py +784 -0
  243. ccxt/async_support/indodax.py +1247 -0
  244. ccxt/async_support/jibitex.py +395 -0
  245. ccxt/async_support/kraken.py +2894 -0
  246. ccxt/async_support/krakenfutures.py +2601 -0
  247. ccxt/async_support/kucoin.py +4602 -0
  248. ccxt/async_support/kucoinfutures.py +2698 -0
  249. ccxt/async_support/kuna.py +1841 -0
  250. ccxt/async_support/latoken.py +1664 -0
  251. ccxt/async_support/lbank.py +2683 -0
  252. ccxt/async_support/luno.py +1067 -0
  253. ccxt/async_support/lykke.py +1270 -0
  254. ccxt/async_support/mercado.py +842 -0
  255. ccxt/async_support/mexc.py +5369 -0
  256. ccxt/async_support/ndax.py +2354 -0
  257. ccxt/async_support/nobitex.py +419 -0
  258. ccxt/async_support/novadax.py +1484 -0
  259. ccxt/async_support/oceanex.py +903 -0
  260. ccxt/async_support/okcoin.py +2936 -0
  261. ccxt/async_support/okexchange.py +349 -0
  262. ccxt/async_support/okx.py +7827 -0
  263. ccxt/async_support/ompfinex.py +472 -0
  264. ccxt/async_support/onetrading.py +1911 -0
  265. ccxt/async_support/oxfun.py +2773 -0
  266. ccxt/async_support/p2b.py +1194 -0
  267. ccxt/async_support/paradex.py +2015 -0
  268. ccxt/async_support/paymium.py +564 -0
  269. ccxt/async_support/phemex.py +4473 -0
  270. ccxt/async_support/poloniex.py +2232 -0
  271. ccxt/async_support/poloniexfutures.py +1717 -0
  272. ccxt/async_support/probit.py +1734 -0
  273. ccxt/async_support/ramzinex.py +476 -0
  274. ccxt/async_support/sarmayex.py +357 -0
  275. ccxt/async_support/sarrafex.py +478 -0
  276. ccxt/async_support/tabdeal.py +364 -0
  277. ccxt/async_support/tetherland.py +349 -0
  278. ccxt/async_support/timex.py +1593 -0
  279. ccxt/async_support/tokocrypto.py +2405 -0
  280. ccxt/async_support/tradeogre.py +608 -0
  281. ccxt/async_support/twox.py +326 -0
  282. ccxt/async_support/ubitex.py +409 -0
  283. ccxt/async_support/upbit.py +1833 -0
  284. ccxt/async_support/vertex.py +2922 -0
  285. ccxt/async_support/wallex.py +445 -0
  286. ccxt/async_support/wavesexchange.py +2473 -0
  287. ccxt/async_support/wazirx.py +1224 -0
  288. ccxt/async_support/whitebit.py +2469 -0
  289. ccxt/async_support/woo.py +3114 -0
  290. ccxt/async_support/woofipro.py +2533 -0
  291. ccxt/async_support/xt.py +4454 -0
  292. ccxt/async_support/yobit.py +1283 -0
  293. ccxt/async_support/zaif.py +725 -0
  294. ccxt/async_support/zonda.py +1828 -0
  295. ccxt/base/__init__.py +27 -0
  296. ccxt/base/decimal_to_precision.py +174 -0
  297. ccxt/base/errors.py +242 -0
  298. ccxt/base/exchange.py +5941 -0
  299. ccxt/base/precise.py +287 -0
  300. ccxt/base/types.py +502 -0
  301. ccxt/bequant.py +33 -0
  302. ccxt/bigone.py +2112 -0
  303. ccxt/binance.py +12233 -0
  304. ccxt/binancecoinm.py +45 -0
  305. ccxt/binanceus.py +211 -0
  306. ccxt/binanceusdm.py +58 -0
  307. ccxt/bingx.py +4324 -0
  308. ccxt/bit2c.py +866 -0
  309. ccxt/bitbank.py +1001 -0
  310. ccxt/bitbay.py +17 -0
  311. ccxt/bitbns.py +1154 -0
  312. ccxt/bitcoincom.py +17 -0
  313. ccxt/bitfinex.py +1617 -0
  314. ccxt/bitfinex2.py +3552 -0
  315. ccxt/bitflyer.py +995 -0
  316. ccxt/bitget.py +8272 -0
  317. ccxt/bithumb.py +1061 -0
  318. ccxt/bitimen.py +401 -0
  319. ccxt/bitir.py +490 -0
  320. ccxt/bitmart.py +4415 -0
  321. ccxt/bitmex.py +2756 -0
  322. ccxt/bitopro.py +1630 -0
  323. ccxt/bitpanda.py +16 -0
  324. ccxt/bitpin.py +454 -0
  325. ccxt/bitrue.py +3026 -0
  326. ccxt/bitso.py +1670 -0
  327. ccxt/bitstamp.py +2203 -0
  328. ccxt/bitteam.py +2239 -0
  329. ccxt/bitvavo.py +1968 -0
  330. ccxt/bl3p.py +485 -0
  331. ccxt/blockchaincom.py +1104 -0
  332. ccxt/blofin.py +2066 -0
  333. ccxt/btcalpha.py +891 -0
  334. ccxt/btcbox.py +544 -0
  335. ccxt/btcmarkets.py +1221 -0
  336. ccxt/btcturk.py +911 -0
  337. ccxt/bybit.py +8158 -0
  338. ccxt/cex.py +1605 -0
  339. ccxt/coinbase.py +4474 -0
  340. ccxt/coinbaseadvanced.py +17 -0
  341. ccxt/coinbaseexchange.py +1734 -0
  342. ccxt/coinbaseinternational.py +1899 -0
  343. ccxt/coincatch.py +5069 -0
  344. ccxt/coincheck.py +815 -0
  345. ccxt/coinex.py +5525 -0
  346. ccxt/coinlist.py +2243 -0
  347. ccxt/coinmate.py +1067 -0
  348. ccxt/coinmetro.py +1797 -0
  349. ccxt/coinone.py +1127 -0
  350. ccxt/coinsph.py +1850 -0
  351. ccxt/coinspot.py +534 -0
  352. ccxt/cryptocom.py +2822 -0
  353. ccxt/currencycom.py +1950 -0
  354. ccxt/delta.py +3376 -0
  355. ccxt/deribit.py +3437 -0
  356. ccxt/digifinex.py +3959 -0
  357. ccxt/eterex.py +286 -0
  358. ccxt/excoino.py +399 -0
  359. ccxt/exir.py +375 -0
  360. ccxt/exmo.py +2462 -0
  361. ccxt/exnovin.py +360 -0
  362. ccxt/farhadexchange.py +266 -0
  363. ccxt/fmfwio.py +34 -0
  364. ccxt/gate.py +6975 -0
  365. ccxt/gateio.py +16 -0
  366. ccxt/gemini.py +1824 -0
  367. ccxt/hashkey.py +4150 -0
  368. ccxt/hitbtc.py +3423 -0
  369. ccxt/hitbtc3.py +16 -0
  370. ccxt/hitobit.py +391 -0
  371. ccxt/hollaex.py +1813 -0
  372. ccxt/htx.py +8505 -0
  373. ccxt/huobi.py +16 -0
  374. ccxt/huobijp.py +1801 -0
  375. ccxt/hyperliquid.py +2430 -0
  376. ccxt/idex.py +1766 -0
  377. ccxt/independentreserve.py +784 -0
  378. ccxt/indodax.py +1247 -0
  379. ccxt/jibitex.py +395 -0
  380. ccxt/kraken.py +2894 -0
  381. ccxt/krakenfutures.py +2601 -0
  382. ccxt/kucoin.py +4601 -0
  383. ccxt/kucoinfutures.py +2698 -0
  384. ccxt/kuna.py +1841 -0
  385. ccxt/latoken.py +1664 -0
  386. ccxt/lbank.py +2682 -0
  387. ccxt/luno.py +1067 -0
  388. ccxt/lykke.py +1270 -0
  389. ccxt/mercado.py +842 -0
  390. ccxt/mexc.py +5369 -0
  391. ccxt/ndax.py +2354 -0
  392. ccxt/nobitex.py +419 -0
  393. ccxt/novadax.py +1484 -0
  394. ccxt/oceanex.py +903 -0
  395. ccxt/okcoin.py +2936 -0
  396. ccxt/okexchange.py +349 -0
  397. ccxt/okx.py +7826 -0
  398. ccxt/ompfinex.py +472 -0
  399. ccxt/onetrading.py +1911 -0
  400. ccxt/oxfun.py +2772 -0
  401. ccxt/p2b.py +1194 -0
  402. ccxt/paradex.py +2015 -0
  403. ccxt/paymium.py +564 -0
  404. ccxt/phemex.py +4473 -0
  405. ccxt/poloniex.py +2232 -0
  406. ccxt/poloniexfutures.py +1717 -0
  407. ccxt/pro/__init__.py +149 -0
  408. ccxt/pro/alpaca.py +685 -0
  409. ccxt/pro/ascendex.py +916 -0
  410. ccxt/pro/bequant.py +38 -0
  411. ccxt/pro/binance.py +3488 -0
  412. ccxt/pro/binancecoinm.py +28 -0
  413. ccxt/pro/binanceus.py +48 -0
  414. ccxt/pro/binanceusdm.py +31 -0
  415. ccxt/pro/bingx.py +1264 -0
  416. ccxt/pro/bitcoincom.py +34 -0
  417. ccxt/pro/bitfinex.py +621 -0
  418. ccxt/pro/bitfinex2.py +1083 -0
  419. ccxt/pro/bitget.py +1692 -0
  420. ccxt/pro/bithumb.py +368 -0
  421. ccxt/pro/bitmart.py +1449 -0
  422. ccxt/pro/bitmex.py +1656 -0
  423. ccxt/pro/bitopro.py +445 -0
  424. ccxt/pro/bitpanda.py +15 -0
  425. ccxt/pro/bitrue.py +447 -0
  426. ccxt/pro/bitstamp.py +522 -0
  427. ccxt/pro/bitvavo.py +1270 -0
  428. ccxt/pro/blockchaincom.py +738 -0
  429. ccxt/pro/blofin.py +692 -0
  430. ccxt/pro/bybit.py +2000 -0
  431. ccxt/pro/cex.py +1440 -0
  432. ccxt/pro/coinbase.py +678 -0
  433. ccxt/pro/coinbaseadvanced.py +16 -0
  434. ccxt/pro/coinbaseexchange.py +895 -0
  435. ccxt/pro/coinbaseinternational.py +620 -0
  436. ccxt/pro/coincatch.py +1464 -0
  437. ccxt/pro/coincheck.py +199 -0
  438. ccxt/pro/coinex.py +1061 -0
  439. ccxt/pro/coinone.py +395 -0
  440. ccxt/pro/cryptocom.py +947 -0
  441. ccxt/pro/currencycom.py +536 -0
  442. ccxt/pro/deribit.py +892 -0
  443. ccxt/pro/exmo.py +629 -0
  444. ccxt/pro/gate.py +1416 -0
  445. ccxt/pro/gateio.py +15 -0
  446. ccxt/pro/gemini.py +865 -0
  447. ccxt/pro/hashkey.py +802 -0
  448. ccxt/pro/hitbtc.py +1216 -0
  449. ccxt/pro/hollaex.py +563 -0
  450. ccxt/pro/htx.py +2215 -0
  451. ccxt/pro/huobi.py +15 -0
  452. ccxt/pro/huobijp.py +570 -0
  453. ccxt/pro/hyperliquid.py +525 -0
  454. ccxt/pro/idex.py +672 -0
  455. ccxt/pro/independentreserve.py +270 -0
  456. ccxt/pro/kraken.py +1356 -0
  457. ccxt/pro/krakenfutures.py +1492 -0
  458. ccxt/pro/kucoin.py +1133 -0
  459. ccxt/pro/kucoinfutures.py +1081 -0
  460. ccxt/pro/lbank.py +843 -0
  461. ccxt/pro/luno.py +303 -0
  462. ccxt/pro/mexc.py +1122 -0
  463. ccxt/pro/ndax.py +506 -0
  464. ccxt/pro/okcoin.py +698 -0
  465. ccxt/pro/okx.py +1851 -0
  466. ccxt/pro/onetrading.py +1275 -0
  467. ccxt/pro/oxfun.py +950 -0
  468. ccxt/pro/p2b.py +419 -0
  469. ccxt/pro/paradex.py +352 -0
  470. ccxt/pro/phemex.py +1441 -0
  471. ccxt/pro/poloniex.py +1166 -0
  472. ccxt/pro/poloniexfutures.py +990 -0
  473. ccxt/pro/probit.py +551 -0
  474. ccxt/pro/upbit.py +520 -0
  475. ccxt/pro/vertex.py +943 -0
  476. ccxt/pro/wazirx.py +749 -0
  477. ccxt/pro/whitebit.py +864 -0
  478. ccxt/pro/woo.py +1078 -0
  479. ccxt/pro/woofipro.py +1183 -0
  480. ccxt/pro/xt.py +1067 -0
  481. ccxt/probit.py +1734 -0
  482. ccxt/ramzinex.py +476 -0
  483. ccxt/sarmayex.py +357 -0
  484. ccxt/sarrafex.py +478 -0
  485. ccxt/static_dependencies/__init__.py +1 -0
  486. ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  487. ccxt/static_dependencies/ecdsa/_version.py +520 -0
  488. ccxt/static_dependencies/ecdsa/curves.py +56 -0
  489. ccxt/static_dependencies/ecdsa/der.py +221 -0
  490. ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  491. ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  492. ccxt/static_dependencies/ecdsa/keys.py +332 -0
  493. ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  494. ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  495. ccxt/static_dependencies/ecdsa/util.py +266 -0
  496. ccxt/static_dependencies/ethereum/__init__.py +7 -0
  497. ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  498. ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  499. ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  500. ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  501. ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  502. ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  503. ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  504. ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  505. ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  506. ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  507. ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  508. ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  509. ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  510. ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  511. ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  512. ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  513. ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  514. ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  515. ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  516. ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  517. ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  518. ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  519. ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  520. ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  521. ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  522. ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  523. ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  524. ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  525. ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  526. ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  527. ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  528. ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  529. ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  530. ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  531. ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  532. ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  533. ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  534. ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  535. ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  536. ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  537. ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  538. ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  539. ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  540. ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  541. ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  542. ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  543. ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  544. ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  545. ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  546. ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  547. ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  548. ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  549. ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  550. ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  551. ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  552. ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  553. ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  554. ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  555. ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  556. ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  557. ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  558. ccxt/static_dependencies/keccak/__init__.py +3 -0
  559. ccxt/static_dependencies/keccak/keccak.py +197 -0
  560. ccxt/static_dependencies/lark/__init__.py +38 -0
  561. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  562. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  563. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  564. ccxt/static_dependencies/lark/common.py +86 -0
  565. ccxt/static_dependencies/lark/exceptions.py +292 -0
  566. ccxt/static_dependencies/lark/grammar.py +130 -0
  567. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  568. ccxt/static_dependencies/lark/indenter.py +143 -0
  569. ccxt/static_dependencies/lark/lark.py +658 -0
  570. ccxt/static_dependencies/lark/lexer.py +678 -0
  571. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  572. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  573. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  574. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  575. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  576. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  577. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  578. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  579. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  580. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  581. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  582. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  583. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  584. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  585. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  586. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  587. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  588. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  589. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  590. ccxt/static_dependencies/lark/tree.py +267 -0
  591. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  592. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  593. ccxt/static_dependencies/lark/utils.py +343 -0
  594. ccxt/static_dependencies/lark/visitors.py +596 -0
  595. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  596. ccxt/static_dependencies/marshmallow/base.py +65 -0
  597. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  598. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  599. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  600. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  601. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  602. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  603. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  604. ccxt/static_dependencies/marshmallow/types.py +12 -0
  605. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  606. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  607. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  608. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  609. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  610. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  611. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  612. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  613. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  614. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  615. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  616. ccxt/static_dependencies/msgpack/__init__.py +55 -0
  617. ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  618. ccxt/static_dependencies/msgpack/ext.py +168 -0
  619. ccxt/static_dependencies/msgpack/fallback.py +951 -0
  620. ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  621. ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  622. ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  623. ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  624. ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  625. ccxt/static_dependencies/parsimonious/utils.py +40 -0
  626. ccxt/static_dependencies/starknet/__init__.py +0 -0
  627. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  628. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  629. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  630. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  631. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  632. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  633. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  634. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  635. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  636. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  637. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  638. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  639. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  640. ccxt/static_dependencies/starknet/common.py +15 -0
  641. ccxt/static_dependencies/starknet/constants.py +39 -0
  642. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  643. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  644. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  645. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  646. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  647. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  648. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  649. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  650. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  651. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  652. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  653. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  654. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  655. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  656. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  657. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  658. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  659. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  660. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  661. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  662. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  663. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  664. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  665. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  666. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  667. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  668. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  669. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  670. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  671. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  672. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  673. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  674. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  675. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  676. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  677. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  678. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  679. ccxt/static_dependencies/starkware/__init__.py +0 -0
  680. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  681. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  682. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  683. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  684. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  685. ccxt/static_dependencies/sympy/__init__.py +0 -0
  686. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  687. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  688. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  689. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  690. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  691. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  692. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  693. ccxt/static_dependencies/toolz/__init__.py +26 -0
  694. ccxt/static_dependencies/toolz/_signatures.py +784 -0
  695. ccxt/static_dependencies/toolz/_version.py +520 -0
  696. ccxt/static_dependencies/toolz/compatibility.py +30 -0
  697. ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  698. ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  699. ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  700. ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  701. ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  702. ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  703. ccxt/static_dependencies/toolz/recipes.py +46 -0
  704. ccxt/static_dependencies/toolz/utils.py +9 -0
  705. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  706. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  707. ccxt/tabdeal.py +364 -0
  708. ccxt/test/__init__.py +3 -0
  709. ccxt/test/base/__init__.py +29 -0
  710. ccxt/test/base/test_account.py +26 -0
  711. ccxt/test/base/test_balance.py +56 -0
  712. ccxt/test/base/test_borrow_interest.py +35 -0
  713. ccxt/test/base/test_borrow_rate.py +32 -0
  714. ccxt/test/base/test_calculate_fee.py +51 -0
  715. ccxt/test/base/test_crypto.py +127 -0
  716. ccxt/test/base/test_currency.py +76 -0
  717. ccxt/test/base/test_datetime.py +109 -0
  718. ccxt/test/base/test_decimal_to_precision.py +392 -0
  719. ccxt/test/base/test_deep_extend.py +68 -0
  720. ccxt/test/base/test_deposit_withdrawal.py +50 -0
  721. ccxt/test/base/test_exchange_datetime_functions.py +76 -0
  722. ccxt/test/base/test_funding_rate_history.py +29 -0
  723. ccxt/test/base/test_last_price.py +31 -0
  724. ccxt/test/base/test_ledger_entry.py +45 -0
  725. ccxt/test/base/test_ledger_item.py +48 -0
  726. ccxt/test/base/test_leverage_tier.py +33 -0
  727. ccxt/test/base/test_liquidation.py +50 -0
  728. ccxt/test/base/test_margin_mode.py +24 -0
  729. ccxt/test/base/test_margin_modification.py +35 -0
  730. ccxt/test/base/test_market.py +193 -0
  731. ccxt/test/base/test_number.py +411 -0
  732. ccxt/test/base/test_ohlcv.py +33 -0
  733. ccxt/test/base/test_open_interest.py +32 -0
  734. ccxt/test/base/test_order.py +64 -0
  735. ccxt/test/base/test_order_book.py +69 -0
  736. ccxt/test/base/test_position.py +60 -0
  737. ccxt/test/base/test_shared_methods.py +353 -0
  738. ccxt/test/base/test_status.py +24 -0
  739. ccxt/test/base/test_throttle.py +126 -0
  740. ccxt/test/base/test_ticker.py +92 -0
  741. ccxt/test/base/test_trade.py +47 -0
  742. ccxt/test/base/test_trading_fee.py +26 -0
  743. ccxt/test/base/test_transaction.py +39 -0
  744. ccxt/test/test_async.py +1649 -0
  745. ccxt/test/test_sync.py +1648 -0
  746. ccxt/test/tests_async.py +1558 -0
  747. ccxt/test/tests_helpers.py +287 -0
  748. ccxt/test/tests_init.py +39 -0
  749. ccxt/test/tests_sync.py +1555 -0
  750. ccxt/tetherland.py +349 -0
  751. ccxt/timex.py +1593 -0
  752. ccxt/tokocrypto.py +2405 -0
  753. ccxt/tradeogre.py +608 -0
  754. ccxt/twox.py +326 -0
  755. ccxt/ubitex.py +409 -0
  756. ccxt/upbit.py +1833 -0
  757. ccxt/vertex.py +2922 -0
  758. ccxt/wallex.py +445 -0
  759. ccxt/wavesexchange.py +2472 -0
  760. ccxt/wazirx.py +1224 -0
  761. ccxt/whitebit.py +2469 -0
  762. ccxt/woo.py +3114 -0
  763. ccxt/woofipro.py +2533 -0
  764. ccxt/xt.py +4453 -0
  765. ccxt/yobit.py +1283 -0
  766. ccxt/zaif.py +725 -0
  767. ccxt/zonda.py +1828 -0
  768. ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
  769. ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
  770. ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
  771. ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
  772. ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
ccxt/hollaex.py ADDED
@@ -0,0 +1,1813 @@
1
+ # -*- coding: utf-8 -*-
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
+
6
+ from ccxt.base.exchange import Exchange
7
+ from ccxt.abstract.hollaex import ImplicitAPI
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
10
+ from typing import List
11
+ from ccxt.base.errors import AuthenticationError
12
+ from ccxt.base.errors import ArgumentsRequired
13
+ from ccxt.base.errors import BadRequest
14
+ from ccxt.base.errors import InsufficientFunds
15
+ from ccxt.base.errors import OrderNotFound
16
+ from ccxt.base.errors import OrderImmediatelyFillable
17
+ from ccxt.base.errors import NetworkError
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+ from ccxt.base.precise import Precise
20
+
21
+
22
+ class hollaex(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(hollaex, self).describe(), {
26
+ 'id': 'hollaex',
27
+ 'name': 'HollaEx',
28
+ 'countries': ['KR'],
29
+ # 4 requests per second => 1000ms / 4 = 250 ms between requests
30
+ 'rateLimit': 250,
31
+ 'version': 'v2',
32
+ 'pro': True,
33
+ 'has': {
34
+ 'CORS': None,
35
+ 'spot': True,
36
+ 'margin': None,
37
+ 'swap': False,
38
+ 'future': False,
39
+ 'option': False,
40
+ 'addMargin': False,
41
+ 'cancelAllOrders': True,
42
+ 'cancelOrder': True,
43
+ 'createLimitBuyOrder': True,
44
+ 'createLimitSellOrder': True,
45
+ 'createMarketBuyOrder': True,
46
+ 'createMarketSellOrder': True,
47
+ 'createOrder': True,
48
+ 'createPostOnlyOrder': True,
49
+ 'createReduceOnlyOrder': False,
50
+ 'createStopLimitOrder': True,
51
+ 'createStopMarketOrder': True,
52
+ 'createStopOrder': True,
53
+ 'fetchBalance': True,
54
+ 'fetchBorrowRateHistories': False,
55
+ 'fetchBorrowRateHistory': False,
56
+ 'fetchClosedOrders': True,
57
+ 'fetchCrossBorrowRate': False,
58
+ 'fetchCrossBorrowRates': False,
59
+ 'fetchCurrencies': True,
60
+ 'fetchDepositAddress': 'emulated',
61
+ 'fetchDepositAddresses': True,
62
+ 'fetchDeposits': True,
63
+ 'fetchFundingHistory': False,
64
+ 'fetchFundingRate': False,
65
+ 'fetchFundingRateHistory': False,
66
+ 'fetchFundingRates': False,
67
+ 'fetchIndexOHLCV': False,
68
+ 'fetchIsolatedBorrowRate': False,
69
+ 'fetchIsolatedBorrowRates': False,
70
+ 'fetchLeverage': False,
71
+ 'fetchMarginMode': False,
72
+ 'fetchMarkets': True,
73
+ 'fetchMarkOHLCV': False,
74
+ 'fetchMyTrades': True,
75
+ 'fetchOHLCV': True,
76
+ 'fetchOpenInterestHistory': False,
77
+ 'fetchOpenOrder': True,
78
+ 'fetchOpenOrders': True,
79
+ 'fetchOrder': True,
80
+ 'fetchOrderBook': True,
81
+ 'fetchOrderBooks': True,
82
+ 'fetchOrders': True,
83
+ 'fetchPosition': False,
84
+ 'fetchPositionMode': False,
85
+ 'fetchPositions': False,
86
+ 'fetchPositionsRisk': False,
87
+ 'fetchPremiumIndexOHLCV': False,
88
+ 'fetchTicker': True,
89
+ 'fetchTickers': True,
90
+ 'fetchTrades': True,
91
+ 'fetchTradingFee': False,
92
+ 'fetchTradingFees': True,
93
+ 'fetchTransactions': False,
94
+ 'fetchTransfer': False,
95
+ 'fetchTransfers': False,
96
+ 'fetchWithdrawal': True,
97
+ 'fetchWithdrawals': True,
98
+ 'reduceMargin': False,
99
+ 'sandbox': True,
100
+ 'setLeverage': False,
101
+ 'setMarginMode': False,
102
+ 'setPositionMode': False,
103
+ 'transfer': False,
104
+ 'withdraw': True,
105
+ },
106
+ 'timeframes': {
107
+ '1m': '1m',
108
+ '5m': '5m',
109
+ '15m': '15m',
110
+ '1h': '1h',
111
+ '4h': '4h',
112
+ '1d': '1d',
113
+ '1w': '1w',
114
+ },
115
+ 'urls': {
116
+ 'logo': 'https://user-images.githubusercontent.com/1294454/75841031-ca375180-5ddd-11ea-8417-b975674c23cb.jpg',
117
+ 'test': {
118
+ 'rest': 'https://api.sandbox.hollaex.com',
119
+ },
120
+ 'api': {
121
+ 'rest': 'https://api.hollaex.com',
122
+ },
123
+ 'www': 'https://hollaex.com',
124
+ 'doc': 'https://apidocs.hollaex.com',
125
+ 'referral': 'https://pro.hollaex.com/signup?affiliation_code=QSWA6G',
126
+ },
127
+ 'precisionMode': TICK_SIZE,
128
+ 'requiredCredentials': {
129
+ 'apiKey': True,
130
+ 'secret': True,
131
+ },
132
+ 'api': {
133
+ 'public': {
134
+ 'get': {
135
+ 'health': 1,
136
+ 'constants': 1,
137
+ 'kit': 1,
138
+ 'tiers': 1,
139
+ 'ticker': 1,
140
+ 'tickers': 1,
141
+ 'orderbook': 1,
142
+ 'orderbooks': 1,
143
+ 'trades': 1,
144
+ 'chart': 1,
145
+ 'charts': 1,
146
+ 'minicharts': 1,
147
+ 'oracle/prices': 1,
148
+ 'quick-trade': 1,
149
+ # TradingView
150
+ 'udf/config': 1,
151
+ 'udf/history': 1,
152
+ 'udf/symbols': 1,
153
+ },
154
+ },
155
+ 'private': {
156
+ 'get': {
157
+ 'user': 1,
158
+ 'user/balance': 1,
159
+ 'user/deposits': 1,
160
+ 'user/withdrawals': 1,
161
+ 'user/withdrawal/fee': 1,
162
+ 'user/trades': 1,
163
+ 'orders': 1,
164
+ 'order': 1,
165
+ },
166
+ 'post': {
167
+ 'user/withdrawal': 1,
168
+ 'order': 1,
169
+ },
170
+ 'delete': {
171
+ 'order/all': 1,
172
+ 'order': 1,
173
+ },
174
+ },
175
+ },
176
+ 'fees': {
177
+ 'trading': {
178
+ 'tierBased': True,
179
+ 'percentage': True,
180
+ 'taker': 0.001,
181
+ 'maker': 0.001,
182
+ },
183
+ },
184
+ 'exceptions': {
185
+ 'broad': {
186
+ 'Invalid token': AuthenticationError,
187
+ 'Order not found': OrderNotFound,
188
+ 'Insufficient balance': InsufficientFunds,
189
+ 'Error 1001 - Order rejected. Order could not be submitted order was set to a post only order.': OrderImmediatelyFillable,
190
+ },
191
+ 'exact': {
192
+ '400': BadRequest,
193
+ '403': AuthenticationError,
194
+ '404': BadRequest,
195
+ '405': BadRequest,
196
+ '410': BadRequest,
197
+ '429': BadRequest,
198
+ '500': NetworkError,
199
+ '503': NetworkError,
200
+ },
201
+ },
202
+ 'options': {
203
+ # how many seconds before the authenticated request expires
204
+ 'api-expires': self.parse_to_int(self.timeout / 1000),
205
+ 'networks': {
206
+ 'BTC': 'btc',
207
+ 'ETH': 'eth',
208
+ 'ERC20': 'eth',
209
+ 'TRX': 'trx',
210
+ 'TRC20': 'trx',
211
+ 'XRP': 'xrp',
212
+ 'XLM': 'xlm',
213
+ 'BNB': 'bnb',
214
+ 'MATIC': 'matic',
215
+ },
216
+ },
217
+ })
218
+
219
+ def fetch_markets(self, params={}) -> List[Market]:
220
+ """
221
+ retrieves data on all markets for hollaex
222
+ :see: https://apidocs.hollaex.com/#constants
223
+ :param dict [params]: extra parameters specific to the exchange API endpoint
224
+ :returns dict[]: an array of objects representing market data
225
+ """
226
+ response = self.publicGetConstants(params)
227
+ #
228
+ # {
229
+ # "coins": {
230
+ # "xmr": {
231
+ # "id": 7,
232
+ # "fullname": "Monero",
233
+ # "symbol": "xmr",
234
+ # "active": True,
235
+ # "allow_deposit": True,
236
+ # "allow_withdrawal": True,
237
+ # "withdrawal_fee": 0.02,
238
+ # "min": 0.001,
239
+ # "max": 100000,
240
+ # "increment_unit": 0.001,
241
+ # "deposit_limits": {'1': 0, '2': 0, '3': 0, '4': 0, "5": 0, "6": 0},
242
+ # "withdrawal_limits": {'1': 10, '2': 15, '3': 100, '4': 100, '5': 200, '6': 300, '7': 350, '8': 400, "9": 500, "10": -1},
243
+ # "created_at": "2019-12-09T07:14:02.720Z",
244
+ # "updated_at": "2020-01-16T12:12:53.162Z"
245
+ # },
246
+ # # ...
247
+ # },
248
+ # "pairs": {
249
+ # "btc-usdt": {
250
+ # "id": 2,
251
+ # "name": "btc-usdt",
252
+ # "pair_base": "btc",
253
+ # "pair_2": "usdt",
254
+ # "taker_fees": {'1': 0.3, '2': 0.25, '3': 0.2, '4': 0.18, '5': 0.1, '6': 0.09, '7': 0.08, '8': 0.06, "9": 0.04, "10": 0},
255
+ # "maker_fees": {'1': 0.1, '2': 0.08, '3': 0.05, '4': 0.03, '5': 0, '6': 0, '7': 0, '8': 0, "9": 0, "10": 0},
256
+ # "min_size": 0.0001,
257
+ # "max_size": 1000,
258
+ # "min_price": 100,
259
+ # "max_price": 100000,
260
+ # "increment_size": 0.0001,
261
+ # "increment_price": 0.05,
262
+ # "active": True,
263
+ # "created_at": "2019-12-09T07:15:54.537Z",
264
+ # "updated_at": "2019-12-09T07:15:54.537Z"
265
+ # },
266
+ # },
267
+ # "config": {tiers: 10},
268
+ # "status": True
269
+ # }
270
+ #
271
+ pairs = self.safe_value(response, 'pairs', {})
272
+ keys = list(pairs.keys())
273
+ result = []
274
+ for i in range(0, len(keys)):
275
+ key = keys[i]
276
+ market = pairs[key]
277
+ baseId = self.safe_string(market, 'pair_base')
278
+ quoteId = self.safe_string(market, 'pair_2')
279
+ base = self.common_currency_code(baseId.upper())
280
+ quote = self.common_currency_code(quoteId.upper())
281
+ result.append({
282
+ 'id': self.safe_string(market, 'name'),
283
+ 'symbol': base + '/' + quote,
284
+ 'base': base,
285
+ 'quote': quote,
286
+ 'settle': None,
287
+ 'baseId': baseId,
288
+ 'quoteId': quoteId,
289
+ 'settleId': None,
290
+ 'type': 'spot',
291
+ 'spot': True,
292
+ 'margin': False,
293
+ 'swap': False,
294
+ 'future': False,
295
+ 'option': False,
296
+ 'active': self.safe_value(market, 'active'),
297
+ 'contract': False,
298
+ 'linear': None,
299
+ 'inverse': None,
300
+ 'contractSize': None,
301
+ 'expiry': None,
302
+ 'expiryDatetime': None,
303
+ 'strike': None,
304
+ 'optionType': None,
305
+ 'precision': {
306
+ 'amount': self.safe_number(market, 'increment_size'),
307
+ 'price': self.safe_number(market, 'increment_price'),
308
+ },
309
+ 'limits': {
310
+ 'leverage': {
311
+ 'min': None,
312
+ 'max': None,
313
+ },
314
+ 'amount': {
315
+ 'min': self.safe_number(market, 'min_size'),
316
+ 'max': self.safe_number(market, 'max_size'),
317
+ },
318
+ 'price': {
319
+ 'min': self.safe_number(market, 'min_price'),
320
+ 'max': self.safe_number(market, 'max_price'),
321
+ },
322
+ 'cost': {
323
+ 'min': None,
324
+ 'max': None,
325
+ },
326
+ },
327
+ 'created': self.parse8601(self.safe_string(market, 'created_at')),
328
+ 'info': market,
329
+ })
330
+ return result
331
+
332
+ def fetch_currencies(self, params={}) -> Currencies:
333
+ """
334
+ fetches all available currencies on an exchange
335
+ :see: https://apidocs.hollaex.com/#constants
336
+ :param dict [params]: extra parameters specific to the exchange API endpoint
337
+ :returns dict: an associative dictionary of currencies
338
+ """
339
+ response = self.publicGetConstants(params)
340
+ #
341
+ # {
342
+ # "coins":{
343
+ # "bch":{
344
+ # "id":4,
345
+ # "fullname":"Bitcoin Cash",
346
+ # "symbol":"bch",
347
+ # "active":true,
348
+ # "verified":true,
349
+ # "allow_deposit":true,
350
+ # "allow_withdrawal":true,
351
+ # "withdrawal_fee":0.0001,
352
+ # "min":0.001,
353
+ # "max":100000,
354
+ # "increment_unit":0.001,
355
+ # "logo":"https://bitholla.s3.ap-northeast-2.amazonaws.com/icon/BCH-hollaex-asset-01.svg",
356
+ # "code":"bch",
357
+ # "is_public":true,
358
+ # "meta":{},
359
+ # "estimated_price":null,
360
+ # "description":null,
361
+ # "type":"blockchain",
362
+ # "network":null,
363
+ # "standard":null,
364
+ # "issuer":"HollaEx",
365
+ # "withdrawal_fees":null,
366
+ # "created_at":"2019-08-09T10:45:43.367Z",
367
+ # "updated_at":"2021-12-13T03:08:32.372Z",
368
+ # "created_by":1,
369
+ # "owner_id":1
370
+ # },
371
+ # },
372
+ # "network":"https://api.hollaex.network"
373
+ # }
374
+ #
375
+ coins = self.safe_value(response, 'coins', {})
376
+ keys = list(coins.keys())
377
+ result: dict = {}
378
+ for i in range(0, len(keys)):
379
+ key = keys[i]
380
+ currency = coins[key]
381
+ id = self.safe_string(currency, 'symbol')
382
+ numericId = self.safe_integer(currency, 'id')
383
+ code = self.safe_currency_code(id)
384
+ name = self.safe_string(currency, 'fullname')
385
+ depositEnabled = self.safe_value(currency, 'allow_deposit')
386
+ withdrawEnabled = self.safe_value(currency, 'allow_withdrawal')
387
+ isActive = self.safe_value(currency, 'active')
388
+ active = isActive and depositEnabled and withdrawEnabled
389
+ fee = self.safe_number(currency, 'withdrawal_fee')
390
+ withdrawalLimits = self.safe_value(currency, 'withdrawal_limits', [])
391
+ result[code] = {
392
+ 'id': id,
393
+ 'numericId': numericId,
394
+ 'code': code,
395
+ 'info': currency,
396
+ 'name': name,
397
+ 'active': active,
398
+ 'deposit': depositEnabled,
399
+ 'withdraw': withdrawEnabled,
400
+ 'fee': fee,
401
+ 'precision': self.safe_number(currency, 'increment_unit'),
402
+ 'limits': {
403
+ 'amount': {
404
+ 'min': self.safe_number(currency, 'min'),
405
+ 'max': self.safe_number(currency, 'max'),
406
+ },
407
+ 'withdraw': {
408
+ 'min': None,
409
+ 'max': self.safe_value(withdrawalLimits, 0),
410
+ },
411
+ },
412
+ 'networks': {},
413
+ }
414
+ return result
415
+
416
+ def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}):
417
+ """
418
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data for multiple markets
419
+ :see: https://apidocs.hollaex.com/#orderbooks
420
+ :param str[]|None symbols: not used by hollaex fetchOrderBooks()
421
+ :param int [limit]: not used by hollaex fetchOrderBooks()
422
+ :param dict [params]: extra parameters specific to the exchange API endpoint
423
+ :returns dict: a dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbol
424
+ """
425
+ self.load_markets()
426
+ response = self.publicGetOrderbooks(params)
427
+ result: dict = {}
428
+ marketIds = list(response.keys())
429
+ for i in range(0, len(marketIds)):
430
+ marketId = marketIds[i]
431
+ orderbook = response[marketId]
432
+ symbol = self.safe_symbol(marketId, None, '-')
433
+ timestamp = self.parse8601(self.safe_string(orderbook, 'timestamp'))
434
+ result[symbol] = self.parse_order_book(response[marketId], symbol, timestamp)
435
+ return result
436
+
437
+ def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
438
+ """
439
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
440
+ :see: https://apidocs.hollaex.com/#orderbook
441
+ :param str symbol: unified symbol of the market to fetch the order book for
442
+ :param int [limit]: the maximum amount of order book entries to return
443
+ :param dict [params]: extra parameters specific to the exchange API endpoint
444
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
445
+ """
446
+ self.load_markets()
447
+ market = self.market(symbol)
448
+ request: dict = {
449
+ 'symbol': market['id'],
450
+ }
451
+ response = self.publicGetOrderbook(self.extend(request, params))
452
+ #
453
+ # {
454
+ # "btc-usdt": {
455
+ # "bids": [
456
+ # [8836.4, 1.022],
457
+ # [8800, 0.0668],
458
+ # [8797.75, 0.2398],
459
+ # ],
460
+ # "asks": [
461
+ # [8839.35, 1.5334],
462
+ # [8852.6, 0.0579],
463
+ # [8860.45, 0.1815],
464
+ # ],
465
+ # "timestamp": "2020-03-03T02:27:25.147Z"
466
+ # },
467
+ # "eth-usdt": {},
468
+ # # ...
469
+ # }
470
+ #
471
+ orderbook = self.safe_value(response, market['id'])
472
+ timestamp = self.parse8601(self.safe_string(orderbook, 'timestamp'))
473
+ return self.parse_order_book(orderbook, market['symbol'], timestamp)
474
+
475
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
476
+ """
477
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
478
+ :see: https://apidocs.hollaex.com/#ticker
479
+ :param str symbol: unified symbol of the market to fetch the ticker for
480
+ :param dict [params]: extra parameters specific to the exchange API endpoint
481
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
482
+ """
483
+ self.load_markets()
484
+ market = self.market(symbol)
485
+ request: dict = {
486
+ 'symbol': market['id'],
487
+ }
488
+ response = self.publicGetTicker(self.extend(request, params))
489
+ #
490
+ # {
491
+ # "open": 8615.55,
492
+ # "close": 8841.05,
493
+ # "high": 8921.1,
494
+ # "low": 8607,
495
+ # "last": 8841.05,
496
+ # "volume": 20.2802,
497
+ # "timestamp": "2020-03-03T03:11:18.964Z"
498
+ # }
499
+ #
500
+ return self.parse_ticker(response, market)
501
+
502
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
503
+ """
504
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
505
+ :see: https://apidocs.hollaex.com/#tickers
506
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
507
+ :param dict [params]: extra parameters specific to the exchange API endpoint
508
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
509
+ """
510
+ self.load_markets()
511
+ symbols = self.market_symbols(symbols)
512
+ response = self.publicGetTickers(params)
513
+ #
514
+ # {
515
+ # "bch-usdt": {
516
+ # "time": "2020-03-02T04:29:45.011Z",
517
+ # "open": 341.65,
518
+ # "close":337.9,
519
+ # "high":341.65,
520
+ # "low":337.3,
521
+ # "last":337.9,
522
+ # "volume":0.054,
523
+ # "symbol":"bch-usdt"
524
+ # },
525
+ # # ...
526
+ # }
527
+ #
528
+ return self.parse_tickers(response, symbols)
529
+
530
+ def parse_tickers(self, tickers, symbols: Strings = None, params={}) -> Tickers:
531
+ result: dict = {}
532
+ keys = list(tickers.keys())
533
+ for i in range(0, len(keys)):
534
+ key = keys[i]
535
+ ticker = tickers[key]
536
+ marketId = self.safe_string(ticker, 'symbol', key)
537
+ market = self.safe_market(marketId, None, '-')
538
+ symbol = market['symbol']
539
+ result[symbol] = self.extend(self.parse_ticker(ticker, market), params)
540
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
541
+
542
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
543
+ #
544
+ # fetchTicker
545
+ #
546
+ # {
547
+ # "open": 8615.55,
548
+ # "close": 8841.05,
549
+ # "high": 8921.1,
550
+ # "low": 8607,
551
+ # "last": 8841.05,
552
+ # "volume": 20.2802,
553
+ # "timestamp": "2020-03-03T03:11:18.964Z",
554
+ # }
555
+ #
556
+ # fetchTickers
557
+ #
558
+ # {
559
+ # "time": "2020-03-02T04:29:45.011Z",
560
+ # "open": 341.65,
561
+ # "close": 337.9,
562
+ # "high": 341.65,
563
+ # "low": 337.3,
564
+ # "last": 337.9,
565
+ # "volume": 0.054,
566
+ # "symbol": "bch-usdt"
567
+ # }
568
+ #
569
+ marketId = self.safe_string(ticker, 'symbol')
570
+ market = self.safe_market(marketId, market, '-')
571
+ symbol = market['symbol']
572
+ timestamp = self.parse8601(self.safe_string_2(ticker, 'time', 'timestamp'))
573
+ close = self.safe_string(ticker, 'close')
574
+ return self.safe_ticker({
575
+ 'symbol': symbol,
576
+ 'info': ticker,
577
+ 'timestamp': timestamp,
578
+ 'datetime': self.iso8601(timestamp),
579
+ 'high': self.safe_string(ticker, 'high'),
580
+ 'low': self.safe_string(ticker, 'low'),
581
+ 'bid': None,
582
+ 'bidVolume': None,
583
+ 'ask': None,
584
+ 'askVolume': None,
585
+ 'vwap': None,
586
+ 'open': self.safe_string(ticker, 'open'),
587
+ 'close': close,
588
+ 'last': self.safe_string(ticker, 'last', close),
589
+ 'previousClose': None,
590
+ 'change': None,
591
+ 'percentage': None,
592
+ 'average': None,
593
+ 'baseVolume': self.safe_string(ticker, 'volume'),
594
+ 'quoteVolume': None,
595
+ }, market)
596
+
597
+ def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
598
+ """
599
+ get the list of most recent trades for a particular symbol
600
+ :see: https://apidocs.hollaex.com/#trades
601
+ :param str symbol: unified symbol of the market to fetch trades for
602
+ :param int [since]: timestamp in ms of the earliest trade to fetch
603
+ :param int [limit]: the maximum amount of trades to fetch
604
+ :param dict [params]: extra parameters specific to the exchange API endpoint
605
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
606
+ """
607
+ self.load_markets()
608
+ market = self.market(symbol)
609
+ request: dict = {
610
+ 'symbol': market['id'],
611
+ }
612
+ response = self.publicGetTrades(self.extend(request, params))
613
+ #
614
+ # {
615
+ # "btc-usdt": [
616
+ # {
617
+ # "size": 0.5,
618
+ # "price": 8830,
619
+ # "side": "buy",
620
+ # "timestamp": "2020-03-03T04:44:33.034Z"
621
+ # },
622
+ # # ...
623
+ # ]
624
+ # }
625
+ #
626
+ trades = self.safe_list(response, market['id'], [])
627
+ return self.parse_trades(trades, market, since, limit)
628
+
629
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
630
+ #
631
+ # fetchTrades(public)
632
+ #
633
+ # {
634
+ # "size": 0.5,
635
+ # "price": 8830,
636
+ # "side": "buy",
637
+ # "timestamp": "2020-03-03T04:44:33.034Z"
638
+ # }
639
+ #
640
+ # fetchMyTrades(private)
641
+ # {
642
+ # "side":"sell",
643
+ # "symbol":"doge-usdt",
644
+ # "size":70,
645
+ # "price":0.147411,
646
+ # "timestamp":"2022-01-26T17:53:34.650Z",
647
+ # "order_id":"cba78ecb-4187-4da2-9d2f-c259aa693b5a",
648
+ # "fee":0.01031877,"fee_coin":"usdt"
649
+ # }
650
+ #
651
+ marketId = self.safe_string(trade, 'symbol')
652
+ market = self.safe_market(marketId, market, '-')
653
+ symbol = market['symbol']
654
+ datetime = self.safe_string(trade, 'timestamp')
655
+ timestamp = self.parse8601(datetime)
656
+ side = self.safe_string(trade, 'side')
657
+ orderId = self.safe_string(trade, 'order_id')
658
+ priceString = self.safe_string(trade, 'price')
659
+ amountString = self.safe_string(trade, 'size')
660
+ feeCostString = self.safe_string(trade, 'fee')
661
+ fee = None
662
+ if feeCostString is not None:
663
+ fee = {
664
+ 'cost': feeCostString,
665
+ 'currency': market['quote'],
666
+ }
667
+ return self.safe_trade({
668
+ 'info': trade,
669
+ 'id': None,
670
+ 'timestamp': timestamp,
671
+ 'datetime': datetime,
672
+ 'symbol': symbol,
673
+ 'order': orderId,
674
+ 'type': None,
675
+ 'side': side,
676
+ 'takerOrMaker': None,
677
+ 'price': priceString,
678
+ 'amount': amountString,
679
+ 'cost': None,
680
+ 'fee': fee,
681
+ }, market)
682
+
683
+ def fetch_trading_fees(self, params={}) -> TradingFees:
684
+ """
685
+ fetch the trading fees for multiple markets
686
+ :see: https://apidocs.hollaex.com/#tiers
687
+ :param dict [params]: extra parameters specific to the exchange API endpoint
688
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
689
+ """
690
+ self.load_markets()
691
+ response = self.publicGetTiers(params)
692
+ #
693
+ # {
694
+ # "1": {
695
+ # "id": "1",
696
+ # "name": "Silver",
697
+ # "icon": '',
698
+ # "description": "Your crypto journey starts here! Make your first deposit to start trading, and verify your account to level up!",
699
+ # "deposit_limit": "0",
700
+ # "withdrawal_limit": "1000",
701
+ # "fees": {
702
+ # "maker": {
703
+ # 'eth-btc': "0.1",
704
+ # 'ada-usdt': "0.1",
705
+ # ...
706
+ # },
707
+ # "taker": {
708
+ # 'eth-btc': "0.1",
709
+ # 'ada-usdt': "0.1",
710
+ # ...
711
+ # }
712
+ # },
713
+ # "note": "<ul>\n<li>Login and verify email</li>\n</ul>\n",
714
+ # "created_at": "2021-03-22T03:51:39.129Z",
715
+ # "updated_at": "2021-11-01T02:51:56.214Z"
716
+ # },
717
+ # ...
718
+ # }
719
+ #
720
+ firstTier = self.safe_value(response, '1', {})
721
+ fees = self.safe_value(firstTier, 'fees', {})
722
+ makerFees = self.safe_value(fees, 'maker', {})
723
+ takerFees = self.safe_value(fees, 'taker', {})
724
+ result: dict = {}
725
+ for i in range(0, len(self.symbols)):
726
+ symbol = self.symbols[i]
727
+ market = self.market(symbol)
728
+ makerString = self.safe_string(makerFees, market['id'])
729
+ takerString = self.safe_string(takerFees, market['id'])
730
+ result[symbol] = {
731
+ 'info': fees,
732
+ 'symbol': symbol,
733
+ 'maker': self.parse_number(Precise.string_div(makerString, '100')),
734
+ 'taker': self.parse_number(Precise.string_div(takerString, '100')),
735
+ 'percentage': True,
736
+ 'tierBased': True,
737
+ }
738
+ return result
739
+
740
+ def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
741
+ """
742
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
743
+ :see: https://apidocs.hollaex.com/#chart
744
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
745
+ :param str timeframe: the length of time each candle represents
746
+ :param int [since]: timestamp in ms of the earliest candle to fetch
747
+ :param int [limit]: the maximum amount of candles to fetch
748
+ :param dict [params]: extra parameters specific to the exchange API endpoint
749
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
750
+ """
751
+ self.load_markets()
752
+ market = self.market(symbol)
753
+ request: dict = {
754
+ 'symbol': market['id'],
755
+ 'resolution': self.safe_string(self.timeframes, timeframe, timeframe),
756
+ }
757
+ duration = self.parse_timeframe(timeframe)
758
+ if since is None:
759
+ if limit is None:
760
+ limit = 1000 # they have no defaults and can actually provide tens of thousands of bars in one request, but we should cap "default" at generous amount
761
+ end = self.seconds()
762
+ start = end - duration * limit
763
+ request['to'] = end
764
+ request['from'] = start
765
+ else:
766
+ if limit is None:
767
+ request['from'] = self.parse_to_int(since / 1000)
768
+ request['to'] = self.seconds()
769
+ else:
770
+ start = self.parse_to_int(since / 1000)
771
+ request['from'] = start
772
+ request['to'] = self.sum(start, duration * limit)
773
+ response = self.publicGetChart(self.extend(request, params))
774
+ #
775
+ # [
776
+ # {
777
+ # "time":"2020-03-02T20:00:00.000Z",
778
+ # "close":8872.1,
779
+ # "high":8872.1,
780
+ # "low":8858.6,
781
+ # "open":8858.6,
782
+ # "symbol":"btc-usdt",
783
+ # "volume":1.2922
784
+ # },
785
+ # ]
786
+ #
787
+ return self.parse_ohlcvs(response, market, timeframe, since, limit)
788
+
789
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
790
+ #
791
+ # {
792
+ # "time":"2020-03-02T20:00:00.000Z",
793
+ # "close":8872.1,
794
+ # "high":8872.1,
795
+ # "low":8858.6,
796
+ # "open":8858.6,
797
+ # "symbol":"btc-usdt",
798
+ # "volume":1.2922
799
+ # }
800
+ #
801
+ return [
802
+ self.parse8601(self.safe_string(ohlcv, 'time')),
803
+ self.safe_number(ohlcv, 'open'),
804
+ self.safe_number(ohlcv, 'high'),
805
+ self.safe_number(ohlcv, 'low'),
806
+ self.safe_number(ohlcv, 'close'),
807
+ self.safe_number(ohlcv, 'volume'),
808
+ ]
809
+
810
+ def parse_balance(self, response) -> Balances:
811
+ timestamp = self.parse8601(self.safe_string(response, 'updated_at'))
812
+ result: dict = {
813
+ 'info': response,
814
+ 'timestamp': timestamp,
815
+ 'datetime': self.iso8601(timestamp),
816
+ }
817
+ currencyIds = list(self.currencies_by_id.keys())
818
+ for i in range(0, len(currencyIds)):
819
+ currencyId = currencyIds[i]
820
+ code = self.safe_currency_code(currencyId)
821
+ account = self.account()
822
+ account['free'] = self.safe_string(response, currencyId + '_available')
823
+ account['total'] = self.safe_string(response, currencyId + '_balance')
824
+ result[code] = account
825
+ return self.safe_balance(result)
826
+
827
+ def fetch_balance(self, params={}) -> Balances:
828
+ """
829
+ query for balance and get the amount of funds available for trading or funds locked in orders
830
+ :see: https://apidocs.hollaex.com/#get-balance
831
+ :param dict [params]: extra parameters specific to the exchange API endpoint
832
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
833
+ """
834
+ self.load_markets()
835
+ response = self.privateGetUserBalance(params)
836
+ #
837
+ # {
838
+ # "updated_at": "2020-03-02T22:27:38.428Z",
839
+ # "btc_balance": 0,
840
+ # "btc_pending": 0,
841
+ # "btc_available": 0,
842
+ # "eth_balance": 0,
843
+ # "eth_pending": 0,
844
+ # "eth_available": 0,
845
+ # # ...
846
+ # }
847
+ #
848
+ return self.parse_balance(response)
849
+
850
+ def fetch_open_order(self, id: str, symbol: Str = None, params={}):
851
+ """
852
+ fetch an open order by it's id
853
+ :see: https://apidocs.hollaex.com/#get-order
854
+ :param str id: order id
855
+ :param str symbol: not used by hollaex fetchOpenOrder()
856
+ :param dict [params]: extra parameters specific to the exchange API endpoint
857
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
858
+ """
859
+ self.load_markets()
860
+ request: dict = {
861
+ 'order_id': id,
862
+ }
863
+ response = self.privateGetOrder(self.extend(request, params))
864
+ #
865
+ # {
866
+ # "id": "string",
867
+ # "side": "sell",
868
+ # "symbol": "xht-usdt",
869
+ # "size": 0.1,
870
+ # "filled": 0,
871
+ # "stop": null,
872
+ # "fee": 0,
873
+ # "fee_coin": "usdt",
874
+ # "type": "limit",
875
+ # "price": 1.09,
876
+ # "status": "new",
877
+ # "created_by": 116,
878
+ # "created_at": "2021-02-17T02:32:38.910Z",
879
+ # "updated_at": "2021-02-17T02:32:38.910Z",
880
+ # "User": {
881
+ # "id": 116,
882
+ # "email": "fight@club.com",
883
+ # "username": "narrator",
884
+ # "exchange_id": 176
885
+ # }
886
+ # }
887
+ #
888
+ return self.parse_order(response)
889
+
890
+ def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
891
+ """
892
+ fetch all unfilled currently open orders
893
+ :see: https://apidocs.hollaex.com/#get-all-orders
894
+ :param str symbol: unified market symbol
895
+ :param int [since]: the earliest time in ms to fetch open orders for
896
+ :param int [limit]: the maximum number of open orders structures to retrieve
897
+ :param dict [params]: extra parameters specific to the exchange API endpoint
898
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
899
+ """
900
+ request: dict = {
901
+ 'open': True,
902
+ }
903
+ return self.fetch_orders(symbol, since, limit, self.extend(request, params))
904
+
905
+ def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
906
+ """
907
+ fetches information on multiple closed orders made by the user
908
+ :see: https://apidocs.hollaex.com/#get-all-orders
909
+ :param str symbol: unified market symbol of the market orders were made in
910
+ :param int [since]: the earliest time in ms to fetch orders for
911
+ :param int [limit]: the maximum number of order structures to retrieve
912
+ :param dict [params]: extra parameters specific to the exchange API endpoint
913
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
914
+ """
915
+ request: dict = {
916
+ 'open': False,
917
+ }
918
+ return self.fetch_orders(symbol, since, limit, self.extend(request, params))
919
+
920
+ def fetch_order(self, id: str, symbol: Str = None, params={}):
921
+ """
922
+ fetches information on an order made by the user
923
+ :see: https://apidocs.hollaex.com/#get-order
924
+ :param str symbol: unified symbol of the market the order was made in
925
+ :param dict [params]: extra parameters specific to the exchange API endpoint
926
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
927
+ """
928
+ self.load_markets()
929
+ request: dict = {
930
+ 'order_id': id,
931
+ }
932
+ response = self.privateGetOrder(self.extend(request, params))
933
+ # {
934
+ # "id": "string",
935
+ # "side": "sell",
936
+ # "symbol": "xht-usdt",
937
+ # "size": 0.1,
938
+ # "filled": 0,
939
+ # "stop": null,
940
+ # "fee": 0,
941
+ # "fee_coin": "usdt",
942
+ # "type": "limit",
943
+ # "price": 1.09,
944
+ # "status": "new",
945
+ # "created_by": 116,
946
+ # "created_at": "2021-02-17T02:32:38.910Z",
947
+ # "updated_at": "2021-02-17T02:32:38.910Z",
948
+ # "User": {
949
+ # "id": 116,
950
+ # "email": "fight@club.com",
951
+ # "username": "narrator",
952
+ # "exchange_id": 176
953
+ # }
954
+ # }
955
+ order = response
956
+ if order is None:
957
+ raise OrderNotFound(self.id + ' fetchOrder() could not find order id ' + id)
958
+ return self.parse_order(order)
959
+
960
+ def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
961
+ """
962
+ fetches information on multiple orders made by the user
963
+ :see: https://apidocs.hollaex.com/#get-all-orders
964
+ :param str symbol: unified market symbol of the market orders were made in
965
+ :param int [since]: the earliest time in ms to fetch orders for
966
+ :param int [limit]: the maximum number of order structures to retrieve
967
+ :param dict [params]: extra parameters specific to the exchange API endpoint
968
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
969
+ """
970
+ self.load_markets()
971
+ market = None
972
+ request: dict = {
973
+ # 'symbol': market['id'],
974
+ # 'side': 'buy', # 'sell'
975
+ # 'status': 'new', # 'filled', 'pfilled', 'canceled'
976
+ # 'open': True,
977
+ # 'limit': limit, # default 50, max 100
978
+ # 'page': 1,
979
+ # 'order_by': 'created_at', # id, ...
980
+ # 'order': 'asc', # 'desc'
981
+ # 'start_date': self.iso8601(since),
982
+ # 'end_date': self.iso8601(self.milliseconds()),
983
+ }
984
+ if symbol is not None:
985
+ market = self.market(symbol)
986
+ request['symbol'] = market['id']
987
+ if since is not None:
988
+ request['start_date'] = self.iso8601(since)
989
+ if limit is not None:
990
+ request['limit'] = limit # default 50, max 100
991
+ response = self.privateGetOrders(self.extend(request, params))
992
+ #
993
+ # {
994
+ # "count": 1,
995
+ # "data": [
996
+ # {
997
+ # "id": "string",
998
+ # "side": "sell",
999
+ # "symbol": "xht-usdt",
1000
+ # "size": 0.1,
1001
+ # "filled": 0,
1002
+ # "stop": null,
1003
+ # "fee": 0,
1004
+ # "fee_coin": "usdt",
1005
+ # "type": "limit",
1006
+ # "price": 1.09,
1007
+ # "status": "new",
1008
+ # "created_by": 116,
1009
+ # "created_at": "2021-02-17T02:32:38.910Z",
1010
+ # "updated_at": "2021-02-17T02:32:38.910Z",
1011
+ # "User": {
1012
+ # "id": 116,
1013
+ # "email": "fight@club.com",
1014
+ # "username": "narrator",
1015
+ # "exchange_id": 176
1016
+ # }
1017
+ # }
1018
+ # ]
1019
+ # }
1020
+ #
1021
+ data = self.safe_list(response, 'data', [])
1022
+ return self.parse_orders(data, market, since, limit)
1023
+
1024
+ def parse_order_status(self, status: Str):
1025
+ statuses: dict = {
1026
+ 'new': 'open',
1027
+ 'pfilled': 'open',
1028
+ 'filled': 'closed',
1029
+ 'canceled': 'canceled',
1030
+ }
1031
+ return self.safe_string(statuses, status, status)
1032
+
1033
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1034
+ #
1035
+ # createOrder, fetchOpenOrder, fetchOpenOrders
1036
+ #
1037
+ # {
1038
+ # "id":"10644b7e-3c90-4ba9-bc3b-188f3a4e9cfd",
1039
+ # "created_by":140093,
1040
+ # "exchange_id":22,
1041
+ # "side":"buy",
1042
+ # "symbol":"doge-usdt",
1043
+ # "type":"limit",
1044
+ # "price":0.05,
1045
+ # "size":10,
1046
+ # "stop":null,
1047
+ # "filled":0,
1048
+ # "status":"canceled",
1049
+ # "fee":0,
1050
+ # "fee_coin":"doge",
1051
+ # "meta": { # optional field only returned for postOnly orders
1052
+ # "post_only":true
1053
+ # },
1054
+ # "fee_structure": {
1055
+ # "maker":0.1,
1056
+ # "taker":0.1
1057
+ # },
1058
+ # "created_at":"2022-05-31T08:14:14.747Z",
1059
+ # "updated_at":"2022-05-31T08:14:23.727Z"
1060
+ # }
1061
+ #
1062
+ marketId = self.safe_string(order, 'symbol')
1063
+ symbol = self.safe_symbol(marketId, market, '-')
1064
+ id = self.safe_string(order, 'id')
1065
+ timestamp = self.parse8601(self.safe_string(order, 'created_at'))
1066
+ type = self.safe_string(order, 'type')
1067
+ side = self.safe_string(order, 'side')
1068
+ price = self.safe_string(order, 'price')
1069
+ stopPrice = self.safe_string(order, 'stop')
1070
+ amount = self.safe_string(order, 'size')
1071
+ filled = self.safe_string(order, 'filled')
1072
+ status = self.parse_order_status(self.safe_string(order, 'status'))
1073
+ meta = self.safe_value(order, 'meta', {})
1074
+ postOnly = self.safe_bool(meta, 'post_only', False)
1075
+ return self.safe_order({
1076
+ 'id': id,
1077
+ 'clientOrderId': None,
1078
+ 'timestamp': timestamp,
1079
+ 'datetime': self.iso8601(timestamp),
1080
+ 'lastTradeTimestamp': None,
1081
+ 'status': status,
1082
+ 'symbol': symbol,
1083
+ 'type': type,
1084
+ 'timeInForce': None,
1085
+ 'postOnly': postOnly,
1086
+ 'side': side,
1087
+ 'price': price,
1088
+ 'stopPrice': stopPrice,
1089
+ 'triggerPrice': stopPrice,
1090
+ 'amount': amount,
1091
+ 'filled': filled,
1092
+ 'remaining': None,
1093
+ 'cost': None,
1094
+ 'trades': None,
1095
+ 'fee': None,
1096
+ 'info': order,
1097
+ 'average': None,
1098
+ }, market)
1099
+
1100
+ def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1101
+ """
1102
+ create a trade order
1103
+ :see: https://apidocs.hollaex.com/#create-order
1104
+ :param str symbol: unified symbol of the market to create an order in
1105
+ :param str type: 'market' or 'limit'
1106
+ :param str side: 'buy' or 'sell'
1107
+ :param float amount: how much of currency you want to trade in units of base currency
1108
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1109
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1110
+ :param float [params.triggerPrice]: the price at which a trigger order is triggered at
1111
+ :param bool [params.postOnly]: if True, the order will only be posted to the order book and not executed immediately
1112
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1113
+ """
1114
+ self.load_markets()
1115
+ market = self.market(symbol)
1116
+ convertedAmount = float(self.amount_to_precision(symbol, amount))
1117
+ request: dict = {
1118
+ 'symbol': market['id'],
1119
+ 'side': side,
1120
+ 'size': self.normalize_number_if_needed(convertedAmount),
1121
+ 'type': type,
1122
+ # 'stop': float(self.price_to_precision(symbol, stopPrice)),
1123
+ # 'meta': {}, # other options such
1124
+ }
1125
+ stopPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop'])
1126
+ meta = self.safe_value(params, 'meta', {})
1127
+ exchangeSpecificParam = self.safe_bool(meta, 'post_only', False)
1128
+ isMarketOrder = type == 'market'
1129
+ postOnly = self.is_post_only(isMarketOrder, exchangeSpecificParam, params)
1130
+ if not isMarketOrder:
1131
+ convertedPrice = float(self.price_to_precision(symbol, price))
1132
+ request['price'] = self.normalize_number_if_needed(convertedPrice)
1133
+ if stopPrice is not None:
1134
+ request['stop'] = self.normalize_number_if_needed(float(self.price_to_precision(symbol, stopPrice)))
1135
+ if postOnly:
1136
+ request['meta'] = {'post_only': True}
1137
+ params = self.omit(params, ['postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stop'])
1138
+ response = self.privatePostOrder(self.extend(request, params))
1139
+ #
1140
+ # {
1141
+ # "fee": 0,
1142
+ # "meta": {},
1143
+ # "symbol": "xht-usdt",
1144
+ # "side": "sell",
1145
+ # "size": 0.1,
1146
+ # "type": "limit",
1147
+ # "price": 1,
1148
+ # "fee_structure": {
1149
+ # "maker": 0.2,
1150
+ # "taker": 0.2
1151
+ # },
1152
+ # "fee_coin": "usdt",
1153
+ # "id": "string",
1154
+ # "created_by": 116,
1155
+ # "filled": 0,
1156
+ # "status": "new",
1157
+ # "updated_at": "2021-02-17T03:03:19.231Z",
1158
+ # "created_at": "2021-02-17T03:03:19.231Z",
1159
+ # "stop": null
1160
+ # }
1161
+ #
1162
+ return self.parse_order(response, market)
1163
+
1164
+ def cancel_order(self, id: str, symbol: Str = None, params={}):
1165
+ """
1166
+ cancels an open order
1167
+ :see: https://apidocs.hollaex.com/#cancel-order
1168
+ :param str id: order id
1169
+ :param str symbol: unified symbol of the market the order was made in
1170
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1171
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1172
+ """
1173
+ self.load_markets()
1174
+ request: dict = {
1175
+ 'order_id': id,
1176
+ }
1177
+ response = self.privateDeleteOrder(self.extend(request, params))
1178
+ #
1179
+ # {
1180
+ # "title": "string",
1181
+ # "symbol": "xht-usdt",
1182
+ # "side": "sell",
1183
+ # "size": 1,
1184
+ # "type": "limit",
1185
+ # "price": 0.1,
1186
+ # "id": "string",
1187
+ # "created_by": 34,
1188
+ # "filled": 0
1189
+ # }
1190
+ #
1191
+ return self.parse_order(response)
1192
+
1193
+ def cancel_all_orders(self, symbol: Str = None, params={}):
1194
+ """
1195
+ cancel all open orders in a market
1196
+ :see: https://apidocs.hollaex.com/#cancel-all-orders
1197
+ :param str symbol: unified market symbol of the market to cancel orders in
1198
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1199
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1200
+ """
1201
+ if symbol is None:
1202
+ raise ArgumentsRequired(self.id + ' cancelAllOrders() requires a symbol argument')
1203
+ self.load_markets()
1204
+ request: dict = {}
1205
+ market = None
1206
+ market = self.market(symbol)
1207
+ request['symbol'] = market['id']
1208
+ response = self.privateDeleteOrderAll(self.extend(request, params))
1209
+ #
1210
+ # [
1211
+ # {
1212
+ # "title": "string",
1213
+ # "symbol": "xht-usdt",
1214
+ # "side": "sell",
1215
+ # "size": 1,
1216
+ # "type": "limit",
1217
+ # "price": 0.1,
1218
+ # "id": "string",
1219
+ # "created_by": 34,
1220
+ # "filled": 0
1221
+ # }
1222
+ # ]
1223
+ #
1224
+ return self.parse_orders(response, market)
1225
+
1226
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1227
+ """
1228
+ fetch all trades made by the user
1229
+ :see: https://apidocs.hollaex.com/#get-trades
1230
+ :param str symbol: unified market symbol
1231
+ :param int [since]: the earliest time in ms to fetch trades for
1232
+ :param int [limit]: the maximum number of trades structures to retrieve
1233
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1234
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1235
+ """
1236
+ self.load_markets()
1237
+ request: dict = {
1238
+ # 'symbol': market['id'],
1239
+ # 'limit': 50, # default 50, max 100
1240
+ # 'page': 1, # page of data to retrieve
1241
+ # 'order_by': 'timestamp', # field to order data
1242
+ # 'order': 'asc', # asc or desc
1243
+ # 'start_date': 123, # starting date of queried data
1244
+ # 'end_date': 321, # ending date of queried data
1245
+ }
1246
+ market = None
1247
+ if symbol is not None:
1248
+ market = self.market(symbol)
1249
+ request['symbol'] = market['id']
1250
+ if limit is not None:
1251
+ request['limit'] = limit # default 50, max 100
1252
+ if since is not None:
1253
+ request['start_date'] = self.iso8601(since)
1254
+ response = self.privateGetUserTrades(self.extend(request, params))
1255
+ #
1256
+ # {
1257
+ # "count": 1,
1258
+ # "data": [
1259
+ # {
1260
+ # "side": "buy",
1261
+ # "symbol": "eth-usdt",
1262
+ # "size": 0.086,
1263
+ # "price": 226.19,
1264
+ # "timestamp": "2020-03-03T08:03:55.459Z",
1265
+ # "fee": 0.1
1266
+ # }
1267
+ # ]
1268
+ # }
1269
+ #
1270
+ data = self.safe_list(response, 'data', [])
1271
+ return self.parse_trades(data, market, since, limit)
1272
+
1273
+ def parse_deposit_address(self, depositAddress, currency: Currency = None):
1274
+ #
1275
+ # {
1276
+ # "currency":"usdt",
1277
+ # "address":"TECLD9XBH31XpyykdHU3uEAeUK7E6Lrmik",
1278
+ # "network":"trx",
1279
+ # "standard":null,
1280
+ # "is_valid":true,
1281
+ # "created_at":"2021-05-12T02:43:05.446Z"
1282
+ # }
1283
+ #
1284
+ address = self.safe_string(depositAddress, 'address')
1285
+ tag = None
1286
+ if address is not None:
1287
+ parts = address.split(':')
1288
+ address = self.safe_string(parts, 0)
1289
+ tag = self.safe_string(parts, 1)
1290
+ self.check_address(address)
1291
+ currencyId = self.safe_string(depositAddress, 'currency')
1292
+ currency = self.safe_currency(currencyId, currency)
1293
+ network = self.safe_string(depositAddress, 'network')
1294
+ return {
1295
+ 'currency': currency['code'],
1296
+ 'address': address,
1297
+ 'tag': tag,
1298
+ 'network': network,
1299
+ 'info': depositAddress,
1300
+ }
1301
+
1302
+ def fetch_deposit_addresses(self, codes: Strings = None, params={}):
1303
+ """
1304
+ fetch deposit addresses for multiple currencies and chain types
1305
+ :see: https://apidocs.hollaex.com/#get-user
1306
+ :param str[]|None codes: list of unified currency codes, default is None
1307
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1308
+ :returns dict: a list of `address structures <https://docs.ccxt.com/#/?id=address-structure>`
1309
+ """
1310
+ self.load_markets()
1311
+ network = self.safe_string(params, 'network')
1312
+ params = self.omit(params, 'network')
1313
+ response = self.privateGetUser(params)
1314
+ #
1315
+ # {
1316
+ # "id":620,
1317
+ # "email":"igor.kroitor@gmail.com",
1318
+ # "full_name":"",
1319
+ # "gender":false,
1320
+ # "nationality":"",
1321
+ # "dob":null,
1322
+ # "phone_number":"",
1323
+ # "address":{"city":"","address":"","country":"","postal_code":""},
1324
+ # "id_data":{"note":"","type":"","number":"","status":0,"issued_date":"","expiration_date":""},
1325
+ # "bank_account":[],
1326
+ # "crypto_wallet":{},
1327
+ # "verification_level":1,
1328
+ # "email_verified":true,
1329
+ # "otp_enabled":true,
1330
+ # "activated":true,
1331
+ # "username":"igor.kroitor",
1332
+ # "affiliation_code":"QSWA6G",
1333
+ # "settings":{
1334
+ # "chat":{"set_username":false},
1335
+ # "risk":{"popup_warning":false,"order_portfolio_percentage":20},
1336
+ # "audio":{"public_trade":false,"order_completed":true,"order_partially_completed":true},
1337
+ # "language":"en",
1338
+ # "interface":{"theme":"white","order_book_levels":10},
1339
+ # "notification":{"popup_order_completed":true,"popup_order_confirmation":true,"popup_order_partially_filled":true}
1340
+ # },
1341
+ # "affiliation_rate":0,
1342
+ # "network_id":10620,
1343
+ # "discount":0,
1344
+ # "created_at":"2021-03-24T02:37:57.379Z",
1345
+ # "updated_at":"2021-03-24T02:37:57.379Z",
1346
+ # "balance":{
1347
+ # "btc_balance":0,
1348
+ # "btc_available":0,
1349
+ # "eth_balance":0.000914,
1350
+ # "eth_available":0.000914,
1351
+ # "updated_at":"2020-03-04T04:03:27.174Z
1352
+ # "},
1353
+ # "wallet":[
1354
+ # {"currency":"usdt","address":"TECLD9XBH31XpyykdHU3uEAeUK7E6Lrmik","network":"trx","standard":null,"is_valid":true,"created_at":"2021-05-12T02:43:05.446Z"},
1355
+ # {"currency":"xrp","address":"rGcSzmuRx8qngPRnrvpCKkP9V4njeCPGCv:286741597","network":"xrp","standard":null,"is_valid":true,"created_at":"2021-05-12T02:49:01.273Z"}
1356
+ # ]
1357
+ # }
1358
+ #
1359
+ wallet = self.safe_value(response, 'wallet', [])
1360
+ addresses = wallet if (network is None) else self.filter_by(wallet, 'network', network)
1361
+ return self.parse_deposit_addresses(addresses, codes)
1362
+
1363
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1364
+ """
1365
+ fetch all deposits made to an account
1366
+ :see: https://apidocs.hollaex.com/#get-deposits
1367
+ :param str code: unified currency code
1368
+ :param int [since]: the earliest time in ms to fetch deposits for
1369
+ :param int [limit]: the maximum number of deposits structures to retrieve
1370
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1371
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1372
+ """
1373
+ self.load_markets()
1374
+ request: dict = {
1375
+ # 'currency': currency['id'],
1376
+ # 'limit': 50, # default 50, max 100
1377
+ # 'page': 1, # page of data to retrieve
1378
+ # 'order_by': 'timestamp', # field to order data
1379
+ # 'order': 'asc', # asc or desc
1380
+ # 'start_date': 123, # starting date of queried data
1381
+ # 'end_date': 321, # ending date of queried data
1382
+ }
1383
+ currency = None
1384
+ if code is not None:
1385
+ currency = self.currency(code)
1386
+ request['currency'] = currency['id']
1387
+ if limit is not None:
1388
+ request['limit'] = limit # default 50, max 100
1389
+ if since is not None:
1390
+ request['start_date'] = self.iso8601(since)
1391
+ response = self.privateGetUserDeposits(self.extend(request, params))
1392
+ #
1393
+ # {
1394
+ # "count": 1,
1395
+ # "data": [
1396
+ # {
1397
+ # "id": 539,
1398
+ # "amount": 20,
1399
+ # "fee": 0,
1400
+ # "address": "0x5c0cc98270d7089408fcbcc8e2131287f5be2306",
1401
+ # "transaction_id": "0xd4006327a5ec2c41adbdcf566eaaba6597c3d45906abe78ea1a4a022647c2e28",
1402
+ # "status": True,
1403
+ # "dismissed": False,
1404
+ # "rejected": False,
1405
+ # "description": "",
1406
+ # "type": "deposit",
1407
+ # "currency": "usdt",
1408
+ # "created_at": "2020-03-03T07:56:36.198Z",
1409
+ # "updated_at": "2020-03-03T08:00:05.674Z",
1410
+ # "user_id": 620
1411
+ # }
1412
+ # ]
1413
+ # }
1414
+ #
1415
+ data = self.safe_list(response, 'data', [])
1416
+ return self.parse_transactions(data, currency, since, limit)
1417
+
1418
+ def fetch_withdrawal(self, id: str, code: Str = None, params={}):
1419
+ """
1420
+ fetch data on a currency withdrawal via the withdrawal id
1421
+ :see: https://apidocs.hollaex.com/#get-withdrawals
1422
+ :param str id: withdrawal id
1423
+ :param str code: unified currency code of the currency withdrawn, default is None
1424
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1425
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1426
+ """
1427
+ self.load_markets()
1428
+ request: dict = {
1429
+ 'transaction_id': id,
1430
+ }
1431
+ currency = None
1432
+ if code is not None:
1433
+ currency = self.currency(code)
1434
+ request['currency'] = currency['id']
1435
+ response = self.privateGetUserWithdrawals(self.extend(request, params))
1436
+ #
1437
+ # {
1438
+ # "count": 1,
1439
+ # "data": [
1440
+ # {
1441
+ # "id": 539,
1442
+ # "amount": 20,
1443
+ # "fee": 0,
1444
+ # "address": "0x5c0cc98270d7089408fcbcc8e2131287f5be2306",
1445
+ # "transaction_id": "0xd4006327a5ec2c41adbdcf566eaaba6597c3d45906abe78ea1a4a022647c2e28",
1446
+ # "status": True,
1447
+ # "dismissed": False,
1448
+ # "rejected": False,
1449
+ # "description": "",
1450
+ # "type": "withdrawal",
1451
+ # "currency": "usdt",
1452
+ # "created_at": "2020-03-03T07:56:36.198Z",
1453
+ # "updated_at": "2020-03-03T08:00:05.674Z",
1454
+ # "user_id": 620
1455
+ # }
1456
+ # ]
1457
+ # }
1458
+ #
1459
+ data = self.safe_value(response, 'data', [])
1460
+ transaction = self.safe_dict(data, 0, {})
1461
+ return self.parse_transaction(transaction, currency)
1462
+
1463
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1464
+ """
1465
+ fetch all withdrawals made from an account
1466
+ :see: https://apidocs.hollaex.com/#get-withdrawals
1467
+ :param str code: unified currency code
1468
+ :param int [since]: the earliest time in ms to fetch withdrawals for
1469
+ :param int [limit]: the maximum number of withdrawals structures to retrieve
1470
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1471
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1472
+ """
1473
+ self.load_markets()
1474
+ request: dict = {
1475
+ # 'currency': currency['id'],
1476
+ # 'limit': 50, # default 50, max 100
1477
+ # 'page': 1, # page of data to retrieve
1478
+ # 'order_by': 'timestamp', # field to order data
1479
+ # 'order': 'asc', # asc or desc
1480
+ # 'start_date': 123, # starting date of queried data
1481
+ # 'end_date': 321, # ending date of queried data
1482
+ }
1483
+ currency = None
1484
+ if code is not None:
1485
+ currency = self.currency(code)
1486
+ request['currency'] = currency['id']
1487
+ if limit is not None:
1488
+ request['limit'] = limit # default 50, max 100
1489
+ if since is not None:
1490
+ request['start_date'] = self.iso8601(since)
1491
+ response = self.privateGetUserWithdrawals(self.extend(request, params))
1492
+ #
1493
+ # {
1494
+ # "count": 1,
1495
+ # "data": [
1496
+ # {
1497
+ # "id": 539,
1498
+ # "amount": 20,
1499
+ # "fee": 0,
1500
+ # "address": "0x5c0cc98270d7089408fcbcc8e2131287f5be2306",
1501
+ # "transaction_id": "0xd4006327a5ec2c41adbdcf566eaaba6597c3d45906abe78ea1a4a022647c2e28",
1502
+ # "status": True,
1503
+ # "dismissed": False,
1504
+ # "rejected": False,
1505
+ # "description": "",
1506
+ # "type": "withdrawal",
1507
+ # "currency": "usdt",
1508
+ # "created_at": "2020-03-03T07:56:36.198Z",
1509
+ # "updated_at": "2020-03-03T08:00:05.674Z",
1510
+ # "user_id": 620
1511
+ # }
1512
+ # ]
1513
+ # }
1514
+ #
1515
+ data = self.safe_list(response, 'data', [])
1516
+ return self.parse_transactions(data, currency, since, limit)
1517
+
1518
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1519
+ #
1520
+ # fetchWithdrawals, fetchDeposits
1521
+ #
1522
+ # {
1523
+ # "id": 539,
1524
+ # "amount": 20,
1525
+ # "fee": 0,
1526
+ # "address": "0x5c0cc98270d7089408fcbcc8e2131287f5be2306",
1527
+ # "transaction_id": "0xd4006327a5ec2c41adbdcf566eaaba6597c3d45906abe78ea1a4a022647c2e28",
1528
+ # "status": True,
1529
+ # "dismissed": False,
1530
+ # "rejected": False,
1531
+ # "description": "",
1532
+ # "type": "withdrawal",
1533
+ # "currency": "usdt",
1534
+ # "created_at": "2020-03-03T07:56:36.198Z",
1535
+ # "updated_at": "2020-03-03T08:00:05.674Z",
1536
+ # "user_id": 620
1537
+ # }
1538
+ #
1539
+ # withdraw
1540
+ #
1541
+ # {
1542
+ # "message": "Withdrawal request is in the queue and will be processed.",
1543
+ # "transaction_id": "1d1683c3-576a-4d53-8ff5-27c93fd9758a",
1544
+ # "amount": 1,
1545
+ # "currency": "xht",
1546
+ # "fee": 0,
1547
+ # "fee_coin": "xht"
1548
+ # }
1549
+ #
1550
+ id = self.safe_string(transaction, 'id')
1551
+ txid = self.safe_string(transaction, 'transaction_id')
1552
+ timestamp = self.parse8601(self.safe_string(transaction, 'created_at'))
1553
+ updated = self.parse8601(self.safe_string(transaction, 'updated_at'))
1554
+ type = self.safe_string(transaction, 'type')
1555
+ amount = self.safe_number(transaction, 'amount')
1556
+ address = self.safe_string(transaction, 'address')
1557
+ addressTo = None
1558
+ addressFrom = None
1559
+ tag = None
1560
+ tagTo = None
1561
+ tagFrom = None
1562
+ if address is not None:
1563
+ parts = address.split(':')
1564
+ address = self.safe_string(parts, 0)
1565
+ tag = self.safe_string(parts, 1)
1566
+ addressTo = address
1567
+ tagTo = tag
1568
+ currencyId = self.safe_string(transaction, 'currency')
1569
+ currency = self.safe_currency(currencyId, currency)
1570
+ status = self.safe_value(transaction, 'status')
1571
+ dismissed = self.safe_value(transaction, 'dismissed')
1572
+ rejected = self.safe_value(transaction, 'rejected')
1573
+ if status:
1574
+ status = 'ok'
1575
+ elif dismissed:
1576
+ status = 'canceled'
1577
+ elif rejected:
1578
+ status = 'failed'
1579
+ else:
1580
+ status = 'pending'
1581
+ feeCurrencyId = self.safe_string(transaction, 'fee_coin')
1582
+ feeCurrencyCode = self.safe_currency_code(feeCurrencyId, currency)
1583
+ feeCost = self.safe_number(transaction, 'fee')
1584
+ fee = None
1585
+ if feeCost is not None:
1586
+ fee = {
1587
+ 'currency': feeCurrencyCode,
1588
+ 'cost': feeCost,
1589
+ }
1590
+ return {
1591
+ 'info': transaction,
1592
+ 'id': id,
1593
+ 'txid': txid,
1594
+ 'timestamp': timestamp,
1595
+ 'datetime': self.iso8601(timestamp),
1596
+ 'network': None,
1597
+ 'addressFrom': addressFrom,
1598
+ 'address': address,
1599
+ 'addressTo': addressTo,
1600
+ 'tagFrom': tagFrom,
1601
+ 'tag': tag,
1602
+ 'tagTo': tagTo,
1603
+ 'type': type,
1604
+ 'amount': amount,
1605
+ 'currency': currency['code'],
1606
+ 'status': status,
1607
+ 'updated': updated,
1608
+ 'comment': self.safe_string(transaction, 'message'),
1609
+ 'internal': None,
1610
+ 'fee': fee,
1611
+ }
1612
+
1613
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1614
+ """
1615
+ make a withdrawal
1616
+ :see: https://apidocs.hollaex.com/#withdrawal
1617
+ :param str code: unified currency code
1618
+ :param float amount: the amount to withdraw
1619
+ :param str address: the address to withdraw to
1620
+ :param str tag:
1621
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1622
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1623
+ """
1624
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1625
+ self.check_address(address)
1626
+ self.load_markets()
1627
+ currency = self.currency(code)
1628
+ if tag is not None:
1629
+ address += ':' + tag
1630
+ network = self.safe_string(params, 'network')
1631
+ if network is None:
1632
+ raise ArgumentsRequired(self.id + ' withdraw() requires a network parameter')
1633
+ params = self.omit(params, 'network')
1634
+ request: dict = {
1635
+ 'currency': currency['id'],
1636
+ 'amount': amount,
1637
+ 'address': address,
1638
+ 'network': self.network_code_to_id(network, code),
1639
+ }
1640
+ response = self.privatePostUserWithdrawal(self.extend(request, params))
1641
+ #
1642
+ # {
1643
+ # "message": "Withdrawal request is in the queue and will be processed.",
1644
+ # "transaction_id": "1d1683c3-576a-4d53-8ff5-27c93fd9758a",
1645
+ # "amount": 1,
1646
+ # "currency": "xht",
1647
+ # "fee": 0,
1648
+ # "fee_coin": "xht"
1649
+ # }
1650
+ #
1651
+ return self.parse_transaction(response, currency)
1652
+
1653
+ def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
1654
+ #
1655
+ # "bch":{
1656
+ # "id":4,
1657
+ # "fullname":"Bitcoin Cash",
1658
+ # "symbol":"bch",
1659
+ # "active":true,
1660
+ # "verified":true,
1661
+ # "allow_deposit":true,
1662
+ # "allow_withdrawal":true,
1663
+ # "withdrawal_fee":0.0001,
1664
+ # "min":0.001,
1665
+ # "max":100000,
1666
+ # "increment_unit":0.001,
1667
+ # "logo":"https://bitholla.s3.ap-northeast-2.amazonaws.com/icon/BCH-hollaex-asset-01.svg",
1668
+ # "code":"bch",
1669
+ # "is_public":true,
1670
+ # "meta":{},
1671
+ # "estimated_price":null,
1672
+ # "description":null,
1673
+ # "type":"blockchain",
1674
+ # "network":null,
1675
+ # "standard":null,
1676
+ # "issuer":"HollaEx",
1677
+ # "withdrawal_fees":null,
1678
+ # "created_at":"2019-08-09T10:45:43.367Z",
1679
+ # "updated_at":"2021-12-13T03:08:32.372Z",
1680
+ # "created_by":1,
1681
+ # "owner_id":1
1682
+ # }
1683
+ #
1684
+ result: dict = {
1685
+ 'info': fee,
1686
+ 'withdraw': {
1687
+ 'fee': None,
1688
+ 'percentage': None,
1689
+ },
1690
+ 'deposit': {
1691
+ 'fee': None,
1692
+ 'percentage': None,
1693
+ },
1694
+ 'networks': {},
1695
+ }
1696
+ allowWithdrawal = self.safe_value(fee, 'allow_withdrawal')
1697
+ if allowWithdrawal:
1698
+ result['withdraw'] = {'fee': self.safe_number(fee, 'withdrawal_fee'), 'percentage': False}
1699
+ withdrawalFees = self.safe_value(fee, 'withdrawal_fees')
1700
+ if withdrawalFees is not None:
1701
+ keys = list(withdrawalFees.keys())
1702
+ keysLength = len(keys)
1703
+ for i in range(0, keysLength):
1704
+ key = keys[i]
1705
+ value = withdrawalFees[key]
1706
+ currencyId = self.safe_string(value, 'symbol')
1707
+ currencyCode = self.safe_currency_code(currencyId)
1708
+ networkCode = self.network_id_to_code(key, currencyCode)
1709
+ networkCodeUpper = networkCode.upper() # default to the upper case network code
1710
+ withdrawalFee = self.safe_number(value, 'value')
1711
+ result['networks'][networkCodeUpper] = {
1712
+ 'deposit': None,
1713
+ 'withdraw': withdrawalFee,
1714
+ }
1715
+ return result
1716
+
1717
+ def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
1718
+ """
1719
+ fetch deposit and withdraw fees
1720
+ :see: https://apidocs.hollaex.com/#constants
1721
+ :param str[]|None codes: list of unified currency codes
1722
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1723
+ :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
1724
+ """
1725
+ response = self.publicGetConstants(params)
1726
+ #
1727
+ # {
1728
+ # "coins":{
1729
+ # "bch":{
1730
+ # "id":4,
1731
+ # "fullname":"Bitcoin Cash",
1732
+ # "symbol":"bch",
1733
+ # "active":true,
1734
+ # "verified":true,
1735
+ # "allow_deposit":true,
1736
+ # "allow_withdrawal":true,
1737
+ # "withdrawal_fee":0.0001,
1738
+ # "min":0.001,
1739
+ # "max":100000,
1740
+ # "increment_unit":0.001,
1741
+ # "logo":"https://bitholla.s3.ap-northeast-2.amazonaws.com/icon/BCH-hollaex-asset-01.svg",
1742
+ # "code":"bch",
1743
+ # "is_public":true,
1744
+ # "meta":{},
1745
+ # "estimated_price":null,
1746
+ # "description":null,
1747
+ # "type":"blockchain",
1748
+ # "network":null,
1749
+ # "standard":null,
1750
+ # "issuer":"HollaEx",
1751
+ # "withdrawal_fees":null,
1752
+ # "created_at":"2019-08-09T10:45:43.367Z",
1753
+ # "updated_at":"2021-12-13T03:08:32.372Z",
1754
+ # "created_by":1,
1755
+ # "owner_id":1
1756
+ # },
1757
+ # },
1758
+ # "network":"https://api.hollaex.network"
1759
+ # }
1760
+ #
1761
+ coins = self.safe_list(response, 'coins')
1762
+ return self.parse_deposit_withdraw_fees(coins, codes, 'symbol')
1763
+
1764
+ def normalize_number_if_needed(self, number):
1765
+ if self.is_round_number(number):
1766
+ number = int(number)
1767
+ return number
1768
+
1769
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1770
+ query = self.omit(params, self.extract_params(path))
1771
+ path = '/' + self.version + '/' + self.implode_params(path, params)
1772
+ if (method == 'GET') or (method == 'DELETE'):
1773
+ if query:
1774
+ path += '?' + self.urlencode(query)
1775
+ url = self.urls['api']['rest'] + path
1776
+ if api == 'private':
1777
+ self.check_required_credentials()
1778
+ defaultExpires = self.safe_integer_2(self.options, 'api-expires', 'expires', self.parse_to_int(self.timeout / 1000))
1779
+ expires = self.sum(self.seconds(), defaultExpires)
1780
+ expiresString = str(expires)
1781
+ auth = method + path + expiresString
1782
+ headers = {
1783
+ 'api-key': self.apiKey,
1784
+ 'api-expires': expiresString,
1785
+ }
1786
+ if method == 'POST':
1787
+ headers['Content-type'] = 'application/json'
1788
+ if query:
1789
+ body = self.json(query)
1790
+ auth += body
1791
+ signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
1792
+ headers['api-signature'] = signature
1793
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1794
+
1795
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1796
+ if response is None:
1797
+ return None
1798
+ if (code >= 400) and (code <= 503):
1799
+ #
1800
+ # {"message": "Invalid token"}
1801
+ #
1802
+ # different errors return the same code eg:
1803
+ #
1804
+ # {"message":"Error 1001 - Order rejected. Order could not be submitted order was set to a post only order."}
1805
+ #
1806
+ # {"message":"Error 1001 - POST ONLY order can not be of type market"}
1807
+ #
1808
+ feedback = self.id + ' ' + body
1809
+ message = self.safe_string(response, 'message')
1810
+ self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
1811
+ status = str(code)
1812
+ self.throw_exactly_matched_exception(self.exceptions['exact'], status, feedback)
1813
+ return None