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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (772) hide show
  1. ccxt/__init__.py +358 -0
  2. ccxt/abantether.py +316 -0
  3. ccxt/abstract/__init__.py +0 -0
  4. ccxt/abstract/abantether.py +5 -0
  5. ccxt/abstract/ace.py +15 -0
  6. ccxt/abstract/afratether.py +6 -0
  7. ccxt/abstract/alpaca.py +70 -0
  8. ccxt/abstract/arzinja.py +5 -0
  9. ccxt/abstract/arzplus.py +7 -0
  10. ccxt/abstract/ascendex.py +77 -0
  11. ccxt/abstract/bequant.py +115 -0
  12. ccxt/abstract/bigone.py +45 -0
  13. ccxt/abstract/binance.py +712 -0
  14. ccxt/abstract/binancecoinm.py +712 -0
  15. ccxt/abstract/binanceus.py +764 -0
  16. ccxt/abstract/binanceusdm.py +712 -0
  17. ccxt/abstract/bingx.py +113 -0
  18. ccxt/abstract/bit2c.py +27 -0
  19. ccxt/abstract/bitbank.py +27 -0
  20. ccxt/abstract/bitbay.py +53 -0
  21. ccxt/abstract/bitbns.py +40 -0
  22. ccxt/abstract/bitcoincom.py +115 -0
  23. ccxt/abstract/bitfinex.py +69 -0
  24. ccxt/abstract/bitfinex2.py +139 -0
  25. ccxt/abstract/bitflyer.py +38 -0
  26. ccxt/abstract/bitget.py +508 -0
  27. ccxt/abstract/bithumb.py +32 -0
  28. ccxt/abstract/bitimen.py +7 -0
  29. ccxt/abstract/bitir.py +7 -0
  30. ccxt/abstract/bitmart.py +99 -0
  31. ccxt/abstract/bitmex.py +97 -0
  32. ccxt/abstract/bitopro.py +29 -0
  33. ccxt/abstract/bitpanda.py +35 -0
  34. ccxt/abstract/bitpin.py +7 -0
  35. ccxt/abstract/bitrue.py +72 -0
  36. ccxt/abstract/bitso.py +43 -0
  37. ccxt/abstract/bitstamp.py +258 -0
  38. ccxt/abstract/bitteam.py +29 -0
  39. ccxt/abstract/bitvavo.py +27 -0
  40. ccxt/abstract/bl3p.py +19 -0
  41. ccxt/abstract/blockchaincom.py +28 -0
  42. ccxt/abstract/blofin.py +37 -0
  43. ccxt/abstract/btcalpha.py +18 -0
  44. ccxt/abstract/btcbox.py +13 -0
  45. ccxt/abstract/btcmarkets.py +39 -0
  46. ccxt/abstract/btcturk.py +20 -0
  47. ccxt/abstract/bybit.py +298 -0
  48. ccxt/abstract/cex.py +33 -0
  49. ccxt/abstract/coinbase.py +94 -0
  50. ccxt/abstract/coinbaseadvanced.py +94 -0
  51. ccxt/abstract/coinbaseexchange.py +67 -0
  52. ccxt/abstract/coinbaseinternational.py +39 -0
  53. ccxt/abstract/coincatch.py +94 -0
  54. ccxt/abstract/coincheck.py +33 -0
  55. ccxt/abstract/coinex.py +237 -0
  56. ccxt/abstract/coinlist.py +54 -0
  57. ccxt/abstract/coinmate.py +62 -0
  58. ccxt/abstract/coinmetro.py +34 -0
  59. ccxt/abstract/coinone.py +67 -0
  60. ccxt/abstract/coinsph.py +54 -0
  61. ccxt/abstract/coinspot.py +28 -0
  62. ccxt/abstract/cryptocom.py +107 -0
  63. ccxt/abstract/currencycom.py +68 -0
  64. ccxt/abstract/delta.py +50 -0
  65. ccxt/abstract/deribit.py +125 -0
  66. ccxt/abstract/digifinex.py +91 -0
  67. ccxt/abstract/eterex.py +5 -0
  68. ccxt/abstract/excoino.py +7 -0
  69. ccxt/abstract/exir.py +8 -0
  70. ccxt/abstract/exmo.py +55 -0
  71. ccxt/abstract/exnovin.py +6 -0
  72. ccxt/abstract/farhadexchange.py +5 -0
  73. ccxt/abstract/fmfwio.py +115 -0
  74. ccxt/abstract/gate.py +265 -0
  75. ccxt/abstract/gateio.py +265 -0
  76. ccxt/abstract/gemini.py +58 -0
  77. ccxt/abstract/hashkey.py +67 -0
  78. ccxt/abstract/hitbtc.py +115 -0
  79. ccxt/abstract/hitbtc3.py +115 -0
  80. ccxt/abstract/hitobit.py +8 -0
  81. ccxt/abstract/hollaex.py +33 -0
  82. ccxt/abstract/htx.py +548 -0
  83. ccxt/abstract/huobi.py +548 -0
  84. ccxt/abstract/huobijp.py +114 -0
  85. ccxt/abstract/hyperliquid.py +6 -0
  86. ccxt/abstract/idex.py +26 -0
  87. ccxt/abstract/independentreserve.py +37 -0
  88. ccxt/abstract/indodax.py +26 -0
  89. ccxt/abstract/jibitex.py +7 -0
  90. ccxt/abstract/kraken.py +57 -0
  91. ccxt/abstract/krakenfutures.py +38 -0
  92. ccxt/abstract/kucoin.py +214 -0
  93. ccxt/abstract/kucoinfutures.py +233 -0
  94. ccxt/abstract/kuna.py +182 -0
  95. ccxt/abstract/latoken.py +56 -0
  96. ccxt/abstract/lbank.py +61 -0
  97. ccxt/abstract/luno.py +37 -0
  98. ccxt/abstract/lykke.py +29 -0
  99. ccxt/abstract/mercado.py +25 -0
  100. ccxt/abstract/mexc.py +178 -0
  101. ccxt/abstract/ndax.py +97 -0
  102. ccxt/abstract/nobitex.py +7 -0
  103. ccxt/abstract/novadax.py +29 -0
  104. ccxt/abstract/oceanex.py +22 -0
  105. ccxt/abstract/okcoin.py +74 -0
  106. ccxt/abstract/okexchange.py +8 -0
  107. ccxt/abstract/okx.py +324 -0
  108. ccxt/abstract/ompfinex.py +7 -0
  109. ccxt/abstract/onetrading.py +35 -0
  110. ccxt/abstract/oxfun.py +34 -0
  111. ccxt/abstract/p2b.py +22 -0
  112. ccxt/abstract/paradex.py +40 -0
  113. ccxt/abstract/paymium.py +28 -0
  114. ccxt/abstract/phemex.py +115 -0
  115. ccxt/abstract/poloniex.py +69 -0
  116. ccxt/abstract/poloniexfutures.py +48 -0
  117. ccxt/abstract/probit.py +23 -0
  118. ccxt/abstract/ramzinex.py +7 -0
  119. ccxt/abstract/sarmayex.py +5 -0
  120. ccxt/abstract/sarrafex.py +7 -0
  121. ccxt/abstract/tabdeal.py +7 -0
  122. ccxt/abstract/tetherland.py +5 -0
  123. ccxt/abstract/timex.py +62 -0
  124. ccxt/abstract/tokocrypto.py +37 -0
  125. ccxt/abstract/tradeogre.py +16 -0
  126. ccxt/abstract/twox.py +5 -0
  127. ccxt/abstract/ubitex.py +7 -0
  128. ccxt/abstract/upbit.py +38 -0
  129. ccxt/abstract/vertex.py +19 -0
  130. ccxt/abstract/wallex.py +8 -0
  131. ccxt/abstract/wavesexchange.py +154 -0
  132. ccxt/abstract/wazirx.py +30 -0
  133. ccxt/abstract/whitebit.py +98 -0
  134. ccxt/abstract/woo.py +83 -0
  135. ccxt/abstract/woofipro.py +119 -0
  136. ccxt/abstract/xt.py +152 -0
  137. ccxt/abstract/yobit.py +16 -0
  138. ccxt/abstract/zaif.py +38 -0
  139. ccxt/abstract/zonda.py +53 -0
  140. ccxt/ace.py +1012 -0
  141. ccxt/afratether.py +293 -0
  142. ccxt/alpaca.py +1083 -0
  143. ccxt/arzinja.py +285 -0
  144. ccxt/arzplus.py +412 -0
  145. ccxt/ascendex.py +3330 -0
  146. ccxt/async_support/__init__.py +337 -0
  147. ccxt/async_support/abantether.py +316 -0
  148. ccxt/async_support/ace.py +1012 -0
  149. ccxt/async_support/afratether.py +293 -0
  150. ccxt/async_support/alpaca.py +1083 -0
  151. ccxt/async_support/arzinja.py +285 -0
  152. ccxt/async_support/arzplus.py +412 -0
  153. ccxt/async_support/ascendex.py +3330 -0
  154. ccxt/async_support/base/__init__.py +1 -0
  155. ccxt/async_support/base/exchange.py +1966 -0
  156. ccxt/async_support/base/throttler.py +50 -0
  157. ccxt/async_support/base/ws/__init__.py +38 -0
  158. ccxt/async_support/base/ws/aiohttp_client.py +125 -0
  159. ccxt/async_support/base/ws/cache.py +212 -0
  160. ccxt/async_support/base/ws/client.py +193 -0
  161. ccxt/async_support/base/ws/fast_client.py +96 -0
  162. ccxt/async_support/base/ws/functions.py +59 -0
  163. ccxt/async_support/base/ws/future.py +58 -0
  164. ccxt/async_support/base/ws/order_book.py +78 -0
  165. ccxt/async_support/base/ws/order_book_side.py +174 -0
  166. ccxt/async_support/bequant.py +33 -0
  167. ccxt/async_support/bigone.py +2113 -0
  168. ccxt/async_support/binance.py +12234 -0
  169. ccxt/async_support/binancecoinm.py +45 -0
  170. ccxt/async_support/binanceus.py +211 -0
  171. ccxt/async_support/binanceusdm.py +58 -0
  172. ccxt/async_support/bingx.py +4325 -0
  173. ccxt/async_support/bit2c.py +866 -0
  174. ccxt/async_support/bitbank.py +1001 -0
  175. ccxt/async_support/bitbay.py +17 -0
  176. ccxt/async_support/bitbns.py +1154 -0
  177. ccxt/async_support/bitcoincom.py +17 -0
  178. ccxt/async_support/bitfinex.py +1617 -0
  179. ccxt/async_support/bitfinex2.py +3552 -0
  180. ccxt/async_support/bitflyer.py +995 -0
  181. ccxt/async_support/bitget.py +8273 -0
  182. ccxt/async_support/bithumb.py +1061 -0
  183. ccxt/async_support/bitimen.py +401 -0
  184. ccxt/async_support/bitir.py +490 -0
  185. ccxt/async_support/bitmart.py +4415 -0
  186. ccxt/async_support/bitmex.py +2756 -0
  187. ccxt/async_support/bitopro.py +1630 -0
  188. ccxt/async_support/bitpanda.py +16 -0
  189. ccxt/async_support/bitpin.py +454 -0
  190. ccxt/async_support/bitrue.py +3027 -0
  191. ccxt/async_support/bitso.py +1670 -0
  192. ccxt/async_support/bitstamp.py +2203 -0
  193. ccxt/async_support/bitteam.py +2239 -0
  194. ccxt/async_support/bitvavo.py +1968 -0
  195. ccxt/async_support/bl3p.py +485 -0
  196. ccxt/async_support/blockchaincom.py +1104 -0
  197. ccxt/async_support/blofin.py +2066 -0
  198. ccxt/async_support/btcalpha.py +891 -0
  199. ccxt/async_support/btcbox.py +544 -0
  200. ccxt/async_support/btcmarkets.py +1221 -0
  201. ccxt/async_support/btcturk.py +911 -0
  202. ccxt/async_support/bybit.py +8159 -0
  203. ccxt/async_support/cex.py +1605 -0
  204. ccxt/async_support/coinbase.py +4475 -0
  205. ccxt/async_support/coinbaseadvanced.py +17 -0
  206. ccxt/async_support/coinbaseexchange.py +1734 -0
  207. ccxt/async_support/coinbaseinternational.py +1899 -0
  208. ccxt/async_support/coincatch.py +5069 -0
  209. ccxt/async_support/coincheck.py +815 -0
  210. ccxt/async_support/coinex.py +5526 -0
  211. ccxt/async_support/coinlist.py +2243 -0
  212. ccxt/async_support/coinmate.py +1067 -0
  213. ccxt/async_support/coinmetro.py +1797 -0
  214. ccxt/async_support/coinone.py +1127 -0
  215. ccxt/async_support/coinsph.py +1850 -0
  216. ccxt/async_support/coinspot.py +534 -0
  217. ccxt/async_support/cryptocom.py +2822 -0
  218. ccxt/async_support/currencycom.py +1950 -0
  219. ccxt/async_support/delta.py +3376 -0
  220. ccxt/async_support/deribit.py +3437 -0
  221. ccxt/async_support/digifinex.py +3960 -0
  222. ccxt/async_support/eterex.py +286 -0
  223. ccxt/async_support/excoino.py +399 -0
  224. ccxt/async_support/exir.py +375 -0
  225. ccxt/async_support/exmo.py +2462 -0
  226. ccxt/async_support/exnovin.py +360 -0
  227. ccxt/async_support/farhadexchange.py +266 -0
  228. ccxt/async_support/fmfwio.py +34 -0
  229. ccxt/async_support/gate.py +6976 -0
  230. ccxt/async_support/gateio.py +16 -0
  231. ccxt/async_support/gemini.py +1825 -0
  232. ccxt/async_support/hashkey.py +4150 -0
  233. ccxt/async_support/hitbtc.py +3423 -0
  234. ccxt/async_support/hitbtc3.py +16 -0
  235. ccxt/async_support/hitobit.py +391 -0
  236. ccxt/async_support/hollaex.py +1813 -0
  237. ccxt/async_support/htx.py +8506 -0
  238. ccxt/async_support/huobi.py +16 -0
  239. ccxt/async_support/huobijp.py +1801 -0
  240. ccxt/async_support/hyperliquid.py +2431 -0
  241. ccxt/async_support/idex.py +1766 -0
  242. ccxt/async_support/independentreserve.py +784 -0
  243. ccxt/async_support/indodax.py +1247 -0
  244. ccxt/async_support/jibitex.py +395 -0
  245. ccxt/async_support/kraken.py +2894 -0
  246. ccxt/async_support/krakenfutures.py +2601 -0
  247. ccxt/async_support/kucoin.py +4602 -0
  248. ccxt/async_support/kucoinfutures.py +2698 -0
  249. ccxt/async_support/kuna.py +1841 -0
  250. ccxt/async_support/latoken.py +1664 -0
  251. ccxt/async_support/lbank.py +2683 -0
  252. ccxt/async_support/luno.py +1067 -0
  253. ccxt/async_support/lykke.py +1270 -0
  254. ccxt/async_support/mercado.py +842 -0
  255. ccxt/async_support/mexc.py +5369 -0
  256. ccxt/async_support/ndax.py +2354 -0
  257. ccxt/async_support/nobitex.py +419 -0
  258. ccxt/async_support/novadax.py +1484 -0
  259. ccxt/async_support/oceanex.py +903 -0
  260. ccxt/async_support/okcoin.py +2936 -0
  261. ccxt/async_support/okexchange.py +349 -0
  262. ccxt/async_support/okx.py +7827 -0
  263. ccxt/async_support/ompfinex.py +472 -0
  264. ccxt/async_support/onetrading.py +1911 -0
  265. ccxt/async_support/oxfun.py +2773 -0
  266. ccxt/async_support/p2b.py +1194 -0
  267. ccxt/async_support/paradex.py +2015 -0
  268. ccxt/async_support/paymium.py +564 -0
  269. ccxt/async_support/phemex.py +4473 -0
  270. ccxt/async_support/poloniex.py +2232 -0
  271. ccxt/async_support/poloniexfutures.py +1717 -0
  272. ccxt/async_support/probit.py +1734 -0
  273. ccxt/async_support/ramzinex.py +476 -0
  274. ccxt/async_support/sarmayex.py +357 -0
  275. ccxt/async_support/sarrafex.py +478 -0
  276. ccxt/async_support/tabdeal.py +364 -0
  277. ccxt/async_support/tetherland.py +349 -0
  278. ccxt/async_support/timex.py +1593 -0
  279. ccxt/async_support/tokocrypto.py +2405 -0
  280. ccxt/async_support/tradeogre.py +608 -0
  281. ccxt/async_support/twox.py +326 -0
  282. ccxt/async_support/ubitex.py +409 -0
  283. ccxt/async_support/upbit.py +1833 -0
  284. ccxt/async_support/vertex.py +2922 -0
  285. ccxt/async_support/wallex.py +445 -0
  286. ccxt/async_support/wavesexchange.py +2473 -0
  287. ccxt/async_support/wazirx.py +1224 -0
  288. ccxt/async_support/whitebit.py +2469 -0
  289. ccxt/async_support/woo.py +3114 -0
  290. ccxt/async_support/woofipro.py +2533 -0
  291. ccxt/async_support/xt.py +4454 -0
  292. ccxt/async_support/yobit.py +1283 -0
  293. ccxt/async_support/zaif.py +725 -0
  294. ccxt/async_support/zonda.py +1828 -0
  295. ccxt/base/__init__.py +27 -0
  296. ccxt/base/decimal_to_precision.py +174 -0
  297. ccxt/base/errors.py +242 -0
  298. ccxt/base/exchange.py +5941 -0
  299. ccxt/base/precise.py +287 -0
  300. ccxt/base/types.py +502 -0
  301. ccxt/bequant.py +33 -0
  302. ccxt/bigone.py +2112 -0
  303. ccxt/binance.py +12233 -0
  304. ccxt/binancecoinm.py +45 -0
  305. ccxt/binanceus.py +211 -0
  306. ccxt/binanceusdm.py +58 -0
  307. ccxt/bingx.py +4324 -0
  308. ccxt/bit2c.py +866 -0
  309. ccxt/bitbank.py +1001 -0
  310. ccxt/bitbay.py +17 -0
  311. ccxt/bitbns.py +1154 -0
  312. ccxt/bitcoincom.py +17 -0
  313. ccxt/bitfinex.py +1617 -0
  314. ccxt/bitfinex2.py +3552 -0
  315. ccxt/bitflyer.py +995 -0
  316. ccxt/bitget.py +8272 -0
  317. ccxt/bithumb.py +1061 -0
  318. ccxt/bitimen.py +401 -0
  319. ccxt/bitir.py +490 -0
  320. ccxt/bitmart.py +4415 -0
  321. ccxt/bitmex.py +2756 -0
  322. ccxt/bitopro.py +1630 -0
  323. ccxt/bitpanda.py +16 -0
  324. ccxt/bitpin.py +454 -0
  325. ccxt/bitrue.py +3026 -0
  326. ccxt/bitso.py +1670 -0
  327. ccxt/bitstamp.py +2203 -0
  328. ccxt/bitteam.py +2239 -0
  329. ccxt/bitvavo.py +1968 -0
  330. ccxt/bl3p.py +485 -0
  331. ccxt/blockchaincom.py +1104 -0
  332. ccxt/blofin.py +2066 -0
  333. ccxt/btcalpha.py +891 -0
  334. ccxt/btcbox.py +544 -0
  335. ccxt/btcmarkets.py +1221 -0
  336. ccxt/btcturk.py +911 -0
  337. ccxt/bybit.py +8158 -0
  338. ccxt/cex.py +1605 -0
  339. ccxt/coinbase.py +4474 -0
  340. ccxt/coinbaseadvanced.py +17 -0
  341. ccxt/coinbaseexchange.py +1734 -0
  342. ccxt/coinbaseinternational.py +1899 -0
  343. ccxt/coincatch.py +5069 -0
  344. ccxt/coincheck.py +815 -0
  345. ccxt/coinex.py +5525 -0
  346. ccxt/coinlist.py +2243 -0
  347. ccxt/coinmate.py +1067 -0
  348. ccxt/coinmetro.py +1797 -0
  349. ccxt/coinone.py +1127 -0
  350. ccxt/coinsph.py +1850 -0
  351. ccxt/coinspot.py +534 -0
  352. ccxt/cryptocom.py +2822 -0
  353. ccxt/currencycom.py +1950 -0
  354. ccxt/delta.py +3376 -0
  355. ccxt/deribit.py +3437 -0
  356. ccxt/digifinex.py +3959 -0
  357. ccxt/eterex.py +286 -0
  358. ccxt/excoino.py +399 -0
  359. ccxt/exir.py +375 -0
  360. ccxt/exmo.py +2462 -0
  361. ccxt/exnovin.py +360 -0
  362. ccxt/farhadexchange.py +266 -0
  363. ccxt/fmfwio.py +34 -0
  364. ccxt/gate.py +6975 -0
  365. ccxt/gateio.py +16 -0
  366. ccxt/gemini.py +1824 -0
  367. ccxt/hashkey.py +4150 -0
  368. ccxt/hitbtc.py +3423 -0
  369. ccxt/hitbtc3.py +16 -0
  370. ccxt/hitobit.py +391 -0
  371. ccxt/hollaex.py +1813 -0
  372. ccxt/htx.py +8505 -0
  373. ccxt/huobi.py +16 -0
  374. ccxt/huobijp.py +1801 -0
  375. ccxt/hyperliquid.py +2430 -0
  376. ccxt/idex.py +1766 -0
  377. ccxt/independentreserve.py +784 -0
  378. ccxt/indodax.py +1247 -0
  379. ccxt/jibitex.py +395 -0
  380. ccxt/kraken.py +2894 -0
  381. ccxt/krakenfutures.py +2601 -0
  382. ccxt/kucoin.py +4601 -0
  383. ccxt/kucoinfutures.py +2698 -0
  384. ccxt/kuna.py +1841 -0
  385. ccxt/latoken.py +1664 -0
  386. ccxt/lbank.py +2682 -0
  387. ccxt/luno.py +1067 -0
  388. ccxt/lykke.py +1270 -0
  389. ccxt/mercado.py +842 -0
  390. ccxt/mexc.py +5369 -0
  391. ccxt/ndax.py +2354 -0
  392. ccxt/nobitex.py +419 -0
  393. ccxt/novadax.py +1484 -0
  394. ccxt/oceanex.py +903 -0
  395. ccxt/okcoin.py +2936 -0
  396. ccxt/okexchange.py +349 -0
  397. ccxt/okx.py +7826 -0
  398. ccxt/ompfinex.py +472 -0
  399. ccxt/onetrading.py +1911 -0
  400. ccxt/oxfun.py +2772 -0
  401. ccxt/p2b.py +1194 -0
  402. ccxt/paradex.py +2015 -0
  403. ccxt/paymium.py +564 -0
  404. ccxt/phemex.py +4473 -0
  405. ccxt/poloniex.py +2232 -0
  406. ccxt/poloniexfutures.py +1717 -0
  407. ccxt/pro/__init__.py +149 -0
  408. ccxt/pro/alpaca.py +685 -0
  409. ccxt/pro/ascendex.py +916 -0
  410. ccxt/pro/bequant.py +38 -0
  411. ccxt/pro/binance.py +3488 -0
  412. ccxt/pro/binancecoinm.py +28 -0
  413. ccxt/pro/binanceus.py +48 -0
  414. ccxt/pro/binanceusdm.py +31 -0
  415. ccxt/pro/bingx.py +1264 -0
  416. ccxt/pro/bitcoincom.py +34 -0
  417. ccxt/pro/bitfinex.py +621 -0
  418. ccxt/pro/bitfinex2.py +1083 -0
  419. ccxt/pro/bitget.py +1692 -0
  420. ccxt/pro/bithumb.py +368 -0
  421. ccxt/pro/bitmart.py +1449 -0
  422. ccxt/pro/bitmex.py +1656 -0
  423. ccxt/pro/bitopro.py +445 -0
  424. ccxt/pro/bitpanda.py +15 -0
  425. ccxt/pro/bitrue.py +447 -0
  426. ccxt/pro/bitstamp.py +522 -0
  427. ccxt/pro/bitvavo.py +1270 -0
  428. ccxt/pro/blockchaincom.py +738 -0
  429. ccxt/pro/blofin.py +692 -0
  430. ccxt/pro/bybit.py +2000 -0
  431. ccxt/pro/cex.py +1440 -0
  432. ccxt/pro/coinbase.py +678 -0
  433. ccxt/pro/coinbaseadvanced.py +16 -0
  434. ccxt/pro/coinbaseexchange.py +895 -0
  435. ccxt/pro/coinbaseinternational.py +620 -0
  436. ccxt/pro/coincatch.py +1464 -0
  437. ccxt/pro/coincheck.py +199 -0
  438. ccxt/pro/coinex.py +1061 -0
  439. ccxt/pro/coinone.py +395 -0
  440. ccxt/pro/cryptocom.py +947 -0
  441. ccxt/pro/currencycom.py +536 -0
  442. ccxt/pro/deribit.py +892 -0
  443. ccxt/pro/exmo.py +629 -0
  444. ccxt/pro/gate.py +1416 -0
  445. ccxt/pro/gateio.py +15 -0
  446. ccxt/pro/gemini.py +865 -0
  447. ccxt/pro/hashkey.py +802 -0
  448. ccxt/pro/hitbtc.py +1216 -0
  449. ccxt/pro/hollaex.py +563 -0
  450. ccxt/pro/htx.py +2215 -0
  451. ccxt/pro/huobi.py +15 -0
  452. ccxt/pro/huobijp.py +570 -0
  453. ccxt/pro/hyperliquid.py +525 -0
  454. ccxt/pro/idex.py +672 -0
  455. ccxt/pro/independentreserve.py +270 -0
  456. ccxt/pro/kraken.py +1356 -0
  457. ccxt/pro/krakenfutures.py +1492 -0
  458. ccxt/pro/kucoin.py +1133 -0
  459. ccxt/pro/kucoinfutures.py +1081 -0
  460. ccxt/pro/lbank.py +843 -0
  461. ccxt/pro/luno.py +303 -0
  462. ccxt/pro/mexc.py +1122 -0
  463. ccxt/pro/ndax.py +506 -0
  464. ccxt/pro/okcoin.py +698 -0
  465. ccxt/pro/okx.py +1851 -0
  466. ccxt/pro/onetrading.py +1275 -0
  467. ccxt/pro/oxfun.py +950 -0
  468. ccxt/pro/p2b.py +419 -0
  469. ccxt/pro/paradex.py +352 -0
  470. ccxt/pro/phemex.py +1441 -0
  471. ccxt/pro/poloniex.py +1166 -0
  472. ccxt/pro/poloniexfutures.py +990 -0
  473. ccxt/pro/probit.py +551 -0
  474. ccxt/pro/upbit.py +520 -0
  475. ccxt/pro/vertex.py +943 -0
  476. ccxt/pro/wazirx.py +749 -0
  477. ccxt/pro/whitebit.py +864 -0
  478. ccxt/pro/woo.py +1078 -0
  479. ccxt/pro/woofipro.py +1183 -0
  480. ccxt/pro/xt.py +1067 -0
  481. ccxt/probit.py +1734 -0
  482. ccxt/ramzinex.py +476 -0
  483. ccxt/sarmayex.py +357 -0
  484. ccxt/sarrafex.py +478 -0
  485. ccxt/static_dependencies/__init__.py +1 -0
  486. ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  487. ccxt/static_dependencies/ecdsa/_version.py +520 -0
  488. ccxt/static_dependencies/ecdsa/curves.py +56 -0
  489. ccxt/static_dependencies/ecdsa/der.py +221 -0
  490. ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  491. ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  492. ccxt/static_dependencies/ecdsa/keys.py +332 -0
  493. ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  494. ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  495. ccxt/static_dependencies/ecdsa/util.py +266 -0
  496. ccxt/static_dependencies/ethereum/__init__.py +7 -0
  497. ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  498. ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  499. ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  500. ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  501. ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  502. ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  503. ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  504. ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  505. ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  506. ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  507. ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  508. ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  509. ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  510. ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  511. ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  512. ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  513. ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  514. ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  515. ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  516. ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  517. ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  518. ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  519. ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  520. ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  521. ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  522. ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  523. ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  524. ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  525. ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  526. ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  527. ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  528. ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  529. ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  530. ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  531. ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  532. ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  533. ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  534. ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  535. ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  536. ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  537. ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  538. ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  539. ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  540. ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  541. ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  542. ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  543. ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  544. ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  545. ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  546. ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  547. ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  548. ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  549. ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  550. ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  551. ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  552. ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  553. ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  554. ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  555. ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  556. ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  557. ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  558. ccxt/static_dependencies/keccak/__init__.py +3 -0
  559. ccxt/static_dependencies/keccak/keccak.py +197 -0
  560. ccxt/static_dependencies/lark/__init__.py +38 -0
  561. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  562. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  563. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  564. ccxt/static_dependencies/lark/common.py +86 -0
  565. ccxt/static_dependencies/lark/exceptions.py +292 -0
  566. ccxt/static_dependencies/lark/grammar.py +130 -0
  567. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  568. ccxt/static_dependencies/lark/indenter.py +143 -0
  569. ccxt/static_dependencies/lark/lark.py +658 -0
  570. ccxt/static_dependencies/lark/lexer.py +678 -0
  571. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  572. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  573. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  574. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  575. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  576. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  577. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  578. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  579. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  580. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  581. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  582. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  583. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  584. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  585. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  586. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  587. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  588. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  589. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  590. ccxt/static_dependencies/lark/tree.py +267 -0
  591. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  592. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  593. ccxt/static_dependencies/lark/utils.py +343 -0
  594. ccxt/static_dependencies/lark/visitors.py +596 -0
  595. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  596. ccxt/static_dependencies/marshmallow/base.py +65 -0
  597. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  598. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  599. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  600. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  601. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  602. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  603. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  604. ccxt/static_dependencies/marshmallow/types.py +12 -0
  605. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  606. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  607. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  608. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  609. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  610. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  611. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  612. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  613. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  614. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  615. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  616. ccxt/static_dependencies/msgpack/__init__.py +55 -0
  617. ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  618. ccxt/static_dependencies/msgpack/ext.py +168 -0
  619. ccxt/static_dependencies/msgpack/fallback.py +951 -0
  620. ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  621. ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  622. ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  623. ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  624. ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  625. ccxt/static_dependencies/parsimonious/utils.py +40 -0
  626. ccxt/static_dependencies/starknet/__init__.py +0 -0
  627. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  628. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  629. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  630. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  631. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  632. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  633. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  634. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  635. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  636. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  637. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  638. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  639. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  640. ccxt/static_dependencies/starknet/common.py +15 -0
  641. ccxt/static_dependencies/starknet/constants.py +39 -0
  642. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  643. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  644. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  645. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  646. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  647. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  648. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  649. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  650. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  651. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  652. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  653. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  654. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  655. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  656. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  657. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  658. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  659. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  660. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  661. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  662. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  663. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  664. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  665. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  666. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  667. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  668. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  669. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  670. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  671. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  672. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  673. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  674. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  675. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  676. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  677. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  678. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  679. ccxt/static_dependencies/starkware/__init__.py +0 -0
  680. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  681. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  682. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  683. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  684. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  685. ccxt/static_dependencies/sympy/__init__.py +0 -0
  686. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  687. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  688. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  689. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  690. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  691. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  692. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  693. ccxt/static_dependencies/toolz/__init__.py +26 -0
  694. ccxt/static_dependencies/toolz/_signatures.py +784 -0
  695. ccxt/static_dependencies/toolz/_version.py +520 -0
  696. ccxt/static_dependencies/toolz/compatibility.py +30 -0
  697. ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  698. ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  699. ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  700. ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  701. ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  702. ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  703. ccxt/static_dependencies/toolz/recipes.py +46 -0
  704. ccxt/static_dependencies/toolz/utils.py +9 -0
  705. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  706. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  707. ccxt/tabdeal.py +364 -0
  708. ccxt/test/__init__.py +3 -0
  709. ccxt/test/base/__init__.py +29 -0
  710. ccxt/test/base/test_account.py +26 -0
  711. ccxt/test/base/test_balance.py +56 -0
  712. ccxt/test/base/test_borrow_interest.py +35 -0
  713. ccxt/test/base/test_borrow_rate.py +32 -0
  714. ccxt/test/base/test_calculate_fee.py +51 -0
  715. ccxt/test/base/test_crypto.py +127 -0
  716. ccxt/test/base/test_currency.py +76 -0
  717. ccxt/test/base/test_datetime.py +109 -0
  718. ccxt/test/base/test_decimal_to_precision.py +392 -0
  719. ccxt/test/base/test_deep_extend.py +68 -0
  720. ccxt/test/base/test_deposit_withdrawal.py +50 -0
  721. ccxt/test/base/test_exchange_datetime_functions.py +76 -0
  722. ccxt/test/base/test_funding_rate_history.py +29 -0
  723. ccxt/test/base/test_last_price.py +31 -0
  724. ccxt/test/base/test_ledger_entry.py +45 -0
  725. ccxt/test/base/test_ledger_item.py +48 -0
  726. ccxt/test/base/test_leverage_tier.py +33 -0
  727. ccxt/test/base/test_liquidation.py +50 -0
  728. ccxt/test/base/test_margin_mode.py +24 -0
  729. ccxt/test/base/test_margin_modification.py +35 -0
  730. ccxt/test/base/test_market.py +193 -0
  731. ccxt/test/base/test_number.py +411 -0
  732. ccxt/test/base/test_ohlcv.py +33 -0
  733. ccxt/test/base/test_open_interest.py +32 -0
  734. ccxt/test/base/test_order.py +64 -0
  735. ccxt/test/base/test_order_book.py +69 -0
  736. ccxt/test/base/test_position.py +60 -0
  737. ccxt/test/base/test_shared_methods.py +353 -0
  738. ccxt/test/base/test_status.py +24 -0
  739. ccxt/test/base/test_throttle.py +126 -0
  740. ccxt/test/base/test_ticker.py +92 -0
  741. ccxt/test/base/test_trade.py +47 -0
  742. ccxt/test/base/test_trading_fee.py +26 -0
  743. ccxt/test/base/test_transaction.py +39 -0
  744. ccxt/test/test_async.py +1649 -0
  745. ccxt/test/test_sync.py +1648 -0
  746. ccxt/test/tests_async.py +1558 -0
  747. ccxt/test/tests_helpers.py +287 -0
  748. ccxt/test/tests_init.py +39 -0
  749. ccxt/test/tests_sync.py +1555 -0
  750. ccxt/tetherland.py +349 -0
  751. ccxt/timex.py +1593 -0
  752. ccxt/tokocrypto.py +2405 -0
  753. ccxt/tradeogre.py +608 -0
  754. ccxt/twox.py +326 -0
  755. ccxt/ubitex.py +409 -0
  756. ccxt/upbit.py +1833 -0
  757. ccxt/vertex.py +2922 -0
  758. ccxt/wallex.py +445 -0
  759. ccxt/wavesexchange.py +2472 -0
  760. ccxt/wazirx.py +1224 -0
  761. ccxt/whitebit.py +2469 -0
  762. ccxt/woo.py +3114 -0
  763. ccxt/woofipro.py +2533 -0
  764. ccxt/xt.py +4453 -0
  765. ccxt/yobit.py +1283 -0
  766. ccxt/zaif.py +725 -0
  767. ccxt/zonda.py +1828 -0
  768. ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
  769. ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
  770. ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
  771. ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
  772. ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
ccxt/btcmarkets.py ADDED
@@ -0,0 +1,1221 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ from ccxt.base.exchange import Exchange
7
+ from ccxt.abstract.btcmarkets import ImplicitAPI
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, Transaction
10
+ from typing import List
11
+ from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import ArgumentsRequired
13
+ from ccxt.base.errors import BadRequest
14
+ from ccxt.base.errors import InsufficientFunds
15
+ from ccxt.base.errors import InvalidOrder
16
+ from ccxt.base.errors import OrderNotFound
17
+ from ccxt.base.errors import DDoSProtection
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+ from ccxt.base.precise import Precise
20
+
21
+
22
+ class btcmarkets(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(btcmarkets, self).describe(), {
26
+ 'id': 'btcmarkets',
27
+ 'name': 'BTC Markets',
28
+ 'countries': ['AU'], # Australia
29
+ 'rateLimit': 1000, # market data cached for 1 second(trades cached for 2 seconds)
30
+ 'version': 'v3',
31
+ 'has': {
32
+ 'CORS': None,
33
+ 'spot': True,
34
+ 'margin': False,
35
+ 'swap': False,
36
+ 'future': False,
37
+ 'option': False,
38
+ 'addMargin': False,
39
+ 'cancelOrder': True,
40
+ 'cancelOrders': True,
41
+ 'closeAllPositions': False,
42
+ 'closePosition': False,
43
+ 'createDepositAddress': False,
44
+ 'createOrder': True,
45
+ 'createReduceOnlyOrder': False,
46
+ 'fetchBalance': True,
47
+ 'fetchBorrowRateHistories': False,
48
+ 'fetchBorrowRateHistory': False,
49
+ 'fetchClosedOrders': 'emulated',
50
+ 'fetchCrossBorrowRate': False,
51
+ 'fetchCrossBorrowRates': False,
52
+ 'fetchDepositAddress': False,
53
+ 'fetchDepositAddresses': False,
54
+ 'fetchDepositAddressesByNetwork': False,
55
+ 'fetchDeposits': True,
56
+ 'fetchDepositsWithdrawals': True,
57
+ 'fetchFundingHistory': False,
58
+ 'fetchFundingRate': False,
59
+ 'fetchFundingRateHistory': False,
60
+ 'fetchFundingRates': False,
61
+ 'fetchIndexOHLCV': False,
62
+ 'fetchIsolatedBorrowRate': False,
63
+ 'fetchIsolatedBorrowRates': False,
64
+ 'fetchLeverage': 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': True,
75
+ 'fetchPosition': False,
76
+ 'fetchPositionHistory': False,
77
+ 'fetchPositionMode': False,
78
+ 'fetchPositions': False,
79
+ 'fetchPositionsForSymbol': False,
80
+ 'fetchPositionsHistory': False,
81
+ 'fetchPositionsRisk': False,
82
+ 'fetchPremiumIndexOHLCV': False,
83
+ 'fetchTicker': True,
84
+ 'fetchTime': True,
85
+ 'fetchTrades': True,
86
+ 'fetchTransactions': 'emulated',
87
+ 'fetchWithdrawals': True,
88
+ 'reduceMargin': False,
89
+ 'setLeverage': False,
90
+ 'setMarginMode': False,
91
+ 'setPositionMode': False,
92
+ 'withdraw': True,
93
+ },
94
+ 'urls': {
95
+ 'logo': 'https://user-images.githubusercontent.com/51840849/89731817-b3fb8480-da52-11ea-817f-783b08aaf32b.jpg',
96
+ 'api': {
97
+ 'public': 'https://api.btcmarkets.net',
98
+ 'private': 'https://api.btcmarkets.net',
99
+ },
100
+ 'www': 'https://btcmarkets.net',
101
+ 'doc': [
102
+ 'https://api.btcmarkets.net/doc/v3',
103
+ 'https://github.com/BTCMarkets/API',
104
+ ],
105
+ },
106
+ 'api': {
107
+ 'public': {
108
+ 'get': [
109
+ 'markets',
110
+ 'markets/{marketId}/ticker',
111
+ 'markets/{marketId}/trades',
112
+ 'markets/{marketId}/orderbook',
113
+ 'markets/{marketId}/candles',
114
+ 'markets/tickers',
115
+ 'markets/orderbooks',
116
+ 'time',
117
+ ],
118
+ },
119
+ 'private': {
120
+ 'get': [
121
+ 'orders',
122
+ 'orders/{id}',
123
+ 'batchorders/{ids}',
124
+ 'trades',
125
+ 'trades/{id}',
126
+ 'withdrawals',
127
+ 'withdrawals/{id}',
128
+ 'deposits',
129
+ 'deposits/{id}',
130
+ 'transfers',
131
+ 'transfers/{id}',
132
+ 'addresses',
133
+ 'withdrawal-fees',
134
+ 'assets',
135
+ 'accounts/me/trading-fees',
136
+ 'accounts/me/withdrawal-limits',
137
+ 'accounts/me/balances',
138
+ 'accounts/me/transactions',
139
+ 'reports/{id}',
140
+ ],
141
+ 'post': [
142
+ 'orders',
143
+ 'batchorders',
144
+ 'withdrawals',
145
+ 'reports',
146
+ ],
147
+ 'delete': [
148
+ 'orders',
149
+ 'orders/{id}',
150
+ 'batchorders/{ids}',
151
+ ],
152
+ 'put': [
153
+ 'orders/{id}',
154
+ ],
155
+ },
156
+ },
157
+ 'timeframes': {
158
+ '1m': '1m',
159
+ '1h': '1h',
160
+ '1d': '1d',
161
+ },
162
+ 'precisionMode': TICK_SIZE,
163
+ 'exceptions': {
164
+ '3': InvalidOrder,
165
+ '6': DDoSProtection,
166
+ 'InsufficientFund': InsufficientFunds,
167
+ 'InvalidPrice': InvalidOrder,
168
+ 'InvalidAmount': InvalidOrder,
169
+ 'MissingArgument': InvalidOrder,
170
+ 'OrderAlreadyCancelled': InvalidOrder,
171
+ 'OrderNotFound': OrderNotFound,
172
+ 'OrderStatusIsFinal': InvalidOrder,
173
+ 'InvalidPaginationParameter': BadRequest,
174
+ },
175
+ 'fees': {
176
+ 'percentage': True,
177
+ 'tierBased': True,
178
+ 'maker': self.parse_number('-0.0005'),
179
+ 'taker': self.parse_number('0.0020'),
180
+ },
181
+ 'options': {
182
+ 'fees': {
183
+ 'AUD': {
184
+ 'maker': self.parse_number('0.0085'),
185
+ 'taker': self.parse_number('0.0085'),
186
+ },
187
+ },
188
+ },
189
+ })
190
+
191
+ def fetch_transactions_with_method(self, method, code: Str = None, since: Int = None, limit: Int = None, params={}):
192
+ self.load_markets()
193
+ request: dict = {}
194
+ if limit is not None:
195
+ request['limit'] = limit
196
+ if since is not None:
197
+ request['after'] = since
198
+ currency = None
199
+ if code is not None:
200
+ currency = self.currency(code)
201
+ response = getattr(self, method)(self.extend(request, params))
202
+ return self.parse_transactions(response, currency, since, limit)
203
+
204
+ def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
205
+ """
206
+ fetch history of deposits and withdrawals
207
+ :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1transfers/get
208
+ :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
209
+ :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
210
+ :param int [limit]: max number of deposit/withdrawals to return, default is None
211
+ :param dict [params]: extra parameters specific to the exchange API endpoint
212
+ :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
213
+ """
214
+ return self.fetch_transactions_with_method('privateGetTransfers', code, since, limit, params)
215
+
216
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
217
+ """
218
+ fetch all deposits made to an account
219
+ :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1deposits/get
220
+ :param str code: unified currency code
221
+ :param int [since]: the earliest time in ms to fetch deposits for
222
+ :param int [limit]: the maximum number of deposits structures to retrieve
223
+ :param dict [params]: extra parameters specific to the exchange API endpoint
224
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
225
+ """
226
+ return self.fetch_transactions_with_method('privateGetDeposits', code, since, limit, params)
227
+
228
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
229
+ """
230
+ fetch all withdrawals made from an account
231
+ :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/get
232
+ :param str code: unified currency code
233
+ :param int [since]: the earliest time in ms to fetch withdrawals for
234
+ :param int [limit]: the maximum number of withdrawals structures to retrieve
235
+ :param dict [params]: extra parameters specific to the exchange API endpoint
236
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
237
+ """
238
+ return self.fetch_transactions_with_method('privateGetWithdrawals', code, since, limit, params)
239
+
240
+ def parse_transaction_status(self, status: Str):
241
+ statuses: dict = {
242
+ 'Accepted': 'pending',
243
+ 'Pending Authorization': 'pending',
244
+ 'Complete': 'ok',
245
+ 'Cancelled': 'cancelled',
246
+ 'Failed': 'failed',
247
+ }
248
+ return self.safe_string(statuses, status, status)
249
+
250
+ def parse_transaction_type(self, type):
251
+ statuses: dict = {
252
+ 'Withdraw': 'withdrawal',
253
+ 'Deposit': 'deposit',
254
+ }
255
+ return self.safe_string(statuses, type, type)
256
+
257
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
258
+ #
259
+ # {
260
+ # "id": "6500230339",
261
+ # "assetName": "XRP",
262
+ # "amount": "500",
263
+ # "type": "Deposit",
264
+ # "creationTime": "2020-07-27T07:52:08.640000Z",
265
+ # "status": "Complete",
266
+ # "description": "RIPPLE Deposit, XRP 500",
267
+ # "fee": "0",
268
+ # "lastUpdate": "2020-07-27T07:52:08.665000Z",
269
+ # "paymentDetail": {
270
+ # "txId": "lsjflsjdfljsd",
271
+ # "address": "kjasfkjsdf?dt=873874545"
272
+ # }
273
+ # }
274
+ #
275
+ # {
276
+ # "id": "500985282",
277
+ # "assetName": "BTC",
278
+ # "amount": "0.42570126",
279
+ # "type": "Withdraw",
280
+ # "creationTime": "2017-07-29T12:49:03.931000Z",
281
+ # "status": "Complete",
282
+ # "description": "BTC withdraw from [nick-btcmarkets@snowmonkey.co.uk] to Address: 1B9DsnSYQ54VMqFHVJYdGoLMCYzFwrQzsj amount: 0.42570126 fee: 0.00000000",
283
+ # "fee": "0.0005",
284
+ # "lastUpdate": "2017-07-29T12:52:20.676000Z",
285
+ # "paymentDetail": {
286
+ # "txId": "fkjdsfjsfljsdfl",
287
+ # "address": "a;daddjas;djas"
288
+ # }
289
+ # }
290
+ #
291
+ # {
292
+ # "id": "505102262",
293
+ # "assetName": "XRP",
294
+ # "amount": "979.836",
295
+ # "type": "Deposit",
296
+ # "creationTime": "2017-07-31T08:50:01.053000Z",
297
+ # "status": "Complete",
298
+ # "description": "Ripple Deposit, X 979.8360",
299
+ # "fee": "0",
300
+ # "lastUpdate": "2017-07-31T08:50:01.290000Z"
301
+ # }
302
+ #
303
+ timestamp = self.parse8601(self.safe_string(transaction, 'creationTime'))
304
+ lastUpdate = self.parse8601(self.safe_string(transaction, 'lastUpdate'))
305
+ type = self.parse_transaction_type(self.safe_string_lower(transaction, 'type'))
306
+ if type == 'withdraw':
307
+ type = 'withdrawal'
308
+ cryptoPaymentDetail = self.safe_value(transaction, 'paymentDetail', {})
309
+ txid = self.safe_string(cryptoPaymentDetail, 'txId')
310
+ address = self.safe_string(cryptoPaymentDetail, 'address')
311
+ tag = None
312
+ if address is not None:
313
+ addressParts = address.split('?dt=')
314
+ numParts = len(addressParts)
315
+ if numParts > 1:
316
+ address = addressParts[0]
317
+ tag = addressParts[1]
318
+ addressTo = address
319
+ tagTo = tag
320
+ addressFrom = None
321
+ tagFrom = None
322
+ fee = self.safe_string(transaction, 'fee')
323
+ status = self.parse_transaction_status(self.safe_string(transaction, 'status'))
324
+ currencyId = self.safe_string(transaction, 'assetName')
325
+ code = self.safe_currency_code(currencyId)
326
+ amount = self.safe_string(transaction, 'amount')
327
+ if fee:
328
+ amount = Precise.string_sub(amount, fee)
329
+ return {
330
+ 'id': self.safe_string(transaction, 'id'),
331
+ 'txid': txid,
332
+ 'timestamp': timestamp,
333
+ 'datetime': self.iso8601(timestamp),
334
+ 'network': None,
335
+ 'address': address,
336
+ 'addressTo': addressTo,
337
+ 'addressFrom': addressFrom,
338
+ 'tag': tag,
339
+ 'tagTo': tagTo,
340
+ 'tagFrom': tagFrom,
341
+ 'type': type,
342
+ 'amount': self.parse_number(amount),
343
+ 'currency': code,
344
+ 'status': status,
345
+ 'updated': lastUpdate,
346
+ 'comment': self.safe_string(transaction, 'description'),
347
+ 'internal': None,
348
+ 'fee': {
349
+ 'currency': code,
350
+ 'cost': self.parse_number(fee),
351
+ 'rate': None,
352
+ },
353
+ 'info': transaction,
354
+ }
355
+
356
+ def fetch_markets(self, params={}) -> List[Market]:
357
+ """
358
+ retrieves data on all markets for btcmarkets
359
+ :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets/get
360
+ :param dict [params]: extra parameters specific to the exchange API endpoint
361
+ :returns dict[]: an array of objects representing market data
362
+ """
363
+ response = self.publicGetMarkets(params)
364
+ #
365
+ # [
366
+ # {
367
+ # "marketId":"COMP-AUD",
368
+ # "baseAssetName":"COMP",
369
+ # "quoteAssetName":"AUD",
370
+ # "minOrderAmount":"0.00007",
371
+ # "maxOrderAmount":"1000000",
372
+ # "amountDecimals":"8",
373
+ # "priceDecimals":"2"
374
+ # }
375
+ # ]
376
+ #
377
+ return self.parse_markets(response)
378
+
379
+ def parse_market(self, market: dict) -> Market:
380
+ baseId = self.safe_string(market, 'baseAssetName')
381
+ quoteId = self.safe_string(market, 'quoteAssetName')
382
+ id = self.safe_string(market, 'marketId')
383
+ base = self.safe_currency_code(baseId)
384
+ quote = self.safe_currency_code(quoteId)
385
+ symbol = base + '/' + quote
386
+ fees = self.safe_value(self.safe_value(self.options, 'fees', {}), quote, self.fees)
387
+ pricePrecision = self.parse_number(self.parse_precision(self.safe_string(market, 'priceDecimals')))
388
+ minAmount = self.safe_number(market, 'minOrderAmount')
389
+ maxAmount = self.safe_number(market, 'maxOrderAmount')
390
+ minPrice = None
391
+ if quote == 'AUD':
392
+ minPrice = pricePrecision
393
+ return {
394
+ 'id': id,
395
+ 'symbol': symbol,
396
+ 'base': base,
397
+ 'quote': quote,
398
+ 'settle': None,
399
+ 'baseId': baseId,
400
+ 'quoteId': quoteId,
401
+ 'settleId': None,
402
+ 'type': 'spot',
403
+ 'spot': True,
404
+ 'margin': False,
405
+ 'swap': False,
406
+ 'future': False,
407
+ 'option': False,
408
+ 'active': None,
409
+ 'contract': False,
410
+ 'linear': None,
411
+ 'inverse': None,
412
+ 'taker': fees['taker'],
413
+ 'maker': fees['maker'],
414
+ 'contractSize': None,
415
+ 'expiry': None,
416
+ 'expiryDatetime': None,
417
+ 'strike': None,
418
+ 'optionType': None,
419
+ 'precision': {
420
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(market, 'amountDecimals'))),
421
+ 'price': pricePrecision,
422
+ },
423
+ 'limits': {
424
+ 'leverage': {
425
+ 'min': None,
426
+ 'max': None,
427
+ },
428
+ 'amount': {
429
+ 'min': minAmount,
430
+ 'max': maxAmount,
431
+ },
432
+ 'price': {
433
+ 'min': minPrice,
434
+ 'max': None,
435
+ },
436
+ 'cost': {
437
+ 'min': None,
438
+ 'max': None,
439
+ },
440
+ },
441
+ 'created': None,
442
+ 'info': market,
443
+ }
444
+
445
+ def fetch_time(self, params={}):
446
+ """
447
+ fetches the current integer timestamp in milliseconds from the exchange server
448
+ :see: https://docs.btcmarkets.net/v3/#tag/Misc-APIs/paths/~1v3~1time/get
449
+ :param dict [params]: extra parameters specific to the exchange API endpoint
450
+ :returns int: the current integer timestamp in milliseconds from the exchange server
451
+ """
452
+ response = self.publicGetTime(params)
453
+ #
454
+ # {
455
+ # "timestamp": "2019-09-01T18:34:27.045000Z"
456
+ # }
457
+ #
458
+ return self.parse8601(self.safe_string(response, 'timestamp'))
459
+
460
+ def parse_balance(self, response) -> Balances:
461
+ result: dict = {'info': response}
462
+ for i in range(0, len(response)):
463
+ balance = response[i]
464
+ currencyId = self.safe_string(balance, 'assetName')
465
+ code = self.safe_currency_code(currencyId)
466
+ account = self.account()
467
+ account['used'] = self.safe_string(balance, 'locked')
468
+ account['total'] = self.safe_string(balance, 'balance')
469
+ result[code] = account
470
+ return self.safe_balance(result)
471
+
472
+ def fetch_balance(self, params={}) -> Balances:
473
+ """
474
+ query for balance and get the amount of funds available for trading or funds locked in orders
475
+ :see: https://docs.btcmarkets.net/v3/#tag/Account-APIs/paths/~1v3~1accounts~1me~1balances/get
476
+ :param dict [params]: extra parameters specific to the exchange API endpoint
477
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
478
+ """
479
+ self.load_markets()
480
+ response = self.privateGetAccountsMeBalances(params)
481
+ return self.parse_balance(response)
482
+
483
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
484
+ #
485
+ # [
486
+ # "2020-09-12T18:30:00.000000Z",
487
+ # "14409.45", # open
488
+ # "14409.45", # high
489
+ # "14403.91", # low
490
+ # "14403.91", # close
491
+ # "0.01571701" # volume
492
+ # ]
493
+ #
494
+ return [
495
+ self.parse8601(self.safe_string(ohlcv, 0)),
496
+ self.safe_number(ohlcv, 1), # open
497
+ self.safe_number(ohlcv, 2), # high
498
+ self.safe_number(ohlcv, 3), # low
499
+ self.safe_number(ohlcv, 4), # close
500
+ self.safe_number(ohlcv, 5), # volume
501
+ ]
502
+
503
+ def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
504
+ """
505
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
506
+ :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1candles/get
507
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
508
+ :param str timeframe: the length of time each candle represents
509
+ :param int [since]: timestamp in ms of the earliest candle to fetch
510
+ :param int [limit]: the maximum amount of candles to fetch
511
+ :param dict [params]: extra parameters specific to the exchange API endpoint
512
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
513
+ """
514
+ self.load_markets()
515
+ market = self.market(symbol)
516
+ request: dict = {
517
+ 'marketId': market['id'],
518
+ 'timeWindow': self.safe_string(self.timeframes, timeframe, timeframe),
519
+ # 'from': self.iso8601(since),
520
+ # 'to': self.iso8601(self.milliseconds()),
521
+ # 'before': 1234567890123,
522
+ # 'after': 1234567890123,
523
+ # 'limit': limit, # default 10, max 200
524
+ }
525
+ if since is not None:
526
+ request['from'] = self.iso8601(since)
527
+ if limit is not None:
528
+ request['limit'] = min(limit, 200) # default is 10, max 200
529
+ response = self.publicGetMarketsMarketIdCandles(self.extend(request, params))
530
+ #
531
+ # [
532
+ # ["2020-09-12T18:30:00.000000Z","14409.45","14409.45","14403.91","14403.91","0.01571701"],
533
+ # ["2020-09-12T18:21:00.000000Z","14409.45","14409.45","14409.45","14409.45","0.0035"],
534
+ # ["2020-09-12T18:03:00.000000Z","14361.37","14361.37","14361.37","14361.37","0.00345221"],
535
+ # ]
536
+ #
537
+ return self.parse_ohlcvs(response, market, timeframe, since, limit)
538
+
539
+ def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
540
+ """
541
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
542
+ :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1orderbook/get
543
+ :param str symbol: unified symbol of the market to fetch the order book for
544
+ :param int [limit]: the maximum amount of order book entries to return
545
+ :param dict [params]: extra parameters specific to the exchange API endpoint
546
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
547
+ """
548
+ self.load_markets()
549
+ market = self.market(symbol)
550
+ request: dict = {
551
+ 'marketId': market['id'],
552
+ }
553
+ response = self.publicGetMarketsMarketIdOrderbook(self.extend(request, params))
554
+ #
555
+ # {
556
+ # "marketId":"BTC-AUD",
557
+ # "snapshotId":1599936148941000,
558
+ # "asks":[
559
+ # ["14459.45","0.00456475"],
560
+ # ["14463.56","2"],
561
+ # ["14470.91","0.98"],
562
+ # ],
563
+ # "bids":[
564
+ # ["14421.01","0.52"],
565
+ # ["14421","0.75"],
566
+ # ["14418","0.3521"],
567
+ # ]
568
+ # }
569
+ #
570
+ timestamp = self.safe_integer_product(response, 'snapshotId', 0.001)
571
+ orderbook = self.parse_order_book(response, symbol, timestamp)
572
+ orderbook['nonce'] = self.safe_integer(response, 'snapshotId')
573
+ return orderbook
574
+
575
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
576
+ #
577
+ # fetchTicker
578
+ #
579
+ # {
580
+ # "marketId":"BAT-AUD",
581
+ # "bestBid":"0.3751",
582
+ # "bestAsk":"0.377",
583
+ # "lastPrice":"0.3769",
584
+ # "volume24h":"56192.97613335",
585
+ # "volumeQte24h":"21179.13270465",
586
+ # "price24h":"0.0119",
587
+ # "pricePct24h":"3.26",
588
+ # "low24h":"0.3611",
589
+ # "high24h":"0.3799",
590
+ # "timestamp":"2020-08-09T18:28:23.280000Z"
591
+ # }
592
+ #
593
+ marketId = self.safe_string(ticker, 'marketId')
594
+ market = self.safe_market(marketId, market, '-')
595
+ symbol = market['symbol']
596
+ timestamp = self.parse8601(self.safe_string(ticker, 'timestamp'))
597
+ last = self.safe_string(ticker, 'lastPrice')
598
+ baseVolume = self.safe_string(ticker, 'volume24h')
599
+ quoteVolume = self.safe_string(ticker, 'volumeQte24h')
600
+ change = self.safe_string(ticker, 'price24h')
601
+ percentage = self.safe_string(ticker, 'pricePct24h')
602
+ return self.safe_ticker({
603
+ 'symbol': symbol,
604
+ 'timestamp': timestamp,
605
+ 'datetime': self.iso8601(timestamp),
606
+ 'high': self.safe_string(ticker, 'high24h'),
607
+ 'low': self.safe_string(ticker, 'low'),
608
+ 'bid': self.safe_string(ticker, 'bestBid'),
609
+ 'bidVolume': None,
610
+ 'ask': self.safe_string(ticker, 'bestAsk'),
611
+ 'askVolume': None,
612
+ 'vwap': None,
613
+ 'open': None,
614
+ 'close': last,
615
+ 'last': last,
616
+ 'previousClose': None,
617
+ 'change': change,
618
+ 'percentage': percentage,
619
+ 'average': None,
620
+ 'baseVolume': baseVolume,
621
+ 'quoteVolume': quoteVolume,
622
+ 'info': ticker,
623
+ }, market)
624
+
625
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
626
+ """
627
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
628
+ :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1ticker/get
629
+ :param str symbol: unified symbol of the market to fetch the ticker for
630
+ :param dict [params]: extra parameters specific to the exchange API endpoint
631
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
632
+ """
633
+ self.load_markets()
634
+ market = self.market(symbol)
635
+ request: dict = {
636
+ 'marketId': market['id'],
637
+ }
638
+ response = self.publicGetMarketsMarketIdTicker(self.extend(request, params))
639
+ #
640
+ # {
641
+ # "marketId":"BAT-AUD",
642
+ # "bestBid":"0.3751",
643
+ # "bestAsk":"0.377",
644
+ # "lastPrice":"0.3769",
645
+ # "volume24h":"56192.97613335",
646
+ # "volumeQte24h":"21179.13270465",
647
+ # "price24h":"0.0119",
648
+ # "pricePct24h":"3.26",
649
+ # "low24h":"0.3611",
650
+ # "high24h":"0.3799",
651
+ # "timestamp":"2020-08-09T18:28:23.280000Z"
652
+ # }
653
+ #
654
+ return self.parse_ticker(response, market)
655
+
656
+ def fetch_ticker_2(self, symbol: str, params={}):
657
+ self.load_markets()
658
+ market = self.market(symbol)
659
+ request: dict = {
660
+ 'id': market['id'],
661
+ }
662
+ response = self.publicGetMarketsMarketIdTicker(self.extend(request, params))
663
+ return self.parse_ticker(response, market)
664
+
665
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
666
+ #
667
+ # public fetchTrades
668
+ #
669
+ # {
670
+ # "id":"6191646611",
671
+ # "price":"539.98",
672
+ # "amount":"0.5",
673
+ # "timestamp":"2020-08-09T15:21:05.016000Z",
674
+ # "side":"Ask"
675
+ # }
676
+ #
677
+ # private fetchMyTrades
678
+ #
679
+ # {
680
+ # "id": "36014819",
681
+ # "marketId": "XRP-AUD",
682
+ # "timestamp": "2019-06-25T16:01:02.977000Z",
683
+ # "price": "0.67",
684
+ # "amount": "1.50533262",
685
+ # "side": "Ask",
686
+ # "fee": "0.00857285",
687
+ # "orderId": "3648306",
688
+ # "liquidityType": "Taker",
689
+ # "clientOrderId": "48"
690
+ # }
691
+ #
692
+ timestamp = self.parse8601(self.safe_string(trade, 'timestamp'))
693
+ marketId = self.safe_string(trade, 'marketId')
694
+ market = self.safe_market(marketId, market, '-')
695
+ feeCurrencyCode = market['quote'] if (market['quote'] == 'AUD') else market['base']
696
+ side = self.safe_string(trade, 'side')
697
+ if side == 'Bid':
698
+ side = 'buy'
699
+ elif side == 'Ask':
700
+ side = 'sell'
701
+ id = self.safe_string(trade, 'id')
702
+ priceString = self.safe_string(trade, 'price')
703
+ amountString = self.safe_string(trade, 'amount')
704
+ orderId = self.safe_string(trade, 'orderId')
705
+ fee = None
706
+ feeCostString = self.safe_string(trade, 'fee')
707
+ if feeCostString is not None:
708
+ fee = {
709
+ 'cost': feeCostString,
710
+ 'currency': feeCurrencyCode,
711
+ }
712
+ takerOrMaker = self.safe_string_lower(trade, 'liquidityType')
713
+ return self.safe_trade({
714
+ 'info': trade,
715
+ 'id': id,
716
+ 'timestamp': timestamp,
717
+ 'datetime': self.iso8601(timestamp),
718
+ 'order': orderId,
719
+ 'symbol': market['symbol'],
720
+ 'type': None,
721
+ 'side': side,
722
+ 'price': priceString,
723
+ 'amount': amountString,
724
+ 'cost': None,
725
+ 'takerOrMaker': takerOrMaker,
726
+ 'fee': fee,
727
+ }, market)
728
+
729
+ def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
730
+ """
731
+ get the list of most recent trades for a particular symbol
732
+ :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1trades/get
733
+ :param str symbol: unified symbol of the market to fetch trades for
734
+ :param int [since]: timestamp in ms of the earliest trade to fetch
735
+ :param int [limit]: the maximum amount of trades to fetch
736
+ :param dict [params]: extra parameters specific to the exchange API endpoint
737
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
738
+ """
739
+ self.load_markets()
740
+ market = self.market(symbol)
741
+ request: dict = {
742
+ # 'since': 59868345231,
743
+ 'marketId': market['id'],
744
+ }
745
+ response = self.publicGetMarketsMarketIdTrades(self.extend(request, params))
746
+ #
747
+ # [
748
+ # {"id":"6191646611","price":"539.98","amount":"0.5","timestamp":"2020-08-09T15:21:05.016000Z","side":"Ask"},
749
+ # {"id":"6191646610","price":"539.99","amount":"0.5","timestamp":"2020-08-09T15:21:05.015000Z","side":"Ask"},
750
+ # {"id":"6191646590","price":"540","amount":"0.00233785","timestamp":"2020-08-09T15:21:04.171000Z","side":"Bid"},
751
+ # ]
752
+ #
753
+ return self.parse_trades(response, market, since, limit)
754
+
755
+ def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
756
+ """
757
+ create a trade order
758
+ :see: https://docs.btcmarkets.net/v3/#tag/Order-Placement-APIs/paths/~1v3~1orders/post
759
+ :param str symbol: unified symbol of the market to create an order in
760
+ :param str type: 'market' or 'limit'
761
+ :param str side: 'buy' or 'sell'
762
+ :param float amount: how much of currency you want to trade in units of base currency
763
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
764
+ :param dict [params]: extra parameters specific to the exchange API endpoint
765
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
766
+ """
767
+ self.load_markets()
768
+ market = self.market(symbol)
769
+ request: dict = {
770
+ 'marketId': market['id'],
771
+ # 'price': self.price_to_precision(symbol, price),
772
+ 'amount': self.amount_to_precision(symbol, amount),
773
+ # 'type': 'Limit', # "Limit", "Market", "Stop Limit", "Stop", "Take Profit"
774
+ 'side': 'Bid' if (side == 'buy') else 'Ask',
775
+ # 'triggerPrice': self.price_to_precision(symbol, triggerPrice), # required for Stop, Stop Limit, Take Profit orders
776
+ # 'targetAmount': self.amount_to_precision(symbol, targetAmount), # target amount when a desired target outcome is required for order execution
777
+ # 'timeInForce': 'GTC', # GTC, FOK, IOC
778
+ # 'postOnly': False, # boolean if self is a post-only order
779
+ # 'selfTrade': 'A', # A = allow, P = prevent
780
+ # 'clientOrderId': self.uuid(),
781
+ }
782
+ lowercaseType = type.lower()
783
+ orderTypes = self.safe_value(self.options, 'orderTypes', {
784
+ 'limit': 'Limit',
785
+ 'market': 'Market',
786
+ 'stop': 'Stop',
787
+ 'stop limit': 'Stop Limit',
788
+ 'take profit': 'Take Profit',
789
+ })
790
+ request['type'] = self.safe_string(orderTypes, lowercaseType, type)
791
+ priceIsRequired = False
792
+ triggerPriceIsRequired = False
793
+ if lowercaseType == 'limit':
794
+ priceIsRequired = True
795
+ # elif lowercaseType == 'market':
796
+ # ...
797
+ # }
798
+ elif lowercaseType == 'stop limit':
799
+ triggerPriceIsRequired = True
800
+ priceIsRequired = True
801
+ elif lowercaseType == 'take profit':
802
+ triggerPriceIsRequired = True
803
+ elif lowercaseType == 'stop':
804
+ triggerPriceIsRequired = True
805
+ if priceIsRequired:
806
+ if price is None:
807
+ raise ArgumentsRequired(self.id + ' createOrder() requires a price argument for a ' + type + 'order')
808
+ else:
809
+ request['price'] = self.price_to_precision(symbol, price)
810
+ if triggerPriceIsRequired:
811
+ triggerPrice = self.safe_number(params, 'triggerPrice')
812
+ params = self.omit(params, 'triggerPrice')
813
+ if triggerPrice is None:
814
+ raise ArgumentsRequired(self.id + ' createOrder() requires a triggerPrice parameter for a ' + type + 'order')
815
+ else:
816
+ request['triggerPrice'] = self.price_to_precision(symbol, triggerPrice)
817
+ clientOrderId = self.safe_string(params, 'clientOrderId')
818
+ if clientOrderId is not None:
819
+ request['clientOrderId'] = clientOrderId
820
+ params = self.omit(params, 'clientOrderId')
821
+ response = self.privatePostOrders(self.extend(request, params))
822
+ #
823
+ # {
824
+ # "orderId": "7524",
825
+ # "marketId": "BTC-AUD",
826
+ # "side": "Bid",
827
+ # "type": "Limit",
828
+ # "creationTime": "2019-08-30T11:08:21.956000Z",
829
+ # "price": "100.12",
830
+ # "amount": "1.034",
831
+ # "openAmount": "1.034",
832
+ # "status": "Accepted",
833
+ # "clientOrderId": "1234-5678",
834
+ # "timeInForce": "IOC",
835
+ # "postOnly": False,
836
+ # "selfTrade": "P",
837
+ # "triggerAmount": "105",
838
+ # "targetAmount": "1000"
839
+ # }
840
+ #
841
+ return self.parse_order(response, market)
842
+
843
+ def cancel_orders(self, ids, symbol: Str = None, params={}):
844
+ """
845
+ cancel multiple orders
846
+ :see: https://docs.btcmarkets.net/v3/#tag/Batch-Order-APIs/paths/~1v3~1batchorders~1{ids}/delete
847
+ :param str[] ids: order ids
848
+ :param str symbol: not used by btcmarkets cancelOrders()
849
+ :param dict [params]: extra parameters specific to the exchange API endpoint
850
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
851
+ """
852
+ self.load_markets()
853
+ for i in range(0, len(ids)):
854
+ ids[i] = int(ids[i])
855
+ request: dict = {
856
+ 'ids': ids,
857
+ }
858
+ response = self.privateDeleteBatchordersIds(self.extend(request, params))
859
+ #
860
+ # {
861
+ # "cancelOrders": [
862
+ # {
863
+ # "orderId": "414186",
864
+ # "clientOrderId": "6"
865
+ # },
866
+ # ...
867
+ # ],
868
+ # "unprocessedRequests": [
869
+ # {
870
+ # "code": "OrderAlreadyCancelled",
871
+ # "message": "order is already cancelled.",
872
+ # "requestId": "1"
873
+ # }
874
+ # ]
875
+ # }
876
+ #
877
+ cancelOrders = self.safe_list(response, 'cancelOrders', [])
878
+ unprocessedRequests = self.safe_list(response, 'unprocessedRequests', [])
879
+ orders = self.array_concat(cancelOrders, unprocessedRequests)
880
+ return self.parse_orders(orders)
881
+
882
+ def cancel_order(self, id: str, symbol: Str = None, params={}):
883
+ """
884
+ cancels an open order
885
+ :see: https://docs.btcmarkets.net/v3/#operation/cancelOrder
886
+ :param str id: order id
887
+ :param str symbol: not used by btcmarket cancelOrder()
888
+ :param dict [params]: extra parameters specific to the exchange API endpoint
889
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
890
+ """
891
+ self.load_markets()
892
+ request: dict = {
893
+ 'id': id,
894
+ }
895
+ response = self.privateDeleteOrdersId(self.extend(request, params))
896
+ #
897
+ # {
898
+ # "orderId": "7524",
899
+ # "clientOrderId": "123-456"
900
+ # }
901
+ #
902
+ return self.parse_order(response)
903
+
904
+ def calculate_fee(self, symbol, type, side, amount, price, takerOrMaker='taker', params={}):
905
+ """
906
+ calculates the presumptive fee that would be charged for an order
907
+ :param str symbol: unified market symbol
908
+ :param str type: not used by btcmarkets.calculateFee
909
+ :param str side: not used by btcmarkets.calculateFee
910
+ :param float amount: how much you want to trade, in units of the base currency on most exchanges, or number of contracts
911
+ :param float price: the price for the order to be filled at, in units of the quote currency
912
+ :param str takerOrMaker: 'taker' or 'maker'
913
+ :param dict params:
914
+ :returns dict: contains the rate, the percentage multiplied to the order amount to obtain the fee amount, and cost, the total value of the fee in units of the quote currency, for the order
915
+ """
916
+ market = self.markets[symbol]
917
+ currency = None
918
+ cost = None
919
+ if market['quote'] == 'AUD':
920
+ currency = market['quote']
921
+ amountString = self.number_to_string(amount)
922
+ priceString = self.number_to_string(price)
923
+ otherUnitsAmount = Precise.string_mul(amountString, priceString)
924
+ cost = self.cost_to_precision(symbol, otherUnitsAmount)
925
+ else:
926
+ currency = market['base']
927
+ cost = self.amount_to_precision(symbol, amount)
928
+ rate = market[takerOrMaker]
929
+ rateCost = Precise.string_mul(self.number_to_string(rate), cost)
930
+ return {
931
+ 'type': takerOrMaker,
932
+ 'currency': currency,
933
+ 'rate': rate,
934
+ 'cost': float(self.fee_to_precision(symbol, rateCost)),
935
+ }
936
+
937
+ def parse_order_status(self, status: Str):
938
+ statuses: dict = {
939
+ 'Accepted': 'open',
940
+ 'Placed': 'open',
941
+ 'Partially Matched': 'open',
942
+ 'Fully Matched': 'closed',
943
+ 'Cancelled': 'canceled',
944
+ 'Partially Cancelled': 'canceled',
945
+ 'Failed': 'rejected',
946
+ }
947
+ return self.safe_string(statuses, status, status)
948
+
949
+ def parse_order(self, order: dict, market: Market = None) -> Order:
950
+ #
951
+ # createOrder
952
+ #
953
+ # {
954
+ # "orderId": "7524",
955
+ # "marketId": "BTC-AUD",
956
+ # "side": "Bid",
957
+ # "type": "Limit",
958
+ # "creationTime": "2019-08-30T11:08:21.956000Z",
959
+ # "price": "100.12",
960
+ # "amount": "1.034",
961
+ # "openAmount": "1.034",
962
+ # "status": "Accepted",
963
+ # "clientOrderId": "1234-5678",
964
+ # "timeInForce": "IOC",
965
+ # "postOnly": False,
966
+ # "selfTrade": "P",
967
+ # "triggerAmount": "105",
968
+ # "targetAmount": "1000"
969
+ # }
970
+ #
971
+ timestamp = self.parse8601(self.safe_string(order, 'creationTime'))
972
+ marketId = self.safe_string(order, 'marketId')
973
+ market = self.safe_market(marketId, market, '-')
974
+ side = self.safe_string(order, 'side')
975
+ if side == 'Bid':
976
+ side = 'buy'
977
+ elif side == 'Ask':
978
+ side = 'sell'
979
+ type = self.safe_string_lower(order, 'type')
980
+ price = self.safe_string(order, 'price')
981
+ amount = self.safe_string(order, 'amount')
982
+ remaining = self.safe_string(order, 'openAmount')
983
+ status = self.parse_order_status(self.safe_string(order, 'status'))
984
+ id = self.safe_string(order, 'orderId')
985
+ clientOrderId = self.safe_string(order, 'clientOrderId')
986
+ timeInForce = self.safe_string(order, 'timeInForce')
987
+ stopPrice = self.safe_number(order, 'triggerPrice')
988
+ postOnly = self.safe_value(order, 'postOnly')
989
+ return self.safe_order({
990
+ 'info': order,
991
+ 'id': id,
992
+ 'clientOrderId': clientOrderId,
993
+ 'timestamp': timestamp,
994
+ 'datetime': self.iso8601(timestamp),
995
+ 'lastTradeTimestamp': None,
996
+ 'symbol': market['symbol'],
997
+ 'type': type,
998
+ 'timeInForce': timeInForce,
999
+ 'postOnly': postOnly,
1000
+ 'side': side,
1001
+ 'price': price,
1002
+ 'stopPrice': stopPrice,
1003
+ 'triggerPrice': stopPrice,
1004
+ 'cost': None,
1005
+ 'amount': amount,
1006
+ 'filled': None,
1007
+ 'remaining': remaining,
1008
+ 'average': None,
1009
+ 'status': status,
1010
+ 'trades': None,
1011
+ 'fee': None,
1012
+ }, market)
1013
+
1014
+ def fetch_order(self, id: str, symbol: Str = None, params={}):
1015
+ """
1016
+ fetches information on an order made by the user
1017
+ :see: https://docs.btcmarkets.net/v3/#operation/getOrderById
1018
+ :param str symbol: not used by btcmarkets fetchOrder
1019
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1020
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1021
+ """
1022
+ self.load_markets()
1023
+ request: dict = {
1024
+ 'id': id,
1025
+ }
1026
+ response = self.privateGetOrdersId(self.extend(request, params))
1027
+ return self.parse_order(response)
1028
+
1029
+ def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1030
+ """
1031
+ fetches information on multiple orders made by the user
1032
+ :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1033
+ :param str symbol: unified market symbol of the market orders were made in
1034
+ :param int [since]: the earliest time in ms to fetch orders for
1035
+ :param int [limit]: the maximum number of order structures to retrieve
1036
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1037
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1038
+ """
1039
+ self.load_markets()
1040
+ request: dict = {
1041
+ 'status': 'all',
1042
+ }
1043
+ market = None
1044
+ if symbol is not None:
1045
+ market = self.market(symbol)
1046
+ request['marketId'] = market['id']
1047
+ if since is not None:
1048
+ request['after'] = since
1049
+ if limit is not None:
1050
+ request['limit'] = limit
1051
+ response = self.privateGetOrders(self.extend(request, params))
1052
+ return self.parse_orders(response, market, since, limit)
1053
+
1054
+ def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1055
+ """
1056
+ fetch all unfilled currently open orders
1057
+ :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1058
+ :param str symbol: unified market symbol
1059
+ :param int [since]: the earliest time in ms to fetch open orders for
1060
+ :param int [limit]: the maximum number of open orders structures to retrieve
1061
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1062
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1063
+ """
1064
+ request: dict = {'status': 'open'}
1065
+ return self.fetch_orders(symbol, since, limit, self.extend(request, params))
1066
+
1067
+ def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1068
+ """
1069
+ fetches information on multiple closed orders made by the user
1070
+ :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1071
+ :param str symbol: unified market symbol of the market orders were made in
1072
+ :param int [since]: the earliest time in ms to fetch orders for
1073
+ :param int [limit]: the maximum number of order structures to retrieve
1074
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1075
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1076
+ """
1077
+ orders = self.fetch_orders(symbol, since, limit, params)
1078
+ return self.filter_by(orders, 'status', 'closed')
1079
+
1080
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1081
+ """
1082
+ fetch all trades made by the user
1083
+ :see: https://docs.btcmarkets.net/v3/#operation/getTrades
1084
+ :param str symbol: unified market symbol
1085
+ :param int [since]: the earliest time in ms to fetch trades for
1086
+ :param int [limit]: the maximum number of trades structures to retrieve
1087
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1088
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1089
+ """
1090
+ self.load_markets()
1091
+ request: dict = {}
1092
+ market = None
1093
+ if symbol is not None:
1094
+ market = self.market(symbol)
1095
+ request['marketId'] = market['id']
1096
+ if since is not None:
1097
+ request['after'] = since
1098
+ if limit is not None:
1099
+ request['limit'] = limit
1100
+ response = self.privateGetTrades(self.extend(request, params))
1101
+ #
1102
+ # [
1103
+ # {
1104
+ # "id": "36014819",
1105
+ # "marketId": "XRP-AUD",
1106
+ # "timestamp": "2019-06-25T16:01:02.977000Z",
1107
+ # "price": "0.67",
1108
+ # "amount": "1.50533262",
1109
+ # "side": "Ask",
1110
+ # "fee": "0.00857285",
1111
+ # "orderId": "3648306",
1112
+ # "liquidityType": "Taker",
1113
+ # "clientOrderId": "48"
1114
+ # },
1115
+ # {
1116
+ # "id": "3568960",
1117
+ # "marketId": "GNT-AUD",
1118
+ # "timestamp": "2019-06-20T08:44:04.488000Z",
1119
+ # "price": "0.1362",
1120
+ # "amount": "0.85",
1121
+ # "side": "Bid",
1122
+ # "fee": "0.00098404",
1123
+ # "orderId": "3543015",
1124
+ # "liquidityType": "Maker"
1125
+ # }
1126
+ # ]
1127
+ #
1128
+ return self.parse_trades(response, market, since, limit)
1129
+
1130
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1131
+ """
1132
+ make a withdrawal
1133
+ :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/post
1134
+ :param str code: unified currency code
1135
+ :param float amount: the amount to withdraw
1136
+ :param str address: the address to withdraw to
1137
+ :param str tag:
1138
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1139
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1140
+ """
1141
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1142
+ self.load_markets()
1143
+ currency = self.currency(code)
1144
+ request: dict = {
1145
+ 'currency_id': currency['id'],
1146
+ 'amount': self.currency_to_precision(code, amount),
1147
+ }
1148
+ if code != 'AUD':
1149
+ self.check_address(address)
1150
+ request['toAddress'] = address
1151
+ if tag is not None:
1152
+ request['toAddress'] = address + '?dt=' + tag
1153
+ response = self.privatePostWithdrawals(self.extend(request, params))
1154
+ #
1155
+ # {
1156
+ # "id": "4126657",
1157
+ # "assetName": "XRP",
1158
+ # "amount": "25",
1159
+ # "type": "Withdraw",
1160
+ # "creationTime": "2019-09-04T00:04:10.973000Z",
1161
+ # "status": "Pending Authorization",
1162
+ # "description": "XRP withdraw from [me@test.com] to Address: abc amount: 25 fee: 0",
1163
+ # "fee": "0",
1164
+ # "lastUpdate": "2019-09-04T00:04:11.018000Z",
1165
+ # "paymentDetail": {
1166
+ # "address": "abc"
1167
+ # }
1168
+ # }
1169
+ #
1170
+ return self.parse_transaction(response, currency)
1171
+
1172
+ def nonce(self):
1173
+ return self.milliseconds()
1174
+
1175
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1176
+ request = '/' + self.version + '/' + self.implode_params(path, params)
1177
+ query = self.keysort(self.omit(params, self.extract_params(path)))
1178
+ if api == 'private':
1179
+ self.check_required_credentials()
1180
+ nonce = str(self.nonce())
1181
+ secret = self.base64_to_binary(self.secret)
1182
+ auth = method + request + nonce
1183
+ if (method == 'GET') or (method == 'DELETE'):
1184
+ if query:
1185
+ request += '?' + self.urlencode(query)
1186
+ else:
1187
+ body = self.json(query)
1188
+ auth += body
1189
+ signature = self.hmac(self.encode(auth), secret, hashlib.sha512, 'base64')
1190
+ headers = {
1191
+ 'Accept': 'application/json',
1192
+ 'Accept-Charset': 'UTF-8',
1193
+ 'Content-Type': 'application/json',
1194
+ 'BM-AUTH-APIKEY': self.apiKey,
1195
+ 'BM-AUTH-TIMESTAMP': nonce,
1196
+ 'BM-AUTH-SIGNATURE': signature,
1197
+ }
1198
+ elif api == 'public':
1199
+ if query:
1200
+ request += '?' + self.urlencode(query)
1201
+ url = self.urls['api'][api] + request
1202
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1203
+
1204
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1205
+ if response is None:
1206
+ return None # fallback to default error handler
1207
+ if 'success' in response:
1208
+ if not response['success']:
1209
+ error = self.safe_string(response, 'errorCode')
1210
+ feedback = self.id + ' ' + body
1211
+ self.throw_exactly_matched_exception(self.exceptions, error, feedback)
1212
+ raise ExchangeError(feedback)
1213
+ # v3 api errors
1214
+ if code >= 400:
1215
+ errorCode = self.safe_string(response, 'code')
1216
+ message = self.safe_string(response, 'message')
1217
+ feedback = self.id + ' ' + body
1218
+ self.throw_exactly_matched_exception(self.exceptions, errorCode, feedback)
1219
+ self.throw_exactly_matched_exception(self.exceptions, message, feedback)
1220
+ raise ExchangeError(feedback)
1221
+ return None