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/pro/bitvavo.py ADDED
@@ -0,0 +1,1270 @@
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
+ import ccxt.async_support
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, TradingFees
10
+ from ccxt.async_support.base.ws.client import Client
11
+ from typing import List
12
+ from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import ArgumentsRequired
15
+
16
+
17
+ class bitvavo(ccxt.async_support.bitvavo):
18
+
19
+ def describe(self):
20
+ return self.deep_extend(super(bitvavo, self).describe(), {
21
+ 'has': {
22
+ 'ws': True,
23
+ 'cancelOrdersWs': False,
24
+ 'fetchTradesWs': False,
25
+ 'watchOrderBook': True,
26
+ 'watchTrades': True,
27
+ 'watchTicker': True,
28
+ 'watchOHLCV': True,
29
+ 'watchOrders': True,
30
+ 'watchMyTrades': True,
31
+ 'cancelAllOrdersWs': True,
32
+ 'cancelOrderWs': True,
33
+ 'createOrderWs': True,
34
+ 'createStopLimitOrderWs': True,
35
+ 'createStopMarketOrderWs': True,
36
+ 'createStopOrderWs': True,
37
+ 'editOrderWs': True,
38
+ 'fetchBalanceWs': True,
39
+ 'fetchCurrenciesWS': True,
40
+ 'fetchDepositAddressWs': True,
41
+ 'fetchDepositsWs': True,
42
+ 'fetchDepositWithdrawFeesWs': True,
43
+ 'fetchMyTradesWs': True,
44
+ 'fetchOHLCVWs': True,
45
+ 'fetchOpenOrdersWs': True,
46
+ 'fetchOrderWs': True,
47
+ 'fetchOrderBookWs': True,
48
+ 'fetchOrdersWs': True,
49
+ 'fetchTickerWs': True,
50
+ 'fetchTickersWs': True,
51
+ 'fetchTimeWs': True,
52
+ 'fetchTradingFeesWs': True,
53
+ 'fetchWithdrawalsWs': True,
54
+ 'withdrawWs': True,
55
+ },
56
+ 'urls': {
57
+ 'api': {
58
+ 'ws': 'wss://ws.bitvavo.com/v2',
59
+ },
60
+ },
61
+ 'options': {
62
+ 'supressMultipleWsRequestsError': False, # if True, will not raise an error when using the same messageHash for more than one request. By making False you may receive responses from different requests on the same action
63
+ 'tradesLimit': 1000,
64
+ 'ordersLimit': 1000,
65
+ 'OHLCVLimit': 1000,
66
+ },
67
+ })
68
+
69
+ async def watch_public(self, name, symbol, params={}):
70
+ await self.load_markets()
71
+ market = self.market(symbol)
72
+ messageHash = name + '@' + market['id']
73
+ url = self.urls['api']['ws']
74
+ request: dict = {
75
+ 'action': 'subscribe',
76
+ 'channels': [
77
+ {
78
+ 'name': name,
79
+ 'markets': [
80
+ market['id'],
81
+ ],
82
+ },
83
+ ],
84
+ }
85
+ message = self.extend(request, params)
86
+ return await self.watch(url, messageHash, message, messageHash)
87
+
88
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
89
+ """
90
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
91
+ :param str symbol: unified symbol of the market to fetch the ticker for
92
+ :param dict [params]: extra parameters specific to the exchange API endpoint
93
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
94
+ """
95
+ return await self.watch_public('ticker24h', symbol, params)
96
+
97
+ def handle_ticker(self, client: Client, message):
98
+ #
99
+ # {
100
+ # "event": "ticker24h",
101
+ # "data": [
102
+ # {
103
+ # "market": "ETH-EUR",
104
+ # "open": "193.5",
105
+ # "high": "202.72",
106
+ # "low": "192.46",
107
+ # "last": "199.01",
108
+ # "volume": "3587.05020246",
109
+ # "volumeQuote": "708030.17",
110
+ # "bid": "199.56",
111
+ # "bidSize": "4.14730802",
112
+ # "ask": "199.57",
113
+ # "askSize": "6.13642074",
114
+ # "timestamp": 1590770885217
115
+ # }
116
+ # ]
117
+ # }
118
+ #
119
+ event = self.safe_string(message, 'event')
120
+ tickers = self.safe_value(message, 'data', [])
121
+ for i in range(0, len(tickers)):
122
+ data = tickers[i]
123
+ marketId = self.safe_string(data, 'market')
124
+ market = self.safe_market(marketId, None, '-')
125
+ messageHash = event + '@' + marketId
126
+ ticker = self.parse_ticker(data, market)
127
+ symbol = ticker['symbol']
128
+ self.tickers[symbol] = ticker
129
+ client.resolve(ticker, messageHash)
130
+ return message
131
+
132
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
133
+ """
134
+ get the list of most recent trades for a particular symbol
135
+ :param str symbol: unified symbol of the market to fetch trades for
136
+ :param int [since]: timestamp in ms of the earliest trade to fetch
137
+ :param int [limit]: the maximum amount of trades to fetch
138
+ :param dict [params]: extra parameters specific to the exchange API endpoint
139
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
140
+ """
141
+ await self.load_markets()
142
+ symbol = self.symbol(symbol)
143
+ trades = await self.watch_public('trades', symbol, params)
144
+ if self.newUpdates:
145
+ limit = trades.getLimit(symbol, limit)
146
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
147
+
148
+ def handle_trade(self, client: Client, message):
149
+ #
150
+ # {
151
+ # "event": "trade",
152
+ # "timestamp": 1590779594547,
153
+ # "market": "ETH-EUR",
154
+ # "id": "450c3298-f082-4461-9e2c-a0262cc7cc2e",
155
+ # "amount": "0.05026233",
156
+ # "price": "198.46",
157
+ # "side": "buy"
158
+ # }
159
+ #
160
+ marketId = self.safe_string(message, 'market')
161
+ market = self.safe_market(marketId, None, '-')
162
+ symbol = market['symbol']
163
+ name = 'trades'
164
+ messageHash = name + '@' + marketId
165
+ trade = self.parse_trade(message, market)
166
+ tradesArray = self.safe_value(self.trades, symbol)
167
+ if tradesArray is None:
168
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
169
+ tradesArray = ArrayCache(limit)
170
+ tradesArray.append(trade)
171
+ self.trades[symbol] = tradesArray
172
+ client.resolve(tradesArray, messageHash)
173
+
174
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
175
+ """
176
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
177
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
178
+ :param str timeframe: the length of time each candle represents
179
+ :param int [since]: timestamp in ms of the earliest candle to fetch
180
+ :param int [limit]: the maximum amount of candles to fetch
181
+ :param dict [params]: extra parameters specific to the exchange API endpoint
182
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
183
+ """
184
+ await self.load_markets()
185
+ market = self.market(symbol)
186
+ symbol = market['symbol']
187
+ name = 'candles'
188
+ marketId = market['id']
189
+ interval = self.safe_string(self.timeframes, timeframe, timeframe)
190
+ messageHash = name + '@' + marketId + '_' + interval
191
+ url = self.urls['api']['ws']
192
+ request: dict = {
193
+ 'action': 'subscribe',
194
+ 'channels': [
195
+ {
196
+ 'name': 'candles',
197
+ 'interval': [interval],
198
+ 'markets': [marketId],
199
+ },
200
+ ],
201
+ }
202
+ message = self.extend(request, params)
203
+ ohlcv = await self.watch(url, messageHash, message, messageHash)
204
+ if self.newUpdates:
205
+ limit = ohlcv.getLimit(symbol, limit)
206
+ return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
207
+
208
+ def handle_fetch_ohlcv(self, client: Client, message):
209
+ #
210
+ # {
211
+ # action: 'getCandles',
212
+ # response: [
213
+ # [1690325820000, '26453', '26453', '26436', '26447', '0.01626246'],
214
+ # [1690325760000, '26454', '26454', '26453', '26453', '0.00037707']
215
+ # ]
216
+ # }
217
+ #
218
+ action = self.safe_string(message, 'action')
219
+ response = self.safe_value(message, 'response')
220
+ ohlcv = self.parse_ohlcvs(response, None, None, None)
221
+ messageHash = self.build_message_hash(action)
222
+ client.resolve(ohlcv, messageHash)
223
+
224
+ def handle_ohlcv(self, client: Client, message):
225
+ #
226
+ # {
227
+ # "event": "candle",
228
+ # "market": "BTC-EUR",
229
+ # "interval": "1m",
230
+ # "candle": [
231
+ # [
232
+ # 1590797160000,
233
+ # "8480.9",
234
+ # "8480.9",
235
+ # "8480.9",
236
+ # "8480.9",
237
+ # "0.01038628"
238
+ # ]
239
+ # ]
240
+ # }
241
+ #
242
+ name = 'candles'
243
+ marketId = self.safe_string(message, 'market')
244
+ market = self.safe_market(marketId, None, '-')
245
+ symbol = market['symbol']
246
+ interval = self.safe_string(message, 'interval')
247
+ # use a reverse lookup in a static map instead
248
+ timeframe = self.find_timeframe(interval)
249
+ messageHash = name + '@' + marketId + '_' + interval
250
+ candles = self.safe_value(message, 'candle')
251
+ self.ohlcvs[symbol] = self.safe_value(self.ohlcvs, symbol, {})
252
+ stored = self.safe_value(self.ohlcvs[symbol], timeframe)
253
+ if stored is None:
254
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
255
+ stored = ArrayCacheByTimestamp(limit)
256
+ self.ohlcvs[symbol][timeframe] = stored
257
+ for i in range(0, len(candles)):
258
+ candle = candles[i]
259
+ parsed = self.parse_ohlcv(candle, market)
260
+ stored.append(parsed)
261
+ client.resolve(stored, messageHash)
262
+
263
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
264
+ """
265
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
266
+ :param str symbol: unified symbol of the market to fetch the order book for
267
+ :param int [limit]: the maximum amount of order book entries to return
268
+ :param dict [params]: extra parameters specific to the exchange API endpoint
269
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
270
+ """
271
+ await self.load_markets()
272
+ market = self.market(symbol)
273
+ symbol = market['symbol']
274
+ name = 'book'
275
+ messageHash = name + '@' + market['id']
276
+ url = self.urls['api']['ws']
277
+ request: dict = {
278
+ 'action': 'subscribe',
279
+ 'channels': [
280
+ {
281
+ 'name': name,
282
+ 'markets': [
283
+ market['id'],
284
+ ],
285
+ },
286
+ ],
287
+ }
288
+ subscription: dict = {
289
+ 'messageHash': messageHash,
290
+ 'name': name,
291
+ 'symbol': symbol,
292
+ 'marketId': market['id'],
293
+ 'method': self.handle_order_book_subscription,
294
+ 'limit': limit,
295
+ 'params': params,
296
+ }
297
+ message = self.extend(request, params)
298
+ orderbook = await self.watch(url, messageHash, message, messageHash, subscription)
299
+ return orderbook.limit()
300
+
301
+ def handle_delta(self, bookside, delta):
302
+ price = self.safe_float(delta, 0)
303
+ amount = self.safe_float(delta, 1)
304
+ bookside.store(price, amount)
305
+
306
+ def handle_deltas(self, bookside, deltas):
307
+ for i in range(0, len(deltas)):
308
+ self.handle_delta(bookside, deltas[i])
309
+
310
+ def handle_order_book_message(self, client: Client, message, orderbook):
311
+ #
312
+ # {
313
+ # "event": "book",
314
+ # "market": "BTC-EUR",
315
+ # "nonce": 36947383,
316
+ # "bids": [
317
+ # ["8477.8", "0"]
318
+ # ],
319
+ # "asks": [
320
+ # ["8550.9", "0"]
321
+ # ]
322
+ # }
323
+ #
324
+ nonce = self.safe_integer(message, 'nonce')
325
+ if nonce > orderbook['nonce']:
326
+ self.handle_deltas(orderbook['asks'], self.safe_value(message, 'asks', []))
327
+ self.handle_deltas(orderbook['bids'], self.safe_value(message, 'bids', []))
328
+ orderbook['nonce'] = nonce
329
+ return orderbook
330
+
331
+ def handle_order_book(self, client: Client, message):
332
+ #
333
+ # {
334
+ # "event": "book",
335
+ # "market": "BTC-EUR",
336
+ # "nonce": 36729561,
337
+ # "bids": [
338
+ # ["8513.3", "0"],
339
+ # ['8518.8', "0.64236203"],
340
+ # ['8513.6', "0.32435481"],
341
+ # ],
342
+ # "asks": []
343
+ # }
344
+ #
345
+ event = self.safe_string(message, 'event')
346
+ marketId = self.safe_string(message, 'market')
347
+ market = self.safe_market(marketId, None, '-')
348
+ symbol = market['symbol']
349
+ messageHash = event + '@' + market['id']
350
+ orderbook = self.safe_value(self.orderbooks, symbol)
351
+ if orderbook is None:
352
+ return
353
+ if orderbook['nonce'] is None:
354
+ subscription = self.safe_value(client.subscriptions, messageHash, {})
355
+ watchingOrderBookSnapshot = self.safe_value(subscription, 'watchingOrderBookSnapshot')
356
+ if watchingOrderBookSnapshot is None:
357
+ subscription['watchingOrderBookSnapshot'] = True
358
+ client.subscriptions[messageHash] = subscription
359
+ options = self.safe_value(self.options, 'watchOrderBookSnapshot', {})
360
+ delay = self.safe_integer(options, 'delay', self.rateLimit)
361
+ # fetch the snapshot in a separate async call after a warmup delay
362
+ self.delay(delay, self.watch_order_book_snapshot, client, message, subscription)
363
+ orderbook.cache.append(message)
364
+ else:
365
+ self.handle_order_book_message(client, message, orderbook)
366
+ client.resolve(orderbook, messageHash)
367
+
368
+ async def watch_order_book_snapshot(self, client, message, subscription):
369
+ params = self.safe_value(subscription, 'params')
370
+ marketId = self.safe_string(subscription, 'marketId')
371
+ name = 'getBook'
372
+ messageHash = name + '@' + marketId
373
+ url = self.urls['api']['ws']
374
+ request: dict = {
375
+ 'action': name,
376
+ 'market': marketId,
377
+ }
378
+ orderbook = await self.watch(url, messageHash, self.extend(request, params), messageHash, subscription)
379
+ return orderbook.limit()
380
+
381
+ def handle_order_book_snapshot(self, client: Client, message):
382
+ #
383
+ # {
384
+ # "action": "getBook",
385
+ # "response": {
386
+ # "market": "BTC-EUR",
387
+ # "nonce": 36946120,
388
+ # "bids": [
389
+ # ['8494.9', "0.24399521"],
390
+ # ['8494.8', "0.34884085"],
391
+ # ['8493.9', "0.14535128"],
392
+ # ],
393
+ # "asks": [
394
+ # ["8495", "0.46982463"],
395
+ # ['8495.1', "0.12178267"],
396
+ # ['8496.2', "0.21924143"],
397
+ # ]
398
+ # }
399
+ # }
400
+ #
401
+ response = self.safe_value(message, 'response')
402
+ if response is None:
403
+ return
404
+ marketId = self.safe_string(response, 'market')
405
+ symbol = self.safe_symbol(marketId, None, '-')
406
+ name = 'book'
407
+ messageHash = name + '@' + marketId
408
+ orderbook = self.orderbooks[symbol]
409
+ snapshot = self.parse_order_book(response, symbol)
410
+ snapshot['nonce'] = self.safe_integer(response, 'nonce')
411
+ orderbook.reset(snapshot)
412
+ # unroll the accumulated deltas
413
+ messages = orderbook.cache
414
+ for i in range(0, len(messages)):
415
+ messageItem = messages[i]
416
+ self.handle_order_book_message(client, messageItem, orderbook)
417
+ self.orderbooks[symbol] = orderbook
418
+ client.resolve(orderbook, messageHash)
419
+
420
+ def handle_order_book_subscription(self, client: Client, message, subscription):
421
+ symbol = self.safe_string(subscription, 'symbol')
422
+ limit = self.safe_integer(subscription, 'limit')
423
+ if symbol in self.orderbooks:
424
+ del self.orderbooks[symbol]
425
+ self.orderbooks[symbol] = self.order_book({}, limit)
426
+
427
+ def handle_order_book_subscriptions(self, client: Client, message, marketIds):
428
+ name = 'book'
429
+ for i in range(0, len(marketIds)):
430
+ marketId = self.safe_string(marketIds, i)
431
+ symbol = self.safe_symbol(marketId, None, '-')
432
+ messageHash = name + '@' + marketId
433
+ if not (symbol in self.orderbooks):
434
+ subscription = self.safe_value(client.subscriptions, messageHash)
435
+ method = self.safe_value(subscription, 'method')
436
+ if method is not None:
437
+ method(client, message, subscription)
438
+
439
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
440
+ """
441
+ watches information on multiple orders made by the user
442
+ :param str symbol: unified market symbol of the market orders were made in
443
+ :param int [since]: the earliest time in ms to fetch orders for
444
+ :param int [limit]: the maximum number of order structures to retrieve
445
+ :param dict [params]: extra parameters specific to the exchange API endpoint
446
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
447
+ """
448
+ if symbol is None:
449
+ raise ArgumentsRequired(self.id + ' watchOrders() requires a symbol argument')
450
+ await self.load_markets()
451
+ await self.authenticate()
452
+ market = self.market(symbol)
453
+ symbol = market['symbol']
454
+ marketId = market['id']
455
+ url = self.urls['api']['ws']
456
+ name = 'account'
457
+ messageHash = 'order:' + symbol
458
+ request: dict = {
459
+ 'action': 'subscribe',
460
+ 'channels': [
461
+ {
462
+ 'name': name,
463
+ 'markets': [marketId],
464
+ },
465
+ ],
466
+ }
467
+ orders = await self.watch(url, messageHash, request, messageHash)
468
+ if self.newUpdates:
469
+ limit = orders.getLimit(symbol, limit)
470
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
471
+
472
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
473
+ """
474
+ watches information on multiple trades made by the user
475
+ :param str symbol: unified market symbol of the market trades were made in
476
+ :param int [since]: the earliest time in ms to fetch trades for
477
+ :param int [limit]: the maximum number of trade structures to retrieve
478
+ :param dict [params]: extra parameters specific to the exchange API endpoint
479
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=ortradeder-structure
480
+ """
481
+ if symbol is None:
482
+ raise ArgumentsRequired(self.id + ' watchMyTrades() requires a symbol argument')
483
+ await self.load_markets()
484
+ await self.authenticate()
485
+ market = self.market(symbol)
486
+ symbol = market['symbol']
487
+ marketId = market['id']
488
+ url = self.urls['api']['ws']
489
+ name = 'account'
490
+ messageHash = 'myTrades:' + symbol
491
+ request: dict = {
492
+ 'action': 'subscribe',
493
+ 'channels': [
494
+ {
495
+ 'name': name,
496
+ 'markets': [marketId],
497
+ },
498
+ ],
499
+ }
500
+ trades = await self.watch(url, messageHash, request, messageHash)
501
+ if self.newUpdates:
502
+ limit = trades.getLimit(symbol, limit)
503
+ return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
504
+
505
+ async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
506
+ """
507
+ create a trade order
508
+ :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/post
509
+ :param str symbol: unified symbol of the market to create an order in
510
+ :param str type: 'market' or 'limit'
511
+ :param str side: 'buy' or 'sell'
512
+ :param float amount: how much of currency you want to trade in units of base currency
513
+ :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
514
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
515
+ :param str [params.timeInForce]: "GTC", "IOC", or "PO"
516
+ :param float [params.stopPrice]: The price at which a trigger order is triggered at
517
+ :param float [params.triggerPrice]: The price at which a trigger order is triggered at
518
+ :param bool [params.postOnly]: If True, the order will only be posted to the order book and not executed immediately
519
+ :param float [params.stopLossPrice]: The price at which a stop loss order is triggered at
520
+ :param float [params.takeProfitPrice]: The price at which a take profit order is triggered at
521
+ :param str [params.triggerType]: "price"
522
+ :param str [params.triggerReference]: "lastTrade", "bestBid", "bestAsk", "midPrice" Only for stop orders: Use self to determine which parameter will trigger the order
523
+ :param str [params.selfTradePrevention]: "decrementAndCancel", "cancelOldest", "cancelNewest", "cancelBoth"
524
+ :param bool [params.disableMarketProtection]: don't cancel if the next fill price is 10% worse than the best fill price
525
+ :param bool [params.responseRequired]: Set self to 'false' when only an acknowledgement of success or failure is required, self is faster.
526
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
527
+ """
528
+ await self.load_markets()
529
+ await self.authenticate()
530
+ request = self.create_order_request(symbol, type, side, amount, price, params)
531
+ return await self.watch_request('privateCreateOrder', request)
532
+
533
+ async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
534
+ """
535
+ edit a trade order
536
+ :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/put
537
+ :param str id: cancel order id
538
+ :param str symbol: unified symbol of the market to create an order in
539
+ :param str type: 'market' or 'limit'
540
+ :param str side: 'buy' or 'sell'
541
+ :param float [amount]: how much of currency you want to trade in units of base currency
542
+ :param float [price]: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
543
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
544
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
545
+ """
546
+ await self.load_markets()
547
+ await self.authenticate()
548
+ request = self.edit_order_request(id, symbol, type, side, amount, price, params)
549
+ return await self.watch_request('privateUpdateOrder', request)
550
+
551
+ async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
552
+ """
553
+ :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/delete
554
+ cancels an open order
555
+ :param str id: order id
556
+ :param str symbol: unified symbol of the market the order was made in
557
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
558
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
559
+ """
560
+ await self.load_markets()
561
+ await self.authenticate()
562
+ request = self.cancel_order_request(id, symbol, params)
563
+ return await self.watch_request('privateCancelOrder', request)
564
+
565
+ async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
566
+ """
567
+ :see: https://docs.bitvavo.com/#tag/Orders/paths/~1orders/delete
568
+ cancel all open orders
569
+ :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
570
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
571
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
572
+ """
573
+ await self.load_markets()
574
+ await self.authenticate()
575
+ request: dict = {}
576
+ market = None
577
+ if symbol is not None:
578
+ market = self.market(symbol)
579
+ request['market'] = market['id']
580
+ return await self.watch_request('privateCancelOrders', self.extend(request, params))
581
+
582
+ def handle_multiple_orders(self, client: Client, message):
583
+ #
584
+ # {
585
+ # action: 'privateCancelOrders',
586
+ # response: [{
587
+ # orderId: 'd71df826-1130-478a-8741-d219128675b0'
588
+ # }]
589
+ # }
590
+ #
591
+ action = self.safe_string(message, 'action')
592
+ response = self.safe_value(message, 'response')
593
+ firstRawOrder = self.safe_value(response, 0, {})
594
+ marketId = self.safe_string(firstRawOrder, 'market')
595
+ orders = self.parse_orders(response)
596
+ messageHash = self.build_message_hash(action, {'market': marketId})
597
+ client.resolve(orders, messageHash)
598
+ messageHash = self.build_message_hash(action, message)
599
+ client.resolve(orders, messageHash)
600
+
601
+ async def fetch_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
602
+ """
603
+ :see: https://docs.bitvavo.com/#tag/General/paths/~1assets/get
604
+ fetches information on an order made by the user
605
+ :param str symbol: unified symbol of the market the order was made in
606
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
607
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
608
+ """
609
+ if symbol is None:
610
+ raise ArgumentsRequired(self.id + ' fetchOrder() requires a symbol argument')
611
+ await self.load_markets()
612
+ await self.authenticate()
613
+ market = self.market(symbol)
614
+ request: dict = {
615
+ 'orderId': id,
616
+ 'market': market['id'],
617
+ }
618
+ return await self.watch_request('privateGetOrder', self.extend(request, params))
619
+
620
+ async def fetch_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
621
+ """
622
+ :see: https://docs.bitvavo.com/#tag/Orders/paths/~1orders/get
623
+ fetches information on multiple orders made by the user
624
+ :param str symbol: unified market symbol of the market orders were made in
625
+ :param int [since]: the earliest time in ms to fetch orders for
626
+ :param int [limit]: the maximum number of orde structures to retrieve
627
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
628
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
629
+ """
630
+ if symbol is None:
631
+ raise ArgumentsRequired(self.id + ' fetchOrdersWs() requires a symbol argument')
632
+ await self.load_markets()
633
+ await self.authenticate()
634
+ request = self.fetchOrdersRequest(symbol, since, limit, params)
635
+ orders = await self.watch_request('privateGetOrders', request)
636
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit)
637
+
638
+ async def watch_request(self, action, request):
639
+ request['action'] = action
640
+ messageHash = self.build_message_hash(action, request)
641
+ self.check_message_hash_does_not_exist(messageHash)
642
+ url = self.urls['api']['ws']
643
+ return await self.watch(url, messageHash, request, messageHash)
644
+
645
+ async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
646
+ """
647
+ fetch all unfilled currently open orders
648
+ :param str symbol: unified market symbol
649
+ :param int [since]: the earliest time in ms to fetch open orders for
650
+ :param int [limit]: the maximum number of open orders structures to retrieve
651
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
652
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
653
+ """
654
+ await self.load_markets()
655
+ await self.authenticate()
656
+ request: dict = {
657
+ # 'market': market['id'], # rate limit 25 without a market, 1 with market specified
658
+ }
659
+ market = None
660
+ if symbol is not None:
661
+ market = self.market(symbol)
662
+ request['market'] = market['id']
663
+ orders = await self.watch_request('privateGetOrdersOpen', self.extend(request, params))
664
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit)
665
+
666
+ async def fetch_my_trades_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
667
+ """
668
+ :see: https://docs.bitvavo.com/#tag/Trades
669
+ fetch all trades made by the user
670
+ :param str symbol: unified market symbol
671
+ :param int [since]: the earliest time in ms to fetch trades for
672
+ :param int [limit]: the maximum number of trades structures to retrieve
673
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
674
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
675
+ """
676
+ if symbol is None:
677
+ raise ArgumentsRequired(self.id + ' fetchMyTradesWs() requires a symbol argument')
678
+ await self.load_markets()
679
+ await self.authenticate()
680
+ request = self.fetchMyTradesRequest(symbol, since, limit, params)
681
+ myTrades = await self.watch_request('privateGetTrades', request)
682
+ return self.filter_by_symbol_since_limit(myTrades, symbol, since, limit)
683
+
684
+ def handle_my_trades(self, client: Client, message):
685
+ #
686
+ # {
687
+ # action: 'privateGetTrades',
688
+ # response: [
689
+ # {
690
+ # "id": "108c3633-0276-4480-a902-17a01829deae",
691
+ # "orderId": "1d671998-3d44-4df4-965f-0d48bd129a1b",
692
+ # "timestamp": 1542967486256,
693
+ # "market": "BTC-EUR",
694
+ # "side": "buy",
695
+ # "amount": "0.005",
696
+ # "price": "5000.1",
697
+ # "taker": True,
698
+ # "fee": "0.03",
699
+ # "feeCurrency": "EUR",
700
+ # "settled": True
701
+ # }
702
+ # ]
703
+ # }
704
+ #
705
+ #
706
+ action = self.safe_string(message, 'action')
707
+ response = self.safe_value(message, 'response')
708
+ firstRawTrade = self.safe_value(response, 0, {})
709
+ marketId = self.safe_string(firstRawTrade, 'market')
710
+ trades = self.parse_trades(response, None, None, None)
711
+ messageHash = self.build_message_hash(action, {'market': marketId})
712
+ client.resolve(trades, messageHash)
713
+
714
+ async def withdraw_ws(self, code: str, amount, address, tag=None, params={}):
715
+ """
716
+ make a withdrawal
717
+ :param str code: unified currency code
718
+ :param float amount: the amount to withdraw
719
+ :param str address: the address to withdraw to
720
+ :param str tag:
721
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
722
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
723
+ """
724
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
725
+ self.check_address(address)
726
+ await self.load_markets()
727
+ await self.authenticate()
728
+ request = self.withdrawRequest(code, amount, address, tag, params)
729
+ return await self.watch_request('privateWithdrawAssets', request)
730
+
731
+ def handle_withdraw(self, client: Client, message):
732
+ #
733
+ # {
734
+ # action: 'privateWithdrawAssets',
735
+ # response: {
736
+ # "success": True,
737
+ # "symbol": "BTC",
738
+ # "amount": "1.5"
739
+ # }
740
+ # }
741
+ #
742
+ action = self.safe_string(message, 'action')
743
+ messageHash = self.build_message_hash(action, message)
744
+ response = self.safe_value(message, 'response')
745
+ withdraw = self.parse_transaction(response)
746
+ client.resolve(withdraw, messageHash)
747
+
748
+ async def fetch_withdrawals_ws(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
749
+ """
750
+ :see: https://docs.bitvavo.com/#tag/Account/paths/~1withdrawalHistory/get
751
+ fetch all withdrawals made from an account
752
+ :param str code: unified currency code
753
+ :param int [since]: the earliest time in ms to fetch withdrawals for
754
+ :param int [limit]: the maximum number of withdrawals structures to retrieve
755
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
756
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
757
+ """
758
+ await self.load_markets()
759
+ await self.authenticate()
760
+ request = self.fetchWithdrawalsRequest(code, since, limit, params)
761
+ withdraws = await self.watch_request('privateGetWithdrawalHistory', request)
762
+ return self.filter_by_currency_since_limit(withdraws, code, since, limit)
763
+
764
+ def handle_withdraws(self, client: Client, message):
765
+ #
766
+ # {
767
+ # action: 'privateGetWithdrawalHistory',
768
+ # response: [{
769
+ # timestamp: 1689792085000,
770
+ # symbol: 'BTC',
771
+ # amount: '0.0009',
772
+ # fee: '0',
773
+ # status: 'completed',
774
+ # txId: '7dbadc658d7d59c129de1332c55ee8e08d0ab74432faae03b417b9809c819d1f'
775
+ # },
776
+ # ...
777
+ # ]
778
+ # }
779
+ #
780
+ action = self.safe_string(message, 'action')
781
+ messageHash = self.build_message_hash(action, message)
782
+ response = self.safe_value(message, 'response')
783
+ withdrawals = self.parse_transactions(response, None, None, None, {'type': 'withdrawal'})
784
+ client.resolve(withdrawals, messageHash)
785
+
786
+ async def fetch_ohlcv_ws(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
787
+ """
788
+ :see: https://docs.bitvavo.com/#tag/Market-Data/paths/~1{market}~1candles/get
789
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
790
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
791
+ :param str timeframe: the length of time each candle represents
792
+ :param int [since]: timestamp in ms of the earliest candle to fetch
793
+ :param int [limit]: the maximum amount of candles to fetch
794
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
795
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
796
+ """
797
+ await self.load_markets()
798
+ request = self.fetchOHLCVRequest(symbol, timeframe, since, limit, params)
799
+ action = 'getCandles'
800
+ ohlcv = await self.watch_request(action, request)
801
+ return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
802
+
803
+ async def fetch_deposits_ws(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
804
+ """
805
+ :see: https://docs.bitvavo.com/#tag/Account/paths/~1depositHistory/get
806
+ fetch all deposits made to an account
807
+ :param str code: unified currency code
808
+ :param int [since]: the earliest time in ms to fetch deposits for
809
+ :param int [limit]: the maximum number of deposits structures to retrieve
810
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
811
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
812
+ """
813
+ await self.load_markets()
814
+ await self.authenticate()
815
+ request = self.fetchDepositsRequest(code, since, limit, params)
816
+ deposits = await self.watch_request('privateGetDepositHistory', request)
817
+ return self.filter_by_currency_since_limit(deposits, code, since, limit)
818
+
819
+ def handle_deposits(self, client: Client, message):
820
+ #
821
+ # {
822
+ # action: 'privateGetDepositHistory',
823
+ # response: [{
824
+ # timestamp: 1689792085000,
825
+ # symbol: 'BTC',
826
+ # amount: '0.0009',
827
+ # fee: '0',
828
+ # status: 'completed',
829
+ # txId: '7dbadc658d7d59c129de1332c55ee8e08d0ab74432faae03b417b9809c819d1f'
830
+ # },
831
+ # ...
832
+ # ]
833
+ # }
834
+ #
835
+ action = self.safe_string(message, 'action')
836
+ messageHash = self.build_message_hash(action, message)
837
+ response = self.safe_value(message, 'response')
838
+ deposits = self.parse_transactions(response, None, None, None, {'type': 'deposit'})
839
+ client.resolve(deposits, messageHash)
840
+
841
+ async def fetch_trading_fees_ws(self, params={}) -> TradingFees:
842
+ """
843
+ :see: https://docs.bitvavo.com/#tag/Account/paths/~1account/get
844
+ fetch the trading fees for multiple markets
845
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
846
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
847
+ """
848
+ await self.load_markets()
849
+ await self.authenticate()
850
+ return await self.watch_request('privateGetAccount', params)
851
+
852
+ async def fetch_markets_ws(self, params={}):
853
+ """
854
+ :see: https://docs.bitvavo.com/#tag/General/paths/~1markets/get
855
+ retrieves data on all markets for bitvavo
856
+ :param dict [params]: extra parameters specific to the exchange api endpoint
857
+ :returns dict[]: an array of objects representing market data
858
+ """
859
+ return await self.watch_request('getMarkets', params)
860
+
861
+ async def fetch_currencies_ws(self, params={}):
862
+ """
863
+ :see: https://docs.bitvavo.com/#tag/General/paths/~1assets/get
864
+ fetches all available currencies on an exchange
865
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
866
+ :returns dict: an associative dictionary of currencies
867
+ """
868
+ await self.load_markets()
869
+ return await self.watch_request('getAssets', params)
870
+
871
+ def handle_fetch_currencies(self, client: Client, message):
872
+ #
873
+ # {
874
+ # action: 'getAssets',
875
+ # response: [{
876
+ # symbol: '1INCH',
877
+ # name: '1inch',
878
+ # decimals: 8,
879
+ # depositFee: '0',
880
+ # depositConfirmations: 64,
881
+ # depositStatus: 'OK',
882
+ # withdrawalFee: '13',
883
+ # withdrawalMinAmount: '13',
884
+ # withdrawalStatus: 'OK',
885
+ # networks: [Array],
886
+ # message: ''
887
+ # },
888
+ # ...
889
+ # ]
890
+ # }
891
+ #
892
+ action = self.safe_string(message, 'action')
893
+ messageHash = self.build_message_hash(action, message)
894
+ response = self.safe_value(message, 'response')
895
+ currencies = self.parseCurrencies(response)
896
+ client.resolve(currencies, messageHash)
897
+
898
+ def handle_trading_fees(self, client, message):
899
+ #
900
+ # {
901
+ # action: 'privateGetAccount',
902
+ # response: {
903
+ # fees: {
904
+ # taker: '0.0025',
905
+ # maker: '0.0015',
906
+ # volume: '1693.74'
907
+ # }
908
+ # }
909
+ # }
910
+ #
911
+ action = self.safe_string(message, 'action')
912
+ messageHash = self.build_message_hash(action, message)
913
+ response = self.safe_value(message, 'response')
914
+ fees = self.parse_trading_fees(response)
915
+ client.resolve(fees, messageHash)
916
+
917
+ async def fetch_balance_ws(self, params={}) -> Balances:
918
+ """
919
+ :see: https://docs.bitvavo.com/#tag/Account/paths/~1balance/get
920
+ query for balance and get the amount of funds available for trading or funds locked in orders
921
+ :param dict [params]: extra parameters specific to the bitvavo api endpoint
922
+ :returns dict: a `balance structure <https://docs.ccxt.com/en/latest/manual.html?#balance-structure>`
923
+ """
924
+ await self.load_markets()
925
+ await self.authenticate()
926
+ return await self.watch_request('privateGetBalance', params)
927
+
928
+ def handle_fetch_balance(self, client: Client, message):
929
+ #
930
+ # {
931
+ # action: 'privateGetBalance',
932
+ # response: [{
933
+ # symbol: 'ADA',
934
+ # available: '0',
935
+ # inOrder: '0'
936
+ # },
937
+ # ...
938
+ # ]
939
+ # }
940
+ #
941
+ action = self.safe_string(message, 'action', 'privateGetBalance')
942
+ messageHash = self.build_message_hash(action, message)
943
+ response = self.safe_value(message, 'response', [])
944
+ balance = self.parse_balance(response)
945
+ client.resolve(balance, messageHash)
946
+
947
+ def handle_single_order(self, client: Client, message):
948
+ #
949
+ # {
950
+ # action: 'privateCreateOrder',
951
+ # response: {
952
+ # orderId: 'd71df826-1130-478a-8741-d219128675b0',
953
+ # market: 'BTC-EUR',
954
+ # created: 1689792749748,
955
+ # updated: 1689792749748,
956
+ # status: 'new',
957
+ # side: 'sell',
958
+ # orderType: 'limit',
959
+ # amount: '0.0002',
960
+ # amountRemaining: '0.0002',
961
+ # price: '37000',
962
+ # onHold: '0.0002',
963
+ # onHoldCurrency: 'BTC',
964
+ # filledAmount: '0',
965
+ # filledAmountQuote: '0',
966
+ # feePaid: '0',
967
+ # feeCurrency: 'EUR',
968
+ # fills: [],
969
+ # selfTradePrevention: 'decrementAndCancel',
970
+ # visible: True,
971
+ # timeInForce: 'GTC',
972
+ # postOnly: False
973
+ # }
974
+ # }
975
+ #
976
+ action = self.safe_string(message, 'action')
977
+ response = self.safe_value(message, 'response', {})
978
+ order = self.parse_order(response)
979
+ messageHash = self.build_message_hash(action, response)
980
+ client.resolve(order, messageHash)
981
+
982
+ def handle_markets(self, client: Client, message):
983
+ #
984
+ # {
985
+ # action: 'getMarkets',
986
+ # response: [{
987
+ # market: '1INCH-EUR',
988
+ # status: 'trading',
989
+ # base: '1INCH',
990
+ # quote: 'EUR',
991
+ # pricePrecision: 5,
992
+ # minOrderInBaseAsset: '2',
993
+ # minOrderInQuoteAsset: '5',
994
+ # maxOrderInBaseAsset: '1000000000',
995
+ # maxOrderInQuoteAsset: '1000000000',
996
+ # orderTypes: [Array]
997
+ # },
998
+ # ...
999
+ # ]
1000
+ # }
1001
+ #
1002
+ action = self.safe_string(message, 'action')
1003
+ response = self.safe_value(message, 'response', {})
1004
+ markets = self.parse_markets(response)
1005
+ messageHash = self.build_message_hash(action, response)
1006
+ client.resolve(markets, messageHash)
1007
+
1008
+ def build_message_hash(self, action, params={}):
1009
+ methods: dict = {
1010
+ 'privateCreateOrder': self.action_and_market_message_hash,
1011
+ 'privateUpdateOrder': self.action_and_order_id_message_hash,
1012
+ 'privateCancelOrder': self.action_and_order_id_message_hash,
1013
+ 'privateGetOrder': self.action_and_order_id_message_hash,
1014
+ 'privateGetTrades': self.action_and_market_message_hash,
1015
+ }
1016
+ method = self.safe_value(methods, action)
1017
+ messageHash = action
1018
+ if method is not None:
1019
+ messageHash = method(action, params)
1020
+ return messageHash
1021
+
1022
+ def check_message_hash_does_not_exist(self, messageHash):
1023
+ supressMultipleWsRequestsError = self.safe_bool(self.options, 'supressMultipleWsRequestsError', False)
1024
+ if not supressMultipleWsRequestsError:
1025
+ client = self.safe_value(self.clients, self.urls['api']['ws'])
1026
+ if client is not None:
1027
+ future = self.safe_value(client.futures, messageHash)
1028
+ if future is not None:
1029
+ raise ExchangeError(self.id + ' a similar request with messageHash ' + messageHash + ' is already pending, you must wait for a response, or turn off self error by setting supressMultipleWsRequestsError in the options to True')
1030
+
1031
+ def action_and_market_message_hash(self, action, params={}):
1032
+ symbol = self.safe_string(params, 'market', '')
1033
+ return action + symbol
1034
+
1035
+ def action_and_order_id_message_hash(self, action, params={}):
1036
+ orderId = self.safe_string(params, 'orderId')
1037
+ if orderId is None:
1038
+ raise ExchangeError(self.id + ' privateUpdateOrderMessageHash requires a orderId parameter')
1039
+ return action + orderId
1040
+
1041
+ def handle_order(self, client: Client, message):
1042
+ #
1043
+ # {
1044
+ # "event": "order",
1045
+ # "orderId": "f0e5180f-9497-4d05-9dc2-7056e8a2de9b",
1046
+ # "market": "ETH-EUR",
1047
+ # "created": 1590948500319,
1048
+ # "updated": 1590948500319,
1049
+ # "status": "new",
1050
+ # "side": "sell",
1051
+ # "orderType": "limit",
1052
+ # "amount": "0.1",
1053
+ # "amountRemaining": "0.1",
1054
+ # "price": "300",
1055
+ # "onHold": "0.1",
1056
+ # "onHoldCurrency": "ETH",
1057
+ # "selfTradePrevention": "decrementAndCancel",
1058
+ # "visible": True,
1059
+ # "timeInForce": "GTC",
1060
+ # "postOnly": False
1061
+ # }
1062
+ #
1063
+ marketId = self.safe_string(message, 'market')
1064
+ market = self.safe_market(marketId, None, '-')
1065
+ symbol = market['symbol']
1066
+ messageHash = 'order:' + symbol
1067
+ order = self.parse_order(message, market)
1068
+ if self.orders is None:
1069
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
1070
+ self.orders = ArrayCacheBySymbolById(limit)
1071
+ orders = self.orders
1072
+ orders.append(order)
1073
+ client.resolve(self.orders, messageHash)
1074
+
1075
+ def handle_my_trade(self, client: Client, message):
1076
+ #
1077
+ # {
1078
+ # "event": "fill",
1079
+ # "timestamp": 1590964470132,
1080
+ # "market": "ETH-EUR",
1081
+ # "orderId": "85d082e1-eda4-4209-9580-248281a29a9a",
1082
+ # "fillId": "861d2da5-aa93-475c-8d9a-dce431bd4211",
1083
+ # "side": "sell",
1084
+ # "amount": "0.1",
1085
+ # "price": "211.46",
1086
+ # "taker": True,
1087
+ # "fee": "0.056",
1088
+ # "feeCurrency": "EUR"
1089
+ # }
1090
+ #
1091
+ marketId = self.safe_string(message, 'market')
1092
+ market = self.safe_market(marketId, None, '-')
1093
+ symbol = market['symbol']
1094
+ messageHash = 'myTrades:' + symbol
1095
+ trade = self.parse_trade(message, market)
1096
+ if self.myTrades is None:
1097
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
1098
+ self.myTrades = ArrayCache(limit)
1099
+ tradesArray = self.myTrades
1100
+ tradesArray.append(trade)
1101
+ client.resolve(tradesArray, messageHash)
1102
+
1103
+ def handle_subscription_status(self, client: Client, message):
1104
+ #
1105
+ # {
1106
+ # "event": "subscribed",
1107
+ # "subscriptions": {
1108
+ # "book": ["BTC-EUR"]
1109
+ # }
1110
+ # }
1111
+ #
1112
+ subscriptions = self.safe_value(message, 'subscriptions', {})
1113
+ methods: dict = {
1114
+ 'book': self.handle_order_book_subscriptions,
1115
+ }
1116
+ names = list(subscriptions.keys())
1117
+ for i in range(0, len(names)):
1118
+ name = names[i]
1119
+ method = self.safe_value(methods, name)
1120
+ if method is not None:
1121
+ subscription = self.safe_value(subscriptions, name)
1122
+ method(client, message, subscription)
1123
+ return message
1124
+
1125
+ async def authenticate(self, params={}):
1126
+ url = self.urls['api']['ws']
1127
+ client = self.client(url)
1128
+ messageHash = 'authenticated'
1129
+ future = self.safe_value(client.subscriptions, messageHash)
1130
+ if future is None:
1131
+ timestamp = self.milliseconds()
1132
+ stringTimestamp = str(timestamp)
1133
+ auth = stringTimestamp + 'GET/' + self.version + '/websocket'
1134
+ signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
1135
+ action = 'authenticate'
1136
+ request: dict = {
1137
+ 'action': action,
1138
+ 'key': self.apiKey,
1139
+ 'signature': signature,
1140
+ 'timestamp': timestamp,
1141
+ }
1142
+ message = self.extend(request, params)
1143
+ future = await self.watch(url, messageHash, message, messageHash)
1144
+ client.subscriptions[messageHash] = future
1145
+ return future
1146
+
1147
+ def handle_authentication_message(self, client: Client, message):
1148
+ #
1149
+ # {
1150
+ # "event": "authenticate",
1151
+ # "authenticated": True
1152
+ # }
1153
+ #
1154
+ messageHash = 'authenticated'
1155
+ authenticated = self.safe_bool(message, 'authenticated', False)
1156
+ if authenticated:
1157
+ # we resolve the future here permanently so authentication only happens once
1158
+ client.resolve(message, messageHash)
1159
+ else:
1160
+ error = AuthenticationError(self.json(message))
1161
+ client.reject(error, messageHash)
1162
+ # allows further authentication attempts
1163
+ if messageHash in client.subscriptions:
1164
+ del client.subscriptions[messageHash]
1165
+
1166
+ def handle_error_message(self, client: Client, message):
1167
+ #
1168
+ # {
1169
+ # action: 'privateCreateOrder',
1170
+ # market: 'BTC-EUR',
1171
+ # errorCode: 217,
1172
+ # error: 'Minimum order size in quote currency is 5 EUR or 0.001 BTC.'
1173
+ # }
1174
+ #
1175
+ error = self.safe_string(message, 'error')
1176
+ code = self.safe_integer(error, 'errorCode')
1177
+ action = self.safe_string(message, 'action')
1178
+ messageHash = self.build_message_hash(action, message)
1179
+ rejected = False
1180
+ try:
1181
+ self.handle_errors(code, error, client.url, None, None, error, message, None, None)
1182
+ except Exception as e:
1183
+ rejected = True
1184
+ client.reject(e, messageHash)
1185
+ if not rejected:
1186
+ client.reject(message, messageHash)
1187
+
1188
+ def handle_message(self, client: Client, message):
1189
+ #
1190
+ # {
1191
+ # "event": "subscribed",
1192
+ # "subscriptions": {
1193
+ # "book": ["BTC-EUR"]
1194
+ # }
1195
+ # }
1196
+ #
1197
+ # {
1198
+ # "event": "book",
1199
+ # "market": "BTC-EUR",
1200
+ # "nonce": 36729561,
1201
+ # "bids": [
1202
+ # ["8513.3", "0"],
1203
+ # ['8518.8', "0.64236203"],
1204
+ # ['8513.6', "0.32435481"],
1205
+ # ],
1206
+ # "asks": []
1207
+ # }
1208
+ #
1209
+ # {
1210
+ # "action": "getBook",
1211
+ # "response": {
1212
+ # "market": "BTC-EUR",
1213
+ # "nonce": 36946120,
1214
+ # "bids": [
1215
+ # ['8494.9', "0.24399521"],
1216
+ # ['8494.8', "0.34884085"],
1217
+ # ['8493.9', "0.14535128"],
1218
+ # ],
1219
+ # "asks": [
1220
+ # ["8495", "0.46982463"],
1221
+ # ['8495.1', "0.12178267"],
1222
+ # ['8496.2', "0.21924143"],
1223
+ # ]
1224
+ # }
1225
+ # }
1226
+ #
1227
+ # {
1228
+ # "event": "authenticate",
1229
+ # "authenticated": True
1230
+ # }
1231
+ #
1232
+ error = self.safe_string(message, 'error')
1233
+ if error is not None:
1234
+ self.handle_error_message(client, message)
1235
+ methods: dict = {
1236
+ 'subscribed': self.handle_subscription_status,
1237
+ 'book': self.handle_order_book,
1238
+ 'getBook': self.handle_order_book_snapshot,
1239
+ 'trade': self.handle_trade,
1240
+ 'candle': self.handle_ohlcv,
1241
+ 'ticker24h': self.handle_ticker,
1242
+ 'authenticate': self.handle_authentication_message,
1243
+ 'order': self.handle_order,
1244
+ 'fill': self.handle_my_trade,
1245
+ 'privateCreateOrder': self.handle_single_order,
1246
+ 'privateUpdateOrder': self.handle_single_order,
1247
+ 'privateGetBalance': self.handle_fetch_balance,
1248
+ 'privateCancelOrders': self.handle_multiple_orders,
1249
+ 'privateGetOrders': self.handle_multiple_orders,
1250
+ 'privateGetOrder': self.handle_single_order,
1251
+ 'privateCancelOrder': self.handle_single_order,
1252
+ 'privateGetOrdersOpen': self.handle_multiple_orders,
1253
+ 'privateGetAccount': self.handle_trading_fees,
1254
+ 'privateGetDepositHistory': self.handle_deposits,
1255
+ 'privateGetWithdrawalHistory': self.handle_withdraws,
1256
+ 'privateWithdrawAssets': self.handle_withdraw,
1257
+ 'privateGetTrades': self.handle_my_trades,
1258
+ 'getAssets': self.handle_fetch_currencies,
1259
+ 'getCandles': self.handle_fetch_ohlcv,
1260
+ 'getMarkets': self.handle_markets,
1261
+ }
1262
+ event = self.safe_string(message, 'event')
1263
+ method = self.safe_value(methods, event)
1264
+ if method is None:
1265
+ action = self.safe_string(message, 'action')
1266
+ method = self.safe_value(methods, action)
1267
+ if method is not None:
1268
+ method(client, message)
1269
+ else:
1270
+ method(client, message)