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/deribit.py ADDED
@@ -0,0 +1,892 @@
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, Order, OrderBook, Str, Ticker, Trade
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 ArgumentsRequired
14
+ from ccxt.base.errors import NotSupported
15
+
16
+
17
+ class deribit(ccxt.async_support.deribit):
18
+
19
+ def describe(self):
20
+ return self.deep_extend(super(deribit, self).describe(), {
21
+ 'has': {
22
+ 'ws': True,
23
+ 'watchBalance': True,
24
+ 'watchTicker': True,
25
+ 'watchTickers': False,
26
+ 'watchTrades': True,
27
+ 'watchTradesForSymbols': True,
28
+ 'watchMyTrades': True,
29
+ 'watchOrders': True,
30
+ 'watchOrderBook': True,
31
+ 'watchOrderBookForSymbols': True,
32
+ 'watchOHLCV': True,
33
+ 'watchOHLCVForSymbols': True,
34
+ },
35
+ 'urls': {
36
+ 'test': {
37
+ 'ws': 'wss://test.deribit.com/ws/api/v2',
38
+ },
39
+ 'api': {
40
+ 'ws': 'wss://www.deribit.com/ws/api/v2',
41
+ },
42
+ },
43
+ 'options': {
44
+ 'ws': {
45
+ 'timeframes': {
46
+ '1m': '1',
47
+ '3m': '3',
48
+ '5m': '5',
49
+ '15m': '15',
50
+ '30m': '30',
51
+ '1h': '60',
52
+ '2h': '120',
53
+ '4h': '180',
54
+ '6h': '360',
55
+ '12h': '720',
56
+ '1d': '1D',
57
+ },
58
+ # watchTrades replacement
59
+ 'watchTradesForSymbols': {
60
+ 'interval': '100ms', # 100ms, agg2, raw
61
+ },
62
+ # watchOrderBook replacement
63
+ 'watchOrderBookForSymbols': {
64
+ 'interval': '100ms', # 100ms, agg2, raw
65
+ 'useDepthEndpoint': False, # if True, it will use the {books.group.depth.interval} endpoint instead of the {books.interval} endpoint
66
+ 'depth': '20', # 1, 10, 20
67
+ 'group': 'none', # none, 1, 2, 5, 10, 25, 100, 250
68
+ },
69
+ },
70
+ 'currencies': ['BTC', 'ETH', 'SOL', 'USDC'],
71
+ },
72
+ 'streaming': {
73
+ },
74
+ 'exceptions': {
75
+ },
76
+ })
77
+
78
+ def request_id(self):
79
+ requestId = self.sum(self.safe_integer(self.options, 'requestId', 0), 1)
80
+ self.options['requestId'] = requestId
81
+ return requestId
82
+
83
+ async def watch_balance(self, params={}) -> Balances:
84
+ """
85
+ :see: https://docs.deribit.com/#user-portfolio-currency
86
+ watch balance and get the amount of funds available for trading or funds locked in orders
87
+ :param dict [params]: extra parameters specific to the exchange API endpoint
88
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
89
+ """
90
+ await self.authenticate(params)
91
+ messageHash = 'balance'
92
+ url = self.urls['api']['ws']
93
+ currencies = self.safe_value(self.options, 'currencies', [])
94
+ channels = []
95
+ for i in range(0, len(currencies)):
96
+ currencyCode = currencies[i]
97
+ channels.append('user.portfolio.' + currencyCode)
98
+ subscribe: dict = {
99
+ 'jsonrpc': '2.0',
100
+ 'method': 'private/subscribe',
101
+ 'params': {
102
+ 'channels': channels,
103
+ },
104
+ 'id': self.request_id(),
105
+ }
106
+ request = self.deep_extend(subscribe, params)
107
+ return await self.watch(url, messageHash, request, messageHash, request)
108
+
109
+ def handle_balance(self, client: Client, message):
110
+ #
111
+ # subscription
112
+ # {
113
+ # "jsonrpc": "2.0",
114
+ # "method": "subscription",
115
+ # "params": {
116
+ # "channel": "user.portfolio.btc",
117
+ # "data": {
118
+ # "total_pl": 0,
119
+ # "session_upl": 0,
120
+ # "session_rpl": 0,
121
+ # "projected_maintenance_margin": 0,
122
+ # "projected_initial_margin": 0,
123
+ # "projected_delta_total": 0,
124
+ # "portfolio_margining_enabled": False,
125
+ # "options_vega": 0,
126
+ # "options_value": 0,
127
+ # "options_theta": 0,
128
+ # "options_session_upl": 0,
129
+ # "options_session_rpl": 0,
130
+ # "options_pl": 0,
131
+ # "options_gamma": 0,
132
+ # "options_delta": 0,
133
+ # "margin_balance": 0.0015,
134
+ # "maintenance_margin": 0,
135
+ # "initial_margin": 0,
136
+ # "futures_session_upl": 0,
137
+ # "futures_session_rpl": 0,
138
+ # "futures_pl": 0,
139
+ # "fee_balance": 0,
140
+ # "estimated_liquidation_ratio_map": {},
141
+ # "estimated_liquidation_ratio": 0,
142
+ # "equity": 0.0015,
143
+ # "delta_total_map": {},
144
+ # "delta_total": 0,
145
+ # "currency": "BTC",
146
+ # "balance": 0.0015,
147
+ # "available_withdrawal_funds": 0.0015,
148
+ # "available_funds": 0.0015
149
+ # }
150
+ # }
151
+ # }
152
+ #
153
+ params = self.safe_value(message, 'params', {})
154
+ data = self.safe_value(params, 'data', {})
155
+ self.balance['info'] = data
156
+ currencyId = self.safe_string(data, 'currency')
157
+ currencyCode = self.safe_currency_code(currencyId)
158
+ balance = self.parse_balance(data)
159
+ self.balance[currencyCode] = balance
160
+ messageHash = 'balance'
161
+ client.resolve(self.balance, messageHash)
162
+
163
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
164
+ """
165
+ :see: https://docs.deribit.com/#ticker-instrument_name-interval
166
+ watches a price ticker, a statistical calculation with the information for a specific market.
167
+ :param str symbol: unified symbol of the market to fetch the ticker for
168
+ :param dict [params]: extra parameters specific to the exchange API endpoint
169
+ :param str [params.interval]: specify aggregation and frequency of notifications. Possible values: 100ms, raw
170
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
171
+ """
172
+ await self.load_markets()
173
+ market = self.market(symbol)
174
+ url = self.urls['api']['ws']
175
+ interval = self.safe_string(params, 'interval', '100ms')
176
+ params = self.omit(params, 'interval')
177
+ await self.load_markets()
178
+ if interval == 'raw':
179
+ await self.authenticate()
180
+ channel = 'ticker.' + market['id'] + '.' + interval
181
+ message: dict = {
182
+ 'jsonrpc': '2.0',
183
+ 'method': 'public/subscribe',
184
+ 'params': {
185
+ 'channels': ['ticker.' + market['id'] + '.' + interval],
186
+ },
187
+ 'id': self.request_id(),
188
+ }
189
+ request = self.deep_extend(message, params)
190
+ return await self.watch(url, channel, request, channel, request)
191
+
192
+ def handle_ticker(self, client: Client, message):
193
+ #
194
+ # {
195
+ # "jsonrpc": "2.0",
196
+ # "method": "subscription",
197
+ # "params": {
198
+ # "channel": "ticker.BTC_USDC-PERPETUAL.raw",
199
+ # "data": {
200
+ # "timestamp": 1655393725040,
201
+ # "stats": [Object],
202
+ # "state": "open",
203
+ # "settlement_price": 21729.5891,
204
+ # "open_interest": 164.501,
205
+ # "min_price": 20792.9376,
206
+ # "max_price": 21426.225,
207
+ # "mark_price": 21109.555,
208
+ # "last_price": 21132,
209
+ # "instrument_name": "BTC_USDC-PERPETUAL",
210
+ # "index_price": 21122.3937,
211
+ # "funding_8h": -0.00022427,
212
+ # "estimated_delivery_price": 21122.3937,
213
+ # "current_funding": -0.00010782,
214
+ # "best_bid_price": 21106,
215
+ # "best_bid_amount": 1.143,
216
+ # "best_ask_price": 21113,
217
+ # "best_ask_amount": 0.327
218
+ # }
219
+ # }
220
+ # }
221
+ #
222
+ params = self.safe_value(message, 'params', {})
223
+ data = self.safe_value(params, 'data', {})
224
+ marketId = self.safe_string(data, 'instrument_name')
225
+ symbol = self.safe_symbol(marketId)
226
+ ticker = self.parse_ticker(data)
227
+ messageHash = self.safe_string(params, 'channel')
228
+ self.tickers[symbol] = ticker
229
+ client.resolve(ticker, messageHash)
230
+
231
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
232
+ """
233
+ get the list of most recent trades for a particular symbol
234
+ :see: https://docs.deribit.com/#trades-instrument_name-interval
235
+ :param str symbol: unified symbol of the market to fetch trades for
236
+ :param int [since]: timestamp in ms of the earliest trade to fetch
237
+ :param int [limit]: the maximum amount of trades to fetch
238
+ :param dict [params]: extra parameters specific to the exchange API endpoint
239
+ :param str [params.interval]: specify aggregation and frequency of notifications. Possible values: 100ms, raw
240
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
241
+ """
242
+ params['callerMethodName'] = 'watchTrades'
243
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
244
+
245
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
246
+ """
247
+ get the list of most recent trades for a list of symbols
248
+ :see: https://docs.deribit.com/#trades-instrument_name-interval
249
+ :param str[] symbols: unified symbol of the market to fetch trades for
250
+ :param int [since]: timestamp in ms of the earliest trade to fetch
251
+ :param int [limit]: the maximum amount of trades to fetch
252
+ :param dict [params]: extra parameters specific to the exchange API endpoint
253
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
254
+ """
255
+ interval = None
256
+ interval, params = self.handle_option_and_params(params, 'watchTradesForSymbols', 'interval', '100ms')
257
+ if interval == 'raw':
258
+ await self.authenticate()
259
+ trades = await self.watch_multiple_wrapper('trades', interval, symbols, params)
260
+ if self.newUpdates:
261
+ first = self.safe_dict(trades, 0)
262
+ tradeSymbol = self.safe_string(first, 'symbol')
263
+ limit = trades.getLimit(tradeSymbol, limit)
264
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
265
+
266
+ def handle_trades(self, client: Client, message):
267
+ #
268
+ # {
269
+ # "jsonrpc": "2.0",
270
+ # "method": "subscription",
271
+ # "params": {
272
+ # "channel": "trades.BTC_USDC-PERPETUAL.100ms",
273
+ # "data": [{
274
+ # "trade_seq": 501899,
275
+ # "trade_id": "USDC-2436803",
276
+ # "timestamp": 1655397355998,
277
+ # "tick_direction": 2,
278
+ # "price": 21026,
279
+ # "mark_price": 21019.9719,
280
+ # "instrument_name": "BTC_USDC-PERPETUAL",
281
+ # "index_price": 21031.7847,
282
+ # "direction": "buy",
283
+ # "amount": 0.049
284
+ # }]
285
+ # }
286
+ # }
287
+ #
288
+ params = self.safe_dict(message, 'params', {})
289
+ channel = self.safe_string(params, 'channel', '')
290
+ parts = channel.split('.')
291
+ marketId = self.safe_string(parts, 1)
292
+ interval = self.safe_string(parts, 2)
293
+ symbol = self.safe_symbol(marketId)
294
+ market = self.safe_market(marketId)
295
+ trades = self.safe_list(params, 'data', [])
296
+ if self.safe_value(self.trades, symbol) is None:
297
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
298
+ self.trades[symbol] = ArrayCache(limit)
299
+ stored = self.trades[symbol]
300
+ for i in range(0, len(trades)):
301
+ trade = trades[i]
302
+ parsed = self.parse_trade(trade, market)
303
+ stored.append(parsed)
304
+ self.trades[symbol] = stored
305
+ messageHash = 'trades|' + symbol + '|' + interval
306
+ client.resolve(self.trades[symbol], messageHash)
307
+
308
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
309
+ """
310
+ get the list of trades associated with the user
311
+ :see: https://docs.deribit.com/#user-trades-instrument_name-interval
312
+ :param str symbol: unified symbol of the market to fetch trades for. Use 'any' to watch all trades
313
+ :param int [since]: timestamp in ms of the earliest trade to fetch
314
+ :param int [limit]: the maximum amount of trades to fetch
315
+ :param dict [params]: extra parameters specific to the exchange API endpoint
316
+ :param str [params.interval]: specify aggregation and frequency of notifications. Possible values: 100ms, raw
317
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
318
+ """
319
+ await self.authenticate(params)
320
+ if symbol is not None:
321
+ await self.load_markets()
322
+ symbol = self.symbol(symbol)
323
+ url = self.urls['api']['ws']
324
+ interval = self.safe_string(params, 'interval', 'raw')
325
+ params = self.omit(params, 'interval')
326
+ channel = 'user.trades.any.any.' + interval
327
+ message: dict = {
328
+ 'jsonrpc': '2.0',
329
+ 'method': 'private/subscribe',
330
+ 'params': {
331
+ 'channels': [channel],
332
+ },
333
+ 'id': self.request_id(),
334
+ }
335
+ request = self.deep_extend(message, params)
336
+ trades = await self.watch(url, channel, request, channel, request)
337
+ return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
338
+
339
+ def handle_my_trades(self, client: Client, message):
340
+ #
341
+ # {
342
+ # "jsonrpc": "2.0",
343
+ # "method": "subscription",
344
+ # "params": {
345
+ # "channel": "user.trades.any.any.raw",
346
+ # "data": [{
347
+ # "trade_seq": 149546319,
348
+ # "trade_id": "219381310",
349
+ # "timestamp": 1655421193564,
350
+ # "tick_direction": 0,
351
+ # "state": "filled",
352
+ # "self_trade": False,
353
+ # "reduce_only": False,
354
+ # "profit_loss": 0,
355
+ # "price": 20236.5,
356
+ # "post_only": False,
357
+ # "order_type": "market",
358
+ # "order_id": "46108941243",
359
+ # "matching_id": null,
360
+ # "mark_price": 20233.96,
361
+ # "liquidity": "T",
362
+ # "instrument_name": "BTC-PERPETUAL",
363
+ # "index_price": 20253.31,
364
+ # "fee_currency": "BTC",
365
+ # "fee": 2.5e-7,
366
+ # "direction": "buy",
367
+ # "amount": 10
368
+ # }]
369
+ # }
370
+ # }
371
+ #
372
+ params = self.safe_value(message, 'params', {})
373
+ channel = self.safe_string(params, 'channel', '')
374
+ trades = self.safe_value(params, 'data', [])
375
+ cachedTrades = self.myTrades
376
+ if cachedTrades is None:
377
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
378
+ cachedTrades = ArrayCacheBySymbolById(limit)
379
+ parsed = self.parse_trades(trades)
380
+ marketIds: dict = {}
381
+ for i in range(0, len(parsed)):
382
+ trade = parsed[i]
383
+ cachedTrades.append(trade)
384
+ symbol = trade['symbol']
385
+ marketIds[symbol] = True
386
+ client.resolve(cachedTrades, channel)
387
+
388
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
389
+ """
390
+ :see: https://docs.deribit.com/#book-instrument_name-group-depth-interval
391
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
392
+ :param str symbol: unified symbol of the market to fetch the order book for
393
+ :param int [limit]: the maximum amount of order book entries to return
394
+ :param dict [params]: extra parameters specific to the exchange API endpoint
395
+ :param str [params.interval]: Frequency of notifications. Events will be aggregated over self interval. Possible values: 100ms, raw
396
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
397
+ """
398
+ params['callerMethodName'] = 'watchOrderBook'
399
+ return await self.watch_order_book_for_symbols([symbol], limit, params)
400
+
401
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
402
+ """
403
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
404
+ :see: https://docs.deribit.com/#book-instrument_name-group-depth-interval
405
+ :param str[] symbols: unified array of symbols
406
+ :param int [limit]: the maximum amount of order book entries to return
407
+ :param dict [params]: extra parameters specific to the exchange API endpoint
408
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
409
+ """
410
+ interval = None
411
+ interval, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'interval', '100ms')
412
+ if interval == 'raw':
413
+ await self.authenticate()
414
+ descriptor = ''
415
+ useDepthEndpoint = None # for more info, see comment in .options
416
+ useDepthEndpoint, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'useDepthEndpoint', False)
417
+ if useDepthEndpoint:
418
+ depth = None
419
+ depth, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'depth', '20')
420
+ group = None
421
+ group, params = self.handle_option_and_params(params, 'watchOrderBookForSymbols', 'group', 'none')
422
+ descriptor = group + '.' + depth + '.' + interval
423
+ else:
424
+ descriptor = interval
425
+ orderbook = await self.watch_multiple_wrapper('book', descriptor, symbols, params)
426
+ return orderbook.limit()
427
+
428
+ def handle_order_book(self, client: Client, message):
429
+ #
430
+ # snapshot
431
+ # {
432
+ # "jsonrpc": "2.0",
433
+ # "method": "subscription",
434
+ # "params": {
435
+ # "channel": "book.BTC_USDC-PERPETUAL.raw",
436
+ # "data": {
437
+ # "type": "snapshot",
438
+ # "timestamp": 1655395057025,
439
+ # "instrument_name": "BTC_USDC-PERPETUAL",
440
+ # "change_id": 1550694837,
441
+ # "bids": [
442
+ # ["new", 20987, 0.487],
443
+ # ["new", 20986, 0.238],
444
+ # ],
445
+ # "asks": [
446
+ # ["new", 20999, 0.092],
447
+ # ["new", 21000, 1.238],
448
+ # ]
449
+ # }
450
+ # }
451
+ # }
452
+ #
453
+ # change
454
+ # {
455
+ # "jsonrpc": "2.0",
456
+ # "method": "subscription",
457
+ # "params": {
458
+ # "channel": "book.BTC_USDC-PERPETUAL.raw",
459
+ # "data": {
460
+ # "type": "change",
461
+ # "timestamp": 1655395168086,
462
+ # "prev_change_id": 1550724481,
463
+ # "instrument_name": "BTC_USDC-PERPETUAL",
464
+ # "change_id": 1550724483,
465
+ # "bids": [
466
+ # ["new", 20977, 0.109],
467
+ # ["delete", 20975, 0]
468
+ # ],
469
+ # "asks": []
470
+ # }
471
+ # }
472
+ # }
473
+ #
474
+ params = self.safe_value(message, 'params', {})
475
+ data = self.safe_value(params, 'data', {})
476
+ channel = self.safe_string(params, 'channel')
477
+ parts = channel.split('.')
478
+ descriptor = ''
479
+ partsLength = len(parts)
480
+ isDetailed = partsLength == 5
481
+ if isDetailed:
482
+ group = self.safe_string(parts, 2)
483
+ depth = self.safe_string(parts, 3)
484
+ interval = self.safe_string(parts, 4)
485
+ descriptor = group + '.' + depth + '.' + interval
486
+ else:
487
+ interval = self.safe_string(parts, 2)
488
+ descriptor = interval
489
+ marketId = self.safe_string(data, 'instrument_name')
490
+ symbol = self.safe_symbol(marketId)
491
+ timestamp = self.safe_integer(data, 'timestamp')
492
+ if not (symbol in self.orderbooks):
493
+ self.orderbooks[symbol] = self.counted_order_book()
494
+ storedOrderBook = self.orderbooks[symbol]
495
+ asks = self.safe_list(data, 'asks', [])
496
+ bids = self.safe_list(data, 'bids', [])
497
+ self.handle_deltas(storedOrderBook['asks'], asks)
498
+ self.handle_deltas(storedOrderBook['bids'], bids)
499
+ storedOrderBook['nonce'] = timestamp
500
+ storedOrderBook['timestamp'] = timestamp
501
+ storedOrderBook['datetime'] = self.iso8601(timestamp)
502
+ storedOrderBook['symbol'] = symbol
503
+ self.orderbooks[symbol] = storedOrderBook
504
+ messageHash = 'book|' + symbol + '|' + descriptor
505
+ client.resolve(storedOrderBook, messageHash)
506
+
507
+ def clean_order_book(self, data):
508
+ bids = self.safe_list(data, 'bids', [])
509
+ asks = self.safe_list(data, 'asks', [])
510
+ cleanedBids = []
511
+ for i in range(0, len(bids)):
512
+ cleanedBids.append([bids[i][1], bids[i][2]])
513
+ cleanedAsks = []
514
+ for i in range(0, len(asks)):
515
+ cleanedAsks.append([asks[i][1], asks[i][2]])
516
+ data['bids'] = cleanedBids
517
+ data['asks'] = cleanedAsks
518
+ return data
519
+
520
+ def handle_delta(self, bookside, delta):
521
+ price = delta[1]
522
+ amount = delta[2]
523
+ if delta[0] == 'new' or delta[0] == 'change':
524
+ bookside.storeArray([price, amount, 1])
525
+ elif delta[0] == 'delete':
526
+ bookside.storeArray([price, amount, 0])
527
+
528
+ def handle_deltas(self, bookside, deltas):
529
+ for i in range(0, len(deltas)):
530
+ self.handle_delta(bookside, deltas[i])
531
+
532
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
533
+ """
534
+ :see: https://docs.deribit.com/#user-orders-instrument_name-raw
535
+ watches information on multiple orders made by the user
536
+ :param str symbol: unified market symbol of the market orders were made in
537
+ :param int [since]: the earliest time in ms to fetch orders for
538
+ :param int [limit]: the maximum number of order structures to retrieve
539
+ :param dict [params]: extra parameters specific to the exchange API endpoint
540
+ :returns dict[]: a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
541
+ """
542
+ await self.load_markets()
543
+ await self.authenticate(params)
544
+ if symbol is not None:
545
+ symbol = self.symbol(symbol)
546
+ url = self.urls['api']['ws']
547
+ currency = self.safe_string(params, 'currency', 'any')
548
+ interval = self.safe_string(params, 'interval', 'raw')
549
+ kind = self.safe_string(params, 'kind', 'any')
550
+ params = self.omit(params, 'interval', 'currency', 'kind')
551
+ channel = 'user.orders.' + kind + '.' + currency + '.' + interval
552
+ message: dict = {
553
+ 'jsonrpc': '2.0',
554
+ 'method': 'private/subscribe',
555
+ 'params': {
556
+ 'channels': [channel],
557
+ },
558
+ 'id': self.request_id(),
559
+ }
560
+ request = self.deep_extend(message, params)
561
+ orders = await self.watch(url, channel, request, channel, request)
562
+ if self.newUpdates:
563
+ limit = orders.getLimit(symbol, limit)
564
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
565
+
566
+ def handle_orders(self, client: Client, message):
567
+ # Does not return a snapshot of current orders
568
+ #
569
+ # {
570
+ # "jsonrpc": "2.0",
571
+ # "method": "subscription",
572
+ # "params": {
573
+ # "channel": "user.orders.any.any.raw",
574
+ # "data": {
575
+ # "web": True,
576
+ # "time_in_force": "good_til_cancelled",
577
+ # "replaced": False,
578
+ # "reduce_only": False,
579
+ # "profit_loss": 0,
580
+ # "price": 50000,
581
+ # "post_only": False,
582
+ # "order_type": "limit",
583
+ # "order_state": "open",
584
+ # "order_id": "46094375191",
585
+ # "max_show": 10,
586
+ # "last_update_timestamp": 1655401625037,
587
+ # "label": '',
588
+ # "is_liquidation": False,
589
+ # "instrument_name": "BTC-PERPETUAL",
590
+ # "filled_amount": 0,
591
+ # "direction": "sell",
592
+ # "creation_timestamp": 1655401625037,
593
+ # "commission": 0,
594
+ # "average_price": 0,
595
+ # "api": False,
596
+ # "amount": 10
597
+ # }
598
+ # }
599
+ # }
600
+ #
601
+ if self.orders is None:
602
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
603
+ self.orders = ArrayCacheBySymbolById(limit)
604
+ params = self.safe_value(message, 'params', {})
605
+ channel = self.safe_string(params, 'channel', '')
606
+ data = self.safe_value(params, 'data', {})
607
+ orders = []
608
+ if isinstance(data, list):
609
+ orders = self.parse_orders(data)
610
+ else:
611
+ order = self.parse_order(data)
612
+ orders = [order]
613
+ cachedOrders = self.orders
614
+ for i in range(0, len(orders)):
615
+ cachedOrders.append(orders[i])
616
+ client.resolve(self.orders, channel)
617
+
618
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
619
+ """
620
+ :see: https://docs.deribit.com/#chart-trades-instrument_name-resolution
621
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
622
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
623
+ :param str timeframe: the length of time each candle represents
624
+ :param int [since]: timestamp in ms of the earliest candle to fetch
625
+ :param int [limit]: the maximum amount of candles to fetch
626
+ :param dict [params]: extra parameters specific to the exchange API endpoint
627
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
628
+ """
629
+ await self.load_markets()
630
+ symbol = self.symbol(symbol)
631
+ ohlcvs = await self.watch_ohlcv_for_symbols([[symbol, timeframe]], since, limit, params)
632
+ return ohlcvs[symbol][timeframe]
633
+
634
+ async def watch_ohlcv_for_symbols(self, symbolsAndTimeframes: List[List[str]], since: Int = None, limit: Int = None, params={}):
635
+ """
636
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
637
+ :see: https://docs.deribit.com/#chart-trades-instrument_name-resolution
638
+ :param str[][] symbolsAndTimeframes: array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
639
+ :param int [since]: timestamp in ms of the earliest candle to fetch
640
+ :param int [limit]: the maximum amount of candles to fetch
641
+ :param dict [params]: extra parameters specific to the exchange API endpoint
642
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
643
+ """
644
+ symbolsLength = len(symbolsAndTimeframes)
645
+ if symbolsLength == 0 or not isinstance(symbolsAndTimeframes[0], list):
646
+ raise ArgumentsRequired(self.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]")
647
+ symbol, timeframe, candles = await self.watch_multiple_wrapper('chart.trades', None, symbolsAndTimeframes, params)
648
+ if self.newUpdates:
649
+ limit = candles.getLimit(symbol, limit)
650
+ filtered = self.filter_by_since_limit(candles, since, limit, 0, True)
651
+ return self.create_ohlcv_object(symbol, timeframe, filtered)
652
+
653
+ def handle_ohlcv(self, client: Client, message):
654
+ #
655
+ # {
656
+ # "jsonrpc": "2.0",
657
+ # "method": "subscription",
658
+ # "params": {
659
+ # "channel": "chart.trades.BTC_USDC-PERPETUAL.1",
660
+ # "data": {
661
+ # "volume": 0,
662
+ # "tick": 1655403420000,
663
+ # "open": 20951,
664
+ # "low": 20951,
665
+ # "high": 20951,
666
+ # "cost": 0,
667
+ # "close": 20951
668
+ # }
669
+ # }
670
+ # }
671
+ #
672
+ params = self.safe_dict(message, 'params', {})
673
+ channel = self.safe_string(params, 'channel', '')
674
+ parts = channel.split('.')
675
+ marketId = self.safe_string(parts, 2)
676
+ rawTimeframe = self.safe_string(parts, 3)
677
+ market = self.safe_market(marketId)
678
+ symbol = market['symbol']
679
+ wsOptions = self.safe_dict(self.options, 'ws', {})
680
+ timeframes = self.safe_dict(wsOptions, 'timeframes', {})
681
+ unifiedTimeframe = self.find_timeframe(rawTimeframe, timeframes)
682
+ self.ohlcvs[symbol] = self.safe_dict(self.ohlcvs, symbol, {})
683
+ if self.safe_value(self.ohlcvs[symbol], unifiedTimeframe) is None:
684
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
685
+ self.ohlcvs[symbol][unifiedTimeframe] = ArrayCacheByTimestamp(limit)
686
+ stored = self.ohlcvs[symbol][unifiedTimeframe]
687
+ ohlcv = self.safe_dict(params, 'data', {})
688
+ # data contains a single OHLCV candle
689
+ parsed = self.parse_ws_ohlcv(ohlcv, market)
690
+ stored.append(parsed)
691
+ self.ohlcvs[symbol][unifiedTimeframe] = stored
692
+ resolveData = [symbol, unifiedTimeframe, stored]
693
+ messageHash = 'chart.trades|' + symbol + '|' + rawTimeframe
694
+ client.resolve(resolveData, messageHash)
695
+
696
+ def parse_ws_ohlcv(self, ohlcv, market=None) -> list:
697
+ #
698
+ # {
699
+ # "c": "28909.0",
700
+ # "o": "28915.4",
701
+ # "h": "28915.4",
702
+ # "l": "28896.1",
703
+ # "v": "27.6919",
704
+ # "T": 1696687499999,
705
+ # "t": 1696687440000
706
+ # }
707
+ #
708
+ return [
709
+ self.safe_integer(ohlcv, 'tick'),
710
+ self.safe_number(ohlcv, 'open'),
711
+ self.safe_number(ohlcv, 'high'),
712
+ self.safe_number(ohlcv, 'low'),
713
+ self.safe_number(ohlcv, 'close'),
714
+ self.safe_number(ohlcv, 'volume'),
715
+ ]
716
+
717
+ async def watch_multiple_wrapper(self, channelName: str, channelDescriptor: Str, symbolsArray=None, params={}):
718
+ await self.load_markets()
719
+ url = self.urls['api']['ws']
720
+ rawSubscriptions = []
721
+ messageHashes = []
722
+ isOHLCV = (channelName == 'chart.trades')
723
+ symbols = self.get_list_from_object_values(symbolsArray, 0) if isOHLCV else symbolsArray
724
+ self.market_symbols(symbols, None, False)
725
+ for i in range(0, len(symbolsArray)):
726
+ current = symbolsArray[i]
727
+ market = None
728
+ if isOHLCV:
729
+ market = self.market(current[0])
730
+ unifiedTf = current[1]
731
+ rawTf = self.safe_string(self.timeframes, unifiedTf, unifiedTf)
732
+ channelDescriptor = rawTf
733
+ else:
734
+ market = self.market(current)
735
+ message = channelName + '.' + market['id'] + '.' + channelDescriptor
736
+ rawSubscriptions.append(message)
737
+ messageHashes.append(channelName + '|' + market['symbol'] + '|' + channelDescriptor)
738
+ request: dict = {
739
+ 'jsonrpc': '2.0',
740
+ 'method': 'public/subscribe',
741
+ 'params': {
742
+ 'channels': rawSubscriptions,
743
+ },
744
+ 'id': self.request_id(),
745
+ }
746
+ extendedRequest = self.deep_extend(request, params)
747
+ maxMessageByteLimit = 32768 - 1 # 'Message Too Big: limit 32768B'
748
+ jsonedText = self.json(extendedRequest)
749
+ if len(jsonedText) >= maxMessageByteLimit:
750
+ raise ExchangeError(self.id + ' requested subscription length over limit, try to reduce symbols amount')
751
+ return await self.watch_multiple(url, messageHashes, extendedRequest, rawSubscriptions)
752
+
753
+ def handle_message(self, client: Client, message):
754
+ #
755
+ # error
756
+ # {
757
+ # "jsonrpc": "2.0",
758
+ # "id": 1,
759
+ # "error": {
760
+ # "message": "Invalid params",
761
+ # "data": {
762
+ # "reason": "invalid format",
763
+ # "param": "nonce"
764
+ # },
765
+ # "code": -32602
766
+ # },
767
+ # "usIn": "1655391709417993",
768
+ # "usOut": "1655391709418049",
769
+ # "usDiff": 56,
770
+ # "testnet": False
771
+ # }
772
+ #
773
+ # subscribe
774
+ # {
775
+ # "jsonrpc": "2.0",
776
+ # "id": 2,
777
+ # "result": ["ticker.BTC_USDC-PERPETUAL.raw"],
778
+ # "usIn": "1655393625889396",
779
+ # "usOut": "1655393625889518",
780
+ # "usDiff": 122,
781
+ # "testnet": False
782
+ # }
783
+ #
784
+ # notification
785
+ # {
786
+ # "jsonrpc": "2.0",
787
+ # "method": "subscription",
788
+ # "params": {
789
+ # "channel": "ticker.BTC_USDC-PERPETUAL.raw",
790
+ # "data": {
791
+ # "timestamp": 1655393724752,
792
+ # "stats": [Object],
793
+ # "state": "open",
794
+ # "settlement_price": 21729.5891,
795
+ # "open_interest": 164.501,
796
+ # "min_price": 20792.9001,
797
+ # "max_price": 21426.1864,
798
+ # "mark_price": 21109.4757,
799
+ # "last_price": 21132,
800
+ # "instrument_name": "BTC_USDC-PERPETUAL",
801
+ # "index_price": 21122.3937,
802
+ # "funding_8h": -0.00022427,
803
+ # "estimated_delivery_price": 21122.3937,
804
+ # "current_funding": -0.00011158,
805
+ # "best_bid_price": 21106,
806
+ # "best_bid_amount": 1.143,
807
+ # "best_ask_price": 21113,
808
+ # "best_ask_amount": 0.402
809
+ # }
810
+ # }
811
+ # }
812
+ #
813
+ error = self.safe_value(message, 'error')
814
+ if error is not None:
815
+ raise ExchangeError(self.id + ' ' + self.json(error))
816
+ params = self.safe_value(message, 'params')
817
+ channel = self.safe_string(params, 'channel')
818
+ if channel is not None:
819
+ parts = channel.split('.')
820
+ channelId = self.safe_string(parts, 0)
821
+ userHandlers: dict = {
822
+ 'trades': self.handle_my_trades,
823
+ 'portfolio': self.handle_balance,
824
+ 'orders': self.handle_orders,
825
+ }
826
+ handlers: dict = {
827
+ 'ticker': self.handle_ticker,
828
+ 'book': self.handle_order_book,
829
+ 'trades': self.handle_trades,
830
+ 'chart': self.handle_ohlcv,
831
+ 'user': self.safe_value(userHandlers, self.safe_string(parts, 1)),
832
+ }
833
+ handler = self.safe_value(handlers, channelId)
834
+ if handler is not None:
835
+ handler(client, message)
836
+ return
837
+ raise NotSupported(self.id + ' no handler found for self message ' + self.json(message))
838
+ result = self.safe_value(message, 'result', {})
839
+ accessToken = self.safe_string(result, 'access_token')
840
+ if accessToken is not None:
841
+ self.handle_authentication_message(client, message)
842
+
843
+ def handle_authentication_message(self, client: Client, message):
844
+ #
845
+ # {
846
+ # "jsonrpc": "2.0",
847
+ # "id": 1,
848
+ # "result": {
849
+ # "token_type": "bearer",
850
+ # "scope": "account:read_write block_trade:read_write connection custody:read_write mainaccount name:ccxt trade:read_write wallet:read_write",
851
+ # "refresh_token": "1686927372328.1EzFBRmt.logRQWXkPA1oE_Tk0gRsls9Hau7YN6a321XUBnxvR4x6cryhbkKcniUJU-czA8_zKXrqQGpQmfoDwhLIjIsWCvRuu6otbg-LKWlrtTX1GQqLcPaTTHAdZGTMV-HM8HiS03QBd9MIXWRfF53sKj2hdR9nZPZ6MH1XrkpAZPB_peuEEB9wlcc3elzWEZFtCmiy1fnQ8TPHwAJMt3nuUmEcMLt_-F554qrsg_-I66D9xMiifJj4dBemdPfV_PkGPRIwIoKlxDjyv2-xfCw-4eKyo6Hu1m2h6gT1DPOTxSXcBgfBQjpi-_uY3iAIj7U6xjC46PHthEdquhEuCTZl7UfCRZSAWwZA",
852
+ # "expires_in": 31536000,
853
+ # "access_token": "1686923272328.1CkwEx-u.qHradpIulmuoeboKMEi8PkQ1_4DF8yFE2zywBTtkD32sruVC53b1HwL5OWRuh2nYAndXff4xuXIMRkkEfMAFCeq24prihxxinoS8DDVkKBxedGx4CUPJFeXjmh7wuRGqQOLg1plXOpbF3fwF2KPEkAuETwcpcVY6K9HUVjutNRfxFe2TR7CvuS9x8TATvoPeu7H1ezYl-LkKSaRifdTXuwituXgp4oDbPRyQLniEBWuYF9rY7qbABxuOJlXI1VZ63u7Bh0mGWei-KeVeqHGNpy6OgrFRPXPxa9_U7vaxCyHW3zZ9959TQ1QUMLWtUX-NLBEv3BT5eCieW9HORYIOKfsgkpd3"
854
+ # },
855
+ # "usIn": "1655391872327712",
856
+ # "usOut": "1655391872328515",
857
+ # "usDiff": 803,
858
+ # "testnet": False
859
+ # }
860
+ #
861
+ messageHash = 'authenticated'
862
+ client.resolve(message, messageHash)
863
+ return message
864
+
865
+ async def authenticate(self, params={}):
866
+ url = self.urls['api']['ws']
867
+ client = self.client(url)
868
+ time = self.milliseconds()
869
+ timeString = self.number_to_string(time)
870
+ nonce = timeString
871
+ messageHash = 'authenticated'
872
+ future = self.safe_value(client.subscriptions, messageHash)
873
+ if future is None:
874
+ self.check_required_credentials()
875
+ requestId = self.request_id()
876
+ signature = self.hmac(self.encode(timeString + '\n' + nonce + '\n'), self.encode(self.secret), hashlib.sha256)
877
+ request: dict = {
878
+ 'jsonrpc': '2.0',
879
+ 'id': requestId,
880
+ 'method': 'public/auth',
881
+ 'params': {
882
+ 'grant_type': 'client_signature',
883
+ 'client_id': self.apiKey,
884
+ 'timestamp': time,
885
+ 'signature': signature,
886
+ 'nonce': nonce,
887
+ 'data': '',
888
+ },
889
+ }
890
+ future = await self.watch(url, messageHash, self.extend(request, params), messageHash)
891
+ client.subscriptions[messageHash] = future
892
+ return future