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,1247 @@
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.indodax import ImplicitAPI
8
+ import hashlib
9
+ import math
10
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
11
+ from typing import List
12
+ from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import ArgumentsRequired
15
+ from ccxt.base.errors import BadSymbol
16
+ from ccxt.base.errors import InsufficientFunds
17
+ from ccxt.base.errors import InvalidOrder
18
+ from ccxt.base.errors import OrderNotFound
19
+ from ccxt.base.decimal_to_precision import TICK_SIZE
20
+
21
+
22
+ class indodax(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(indodax, self).describe(), {
26
+ 'id': 'indodax',
27
+ 'name': 'INDODAX',
28
+ 'countries': ['ID'], # Indonesia
29
+ # 10 requests per second for making trades => 1000ms / 10 = 100ms
30
+ # 180 requests per minute(public endpoints) = 2 requests per second => cost = (1000ms / rateLimit) / 2 = 5
31
+ 'rateLimit': 100,
32
+ 'has': {
33
+ 'CORS': None,
34
+ 'spot': True,
35
+ 'margin': False,
36
+ 'swap': False,
37
+ 'future': False,
38
+ 'option': False,
39
+ 'addMargin': False,
40
+ 'cancelAllOrders': False,
41
+ 'cancelOrder': True,
42
+ 'cancelOrders': False,
43
+ 'closeAllPositions': False,
44
+ 'closePosition': False,
45
+ 'createDepositAddress': False,
46
+ 'createOrder': True,
47
+ 'createReduceOnlyOrder': False,
48
+ 'createStopLimitOrder': False,
49
+ 'createStopMarketOrder': False,
50
+ 'createStopOrder': False,
51
+ 'fetchBalance': True,
52
+ 'fetchBorrowRateHistories': False,
53
+ 'fetchBorrowRateHistory': False,
54
+ 'fetchClosedOrders': True,
55
+ 'fetchCrossBorrowRate': False,
56
+ 'fetchCrossBorrowRates': False,
57
+ 'fetchDeposit': False,
58
+ 'fetchDepositAddress': 'emulated',
59
+ 'fetchDepositAddresses': True,
60
+ 'fetchDepositAddressesByNetwork': False,
61
+ 'fetchDeposits': False,
62
+ 'fetchDepositsWithdrawals': True,
63
+ 'fetchFundingHistory': False,
64
+ 'fetchFundingRate': False,
65
+ 'fetchFundingRateHistory': False,
66
+ 'fetchFundingRates': False,
67
+ 'fetchIndexOHLCV': False,
68
+ 'fetchIsolatedBorrowRate': False,
69
+ 'fetchIsolatedBorrowRates': False,
70
+ 'fetchLeverage': False,
71
+ 'fetchLeverageTiers': False,
72
+ 'fetchMarginMode': False,
73
+ 'fetchMarkets': True,
74
+ 'fetchMarkOHLCV': False,
75
+ 'fetchOpenInterestHistory': False,
76
+ 'fetchOpenOrders': True,
77
+ 'fetchOrder': True,
78
+ 'fetchOrderBook': True,
79
+ 'fetchOrders': False,
80
+ 'fetchPosition': False,
81
+ 'fetchPositionHistory': False,
82
+ 'fetchPositionMode': False,
83
+ 'fetchPositions': False,
84
+ 'fetchPositionsForSymbol': False,
85
+ 'fetchPositionsHistory': False,
86
+ 'fetchPositionsRisk': False,
87
+ 'fetchPremiumIndexOHLCV': False,
88
+ 'fetchTicker': True,
89
+ 'fetchTime': True,
90
+ 'fetchTrades': True,
91
+ 'fetchTradingFee': False,
92
+ 'fetchTradingFees': False,
93
+ 'fetchTransactionFee': True,
94
+ 'fetchTransactionFees': False,
95
+ 'fetchTransactions': 'emulated',
96
+ 'fetchTransfer': False,
97
+ 'fetchTransfers': False,
98
+ 'fetchWithdrawal': False,
99
+ 'fetchWithdrawals': False,
100
+ 'reduceMargin': False,
101
+ 'setLeverage': False,
102
+ 'setMargin': False,
103
+ 'setMarginMode': False,
104
+ 'setPositionMode': False,
105
+ 'transfer': False,
106
+ 'withdraw': True,
107
+ },
108
+ 'version': '2.0', # 9 April 2018
109
+ 'urls': {
110
+ 'logo': 'https://user-images.githubusercontent.com/51840849/87070508-9358c880-c221-11ea-8dc5-5391afbbb422.jpg',
111
+ 'api': {
112
+ 'public': 'https://indodax.com',
113
+ 'private': 'https://indodax.com/tapi',
114
+ },
115
+ 'www': 'https://www.indodax.com',
116
+ 'doc': 'https://github.com/btcid/indodax-official-api-docs',
117
+ 'referral': 'https://indodax.com/ref/testbitcoincoid/1',
118
+ },
119
+ 'api': {
120
+ 'public': {
121
+ 'get': {
122
+ 'api/server_time': 5,
123
+ 'api/pairs': 5,
124
+ 'api/price_increments': 5,
125
+ 'api/summaries': 5,
126
+ 'api/ticker/{pair}': 5,
127
+ 'api/ticker_all': 5,
128
+ 'api/trades/{pair}': 5,
129
+ 'api/depth/{pair}': 5,
130
+ 'tradingview/history_v2': 5,
131
+ },
132
+ },
133
+ 'private': {
134
+ 'post': {
135
+ 'getInfo': 4,
136
+ 'transHistory': 4,
137
+ 'trade': 1,
138
+ 'tradeHistory': 4, # TODO add fetchMyTrades
139
+ 'openOrders': 4,
140
+ 'orderHistory': 4,
141
+ 'getOrder': 4,
142
+ 'cancelOrder': 4,
143
+ 'withdrawFee': 4,
144
+ 'withdrawCoin': 4,
145
+ 'listDownline': 4,
146
+ 'checkDownline': 4,
147
+ 'createVoucher': 4, # partner only
148
+ },
149
+ },
150
+ },
151
+ 'fees': {
152
+ 'trading': {
153
+ 'tierBased': False,
154
+ 'percentage': True,
155
+ 'maker': 0,
156
+ 'taker': 0.003,
157
+ },
158
+ },
159
+ 'exceptions': {
160
+ 'exact': {
161
+ 'invalid_pair': BadSymbol, # {"error":"invalid_pair","error_description":"Invalid Pair"}
162
+ 'Insufficient balance.': InsufficientFunds,
163
+ 'invalid order.': OrderNotFound,
164
+ 'Invalid credentials. API not found or session has expired.': AuthenticationError,
165
+ 'Invalid credentials. Bad sign.': AuthenticationError,
166
+ },
167
+ 'broad': {
168
+ 'Minimum price': InvalidOrder,
169
+ 'Minimum order': InvalidOrder,
170
+ },
171
+ },
172
+ # exchange-specific options
173
+ 'options': {
174
+ 'recvWindow': 5 * 1000, # default 5 sec
175
+ 'timeDifference': 0, # the difference between system clock and exchange clock
176
+ 'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
177
+ 'networks': {
178
+ 'XLM': 'Stellar Token',
179
+ 'BSC': 'bep20',
180
+ 'TRC20': 'trc20',
181
+ 'MATIC': 'polygon',
182
+ # 'BEP2': 'bep2',
183
+ # 'ARB': 'arb',
184
+ # 'ERC20': 'erc20',
185
+ # 'KIP7': 'kip7',
186
+ # 'MAINNET': 'mainnet', # TODO: does mainnet just mean the default?
187
+ # 'OEP4': 'oep4',
188
+ # 'OP': 'op',
189
+ # 'SPL': 'spl',
190
+ # 'TRC10': 'trc10',
191
+ # 'ZRC2': 'zrc2'
192
+ # 'ETH': 'eth'
193
+ # 'BASE': 'base'
194
+ },
195
+ 'timeframes': {
196
+ '1m': '1',
197
+ '15m': '15',
198
+ '30m': '30',
199
+ '1h': '60',
200
+ '4h': '240',
201
+ '1d': '1D',
202
+ '3d': '3D',
203
+ '1w': '1W',
204
+ },
205
+ },
206
+ 'commonCurrencies': {
207
+ 'STR': 'XLM',
208
+ 'BCHABC': 'BCH',
209
+ 'BCHSV': 'BSV',
210
+ 'DRK': 'DASH',
211
+ 'NEM': 'XEM',
212
+ },
213
+ 'precisionMode': TICK_SIZE,
214
+ })
215
+
216
+ def nonce(self):
217
+ return self.milliseconds() - self.options['timeDifference']
218
+
219
+ async def fetch_time(self, params={}):
220
+ """
221
+ fetches the current integer timestamp in milliseconds from the exchange server
222
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#server-time
223
+ :param dict [params]: extra parameters specific to the exchange API endpoint
224
+ :returns int: the current integer timestamp in milliseconds from the exchange server
225
+ """
226
+ response = await self.publicGetApiServerTime(params)
227
+ #
228
+ # {
229
+ # "timezone": "UTC",
230
+ # "server_time": 1571205969552
231
+ # }
232
+ #
233
+ return self.safe_integer(response, 'server_time')
234
+
235
+ async def fetch_markets(self, params={}) -> List[Market]:
236
+ """
237
+ retrieves data on all markets for indodax
238
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#pairs
239
+ :param dict [params]: extra parameters specific to the exchange API endpoint
240
+ :returns dict[]: an array of objects representing market data
241
+ """
242
+ response = await self.publicGetApiPairs(params)
243
+ #
244
+ # [
245
+ # {
246
+ # "id": "btcidr",
247
+ # "symbol": "BTCIDR",
248
+ # "base_currency": "idr",
249
+ # "traded_currency": "btc",
250
+ # "traded_currency_unit": "BTC",
251
+ # "description": "BTC/IDR",
252
+ # "ticker_id": "btc_idr",
253
+ # "volume_precision": 0,
254
+ # "price_precision": 1000,
255
+ # "price_round": 8,
256
+ # "pricescale": 1000,
257
+ # "trade_min_base_currency": 10000,
258
+ # "trade_min_traded_currency": 0.00007457,
259
+ # "has_memo": False,
260
+ # "memo_name": False,
261
+ # "has_payment_id": False,
262
+ # "trade_fee_percent": 0.3,
263
+ # "url_logo": "https://indodax.com/v2/logo/svg/color/btc.svg",
264
+ # "url_logo_png": "https://indodax.com/v2/logo/png/color/btc.png",
265
+ # "is_maintenance": 0
266
+ # }
267
+ # ]
268
+ #
269
+ result = []
270
+ for i in range(0, len(response)):
271
+ market = response[i]
272
+ id = self.safe_string(market, 'ticker_id')
273
+ baseId = self.safe_string(market, 'traded_currency')
274
+ quoteId = self.safe_string(market, 'base_currency')
275
+ base = self.safe_currency_code(baseId)
276
+ quote = self.safe_currency_code(quoteId)
277
+ isMaintenance = self.safe_integer(market, 'is_maintenance')
278
+ result.append({
279
+ 'id': id,
280
+ 'symbol': base + '/' + quote,
281
+ 'base': base,
282
+ 'quote': quote,
283
+ 'settle': None,
284
+ 'baseId': baseId,
285
+ 'quoteId': quoteId,
286
+ 'settleId': None,
287
+ 'type': 'spot',
288
+ 'spot': True,
289
+ 'margin': False,
290
+ 'swap': False,
291
+ 'future': False,
292
+ 'option': False,
293
+ 'active': False if isMaintenance else True,
294
+ 'contract': False,
295
+ 'linear': None,
296
+ 'inverse': None,
297
+ 'taker': self.safe_number(market, 'trade_fee_percent'),
298
+ 'contractSize': None,
299
+ 'expiry': None,
300
+ 'expiryDatetime': None,
301
+ 'strike': None,
302
+ 'optionType': None,
303
+ 'percentage': True,
304
+ 'precision': {
305
+ 'amount': self.parse_number('1e-8'),
306
+ 'price': self.parse_number(self.parse_precision(self.safe_string(market, 'price_round'))),
307
+ 'cost': self.parse_number(self.parse_precision(self.safe_string(market, 'volume_precision'))),
308
+ },
309
+ 'limits': {
310
+ 'leverage': {
311
+ 'min': None,
312
+ 'max': None,
313
+ },
314
+ 'amount': {
315
+ 'min': self.safe_number(market, 'trade_min_traded_currency'),
316
+ 'max': None,
317
+ },
318
+ 'price': {
319
+ 'min': self.safe_number(market, 'trade_min_base_currency'),
320
+ 'max': None,
321
+ },
322
+ 'cost': {
323
+ 'min': None,
324
+ 'max': None,
325
+ },
326
+ },
327
+ 'created': None,
328
+ 'info': market,
329
+ })
330
+ return result
331
+
332
+ def parse_balance(self, response) -> Balances:
333
+ balances = self.safe_value(response, 'return', {})
334
+ free = self.safe_value(balances, 'balance', {})
335
+ used = self.safe_value(balances, 'balance_hold', {})
336
+ timestamp = self.safe_timestamp(balances, 'server_time')
337
+ result: dict = {
338
+ 'info': response,
339
+ 'timestamp': timestamp,
340
+ 'datetime': self.iso8601(timestamp),
341
+ }
342
+ currencyIds = list(free.keys())
343
+ for i in range(0, len(currencyIds)):
344
+ currencyId = currencyIds[i]
345
+ code = self.safe_currency_code(currencyId)
346
+ account = self.account()
347
+ account['free'] = self.safe_string(free, currencyId)
348
+ account['used'] = self.safe_string(used, currencyId)
349
+ result[code] = account
350
+ return self.safe_balance(result)
351
+
352
+ async def fetch_balance(self, params={}) -> Balances:
353
+ """
354
+ query for balance and get the amount of funds available for trading or funds locked in orders
355
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-info-endpoint
356
+ :param dict [params]: extra parameters specific to the exchange API endpoint
357
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
358
+ """
359
+ await self.load_markets()
360
+ response = await self.privatePostGetInfo(params)
361
+ #
362
+ # {
363
+ # "success":1,
364
+ # "return":{
365
+ # "server_time":1619562628,
366
+ # "balance":{
367
+ # "idr":167,
368
+ # "btc":"0.00000000",
369
+ # "1inch":"0.00000000",
370
+ # },
371
+ # "balance_hold":{
372
+ # "idr":0,
373
+ # "btc":"0.00000000",
374
+ # "1inch":"0.00000000",
375
+ # },
376
+ # "address":{
377
+ # "btc":"1KMntgzvU7iTSgMBWc11nVuJjAyfW3qJyk",
378
+ # "1inch":"0x1106c8bb3172625e1f411c221be49161dac19355",
379
+ # "xrp":"rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
380
+ # "zrx":"0x1106c8bb3172625e1f411c221be49161dac19355"
381
+ # },
382
+ # "user_id":"276011",
383
+ # "name":"",
384
+ # "email":"testbitcoincoid@mailforspam.com",
385
+ # "profile_picture":null,
386
+ # "verification_status":"unverified",
387
+ # "gauth_enable":true
388
+ # }
389
+ # }
390
+ #
391
+ return self.parse_balance(response)
392
+
393
+ async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
394
+ """
395
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
396
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#depth
397
+ :param str symbol: unified symbol of the market to fetch the order book for
398
+ :param int [limit]: the maximum amount of order book entries to return
399
+ :param dict [params]: extra parameters specific to the exchange API endpoint
400
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
401
+ """
402
+ await self.load_markets()
403
+ market = self.market(symbol)
404
+ request: dict = {
405
+ 'pair': market['base'] + market['quote'],
406
+ }
407
+ orderbook = await self.publicGetApiDepthPair(self.extend(request, params))
408
+ return self.parse_order_book(orderbook, market['symbol'], None, 'buy', 'sell')
409
+
410
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
411
+ #
412
+ # {
413
+ # "high":"0.01951",
414
+ # "low":"0.01877",
415
+ # "vol_eth":"39.38839319",
416
+ # "vol_btc":"0.75320886",
417
+ # "last":"0.01896",
418
+ # "buy":"0.01896",
419
+ # "sell":"0.019",
420
+ # "server_time":1565248908
421
+ # }
422
+ #
423
+ symbol = self.safe_symbol(None, market)
424
+ timestamp = self.safe_timestamp(ticker, 'server_time')
425
+ baseVolume = 'vol_' + market['baseId'].lower()
426
+ quoteVolume = 'vol_' + market['quoteId'].lower()
427
+ last = self.safe_string(ticker, 'last')
428
+ return self.safe_ticker({
429
+ 'symbol': symbol,
430
+ 'timestamp': timestamp,
431
+ 'datetime': self.iso8601(timestamp),
432
+ 'high': self.safe_string(ticker, 'high'),
433
+ 'low': self.safe_string(ticker, 'low'),
434
+ 'bid': self.safe_string(ticker, 'buy'),
435
+ 'bidVolume': None,
436
+ 'ask': self.safe_string(ticker, 'sell'),
437
+ 'askVolume': None,
438
+ 'vwap': None,
439
+ 'open': None,
440
+ 'close': last,
441
+ 'last': last,
442
+ 'previousClose': None,
443
+ 'change': None,
444
+ 'percentage': None,
445
+ 'average': None,
446
+ 'baseVolume': self.safe_string(ticker, baseVolume),
447
+ 'quoteVolume': self.safe_string(ticker, quoteVolume),
448
+ 'info': ticker,
449
+ }, market)
450
+
451
+ async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
452
+ """
453
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
454
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker
455
+ :param str symbol: unified symbol of the market to fetch the ticker for
456
+ :param dict [params]: extra parameters specific to the exchange API endpoint
457
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
458
+ """
459
+ await self.load_markets()
460
+ market = self.market(symbol)
461
+ request: dict = {
462
+ 'pair': market['base'] + market['quote'],
463
+ }
464
+ response = await self.publicGetApiTickerPair(self.extend(request, params))
465
+ #
466
+ # {
467
+ # "ticker": {
468
+ # "high":"0.01951",
469
+ # "low":"0.01877",
470
+ # "vol_eth":"39.38839319",
471
+ # "vol_btc":"0.75320886",
472
+ # "last":"0.01896",
473
+ # "buy":"0.01896",
474
+ # "sell":"0.019",
475
+ # "server_time":1565248908
476
+ # }
477
+ # }
478
+ #
479
+ ticker = self.safe_dict(response, 'ticker', {})
480
+ return self.parse_ticker(ticker, market)
481
+
482
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
483
+ """
484
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
485
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker-all
486
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
487
+ :param dict [params]: extra parameters specific to the exchange API endpoint
488
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
489
+ """
490
+ await self.load_markets()
491
+ #
492
+ # {
493
+ # "tickers": {
494
+ # "btc_idr": {
495
+ # "high": "120009000",
496
+ # "low": "116735000",
497
+ # "vol_btc": "218.13777777",
498
+ # "vol_idr": "25800033297",
499
+ # "last": "117088000",
500
+ # "buy": "117002000",
501
+ # "sell": "117078000",
502
+ # "server_time": 1571207881
503
+ # }
504
+ # }
505
+ # }
506
+ #
507
+ response = await self.publicGetApiTickerAll(params)
508
+ tickers = self.safe_dict(response, 'tickers', {})
509
+ return self.parse_tickers(tickers, symbols)
510
+
511
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
512
+ timestamp = self.safe_timestamp(trade, 'date')
513
+ return self.safe_trade({
514
+ 'id': self.safe_string(trade, 'tid'),
515
+ 'info': trade,
516
+ 'timestamp': timestamp,
517
+ 'datetime': self.iso8601(timestamp),
518
+ 'symbol': self.safe_symbol(None, market),
519
+ 'type': None,
520
+ 'side': self.safe_string(trade, 'type'),
521
+ 'order': None,
522
+ 'takerOrMaker': None,
523
+ 'price': self.safe_string(trade, 'price'),
524
+ 'amount': self.safe_string(trade, 'amount'),
525
+ 'cost': None,
526
+ 'fee': None,
527
+ }, market)
528
+
529
+ async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
530
+ """
531
+ get the list of most recent trades for a particular symbol
532
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#trades
533
+ :param str symbol: unified symbol of the market to fetch trades for
534
+ :param int [since]: timestamp in ms of the earliest trade to fetch
535
+ :param int [limit]: the maximum amount of trades to fetch
536
+ :param dict [params]: extra parameters specific to the exchange API endpoint
537
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
538
+ """
539
+ await self.load_markets()
540
+ market = self.market(symbol)
541
+ request: dict = {
542
+ 'pair': market['base'] + market['quote'],
543
+ }
544
+ response = await self.publicGetApiTradesPair(self.extend(request, params))
545
+ return self.parse_trades(response, market, since, limit)
546
+
547
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
548
+ #
549
+ # {
550
+ # "Time": 1708416900,
551
+ # "Open": 51707.52,
552
+ # "High": 51707.52,
553
+ # "Low": 51707.52,
554
+ # "Close": 51707.52,
555
+ # "Volume": "0"
556
+ # }
557
+ #
558
+ return [
559
+ self.safe_timestamp(ohlcv, 'Time'),
560
+ self.safe_number(ohlcv, 'Open'),
561
+ self.safe_number(ohlcv, 'High'),
562
+ self.safe_number(ohlcv, 'Low'),
563
+ self.safe_number(ohlcv, 'Close'),
564
+ self.safe_number(ohlcv, 'Volume'),
565
+ ]
566
+
567
+ async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
568
+ """
569
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
570
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
571
+ :param str timeframe: the length of time each candle represents
572
+ :param int [since]: timestamp in ms of the earliest candle to fetch
573
+ :param int [limit]: the maximum amount of candles to fetch
574
+ :param dict [params]: extra parameters specific to the exchange API endpoint
575
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
576
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
577
+ """
578
+ await self.load_markets()
579
+ market = self.market(symbol)
580
+ timeframes = self.options['timeframes']
581
+ selectedTimeframe = self.safe_string(timeframes, timeframe, timeframe)
582
+ now = self.seconds()
583
+ until = self.safe_integer(params, 'until', now)
584
+ params = self.omit(params, ['until'])
585
+ request: dict = {
586
+ 'to': until,
587
+ 'tf': selectedTimeframe,
588
+ 'symbol': market['base'] + market['quote'],
589
+ }
590
+ if limit is None:
591
+ limit = 1000
592
+ if since is not None:
593
+ request['from'] = int(math.floor(since / 1000))
594
+ else:
595
+ duration = self.parse_timeframe(timeframe)
596
+ request['from'] = now - limit * duration - 1
597
+ response = await self.publicGetTradingviewHistoryV2(self.extend(request, params))
598
+ #
599
+ # [
600
+ # {
601
+ # "Time": 1708416900,
602
+ # "Open": 51707.52,
603
+ # "High": 51707.52,
604
+ # "Low": 51707.52,
605
+ # "Close": 51707.52,
606
+ # "Volume": "0"
607
+ # }
608
+ # ]
609
+ #
610
+ return self.parse_ohlcvs(response, market, timeframe, since, limit)
611
+
612
+ def parse_order_status(self, status: Str):
613
+ statuses: dict = {
614
+ 'open': 'open',
615
+ 'filled': 'closed',
616
+ 'cancelled': 'canceled',
617
+ }
618
+ return self.safe_string(statuses, status, status)
619
+
620
+ def parse_order(self, order: dict, market: Market = None) -> Order:
621
+ #
622
+ # {
623
+ # "order_id": "12345",
624
+ # "submit_time": "1392228122",
625
+ # "price": "8000000",
626
+ # "type": "sell",
627
+ # "order_ltc": "100000000",
628
+ # "remain_ltc": "100000000"
629
+ # }
630
+ #
631
+ # market closed orders - note that the price is very high
632
+ # and does not reflect actual price the order executed at
633
+ #
634
+ # {
635
+ # "order_id": "49326856",
636
+ # "type": "sell",
637
+ # "price": "1000000000",
638
+ # "submit_time": "1618314671",
639
+ # "finish_time": "1618314671",
640
+ # "status": "filled",
641
+ # "order_xrp": "30.45000000",
642
+ # "remain_xrp": "0.00000000"
643
+ # }
644
+ #
645
+ # cancelOrder
646
+ #
647
+ # {
648
+ # "order_id": 666883,
649
+ # "client_order_id": "clientx-sj82ks82j",
650
+ # "type": "sell",
651
+ # "pair": "btc_idr",
652
+ # "balance": {
653
+ # "idr": "33605800",
654
+ # "btc": "0.00000000",
655
+ # ...
656
+ # "frozen_idr": "0",
657
+ # "frozen_btc": "0.00000000",
658
+ # ...
659
+ # }
660
+ # }
661
+ #
662
+ side = None
663
+ if 'type' in order:
664
+ side = order['type']
665
+ status = self.parse_order_status(self.safe_string(order, 'status', 'open'))
666
+ symbol = None
667
+ cost = None
668
+ price = self.safe_string(order, 'price')
669
+ amount = None
670
+ remaining = None
671
+ marketId = self.safe_string(order, 'pair')
672
+ market = self.safe_market(marketId, market)
673
+ if market is not None:
674
+ symbol = market['symbol']
675
+ quoteId = market['quoteId']
676
+ baseId = market['baseId']
677
+ if (market['quoteId'] == 'idr') and ('order_rp' in order):
678
+ quoteId = 'rp'
679
+ if (market['baseId'] == 'idr') and ('remain_rp' in order):
680
+ baseId = 'rp'
681
+ cost = self.safe_string(order, 'order_' + quoteId)
682
+ if not cost:
683
+ amount = self.safe_string(order, 'order_' + baseId)
684
+ remaining = self.safe_string(order, 'remain_' + baseId)
685
+ timestamp = self.safe_integer(order, 'submit_time')
686
+ fee = None
687
+ id = self.safe_string(order, 'order_id')
688
+ return self.safe_order({
689
+ 'info': order,
690
+ 'id': id,
691
+ 'clientOrderId': self.safe_string(order, 'client_order_id'),
692
+ 'timestamp': timestamp,
693
+ 'datetime': self.iso8601(timestamp),
694
+ 'lastTradeTimestamp': None,
695
+ 'symbol': symbol,
696
+ 'type': 'limit',
697
+ 'timeInForce': None,
698
+ 'postOnly': None,
699
+ 'side': side,
700
+ 'price': price,
701
+ 'stopPrice': None,
702
+ 'triggerPrice': None,
703
+ 'cost': cost,
704
+ 'average': None,
705
+ 'amount': amount,
706
+ 'filled': None,
707
+ 'remaining': remaining,
708
+ 'status': status,
709
+ 'fee': fee,
710
+ 'trades': None,
711
+ })
712
+
713
+ async def fetch_order(self, id: str, symbol: Str = None, params={}):
714
+ """
715
+ fetches information on an order made by the user
716
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-order-endpoints
717
+ :param str symbol: unified symbol of the market the order was made in
718
+ :param dict [params]: extra parameters specific to the exchange API endpoint
719
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
720
+ """
721
+ if symbol is None:
722
+ raise ArgumentsRequired(self.id + ' fetchOrder() requires a symbol argument')
723
+ await self.load_markets()
724
+ market = self.market(symbol)
725
+ request: dict = {
726
+ 'pair': market['id'],
727
+ 'order_id': id,
728
+ }
729
+ response = await self.privatePostGetOrder(self.extend(request, params))
730
+ orders = response['return']
731
+ order = self.parse_order(self.extend({'id': id}, orders['order']), market)
732
+ order['info'] = response
733
+ return order
734
+
735
+ async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
736
+ """
737
+ fetch all unfilled currently open orders
738
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#open-orders-endpoints
739
+ :param str symbol: unified market symbol
740
+ :param int [since]: the earliest time in ms to fetch open orders for
741
+ :param int [limit]: the maximum number of open orders structures to retrieve
742
+ :param dict [params]: extra parameters specific to the exchange API endpoint
743
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
744
+ """
745
+ await self.load_markets()
746
+ market = None
747
+ request: dict = {}
748
+ if symbol is not None:
749
+ market = self.market(symbol)
750
+ request['pair'] = market['id']
751
+ response = await self.privatePostOpenOrders(self.extend(request, params))
752
+ rawOrders = response['return']['orders']
753
+ # {success: 1, return: {orders: null}} if no orders
754
+ if not rawOrders:
755
+ return []
756
+ # {success: 1, return: {orders: [... objects]}} for orders fetched by symbol
757
+ if symbol is not None:
758
+ return self.parse_orders(rawOrders, market, since, limit)
759
+ # {success: 1, return: {orders: {marketid: [... objects]}}} if all orders are fetched
760
+ marketIds = list(rawOrders.keys())
761
+ exchangeOrders = []
762
+ for i in range(0, len(marketIds)):
763
+ marketId = marketIds[i]
764
+ marketOrders = rawOrders[marketId]
765
+ market = self.safe_market(marketId)
766
+ parsedOrders = self.parse_orders(marketOrders, market, since, limit)
767
+ exchangeOrders = self.array_concat(exchangeOrders, parsedOrders)
768
+ return exchangeOrders
769
+
770
+ async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
771
+ """
772
+ fetches information on multiple closed orders made by the user
773
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#order-history
774
+ :param str symbol: unified market symbol of the market orders were made in
775
+ :param int [since]: the earliest time in ms to fetch orders for
776
+ :param int [limit]: the maximum number of order structures to retrieve
777
+ :param dict [params]: extra parameters specific to the exchange API endpoint
778
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
779
+ """
780
+ if symbol is None:
781
+ raise ArgumentsRequired(self.id + ' fetchClosedOrders() requires a symbol argument')
782
+ await self.load_markets()
783
+ market = self.market(symbol)
784
+ request: dict = {
785
+ 'pair': market['id'],
786
+ }
787
+ response = await self.privatePostOrderHistory(self.extend(request, params))
788
+ orders = self.parse_orders(response['return']['orders'], market)
789
+ orders = self.filter_by(orders, 'status', 'closed')
790
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit)
791
+
792
+ async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
793
+ """
794
+ create a trade order
795
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#trade-endpoints
796
+ :param str symbol: unified symbol of the market to create an order in
797
+ :param str type: 'market' or 'limit'
798
+ :param str side: 'buy' or 'sell'
799
+ :param float amount: how much of currency you want to trade in units of base currency
800
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
801
+ :param dict [params]: extra parameters specific to the exchange API endpoint
802
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
803
+ """
804
+ if type != 'limit':
805
+ raise ExchangeError(self.id + ' createOrder() allows limit orders only')
806
+ await self.load_markets()
807
+ market = self.market(symbol)
808
+ request: dict = {
809
+ 'pair': market['id'],
810
+ 'type': side,
811
+ 'price': price,
812
+ }
813
+ currency = market['baseId']
814
+ if side == 'buy':
815
+ request[market['quoteId']] = amount * price
816
+ else:
817
+ request[market['baseId']] = amount
818
+ request[currency] = amount
819
+ result = await self.privatePostTrade(self.extend(request, params))
820
+ data = self.safe_value(result, 'return', {})
821
+ id = self.safe_string(data, 'order_id')
822
+ return self.safe_order({
823
+ 'info': result,
824
+ 'id': id,
825
+ }, market)
826
+
827
+ async def cancel_order(self, id: str, symbol: Str = None, params={}):
828
+ """
829
+ cancels an open order
830
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#cancel-order-endpoints
831
+ :param str id: order id
832
+ :param str symbol: unified symbol of the market the order was made in
833
+ :param dict [params]: extra parameters specific to the exchange API endpoint
834
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
835
+ """
836
+ if symbol is None:
837
+ raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
838
+ side = self.safe_value(params, 'side')
839
+ if side is None:
840
+ raise ArgumentsRequired(self.id + ' cancelOrder() requires an extra "side" param')
841
+ await self.load_markets()
842
+ market = self.market(symbol)
843
+ request: dict = {
844
+ 'order_id': id,
845
+ 'pair': market['id'],
846
+ 'type': side,
847
+ }
848
+ response = await self.privatePostCancelOrder(self.extend(request, params))
849
+ #
850
+ # {
851
+ # "success": 1,
852
+ # "return": {
853
+ # "order_id": 666883,
854
+ # "client_order_id": "clientx-sj82ks82j",
855
+ # "type": "sell",
856
+ # "pair": "btc_idr",
857
+ # "balance": {
858
+ # "idr": "33605800",
859
+ # "btc": "0.00000000",
860
+ # ...
861
+ # "frozen_idr": "0",
862
+ # "frozen_btc": "0.00000000",
863
+ # ...
864
+ # }
865
+ # }
866
+ # }
867
+ #
868
+ data = self.safe_dict(response, 'return')
869
+ return self.parse_order(data)
870
+
871
+ async def fetch_transaction_fee(self, code: str, params={}):
872
+ """
873
+ fetch the fee for a transaction
874
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-fee-endpoints
875
+ :param str code: unified currency code
876
+ :param dict [params]: extra parameters specific to the exchange API endpoint
877
+ :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
878
+ """
879
+ await self.load_markets()
880
+ currency = self.currency(code)
881
+ request: dict = {
882
+ 'currency': currency['id'],
883
+ }
884
+ response = await self.privatePostWithdrawFee(self.extend(request, params))
885
+ #
886
+ # {
887
+ # "success": 1,
888
+ # "return": {
889
+ # "server_time": 1607923272,
890
+ # "withdraw_fee": 0.005,
891
+ # "currency": "eth"
892
+ # }
893
+ # }
894
+ #
895
+ data = self.safe_value(response, 'return', {})
896
+ currencyId = self.safe_string(data, 'currency')
897
+ return {
898
+ 'info': response,
899
+ 'rate': self.safe_number(data, 'withdraw_fee'),
900
+ 'currency': self.safe_currency_code(currencyId, currency),
901
+ }
902
+
903
+ async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
904
+ """
905
+ fetch history of deposits and withdrawals
906
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#transaction-history-endpoints
907
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
908
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
909
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
910
+ :param dict [params]: extra parameters specific to the exchange API endpoint
911
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
912
+ """
913
+ await self.load_markets()
914
+ request: dict = {}
915
+ if since is not None:
916
+ startTime = self.iso8601(since)[0:10]
917
+ request['start'] = startTime
918
+ request['end'] = self.iso8601(self.milliseconds())[0:10]
919
+ response = await self.privatePostTransHistory(self.extend(request, params))
920
+ #
921
+ # {
922
+ # "success": 1,
923
+ # "return": {
924
+ # "withdraw": {
925
+ # "idr": [
926
+ # {
927
+ # "status": "success",
928
+ # "type": "coupon",
929
+ # "rp": "115205",
930
+ # "fee": "500",
931
+ # "amount": "114705",
932
+ # "submit_time": "1539844166",
933
+ # "success_time": "1539844189",
934
+ # "withdraw_id": "1783717",
935
+ # "tx": "BTC-IDR-RDTVVO2P-ETD0EVAW-VTNZGMIR-HTNTUAPI-84ULM9OI",
936
+ # "sender": "boris",
937
+ # "used_by": "viginia88"
938
+ # },
939
+ # ...
940
+ # ],
941
+ # "btc": [],
942
+ # "abyss": [],
943
+ # ...
944
+ # },
945
+ # "deposit": {
946
+ # "idr": [
947
+ # {
948
+ # "status": "success",
949
+ # "type": "duitku",
950
+ # "rp": "393000",
951
+ # "fee": "5895",
952
+ # "amount": "387105",
953
+ # "submit_time": "1576555012",
954
+ # "success_time": "1576555012",
955
+ # "deposit_id": "3395438",
956
+ # "tx": "Duitku OVO Settlement"
957
+ # },
958
+ # ...
959
+ # ],
960
+ # "btc": [
961
+ # {
962
+ # "status": "success",
963
+ # "btc": "0.00118769",
964
+ # "amount": "0.00118769",
965
+ # "success_time": "1539529208",
966
+ # "deposit_id": "3602369",
967
+ # "tx": "c816aeb35a5b42f389970325a32aff69bb6b2126784dcda8f23b9dd9570d6573"
968
+ # },
969
+ # ...
970
+ # ],
971
+ # "abyss": [],
972
+ # ...
973
+ # }
974
+ # }
975
+ # }
976
+ #
977
+ data = self.safe_value(response, 'return', {})
978
+ withdraw = self.safe_value(data, 'withdraw', {})
979
+ deposit = self.safe_value(data, 'deposit', {})
980
+ transactions = []
981
+ currency = None
982
+ if code is None:
983
+ keys = list(withdraw.keys())
984
+ for i in range(0, len(keys)):
985
+ key = keys[i]
986
+ transactions = self.array_concat(transactions, withdraw[key])
987
+ keys = list(deposit.keys())
988
+ for i in range(0, len(keys)):
989
+ key = keys[i]
990
+ transactions = self.array_concat(transactions, deposit[key])
991
+ else:
992
+ currency = self.currency(code)
993
+ withdraws = self.safe_value(withdraw, currency['id'], [])
994
+ deposits = self.safe_value(deposit, currency['id'], [])
995
+ transactions = self.array_concat(withdraws, deposits)
996
+ return self.parse_transactions(transactions, currency, since, limit)
997
+
998
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
999
+ """
1000
+ make a withdrawal
1001
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-coin-endpoints
1002
+ :param str code: unified currency code
1003
+ :param float amount: the amount to withdraw
1004
+ :param str address: the address to withdraw to
1005
+ :param str tag:
1006
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1007
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1008
+ """
1009
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1010
+ self.check_address(address)
1011
+ await self.load_markets()
1012
+ currency = self.currency(code)
1013
+ # Custom string you need to provide to identify each withdrawal.
1014
+ # Will be passed to callback URL(assigned via website to the API key)
1015
+ # so your system can identify the request and confirm it.
1016
+ # Alphanumeric, max length 255.
1017
+ requestId = self.milliseconds()
1018
+ # Alternatively:
1019
+ # requestId = self.uuid()
1020
+ request: dict = {
1021
+ 'currency': currency['id'],
1022
+ 'withdraw_amount': amount,
1023
+ 'withdraw_address': address,
1024
+ 'request_id': str(requestId),
1025
+ }
1026
+ if tag:
1027
+ request['withdraw_memo'] = tag
1028
+ response = await self.privatePostWithdrawCoin(self.extend(request, params))
1029
+ #
1030
+ # {
1031
+ # "success": 1,
1032
+ # "status": "approved",
1033
+ # "withdraw_currency": "xrp",
1034
+ # "withdraw_address": "rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
1035
+ # "withdraw_amount": "10000.00000000",
1036
+ # "fee": "2.00000000",
1037
+ # "amount_after_fee": "9998.00000000",
1038
+ # "submit_time": "1509469200",
1039
+ # "withdraw_id": "xrp-12345",
1040
+ # "txid": "",
1041
+ # "withdraw_memo": "123123"
1042
+ # }
1043
+ #
1044
+ return self.parse_transaction(response, currency)
1045
+
1046
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1047
+ #
1048
+ # withdraw
1049
+ #
1050
+ # {
1051
+ # "success": 1,
1052
+ # "status": "approved",
1053
+ # "withdraw_currency": "xrp",
1054
+ # "withdraw_address": "rwWr7KUZ3ZFwzgaDGjKBysADByzxvohQ3C",
1055
+ # "withdraw_amount": "10000.00000000",
1056
+ # "fee": "2.00000000",
1057
+ # "amount_after_fee": "9998.00000000",
1058
+ # "submit_time": "1509469200",
1059
+ # "withdraw_id": "xrp-12345",
1060
+ # "txid": "",
1061
+ # "withdraw_memo": "123123"
1062
+ # }
1063
+ #
1064
+ # transHistory
1065
+ #
1066
+ # {
1067
+ # "status": "success",
1068
+ # "type": "coupon",
1069
+ # "rp": "115205",
1070
+ # "fee": "500",
1071
+ # "amount": "114705",
1072
+ # "submit_time": "1539844166",
1073
+ # "success_time": "1539844189",
1074
+ # "withdraw_id": "1783717",
1075
+ # "tx": "BTC-IDR-RDTVVO2P-ETD0EVAW-VTNZGMIR-HTNTUAPI-84ULM9OI",
1076
+ # "sender": "boris",
1077
+ # "used_by": "viginia88"
1078
+ # }
1079
+ #
1080
+ # {
1081
+ # "status": "success",
1082
+ # "btc": "0.00118769",
1083
+ # "amount": "0.00118769",
1084
+ # "success_time": "1539529208",
1085
+ # "deposit_id": "3602369",
1086
+ # "tx": "c816aeb35a5b42f389970325a32aff69bb6b2126784dcda8f23b9dd9570d6573"
1087
+ # },
1088
+ status = self.safe_string(transaction, 'status')
1089
+ timestamp = self.safe_timestamp_2(transaction, 'success_time', 'submit_time')
1090
+ depositId = self.safe_string(transaction, 'deposit_id')
1091
+ feeCost = self.safe_number(transaction, 'fee')
1092
+ fee = None
1093
+ if feeCost is not None:
1094
+ fee = {
1095
+ 'currency': self.safe_currency_code(None, currency),
1096
+ 'cost': feeCost,
1097
+ 'rate': None,
1098
+ }
1099
+ return {
1100
+ 'id': self.safe_string_2(transaction, 'withdraw_id', 'deposit_id'),
1101
+ 'txid': self.safe_string_2(transaction, 'txid', 'tx'),
1102
+ 'timestamp': timestamp,
1103
+ 'datetime': self.iso8601(timestamp),
1104
+ 'network': None,
1105
+ 'addressFrom': None,
1106
+ 'address': self.safe_string(transaction, 'withdraw_address'),
1107
+ 'addressTo': None,
1108
+ 'amount': self.safe_number_n(transaction, ['amount', 'withdraw_amount', 'deposit_amount']),
1109
+ 'type': 'withdraw' if (depositId is None) else 'deposit',
1110
+ 'currency': self.safe_currency_code(None, currency),
1111
+ 'status': self.parse_transaction_status(status),
1112
+ 'updated': None,
1113
+ 'tagFrom': None,
1114
+ 'tag': None,
1115
+ 'tagTo': None,
1116
+ 'comment': self.safe_string(transaction, 'withdraw_memo'),
1117
+ 'internal': None,
1118
+ 'fee': fee,
1119
+ 'info': transaction,
1120
+ }
1121
+
1122
+ def parse_transaction_status(self, status: Str):
1123
+ statuses: dict = {
1124
+ 'success': 'ok',
1125
+ }
1126
+ return self.safe_string(statuses, status, status)
1127
+
1128
+ async def fetch_deposit_addresses(self, codes: Strings = None, params={}):
1129
+ """
1130
+ fetch deposit addresses for multiple currencies and chain types
1131
+ :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#general-information-on-endpoints
1132
+ :param str[] [codes]: list of unified currency codes, default is None
1133
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1134
+ :returns dict: a list of `address structures <https://docs.ccxt.com/#/?id=address-structure>`
1135
+ """
1136
+ await self.load_markets()
1137
+ response = await self.privatePostGetInfo(params)
1138
+ #
1139
+ # {
1140
+ # success: '1',
1141
+ # return: {
1142
+ # server_time: '1708031570',
1143
+ # balance: {
1144
+ # idr: '29952',
1145
+ # ...
1146
+ # },
1147
+ # balance_hold: {
1148
+ # idr: '0',
1149
+ # ...
1150
+ # },
1151
+ # address: {
1152
+ # btc: '1KMntgzvU7iTSgMBWc11nVuJjAyfW3qJyk',
1153
+ # ...
1154
+ # },
1155
+ # memo_is_required: {
1156
+ # btc: {mainnet: False},
1157
+ # ...
1158
+ # },
1159
+ # network: {
1160
+ # btc: 'mainnet',
1161
+ # ...
1162
+ # },
1163
+ # user_id: '276011',
1164
+ # name: '',
1165
+ # email: 'testbitcoincoid@mailforspam.com',
1166
+ # profile_picture: null,
1167
+ # verification_status: 'unverified',
1168
+ # gauth_enable: True,
1169
+ # withdraw_status: '0'
1170
+ # }
1171
+ # }
1172
+ #
1173
+ data = self.safe_dict(response, 'return')
1174
+ addresses = self.safe_dict(data, 'address', {})
1175
+ networks = self.safe_dict(data, 'network', {})
1176
+ addressKeys = list(addresses.keys())
1177
+ result: dict = {
1178
+ 'info': data,
1179
+ }
1180
+ for i in range(0, len(addressKeys)):
1181
+ marketId = addressKeys[i]
1182
+ code = self.safe_currency_code(marketId)
1183
+ address = self.safe_string(addresses, marketId)
1184
+ if (address is not None) and ((codes is None) or (self.in_array(code, codes))):
1185
+ self.check_address(address)
1186
+ network = None
1187
+ if marketId in networks:
1188
+ networkId = self.safe_string(networks, marketId)
1189
+ if networkId.find(',') >= 0:
1190
+ network = []
1191
+ networkIds = networkId.split(',')
1192
+ for j in range(0, len(networkIds)):
1193
+ network.append(self.network_id_to_code(networkIds[j]).upper())
1194
+ else:
1195
+ network = self.network_id_to_code(networkId).upper()
1196
+ result[code] = {
1197
+ 'info': {},
1198
+ 'currency': code,
1199
+ 'address': address,
1200
+ 'network': network,
1201
+ 'tag': None,
1202
+ }
1203
+ return result
1204
+
1205
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1206
+ url = self.urls['api'][api]
1207
+ if api == 'public':
1208
+ query = self.omit(params, self.extract_params(path))
1209
+ requestPath = '/' + self.implode_params(path, params)
1210
+ url = url + requestPath
1211
+ if query:
1212
+ url += '?' + self.urlencode_with_array_repeat(query)
1213
+ else:
1214
+ self.check_required_credentials()
1215
+ body = self.urlencode(self.extend({
1216
+ 'method': path,
1217
+ 'timestamp': self.nonce(),
1218
+ 'recvWindow': self.options['recvWindow'],
1219
+ }, params))
1220
+ headers = {
1221
+ 'Content-Type': 'application/x-www-form-urlencoded',
1222
+ 'Key': self.apiKey,
1223
+ 'Sign': self.hmac(self.encode(body), self.encode(self.secret), hashlib.sha512),
1224
+ }
1225
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1226
+
1227
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1228
+ if response is None:
1229
+ return None
1230
+ # {success: 0, error: "invalid order."}
1231
+ # or
1232
+ # [{data, ...}, {...}, ...]
1233
+ if isinstance(response, list):
1234
+ return None # public endpoints may return []-arrays
1235
+ error = self.safe_value(response, 'error', '')
1236
+ if not ('success' in response) and error == '':
1237
+ return None # no 'success' property on public responses
1238
+ if self.safe_integer(response, 'success', 0) == 1:
1239
+ # {success: 1, return: {orders: []}}
1240
+ if not ('return' in response):
1241
+ raise ExchangeError(self.id + ': malformed response: ' + self.json(response))
1242
+ else:
1243
+ return None
1244
+ feedback = self.id + ' ' + body
1245
+ self.throw_exactly_matched_exception(self.exceptions['exact'], error, feedback)
1246
+ self.throw_broadly_matched_exception(self.exceptions['broad'], error, feedback)
1247
+ raise ExchangeError(feedback) # unknown message