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,1630 @@
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.bitopro import ImplicitAPI
8
+ import hashlib
9
+ import math
10
+ from ccxt.base.types import Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, 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 BadRequest
16
+ from ccxt.base.errors import InsufficientFunds
17
+ from ccxt.base.errors import InvalidOrder
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+ from ccxt.base.precise import Precise
20
+
21
+
22
+ class bitopro(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(bitopro, self).describe(), {
26
+ 'id': 'bitopro',
27
+ 'name': 'BitoPro',
28
+ 'countries': ['TW'], # Taiwan
29
+ 'version': 'v3',
30
+ 'rateLimit': 100,
31
+ 'pro': True,
32
+ 'has': {
33
+ 'CORS': None,
34
+ 'spot': True,
35
+ 'margin': False,
36
+ 'swap': False,
37
+ 'future': False,
38
+ 'option': False,
39
+ 'cancelAllOrders': True,
40
+ 'cancelOrder': True,
41
+ 'cancelOrders': True,
42
+ 'closeAllPositions': False,
43
+ 'closePosition': False,
44
+ 'createOrder': True,
45
+ 'editOrder': False,
46
+ 'fetchBalance': True,
47
+ 'fetchBorrowRateHistories': False,
48
+ 'fetchBorrowRateHistory': False,
49
+ 'fetchClosedOrders': True,
50
+ 'fetchCrossBorrowRate': False,
51
+ 'fetchCrossBorrowRates': False,
52
+ 'fetchCurrencies': True,
53
+ 'fetchDepositAddress': False,
54
+ 'fetchDeposits': True,
55
+ 'fetchDepositsWithdrawals': False,
56
+ 'fetchDepositWithdrawFee': 'emulated',
57
+ 'fetchDepositWithdrawFees': True,
58
+ 'fetchFundingHistory': False,
59
+ 'fetchFundingRate': False,
60
+ 'fetchFundingRateHistory': False,
61
+ 'fetchFundingRates': False,
62
+ 'fetchIndexOHLCV': False,
63
+ 'fetchIsolatedBorrowRate': False,
64
+ 'fetchIsolatedBorrowRates': False,
65
+ 'fetchMarginMode': False,
66
+ 'fetchMarkets': True,
67
+ 'fetchMarkOHLCV': False,
68
+ 'fetchMyTrades': True,
69
+ 'fetchOHLCV': True,
70
+ 'fetchOpenInterestHistory': False,
71
+ 'fetchOpenOrders': True,
72
+ 'fetchOrder': True,
73
+ 'fetchOrderBook': True,
74
+ 'fetchOrders': False,
75
+ 'fetchOrderTrades': False,
76
+ 'fetchPosition': False,
77
+ 'fetchPositionHistory': False,
78
+ 'fetchPositionMode': False,
79
+ 'fetchPositions': False,
80
+ 'fetchPositionsForSymbol': False,
81
+ 'fetchPositionsHistory': False,
82
+ 'fetchPositionsRisk': False,
83
+ 'fetchPremiumIndexOHLCV': False,
84
+ 'fetchTicker': True,
85
+ 'fetchTickers': True,
86
+ 'fetchTime': False,
87
+ 'fetchTrades': True,
88
+ 'fetchTradingFee': False,
89
+ 'fetchTradingFees': True,
90
+ 'fetchTransactionFees': False,
91
+ 'fetchTransactions': False,
92
+ 'fetchTransfer': False,
93
+ 'fetchTransfers': False,
94
+ 'fetchWithdrawal': True,
95
+ 'fetchWithdrawals': True,
96
+ 'setLeverage': False,
97
+ 'setMarginMode': False,
98
+ 'transfer': False,
99
+ 'withdraw': True,
100
+ },
101
+ 'timeframes': {
102
+ '1m': '1m',
103
+ '5m': '5m',
104
+ '15m': '15m',
105
+ '30m': '30m',
106
+ '1h': '1h',
107
+ '3h': '3h',
108
+ '6h': '6h',
109
+ '12h': '12h',
110
+ '1d': '1d',
111
+ '1w': '1w',
112
+ '1M': '1M',
113
+ },
114
+ 'urls': {
115
+ 'logo': 'https://user-images.githubusercontent.com/1294454/158227251-3a92a220-9222-453c-9277-977c6677fe71.jpg',
116
+ 'api': {
117
+ 'rest': 'https://api.bitopro.com/v3',
118
+ },
119
+ 'www': 'https://www.bitopro.com',
120
+ 'doc': [
121
+ 'https://github.com/bitoex/bitopro-offical-api-docs/blob/master/v3-1/rest-1/rest.md',
122
+ ],
123
+ 'fees': 'https://www.bitopro.com/fees',
124
+ },
125
+ 'requiredCredentials': {
126
+ 'apiKey': True,
127
+ 'secret': True,
128
+ },
129
+ 'api': {
130
+ 'public': {
131
+ 'get': {
132
+ 'order-book/{pair}': 1,
133
+ 'tickers': 1,
134
+ 'tickers/{pair}': 1,
135
+ 'trades/{pair}': 1,
136
+ 'provisioning/currencies': 1,
137
+ 'provisioning/trading-pairs': 1,
138
+ 'provisioning/limitations-and-fees': 1,
139
+ 'trading-history/{pair}': 1,
140
+ 'price/otc/{currency}': 1,
141
+ },
142
+ },
143
+ 'private': {
144
+ 'get': {
145
+ 'accounts/balance': 1,
146
+ 'orders/history': 1,
147
+ 'orders/all/{pair}': 1,
148
+ 'orders/trades/{pair}': 1,
149
+ 'orders/{pair}/{orderId}': 1,
150
+ 'wallet/withdraw/{currency}/{serial}': 1,
151
+ 'wallet/withdraw/{currency}/id/{id}': 1,
152
+ 'wallet/depositHistory/{currency}': 1,
153
+ 'wallet/withdrawHistory/{currency}': 1,
154
+ },
155
+ 'post': {
156
+ 'orders/{pair}': 1 / 2, # 1200/m => 20/s => 10/20 = 1/2
157
+ 'orders/batch': 20 / 3, # 90/m => 1.5/s => 10/1.5 = 20/3
158
+ 'wallet/withdraw/{currency}': 10, # 60/m => 1/s => 10/1 = 10
159
+ },
160
+ 'put': {
161
+ 'orders': 5, # 2/s => 10/2 = 5
162
+ },
163
+ 'delete': {
164
+ 'orders/{pair}/{id}': 2 / 3, # 900/m => 15/s => 10/15 = 2/3
165
+ 'orders/all': 5, # 2/s => 10/2 = 5
166
+ 'orders/{pair}': 5, # 2/s => 10/2 = 5
167
+ },
168
+ },
169
+ },
170
+ 'fees': {
171
+ 'trading': {
172
+ 'tierBased': True,
173
+ 'percentage': True,
174
+ 'maker': self.parse_number('0.001'),
175
+ 'taker': self.parse_number('0.002'),
176
+ 'tiers': {
177
+ 'taker': [
178
+ [self.parse_number('0'), self.parse_number('0.002')],
179
+ [self.parse_number('3000000'), self.parse_number('0.00194')],
180
+ [self.parse_number('5000000'), self.parse_number('0.0015')],
181
+ [self.parse_number('30000000'), self.parse_number('0.0014')],
182
+ [self.parse_number('300000000'), self.parse_number('0.0013')],
183
+ [self.parse_number('550000000'), self.parse_number('0.0012')],
184
+ [self.parse_number('1300000000'), self.parse_number('0.0011')],
185
+ ],
186
+ 'maker': [
187
+ [self.parse_number('0'), self.parse_number('0.001')],
188
+ [self.parse_number('3000000'), self.parse_number('0.00097')],
189
+ [self.parse_number('5000000'), self.parse_number('0.0007')],
190
+ [self.parse_number('30000000'), self.parse_number('0.0006')],
191
+ [self.parse_number('300000000'), self.parse_number('0.0005')],
192
+ [self.parse_number('550000000'), self.parse_number('0.0004')],
193
+ [self.parse_number('1300000000'), self.parse_number('0.0003')],
194
+ ],
195
+ },
196
+ },
197
+ },
198
+ 'options': {
199
+ 'networks': {
200
+ 'ERC20': 'ERC20',
201
+ 'ETH': 'ERC20',
202
+ 'TRX': 'TRX',
203
+ 'TRC20': 'TRX',
204
+ 'BEP20': 'BSC',
205
+ 'BSC': 'BSC',
206
+ },
207
+ },
208
+ 'precisionMode': TICK_SIZE,
209
+ 'exceptions': {
210
+ 'exact': {
211
+ 'Unsupported currency.': BadRequest, # {"error":"Unsupported currency."}
212
+ 'Unsupported order type': BadRequest, # {"error":"Unsupported order type"}
213
+ 'Invalid body': BadRequest, # {"error":"Invalid body"}
214
+ 'Invalid Signature': AuthenticationError, # {"error":"Invalid Signature"}
215
+ 'Address not in whitelist.': BadRequest,
216
+ },
217
+ 'broad': {
218
+ 'Invalid amount': InvalidOrder, # {"error":"Invalid amount 0.0000000001, decimal limit is 8."}
219
+ 'Balance for ': InsufficientFunds, # {"error":"Balance for eth not enough, only has 0, but ordered 0.01."}
220
+ 'Invalid ': BadRequest, # {"error":"Invalid price -1."}
221
+ 'Wrong parameter': BadRequest, # {"error":"Wrong parameter: from"}
222
+ },
223
+ },
224
+ 'commonCurrencies': {
225
+ },
226
+ })
227
+
228
+ async def fetch_currencies(self, params={}) -> Currencies:
229
+ """
230
+ fetches all available currencies on an exchange
231
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_currency_info.md
232
+ :param dict [params]: extra parameters specific to the exchange API endpoint
233
+ :returns dict: an associative dictionary of currencies
234
+ """
235
+ response = await self.publicGetProvisioningCurrencies(params)
236
+ currencies = self.safe_value(response, 'data', [])
237
+ #
238
+ # {
239
+ # "data":[
240
+ # {
241
+ # "currency":"eth",
242
+ # "withdrawFee":"0.007",
243
+ # "minWithdraw":"0.001",
244
+ # "maxWithdraw":"1000",
245
+ # "maxDailyWithdraw":"2000",
246
+ # "withdraw":true,
247
+ # "deposit":true,
248
+ # "depositConfirmation":"12"
249
+ # }
250
+ # ]
251
+ # }
252
+ #
253
+ result: dict = {}
254
+ for i in range(0, len(currencies)):
255
+ currency = currencies[i]
256
+ currencyId = self.safe_string(currency, 'currency')
257
+ code = self.safe_currency_code(currencyId)
258
+ deposit = self.safe_value(currency, 'deposit')
259
+ withdraw = self.safe_value(currency, 'withdraw')
260
+ fee = self.safe_number(currency, 'withdrawFee')
261
+ withdrawMin = self.safe_number(currency, 'minWithdraw')
262
+ withdrawMax = self.safe_number(currency, 'maxWithdraw')
263
+ limits: dict = {
264
+ 'withdraw': {
265
+ 'min': withdrawMin,
266
+ 'max': withdrawMax,
267
+ },
268
+ 'amount': {
269
+ 'min': None,
270
+ 'max': None,
271
+ },
272
+ }
273
+ result[code] = {
274
+ 'id': currencyId,
275
+ 'code': code,
276
+ 'info': currency,
277
+ 'type': None,
278
+ 'name': None,
279
+ 'active': deposit and withdraw,
280
+ 'deposit': deposit,
281
+ 'withdraw': withdraw,
282
+ 'fee': fee,
283
+ 'precision': None,
284
+ 'limits': limits,
285
+ }
286
+ return result
287
+
288
+ async def fetch_markets(self, params={}) -> List[Market]:
289
+ """
290
+ retrieves data on all markets for bitopro
291
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_trading_pair_info.md
292
+ :param dict [params]: extra parameters specific to the exchange API endpoint
293
+ :returns dict[]: an array of objects representing market data
294
+ """
295
+ response = await self.publicGetProvisioningTradingPairs()
296
+ markets = self.safe_value(response, 'data', [])
297
+ #
298
+ # {
299
+ # "data":[
300
+ # {
301
+ # "pair":"shib_twd",
302
+ # "base":"shib",
303
+ # "quote":"twd",
304
+ # "basePrecision":"8",
305
+ # "quotePrecision":"6",
306
+ # "minLimitBaseAmount":"100000",
307
+ # "maxLimitBaseAmount":"5500000000",
308
+ # "minMarketBuyQuoteAmount":"1000",
309
+ # "orderOpenLimit":"200",
310
+ # "maintain":false,
311
+ # "orderBookQuotePrecision":"6",
312
+ # "orderBookQuoteScaleLevel":"5"
313
+ # }
314
+ # ]
315
+ # }
316
+ #
317
+ return self.parse_markets(markets)
318
+
319
+ def parse_market(self, market: dict) -> Market:
320
+ active = not self.safe_value(market, 'maintain')
321
+ id = self.safe_string(market, 'pair')
322
+ uppercaseId = id.upper()
323
+ baseId = self.safe_string(market, 'base')
324
+ quoteId = self.safe_string(market, 'quote')
325
+ base = self.safe_currency_code(baseId)
326
+ quote = self.safe_currency_code(quoteId)
327
+ symbol = base + '/' + quote
328
+ limits: dict = {
329
+ 'amount': {
330
+ 'min': self.safe_number(market, 'minLimitBaseAmount'),
331
+ 'max': self.safe_number(market, 'maxLimitBaseAmount'),
332
+ },
333
+ 'price': {
334
+ 'min': None,
335
+ 'max': None,
336
+ },
337
+ 'cost': {
338
+ 'min': None,
339
+ 'max': None,
340
+ },
341
+ 'leverage': {
342
+ 'min': None,
343
+ 'max': None,
344
+ },
345
+ }
346
+ return {
347
+ 'id': id,
348
+ 'uppercaseId': uppercaseId,
349
+ 'symbol': symbol,
350
+ 'base': base,
351
+ 'quote': quote,
352
+ 'baseId': base,
353
+ 'quoteId': quote,
354
+ 'settle': None,
355
+ 'settleId': None,
356
+ 'type': 'spot',
357
+ 'spot': True,
358
+ 'margin': False,
359
+ 'swap': False,
360
+ 'future': False,
361
+ 'option': False,
362
+ 'contract': False,
363
+ 'linear': None,
364
+ 'inverse': None,
365
+ 'contractSize': None,
366
+ 'expiry': None,
367
+ 'expiryDatetime': None,
368
+ 'strike': None,
369
+ 'optionType': None,
370
+ 'limits': limits,
371
+ 'precision': {
372
+ 'price': self.parse_number(self.parse_precision(self.safe_string(market, 'quotePrecision'))),
373
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(market, 'basePrecision'))),
374
+ },
375
+ 'active': active,
376
+ 'created': None,
377
+ 'info': market,
378
+ }
379
+
380
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
381
+ #
382
+ # {
383
+ # "pair":"btc_twd",
384
+ # "lastPrice":"1182449.00000000",
385
+ # "isBuyer":false,
386
+ # "priceChange24hr":"-1.99",
387
+ # "volume24hr":"9.13089740",
388
+ # "high24hr":"1226097.00000000",
389
+ # "low24hr":"1181000.00000000"
390
+ # }
391
+ #
392
+ marketId = self.safe_string(ticker, 'pair')
393
+ market = self.safe_market(marketId, market)
394
+ symbol = self.safe_string(market, 'symbol')
395
+ return self.safe_ticker({
396
+ 'symbol': symbol,
397
+ 'timestamp': None,
398
+ 'datetime': None,
399
+ 'high': self.safe_string(ticker, 'high24hr'),
400
+ 'low': self.safe_string(ticker, 'low24hr'),
401
+ 'bid': None,
402
+ 'bidVolume': None,
403
+ 'ask': None,
404
+ 'askVolume': None,
405
+ 'vwap': None,
406
+ 'open': None,
407
+ 'close': self.safe_string(ticker, 'lastPrice'),
408
+ 'last': self.safe_string(ticker, 'lastPrice'),
409
+ 'previousClose': None,
410
+ 'change': None,
411
+ 'percentage': self.safe_string(ticker, 'priceChange24hr'),
412
+ 'average': None,
413
+ 'baseVolume': self.safe_string(ticker, 'volume24hr'),
414
+ 'quoteVolume': None,
415
+ 'info': ticker,
416
+ }, market)
417
+
418
+ async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
419
+ """
420
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
421
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_ticker_data.md
422
+ :param str symbol: unified symbol of the market to fetch the ticker for
423
+ :param dict [params]: extra parameters specific to the exchange API endpoint
424
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
425
+ """
426
+ await self.load_markets()
427
+ market = self.market(symbol)
428
+ request: dict = {
429
+ 'pair': market['id'],
430
+ }
431
+ response = await self.publicGetTickersPair(self.extend(request, params))
432
+ ticker = self.safe_value(response, 'data', {})
433
+ #
434
+ # {
435
+ # "data":{
436
+ # "pair":"btc_twd",
437
+ # "lastPrice":"1182449.00000000",
438
+ # "isBuyer":false,
439
+ # "priceChange24hr":"-1.99",
440
+ # "volume24hr":"9.13089740",
441
+ # "high24hr":"1226097.00000000",
442
+ # "low24hr":"1181000.00000000"
443
+ # }
444
+ # }
445
+ #
446
+ return self.parse_ticker(ticker, market)
447
+
448
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
449
+ """
450
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
451
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_ticker_data.md
452
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
453
+ :param dict [params]: extra parameters specific to the exchange API endpoint
454
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
455
+ """
456
+ await self.load_markets()
457
+ response = await self.publicGetTickers()
458
+ tickers = self.safe_value(response, 'data', [])
459
+ #
460
+ # {
461
+ # "data":[
462
+ # {
463
+ # "pair":"xrp_twd",
464
+ # "lastPrice":"21.26110000",
465
+ # "isBuyer":false,
466
+ # "priceChange24hr":"-6.53",
467
+ # "volume24hr":"102846.47084802",
468
+ # "high24hr":"23.24460000",
469
+ # "low24hr":"21.13730000"
470
+ # }
471
+ # ]
472
+ # }
473
+ #
474
+ return self.parse_tickers(tickers, symbols)
475
+
476
+ async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
477
+ """
478
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
479
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_orderbook_data.md
480
+ :param str symbol: unified symbol of the market to fetch the order book for
481
+ :param int [limit]: the maximum amount of order book entries to return
482
+ :param dict [params]: extra parameters specific to the exchange API endpoint
483
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
484
+ """
485
+ await self.load_markets()
486
+ market = self.market(symbol)
487
+ request: dict = {
488
+ 'pair': market['id'],
489
+ }
490
+ if limit is not None:
491
+ request['limit'] = limit
492
+ response = await self.publicGetOrderBookPair(self.extend(request, params))
493
+ #
494
+ # {
495
+ # "bids":[
496
+ # {
497
+ # "price":"1175271",
498
+ # "amount":"0.00022804",
499
+ # "count":1,
500
+ # "total":"0.00022804"
501
+ # }
502
+ # ],
503
+ # "asks":[
504
+ # {
505
+ # "price":"1176906",
506
+ # "amount":"0.0496",
507
+ # "count":1,
508
+ # "total":"0.0496"
509
+ # }
510
+ # ]
511
+ # }
512
+ #
513
+ return self.parse_order_book(response, market['symbol'], None, 'bids', 'asks', 'price', 'amount')
514
+
515
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
516
+ #
517
+ # fetchTrades
518
+ # {
519
+ # "timestamp":1644651458,
520
+ # "price":"1180785.00000000",
521
+ # "amount":"0.00020000",
522
+ # "isBuyer":false
523
+ # }
524
+ #
525
+ # fetchMyTrades
526
+ # {
527
+ # "tradeId":"5685030251",
528
+ # "orderId":"9669168142",
529
+ # "price":"11821.8",
530
+ # "action":"SELL",
531
+ # "baseAmount":"0.01",
532
+ # "quoteAmount":"118.218",
533
+ # "fee":"0.236436",
534
+ # "feeSymbol":"BNB",
535
+ # "isTaker":true,
536
+ # "timestamp":1644905714862,
537
+ # "createdTimestamp":1644905714862
538
+ # }
539
+ #
540
+ id = self.safe_string(trade, 'tradeId')
541
+ orderId = self.safe_string(trade, 'orderId')
542
+ timestamp = None
543
+ if id is None:
544
+ timestamp = self.safe_timestamp(trade, 'timestamp')
545
+ else:
546
+ timestamp = self.safe_integer(trade, 'timestamp')
547
+ marketId = self.safe_string(trade, 'pair')
548
+ market = self.safe_market(marketId, market)
549
+ symbol = self.safe_string(market, 'symbol')
550
+ price = self.safe_string(trade, 'price')
551
+ type = self.safe_string_lower(trade, 'type')
552
+ side = self.safe_string_lower(trade, 'action')
553
+ if side is None:
554
+ isBuyer = self.safe_value(trade, 'isBuyer')
555
+ if isBuyer:
556
+ side = 'buy'
557
+ else:
558
+ side = 'sell'
559
+ amount = self.safe_string(trade, 'amount')
560
+ if amount is None:
561
+ amount = self.safe_string(trade, 'baseAmount')
562
+ fee = None
563
+ feeAmount = self.safe_string(trade, 'fee')
564
+ feeSymbol = self.safe_currency_code(self.safe_string(trade, 'feeSymbol'))
565
+ if feeAmount is not None:
566
+ fee = {
567
+ 'cost': feeAmount,
568
+ 'currency': feeSymbol,
569
+ 'rate': None,
570
+ }
571
+ isTaker = self.safe_value(trade, 'isTaker')
572
+ takerOrMaker = None
573
+ if isTaker is not None:
574
+ if isTaker:
575
+ takerOrMaker = 'taker'
576
+ else:
577
+ takerOrMaker = 'maker'
578
+ return self.safe_trade({
579
+ 'id': id,
580
+ 'info': trade,
581
+ 'order': orderId,
582
+ 'timestamp': timestamp,
583
+ 'datetime': self.iso8601(timestamp),
584
+ 'symbol': symbol,
585
+ 'takerOrMaker': takerOrMaker,
586
+ 'type': type,
587
+ 'side': side,
588
+ 'price': price,
589
+ 'amount': amount,
590
+ 'cost': None,
591
+ 'fee': fee,
592
+ }, market)
593
+
594
+ async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
595
+ """
596
+ get the list of most recent trades for a particular symbol
597
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_trades_data.md
598
+ :param str symbol: unified symbol of the market to fetch trades for
599
+ :param int [since]: timestamp in ms of the earliest trade to fetch
600
+ :param int [limit]: the maximum amount of trades to fetch
601
+ :param dict [params]: extra parameters specific to the exchange API endpoint
602
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
603
+ """
604
+ await self.load_markets()
605
+ market = self.market(symbol)
606
+ request: dict = {
607
+ 'pair': market['id'],
608
+ }
609
+ response = await self.publicGetTradesPair(self.extend(request, params))
610
+ trades = self.safe_value(response, 'data', [])
611
+ #
612
+ # {
613
+ # "data":[
614
+ # {
615
+ # "timestamp":1644651458,
616
+ # "price":"1180785.00000000",
617
+ # "amount":"0.00020000",
618
+ # "isBuyer":false
619
+ # }
620
+ # ]
621
+ # }
622
+ #
623
+ return self.parse_trades(trades, market, since, limit)
624
+
625
+ async def fetch_trading_fees(self, params={}) -> TradingFees:
626
+ """
627
+ fetch the trading fees for multiple markets
628
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_limitations_and_fees.md
629
+ :param dict [params]: extra parameters specific to the exchange API endpoint
630
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
631
+ """
632
+ await self.load_markets()
633
+ response = await self.publicGetProvisioningLimitationsAndFees(params)
634
+ tradingFeeRate = self.safe_value(response, 'tradingFeeRate', {})
635
+ first = self.safe_value(tradingFeeRate, 0)
636
+ #
637
+ # {
638
+ # "tradingFeeRate":[
639
+ # {
640
+ # "rank":0,
641
+ # "twdVolumeSymbol":"\u003c",
642
+ # "twdVolume":"3000000",
643
+ # "bitoAmountSymbol":"\u003c",
644
+ # "bitoAmount":"7500",
645
+ # "makerFee":"0.001",
646
+ # "takerFee":"0.002",
647
+ # "makerBitoFee":"0.0008",
648
+ # "takerBitoFee":"0.0016"
649
+ # }
650
+ # ],
651
+ # "orderFeesAndLimitations":[
652
+ # {
653
+ # "pair":"BTC/TWD",
654
+ # "minimumOrderAmount":"0.0001",
655
+ # "minimumOrderAmountBase":"BTC",
656
+ # "minimumOrderNumberOfDigits":"0"
657
+ # }
658
+ # ],
659
+ # "restrictionsOfWithdrawalFees":[
660
+ # {
661
+ # "currency":"TWD",
662
+ # "fee":"15",
663
+ # "minimumTradingAmount":"100",
664
+ # "maximumTradingAmount":"1000000",
665
+ # "dailyCumulativeMaximumAmount":"2000000",
666
+ # "remarks":"",
667
+ # "protocol":""
668
+ # }
669
+ # ],
670
+ # "cryptocurrencyDepositFeeAndConfirmation":[
671
+ # {
672
+ # "currency":"TWD",
673
+ # "generalDepositFees":"0",
674
+ # "blockchainConfirmationRequired":""
675
+ # }
676
+ # ],
677
+ # "ttCheckFeesAndLimitationsLevel1":[
678
+ # {
679
+ # "currency":"TWD",
680
+ # "redeemDailyCumulativeMaximumAmount":"",
681
+ # "generateMinimumTradingAmount":"",
682
+ # "generateMaximumTradingAmount":"",
683
+ # "generateDailyCumulativeMaximumAmount":""
684
+ # }
685
+ # ],
686
+ # "ttCheckFeesAndLimitationsLevel2":[
687
+ # {
688
+ # "currency":"TWD",
689
+ # "redeemDailyCumulativeMaximumAmount":"20000000",
690
+ # "generateMinimumTradingAmount":"30",
691
+ # "generateMaximumTradingAmount":"10000000",
692
+ # "generateDailyCumulativeMaximumAmount":"10000000"
693
+ # }
694
+ # ]
695
+ # }
696
+ #
697
+ result: dict = {}
698
+ maker = self.safe_number(first, 'makerFee')
699
+ taker = self.safe_number(first, 'takerFee')
700
+ for i in range(0, len(self.symbols)):
701
+ symbol = self.symbols[i]
702
+ result[symbol] = {
703
+ 'info': first,
704
+ 'symbol': symbol,
705
+ 'maker': maker,
706
+ 'taker': taker,
707
+ 'percentage': True,
708
+ 'tierBased': True,
709
+ }
710
+ return result
711
+
712
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
713
+ return [
714
+ self.safe_integer(ohlcv, 'timestamp'),
715
+ self.safe_number(ohlcv, 'open'),
716
+ self.safe_number(ohlcv, 'high'),
717
+ self.safe_number(ohlcv, 'low'),
718
+ self.safe_number(ohlcv, 'close'),
719
+ self.safe_number(ohlcv, 'volume'),
720
+ ]
721
+
722
+ async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
723
+ """
724
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
725
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_ohlc_data.md
726
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
727
+ :param str timeframe: the length of time each candle represents
728
+ :param int [since]: timestamp in ms of the earliest candle to fetch
729
+ :param int [limit]: the maximum amount of candles to fetch
730
+ :param dict [params]: extra parameters specific to the exchange API endpoint
731
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
732
+ """
733
+ await self.load_markets()
734
+ market = self.market(symbol)
735
+ resolution = self.safe_string(self.timeframes, timeframe, timeframe)
736
+ request: dict = {
737
+ 'pair': market['id'],
738
+ 'resolution': resolution,
739
+ }
740
+ # we need to have a limit argument because "to" and "from" are required
741
+ if limit is None:
742
+ limit = 500
743
+ else:
744
+ limit = min(limit, 75000) # supports slightly more than 75k candles atm, but limit here to avoid errors
745
+ timeframeInSeconds = self.parse_timeframe(timeframe)
746
+ alignedSince = None
747
+ if since is None:
748
+ request['to'] = self.seconds()
749
+ request['from'] = request['to'] - (limit * timeframeInSeconds)
750
+ else:
751
+ timeframeInMilliseconds = timeframeInSeconds * 1000
752
+ alignedSince = int(math.floor(since / timeframeInMilliseconds)) * timeframeInMilliseconds
753
+ request['from'] = int(math.floor(since / 1000))
754
+ request['to'] = self.sum(request['from'], limit * timeframeInSeconds)
755
+ response = await self.publicGetTradingHistoryPair(self.extend(request, params))
756
+ data = self.safe_value(response, 'data', [])
757
+ #
758
+ # {
759
+ # "data":[
760
+ # {
761
+ # "timestamp":1644581100000,
762
+ # "open":"1214737",
763
+ # "high":"1215110",
764
+ # "low":"1214737",
765
+ # "close":"1215110",
766
+ # "volume":"0.08423959"
767
+ # }
768
+ # ]
769
+ # }
770
+ #
771
+ sparse = self.parse_ohlcvs(data, market, timeframe, since, limit)
772
+ return self.insert_missing_candles(sparse, timeframeInSeconds, alignedSince, limit)
773
+
774
+ def insert_missing_candles(self, candles, distance, since, limit):
775
+ # the exchange doesn't send zero volume candles so we emulate them instead
776
+ # otherwise sending a limit arg leads to unexpected results
777
+ length = len(candles)
778
+ if length == 0:
779
+ return candles
780
+ result = []
781
+ copyFrom = candles[0]
782
+ timestamp = None
783
+ if since is None:
784
+ timestamp = copyFrom[0]
785
+ else:
786
+ timestamp = since
787
+ i = 0
788
+ candleLength = len(candles)
789
+ resultLength = 0
790
+ while((resultLength < limit) and (i < candleLength)):
791
+ candle = candles[i]
792
+ if candle[0] == timestamp:
793
+ result.append(candle)
794
+ i = self.sum(i, 1)
795
+ else:
796
+ copy = self.array_concat([], copyFrom)
797
+ copy[0] = timestamp
798
+ # set open, high, low to close
799
+ copy[1] = copy[4]
800
+ copy[2] = copy[4]
801
+ copy[3] = copy[4]
802
+ copy[5] = self.parse_number('0')
803
+ result.append(copy)
804
+ timestamp = self.sum(timestamp, distance * 1000)
805
+ resultLength = len(result)
806
+ copyFrom = result[resultLength - 1]
807
+ return result
808
+
809
+ def parse_balance(self, response) -> Balances:
810
+ #
811
+ # [{
812
+ # "currency":"twd",
813
+ # "amount":"0",
814
+ # "available":"0",
815
+ # "stake":"0",
816
+ # "tradable":true
817
+ # }]
818
+ #
819
+ result: dict = {
820
+ 'info': response,
821
+ }
822
+ for i in range(0, len(response)):
823
+ balance = response[i]
824
+ currencyId = self.safe_string(balance, 'currency')
825
+ code = self.safe_currency_code(currencyId)
826
+ amount = self.safe_string(balance, 'amount')
827
+ available = self.safe_string(balance, 'available')
828
+ account: dict = {
829
+ 'free': available,
830
+ 'total': amount,
831
+ }
832
+ result[code] = account
833
+ return self.safe_balance(result)
834
+
835
+ async def fetch_balance(self, params={}) -> Balances:
836
+ """
837
+ query for balance and get the amount of funds available for trading or funds locked in orders
838
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_account_balance.md
839
+ :param dict [params]: extra parameters specific to the exchange API endpoint
840
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
841
+ """
842
+ await self.load_markets()
843
+ response = await self.privateGetAccountsBalance(params)
844
+ balances = self.safe_value(response, 'data', [])
845
+ #
846
+ # {
847
+ # "data":[
848
+ # {
849
+ # "currency":"twd",
850
+ # "amount":"0",
851
+ # "available":"0",
852
+ # "stake":"0",
853
+ # "tradable":true
854
+ # }
855
+ # ]
856
+ # }
857
+ #
858
+ return self.parse_balance(balances)
859
+
860
+ def parse_order_status(self, status: Str):
861
+ statuses: dict = {
862
+ '-1': 'open',
863
+ '0': 'open',
864
+ '1': 'open',
865
+ '2': 'closed',
866
+ '3': 'closed',
867
+ '4': 'canceled',
868
+ '6': 'canceled',
869
+ }
870
+ return self.safe_string(statuses, status, None)
871
+
872
+ def parse_order(self, order: dict, market: Market = None) -> Order:
873
+ #
874
+ # createOrder
875
+ # {
876
+ # "orderId": "2220595581",
877
+ # "timestamp": "1644896744886",
878
+ # "action": "SELL",
879
+ # "amount": "0.01",
880
+ # "price": "15000",
881
+ # "timeInForce": "GTC"
882
+ # }
883
+ #
884
+ # fetchOrder
885
+ # {
886
+ # "id":"8777138788",
887
+ # "pair":"bnb_twd",
888
+ # "price":"16000",
889
+ # "avgExecutionPrice":"0",
890
+ # "action":"SELL",
891
+ # "type":"LIMIT",
892
+ # "timestamp":1644899002598,
893
+ # "status":4,
894
+ # "originalAmount":"0.01",
895
+ # "remainingAmount":"0.01",
896
+ # "executedAmount":"0",
897
+ # "fee":"0",
898
+ # "feeSymbol":"twd",
899
+ # "bitoFee":"0",
900
+ # "total":"0",
901
+ # "seq":"BNBTWD548774666",
902
+ # "timeInForce":"GTC",
903
+ # "createdTimestamp":1644898944074,
904
+ # "updatedTimestamp":1644899002598
905
+ # }
906
+ #
907
+ id = self.safe_string_2(order, 'id', 'orderId')
908
+ timestamp = self.safe_integer_2(order, 'timestamp', 'createdTimestamp')
909
+ side = self.safe_string(order, 'action')
910
+ side = side.lower()
911
+ amount = self.safe_string_2(order, 'amount', 'originalAmount')
912
+ price = self.safe_string(order, 'price')
913
+ marketId = self.safe_string(order, 'pair')
914
+ market = self.safe_market(marketId, market, '_')
915
+ symbol = self.safe_string(market, 'symbol')
916
+ orderStatus = self.safe_string(order, 'status')
917
+ status = self.parse_order_status(orderStatus)
918
+ type = self.safe_string_lower(order, 'type')
919
+ average = self.safe_string(order, 'avgExecutionPrice')
920
+ filled = self.safe_string(order, 'executedAmount')
921
+ remaining = self.safe_string(order, 'remainingAmount')
922
+ timeInForce = self.safe_string(order, 'timeInForce')
923
+ postOnly = None
924
+ if timeInForce == 'POST_ONLY':
925
+ postOnly = True
926
+ fee = None
927
+ feeAmount = self.safe_string(order, 'fee')
928
+ feeSymbol = self.safe_currency_code(self.safe_string(order, 'feeSymbol'))
929
+ if Precise.string_gt(feeAmount, '0'):
930
+ fee = {
931
+ 'currency': feeSymbol,
932
+ 'cost': feeAmount,
933
+ }
934
+ return self.safe_order({
935
+ 'id': id,
936
+ 'clientOrderId': None,
937
+ 'timestamp': timestamp,
938
+ 'datetime': self.iso8601(timestamp),
939
+ 'lastTradeTimestamp': self.safe_integer(order, 'updatedTimestamp'),
940
+ 'symbol': symbol,
941
+ 'type': type,
942
+ 'timeInForce': timeInForce,
943
+ 'postOnly': postOnly,
944
+ 'side': side,
945
+ 'price': price,
946
+ 'stopPrice': None,
947
+ 'triggerPrice': None,
948
+ 'amount': amount,
949
+ 'cost': None,
950
+ 'average': average,
951
+ 'filled': filled,
952
+ 'remaining': remaining,
953
+ 'status': status,
954
+ 'fee': fee,
955
+ 'trades': None,
956
+ 'info': order,
957
+ }, market)
958
+
959
+ async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
960
+ """
961
+ create a trade order
962
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/create_an_order.md
963
+ :param str symbol: unified symbol of the market to create an order in
964
+ :param str type: 'market' or 'limit'
965
+ :param str side: 'buy' or 'sell'
966
+ :param float amount: how much of currency you want to trade in units of base currency
967
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
968
+ :param dict [params]: extra parameters specific to the exchange API endpoint
969
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
970
+ """
971
+ await self.load_markets()
972
+ market = self.market(symbol)
973
+ request: dict = {
974
+ 'type': type,
975
+ 'pair': market['id'],
976
+ 'action': side,
977
+ 'amount': self.amount_to_precision(symbol, amount),
978
+ 'timestamp': self.milliseconds(),
979
+ }
980
+ orderType = type.upper()
981
+ if orderType == 'LIMIT':
982
+ request['price'] = self.price_to_precision(symbol, price)
983
+ if orderType == 'STOP_LIMIT':
984
+ request['price'] = self.price_to_precision(symbol, price)
985
+ stopPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
986
+ params = self.omit(params, ['triggerPrice', 'stopPrice'])
987
+ if stopPrice is None:
988
+ raise InvalidOrder(self.id + ' createOrder() requires a stopPrice parameter for ' + orderType + ' orders')
989
+ else:
990
+ request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
991
+ condition = self.safe_string(params, 'condition')
992
+ if condition is None:
993
+ raise InvalidOrder(self.id + ' createOrder() requires a condition parameter for ' + orderType + ' orders')
994
+ else:
995
+ request['condition'] = condition
996
+ postOnly = self.is_post_only(orderType == 'MARKET', None, params)
997
+ if postOnly:
998
+ request['timeInForce'] = 'POST_ONLY'
999
+ response = await self.privatePostOrdersPair(self.extend(request, params))
1000
+ #
1001
+ # {
1002
+ # "orderId": "2220595581",
1003
+ # "timestamp": "1644896744886",
1004
+ # "action": "SELL",
1005
+ # "amount": "0.01",
1006
+ # "price": "15000",
1007
+ # "timeInForce": "GTC"
1008
+ # }
1009
+ #
1010
+ return self.parse_order(response, market)
1011
+
1012
+ async def cancel_order(self, id: str, symbol: Str = None, params={}):
1013
+ """
1014
+ cancels an open order
1015
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/cancel_an_order.md
1016
+ :param str id: order id
1017
+ :param str symbol: unified symbol of the market the order was made in
1018
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1019
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1020
+ """
1021
+ if symbol is None:
1022
+ raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
1023
+ await self.load_markets()
1024
+ market = self.market(symbol)
1025
+ request: dict = {
1026
+ 'id': id,
1027
+ 'pair': market['id'],
1028
+ }
1029
+ response = await self.privateDeleteOrdersPairId(self.extend(request, params))
1030
+ #
1031
+ # {
1032
+ # "orderId":"8777138788",
1033
+ # "action":"SELL",
1034
+ # "timestamp":1644899002465,
1035
+ # "price":"16000",
1036
+ # "amount":"0.01"
1037
+ # }
1038
+ #
1039
+ return self.parse_order(response, market)
1040
+
1041
+ async def cancel_orders(self, ids, symbol: Str = None, params={}):
1042
+ """
1043
+ cancel multiple orders
1044
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/cancel_batch_orders.md
1045
+ :param str[] ids: order ids
1046
+ :param str symbol: unified market symbol
1047
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1048
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1049
+ """
1050
+ if symbol is None:
1051
+ raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument')
1052
+ await self.load_markets()
1053
+ market = self.market(symbol)
1054
+ id = market['uppercaseId']
1055
+ request: dict = {}
1056
+ request[id] = ids
1057
+ response = await self.privatePutOrders(self.extend(request, params))
1058
+ #
1059
+ # {
1060
+ # "data":{
1061
+ # "BNB_TWD":[
1062
+ # "5236347105",
1063
+ # "359488711"
1064
+ # ]
1065
+ # }
1066
+ # }
1067
+ #
1068
+ return response
1069
+
1070
+ async def cancel_all_orders(self, symbol: Str = None, params={}):
1071
+ """
1072
+ cancel all open orders
1073
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/cancel_all_orders.md
1074
+ :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
1075
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1076
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1077
+ """
1078
+ await self.load_markets()
1079
+ request: dict = {
1080
+ # 'pair': market['id'], # optional
1081
+ }
1082
+ response = None
1083
+ if symbol is not None:
1084
+ market = self.market(symbol)
1085
+ request['pair'] = market['id']
1086
+ response = await self.privateDeleteOrdersPair(self.extend(request, params))
1087
+ else:
1088
+ response = await self.privateDeleteOrdersAll(self.extend(request, params))
1089
+ result = self.safe_value(response, 'data', {})
1090
+ #
1091
+ # {
1092
+ # "data":{
1093
+ # "BNB_TWD":[
1094
+ # "9515988421",
1095
+ # "4639130027"
1096
+ # ]
1097
+ # }
1098
+ # }
1099
+ #
1100
+ return result
1101
+
1102
+ async def fetch_order(self, id: str, symbol: Str = None, params={}):
1103
+ """
1104
+ fetches information on an order made by the user
1105
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_an_order_data.md
1106
+ :param str symbol: unified symbol of the market the order was made in
1107
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1108
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1109
+ """
1110
+ if symbol is None:
1111
+ raise ArgumentsRequired(self.id + ' fetchOrder() requires a symbol argument')
1112
+ await self.load_markets()
1113
+ market = self.market(symbol)
1114
+ request: dict = {
1115
+ 'orderId': id,
1116
+ 'pair': market['id'],
1117
+ }
1118
+ response = await self.privateGetOrdersPairOrderId(self.extend(request, params))
1119
+ #
1120
+ # {
1121
+ # "id":"8777138788",
1122
+ # "pair":"bnb_twd",
1123
+ # "price":"16000",
1124
+ # "avgExecutionPrice":"0",
1125
+ # "action":"SELL",
1126
+ # "type":"LIMIT",
1127
+ # "timestamp":1644899002598,
1128
+ # "status":4,
1129
+ # "originalAmount":"0.01",
1130
+ # "remainingAmount":"0.01",
1131
+ # "executedAmount":"0",
1132
+ # "fee":"0",
1133
+ # "feeSymbol":"twd",
1134
+ # "bitoFee":"0",
1135
+ # "total":"0",
1136
+ # "seq":"BNBTWD548774666",
1137
+ # "timeInForce":"GTC",
1138
+ # "createdTimestamp":1644898944074,
1139
+ # "updatedTimestamp":1644899002598
1140
+ # }
1141
+ #
1142
+ return self.parse_order(response, market)
1143
+
1144
+ async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1145
+ """
1146
+ fetches information on multiple orders made by the user
1147
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_orders_data.md
1148
+ :param str symbol: unified market symbol of the market orders were made in
1149
+ :param int [since]: the earliest time in ms to fetch orders for
1150
+ :param int [limit]: the maximum number of order structures to retrieve
1151
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1152
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1153
+ """
1154
+ if symbol is None:
1155
+ raise ArgumentsRequired(self.id + ' fetchOrders() requires a symbol argument')
1156
+ await self.load_markets()
1157
+ market = self.market(symbol)
1158
+ request: dict = {
1159
+ 'pair': market['id'],
1160
+ # 'startTimestamp': 0,
1161
+ # 'endTimestamp': 0,
1162
+ # 'statusKind': '',
1163
+ # 'orderId': '',
1164
+ }
1165
+ if since is not None:
1166
+ request['startTimestamp'] = since
1167
+ if limit is not None:
1168
+ request['limit'] = limit
1169
+ response = await self.privateGetOrdersAllPair(self.extend(request, params))
1170
+ orders = self.safe_value(response, 'data')
1171
+ if orders is None:
1172
+ orders = []
1173
+ #
1174
+ # {
1175
+ # "data":[
1176
+ # {
1177
+ # "id":"2220595581",
1178
+ # "pair":"bnb_twd",
1179
+ # "price":"15000",
1180
+ # "avgExecutionPrice":"0",
1181
+ # "action":"SELL",
1182
+ # "type":"LIMIT",
1183
+ # "createdTimestamp":1644896744886,
1184
+ # "updatedTimestamp":1644898706236,
1185
+ # "status":4,
1186
+ # "originalAmount":"0.01",
1187
+ # "remainingAmount":"0.01",
1188
+ # "executedAmount":"0",
1189
+ # "fee":"0",
1190
+ # "feeSymbol":"twd",
1191
+ # "bitoFee":"0",
1192
+ # "total":"0",
1193
+ # "seq":"BNBTWD8540871774",
1194
+ # "timeInForce":"GTC"
1195
+ # }
1196
+ # ]
1197
+ # }
1198
+ #
1199
+ return self.parse_orders(orders, market, since, limit)
1200
+
1201
+ async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1202
+ request: dict = {
1203
+ 'statusKind': 'OPEN',
1204
+ }
1205
+ return await self.fetch_orders(symbol, since, limit, self.extend(request, params))
1206
+
1207
+ async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1208
+ """
1209
+ fetches information on multiple closed orders made by the user
1210
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_orders_data.md
1211
+ :param str symbol: unified market symbol of the market orders were made in
1212
+ :param int [since]: the earliest time in ms to fetch orders for
1213
+ :param int [limit]: the maximum number of order structures to retrieve
1214
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1215
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1216
+ """
1217
+ request: dict = {
1218
+ 'statusKind': 'DONE',
1219
+ }
1220
+ return self.fetch_orders(symbol, since, limit, self.extend(request, params))
1221
+
1222
+ async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1223
+ """
1224
+ fetch all trades made by the user
1225
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_trades_data.md
1226
+ :param str symbol: unified market symbol
1227
+ :param int [since]: the earliest time in ms to fetch trades for
1228
+ :param int [limit]: the maximum number of trades structures to retrieve
1229
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1230
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1231
+ """
1232
+ if symbol is None:
1233
+ raise ArgumentsRequired(self.id + ' fetchMyTrades() requires a symbol argument')
1234
+ await self.load_markets()
1235
+ market = self.market(symbol)
1236
+ request: dict = {
1237
+ 'pair': market['id'],
1238
+ }
1239
+ response = await self.privateGetOrdersTradesPair(self.extend(request, params))
1240
+ trades = self.safe_value(response, 'data', [])
1241
+ #
1242
+ # {
1243
+ # "data":[
1244
+ # {
1245
+ # "tradeId":"5685030251",
1246
+ # "orderId":"9669168142",
1247
+ # "price":"11821.8",
1248
+ # "action":"SELL",
1249
+ # "baseAmount":"0.01",
1250
+ # "quoteAmount":"118.218",
1251
+ # "fee":"0.236436",
1252
+ # "feeSymbol":"BNB",
1253
+ # "isTaker":true,
1254
+ # "timestamp":1644905714862,
1255
+ # "createdTimestamp":1644905714862
1256
+ # }
1257
+ # ]
1258
+ # }
1259
+ #
1260
+ return self.parse_trades(trades, market, since, limit)
1261
+
1262
+ def parse_transaction_status(self, status: Str):
1263
+ states: dict = {
1264
+ 'COMPLETE': 'ok',
1265
+ 'INVALID': 'failed',
1266
+ 'PROCESSING': 'pending',
1267
+ 'WAIT_PROCESS': 'pending',
1268
+ 'FAILED': 'failed',
1269
+ 'EXPIRED': 'failed',
1270
+ 'CANCELLED': 'failed',
1271
+ 'EMAIL_VERIFICATION': 'pending',
1272
+ 'WAIT_CONFIRMATION': 'pending',
1273
+ }
1274
+ return self.safe_string(states, status, status)
1275
+
1276
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1277
+ #
1278
+ # fetchDeposits
1279
+ #
1280
+ # {
1281
+ # "serial": "20220214X766799",
1282
+ # "timestamp": "1644833015053",
1283
+ # "address": "bnb1xml62k5a9dcewgc542fha75fyxdcp0zv8eqfsh",
1284
+ # "amount": "0.20000000",
1285
+ # "fee": "0.00000000",
1286
+ # "total": "0.20000000",
1287
+ # "status": "COMPLETE",
1288
+ # "txid": "A3CC4F6828CC752B9F3737F48B5826B9EC2857040CB5141D0CC955F7E53DB6D9",
1289
+ # "message": "778553959",
1290
+ # "protocol": "MAIN",
1291
+ # "id": "2905906537"
1292
+ # }
1293
+ #
1294
+ # fetchWithdrawals or fetchWithdraw
1295
+ #
1296
+ # {
1297
+ # "serial": "20220215BW14069838",
1298
+ # "timestamp": "1644907716044",
1299
+ # "address": "TKrwMaZaGiAvtXCFT41xHuusNcs4LPWS7w",
1300
+ # "amount": "8.00000000",
1301
+ # "fee": "2.00000000",
1302
+ # "total": "10.00000000",
1303
+ # "status": "COMPLETE",
1304
+ # "txid": "50bf250c71a582f40cf699fb58bab978437ea9bdf7259ff8072e669aab30c32b",
1305
+ # "protocol": "TRX",
1306
+ # "id": "9925310345"
1307
+ # }
1308
+ #
1309
+ # withdraw
1310
+ #
1311
+ # {
1312
+ # "serial": "20220215BW14069838",
1313
+ # "currency": "USDT",
1314
+ # "protocol": "TRX",
1315
+ # "address": "TKrwMaZaGiAvtXCFT41xHuusNcs4LPWS7w",
1316
+ # "amount": "8",
1317
+ # "fee": "2",
1318
+ # "total": "10"
1319
+ # }
1320
+ #
1321
+ currencyId = self.safe_string(transaction, 'coin')
1322
+ code = self.safe_currency_code(currencyId, currency)
1323
+ timestamp = self.safe_integer(transaction, 'timestamp')
1324
+ address = self.safe_string(transaction, 'address')
1325
+ tag = self.safe_string(transaction, 'message')
1326
+ status = self.safe_string(transaction, 'status')
1327
+ networkId = self.safe_string(transaction, 'protocol')
1328
+ if networkId == 'MAIN':
1329
+ networkId = code
1330
+ return {
1331
+ 'info': transaction,
1332
+ 'id': self.safe_string(transaction, 'serial'),
1333
+ 'txid': self.safe_string(transaction, 'txid'),
1334
+ 'type': None,
1335
+ 'currency': code,
1336
+ 'network': self.network_id_to_code(networkId),
1337
+ 'amount': self.safe_number(transaction, 'total'),
1338
+ 'status': self.parse_transaction_status(status),
1339
+ 'timestamp': timestamp,
1340
+ 'datetime': self.iso8601(timestamp),
1341
+ 'address': address,
1342
+ 'addressFrom': None,
1343
+ 'addressTo': address,
1344
+ 'tag': tag,
1345
+ 'tagFrom': None,
1346
+ 'tagTo': tag,
1347
+ 'updated': None,
1348
+ 'comment': None,
1349
+ 'internal': None,
1350
+ 'fee': {
1351
+ 'currency': code,
1352
+ 'cost': self.safe_number(transaction, 'fee'),
1353
+ 'rate': None,
1354
+ },
1355
+ }
1356
+
1357
+ async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1358
+ """
1359
+ fetch all deposits made to an account
1360
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_deposit_invoices_data.md
1361
+ :param str code: unified currency code
1362
+ :param int [since]: the earliest time in ms to fetch deposits for
1363
+ :param int [limit]: the maximum number of deposits structures to retrieve
1364
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1365
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1366
+ """
1367
+ if code is None:
1368
+ raise ArgumentsRequired(self.id + ' fetchDeposits() requires the code argument')
1369
+ await self.load_markets()
1370
+ currency = self.safe_currency(code)
1371
+ request: dict = {
1372
+ 'currency': currency['id'],
1373
+ # 'endTimestamp': 0,
1374
+ # 'id': '',
1375
+ # 'statuses': '', # 'ROCESSING,COMPLETE,INVALID,WAIT_PROCESS,CANCELLED,FAILED'
1376
+ }
1377
+ if since is not None:
1378
+ request['startTimestamp'] = since
1379
+ if limit is not None:
1380
+ request['limit'] = limit
1381
+ response = await self.privateGetWalletDepositHistoryCurrency(self.extend(request, params))
1382
+ result = self.safe_value(response, 'data', [])
1383
+ #
1384
+ # {
1385
+ # "data":[
1386
+ # {
1387
+ # "serial":"20220214X766799",
1388
+ # "timestamp":"1644833015053",
1389
+ # "address":"bnb1xml62k5a9dcewgc542fha75fyxdcp0zv8eqfsh",
1390
+ # "amount":"0.20000000",
1391
+ # "fee":"0.00000000",
1392
+ # "total":"0.20000000",
1393
+ # "status":"COMPLETE",
1394
+ # "txid":"A3CC4F6828CC752B9F3737F48B5826B9EC2857040CB5141D0CC955F7E53DB6D9",
1395
+ # "message":"778553959",
1396
+ # "protocol":"MAIN",
1397
+ # "id":"2905906537"
1398
+ # }
1399
+ # ]
1400
+ # }
1401
+ #
1402
+ return self.parse_transactions(result, currency, since, limit, {'type': 'deposit'})
1403
+
1404
+ async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1405
+ """
1406
+ fetch all withdrawals made from an account
1407
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_withdraw_invoices_data.md
1408
+ :param str code: unified currency code
1409
+ :param int [since]: the earliest time in ms to fetch withdrawals for
1410
+ :param int [limit]: the maximum number of withdrawals structures to retrieve
1411
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1412
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1413
+ """
1414
+ if code is None:
1415
+ raise ArgumentsRequired(self.id + ' fetchWithdrawals() requires the code argument')
1416
+ await self.load_markets()
1417
+ currency = self.safe_currency(code)
1418
+ request: dict = {
1419
+ 'currency': currency['id'],
1420
+ # 'endTimestamp': 0,
1421
+ # 'id': '',
1422
+ # 'statuses': '', # 'PROCESSING,COMPLETE,EXPIRED,INVALID,WAIT_PROCESS,WAIT_CONFIRMATION,EMAIL_VERIFICATION,CANCELLED'
1423
+ }
1424
+ if since is not None:
1425
+ request['startTimestamp'] = since
1426
+ if limit is not None:
1427
+ request['limit'] = limit
1428
+ response = await self.privateGetWalletWithdrawHistoryCurrency(self.extend(request, params))
1429
+ result = self.safe_value(response, 'data', [])
1430
+ #
1431
+ # {
1432
+ # "data":[
1433
+ # {
1434
+ # "serial":"20220215BW14069838",
1435
+ # "timestamp":"1644907716044",
1436
+ # "address":"TKrwMaZaGiAvtXCFT41xHuusNcs4LPWS7w",
1437
+ # "amount":"8.00000000",
1438
+ # "fee":"2.00000000",
1439
+ # "total":"10.00000000",
1440
+ # "status":"COMPLETE",
1441
+ # "txid":"50bf250c71a582f40cf699fb58bab978437ea9bdf7259ff8072e669aab30c32b",
1442
+ # "protocol":"TRX",
1443
+ # "id":"9925310345"
1444
+ # }
1445
+ # ]
1446
+ # }
1447
+ #
1448
+ return self.parse_transactions(result, currency, since, limit, {'type': 'withdrawal'})
1449
+
1450
+ async def fetch_withdrawal(self, id: str, code: Str = None, params={}):
1451
+ """
1452
+ fetch data on a currency withdrawal via the withdrawal id
1453
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/get_an_withdraw_invoice_data.md
1454
+ :param str id: withdrawal id
1455
+ :param str code: unified currency code of the currency withdrawn, default is None
1456
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1457
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1458
+ """
1459
+ if code is None:
1460
+ raise ArgumentsRequired(self.id + ' fetchWithdrawal() requires the code argument')
1461
+ await self.load_markets()
1462
+ currency = self.safe_currency(code)
1463
+ request: dict = {
1464
+ 'serial': id,
1465
+ 'currency': currency['id'],
1466
+ }
1467
+ response = await self.privateGetWalletWithdrawCurrencySerial(self.extend(request, params))
1468
+ result = self.safe_value(response, 'data', {})
1469
+ #
1470
+ # {
1471
+ # "data":{
1472
+ # "serial":"20220215BW14069838",
1473
+ # "address":"TKrwMaZaGiAvtXCFT41xHuusNcs4LPWS7w",
1474
+ # "amount":"8.00000000",
1475
+ # "fee":"2.00000000",
1476
+ # "total":"10.00000000",
1477
+ # "status":"COMPLETE",
1478
+ # "txid":"50bf250c71a582f40cf699fb58bab978437ea9bdf7259ff8072e669aab30c32b",
1479
+ # "protocol":"TRX",
1480
+ # "id":"9925310345",
1481
+ # "timestamp":"1644907716044"
1482
+ # }
1483
+ # }
1484
+ #
1485
+ return self.parse_transaction(result, currency)
1486
+
1487
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1488
+ """
1489
+ make a withdrawal
1490
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/private/create_an_withdraw_invoice.md
1491
+ :param str code: unified currency code
1492
+ :param float amount: the amount to withdraw
1493
+ :param str address: the address to withdraw to
1494
+ :param str tag:
1495
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1496
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1497
+ """
1498
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1499
+ await self.load_markets()
1500
+ self.check_address(address)
1501
+ currency = self.currency(code)
1502
+ request: dict = {
1503
+ 'currency': currency['id'],
1504
+ 'amount': self.number_to_string(amount),
1505
+ 'address': address,
1506
+ }
1507
+ if 'network' in params:
1508
+ networks = self.safe_value(self.options, 'networks', {})
1509
+ requestedNetwork = self.safe_string_upper(params, 'network')
1510
+ params = self.omit(params, ['network'])
1511
+ networkId = self.safe_string(networks, requestedNetwork)
1512
+ if networkId is None:
1513
+ raise ExchangeError(self.id + ' invalid network ' + requestedNetwork)
1514
+ request['protocol'] = networkId
1515
+ if tag is not None:
1516
+ request['message'] = tag
1517
+ response = await self.privatePostWalletWithdrawCurrency(self.extend(request, params))
1518
+ result = self.safe_value(response, 'data', {})
1519
+ #
1520
+ # {
1521
+ # "data":{
1522
+ # "serial":"20220215BW14069838",
1523
+ # "currency":"USDT",
1524
+ # "protocol":"TRX",
1525
+ # "address":"TKrwMaZaGiAvtXCFT41xHuusNcs4LPWS7w",
1526
+ # "amount":"8",
1527
+ # "fee":"2",
1528
+ # "total":"10"
1529
+ # }
1530
+ # }
1531
+ #
1532
+ return self.parse_transaction(result, currency)
1533
+
1534
+ def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
1535
+ # {
1536
+ # "currency":"eth",
1537
+ # "withdrawFee":"0.007",
1538
+ # "minWithdraw":"0.001",
1539
+ # "maxWithdraw":"1000",
1540
+ # "maxDailyWithdraw":"2000",
1541
+ # "withdraw":true,
1542
+ # "deposit":true,
1543
+ # "depositConfirmation":"12"
1544
+ # }
1545
+ return {
1546
+ 'info': fee,
1547
+ 'withdraw': {
1548
+ 'fee': self.safe_number(fee, 'withdrawFee'),
1549
+ 'percentage': False,
1550
+ },
1551
+ 'deposit': {
1552
+ 'fee': None,
1553
+ 'percentage': None,
1554
+ },
1555
+ 'networks': {},
1556
+ }
1557
+
1558
+ async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
1559
+ """
1560
+ fetch deposit and withdraw fees
1561
+ :see: https://github.com/bitoex/bitopro-offical-api-docs/blob/master/api/v3/public/get_currency_info.md
1562
+ :param str[]|None codes: list of unified currency codes
1563
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1564
+ :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
1565
+ """
1566
+ await self.load_markets()
1567
+ response = await self.publicGetProvisioningCurrencies(params)
1568
+ #
1569
+ # {
1570
+ # "data":[
1571
+ # {
1572
+ # "currency":"eth",
1573
+ # "withdrawFee":"0.007",
1574
+ # "minWithdraw":"0.001",
1575
+ # "maxWithdraw":"1000",
1576
+ # "maxDailyWithdraw":"2000",
1577
+ # "withdraw":true,
1578
+ # "deposit":true,
1579
+ # "depositConfirmation":"12"
1580
+ # }
1581
+ # ]
1582
+ # }
1583
+ #
1584
+ data = self.safe_list(response, 'data', [])
1585
+ return self.parse_deposit_withdraw_fees(data, codes, 'currency')
1586
+
1587
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1588
+ url = '/' + self.implode_params(path, params)
1589
+ query = self.omit(params, self.extract_params(path))
1590
+ if headers is None:
1591
+ headers = {}
1592
+ headers['X-BITOPRO-API'] = 'ccxt'
1593
+ if api == 'private':
1594
+ self.check_required_credentials()
1595
+ if method == 'POST' or method == 'PUT':
1596
+ body = self.json(params)
1597
+ payload = self.string_to_base64(body)
1598
+ signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha384)
1599
+ headers['X-BITOPRO-APIKEY'] = self.apiKey
1600
+ headers['X-BITOPRO-PAYLOAD'] = payload
1601
+ headers['X-BITOPRO-SIGNATURE'] = signature
1602
+ elif method == 'GET' or method == 'DELETE':
1603
+ if query:
1604
+ url += '?' + self.urlencode(query)
1605
+ nonce = self.milliseconds()
1606
+ rawData: dict = {
1607
+ 'nonce': nonce,
1608
+ }
1609
+ data = self.json(rawData)
1610
+ payload = self.string_to_base64(data)
1611
+ signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha384)
1612
+ headers['X-BITOPRO-APIKEY'] = self.apiKey
1613
+ headers['X-BITOPRO-PAYLOAD'] = payload
1614
+ headers['X-BITOPRO-SIGNATURE'] = signature
1615
+ elif api == 'public' and method == 'GET':
1616
+ if query:
1617
+ url += '?' + self.urlencode(query)
1618
+ url = self.urls['api']['rest'] + url
1619
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1620
+
1621
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1622
+ if response is None:
1623
+ return None # fallback to the default error handler
1624
+ if code >= 200 and code < 300:
1625
+ return None
1626
+ feedback = self.id + ' ' + body
1627
+ error = self.safe_string(response, 'error')
1628
+ self.throw_exactly_matched_exception(self.exceptions['exact'], error, feedback)
1629
+ self.throw_broadly_matched_exception(self.exceptions['broad'], error, feedback)
1630
+ raise ExchangeError(feedback) # unknown message