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,1067 @@
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.coinmate import ImplicitAPI
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction
10
+ from typing import List
11
+ from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
13
+ from ccxt.base.errors import ArgumentsRequired
14
+ from ccxt.base.errors import InsufficientFunds
15
+ from ccxt.base.errors import InvalidOrder
16
+ from ccxt.base.errors import OrderNotFound
17
+ from ccxt.base.errors import RateLimitExceeded
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+ from ccxt.base.precise import Precise
20
+
21
+
22
+ class coinmate(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(coinmate, self).describe(), {
26
+ 'id': 'coinmate',
27
+ 'name': 'CoinMate',
28
+ 'countries': ['GB', 'CZ', 'EU'], # UK, Czech Republic
29
+ 'rateLimit': 1000,
30
+ 'has': {
31
+ 'CORS': True,
32
+ 'spot': True,
33
+ 'margin': False,
34
+ 'swap': False,
35
+ 'future': False,
36
+ 'option': False,
37
+ 'addMargin': False,
38
+ 'cancelOrder': True,
39
+ 'closeAllPositions': False,
40
+ 'closePosition': False,
41
+ 'createOrder': True,
42
+ 'createReduceOnlyOrder': False,
43
+ 'fetchBalance': True,
44
+ 'fetchBorrowRateHistories': False,
45
+ 'fetchBorrowRateHistory': False,
46
+ 'fetchCrossBorrowRate': False,
47
+ 'fetchCrossBorrowRates': False,
48
+ 'fetchDepositsWithdrawals': True,
49
+ 'fetchFundingHistory': False,
50
+ 'fetchFundingRate': False,
51
+ 'fetchFundingRateHistory': False,
52
+ 'fetchFundingRates': False,
53
+ 'fetchIndexOHLCV': False,
54
+ 'fetchIsolatedBorrowRate': False,
55
+ 'fetchIsolatedBorrowRates': False,
56
+ 'fetchLeverage': False,
57
+ 'fetchLeverageTiers': False,
58
+ 'fetchMarginMode': False,
59
+ 'fetchMarkets': True,
60
+ 'fetchMarkOHLCV': False,
61
+ 'fetchMyTrades': True,
62
+ 'fetchOpenInterestHistory': False,
63
+ 'fetchOpenOrders': True,
64
+ 'fetchOrder': True,
65
+ 'fetchOrderBook': True,
66
+ 'fetchOrders': True,
67
+ 'fetchPosition': False,
68
+ 'fetchPositionHistory': False,
69
+ 'fetchPositionMode': False,
70
+ 'fetchPositions': False,
71
+ 'fetchPositionsForSymbol': False,
72
+ 'fetchPositionsHistory': False,
73
+ 'fetchPositionsRisk': False,
74
+ 'fetchPremiumIndexOHLCV': False,
75
+ 'fetchTicker': True,
76
+ 'fetchTickers': True,
77
+ 'fetchTrades': True,
78
+ 'fetchTradingFee': True,
79
+ 'fetchTradingFees': False,
80
+ 'fetchTransactions': 'emulated',
81
+ 'reduceMargin': False,
82
+ 'setLeverage': False,
83
+ 'setMarginMode': False,
84
+ 'setPositionMode': False,
85
+ 'transfer': False,
86
+ 'withdraw': True,
87
+ },
88
+ 'urls': {
89
+ 'logo': 'https://user-images.githubusercontent.com/51840849/87460806-1c9f3f00-c616-11ea-8c46-a77018a8f3f4.jpg',
90
+ 'api': {
91
+ 'rest': 'https://coinmate.io/api',
92
+ },
93
+ 'www': 'https://coinmate.io',
94
+ 'fees': 'https://coinmate.io/fees',
95
+ 'doc': [
96
+ 'https://coinmate.docs.apiary.io',
97
+ 'https://coinmate.io/developers',
98
+ ],
99
+ 'referral': 'https://coinmate.io?referral=YTFkM1RsOWFObVpmY1ZjMGREQmpTRnBsWjJJNVp3PT0',
100
+ },
101
+ 'requiredCredentials': {
102
+ 'apiKey': True,
103
+ 'secret': True,
104
+ 'uid': True,
105
+ },
106
+ 'api': {
107
+ 'public': {
108
+ 'get': [
109
+ 'orderBook',
110
+ 'ticker',
111
+ 'tickerAll',
112
+ 'products',
113
+ 'transactions',
114
+ 'tradingPairs',
115
+ ],
116
+ },
117
+ 'private': {
118
+ 'post': [
119
+ 'balances',
120
+ 'bitcoinCashWithdrawal',
121
+ 'bitcoinCashDepositAddresses',
122
+ 'bitcoinDepositAddresses',
123
+ 'bitcoinWithdrawal',
124
+ 'bitcoinWithdrawalFees',
125
+ 'buyInstant',
126
+ 'buyLimit',
127
+ 'cancelOrder',
128
+ 'cancelOrderWithInfo',
129
+ 'createVoucher',
130
+ 'dashDepositAddresses',
131
+ 'dashWithdrawal',
132
+ 'ethereumWithdrawal',
133
+ 'ethereumDepositAddresses',
134
+ 'litecoinWithdrawal',
135
+ 'litecoinDepositAddresses',
136
+ 'openOrders',
137
+ 'order',
138
+ 'orderHistory',
139
+ 'orderById',
140
+ 'pusherAuth',
141
+ 'redeemVoucher',
142
+ 'replaceByBuyLimit',
143
+ 'replaceByBuyInstant',
144
+ 'replaceBySellLimit',
145
+ 'replaceBySellInstant',
146
+ 'rippleDepositAddresses',
147
+ 'rippleWithdrawal',
148
+ 'sellInstant',
149
+ 'sellLimit',
150
+ 'transactionHistory',
151
+ 'traderFees',
152
+ 'tradeHistory',
153
+ 'transfer',
154
+ 'transferHistory',
155
+ 'unconfirmedBitcoinDeposits',
156
+ 'unconfirmedBitcoinCashDeposits',
157
+ 'unconfirmedDashDeposits',
158
+ 'unconfirmedEthereumDeposits',
159
+ 'unconfirmedLitecoinDeposits',
160
+ 'unconfirmedRippleDeposits',
161
+ 'cancelAllOpenOrders',
162
+ 'withdrawVirtualCurrency',
163
+ 'virtualCurrencyDepositAddresses',
164
+ 'unconfirmedVirtualCurrencyDeposits',
165
+ 'adaWithdrawal',
166
+ 'adaDepositAddresses',
167
+ 'unconfirmedAdaDeposits',
168
+ 'solWithdrawal',
169
+ 'solDepositAddresses',
170
+ 'unconfirmedSolDeposits',
171
+ ],
172
+ },
173
+ },
174
+ 'fees': {
175
+ 'trading': {
176
+ 'tierBased': True,
177
+ 'percentage': True,
178
+ 'maker': self.parse_number('0.0012'),
179
+ 'taker': self.parse_number('0.0025'),
180
+ 'tiers': {
181
+ 'taker': [
182
+ [self.parse_number('0'), self.parse_number('0.0035')],
183
+ [self.parse_number('10000'), self.parse_number('0.0023')],
184
+ [self.parse_number('100000'), self.parse_number('0.0021')],
185
+ [self.parse_number('250000'), self.parse_number('0.0020')],
186
+ [self.parse_number('500000'), self.parse_number('0.0015')],
187
+ [self.parse_number('1000000'), self.parse_number('0.0013')],
188
+ [self.parse_number('3000000'), self.parse_number('0.0010')],
189
+ [self.parse_number('15000000'), self.parse_number('0.0005')],
190
+ ],
191
+ 'maker': [
192
+ [self.parse_number('0'), self.parse_number('0.003')],
193
+ [self.parse_number('10000'), self.parse_number('0.0011')],
194
+ [self.parse_number('100000'), self.parse_number('0.0010')],
195
+ [self.parse_number('250000'), self.parse_number('0.0008')],
196
+ [self.parse_number('500000'), self.parse_number('0.0005')],
197
+ [self.parse_number('1000000'), self.parse_number('0.0003')],
198
+ [self.parse_number('3000000'), self.parse_number('0.0002')],
199
+ [self.parse_number('15000000'), self.parse_number('0')],
200
+ ],
201
+ },
202
+ },
203
+ },
204
+ 'options': {
205
+ 'withdraw': {
206
+ 'fillResponsefromRequest': True,
207
+ 'methods': {
208
+ 'BTC': 'privatePostBitcoinWithdrawal',
209
+ 'LTC': 'privatePostLitecoinWithdrawal',
210
+ 'BCH': 'privatePostBitcoinCashWithdrawal',
211
+ 'ETH': 'privatePostEthereumWithdrawal',
212
+ 'XRP': 'privatePostRippleWithdrawal',
213
+ 'DASH': 'privatePostDashWithdrawal',
214
+ 'DAI': 'privatePostDaiWithdrawal',
215
+ 'ADA': 'privatePostAdaWithdrawal',
216
+ 'SOL': 'privatePostSolWithdrawal',
217
+ },
218
+ },
219
+ },
220
+ 'exceptions': {
221
+ 'exact': {
222
+ 'No order with given ID': OrderNotFound,
223
+ },
224
+ 'broad': {
225
+ 'Not enough account balance available': InsufficientFunds,
226
+ 'Incorrect order ID': InvalidOrder,
227
+ 'Minimum Order Size ': InvalidOrder,
228
+ 'max allowed precision': InvalidOrder, # {"error":true,"errorMessage":"USDT_EUR - max allowed precision is 4 decimal places","data":null}
229
+ 'TOO MANY REQUESTS': RateLimitExceeded,
230
+ 'Access denied.': AuthenticationError, # {"error":true,"errorMessage":"Access denied.","data":null}
231
+ },
232
+ },
233
+ 'precisionMode': TICK_SIZE,
234
+ })
235
+
236
+ async def fetch_markets(self, params={}) -> List[Market]:
237
+ """
238
+ retrieves data on all markets for coinmate
239
+ :see: https://coinmate.docs.apiary.io/#reference/trading-pairs/get-trading-pairs/get
240
+ :param dict [params]: extra parameters specific to the exchange API endpoint
241
+ :returns dict[]: an array of objects representing market data
242
+ """
243
+ response = await self.publicGetTradingPairs(params)
244
+ #
245
+ # {
246
+ # "error":false,
247
+ # "errorMessage":null,
248
+ # "data": [
249
+ # {
250
+ # "name":"BTC_EUR",
251
+ # "firstCurrency":"BTC",
252
+ # "secondCurrency":"EUR",
253
+ # "priceDecimals":2,
254
+ # "lotDecimals":8,
255
+ # "minAmount":0.0002,
256
+ # "tradesWebSocketChannelId":"trades-BTC_EUR",
257
+ # "orderBookWebSocketChannelId":"order_book-BTC_EUR",
258
+ # "tradeStatisticsWebSocketChannelId":"statistics-BTC_EUR"
259
+ # },
260
+ # ]
261
+ # }
262
+ #
263
+ data = self.safe_value(response, 'data', [])
264
+ result = []
265
+ for i in range(0, len(data)):
266
+ market = data[i]
267
+ id = self.safe_string(market, 'name')
268
+ baseId = self.safe_string(market, 'firstCurrency')
269
+ quoteId = self.safe_string(market, 'secondCurrency')
270
+ base = self.safe_currency_code(baseId)
271
+ quote = self.safe_currency_code(quoteId)
272
+ symbol = base + '/' + quote
273
+ result.append({
274
+ 'id': id,
275
+ 'symbol': symbol,
276
+ 'base': base,
277
+ 'quote': quote,
278
+ 'settle': None,
279
+ 'baseId': baseId,
280
+ 'quoteId': quoteId,
281
+ 'settleId': None,
282
+ 'type': 'spot',
283
+ 'spot': True,
284
+ 'margin': False,
285
+ 'swap': False,
286
+ 'future': False,
287
+ 'option': False,
288
+ 'active': None,
289
+ 'contract': False,
290
+ 'linear': None,
291
+ 'inverse': None,
292
+ 'contractSize': None,
293
+ 'expiry': None,
294
+ 'expiryDatetime': None,
295
+ 'strike': None,
296
+ 'optionType': None,
297
+ 'precision': {
298
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(market, 'lotDecimals'))),
299
+ 'price': self.parse_number(self.parse_precision(self.safe_string(market, 'priceDecimals'))),
300
+ },
301
+ 'limits': {
302
+ 'leverage': {
303
+ 'min': None,
304
+ 'max': None,
305
+ },
306
+ 'amount': {
307
+ 'min': self.safe_number(market, 'minAmount'),
308
+ 'max': None,
309
+ },
310
+ 'price': {
311
+ 'min': None,
312
+ 'max': None,
313
+ },
314
+ 'cost': {
315
+ 'min': None,
316
+ 'max': None,
317
+ },
318
+ },
319
+ 'created': None,
320
+ 'info': market,
321
+ })
322
+ return result
323
+
324
+ def parse_balance(self, response) -> Balances:
325
+ balances = self.safe_value(response, 'data', {})
326
+ result: dict = {'info': response}
327
+ currencyIds = list(balances.keys())
328
+ for i in range(0, len(currencyIds)):
329
+ currencyId = currencyIds[i]
330
+ code = self.safe_currency_code(currencyId)
331
+ balance = self.safe_value(balances, currencyId)
332
+ account = self.account()
333
+ account['free'] = self.safe_string(balance, 'available')
334
+ account['used'] = self.safe_string(balance, 'reserved')
335
+ account['total'] = self.safe_string(balance, 'balance')
336
+ result[code] = account
337
+ return self.safe_balance(result)
338
+
339
+ async def fetch_balance(self, params={}) -> Balances:
340
+ """
341
+ query for balance and get the amount of funds available for trading or funds locked in orders
342
+ :see: https://coinmate.docs.apiary.io/#reference/balance/get-balances/post
343
+ :param dict [params]: extra parameters specific to the exchange API endpoint
344
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
345
+ """
346
+ await self.load_markets()
347
+ response = await self.privatePostBalances(params)
348
+ return self.parse_balance(response)
349
+
350
+ async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
351
+ """
352
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
353
+ :see: https://coinmate.docs.apiary.io/#reference/order-book/get-order-book/get
354
+ :param str symbol: unified symbol of the market to fetch the order book for
355
+ :param int [limit]: the maximum amount of order book entries to return
356
+ :param dict [params]: extra parameters specific to the exchange API endpoint
357
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
358
+ """
359
+ await self.load_markets()
360
+ market = self.market(symbol)
361
+ request: dict = {
362
+ 'currencyPair': market['id'],
363
+ 'groupByPriceLimit': 'False',
364
+ }
365
+ response = await self.publicGetOrderBook(self.extend(request, params))
366
+ orderbook = response['data']
367
+ timestamp = self.safe_timestamp(orderbook, 'timestamp')
368
+ return self.parse_order_book(orderbook, market['symbol'], timestamp, 'bids', 'asks', 'price', 'amount')
369
+
370
+ async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
371
+ """
372
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
373
+ :see: https://coinmate.docs.apiary.io/#reference/ticker/get-ticker/get
374
+ :param str symbol: unified symbol of the market to fetch the ticker for
375
+ :param dict [params]: extra parameters specific to the exchange API endpoint
376
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
377
+ """
378
+ await self.load_markets()
379
+ market = self.market(symbol)
380
+ request: dict = {
381
+ 'currencyPair': market['id'],
382
+ }
383
+ response = await self.publicGetTicker(self.extend(request, params))
384
+ #
385
+ # {
386
+ # "error": False,
387
+ # "errorMessage": null,
388
+ # "data": {
389
+ # "last": 0.55105,
390
+ # "high": 0.56439,
391
+ # "low": 0.54358,
392
+ # "amount": 37038.993381,
393
+ # "bid": 0.54595,
394
+ # "ask": 0.55324,
395
+ # "change": 3.03659243,
396
+ # "open": 0.53481,
397
+ # "timestamp": 1708074779
398
+ # }
399
+ # }
400
+ #
401
+ data = self.safe_dict(response, 'data')
402
+ return self.parse_ticker(data, market)
403
+
404
+ async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
405
+ """
406
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
407
+ :see: https://coinmate.docs.apiary.io/#reference/ticker/get-ticker-all/get
408
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
409
+ :param dict [params]: extra parameters specific to the exchange API endpoint
410
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
411
+ """
412
+ await self.load_markets()
413
+ symbols = self.market_symbols(symbols)
414
+ response = await self.publicGetTickerAll(params)
415
+ #
416
+ # {
417
+ # "error": False,
418
+ # "errorMessage": null,
419
+ # "data": {
420
+ # "LTC_BTC": {
421
+ # "last": "0.001337",
422
+ # "high": "0.001348",
423
+ # "low": "0.001332",
424
+ # "amount": "34.75472959",
425
+ # "bid": "0.001348",
426
+ # "ask": "0.001356",
427
+ # "change": "-0.74239050",
428
+ # "open": "0.001347",
429
+ # "timestamp": "1708074485"
430
+ # }
431
+ # }
432
+ # }
433
+ #
434
+ data = self.safe_value(response, 'data', {})
435
+ keys = list(data.keys())
436
+ result: dict = {}
437
+ for i in range(0, len(keys)):
438
+ market = self.market(keys[i])
439
+ ticker = self.parse_ticker(self.safe_value(data, keys[i]), market)
440
+ result[market['symbol']] = ticker
441
+ return self.filter_by_array_tickers(result, 'symbol', symbols)
442
+
443
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
444
+ #
445
+ # {
446
+ # "last": "0.001337",
447
+ # "high": "0.001348",
448
+ # "low": "0.001332",
449
+ # "amount": "34.75472959",
450
+ # "bid": "0.001348",
451
+ # "ask": "0.001356",
452
+ # "change": "-0.74239050",
453
+ # "open": "0.001347",
454
+ # "timestamp": "1708074485"
455
+ # }
456
+ #
457
+ timestamp = self.safe_timestamp(ticker, 'timestamp')
458
+ last = self.safe_number(ticker, 'last')
459
+ return self.safe_ticker({
460
+ 'symbol': market['symbol'],
461
+ 'timestamp': timestamp,
462
+ 'datetime': self.iso8601(timestamp),
463
+ 'high': self.safe_number(ticker, 'high'),
464
+ 'low': self.safe_number(ticker, 'low'),
465
+ 'bid': self.safe_number(ticker, 'bid'),
466
+ 'bidVolume': None,
467
+ 'ask': self.safe_number(ticker, 'ask'),
468
+ 'vwap': None,
469
+ 'askVolume': None,
470
+ 'open': None,
471
+ 'close': last,
472
+ 'last': last,
473
+ 'previousClose': None,
474
+ 'change': None,
475
+ 'percentage': None,
476
+ 'average': None,
477
+ 'baseVolume': self.safe_number(ticker, 'amount'),
478
+ 'quoteVolume': None,
479
+ 'info': ticker,
480
+ }, market)
481
+
482
+ async def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
483
+ """
484
+ fetch history of deposits and withdrawals
485
+ :see: https://coinmate.docs.apiary.io/#reference/transfers/get-transfer-history/post
486
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
487
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
488
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
489
+ :param dict [params]: extra parameters specific to the exchange API endpoint
490
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
491
+ """
492
+ await self.load_markets()
493
+ request: dict = {
494
+ 'limit': 1000,
495
+ }
496
+ if limit is not None:
497
+ request['limit'] = limit
498
+ if since is not None:
499
+ request['timestampFrom'] = since
500
+ if code is not None:
501
+ currency = self.currency(code)
502
+ request['currency'] = currency['id']
503
+ response = await self.privatePostTransferHistory(self.extend(request, params))
504
+ items = response['data']
505
+ return self.parse_transactions(items, None, since, limit)
506
+
507
+ def parse_transaction_status(self, status: Str):
508
+ statuses: dict = {
509
+ 'COMPLETED': 'ok',
510
+ 'WAITING': 'pending',
511
+ 'SENT': 'pending',
512
+ 'CREATED': 'pending',
513
+ 'OK': 'ok',
514
+ 'NEW': 'pending',
515
+ 'CANCELED': 'canceled',
516
+ }
517
+ return self.safe_string(statuses, status, status)
518
+
519
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
520
+ #
521
+ # deposits
522
+ #
523
+ # {
524
+ # "transactionId": 1862815,
525
+ # "timestamp": 1516803982388,
526
+ # "amountCurrency": "LTC",
527
+ # "amount": 1,
528
+ # "fee": 0,
529
+ # "walletType": "LTC",
530
+ # "transferType": "DEPOSIT",
531
+ # "transferStatus": "COMPLETED",
532
+ # "txid":
533
+ # "ccb9255dfa874e6c28f1a64179769164025329d65e5201849c2400abd6bce245",
534
+ # "destination": "LQrtSKA6LnhcwRrEuiborQJnjFF56xqsFn",
535
+ # "destinationTag": null
536
+ # }
537
+ #
538
+ # withdrawals
539
+ #
540
+ # {
541
+ # "transactionId": 2140966,
542
+ # "timestamp": 1519314282976,
543
+ # "amountCurrency": "EUR",
544
+ # "amount": 8421.7228,
545
+ # "fee": 16.8772,
546
+ # "walletType": "BANK_WIRE",
547
+ # "transferType": "WITHDRAWAL",
548
+ # "transferStatus": "COMPLETED",
549
+ # "txid": null,
550
+ # "destination": null,
551
+ # "destinationTag": null
552
+ # }
553
+ #
554
+ # withdraw
555
+ #
556
+ # {
557
+ # "id": 2132583,
558
+ # }
559
+ #
560
+ timestamp = self.safe_integer(transaction, 'timestamp')
561
+ currencyId = self.safe_string(transaction, 'amountCurrency')
562
+ code = self.safe_currency_code(currencyId, currency)
563
+ return {
564
+ 'info': transaction,
565
+ 'id': self.safe_string_2(transaction, 'transactionId', 'id'),
566
+ 'txid': self.safe_string(transaction, 'txid'),
567
+ 'type': self.safe_string_lower(transaction, 'transferType'),
568
+ 'currency': code,
569
+ 'network': self.safe_string(transaction, 'walletType'),
570
+ 'amount': self.safe_number(transaction, 'amount'),
571
+ 'status': self.parse_transaction_status(self.safe_string(transaction, 'transferStatus')),
572
+ 'timestamp': timestamp,
573
+ 'datetime': self.iso8601(timestamp),
574
+ 'address': self.safe_string(transaction, 'destination'),
575
+ 'addressFrom': None,
576
+ 'addressTo': None,
577
+ 'tag': self.safe_string(transaction, 'destinationTag'),
578
+ 'tagFrom': None,
579
+ 'tagTo': None,
580
+ 'updated': None,
581
+ 'comment': None,
582
+ 'internal': None,
583
+ 'fee': {
584
+ 'cost': self.safe_number(transaction, 'fee'),
585
+ 'currency': code,
586
+ 'rate': None,
587
+ },
588
+ }
589
+
590
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
591
+ """
592
+ make a withdrawal
593
+ :see: https://coinmate.docs.apiary.io/#reference/bitcoin-withdrawal-and-deposit/withdraw-bitcoins/post
594
+ :see: https://coinmate.docs.apiary.io/#reference/litecoin-withdrawal-and-deposit/withdraw-litecoins/post
595
+ :see: https://coinmate.docs.apiary.io/#reference/ethereum-withdrawal-and-deposit/withdraw-ethereum/post
596
+ :see: https://coinmate.docs.apiary.io/#reference/ripple-withdrawal-and-deposit/withdraw-ripple/post
597
+ :see: https://coinmate.docs.apiary.io/#reference/cardano-withdrawal-and-deposit/withdraw-cardano/post
598
+ :see: https://coinmate.docs.apiary.io/#reference/solana-withdrawal-and-deposit/withdraw-solana/post
599
+ :param str code: unified currency code
600
+ :param float amount: the amount to withdraw
601
+ :param str address: the address to withdraw to
602
+ :param str tag:
603
+ :param dict [params]: extra parameters specific to the exchange API endpoint
604
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
605
+ """
606
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
607
+ self.check_address(address)
608
+ await self.load_markets()
609
+ currency = self.currency(code)
610
+ withdrawOptions = self.safe_value(self.options, 'withdraw', {})
611
+ methods = self.safe_value(withdrawOptions, 'methods', {})
612
+ method = self.safe_string(methods, code)
613
+ if method is None:
614
+ allowedCurrencies = list(methods.keys())
615
+ raise ExchangeError(self.id + ' withdraw() only allows withdrawing the following currencies: ' + ', '.join(allowedCurrencies))
616
+ request: dict = {
617
+ 'amount': self.currency_to_precision(code, amount),
618
+ 'address': address,
619
+ }
620
+ if tag is not None:
621
+ request['destinationTag'] = tag
622
+ response = await getattr(self, method)(self.extend(request, params))
623
+ #
624
+ # {
625
+ # "error": False,
626
+ # "errorMessage": null,
627
+ # "data": {
628
+ # "id": "9e0a37fc-4ab4-4b9d-b9e7-c9c8f7c4c8e0"
629
+ # }
630
+ # }
631
+ #
632
+ data = self.safe_value(response, 'data')
633
+ transaction = self.parse_transaction(data, currency)
634
+ fillResponseFromRequest = self.safe_bool(withdrawOptions, 'fillResponseFromRequest', True)
635
+ if fillResponseFromRequest:
636
+ transaction['amount'] = amount
637
+ transaction['currency'] = code
638
+ transaction['address'] = address
639
+ transaction['tag'] = tag
640
+ transaction['type'] = 'withdrawal'
641
+ transaction['status'] = 'pending'
642
+ return transaction
643
+
644
+ async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
645
+ """
646
+ fetch all trades made by the user
647
+ :see: https://coinmate.docs.apiary.io/#reference/trade-history/get-trade-history/post
648
+ :param str symbol: unified market symbol
649
+ :param int [since]: the earliest time in ms to fetch trades for
650
+ :param int [limit]: the maximum number of trades structures to retrieve
651
+ :param dict [params]: extra parameters specific to the exchange API endpoint
652
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
653
+ """
654
+ await self.load_markets()
655
+ if limit is None:
656
+ limit = 1000
657
+ request: dict = {
658
+ 'limit': limit,
659
+ }
660
+ if symbol is not None:
661
+ market = self.market(symbol)
662
+ request['currencyPair'] = market['id']
663
+ if since is not None:
664
+ request['timestampFrom'] = since
665
+ response = await self.privatePostTradeHistory(self.extend(request, params))
666
+ data = self.safe_list(response, 'data', [])
667
+ return self.parse_trades(data, None, since, limit)
668
+
669
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
670
+ #
671
+ # fetchMyTrades(private)
672
+ #
673
+ # {
674
+ # "transactionId": 2671819,
675
+ # "createdTimestamp": 1529649127605,
676
+ # "currencyPair": "LTC_BTC",
677
+ # "type": "BUY",
678
+ # "orderType": "LIMIT",
679
+ # "orderId": 101810227,
680
+ # "amount": 0.01,
681
+ # "price": 0.01406,
682
+ # "fee": 0,
683
+ # "feeType": "MAKER"
684
+ # }
685
+ #
686
+ # fetchTrades(public)
687
+ #
688
+ # {
689
+ # "timestamp":1561598833416,
690
+ # "transactionId":"4156303",
691
+ # "price":10950.41,
692
+ # "amount":0.004,
693
+ # "currencyPair":"BTC_EUR",
694
+ # "tradeType":"BUY"
695
+ # }
696
+ #
697
+ marketId = self.safe_string(trade, 'currencyPair')
698
+ market = self.safe_market(marketId, market, '_')
699
+ priceString = self.safe_string(trade, 'price')
700
+ amountString = self.safe_string(trade, 'amount')
701
+ side = self.safe_string_lower_2(trade, 'type', 'tradeType')
702
+ type = self.safe_string_lower(trade, 'orderType')
703
+ orderId = self.safe_string(trade, 'orderId')
704
+ id = self.safe_string(trade, 'transactionId')
705
+ timestamp = self.safe_integer_2(trade, 'timestamp', 'createdTimestamp')
706
+ fee = None
707
+ feeCostString = self.safe_string(trade, 'fee')
708
+ if feeCostString is not None:
709
+ fee = {
710
+ 'cost': feeCostString,
711
+ 'currency': market['quote'],
712
+ }
713
+ takerOrMaker = self.safe_string(trade, 'feeType')
714
+ takerOrMaker = 'maker' if (takerOrMaker == 'MAKER') else 'taker'
715
+ return self.safe_trade({
716
+ 'id': id,
717
+ 'info': trade,
718
+ 'timestamp': timestamp,
719
+ 'datetime': self.iso8601(timestamp),
720
+ 'symbol': market['symbol'],
721
+ 'type': type,
722
+ 'side': side,
723
+ 'order': orderId,
724
+ 'takerOrMaker': takerOrMaker,
725
+ 'price': priceString,
726
+ 'amount': amountString,
727
+ 'cost': None,
728
+ 'fee': fee,
729
+ }, market)
730
+
731
+ async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
732
+ """
733
+ get the list of most recent trades for a particular symbol
734
+ :see: https://coinmate.docs.apiary.io/#reference/transactions/transactions/get
735
+ :param str symbol: unified symbol of the market to fetch trades for
736
+ :param int [since]: timestamp in ms of the earliest trade to fetch
737
+ :param int [limit]: the maximum amount of trades to fetch
738
+ :param dict [params]: extra parameters specific to the exchange API endpoint
739
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
740
+ """
741
+ await self.load_markets()
742
+ market = self.market(symbol)
743
+ request: dict = {
744
+ 'currencyPair': market['id'],
745
+ 'minutesIntoHistory': 10,
746
+ }
747
+ response = await self.publicGetTransactions(self.extend(request, params))
748
+ #
749
+ # {
750
+ # "error":false,
751
+ # "errorMessage":null,
752
+ # "data":[
753
+ # {
754
+ # "timestamp":1561598833416,
755
+ # "transactionId":"4156303",
756
+ # "price":10950.41,
757
+ # "amount":0.004,
758
+ # "currencyPair":"BTC_EUR",
759
+ # "tradeType":"BUY"
760
+ # }
761
+ # ]
762
+ # }
763
+ #
764
+ data = self.safe_list(response, 'data', [])
765
+ return self.parse_trades(data, market, since, limit)
766
+
767
+ async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
768
+ """
769
+ fetch the trading fees for a market
770
+ :see: https://coinmate.docs.apiary.io/#reference/trader-fees/get-trading-fees/post
771
+ :param str symbol: unified market symbol
772
+ :param dict [params]: extra parameters specific to the exchange API endpoint
773
+ :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
774
+ """
775
+ await self.load_markets()
776
+ market = self.market(symbol)
777
+ request: dict = {
778
+ 'currencyPair': market['id'],
779
+ }
780
+ response = await self.privatePostTraderFees(self.extend(request, params))
781
+ #
782
+ # {
783
+ # "error": False,
784
+ # "errorMessage": null,
785
+ # "data": {maker: '0.3', taker: "0.35", timestamp: "1646253217815"}
786
+ # }
787
+ #
788
+ data = self.safe_value(response, 'data', {})
789
+ makerString = self.safe_string(data, 'maker')
790
+ takerString = self.safe_string(data, 'taker')
791
+ maker = self.parse_number(Precise.string_div(makerString, '100'))
792
+ taker = self.parse_number(Precise.string_div(takerString, '100'))
793
+ return {
794
+ 'info': data,
795
+ 'symbol': market['symbol'],
796
+ 'maker': maker,
797
+ 'taker': taker,
798
+ 'percentage': True,
799
+ 'tierBased': True,
800
+ }
801
+
802
+ async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
803
+ """
804
+ fetch all unfilled currently open orders
805
+ :see: https://coinmate.docs.apiary.io/#reference/order/get-open-orders/post
806
+ :param str symbol: unified market symbol
807
+ :param int [since]: the earliest time in ms to fetch open orders for
808
+ :param int [limit]: the maximum number of open orders structures to retrieve
809
+ :param dict [params]: extra parameters specific to the exchange API endpoint
810
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
811
+ """
812
+ response = await self.privatePostOpenOrders(self.extend({}, params))
813
+ extension: dict = {'status': 'open'}
814
+ return self.parse_orders(response['data'], None, since, limit, extension)
815
+
816
+ async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
817
+ """
818
+ fetches information on multiple orders made by the user
819
+ :see: https://coinmate.docs.apiary.io/#reference/order/order-history/post
820
+ :param str symbol: unified market symbol of the market orders were made in
821
+ :param int [since]: the earliest time in ms to fetch orders for
822
+ :param int [limit]: the maximum number of order structures to retrieve
823
+ :param dict [params]: extra parameters specific to the exchange API endpoint
824
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
825
+ """
826
+ if symbol is None:
827
+ raise ArgumentsRequired(self.id + ' fetchOrders() requires a symbol argument')
828
+ await self.load_markets()
829
+ market = self.market(symbol)
830
+ request: dict = {
831
+ 'currencyPair': market['id'],
832
+ }
833
+ # offset param that appears in other parts of the API doesn't appear to be supported here
834
+ if limit is not None:
835
+ request['limit'] = limit
836
+ response = await self.privatePostOrderHistory(self.extend(request, params))
837
+ return self.parse_orders(response['data'], market, since, limit)
838
+
839
+ def parse_order_status(self, status: Str):
840
+ statuses: dict = {
841
+ 'FILLED': 'closed',
842
+ 'CANCELLED': 'canceled',
843
+ 'PARTIALLY_FILLED': 'open',
844
+ 'OPEN': 'open',
845
+ }
846
+ return self.safe_string(statuses, status, status)
847
+
848
+ def parse_order_type(self, type: Str):
849
+ types: dict = {
850
+ 'LIMIT': 'limit',
851
+ 'MARKET': 'market',
852
+ }
853
+ return self.safe_string(types, type, type)
854
+
855
+ def parse_order(self, order: dict, market: Market = None) -> Order:
856
+ #
857
+ # limit sell
858
+ #
859
+ # {
860
+ # "id": 781246605,
861
+ # "timestamp": 1584480015133,
862
+ # "trailingUpdatedTimestamp": null,
863
+ # "type": "SELL",
864
+ # "currencyPair": "ETH_BTC",
865
+ # "price": 0.0345,
866
+ # "amount": 0.01,
867
+ # "stopPrice": null,
868
+ # "originalStopPrice": null,
869
+ # "marketPriceAtLastUpdate": null,
870
+ # "marketPriceAtOrderCreation": null,
871
+ # "orderTradeType": "LIMIT",
872
+ # "hidden": False,
873
+ # "trailing": False,
874
+ # "clientOrderId": null
875
+ # }
876
+ #
877
+ # limit buy
878
+ #
879
+ # {
880
+ # "id": 67527001,
881
+ # "timestamp": 1517931722613,
882
+ # "trailingUpdatedTimestamp": null,
883
+ # "type": "BUY",
884
+ # "price": 5897.24,
885
+ # "remainingAmount": 0.002367,
886
+ # "originalAmount": 0.1,
887
+ # "stopPrice": null,
888
+ # "originalStopPrice": null,
889
+ # "marketPriceAtLastUpdate": null,
890
+ # "marketPriceAtOrderCreation": null,
891
+ # "status": "CANCELLED",
892
+ # "orderTradeType": "LIMIT",
893
+ # "hidden": False,
894
+ # "avgPrice": null,
895
+ # "trailing": False,
896
+ # }
897
+ #
898
+ # cancelOrder
899
+ #
900
+ # {
901
+ # "success": True,
902
+ # "remainingAmount": 0.1
903
+ # }
904
+ #
905
+ id = self.safe_string(order, 'id')
906
+ timestamp = self.safe_integer(order, 'timestamp')
907
+ side = self.safe_string_lower(order, 'type')
908
+ priceString = self.safe_string(order, 'price')
909
+ amountString = self.safe_string(order, 'originalAmount')
910
+ remainingString = self.safe_string_2(order, 'remainingAmount', 'amount')
911
+ status = self.parse_order_status(self.safe_string(order, 'status'))
912
+ type = self.parse_order_type(self.safe_string(order, 'orderTradeType'))
913
+ averageString = self.safe_string(order, 'avgPrice')
914
+ marketId = self.safe_string(order, 'currencyPair')
915
+ symbol = self.safe_symbol(marketId, market, '_')
916
+ clientOrderId = self.safe_string(order, 'clientOrderId')
917
+ stopPrice = self.safe_number(order, 'stopPrice')
918
+ return self.safe_order({
919
+ 'id': id,
920
+ 'clientOrderId': clientOrderId,
921
+ 'timestamp': timestamp,
922
+ 'datetime': self.iso8601(timestamp),
923
+ 'lastTradeTimestamp': None,
924
+ 'symbol': symbol,
925
+ 'type': type,
926
+ 'timeInForce': None,
927
+ 'postOnly': None,
928
+ 'side': side,
929
+ 'price': priceString,
930
+ 'stopPrice': stopPrice,
931
+ 'triggerPrice': stopPrice,
932
+ 'amount': amountString,
933
+ 'cost': None,
934
+ 'average': averageString,
935
+ 'filled': None,
936
+ 'remaining': remainingString,
937
+ 'status': status,
938
+ 'trades': None,
939
+ 'info': order,
940
+ 'fee': None,
941
+ }, market)
942
+
943
+ async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
944
+ """
945
+ create a trade order
946
+ :see: https://coinmate.docs.apiary.io/#reference/order/buy-limit-order/post
947
+ :see: https://coinmate.docs.apiary.io/#reference/order/sell-limit-order/post
948
+ :see: https://coinmate.docs.apiary.io/#reference/order/buy-instant-order/post
949
+ :see: https://coinmate.docs.apiary.io/#reference/order/sell-instant-order/post
950
+ :param str symbol: unified symbol of the market to create an order in
951
+ :param str type: 'market' or 'limit'
952
+ :param str side: 'buy' or 'sell'
953
+ :param float amount: how much of currency you want to trade in units of base currency
954
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
955
+ :param dict [params]: extra parameters specific to the exchange API endpoint
956
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
957
+ """
958
+ await self.load_markets()
959
+ method = 'privatePost' + self.capitalize(side)
960
+ market = self.market(symbol)
961
+ request: dict = {
962
+ 'currencyPair': market['id'],
963
+ }
964
+ if type == 'market':
965
+ if side == 'buy':
966
+ request['total'] = self.amount_to_precision(symbol, amount) # amount in fiat
967
+ else:
968
+ request['amount'] = self.amount_to_precision(symbol, amount) # amount in fiat
969
+ method += 'Instant'
970
+ else:
971
+ request['amount'] = self.amount_to_precision(symbol, amount) # amount in crypto
972
+ request['price'] = self.price_to_precision(symbol, price)
973
+ method += self.capitalize(type)
974
+ response = await getattr(self, method)(self.extend(request, params))
975
+ id = self.safe_string(response, 'data')
976
+ return self.safe_order({
977
+ 'info': response,
978
+ 'id': id,
979
+ }, market)
980
+
981
+ async def fetch_order(self, id: str, symbol: Str = None, params={}):
982
+ """
983
+ fetches information on an order made by the user
984
+ :see: https://coinmate.docs.apiary.io/#reference/order/get-order-by-orderid/post
985
+ :see: https://coinmate.docs.apiary.io/#reference/order/get-order-by-clientorderid/post
986
+ :param str symbol: unified symbol of the market the order was made in
987
+ :param dict [params]: extra parameters specific to the exchange API endpoint
988
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
989
+ """
990
+ await self.load_markets()
991
+ request: dict = {
992
+ 'orderId': id,
993
+ }
994
+ market = None
995
+ if symbol:
996
+ market = self.market(symbol)
997
+ response = await self.privatePostOrderById(self.extend(request, params))
998
+ data = self.safe_dict(response, 'data')
999
+ return self.parse_order(data, market)
1000
+
1001
+ async def cancel_order(self, id: str, symbol: Str = None, params={}):
1002
+ """
1003
+ cancels an open order
1004
+ :see: https://coinmate.docs.apiary.io/#reference/order/cancel-order/post
1005
+ :param str id: order id
1006
+ :param str symbol: not used by coinmate cancelOrder()
1007
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1008
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1009
+ """
1010
+ # {"error":false,"errorMessage":null,"data":{"success":true,"remainingAmount":0.01}}
1011
+ request: dict = {'orderId': id}
1012
+ response = await self.privatePostCancelOrderWithInfo(self.extend(request, params))
1013
+ #
1014
+ # {
1015
+ # "error": False,
1016
+ # "errorMessage": null,
1017
+ # "data": {
1018
+ # "success": True,
1019
+ # "remainingAmount": 0.1
1020
+ # }
1021
+ # }
1022
+ #
1023
+ data = self.safe_dict(response, 'data')
1024
+ return self.parse_order(data)
1025
+
1026
+ def nonce(self):
1027
+ return self.milliseconds()
1028
+
1029
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1030
+ url = self.urls['api']['rest'] + '/' + path
1031
+ if api == 'public':
1032
+ if params:
1033
+ url += '?' + self.urlencode(params)
1034
+ else:
1035
+ self.check_required_credentials()
1036
+ nonce = str(self.nonce())
1037
+ auth = nonce + self.uid + self.apiKey
1038
+ signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
1039
+ body = self.urlencode(self.extend({
1040
+ 'clientId': self.uid,
1041
+ 'nonce': nonce,
1042
+ 'publicKey': self.apiKey,
1043
+ 'signature': signature.upper(),
1044
+ }, params))
1045
+ headers = {
1046
+ 'Content-Type': 'application/x-www-form-urlencoded',
1047
+ }
1048
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1049
+
1050
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1051
+ if response is not None:
1052
+ if 'error' in response:
1053
+ # {"error":true,"errorMessage":"Minimum Order Size 0.01 ETH","data":null}
1054
+ if response['error']:
1055
+ message = self.safe_string(response, 'errorMessage')
1056
+ feedback = self.id + ' ' + message
1057
+ self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
1058
+ self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
1059
+ raise ExchangeError(self.id + ' ' + self.json(response))
1060
+ if code > 400:
1061
+ if body:
1062
+ feedback = self.id + ' ' + body
1063
+ self.throw_exactly_matched_exception(self.exceptions['exact'], body, feedback)
1064
+ self.throw_broadly_matched_exception(self.exceptions['broad'], body, feedback)
1065
+ raise ExchangeError(feedback) # unknown message
1066
+ raise ExchangeError(self.id + ' ' + body)
1067
+ return None