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
@@ -0,0 +1,1828 @@
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.async_support.base.exchange import Exchange
7
+ from ccxt.abstract.zonda import ImplicitAPI
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
10
+ from typing import List
11
+ from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
13
+ from ccxt.base.errors import PermissionDenied
14
+ from ccxt.base.errors import AccountSuspended
15
+ from ccxt.base.errors import BadRequest
16
+ from ccxt.base.errors import BadSymbol
17
+ from ccxt.base.errors import InsufficientFunds
18
+ from ccxt.base.errors import InvalidOrder
19
+ from ccxt.base.errors import OrderNotFound
20
+ from ccxt.base.errors import OrderImmediatelyFillable
21
+ from ccxt.base.errors import RateLimitExceeded
22
+ from ccxt.base.errors import OnMaintenance
23
+ from ccxt.base.errors import InvalidNonce
24
+ from ccxt.base.decimal_to_precision import TICK_SIZE
25
+ from ccxt.base.precise import Precise
26
+
27
+
28
+ class zonda(Exchange, ImplicitAPI):
29
+
30
+ def describe(self):
31
+ return self.deep_extend(super(zonda, self).describe(), {
32
+ 'id': 'zonda',
33
+ 'name': 'Zonda',
34
+ 'countries': ['EE'], # Estonia
35
+ 'rateLimit': 1000,
36
+ 'has': {
37
+ 'CORS': True,
38
+ 'spot': True,
39
+ 'margin': False,
40
+ 'swap': False,
41
+ 'future': False,
42
+ 'option': False,
43
+ 'addMargin': False,
44
+ 'cancelAllOrders': False,
45
+ 'cancelOrder': True,
46
+ 'cancelOrders': False,
47
+ 'closeAllPositions': False,
48
+ 'closePosition': False,
49
+ 'createDepositAddress': False,
50
+ 'createOrder': True,
51
+ 'createReduceOnlyOrder': False,
52
+ 'fetchBalance': True,
53
+ 'fetchBorrowRateHistories': False,
54
+ 'fetchBorrowRateHistory': False,
55
+ 'fetchCrossBorrowRate': False,
56
+ 'fetchCrossBorrowRates': False,
57
+ 'fetchDeposit': False,
58
+ 'fetchDepositAddress': True,
59
+ 'fetchDepositAddresses': True,
60
+ 'fetchDeposits': None,
61
+ 'fetchFundingHistory': False,
62
+ 'fetchFundingRate': False,
63
+ 'fetchFundingRateHistory': False,
64
+ 'fetchFundingRates': False,
65
+ 'fetchIndexOHLCV': False,
66
+ 'fetchIsolatedBorrowRate': False,
67
+ 'fetchIsolatedBorrowRates': False,
68
+ 'fetchLedger': True,
69
+ 'fetchLeverage': False,
70
+ 'fetchLeverageTiers': False,
71
+ 'fetchMarginMode': False,
72
+ 'fetchMarkets': True,
73
+ 'fetchMarkOHLCV': False,
74
+ 'fetchMyTrades': True,
75
+ 'fetchOHLCV': True,
76
+ 'fetchOpenInterestHistory': False,
77
+ 'fetchOpenOrder': False,
78
+ 'fetchOpenOrders': True,
79
+ 'fetchOrderBook': True,
80
+ 'fetchOrderBooks': False,
81
+ 'fetchPosition': False,
82
+ 'fetchPositionMode': False,
83
+ 'fetchPositions': False,
84
+ 'fetchPositionsRisk': False,
85
+ 'fetchPremiumIndexOHLCV': False,
86
+ 'fetchTicker': True,
87
+ 'fetchTickers': True,
88
+ 'fetchTime': False,
89
+ 'fetchTrades': True,
90
+ 'fetchTradingFee': False,
91
+ 'fetchTradingFees': False,
92
+ 'fetchTransactionFee': False,
93
+ 'fetchTransactionFees': False,
94
+ 'fetchTransactions': None,
95
+ 'fetchTransfer': False,
96
+ 'fetchWithdrawal': False,
97
+ 'fetchWithdrawals': None,
98
+ 'reduceMargin': False,
99
+ 'setLeverage': False,
100
+ 'setMargin': False,
101
+ 'setMarginMode': False,
102
+ 'setPositionMode': False,
103
+ 'transfer': True,
104
+ 'withdraw': True,
105
+ },
106
+ 'timeframes': {
107
+ '1m': '60',
108
+ '3m': '180',
109
+ '5m': '300',
110
+ '15m': '900',
111
+ '30m': '1800',
112
+ '1h': '3600',
113
+ '2h': '7200',
114
+ '4h': '14400',
115
+ '6h': '21600',
116
+ '12h': '43200',
117
+ '1d': '86400',
118
+ '3d': '259200',
119
+ '1w': '604800',
120
+ },
121
+ 'hostname': 'zondacrypto.exchange',
122
+ 'urls': {
123
+ 'referral': 'https://auth.zondaglobal.com/ref/jHlbB4mIkdS1',
124
+ 'logo': 'https://user-images.githubusercontent.com/1294454/159202310-a0e38007-5e7c-4ba9-a32f-c8263a0291fe.jpg',
125
+ 'www': 'https://zondaglobal.com',
126
+ 'api': {
127
+ 'public': 'https://{hostname}/API/Public',
128
+ 'private': 'https://{hostname}/API/Trading/tradingApi.php',
129
+ 'v1_01Public': 'https://api.{hostname}/rest',
130
+ 'v1_01Private': 'https://api.{hostname}/rest',
131
+ },
132
+ 'doc': [
133
+ 'https://docs.zondacrypto.exchange/',
134
+ 'https://github.com/BitBayNet/API',
135
+ ],
136
+ 'support': 'https://zondaglobal.com/en/helpdesk/zonda-exchange',
137
+ 'fees': 'https://zondaglobal.com/legal/zonda-exchange/fees',
138
+ },
139
+ 'api': {
140
+ 'public': {
141
+ 'get': [
142
+ '{id}/all',
143
+ '{id}/market',
144
+ '{id}/orderbook',
145
+ '{id}/ticker',
146
+ '{id}/trades',
147
+ ],
148
+ },
149
+ 'private': {
150
+ 'post': [
151
+ 'info',
152
+ 'trade',
153
+ 'cancel',
154
+ 'orderbook',
155
+ 'orders',
156
+ 'transfer',
157
+ 'withdraw',
158
+ 'history',
159
+ 'transactions',
160
+ ],
161
+ },
162
+ 'v1_01Public': {
163
+ 'get': [
164
+ 'trading/ticker',
165
+ 'trading/ticker/{symbol}',
166
+ 'trading/stats',
167
+ 'trading/stats/{symbol}',
168
+ 'trading/orderbook/{symbol}',
169
+ 'trading/transactions/{symbol}',
170
+ 'trading/candle/history/{symbol}/{resolution}',
171
+ ],
172
+ },
173
+ 'v1_01Private': {
174
+ 'get': [
175
+ 'api_payments/deposits/crypto/addresses',
176
+ 'payments/withdrawal/{detailId}',
177
+ 'payments/deposit/{detailId}',
178
+ 'trading/offer',
179
+ 'trading/stop/offer',
180
+ 'trading/config/{symbol}',
181
+ 'trading/history/transactions',
182
+ 'balances/BITBAY/history',
183
+ 'balances/BITBAY/balance',
184
+ 'fiat_cantor/rate/{baseId}/{quoteId}',
185
+ 'fiat_cantor/history',
186
+ 'client_payments/v2/customer/crypto/{currency}/channels/deposit',
187
+ 'client_payments/v2/customer/crypto/{currency}/channels/withdrawal',
188
+ 'client_payments/v2/customer/crypto/deposit/fee',
189
+ 'client_payments/v2/customer/crypto/withdrawal/fee',
190
+ ],
191
+ 'post': [
192
+ 'trading/offer/{symbol}',
193
+ 'trading/stop/offer/{symbol}',
194
+ 'trading/config/{symbol}',
195
+ 'balances/BITBAY/balance',
196
+ 'balances/BITBAY/balance/transfer/{source}/{destination}',
197
+ 'fiat_cantor/exchange',
198
+ 'api_payments/withdrawals/crypto',
199
+ 'api_payments/withdrawals/fiat',
200
+ 'client_payments/v2/customer/crypto/deposit',
201
+ 'client_payments/v2/customer/crypto/withdrawal',
202
+ ],
203
+ 'delete': [
204
+ 'trading/offer/{symbol}/{id}/{side}/{price}',
205
+ 'trading/stop/offer/{symbol}/{id}/{side}/{price}',
206
+ ],
207
+ 'put': [
208
+ 'balances/BITBAY/balance/{id}',
209
+ ],
210
+ },
211
+ },
212
+ 'fees': {
213
+ 'trading': {
214
+ 'maker': self.parse_number('0.0'),
215
+ 'taker': self.parse_number('0.001'),
216
+ 'percentage': True,
217
+ 'tierBased': False,
218
+ },
219
+ 'fiat': {
220
+ 'maker': self.parse_number('0.0030'),
221
+ 'taker': self.parse_number('0.0043'),
222
+ 'percentage': True,
223
+ 'tierBased': True,
224
+ 'tiers': {
225
+ 'taker': [
226
+ [self.parse_number('0.0043'), self.parse_number('0')],
227
+ [self.parse_number('0.0042'), self.parse_number('1250')],
228
+ [self.parse_number('0.0041'), self.parse_number('3750')],
229
+ [self.parse_number('0.0040'), self.parse_number('7500')],
230
+ [self.parse_number('0.0039'), self.parse_number('10000')],
231
+ [self.parse_number('0.0038'), self.parse_number('15000')],
232
+ [self.parse_number('0.0037'), self.parse_number('20000')],
233
+ [self.parse_number('0.0036'), self.parse_number('25000')],
234
+ [self.parse_number('0.0035'), self.parse_number('37500')],
235
+ [self.parse_number('0.0034'), self.parse_number('50000')],
236
+ [self.parse_number('0.0033'), self.parse_number('75000')],
237
+ [self.parse_number('0.0032'), self.parse_number('100000')],
238
+ [self.parse_number('0.0031'), self.parse_number('150000')],
239
+ [self.parse_number('0.0030'), self.parse_number('200000')],
240
+ [self.parse_number('0.0029'), self.parse_number('250000')],
241
+ [self.parse_number('0.0028'), self.parse_number('375000')],
242
+ [self.parse_number('0.0027'), self.parse_number('500000')],
243
+ [self.parse_number('0.0026'), self.parse_number('625000')],
244
+ [self.parse_number('0.0025'), self.parse_number('875000')],
245
+ ],
246
+ 'maker': [
247
+ [self.parse_number('0.0030'), self.parse_number('0')],
248
+ [self.parse_number('0.0029'), self.parse_number('1250')],
249
+ [self.parse_number('0.0028'), self.parse_number('3750')],
250
+ [self.parse_number('0.0028'), self.parse_number('7500')],
251
+ [self.parse_number('0.0027'), self.parse_number('10000')],
252
+ [self.parse_number('0.0026'), self.parse_number('15000')],
253
+ [self.parse_number('0.0025'), self.parse_number('20000')],
254
+ [self.parse_number('0.0025'), self.parse_number('25000')],
255
+ [self.parse_number('0.0024'), self.parse_number('37500')],
256
+ [self.parse_number('0.0023'), self.parse_number('50000')],
257
+ [self.parse_number('0.0023'), self.parse_number('75000')],
258
+ [self.parse_number('0.0022'), self.parse_number('100000')],
259
+ [self.parse_number('0.0021'), self.parse_number('150000')],
260
+ [self.parse_number('0.0021'), self.parse_number('200000')],
261
+ [self.parse_number('0.0020'), self.parse_number('250000')],
262
+ [self.parse_number('0.0019'), self.parse_number('375000')],
263
+ [self.parse_number('0.0018'), self.parse_number('500000')],
264
+ [self.parse_number('0.0018'), self.parse_number('625000')],
265
+ [self.parse_number('0.0017'), self.parse_number('875000')],
266
+ ],
267
+ },
268
+ },
269
+ 'funding': {
270
+ 'withdraw': {},
271
+ },
272
+ },
273
+ 'options': {
274
+ 'fetchTickerMethod': 'v1_01PublicGetTradingTickerSymbol', # or v1_01PublicGetTradingStatsSymbol
275
+ 'fetchTickersMethod': 'v1_01PublicGetTradingTicker', # or v1_01PublicGetTradingStats
276
+ 'fiatCurrencies': ['EUR', 'USD', 'GBP', 'PLN'],
277
+ 'transfer': {
278
+ 'fillResponseFromRequest': True,
279
+ },
280
+ },
281
+ 'precisionMode': TICK_SIZE,
282
+ 'exceptions': {
283
+ '400': ExchangeError, # At least one parameter wasn't set
284
+ '401': InvalidOrder, # Invalid order type
285
+ '402': InvalidOrder, # No orders with specified currencies
286
+ '403': InvalidOrder, # Invalid payment currency name
287
+ '404': InvalidOrder, # Error. Wrong transaction type
288
+ '405': InvalidOrder, # Order with self id doesn't exist
289
+ '406': InsufficientFunds, # No enough money or crypto
290
+ # code 407 not specified are not specified in their docs
291
+ '408': InvalidOrder, # Invalid currency name
292
+ '501': AuthenticationError, # Invalid public key
293
+ '502': AuthenticationError, # Invalid sign
294
+ '503': InvalidNonce, # Invalid moment parameter. Request time doesn't match current server time
295
+ '504': ExchangeError, # Invalid method
296
+ '505': AuthenticationError, # Key has no permission for self action
297
+ '506': AccountSuspended, # Account locked. Please contact with customer service
298
+ # codes 507 and 508 are not specified in their docs
299
+ '509': ExchangeError, # The BIC/SWIFT is required for self currency
300
+ '510': BadSymbol, # Invalid market name
301
+ 'FUNDS_NOT_SUFFICIENT': InsufficientFunds,
302
+ 'OFFER_FUNDS_NOT_EXCEEDING_MINIMUMS': InvalidOrder,
303
+ 'OFFER_NOT_FOUND': OrderNotFound,
304
+ 'OFFER_WOULD_HAVE_BEEN_PARTIALLY_FILLED': OrderImmediatelyFillable,
305
+ 'ACTION_LIMIT_EXCEEDED': RateLimitExceeded,
306
+ 'UNDER_MAINTENANCE': OnMaintenance,
307
+ 'REQUEST_TIMESTAMP_TOO_OLD': InvalidNonce,
308
+ 'PERMISSIONS_NOT_SUFFICIENT': PermissionDenied,
309
+ 'INVALID_STOP_RATE': InvalidOrder,
310
+ 'TIMEOUT': ExchangeError,
311
+ 'RESPONSE_TIMEOUT': ExchangeError,
312
+ 'ACTION_BLOCKED': PermissionDenied,
313
+ 'INVALID_HASH_SIGNATURE': AuthenticationError,
314
+ },
315
+ 'commonCurrencies': {
316
+ 'GGC': 'Global Game Coin',
317
+ },
318
+ })
319
+
320
+ async def fetch_markets(self, params={}) -> List[Market]:
321
+ """
322
+ :see: https://docs.zondacrypto.exchange/reference/ticker-1
323
+ retrieves data on all markets for zonda
324
+ :param dict [params]: extra parameters specific to the exchange API endpoint
325
+ :returns dict[]: an array of objects representing market data
326
+ """
327
+ response = await self.v1_01PublicGetTradingTicker(params)
328
+ #
329
+ # {
330
+ # "status": "Ok",
331
+ # "items": {
332
+ # "BSV-USD": {
333
+ # "market": {
334
+ # "code": "BSV-USD",
335
+ # "first": {currency: "BSV", minOffer: "0.00035", scale: 8},
336
+ # "second": {currency: "USD", minOffer: "5", scale: 2}
337
+ # },
338
+ # "time": "1557569762154",
339
+ # "highestBid": "52.31",
340
+ # "lowestAsk": "62.99",
341
+ # "rate": "63",
342
+ # "previousRate": "51.21",
343
+ # },
344
+ # },
345
+ # }
346
+ #
347
+ items = self.safe_value(response, 'items', {})
348
+ markets = list(items.values())
349
+ return self.parse_markets(markets)
350
+
351
+ def parse_market(self, item) -> Market:
352
+ market = self.safe_value(item, 'market', {})
353
+ id = self.safe_string(market, 'code')
354
+ first = self.safe_value(market, 'first', {})
355
+ second = self.safe_value(market, 'second', {})
356
+ baseId = self.safe_string(first, 'currency')
357
+ quoteId = self.safe_string(second, 'currency')
358
+ base = self.safe_currency_code(baseId)
359
+ quote = self.safe_currency_code(quoteId)
360
+ fees = self.safe_value(self.fees, 'trading', {})
361
+ fiatCurrencies = self.safe_value(self.options, 'fiatCurrencies', [])
362
+ if self.in_array(base, fiatCurrencies) or self.in_array(quote, fiatCurrencies):
363
+ fees = self.safe_value(self.fees, 'fiat', {})
364
+ # todo: check that the limits have ben interpreted correctly
365
+ return {
366
+ 'id': id,
367
+ 'symbol': base + '/' + quote,
368
+ 'base': base,
369
+ 'quote': quote,
370
+ 'settle': None,
371
+ 'baseId': baseId,
372
+ 'quoteId': quoteId,
373
+ 'settleId': None,
374
+ 'type': 'spot',
375
+ 'spot': True,
376
+ 'margin': False,
377
+ 'swap': False,
378
+ 'future': False,
379
+ 'option': False,
380
+ 'active': None,
381
+ 'contract': False,
382
+ 'linear': None,
383
+ 'inverse': None,
384
+ 'taker': self.safe_number(fees, 'taker'),
385
+ 'maker': self.safe_number(fees, 'maker'),
386
+ 'contractSize': None,
387
+ 'expiry': None,
388
+ 'expiryDatetime': None,
389
+ 'optionType': None,
390
+ 'strike': None,
391
+ 'precision': {
392
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(first, 'scale'))),
393
+ 'price': self.parse_number(self.parse_precision(self.safe_string(second, 'scale'))),
394
+ },
395
+ 'limits': {
396
+ 'leverage': {
397
+ 'min': None,
398
+ 'max': None,
399
+ },
400
+ 'amount': {
401
+ 'min': self.safe_number(first, 'minOffer'),
402
+ 'max': None,
403
+ },
404
+ 'price': {
405
+ 'min': None,
406
+ 'max': None,
407
+ },
408
+ 'cost': {
409
+ 'min': None,
410
+ 'max': None,
411
+ },
412
+ },
413
+ 'created': None,
414
+ 'info': item,
415
+ }
416
+
417
+ async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
418
+ """
419
+ :see: https://docs.zondacrypto.exchange/reference/active-orders
420
+ fetch all unfilled currently open orders
421
+ :param str symbol: not used by zonda fetchOpenOrders
422
+ :param int [since]: the earliest time in ms to fetch open orders for
423
+ :param int [limit]: the maximum number of open orders structures to retrieve
424
+ :param dict [params]: extra parameters specific to the exchange API endpoint
425
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
426
+ """
427
+ await self.load_markets()
428
+ request: dict = {}
429
+ response = await self.v1_01PrivateGetTradingOffer(self.extend(request, params))
430
+ items = self.safe_list(response, 'items', [])
431
+ return self.parse_orders(items, None, since, limit, {'status': 'open'})
432
+
433
+ def parse_order(self, order: dict, market: Market = None) -> Order:
434
+ #
435
+ # {
436
+ # "market": "ETH-EUR",
437
+ # "offerType": "Sell",
438
+ # "id": "93d3657b-d616-11e9-9248-0242ac110005",
439
+ # "currentAmount": "0.04",
440
+ # "lockedAmount": "0.04",
441
+ # "rate": "280",
442
+ # "startAmount": "0.04",
443
+ # "time": "1568372806924",
444
+ # "postOnly": False,
445
+ # "hidden": False,
446
+ # "mode": "limit",
447
+ # "receivedAmount": "0.0",
448
+ # "firstBalanceId": "5b816c3e-437c-4e43-9bef-47814ae7ebfc",
449
+ # "secondBalanceId": "ab43023b-4079-414c-b340-056e3430a3af"
450
+ # }
451
+ #
452
+ # cancelOrder
453
+ #
454
+ # {
455
+ # status: "Ok",
456
+ # errors: []
457
+ # }
458
+ #
459
+ marketId = self.safe_string(order, 'market')
460
+ symbol = self.safe_symbol(marketId, market, '-')
461
+ timestamp = self.safe_integer(order, 'time')
462
+ amount = self.safe_string(order, 'startAmount')
463
+ remaining = self.safe_string(order, 'currentAmount')
464
+ postOnly = self.safe_value(order, 'postOnly')
465
+ return self.safe_order({
466
+ 'id': self.safe_string(order, 'id'),
467
+ 'clientOrderId': None,
468
+ 'info': order,
469
+ 'timestamp': timestamp,
470
+ 'datetime': self.iso8601(timestamp),
471
+ 'lastTradeTimestamp': None,
472
+ 'status': None,
473
+ 'symbol': symbol,
474
+ 'type': self.safe_string(order, 'mode'),
475
+ 'timeInForce': None,
476
+ 'postOnly': postOnly,
477
+ 'side': self.safe_string_lower(order, 'offerType'),
478
+ 'price': self.safe_string(order, 'rate'),
479
+ 'stopPrice': None,
480
+ 'triggerPrice': None,
481
+ 'amount': amount,
482
+ 'cost': None,
483
+ 'filled': None,
484
+ 'remaining': remaining,
485
+ 'average': None,
486
+ 'fee': None,
487
+ 'trades': None,
488
+ }, market)
489
+
490
+ async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
491
+ """
492
+ :see: https://docs.zondacrypto.exchange/reference/transactions-history
493
+ fetch all trades made by the user
494
+ :param str symbol: unified market symbol
495
+ :param int [since]: the earliest time in ms to fetch trades for
496
+ :param int [limit]: the maximum number of trades structures to retrieve
497
+ :param dict [params]: extra parameters specific to the exchange API endpoint
498
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
499
+ """
500
+ await self.load_markets()
501
+ request: dict = {}
502
+ if symbol:
503
+ markets = [self.market_id(symbol)]
504
+ symbol = self.symbol(symbol)
505
+ request['markets'] = markets
506
+ query: dict = {'query': self.json(self.extend(request, params))}
507
+ response = await self.v1_01PrivateGetTradingHistoryTransactions(query)
508
+ #
509
+ # {
510
+ # "status": "Ok",
511
+ # "totalRows": "67",
512
+ # "items": [
513
+ # {
514
+ # "id": "b54659a0-51b5-42a0-80eb-2ac5357ccee2",
515
+ # "market": "BTC-EUR",
516
+ # "time": "1541697096247",
517
+ # "amount": "0.00003",
518
+ # "rate": "4341.44",
519
+ # "initializedBy": "Sell",
520
+ # "wasTaker": False,
521
+ # "userAction": "Buy",
522
+ # "offerId": "bd19804a-6f89-4a69-adb8-eb078900d006",
523
+ # "commissionValue": null
524
+ # },
525
+ # ]
526
+ # }
527
+ #
528
+ items = self.safe_value(response, 'items')
529
+ result = self.parse_trades(items, None, since, limit)
530
+ if symbol is None:
531
+ return result
532
+ return self.filter_by_symbol(result, symbol)
533
+
534
+ def parse_balance(self, response) -> Balances:
535
+ balances = self.safe_value(response, 'balances')
536
+ if balances is None:
537
+ raise ExchangeError(self.id + ' empty balance response ' + self.json(response))
538
+ result: dict = {'info': response}
539
+ for i in range(0, len(balances)):
540
+ balance = balances[i]
541
+ currencyId = self.safe_string(balance, 'currency')
542
+ code = self.safe_currency_code(currencyId)
543
+ account = self.account()
544
+ account['used'] = self.safe_string(balance, 'lockedFunds')
545
+ account['free'] = self.safe_string(balance, 'availableFunds')
546
+ result[code] = account
547
+ return self.safe_balance(result)
548
+
549
+ async def fetch_balance(self, params={}) -> Balances:
550
+ """
551
+ :see: https://docs.zondacrypto.exchange/reference/list-of-wallets
552
+ query for balance and get the amount of funds available for trading or funds locked in orders
553
+ :param dict [params]: extra parameters specific to the exchange API endpoint
554
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
555
+ """
556
+ await self.load_markets()
557
+ response = await self.v1_01PrivateGetBalancesBITBAYBalance(params)
558
+ return self.parse_balance(response)
559
+
560
+ async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
561
+ """
562
+ :see: https://docs.zondacrypto.exchange/reference/orderbook-2
563
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
564
+ :param str symbol: unified symbol of the market to fetch the order book for
565
+ :param int [limit]: the maximum amount of order book entries to return
566
+ :param dict [params]: extra parameters specific to the exchange API endpoint
567
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
568
+ """
569
+ await self.load_markets()
570
+ market = self.market(symbol)
571
+ request: dict = {
572
+ 'symbol': market['id'],
573
+ }
574
+ response = await self.v1_01PublicGetTradingOrderbookSymbol(self.extend(request, params))
575
+ #
576
+ # {
577
+ # "status":"Ok",
578
+ # "sell":[
579
+ # {"ra":"43988.93","ca":"0.00100525","sa":"0.00100525","pa":"0.00100525","co":1},
580
+ # {"ra":"43988.94","ca":"0.00114136","sa":"0.00114136","pa":"0.00114136","co":1},
581
+ # {"ra":"43989","ca":"0.010578","sa":"0.010578","pa":"0.010578","co":1},
582
+ # ],
583
+ # "buy":[
584
+ # {"ra":"42157.33","ca":"2.83147881","sa":"2.83147881","pa":"2.83147881","co":2},
585
+ # {"ra":"42096.0","ca":"0.00011878","sa":"0.00011878","pa":"0.00011878","co":1},
586
+ # {"ra":"42022.0","ca":"0.00011899","sa":"0.00011899","pa":"0.00011899","co":1},
587
+ # ],
588
+ # "timestamp":"1642299886122",
589
+ # "seqNo":"27641254"
590
+ # }
591
+ #
592
+ rawBids = self.safe_value(response, 'buy', [])
593
+ rawAsks = self.safe_value(response, 'sell', [])
594
+ timestamp = self.safe_integer(response, 'timestamp')
595
+ return {
596
+ 'symbol': market['symbol'],
597
+ 'bids': self.parse_bids_asks(rawBids, 'ra', 'ca'),
598
+ 'asks': self.parse_bids_asks(rawAsks, 'ra', 'ca'),
599
+ 'timestamp': timestamp,
600
+ 'datetime': self.iso8601(timestamp),
601
+ 'nonce': self.safe_integer(response, 'seqNo'),
602
+ }
603
+
604
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
605
+ #
606
+ # version 1
607
+ #
608
+ # {
609
+ # "m": "ETH-PLN",
610
+ # "h": "13485.13",
611
+ # "l": "13100.01",
612
+ # "v": "126.10710939",
613
+ # "r24h": "13332.72"
614
+ # }
615
+ #
616
+ # version 2
617
+ #
618
+ # {
619
+ # "market": {
620
+ # "code": "ADA-USDT",
621
+ # "first": {
622
+ # "currency": "ADA",
623
+ # "minOffer": "0.2",
624
+ # "scale": "6"
625
+ # },
626
+ # "second": {
627
+ # "currency": "USDT",
628
+ # "minOffer": "0.099",
629
+ # "scale": "6"
630
+ # },
631
+ # "amountPrecision": "6",
632
+ # "pricePrecision": "6",
633
+ # "ratePrecision": "6"
634
+ # },
635
+ # "time": "1655812661202",
636
+ # "highestBid": "0.492",
637
+ # "lowestAsk": "0.499389",
638
+ # "rate": "0.50588",
639
+ # "previousRate": "0.504981"
640
+ # }
641
+ #
642
+ tickerMarket = self.safe_value(ticker, 'market')
643
+ marketId = self.safe_string_2(tickerMarket, 'code', 'm')
644
+ market = self.safe_market(marketId, market)
645
+ timestamp = self.safe_integer(ticker, 'time')
646
+ rate = self.safe_value(ticker, 'rate')
647
+ return self.safe_ticker({
648
+ 'symbol': self.safe_symbol(marketId, market),
649
+ 'timestamp': timestamp,
650
+ 'datetime': self.iso8601(timestamp),
651
+ 'high': self.safe_string(ticker, 'h'),
652
+ 'low': self.safe_string(ticker, 'l'),
653
+ 'bid': self.safe_number(ticker, 'highestBid'),
654
+ 'bidVolume': None,
655
+ 'ask': self.safe_number(ticker, 'lowestAsk'),
656
+ 'askVolume': None,
657
+ 'vwap': None,
658
+ 'open': self.safe_string(ticker, 'r24h'),
659
+ 'close': rate,
660
+ 'last': rate,
661
+ 'previousClose': self.safe_value(ticker, 'previousRate'),
662
+ 'change': None,
663
+ 'percentage': None,
664
+ 'average': None,
665
+ 'baseVolume': self.safe_string(ticker, 'v'),
666
+ 'quoteVolume': None,
667
+ 'info': ticker,
668
+ }, market)
669
+
670
+ async def fetch_ticker(self, symbol: str, params={}):
671
+ """
672
+ v1_01PublicGetTradingTickerSymbol retrieves timestamp, datetime, bid, ask, close, last, previousClose, v1_01PublicGetTradingStatsSymbol retrieves high, low, volume and opening price of an asset
673
+ :see: https://docs.zondacrypto.exchange/reference/market-statistics
674
+ :param str symbol: unified symbol of the market to fetch the ticker for
675
+ :param dict [params]: extra parameters specific to the exchange API endpoint
676
+ :param str [params.method]: v1_01PublicGetTradingTickerSymbol(default) or v1_01PublicGetTradingStatsSymbol
677
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
678
+ """
679
+ await self.load_markets()
680
+ market = self.market(symbol)
681
+ request: dict = {
682
+ 'symbol': market['id'],
683
+ }
684
+ method = 'v1_01PublicGetTradingTickerSymbol'
685
+ defaultMethod = self.safe_string(self.options, 'fetchTickerMethod', method)
686
+ fetchTickerMethod = self.safe_string_2(params, 'method', 'fetchTickerMethod', defaultMethod)
687
+ response = None
688
+ if fetchTickerMethod == method:
689
+ response = await self.v1_01PublicGetTradingTickerSymbol(self.extend(request, params))
690
+ #
691
+ # {
692
+ # "status": "Ok",
693
+ # "ticker": {
694
+ # "market": {
695
+ # "code": "ADA-USDT",
696
+ # "first": {
697
+ # "currency": "ADA",
698
+ # "minOffer": "0.21",
699
+ # "scale": 6
700
+ # },
701
+ # "second": {
702
+ # "currency": "USDT",
703
+ # "minOffer": "0.099",
704
+ # "scale": 6
705
+ # },
706
+ # "amountPrecision": 6,
707
+ # "pricePrecision": 6,
708
+ # "ratePrecision": 6
709
+ # },
710
+ # "time": "1655810976780",
711
+ # "highestBid": "0.498543",
712
+ # "lowestAsk": "0.50684",
713
+ # "rate": "0.50588",
714
+ # "previousRate": "0.504981"
715
+ # }
716
+ # }
717
+ #
718
+ elif fetchTickerMethod == 'v1_01PublicGetTradingStatsSymbol':
719
+ response = await self.v1_01PublicGetTradingStatsSymbol(self.extend(request, params))
720
+ #
721
+ # {
722
+ # "status": "Ok",
723
+ # "stats": {
724
+ # "m": "BTC-USDT",
725
+ # "h": "28800",
726
+ # "l": "26703.950101",
727
+ # "v": "6.72932396",
728
+ # "r24h": "27122.2"
729
+ # }
730
+ # }
731
+ #
732
+ else:
733
+ raise BadRequest(self.id + ' fetchTicker params["method"] must be "v1_01PublicGetTradingTickerSymbol" or "v1_01PublicGetTradingStatsSymbol"')
734
+ stats = self.safe_value_2(response, 'ticker', 'stats')
735
+ return self.parse_ticker(stats, market)
736
+
737
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
738
+ """
739
+ * @ignore
740
+ v1_01PublicGetTradingTicker retrieves timestamp, datetime, bid, ask, close, last, previousClose for each market, v1_01PublicGetTradingStats retrieves high, low, volume and opening price of each market
741
+ :see: https://docs.zondacrypto.exchange/reference/market-statistics
742
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
743
+ :param dict [params]: extra parameters specific to the exchange API endpoint
744
+ :param str [params.method]: v1_01PublicGetTradingTicker(default) or v1_01PublicGetTradingStats
745
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
746
+ """
747
+ await self.load_markets()
748
+ method = 'v1_01PublicGetTradingTicker'
749
+ defaultMethod = self.safe_string(self.options, 'fetchTickersMethod', method)
750
+ fetchTickersMethod = self.safe_string_2(params, 'method', 'fetchTickersMethod', defaultMethod)
751
+ response = None
752
+ if fetchTickersMethod == method:
753
+ response = await self.v1_01PublicGetTradingTicker(params)
754
+ #
755
+ # {
756
+ # "status": "Ok",
757
+ # "items": {
758
+ # "DAI-PLN": {
759
+ # "market": {
760
+ # "code": "DAI-PLN",
761
+ # "first": {
762
+ # "currency": "DAI",
763
+ # "minOffer": "0.99",
764
+ # "scale": 8
765
+ # },
766
+ # "second": {
767
+ # "currency": "PLN",
768
+ # "minOffer": "5",
769
+ # "scale": 2
770
+ # },
771
+ # "amountPrecision": 8,
772
+ # "pricePrecision": 2,
773
+ # "ratePrecision": 2
774
+ # },
775
+ # "time": "1655810825137",
776
+ # "highestBid": "4.42",
777
+ # "lowestAsk": "4.44",
778
+ # "rate": "4.44",
779
+ # "previousRate": "4.43"
780
+ # },
781
+ # ...
782
+ # }
783
+ # }
784
+ #
785
+ elif fetchTickersMethod == 'v1_01PublicGetTradingStats':
786
+ response = await self.v1_01PublicGetTradingStats(params)
787
+ #
788
+ # {
789
+ # "status": "Ok",
790
+ # "items": {
791
+ # "DAI-PLN": {
792
+ # "m": "DAI-PLN",
793
+ # "h": "4.41",
794
+ # "l": "4.37",
795
+ # "v": "8.71068087",
796
+ # "r24h": "4.36"
797
+ # },
798
+ # ...
799
+ # }
800
+ # }
801
+ #
802
+ else:
803
+ raise BadRequest(self.id + ' fetchTickers params["method"] must be "v1_01PublicGetTradingTicker" or "v1_01PublicGetTradingStats"')
804
+ items = self.safe_dict(response, 'items')
805
+ return self.parse_tickers(items, symbols)
806
+
807
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
808
+ """
809
+ :see: https://docs.zondacrypto.exchange/reference/operations-history
810
+ fetch the history of changes, actions done by the user or operations that altered balance of the user
811
+ :param str code: unified currency code, default is None
812
+ :param int [since]: timestamp in ms of the earliest ledger entry, default is None
813
+ :param int [limit]: max number of ledger entrys to return, default is None
814
+ :param dict [params]: extra parameters specific to the exchange API endpoint
815
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
816
+ """
817
+ balanceCurrencies = []
818
+ if code is not None:
819
+ currency = self.currency(code)
820
+ balanceCurrencies.append(currency['id'])
821
+ request: dict = {
822
+ 'balanceCurrencies': balanceCurrencies,
823
+ }
824
+ if since is not None:
825
+ request['fromTime'] = since
826
+ if limit is not None:
827
+ request['limit'] = limit
828
+ request = self.extend(request, params)
829
+ response = await self.v1_01PrivateGetBalancesBITBAYHistory({'query': self.json(request)})
830
+ items = response['items']
831
+ return self.parse_ledger(items, None, since, limit)
832
+
833
+ def parse_ledger_entry(self, item: dict, currency: Currency = None):
834
+ #
835
+ # FUNDS_MIGRATION
836
+ # {
837
+ # "historyId": "84ea7a29-7da5-4de5-b0c0-871e83cad765",
838
+ # "balance": {
839
+ # "id": "821ec166-cb88-4521-916c-f4eb44db98df",
840
+ # "currency": "LTC",
841
+ # "type": "CRYPTO",
842
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
843
+ # "name": "LTC"
844
+ # },
845
+ # "detailId": null,
846
+ # "time": 1506128252968,
847
+ # "type": "FUNDS_MIGRATION",
848
+ # "value": 0.0009957,
849
+ # "fundsBefore": {"total": 0, "available": 0, "locked": 0},
850
+ # "fundsAfter": {"total": 0.0009957, "available": 0.0009957, "locked": 0},
851
+ # "change": {"total": 0.0009957, "available": 0.0009957, "locked": 0}
852
+ # }
853
+ #
854
+ # CREATE_BALANCE
855
+ # {
856
+ # "historyId": "d0fabd8d-9107-4b5e-b9a6-3cab8af70d49",
857
+ # "balance": {
858
+ # "id": "653ffcf2-3037-4ebe-8e13-d5ea1a01d60d",
859
+ # "currency": "BTG",
860
+ # "type": "CRYPTO",
861
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
862
+ # "name": "BTG"
863
+ # },
864
+ # "detailId": null,
865
+ # "time": 1508895244751,
866
+ # "type": "CREATE_BALANCE",
867
+ # "value": 0,
868
+ # "fundsBefore": {"total": null, "available": null, "locked": null},
869
+ # "fundsAfter": {"total": 0, "available": 0, "locked": 0},
870
+ # "change": {"total": 0, "available": 0, "locked": 0}
871
+ # }
872
+ #
873
+ # BITCOIN_GOLD_FORK
874
+ # {
875
+ # "historyId": "2b4d52d3-611c-473d-b92c-8a8d87a24e41",
876
+ # "balance": {
877
+ # "id": "653ffcf2-3037-4ebe-8e13-d5ea1a01d60d",
878
+ # "currency": "BTG",
879
+ # "type": "CRYPTO",
880
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
881
+ # "name": "BTG"
882
+ # },
883
+ # "detailId": null,
884
+ # "time": 1508895244778,
885
+ # "type": "BITCOIN_GOLD_FORK",
886
+ # "value": 0.00453512,
887
+ # "fundsBefore": {"total": 0, "available": 0, "locked": 0},
888
+ # "fundsAfter": {"total": 0.00453512, "available": 0.00453512, "locked": 0},
889
+ # "change": {"total": 0.00453512, "available": 0.00453512, "locked": 0}
890
+ # }
891
+ #
892
+ # ADD_FUNDS
893
+ # {
894
+ # "historyId": "3158236d-dae5-4a5d-81af-c1fa4af340fb",
895
+ # "balance": {
896
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
897
+ # "currency": "BTC",
898
+ # "type": "CRYPTO",
899
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
900
+ # "name": "BTC"
901
+ # },
902
+ # "detailId": "8e83a960-e737-4380-b8bb-259d6e236faa",
903
+ # "time": 1520631178816,
904
+ # "type": "ADD_FUNDS",
905
+ # "value": 0.628405,
906
+ # "fundsBefore": {"total": 0.00453512, "available": 0.00453512, "locked": 0},
907
+ # "fundsAfter": {"total": 0.63294012, "available": 0.63294012, "locked": 0},
908
+ # "change": {"total": 0.628405, "available": 0.628405, "locked": 0}
909
+ # }
910
+ #
911
+ # TRANSACTION_PRE_LOCKING
912
+ # {
913
+ # "historyId": "e7d19e0f-03b3-46a8-bc72-dde72cc24ead",
914
+ # "balance": {
915
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
916
+ # "currency": "BTC",
917
+ # "type": "CRYPTO",
918
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
919
+ # "name": "BTC"
920
+ # },
921
+ # "detailId": null,
922
+ # "time": 1520706403868,
923
+ # "type": "TRANSACTION_PRE_LOCKING",
924
+ # "value": -0.1,
925
+ # "fundsBefore": {"total": 0.63294012, "available": 0.63294012, "locked": 0},
926
+ # "fundsAfter": {"total": 0.63294012, "available": 0.53294012, "locked": 0.1},
927
+ # "change": {"total": 0, "available": -0.1, "locked": 0.1}
928
+ # }
929
+ #
930
+ # TRANSACTION_POST_OUTCOME
931
+ # {
932
+ # "historyId": "c4010825-231d-4a9c-8e46-37cde1f7b63c",
933
+ # "balance": {
934
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
935
+ # "currency": "BTC",
936
+ # "type": "CRYPTO",
937
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
938
+ # "name": "BTC"
939
+ # },
940
+ # "detailId": "bf2876bc-b545-4503-96c8-ef4de8233876",
941
+ # "time": 1520706404032,
942
+ # "type": "TRANSACTION_POST_OUTCOME",
943
+ # "value": -0.01771415,
944
+ # "fundsBefore": {"total": 0.63294012, "available": 0.53294012, "locked": 0.1},
945
+ # "fundsAfter": {"total": 0.61522597, "available": 0.53294012, "locked": 0.08228585},
946
+ # "change": {"total": -0.01771415, "available": 0, "locked": -0.01771415}
947
+ # }
948
+ #
949
+ # TRANSACTION_POST_INCOME
950
+ # {
951
+ # "historyId": "7f18b7af-b676-4125-84fd-042e683046f6",
952
+ # "balance": {
953
+ # "id": "ab43023b-4079-414c-b340-056e3430a3af",
954
+ # "currency": "EUR",
955
+ # "type": "FIAT",
956
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
957
+ # "name": "EUR"
958
+ # },
959
+ # "detailId": "f5fcb274-0cc7-4385-b2d3-bae2756e701f",
960
+ # "time": 1520706404035,
961
+ # "type": "TRANSACTION_POST_INCOME",
962
+ # "value": 628.78,
963
+ # "fundsBefore": {"total": 0, "available": 0, "locked": 0},
964
+ # "fundsAfter": {"total": 628.78, "available": 628.78, "locked": 0},
965
+ # "change": {"total": 628.78, "available": 628.78, "locked": 0}
966
+ # }
967
+ #
968
+ # TRANSACTION_COMMISSION_OUTCOME
969
+ # {
970
+ # "historyId": "843177fa-61bc-4cbf-8be5-b029d856c93b",
971
+ # "balance": {
972
+ # "id": "ab43023b-4079-414c-b340-056e3430a3af",
973
+ # "currency": "EUR",
974
+ # "type": "FIAT",
975
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
976
+ # "name": "EUR"
977
+ # },
978
+ # "detailId": "f5fcb274-0cc7-4385-b2d3-bae2756e701f",
979
+ # "time": 1520706404050,
980
+ # "type": "TRANSACTION_COMMISSION_OUTCOME",
981
+ # "value": -2.71,
982
+ # "fundsBefore": {"total": 766.06, "available": 766.06, "locked": 0},
983
+ # "fundsAfter": {"total": 763.35,"available": 763.35, "locked": 0},
984
+ # "change": {"total": -2.71, "available": -2.71, "locked": 0}
985
+ # }
986
+ #
987
+ # TRANSACTION_OFFER_COMPLETED_RETURN
988
+ # {
989
+ # "historyId": "cac69b04-c518-4dc5-9d86-e76e91f2e1d2",
990
+ # "balance": {
991
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
992
+ # "currency": "BTC",
993
+ # "type": "CRYPTO",
994
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
995
+ # "name": "BTC"
996
+ # },
997
+ # "detailId": null,
998
+ # "time": 1520714886425,
999
+ # "type": "TRANSACTION_OFFER_COMPLETED_RETURN",
1000
+ # "value": 0.00000196,
1001
+ # "fundsBefore": {"total": 0.00941208, "available": 0.00941012, "locked": 0.00000196},
1002
+ # "fundsAfter": {"total": 0.00941208, "available": 0.00941208, "locked": 0},
1003
+ # "change": {"total": 0, "available": 0.00000196, "locked": -0.00000196}
1004
+ # }
1005
+ #
1006
+ # WITHDRAWAL_LOCK_FUNDS
1007
+ # {
1008
+ # "historyId": "03de2271-66ab-4960-a786-87ab9551fc14",
1009
+ # "balance": {
1010
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
1011
+ # "currency": "BTC",
1012
+ # "type": "CRYPTO",
1013
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
1014
+ # "name": "BTC"
1015
+ # },
1016
+ # "detailId": "6ad3dc72-1d6d-4ec2-8436-ca43f85a38a6",
1017
+ # "time": 1522245654481,
1018
+ # "type": "WITHDRAWAL_LOCK_FUNDS",
1019
+ # "value": -0.8,
1020
+ # "fundsBefore": {"total": 0.8, "available": 0.8, "locked": 0},
1021
+ # "fundsAfter": {"total": 0.8, "available": 0, "locked": 0.8},
1022
+ # "change": {"total": 0, "available": -0.8, "locked": 0.8}
1023
+ # }
1024
+ #
1025
+ # WITHDRAWAL_SUBTRACT_FUNDS
1026
+ # {
1027
+ # "historyId": "b0308c89-5288-438d-a306-c6448b1a266d",
1028
+ # "balance": {
1029
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
1030
+ # "currency": "BTC",
1031
+ # "type": "CRYPTO",
1032
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
1033
+ # "name": "BTC"
1034
+ # },
1035
+ # "detailId": "6ad3dc72-1d6d-4ec2-8436-ca43f85a38a6",
1036
+ # "time": 1522246526186,
1037
+ # "type": "WITHDRAWAL_SUBTRACT_FUNDS",
1038
+ # "value": -0.8,
1039
+ # "fundsBefore": {"total": 0.8, "available": 0, "locked": 0.8},
1040
+ # "fundsAfter": {"total": 0, "available": 0, "locked": 0},
1041
+ # "change": {"total": -0.8, "available": 0, "locked": -0.8}
1042
+ # }
1043
+ #
1044
+ # TRANSACTION_OFFER_ABORTED_RETURN
1045
+ # {
1046
+ # "historyId": "b1a3c075-d403-4e05-8f32-40512cdd88c0",
1047
+ # "balance": {
1048
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
1049
+ # "currency": "BTC",
1050
+ # "type": "CRYPTO",
1051
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
1052
+ # "name": "BTC"
1053
+ # },
1054
+ # "detailId": null,
1055
+ # "time": 1522512298662,
1056
+ # "type": "TRANSACTION_OFFER_ABORTED_RETURN",
1057
+ # "value": 0.0564931,
1058
+ # "fundsBefore": {"total": 0.44951311, "available": 0.39302001, "locked": 0.0564931},
1059
+ # "fundsAfter": {"total": 0.44951311, "available": 0.44951311, "locked": 0},
1060
+ # "change": {"total": 0, "available": 0.0564931, "locked": -0.0564931}
1061
+ # }
1062
+ #
1063
+ # WITHDRAWAL_UNLOCK_FUNDS
1064
+ # {
1065
+ # "historyId": "0ed569a2-c330-482e-bb89-4cb553fb5b11",
1066
+ # "balance": {
1067
+ # "id": "3a7e7a1e-0324-49d5-8f59-298505ebd6c7",
1068
+ # "currency": "BTC",
1069
+ # "type": "CRYPTO",
1070
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
1071
+ # "name": "BTC"
1072
+ # },
1073
+ # "detailId": "0c7be256-c336-4111-bee7-4eb22e339700",
1074
+ # "time": 1527866360785,
1075
+ # "type": "WITHDRAWAL_UNLOCK_FUNDS",
1076
+ # "value": 0.05045,
1077
+ # "fundsBefore": {"total": 0.86001578, "available": 0.80956578, "locked": 0.05045},
1078
+ # "fundsAfter": {"total": 0.86001578, "available": 0.86001578, "locked": 0},
1079
+ # "change": {"total": 0, "available": 0.05045, "locked": -0.05045}
1080
+ # }
1081
+ #
1082
+ # TRANSACTION_COMMISSION_RETURN
1083
+ # {
1084
+ # "historyId": "07c89c27-46f1-4d7a-8518-b73798bf168a",
1085
+ # "balance": {
1086
+ # "id": "ab43023b-4079-414c-b340-056e3430a3af",
1087
+ # "currency": "EUR",
1088
+ # "type": "FIAT",
1089
+ # "userId": "a34d361d-7bad-49c1-888e-62473b75d877",
1090
+ # "name": "EUR"
1091
+ # },
1092
+ # "detailId": null,
1093
+ # "time": 1528304043063,
1094
+ # "type": "TRANSACTION_COMMISSION_RETURN",
1095
+ # "value": 0.6,
1096
+ # "fundsBefore": {"total": 0, "available": 0, "locked": 0},
1097
+ # "fundsAfter": {"total": 0.6, "available": 0.6, "locked": 0},
1098
+ # "change": {"total": 0.6, "available": 0.6, "locked": 0}
1099
+ # }
1100
+ #
1101
+ timestamp = self.safe_integer(item, 'time')
1102
+ balance = self.safe_value(item, 'balance', {})
1103
+ currencyId = self.safe_string(balance, 'currency')
1104
+ change = self.safe_value(item, 'change', {})
1105
+ amount = self.safe_string(change, 'total')
1106
+ direction = 'in'
1107
+ if Precise.string_lt(amount, '0'):
1108
+ direction = 'out'
1109
+ amount = Precise.string_neg(amount)
1110
+ # there are 2 undocumented api calls: (v1_01PrivateGetPaymentsDepositDetailId and v1_01PrivateGetPaymentsWithdrawalDetailId)
1111
+ # that can be used to enrich the transfers with txid, address etc(you need to use info.detailId parameter)
1112
+ fundsBefore = self.safe_value(item, 'fundsBefore', {})
1113
+ fundsAfter = self.safe_value(item, 'fundsAfter', {})
1114
+ return {
1115
+ 'info': item,
1116
+ 'id': self.safe_string(item, 'historyId'),
1117
+ 'direction': direction,
1118
+ 'account': None,
1119
+ 'referenceId': self.safe_string(item, 'detailId'),
1120
+ 'referenceAccount': None,
1121
+ 'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
1122
+ 'currency': self.safe_currency_code(currencyId),
1123
+ 'amount': self.parse_number(amount),
1124
+ 'before': self.safe_number(fundsBefore, 'total'),
1125
+ 'after': self.safe_number(fundsAfter, 'total'),
1126
+ 'status': 'ok',
1127
+ 'timestamp': timestamp,
1128
+ 'datetime': self.iso8601(timestamp),
1129
+ 'fee': None,
1130
+ }
1131
+
1132
+ def parse_ledger_entry_type(self, type):
1133
+ types: dict = {
1134
+ 'ADD_FUNDS': 'transaction',
1135
+ 'BITCOIN_GOLD_FORK': 'transaction',
1136
+ 'CREATE_BALANCE': 'transaction',
1137
+ 'FUNDS_MIGRATION': 'transaction',
1138
+ 'WITHDRAWAL_LOCK_FUNDS': 'transaction',
1139
+ 'WITHDRAWAL_SUBTRACT_FUNDS': 'transaction',
1140
+ 'WITHDRAWAL_UNLOCK_FUNDS': 'transaction',
1141
+ 'TRANSACTION_COMMISSION_OUTCOME': 'fee',
1142
+ 'TRANSACTION_COMMISSION_RETURN': 'fee',
1143
+ 'TRANSACTION_OFFER_ABORTED_RETURN': 'trade',
1144
+ 'TRANSACTION_OFFER_COMPLETED_RETURN': 'trade',
1145
+ 'TRANSACTION_POST_INCOME': 'trade',
1146
+ 'TRANSACTION_POST_OUTCOME': 'trade',
1147
+ 'TRANSACTION_PRE_LOCKING': 'trade',
1148
+ }
1149
+ return self.safe_string(types, type, type)
1150
+
1151
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
1152
+ #
1153
+ # [
1154
+ # "1582399800000",
1155
+ # {
1156
+ # "o": "0.0001428",
1157
+ # "c": "0.0001428",
1158
+ # "h": "0.0001428",
1159
+ # "l": "0.0001428",
1160
+ # "v": "4",
1161
+ # "co": "1"
1162
+ # }
1163
+ # ]
1164
+ #
1165
+ first = self.safe_value(ohlcv, 1, {})
1166
+ return [
1167
+ self.safe_integer(ohlcv, 0),
1168
+ self.safe_number(first, 'o'),
1169
+ self.safe_number(first, 'h'),
1170
+ self.safe_number(first, 'l'),
1171
+ self.safe_number(first, 'c'),
1172
+ self.safe_number(first, 'v'),
1173
+ ]
1174
+
1175
+ async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1176
+ """
1177
+ :see: https://docs.zondacrypto.exchange/reference/candles-chart
1178
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1179
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
1180
+ :param str timeframe: the length of time each candle represents
1181
+ :param int [since]: timestamp in ms of the earliest candle to fetch
1182
+ :param int [limit]: the maximum amount of candles to fetch
1183
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1184
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
1185
+ """
1186
+ await self.load_markets()
1187
+ market = self.market(symbol)
1188
+ tradingSymbol = market['baseId'] + '-' + market['quoteId']
1189
+ request: dict = {
1190
+ 'symbol': tradingSymbol,
1191
+ 'resolution': self.safe_string(self.timeframes, timeframe, timeframe),
1192
+ # 'from': 1574709092000, # unix timestamp in milliseconds, required
1193
+ # 'to': 1574709092000, # unix timestamp in milliseconds, required
1194
+ }
1195
+ if limit is None:
1196
+ limit = 100
1197
+ else:
1198
+ limit = min(limit, 11000) # supports up to 11k candles diapason
1199
+ duration = self.parse_timeframe(timeframe)
1200
+ timerange = limit * duration * 1000
1201
+ if since is None:
1202
+ request['to'] = self.milliseconds()
1203
+ request['from'] = request['to'] - timerange
1204
+ else:
1205
+ request['from'] = since
1206
+ request['to'] = self.sum(request['from'], timerange)
1207
+ response = await self.v1_01PublicGetTradingCandleHistorySymbolResolution(self.extend(request, params))
1208
+ #
1209
+ # {
1210
+ # "status":"Ok",
1211
+ # "items":[
1212
+ # ["1591503060000",{"o":"0.02509572","c":"0.02509438","h":"0.02509664","l":"0.02509438","v":"0.02082165","co":"17"}],
1213
+ # ["1591503120000",{"o":"0.02509606","c":"0.02509515","h":"0.02509606","l":"0.02509487","v":"0.04971703","co":"13"}],
1214
+ # ["1591503180000",{"o":"0.02509532","c":"0.02509589","h":"0.02509589","l":"0.02509454","v":"0.01332236","co":"7"}],
1215
+ # ]
1216
+ # }
1217
+ #
1218
+ items = self.safe_list(response, 'items', [])
1219
+ return self.parse_ohlcvs(items, market, timeframe, since, limit)
1220
+
1221
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1222
+ #
1223
+ # createOrder trades
1224
+ #
1225
+ # {
1226
+ # "rate": "0.02195928",
1227
+ # "amount": "0.00167952"
1228
+ # }
1229
+ #
1230
+ # fetchMyTrades(private)
1231
+ #
1232
+ # {
1233
+ # "amount": "0.29285199",
1234
+ # "commissionValue": "0.00125927",
1235
+ # "id": "11c8203a-a267-11e9-b698-0242ac110007",
1236
+ # "initializedBy": "Buy",
1237
+ # "market": "ETH-EUR",
1238
+ # "offerId": "11c82038-a267-11e9-b698-0242ac110007",
1239
+ # "rate": "277",
1240
+ # "time": "1562689917517",
1241
+ # "userAction": "Buy",
1242
+ # "wasTaker": True,
1243
+ # }
1244
+ #
1245
+ # fetchTrades(public)
1246
+ #
1247
+ # {
1248
+ # "id": "df00b0da-e5e0-11e9-8c19-0242ac11000a",
1249
+ # "t": "1570108958831",
1250
+ # "a": "0.04776653",
1251
+ # "r": "0.02145854",
1252
+ # "ty": "Sell"
1253
+ # }
1254
+ #
1255
+ timestamp = self.safe_integer_2(trade, 'time', 't')
1256
+ side = self.safe_string_lower_2(trade, 'userAction', 'ty')
1257
+ wasTaker = self.safe_value(trade, 'wasTaker')
1258
+ takerOrMaker: Str = None
1259
+ if wasTaker is not None:
1260
+ takerOrMaker = 'taker' if wasTaker else 'maker'
1261
+ priceString = self.safe_string_2(trade, 'rate', 'r')
1262
+ amountString = self.safe_string_2(trade, 'amount', 'a')
1263
+ feeCostString = self.safe_string(trade, 'commissionValue')
1264
+ marketId = self.safe_string(trade, 'market')
1265
+ market = self.safe_market(marketId, market, '-')
1266
+ symbol = market['symbol']
1267
+ fee = None
1268
+ if feeCostString is not None:
1269
+ feeCurrency = market['base'] if (side == 'buy') else market['quote']
1270
+ fee = {
1271
+ 'currency': feeCurrency,
1272
+ 'cost': feeCostString,
1273
+ }
1274
+ order = self.safe_string(trade, 'offerId')
1275
+ # todo: check self logic
1276
+ type: Str = None
1277
+ if order is not None:
1278
+ type = 'limit' if order else 'market'
1279
+ return self.safe_trade({
1280
+ 'id': self.safe_string(trade, 'id'),
1281
+ 'order': order,
1282
+ 'timestamp': timestamp,
1283
+ 'datetime': self.iso8601(timestamp),
1284
+ 'symbol': symbol,
1285
+ 'type': type,
1286
+ 'side': side,
1287
+ 'price': priceString,
1288
+ 'amount': amountString,
1289
+ 'cost': None,
1290
+ 'takerOrMaker': takerOrMaker,
1291
+ 'fee': fee,
1292
+ 'info': trade,
1293
+ }, market)
1294
+
1295
+ async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1296
+ """
1297
+ :see: https://docs.zondacrypto.exchange/reference/last-transactions
1298
+ get the list of most recent trades for a particular symbol
1299
+ :param str symbol: unified symbol of the market to fetch trades for
1300
+ :param int [since]: timestamp in ms of the earliest trade to fetch
1301
+ :param int [limit]: the maximum amount of trades to fetch
1302
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1303
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
1304
+ """
1305
+ await self.load_markets()
1306
+ market = self.market(symbol)
1307
+ tradingSymbol = market['baseId'] + '-' + market['quoteId']
1308
+ request: dict = {
1309
+ 'symbol': tradingSymbol,
1310
+ }
1311
+ if since is not None:
1312
+ request['fromTime'] = since - 1 # result does not include exactly `since` time therefore decrease by 1
1313
+ if limit is not None:
1314
+ request['limit'] = limit # default - 10, max - 300
1315
+ response = await self.v1_01PublicGetTradingTransactionsSymbol(self.extend(request, params))
1316
+ items = self.safe_list(response, 'items')
1317
+ return self.parse_trades(items, market, since, limit)
1318
+
1319
+ async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1320
+ """
1321
+ create a trade order
1322
+ :param str symbol: unified symbol of the market to create an order in
1323
+ :param str type: 'market' or 'limit'
1324
+ :param str side: 'buy' or 'sell'
1325
+ :param float amount: how much of currency you want to trade in units of base currency
1326
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1327
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1328
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1329
+ """
1330
+ await self.load_markets()
1331
+ market = self.market(symbol)
1332
+ tradingSymbol = market['baseId'] + '-' + market['quoteId']
1333
+ amount = float(self.amount_to_precision(symbol, amount))
1334
+ request: dict = {
1335
+ 'symbol': tradingSymbol,
1336
+ 'offerType': side.upper(),
1337
+ 'amount': amount,
1338
+ }
1339
+ stopLossPrice = self.safe_value_2(params, 'stopPrice', 'stopLossPrice')
1340
+ isStopLossPrice = stopLossPrice is not None
1341
+ isLimitOrder = type == 'limit'
1342
+ isMarketOrder = type == 'market'
1343
+ isStopLimit = (type == 'stop-limit') or (isLimitOrder and isStopLossPrice)
1344
+ isStopMarket = type == 'stop-market' or (isMarketOrder and isStopLossPrice)
1345
+ isStopOrder = isStopLimit or isStopMarket
1346
+ if isLimitOrder or isStopLimit:
1347
+ request['rate'] = self.price_to_precision(symbol, price)
1348
+ request['mode'] = 'stop-limit' if isStopLimit else 'limit'
1349
+ elif isMarketOrder or isStopMarket:
1350
+ request['mode'] = 'stop-market' if isStopMarket else 'market'
1351
+ else:
1352
+ raise ExchangeError(self.id + ' createOrder() invalid type')
1353
+ params = self.omit(params, ['stopPrice', 'stopLossPrice'])
1354
+ response = None
1355
+ if isStopOrder:
1356
+ if not isStopLossPrice:
1357
+ raise ExchangeError(self.id + ' createOrder() zonda requires `triggerPrice` or `stopPrice` parameter for stop-limit or stop-market orders')
1358
+ request['stopRate'] = self.price_to_precision(symbol, stopLossPrice)
1359
+ response = await self.v1_01PrivatePostTradingStopOfferSymbol(self.extend(request, params))
1360
+ else:
1361
+ response = await self.v1_01PrivatePostTradingOfferSymbol(self.extend(request, params))
1362
+ #
1363
+ # unfilled(open order)
1364
+ #
1365
+ # {
1366
+ # "status": "Ok",
1367
+ # "completed": False, # can deduce status from here
1368
+ # "offerId": "ce9cc72e-d61c-11e9-9248-0242ac110005",
1369
+ # "transactions": [], # can deduce order info from here
1370
+ # }
1371
+ #
1372
+ # filled(closed order)
1373
+ #
1374
+ # {
1375
+ # "status": "Ok",
1376
+ # "offerId": "942a4a3e-e922-11e9-8c19-0242ac11000a",
1377
+ # "completed": True,
1378
+ # "transactions": [
1379
+ # {
1380
+ # "rate": "0.02195928",
1381
+ # "amount": "0.00167952"
1382
+ # },
1383
+ # {
1384
+ # "rate": "0.02195928",
1385
+ # "amount": "0.00167952"
1386
+ # },
1387
+ # {
1388
+ # "rate": "0.02196207",
1389
+ # "amount": "0.27704177"
1390
+ # }
1391
+ # ]
1392
+ # }
1393
+ #
1394
+ # partially-filled(open order)
1395
+ #
1396
+ # {
1397
+ # "status": "Ok",
1398
+ # "offerId": "d0ebefab-f4d7-11e9-8c19-0242ac11000a",
1399
+ # "completed": False,
1400
+ # "transactions": [
1401
+ # {
1402
+ # "rate": "0.02106404",
1403
+ # "amount": "0.0019625"
1404
+ # },
1405
+ # {
1406
+ # "rate": "0.02106404",
1407
+ # "amount": "0.0019625"
1408
+ # },
1409
+ # {
1410
+ # "rate": "0.02105901",
1411
+ # "amount": "0.00975256"
1412
+ # }
1413
+ # ]
1414
+ # }
1415
+ #
1416
+ id = self.safe_string_2(response, 'offerId', 'stopOfferId')
1417
+ completed = self.safe_bool(response, 'completed', False)
1418
+ status = 'closed' if completed else 'open'
1419
+ transactions = self.safe_value(response, 'transactions')
1420
+ return self.safe_order({
1421
+ 'id': id,
1422
+ 'info': response,
1423
+ 'timestamp': None,
1424
+ 'datetime': None,
1425
+ 'lastTradeTimestamp': None,
1426
+ 'status': status,
1427
+ 'symbol': symbol,
1428
+ 'type': type,
1429
+ 'side': side,
1430
+ 'price': price,
1431
+ 'amount': amount,
1432
+ 'cost': None,
1433
+ 'filled': None,
1434
+ 'remaining': None,
1435
+ 'average': None,
1436
+ 'fee': None,
1437
+ 'trades': transactions,
1438
+ 'clientOrderId': None,
1439
+ })
1440
+
1441
+ async def cancel_order(self, id: str, symbol: Str = None, params={}):
1442
+ """
1443
+ :see: https://docs.zondacrypto.exchange/reference/cancel-order
1444
+ cancels an open order
1445
+ :param str id: order id
1446
+ :param str symbol: unified symbol of the market the order was made in
1447
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1448
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1449
+ """
1450
+ side = self.safe_string(params, 'side')
1451
+ if side is None:
1452
+ raise ExchangeError(self.id + ' cancelOrder() requires a `side` parameter("buy" or "sell")')
1453
+ price = self.safe_value(params, 'price')
1454
+ if price is None:
1455
+ raise ExchangeError(self.id + ' cancelOrder() requires a `price` parameter(float or string)')
1456
+ await self.load_markets()
1457
+ market = self.market(symbol)
1458
+ tradingSymbol = market['baseId'] + '-' + market['quoteId']
1459
+ request: dict = {
1460
+ 'symbol': tradingSymbol,
1461
+ 'id': id,
1462
+ 'side': side,
1463
+ 'price': price,
1464
+ }
1465
+ response = await self.v1_01PrivateDeleteTradingOfferSymbolIdSidePrice(self.extend(request, params))
1466
+ # {status: "Fail", errors: ["NOT_RECOGNIZED_OFFER_TYPE"]} -- if required params are missing
1467
+ # {status: "Ok", errors: []}
1468
+ return self.parse_order(response)
1469
+
1470
+ def is_fiat(self, currency):
1471
+ fiatCurrencies: dict = {
1472
+ 'USD': True,
1473
+ 'EUR': True,
1474
+ 'PLN': True,
1475
+ }
1476
+ return self.safe_bool(fiatCurrencies, currency, False)
1477
+
1478
+ def parse_deposit_address(self, depositAddress, currency: Currency = None):
1479
+ #
1480
+ # {
1481
+ # "address": "33u5YAEhQbYfjHHPsfMfCoSdEjfwYjVcBE",
1482
+ # "currency": "BTC",
1483
+ # "balanceId": "5d5d19e7-2265-49c7-af9a-047bcf384f21",
1484
+ # "balanceEngine": "BITBAY",
1485
+ # "tag": null
1486
+ # }
1487
+ #
1488
+ currencyId = self.safe_string(depositAddress, 'currency')
1489
+ address = self.safe_string(depositAddress, 'address')
1490
+ self.check_address(address)
1491
+ return {
1492
+ 'currency': self.safe_currency_code(currencyId, currency),
1493
+ 'address': address,
1494
+ 'tag': self.safe_string(depositAddress, 'tag'),
1495
+ 'network': None,
1496
+ 'info': depositAddress,
1497
+ }
1498
+
1499
+ async def fetch_deposit_address(self, code: str, params={}):
1500
+ """
1501
+ :see: https://docs.zondacrypto.exchange/reference/deposit-addresses-for-crypto
1502
+ fetch the deposit address for a currency associated with self account
1503
+ :param str code: unified currency code
1504
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1505
+ :param str [params.walletId]: Wallet id to filter deposit adresses.
1506
+ :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1507
+ """
1508
+ await self.load_markets()
1509
+ currency = self.currency(code)
1510
+ request: dict = {
1511
+ 'currency': currency['id'],
1512
+ }
1513
+ response = await self.v1_01PrivateGetApiPaymentsDepositsCryptoAddresses(self.extend(request, params))
1514
+ #
1515
+ # {
1516
+ # "status": "Ok",
1517
+ # "data": [{
1518
+ # "address": "33u5YAEhQbYfjHHPsfMfCoSdEjfwYjVcBE",
1519
+ # "currency": "BTC",
1520
+ # "balanceId": "5d5d19e7-2265-49c7-af9a-047bcf384f21",
1521
+ # "balanceEngine": "BITBAY",
1522
+ # "tag": null
1523
+ # }
1524
+ # ]
1525
+ # }
1526
+ #
1527
+ data = self.safe_value(response, 'data')
1528
+ first = self.safe_dict(data, 0)
1529
+ return self.parse_deposit_address(first, currency)
1530
+
1531
+ async def fetch_deposit_addresses(self, codes: Strings = None, params={}):
1532
+ """
1533
+ :see: https://docs.zondacrypto.exchange/reference/deposit-addresses-for-crypto
1534
+ fetch deposit addresses for multiple currencies and chain types
1535
+ :param str[]|None codes: zonda does not support filtering filtering by multiple codes and will ignore self parameter.
1536
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1537
+ :returns dict: a list of `address structures <https://docs.ccxt.com/#/?id=address-structure>`
1538
+ """
1539
+ await self.load_markets()
1540
+ response = await self.v1_01PrivateGetApiPaymentsDepositsCryptoAddresses(params)
1541
+ #
1542
+ # {
1543
+ # "status": "Ok",
1544
+ # "data": [{
1545
+ # "address": "33u5YAEhQbYfjHHPsfMfCoSdEjfwYjVcBE",
1546
+ # "currency": "BTC",
1547
+ # "balanceId": "5d5d19e7-2265-49c7-af9a-047bcf384f21",
1548
+ # "balanceEngine": "BITBAY",
1549
+ # "tag": null
1550
+ # }
1551
+ # ]
1552
+ # }
1553
+ #
1554
+ data = self.safe_list(response, 'data')
1555
+ return self.parse_deposit_addresses(data, codes)
1556
+
1557
+ async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
1558
+ """
1559
+ :see: https://docs.zondacrypto.exchange/reference/internal-transfer
1560
+ transfer currency internally between wallets on the same account
1561
+ :param str code: unified currency code
1562
+ :param float amount: amount to transfer
1563
+ :param str fromAccount: account to transfer from
1564
+ :param str toAccount: account to transfer to
1565
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1566
+ :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
1567
+ """
1568
+ await self.load_markets()
1569
+ currency = self.currency(code)
1570
+ request: dict = {
1571
+ 'source': fromAccount,
1572
+ 'destination': toAccount,
1573
+ 'currency': code,
1574
+ 'funds': self.currency_to_precision(code, amount),
1575
+ }
1576
+ response = await self.v1_01PrivatePostBalancesBITBAYBalanceTransferSourceDestination(self.extend(request, params))
1577
+ #
1578
+ # {
1579
+ # "status": "Ok",
1580
+ # "from": {
1581
+ # "id": "ad9397c5-3bd9-4372-82ba-22da6a90cb56",
1582
+ # "userId": "4bc43956-423f-47fd-9faa-acd37c58ed9f",
1583
+ # "availableFunds": 0.01803472,
1584
+ # "totalFunds": 0.01804161,
1585
+ # "lockedFunds": 0.00000689,
1586
+ # "currency": "BTC",
1587
+ # "type": "CRYPTO",
1588
+ # "name": "BTC",
1589
+ # "balanceEngine": "BITBAY"
1590
+ # },
1591
+ # "to": {
1592
+ # "id": "01931d52-536b-4ca5-a9f4-be28c86d0cc3",
1593
+ # "userId": "4bc43956-423f-47fd-9faa-acd37c58ed9f",
1594
+ # "availableFunds": 0.0001,
1595
+ # "totalFunds": 0.0001,
1596
+ # "lockedFunds": 0,
1597
+ # "currency": "BTC",
1598
+ # "type": "CRYPTO",
1599
+ # "name": "Prowizja",
1600
+ # "balanceEngine": "BITBAY"
1601
+ # },
1602
+ # "errors": null
1603
+ # }
1604
+ #
1605
+ transfer = self.parse_transfer(response, currency)
1606
+ transferOptions = self.safe_value(self.options, 'transfer', {})
1607
+ fillResponseFromRequest = self.safe_bool(transferOptions, 'fillResponseFromRequest', True)
1608
+ if fillResponseFromRequest:
1609
+ transfer['amount'] = amount
1610
+ return transfer
1611
+
1612
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
1613
+ #
1614
+ # {
1615
+ # "status": "Ok",
1616
+ # "from": {
1617
+ # "id": "ad9397c5-3bd9-4372-82ba-22da6a90cb56",
1618
+ # "userId": "4bc43956-423f-47fd-9faa-acd37c58ed9f",
1619
+ # "availableFunds": 0.01803472,
1620
+ # "totalFunds": 0.01804161,
1621
+ # "lockedFunds": 0.00000689,
1622
+ # "currency": "BTC",
1623
+ # "type": "CRYPTO",
1624
+ # "name": "BTC",
1625
+ # "balanceEngine": "BITBAY"
1626
+ # },
1627
+ # "to": {
1628
+ # "id": "01931d52-536b-4ca5-a9f4-be28c86d0cc3",
1629
+ # "userId": "4bc43956-423f-47fd-9faa-acd37c58ed9f",
1630
+ # "availableFunds": 0.0001,
1631
+ # "totalFunds": 0.0001,
1632
+ # "lockedFunds": 0,
1633
+ # "currency": "BTC",
1634
+ # "type": "CRYPTO",
1635
+ # "name": "Prowizja",
1636
+ # "balanceEngine": "BITBAY"
1637
+ # },
1638
+ # "errors": null
1639
+ # }
1640
+ #
1641
+ status = self.safe_string(transfer, 'status')
1642
+ fromAccount = self.safe_value(transfer, 'from', {})
1643
+ fromId = self.safe_string(fromAccount, 'id')
1644
+ to = self.safe_value(transfer, 'to', {})
1645
+ toId = self.safe_string(to, 'id')
1646
+ currencyId = self.safe_string(fromAccount, 'currency')
1647
+ return {
1648
+ 'info': transfer,
1649
+ 'id': None,
1650
+ 'timestamp': None,
1651
+ 'datetime': None,
1652
+ 'currency': self.safe_currency_code(currencyId, currency),
1653
+ 'amount': None,
1654
+ 'fromAccount': fromId,
1655
+ 'toAccount': toId,
1656
+ 'status': self.parse_transfer_status(status),
1657
+ }
1658
+
1659
+ def parse_transfer_status(self, status: Str) -> Str:
1660
+ statuses: dict = {
1661
+ 'Ok': 'ok',
1662
+ 'Fail': 'failed',
1663
+ }
1664
+ return self.safe_string(statuses, status, status)
1665
+
1666
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1667
+ """
1668
+ :see: https://docs.zondacrypto.exchange/reference/crypto-withdrawal-1
1669
+ make a withdrawal
1670
+ :param str code: unified currency code
1671
+ :param float amount: the amount to withdraw
1672
+ :param str address: the address to withdraw to
1673
+ :param str tag:
1674
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1675
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1676
+ """
1677
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1678
+ self.check_address(address)
1679
+ await self.load_markets()
1680
+ response = None
1681
+ currency = self.currency(code)
1682
+ request: dict = {
1683
+ 'currency': currency['id'],
1684
+ 'amount': amount,
1685
+ 'address': address,
1686
+ # request['balanceId'] = params['balanceId'] # Wallet id used for withdrawal. If not provided, any BITBAY wallet with sufficient funds is used. If BITBAYPAY wallet should be used parameter must be explicitly specified.
1687
+ }
1688
+ if self.is_fiat(code):
1689
+ # request['swift'] = params['swift'] # Bank identifier, if required.
1690
+ response = await self.v1_01PrivatePostApiPaymentsWithdrawalsFiat(self.extend(request, params))
1691
+ else:
1692
+ if tag is not None:
1693
+ request['tag'] = tag
1694
+ response = await self.v1_01PrivatePostApiPaymentsWithdrawalsCrypto(self.extend(request, params))
1695
+ #
1696
+ # {
1697
+ # "status": "Ok",
1698
+ # "data": {
1699
+ # "id": "65e01087-afb0-4ab2-afdb-cc925e360296"
1700
+ # }
1701
+ # }
1702
+ #
1703
+ data = self.safe_dict(response, 'data')
1704
+ return self.parse_transaction(data, currency)
1705
+
1706
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1707
+ #
1708
+ # withdraw
1709
+ #
1710
+ # {
1711
+ # "id": "65e01087-afb0-4ab2-afdb-cc925e360296"
1712
+ # }
1713
+ #
1714
+ currency = self.safe_currency(None, currency)
1715
+ return {
1716
+ 'id': self.safe_string(transaction, 'id'),
1717
+ 'txid': None,
1718
+ 'timestamp': None,
1719
+ 'datetime': None,
1720
+ 'network': None,
1721
+ 'addressFrom': None,
1722
+ 'address': None,
1723
+ 'addressTo': None,
1724
+ 'amount': None,
1725
+ 'type': None,
1726
+ 'currency': currency['code'],
1727
+ 'status': None,
1728
+ 'updated': None,
1729
+ 'tagFrom': None,
1730
+ 'tag': None,
1731
+ 'tagTo': None,
1732
+ 'comment': None,
1733
+ 'internal': None,
1734
+ 'fee': None,
1735
+ 'info': transaction,
1736
+ }
1737
+
1738
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1739
+ url = self.implode_hostname(self.urls['api'][api])
1740
+ if api == 'public':
1741
+ query = self.omit(params, self.extract_params(path))
1742
+ url += '/' + self.implode_params(path, params) + '.json'
1743
+ if query:
1744
+ url += '?' + self.urlencode(query)
1745
+ elif api == 'v1_01Public':
1746
+ query = self.omit(params, self.extract_params(path))
1747
+ url += '/' + self.implode_params(path, params)
1748
+ if query:
1749
+ url += '?' + self.urlencode(query)
1750
+ elif api == 'v1_01Private':
1751
+ self.check_required_credentials()
1752
+ query = self.omit(params, self.extract_params(path))
1753
+ url += '/' + self.implode_params(path, params)
1754
+ nonce = str(self.milliseconds())
1755
+ payload: Str = None
1756
+ if method != 'POST':
1757
+ if query:
1758
+ url += '?' + self.urlencode(query)
1759
+ payload = self.apiKey + nonce
1760
+ elif body is None:
1761
+ body = self.json(query)
1762
+ payload = self.apiKey + nonce + body
1763
+ headers = {
1764
+ 'Request-Timestamp': nonce,
1765
+ 'Operation-Id': self.uuid(),
1766
+ 'API-Key': self.apiKey,
1767
+ 'API-Hash': self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha512),
1768
+ 'Content-Type': 'application/json',
1769
+ }
1770
+ else:
1771
+ self.check_required_credentials()
1772
+ body = self.urlencode(self.extend({
1773
+ 'method': path,
1774
+ 'moment': self.nonce(),
1775
+ }, params))
1776
+ headers = {
1777
+ 'Content-Type': 'application/x-www-form-urlencoded',
1778
+ 'API-Key': self.apiKey,
1779
+ 'API-Hash': self.hmac(self.encode(body), self.encode(self.secret), hashlib.sha512),
1780
+ }
1781
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1782
+
1783
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1784
+ if response is None:
1785
+ return None # fallback to default error handler
1786
+ if 'code' in response:
1787
+ #
1788
+ # bitbay returns the integer "success": 1 key from their private API
1789
+ # or an integer "code" value from 0 to 510 and an error message
1790
+ #
1791
+ # {"success": 1, ...}
1792
+ # {'code': 502, "message": "Invalid sign"}
1793
+ # {'code': 0, "message": "offer funds not exceeding minimums"}
1794
+ #
1795
+ # 400 At least one parameter wasn't set
1796
+ # 401 Invalid order type
1797
+ # 402 No orders with specified currencies
1798
+ # 403 Invalid payment currency name
1799
+ # 404 Error. Wrong transaction type
1800
+ # 405 Order with self id doesn't exist
1801
+ # 406 No enough money or crypto
1802
+ # 408 Invalid currency name
1803
+ # 501 Invalid public key
1804
+ # 502 Invalid sign
1805
+ # 503 Invalid moment parameter. Request time doesn't match current server time
1806
+ # 504 Invalid method
1807
+ # 505 Key has no permission for self action
1808
+ # 506 Account locked. Please contact with customer service
1809
+ # 509 The BIC/SWIFT is required for self currency
1810
+ # 510 Invalid market name
1811
+ #
1812
+ code = self.safe_string(response, 'code') # always an integer
1813
+ feedback = self.id + ' ' + body
1814
+ self.throw_exactly_matched_exception(self.exceptions, code, feedback)
1815
+ raise ExchangeError(feedback)
1816
+ elif 'status' in response:
1817
+ #
1818
+ # {"status":"Fail","errors":["OFFER_FUNDS_NOT_EXCEEDING_MINIMUMS"]}
1819
+ #
1820
+ status = self.safe_string(response, 'status')
1821
+ if status == 'Fail':
1822
+ errors = self.safe_value(response, 'errors')
1823
+ feedback = self.id + ' ' + body
1824
+ for i in range(0, len(errors)):
1825
+ error = errors[i]
1826
+ self.throw_exactly_matched_exception(self.exceptions, error, feedback)
1827
+ raise ExchangeError(feedback)
1828
+ return None