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/cryptocom.py ADDED
@@ -0,0 +1,947 @@
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, ArrayCacheBySymbolBySide, ArrayCacheByTimestamp
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Trade
10
+ from ccxt.async_support.base.ws.client import Client
11
+ from typing import List
12
+ from ccxt.base.errors import AuthenticationError
13
+ from ccxt.base.errors import NetworkError
14
+ from ccxt.base.errors import InvalidNonce
15
+
16
+
17
+ class cryptocom(ccxt.async_support.cryptocom):
18
+
19
+ def describe(self):
20
+ return self.deep_extend(super(cryptocom, self).describe(), {
21
+ 'has': {
22
+ 'ws': True,
23
+ 'watchBalance': True,
24
+ 'watchTicker': True,
25
+ 'watchTickers': False,
26
+ 'watchMyTrades': True,
27
+ 'watchTrades': True,
28
+ 'watchTradesForSymbols': True,
29
+ 'watchOrderBook': True,
30
+ 'watchOrderBookForSymbols': True,
31
+ 'watchOrders': True,
32
+ 'watchOHLCV': True,
33
+ 'watchPositions': True,
34
+ 'createOrderWs': True,
35
+ 'cancelOrderWs': True,
36
+ 'cancelAllOrders': True,
37
+ },
38
+ 'urls': {
39
+ 'api': {
40
+ 'ws': {
41
+ 'public': 'wss://stream.crypto.com/exchange/v1/market',
42
+ 'private': 'wss://stream.crypto.com/exchange/v1/user',
43
+ },
44
+ },
45
+ 'test': {
46
+ 'public': 'wss://uat-stream.3ona.co/exchange/v1/market',
47
+ 'private': 'wss://uat-stream.3ona.co/exchange/v1/user',
48
+ },
49
+ },
50
+ 'options': {
51
+ 'watchPositions': {
52
+ 'fetchPositionsSnapshot': True, # or False
53
+ 'awaitPositionsSnapshot': True, # whether to wait for the positions snapshot before providing updates
54
+ },
55
+ },
56
+ 'streaming': {
57
+ },
58
+ })
59
+
60
+ async def pong(self, client, message):
61
+ # {
62
+ # "id": 1587523073344,
63
+ # "method": "public/heartbeat",
64
+ # "code": 0
65
+ # }
66
+ try:
67
+ await client.send({'id': self.safe_integer(message, 'id'), 'method': 'public/respond-heartbeat'})
68
+ except Exception as e:
69
+ error = NetworkError(self.id + ' pong failed with error ' + self.json(e))
70
+ client.reset(error)
71
+
72
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
73
+ """
74
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
75
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
76
+ :param str symbol: unified symbol of the market to fetch the order book for
77
+ :param int [limit]: the maximum amount of order book entries to return
78
+ :param dict [params]: extra parameters specific to the exchange API endpoint
79
+ :param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
80
+ :param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
81
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
82
+ """
83
+ return await self.watch_order_book_for_symbols([symbol], limit, params)
84
+
85
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
86
+ """
87
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
88
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#book-instrument_name
89
+ :param str[] symbols: unified array of symbols
90
+ :param int [limit]: the maximum amount of order book entries to return
91
+ :param dict [params]: extra parameters specific to the exchange API endpoint
92
+ :param str [params.bookSubscriptionType]: The subscription type. Allowed values: SNAPSHOT full snapshot. This is the default if not specified. SNAPSHOT_AND_UPDATE delta updates
93
+ :param int [params.bookUpdateFrequency]: Book update interval in ms. Allowed values: 100 for snapshot subscription 10 for delta subscription
94
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
95
+ """
96
+ await self.load_markets()
97
+ symbols = self.market_symbols(symbols)
98
+ topics = []
99
+ messageHashes = []
100
+ if not limit:
101
+ limit = 50
102
+ topicParams = self.safe_value(params, 'params')
103
+ if topicParams is None:
104
+ params['params'] = {}
105
+ bookSubscriptionType = None
106
+ bookSubscriptionType2 = None
107
+ bookSubscriptionType, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookSubscriptionType', 'SNAPSHOT_AND_UPDATE')
108
+ bookSubscriptionType2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookSubscriptionType', bookSubscriptionType)
109
+ params['params']['bookSubscriptionType'] = bookSubscriptionType2
110
+ bookUpdateFrequency = None
111
+ bookUpdateFrequency2 = None
112
+ bookUpdateFrequency, params = self.handle_option_and_params(params, 'watchOrderBook', 'bookUpdateFrequency')
113
+ bookUpdateFrequency2, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'bookUpdateFrequency', bookUpdateFrequency)
114
+ if bookUpdateFrequency2 is not None:
115
+ params['params']['bookSubscriptionType'] = bookUpdateFrequency2
116
+ for i in range(0, len(symbols)):
117
+ symbol = symbols[i]
118
+ market = self.market(symbol)
119
+ currentTopic = 'book' + '.' + market['id'] + '.' + str(limit)
120
+ messageHash = 'orderbook:' + market['symbol']
121
+ messageHashes.append(messageHash)
122
+ topics.append(currentTopic)
123
+ orderbook = await self.watch_public_multiple(messageHashes, topics, params)
124
+ return orderbook.limit()
125
+
126
+ def handle_delta(self, bookside, delta):
127
+ price = self.safe_float(delta, 0)
128
+ amount = self.safe_float(delta, 1)
129
+ count = self.safe_integer(delta, 2)
130
+ bookside.storeArray([price, amount, count])
131
+
132
+ def handle_deltas(self, bookside, deltas):
133
+ for i in range(0, len(deltas)):
134
+ self.handle_delta(bookside, deltas[i])
135
+
136
+ def handle_order_book(self, client: Client, message):
137
+ #
138
+ # snapshot
139
+ # {
140
+ # "instrument_name":"LTC_USDT",
141
+ # "subscription":"book.LTC_USDT.150",
142
+ # "channel":"book",
143
+ # "depth":150,
144
+ # "data": [
145
+ # {
146
+ # "bids": [
147
+ # [122.21, 0.74041, 4]
148
+ # ],
149
+ # "asks": [
150
+ # [122.29, 0.00002, 1]
151
+ # ]
152
+ # "t": 1648123943803,
153
+ # "s":754560122
154
+ # }
155
+ # ]
156
+ # }
157
+ # update
158
+ # {
159
+ # "instrument_name":"BTC_USDT",
160
+ # "subscription":"book.BTC_USDT.50",
161
+ # "channel":"book.update",
162
+ # "depth":50,
163
+ # "data":[
164
+ # {
165
+ # "update":{
166
+ # "asks":[
167
+ # [
168
+ # "43755.46",
169
+ # "0.10000",
170
+ # "1"
171
+ # ],
172
+ # ...
173
+ # ],
174
+ # "bids":[
175
+ # [
176
+ # "43737.46",
177
+ # "0.14096",
178
+ # "1"
179
+ # ],
180
+ # ...
181
+ # ]
182
+ # },
183
+ # "t":1704484068898,
184
+ # "tt":1704484068892,
185
+ # "u":78795598253024,
186
+ # "pu":78795598162080,
187
+ # "cs":-781431132
188
+ # }
189
+ # ]
190
+ # }
191
+ #
192
+ marketId = self.safe_string(message, 'instrument_name')
193
+ market = self.safe_market(marketId)
194
+ symbol = market['symbol']
195
+ data = self.safe_value(message, 'data')
196
+ data = self.safe_value(data, 0)
197
+ timestamp = self.safe_integer(data, 't')
198
+ if not (symbol in self.orderbooks):
199
+ limit = self.safe_integer(message, 'depth')
200
+ self.orderbooks[symbol] = self.counted_order_book({}, limit)
201
+ orderbook = self.orderbooks[symbol]
202
+ channel = self.safe_string(message, 'channel')
203
+ nonce = self.safe_integer_2(data, 'u', 's')
204
+ books = data
205
+ if channel == 'book': # snapshot
206
+ orderbook.reset({})
207
+ orderbook['symbol'] = symbol
208
+ orderbook['timestamp'] = timestamp
209
+ orderbook['datetime'] = self.iso8601(timestamp)
210
+ orderbook['nonce'] = nonce
211
+ else:
212
+ books = self.safe_value(data, 'update', {})
213
+ previousNonce = self.safe_integer(data, 'pu')
214
+ currentNonce = orderbook['nonce']
215
+ if currentNonce != previousNonce:
216
+ raise InvalidNonce(self.id + ' watchOrderBook() ' + symbol + ' ' + previousNonce + ' != ' + nonce)
217
+ self.handle_deltas(orderbook['asks'], self.safe_value(books, 'asks', []))
218
+ self.handle_deltas(orderbook['bids'], self.safe_value(books, 'bids', []))
219
+ orderbook['nonce'] = nonce
220
+ self.orderbooks[symbol] = orderbook
221
+ messageHash = 'orderbook:' + symbol
222
+ client.resolve(orderbook, messageHash)
223
+
224
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
225
+ """
226
+ get the list of most recent trades for a particular symbol
227
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
228
+ :param str symbol: unified symbol of the market to fetch trades for
229
+ :param int [since]: timestamp in ms of the earliest trade to fetch
230
+ :param int [limit]: the maximum amount of trades to fetch
231
+ :param dict [params]: extra parameters specific to the exchange API endpoint
232
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
233
+ """
234
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
235
+
236
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
237
+ """
238
+ get the list of most recent trades for a particular symbol
239
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#trade-instrument_name
240
+ :param str symbol: unified symbol of the market to fetch trades for
241
+ :param int [since]: timestamp in ms of the earliest trade to fetch
242
+ :param int [limit]: the maximum amount of trades to fetch
243
+ :param dict [params]: extra parameters specific to the exchange API endpoint
244
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
245
+ """
246
+ await self.load_markets()
247
+ symbols = self.market_symbols(symbols)
248
+ topics = []
249
+ for i in range(0, len(symbols)):
250
+ symbol = symbols[i]
251
+ market = self.market(symbol)
252
+ currentTopic = 'trade' + '.' + market['id']
253
+ topics.append(currentTopic)
254
+ trades = await self.watch_public_multiple(topics, topics, params)
255
+ if self.newUpdates:
256
+ first = self.safe_value(trades, 0)
257
+ tradeSymbol = self.safe_string(first, 'symbol')
258
+ limit = trades.getLimit(tradeSymbol, limit)
259
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
260
+
261
+ def handle_trades(self, client: Client, message):
262
+ #
263
+ # {
264
+ # "code": 0,
265
+ # "method": "subscribe",
266
+ # "result": {
267
+ # "instrument_name": "BTC_USDT",
268
+ # "subscription": "trade.BTC_USDT",
269
+ # "channel": "trade",
270
+ # "data": [
271
+ # {
272
+ # "dataTime":1648122434405,
273
+ # "d":"2358394540212355488",
274
+ # "s":"SELL",
275
+ # "p":42980.85,
276
+ # "q":0.002325,
277
+ # "t":1648122434404,
278
+ # "i":"BTC_USDT"
279
+ # }
280
+ # (...)
281
+ # ]
282
+ # }
283
+ #
284
+ channel = self.safe_string(message, 'channel')
285
+ marketId = self.safe_string(message, 'instrument_name')
286
+ symbolSpecificMessageHash = self.safe_string(message, 'subscription')
287
+ market = self.safe_market(marketId)
288
+ symbol = market['symbol']
289
+ stored = self.safe_value(self.trades, symbol)
290
+ if stored is None:
291
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
292
+ stored = ArrayCache(limit)
293
+ self.trades[symbol] = stored
294
+ data = self.safe_value(message, 'data', [])
295
+ dataLength = len(data)
296
+ if dataLength == 0:
297
+ return
298
+ parsedTrades = self.parse_trades(data, market)
299
+ for j in range(0, len(parsedTrades)):
300
+ stored.append(parsedTrades[j])
301
+ channelReplaced = channel.replace('.' + marketId, '')
302
+ client.resolve(stored, symbolSpecificMessageHash)
303
+ client.resolve(stored, channelReplaced)
304
+
305
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
306
+ """
307
+ watches information on multiple trades made by the user
308
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-trade-instrument_name
309
+ :param str symbol: unified market symbol of the market trades were made in
310
+ :param int [since]: the earliest time in ms to fetch trades for
311
+ :param int [limit]: the maximum number of trade structures to retrieve
312
+ :param dict [params]: extra parameters specific to the exchange API endpoint
313
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
314
+ """
315
+ await self.load_markets()
316
+ market = None
317
+ if symbol is not None:
318
+ market = self.market(symbol)
319
+ symbol = market['symbol']
320
+ messageHash = 'user.trade'
321
+ messageHash = (messageHash + '.' + market['id']) if (market is not None) else messageHash
322
+ trades = await self.watch_private_subscribe(messageHash, params)
323
+ if self.newUpdates:
324
+ limit = trades.getLimit(symbol, limit)
325
+ return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
326
+
327
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
328
+ """
329
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
330
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
331
+ :param str symbol: unified symbol of the market to fetch the ticker for
332
+ :param dict [params]: extra parameters specific to the exchange API endpoint
333
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
334
+ """
335
+ await self.load_markets()
336
+ market = self.market(symbol)
337
+ messageHash = 'ticker' + '.' + market['id']
338
+ return await self.watch_public(messageHash, params)
339
+
340
+ def handle_ticker(self, client: Client, message):
341
+ #
342
+ # {
343
+ # "info":{
344
+ # "instrument_name":"BTC_USDT",
345
+ # "subscription":"ticker.BTC_USDT",
346
+ # "channel":"ticker",
347
+ # "data":[
348
+ # {
349
+ # "i":"BTC_USDT",
350
+ # "b":43063.19,
351
+ # "k":43063.2,
352
+ # "a":43063.19,
353
+ # "t":1648121165658,
354
+ # "v":43573.912409,
355
+ # "h":43498.51,
356
+ # "l":41876.58,
357
+ # "c":1087.43
358
+ # }
359
+ # ]
360
+ # }
361
+ # }
362
+ #
363
+ messageHash = self.safe_string(message, 'subscription')
364
+ marketId = self.safe_string(message, 'instrument_name')
365
+ market = self.safe_market(marketId)
366
+ data = self.safe_value(message, 'data', [])
367
+ for i in range(0, len(data)):
368
+ ticker = data[i]
369
+ parsed = self.parse_ticker(ticker, market)
370
+ symbol = parsed['symbol']
371
+ self.tickers[symbol] = parsed
372
+ client.resolve(parsed, messageHash)
373
+
374
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
375
+ """
376
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
377
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#candlestick-time_frame-instrument_name
378
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
379
+ :param str timeframe: the length of time each candle represents
380
+ :param int [since]: timestamp in ms of the earliest candle to fetch
381
+ :param int [limit]: the maximum amount of candles to fetch
382
+ :param dict [params]: extra parameters specific to the exchange API endpoint
383
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
384
+ """
385
+ await self.load_markets()
386
+ market = self.market(symbol)
387
+ symbol = market['symbol']
388
+ interval = self.safe_string(self.timeframes, timeframe, timeframe)
389
+ messageHash = 'candlestick' + '.' + interval + '.' + market['id']
390
+ ohlcv = await self.watch_public(messageHash, params)
391
+ if self.newUpdates:
392
+ limit = ohlcv.getLimit(symbol, limit)
393
+ return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
394
+
395
+ def handle_ohlcv(self, client: Client, message):
396
+ #
397
+ # {
398
+ # "instrument_name": "BTC_USDT",
399
+ # "subscription": "candlestick.1m.BTC_USDT",
400
+ # "channel": "candlestick",
401
+ # "depth": 300,
402
+ # "interval": "1m",
403
+ # "data": [[Object]]
404
+ # }
405
+ #
406
+ messageHash = self.safe_string(message, 'subscription')
407
+ marketId = self.safe_string(message, 'instrument_name')
408
+ market = self.safe_market(marketId)
409
+ symbol = market['symbol']
410
+ interval = self.safe_string(message, 'interval')
411
+ timeframe = self.find_timeframe(interval)
412
+ self.ohlcvs[symbol] = self.safe_value(self.ohlcvs, symbol, {})
413
+ stored = self.safe_value(self.ohlcvs[symbol], timeframe)
414
+ if stored is None:
415
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
416
+ stored = ArrayCacheByTimestamp(limit)
417
+ self.ohlcvs[symbol][timeframe] = stored
418
+ data = self.safe_value(message, 'data')
419
+ for i in range(0, len(data)):
420
+ tick = data[i]
421
+ parsed = self.parse_ohlcv(tick, market)
422
+ stored.append(parsed)
423
+ client.resolve(stored, messageHash)
424
+
425
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
426
+ """
427
+ watches information on multiple orders made by the user
428
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-order-instrument_name
429
+ :param str symbol: unified market symbol of the market orders were made in
430
+ :param int [since]: the earliest time in ms to fetch orders for
431
+ :param int [limit]: the maximum number of order structures to retrieve
432
+ :param dict [params]: extra parameters specific to the exchange API endpoint
433
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
434
+ """
435
+ await self.load_markets()
436
+ market = None
437
+ if symbol is not None:
438
+ market = self.market(symbol)
439
+ symbol = market['symbol']
440
+ messageHash = 'user.order'
441
+ messageHash = (messageHash + '.' + market['id']) if (market is not None) else messageHash
442
+ orders = await self.watch_private_subscribe(messageHash, params)
443
+ if self.newUpdates:
444
+ limit = orders.getLimit(symbol, limit)
445
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
446
+
447
+ def handle_orders(self, client: Client, message, subscription=None):
448
+ #
449
+ # {
450
+ # "method": "subscribe",
451
+ # "result": {
452
+ # "instrument_name": "ETH_CRO",
453
+ # "subscription": "user.order.ETH_CRO",
454
+ # "channel": "user.order",
455
+ # "data": [
456
+ # {
457
+ # "status": "ACTIVE",
458
+ # "side": "BUY",
459
+ # "price": 1,
460
+ # "quantity": 1,
461
+ # "order_id": "366455245775097673",
462
+ # "client_oid": "my_order_0002",
463
+ # "create_time": 1588758017375,
464
+ # "update_time": 1588758017411,
465
+ # "type": "LIMIT",
466
+ # "instrument_name": "ETH_CRO",
467
+ # "cumulative_quantity": 0,
468
+ # "cumulative_value": 0,
469
+ # "avg_price": 0,
470
+ # "fee_currency": "CRO",
471
+ # "time_in_force":"GOOD_TILL_CANCEL"
472
+ # }
473
+ # ],
474
+ # "channel": "user.order.ETH_CRO"
475
+ # }
476
+ # }
477
+ #
478
+ channel = self.safe_string(message, 'channel')
479
+ symbolSpecificMessageHash = self.safe_string(message, 'subscription')
480
+ orders = self.safe_value(message, 'data', [])
481
+ ordersLength = len(orders)
482
+ if ordersLength > 0:
483
+ if self.orders is None:
484
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
485
+ self.orders = ArrayCacheBySymbolById(limit)
486
+ stored = self.orders
487
+ parsed = self.parse_orders(orders)
488
+ for i in range(0, len(parsed)):
489
+ stored.append(parsed[i])
490
+ client.resolve(stored, symbolSpecificMessageHash)
491
+ # non-symbol specific
492
+ client.resolve(stored, channel) # channel might have a symbol-specific suffix
493
+ client.resolve(stored, 'user.order')
494
+
495
+ async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
496
+ """
497
+ watch all open positions
498
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-position_balance
499
+ :param str[]|None symbols: list of unified market symbols
500
+ :param dict params: extra parameters specific to the exchange API endpoint
501
+ :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
502
+ """
503
+ await self.load_markets()
504
+ await self.authenticate()
505
+ url = self.urls['api']['ws']['private']
506
+ id = self.nonce()
507
+ request: dict = {
508
+ 'method': 'subscribe',
509
+ 'params': {
510
+ 'channels': ['user.position_balance'],
511
+ },
512
+ 'nonce': id,
513
+ }
514
+ messageHash = 'positions'
515
+ symbols = self.market_symbols(symbols)
516
+ if not self.is_empty(symbols):
517
+ messageHash = '::' + ','.join(symbols)
518
+ client = self.client(url)
519
+ self.set_positions_cache(client, symbols)
520
+ fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', True)
521
+ awaitPositionsSnapshot = self.safe_bool('watchPositions', 'awaitPositionsSnapshot', True)
522
+ if fetchPositionsSnapshot and awaitPositionsSnapshot and self.positions is None:
523
+ snapshot = await client.future('fetchPositionsSnapshot')
524
+ return self.filter_by_symbols_since_limit(snapshot, symbols, since, limit, True)
525
+ newPositions = await self.watch(url, messageHash, self.extend(request, params))
526
+ if self.newUpdates:
527
+ return newPositions
528
+ return self.filter_by_symbols_since_limit(self.positions, symbols, since, limit, True)
529
+
530
+ def set_positions_cache(self, client: Client, type, symbols: Strings = None):
531
+ fetchPositionsSnapshot = self.handle_option('watchPositions', 'fetchPositionsSnapshot', False)
532
+ if fetchPositionsSnapshot:
533
+ messageHash = 'fetchPositionsSnapshot'
534
+ if not (messageHash in client.futures):
535
+ client.future(messageHash)
536
+ self.spawn(self.load_positions_snapshot, client, messageHash)
537
+ else:
538
+ self.positions = ArrayCacheBySymbolBySide()
539
+
540
+ async def load_positions_snapshot(self, client, messageHash):
541
+ positions = await self.fetch_positions()
542
+ self.positions = ArrayCacheBySymbolBySide()
543
+ cache = self.positions
544
+ for i in range(0, len(positions)):
545
+ position = positions[i]
546
+ contracts = self.safe_number(position, 'contracts', 0)
547
+ if contracts > 0:
548
+ cache.append(position)
549
+ # don't remove the future from the .futures cache
550
+ future = client.futures[messageHash]
551
+ future.resolve(cache)
552
+ client.resolve(cache, 'positions')
553
+
554
+ def handle_positions(self, client, message):
555
+ #
556
+ # {
557
+ # "subscription": "user.position_balance",
558
+ # "channel": "user.position_balance",
559
+ # "data": [{
560
+ # "balances": [{
561
+ # "instrument_name": "USD",
562
+ # "quantity": "8.9979961950886",
563
+ # "update_timestamp_ms": 1695598760597,
564
+ # }],
565
+ # "positions": [{
566
+ # "account_id": "96a0edb1-afb5-4c7c-af89-5cb610319e2c",
567
+ # "instrument_name": "LTCUSD-PERP",
568
+ # "type": "PERPETUAL_SWAP",
569
+ # "quantity": "1.8",
570
+ # "cost": "114.766",
571
+ # "open_position_pnl": "-0.0216206",
572
+ # "session_pnl": "0.00962994",
573
+ # "update_timestamp_ms": 1695598760597,
574
+ # "open_pos_cost": "114.766",
575
+ # }],
576
+ # }],
577
+ # }
578
+ #
579
+ # each account is connected to a different endpoint
580
+ # and has exactly one subscriptionhash which is the account type
581
+ data = self.safe_value(message, 'data', [])
582
+ firstData = self.safe_value(data, 0, {})
583
+ rawPositions = self.safe_value(firstData, 'positions', [])
584
+ if self.positions is None:
585
+ self.positions = ArrayCacheBySymbolBySide()
586
+ cache = self.positions
587
+ newPositions = []
588
+ for i in range(0, len(rawPositions)):
589
+ rawPosition = rawPositions[i]
590
+ position = self.parse_position(rawPosition)
591
+ newPositions.append(position)
592
+ cache.append(position)
593
+ messageHashes = self.find_message_hashes(client, 'positions::')
594
+ for i in range(0, len(messageHashes)):
595
+ messageHash = messageHashes[i]
596
+ parts = messageHash.split('::')
597
+ symbolsString = parts[1]
598
+ symbols = symbolsString.split(',')
599
+ positions = self.filter_by_array(newPositions, 'symbol', symbols, False)
600
+ if not self.is_empty(positions):
601
+ client.resolve(positions, messageHash)
602
+ client.resolve(newPositions, 'positions')
603
+
604
+ async def watch_balance(self, params={}) -> Balances:
605
+ """
606
+ watch balance and get the amount of funds available for trading or funds locked in orders
607
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#user-balance
608
+ :param dict [params]: extra parameters specific to the exchange API endpoint
609
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
610
+ """
611
+ messageHash = 'user.balance'
612
+ return await self.watch_private_subscribe(messageHash, params)
613
+
614
+ def handle_balance(self, client: Client, message):
615
+ #
616
+ # {
617
+ # "id": 1,
618
+ # "method": "subscribe",
619
+ # "code": 0,
620
+ # "result": {
621
+ # "subscription": "user.balance",
622
+ # "channel": "user.balance",
623
+ # "data": [
624
+ # {
625
+ # "total_available_balance": "5.84684368",
626
+ # "total_margin_balance": "5.84684368",
627
+ # "total_initial_margin": "0",
628
+ # "total_maintenance_margin": "0",
629
+ # "total_position_cost": "0",
630
+ # "total_cash_balance": "6.44412101",
631
+ # "total_collateral_value": "5.846843685",
632
+ # "total_session_unrealized_pnl": "0",
633
+ # "instrument_name": "USD",
634
+ # "total_session_realized_pnl": "0",
635
+ # "position_balances": [
636
+ # {
637
+ # "quantity": "0.0002119875",
638
+ # "reserved_qty": "0",
639
+ # "collateral_weight": "0.9",
640
+ # "collateral_amount": "5.37549592",
641
+ # "market_value": "5.97277325",
642
+ # "max_withdrawal_balance": "0.00021198",
643
+ # "instrument_name": "BTC",
644
+ # "hourly_interest_rate": "0"
645
+ # },
646
+ # ],
647
+ # "total_effective_leverage": "0",
648
+ # "position_limit": "3000000",
649
+ # "used_position_limit": "0",
650
+ # "total_borrow": "0",
651
+ # "margin_score": "0",
652
+ # "is_liquidating": False,
653
+ # "has_risk": False,
654
+ # "terminatable": True
655
+ # }
656
+ # ]
657
+ # }
658
+ # }
659
+ #
660
+ messageHash = self.safe_string(message, 'subscription')
661
+ data = self.safe_value(message, 'data', [])
662
+ positionBalances = self.safe_value(data[0], 'position_balances', [])
663
+ self.balance['info'] = data
664
+ for i in range(0, len(positionBalances)):
665
+ balance = positionBalances[i]
666
+ currencyId = self.safe_string(balance, 'instrument_name')
667
+ code = self.safe_currency_code(currencyId)
668
+ account = self.account()
669
+ account['total'] = self.safe_string(balance, 'quantity')
670
+ account['used'] = self.safe_string(balance, 'reserved_qty')
671
+ self.balance[code] = account
672
+ self.balance = self.safe_balance(self.balance)
673
+ client.resolve(self.balance, messageHash)
674
+ messageHashRequest = self.safe_string(message, 'id')
675
+ client.resolve(self.balance, messageHashRequest)
676
+
677
+ async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
678
+ """
679
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
680
+ create a trade order
681
+ :param str symbol: unified symbol of the market to create an order in
682
+ :param str type: 'market' or 'limit'
683
+ :param str side: 'buy' or 'sell'
684
+ :param float amount: how much of currency you want to trade in units of base currency
685
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
686
+ :param dict [params]: extra parameters specific to the exchange API endpoint
687
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
688
+ """
689
+ await self.load_markets()
690
+ params = self.create_order_request(symbol, type, side, amount, price, params)
691
+ request: dict = {
692
+ 'method': 'private/create-order',
693
+ 'params': params,
694
+ }
695
+ messageHash = self.nonce()
696
+ return await self.watch_private_request(messageHash, request)
697
+
698
+ def handle_order(self, client: Client, message):
699
+ #
700
+ # {
701
+ # "id": 1,
702
+ # "method": "private/create-order",
703
+ # "code": 0,
704
+ # "result": {
705
+ # "client_oid": "c5f682ed-7108-4f1c-b755-972fcdca0f02",
706
+ # "order_id": "18342311"
707
+ # }
708
+ # }
709
+ #
710
+ messageHash = self.safe_string(message, 'id')
711
+ rawOrder = self.safe_value(message, 'result', {})
712
+ order = self.parse_order(rawOrder)
713
+ client.resolve(order, messageHash)
714
+
715
+ async def cancel_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
716
+ """
717
+ cancels an open order
718
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
719
+ :param str id: the order id of the order to cancel
720
+ :param str [symbol]: unified symbol of the market the order was made in
721
+ :param dict [params]: extra parameters specific to the exchange API endpoint
722
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
723
+ """
724
+ await self.load_markets()
725
+ params = self.extend({
726
+ 'order_id': id,
727
+ }, params)
728
+ request: dict = {
729
+ 'method': 'private/cancel-order',
730
+ 'params': params,
731
+ }
732
+ messageHash = self.nonce()
733
+ return await self.watch_private_request(messageHash, request)
734
+
735
+ async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
736
+ """
737
+ cancel all open orders
738
+ :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
739
+ :param str symbol: unified market symbol of the orders to cancel
740
+ :param dict [params]: extra parameters specific to the exchange API endpoint
741
+ :returns dict} Returns exchange raw message {@link https://docs.ccxt.com/#/?id=order-structure:
742
+ """
743
+ await self.load_markets()
744
+ market = None
745
+ request: dict = {
746
+ 'method': 'private/cancel-all-orders',
747
+ 'params': self.extend({}, params),
748
+ }
749
+ if symbol is not None:
750
+ market = self.market(symbol)
751
+ request['params']['instrument_name'] = market['id']
752
+ messageHash = self.nonce()
753
+ return await self.watch_private_request(messageHash, request)
754
+
755
+ def handle_cancel_all_orders(self, client: Client, message):
756
+ #
757
+ # {
758
+ # "id": 1688914586647,
759
+ # "method": "private/cancel-all-orders",
760
+ # "code": 0
761
+ # }
762
+ #
763
+ messageHash = self.safe_string(message, 'id')
764
+ client.resolve(message, messageHash)
765
+
766
+ async def watch_public(self, messageHash, params={}):
767
+ url = self.urls['api']['ws']['public']
768
+ id = self.nonce()
769
+ request: dict = {
770
+ 'method': 'subscribe',
771
+ 'params': {
772
+ 'channels': [messageHash],
773
+ },
774
+ 'nonce': id,
775
+ }
776
+ message = self.extend(request, params)
777
+ return await self.watch(url, messageHash, message, messageHash)
778
+
779
+ async def watch_public_multiple(self, messageHashes, topics, params={}):
780
+ url = self.urls['api']['ws']['public']
781
+ id = self.nonce()
782
+ request: dict = {
783
+ 'method': 'subscribe',
784
+ 'params': {
785
+ 'channels': topics,
786
+ },
787
+ 'nonce': id,
788
+ }
789
+ message = self.deep_extend(request, params)
790
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
791
+
792
+ async def watch_private_request(self, nonce, params={}):
793
+ await self.authenticate()
794
+ url = self.urls['api']['ws']['private']
795
+ request: dict = {
796
+ 'id': nonce,
797
+ 'nonce': nonce,
798
+ }
799
+ message = self.extend(request, params)
800
+ return await self.watch(url, str(nonce), message, True)
801
+
802
+ async def watch_private_subscribe(self, messageHash, params={}):
803
+ await self.authenticate()
804
+ url = self.urls['api']['ws']['private']
805
+ id = self.nonce()
806
+ request: dict = {
807
+ 'method': 'subscribe',
808
+ 'params': {
809
+ 'channels': [messageHash],
810
+ },
811
+ 'nonce': id,
812
+ }
813
+ message = self.extend(request, params)
814
+ return await self.watch(url, messageHash, message, messageHash)
815
+
816
+ def handle_error_message(self, client: Client, message):
817
+ #
818
+ # {
819
+ # "id": 0,
820
+ # "code": 10004,
821
+ # "method": "subscribe",
822
+ # "message": "invalid channel {"channels":["trade.BTCUSD-PERP"]}"
823
+ # }
824
+ #
825
+ errorCode = self.safe_string(message, 'code')
826
+ try:
827
+ if errorCode and errorCode != '0':
828
+ feedback = self.id + ' ' + self.json(message)
829
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
830
+ messageString = self.safe_value(message, 'message')
831
+ if messageString is not None:
832
+ self.throw_broadly_matched_exception(self.exceptions['broad'], messageString, feedback)
833
+ return False
834
+ except Exception as e:
835
+ if isinstance(e, AuthenticationError):
836
+ messageHash = 'authenticated'
837
+ client.reject(e, messageHash)
838
+ if messageHash in client.subscriptions:
839
+ del client.subscriptions[messageHash]
840
+ else:
841
+ client.reject(e)
842
+ return True
843
+
844
+ def handle_subscribe(self, client: Client, message):
845
+ methods: dict = {
846
+ 'candlestick': self.handle_ohlcv,
847
+ 'ticker': self.handle_ticker,
848
+ 'trade': self.handle_trades,
849
+ 'book': self.handle_order_book,
850
+ 'book.update': self.handle_order_book,
851
+ 'user.order': self.handle_orders,
852
+ 'user.trade': self.handle_trades,
853
+ 'user.balance': self.handle_balance,
854
+ 'user.position_balance': self.handle_positions,
855
+ }
856
+ result = self.safe_value_2(message, 'result', 'info')
857
+ channel = self.safe_string(result, 'channel')
858
+ if (channel is not None) and channel.find('user.trade') > -1:
859
+ # channel might be user.trade.BTC_USDT
860
+ self.handle_trades(client, result)
861
+ if (channel is not None) and channel.startswith('user.order'):
862
+ # channel might be user.order.BTC_USDT
863
+ self.handle_orders(client, result)
864
+ method = self.safe_value(methods, channel)
865
+ if method is not None:
866
+ method(client, result)
867
+
868
+ def handle_message(self, client: Client, message):
869
+ #
870
+ # ping
871
+ # {
872
+ # "id": 1587523073344,
873
+ # "method": "public/heartbeat",
874
+ # "code": 0
875
+ # }
876
+ # auth
877
+ # {id: 1648132625434, method: "public/auth", code: 0}
878
+ # ohlcv
879
+ # {
880
+ # "code": 0,
881
+ # "method": "subscribe",
882
+ # "result": {
883
+ # "instrument_name": "BTC_USDT",
884
+ # "subscription": "candlestick.1m.BTC_USDT",
885
+ # "channel": "candlestick",
886
+ # "depth": 300,
887
+ # "interval": "1m",
888
+ # "data": [[Object]]
889
+ # }
890
+ # }
891
+ # ticker
892
+ # {
893
+ # "info":{
894
+ # "instrument_name":"BTC_USDT",
895
+ # "subscription":"ticker.BTC_USDT",
896
+ # "channel":"ticker",
897
+ # "data":[{}]
898
+ #
899
+ if self.handle_error_message(client, message):
900
+ return
901
+ method = self.safe_string(message, 'method')
902
+ methods: dict = {
903
+ '': self.handle_ping,
904
+ 'public/heartbeat': self.handle_ping,
905
+ 'public/auth': self.handle_authenticate,
906
+ 'private/create-order': self.handle_order,
907
+ 'private/cancel-order': self.handle_order,
908
+ 'private/cancel-all-orders': self.handle_cancel_all_orders,
909
+ 'private/close-position': self.handle_order,
910
+ 'subscribe': self.handle_subscribe,
911
+ }
912
+ callMethod = self.safe_value(methods, method)
913
+ if callMethod is not None:
914
+ callMethod(client, message)
915
+
916
+ async def authenticate(self, params={}):
917
+ self.check_required_credentials()
918
+ url = self.urls['api']['ws']['private']
919
+ client = self.client(url)
920
+ messageHash = 'authenticated'
921
+ future = client.future(messageHash)
922
+ authenticated = self.safe_value(client.subscriptions, messageHash)
923
+ if authenticated is None:
924
+ method = 'public/auth'
925
+ nonce = str(self.nonce())
926
+ auth = method + nonce + self.apiKey + nonce
927
+ signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
928
+ request: dict = {
929
+ 'id': nonce,
930
+ 'nonce': nonce,
931
+ 'method': method,
932
+ 'api_key': self.apiKey,
933
+ 'sig': signature,
934
+ }
935
+ message = self.extend(request, params)
936
+ self.watch(url, messageHash, message, messageHash)
937
+ return await future
938
+
939
+ def handle_ping(self, client: Client, message):
940
+ self.spawn(self.pong, client, message)
941
+
942
+ def handle_authenticate(self, client: Client, message):
943
+ #
944
+ # {id: 1648132625434, method: "public/auth", code: 0}
945
+ #
946
+ future = self.safe_value(client.futures, 'authenticated')
947
+ future.resolve(True)