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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (772) hide show
  1. ccxt/__init__.py +358 -0
  2. ccxt/abantether.py +316 -0
  3. ccxt/abstract/__init__.py +0 -0
  4. ccxt/abstract/abantether.py +5 -0
  5. ccxt/abstract/ace.py +15 -0
  6. ccxt/abstract/afratether.py +6 -0
  7. ccxt/abstract/alpaca.py +70 -0
  8. ccxt/abstract/arzinja.py +5 -0
  9. ccxt/abstract/arzplus.py +7 -0
  10. ccxt/abstract/ascendex.py +77 -0
  11. ccxt/abstract/bequant.py +115 -0
  12. ccxt/abstract/bigone.py +45 -0
  13. ccxt/abstract/binance.py +712 -0
  14. ccxt/abstract/binancecoinm.py +712 -0
  15. ccxt/abstract/binanceus.py +764 -0
  16. ccxt/abstract/binanceusdm.py +712 -0
  17. ccxt/abstract/bingx.py +113 -0
  18. ccxt/abstract/bit2c.py +27 -0
  19. ccxt/abstract/bitbank.py +27 -0
  20. ccxt/abstract/bitbay.py +53 -0
  21. ccxt/abstract/bitbns.py +40 -0
  22. ccxt/abstract/bitcoincom.py +115 -0
  23. ccxt/abstract/bitfinex.py +69 -0
  24. ccxt/abstract/bitfinex2.py +139 -0
  25. ccxt/abstract/bitflyer.py +38 -0
  26. ccxt/abstract/bitget.py +508 -0
  27. ccxt/abstract/bithumb.py +32 -0
  28. ccxt/abstract/bitimen.py +7 -0
  29. ccxt/abstract/bitir.py +7 -0
  30. ccxt/abstract/bitmart.py +99 -0
  31. ccxt/abstract/bitmex.py +97 -0
  32. ccxt/abstract/bitopro.py +29 -0
  33. ccxt/abstract/bitpanda.py +35 -0
  34. ccxt/abstract/bitpin.py +7 -0
  35. ccxt/abstract/bitrue.py +72 -0
  36. ccxt/abstract/bitso.py +43 -0
  37. ccxt/abstract/bitstamp.py +258 -0
  38. ccxt/abstract/bitteam.py +29 -0
  39. ccxt/abstract/bitvavo.py +27 -0
  40. ccxt/abstract/bl3p.py +19 -0
  41. ccxt/abstract/blockchaincom.py +28 -0
  42. ccxt/abstract/blofin.py +37 -0
  43. ccxt/abstract/btcalpha.py +18 -0
  44. ccxt/abstract/btcbox.py +13 -0
  45. ccxt/abstract/btcmarkets.py +39 -0
  46. ccxt/abstract/btcturk.py +20 -0
  47. ccxt/abstract/bybit.py +298 -0
  48. ccxt/abstract/cex.py +33 -0
  49. ccxt/abstract/coinbase.py +94 -0
  50. ccxt/abstract/coinbaseadvanced.py +94 -0
  51. ccxt/abstract/coinbaseexchange.py +67 -0
  52. ccxt/abstract/coinbaseinternational.py +39 -0
  53. ccxt/abstract/coincatch.py +94 -0
  54. ccxt/abstract/coincheck.py +33 -0
  55. ccxt/abstract/coinex.py +237 -0
  56. ccxt/abstract/coinlist.py +54 -0
  57. ccxt/abstract/coinmate.py +62 -0
  58. ccxt/abstract/coinmetro.py +34 -0
  59. ccxt/abstract/coinone.py +67 -0
  60. ccxt/abstract/coinsph.py +54 -0
  61. ccxt/abstract/coinspot.py +28 -0
  62. ccxt/abstract/cryptocom.py +107 -0
  63. ccxt/abstract/currencycom.py +68 -0
  64. ccxt/abstract/delta.py +50 -0
  65. ccxt/abstract/deribit.py +125 -0
  66. ccxt/abstract/digifinex.py +91 -0
  67. ccxt/abstract/eterex.py +5 -0
  68. ccxt/abstract/excoino.py +7 -0
  69. ccxt/abstract/exir.py +8 -0
  70. ccxt/abstract/exmo.py +55 -0
  71. ccxt/abstract/exnovin.py +6 -0
  72. ccxt/abstract/farhadexchange.py +5 -0
  73. ccxt/abstract/fmfwio.py +115 -0
  74. ccxt/abstract/gate.py +265 -0
  75. ccxt/abstract/gateio.py +265 -0
  76. ccxt/abstract/gemini.py +58 -0
  77. ccxt/abstract/hashkey.py +67 -0
  78. ccxt/abstract/hitbtc.py +115 -0
  79. ccxt/abstract/hitbtc3.py +115 -0
  80. ccxt/abstract/hitobit.py +8 -0
  81. ccxt/abstract/hollaex.py +33 -0
  82. ccxt/abstract/htx.py +548 -0
  83. ccxt/abstract/huobi.py +548 -0
  84. ccxt/abstract/huobijp.py +114 -0
  85. ccxt/abstract/hyperliquid.py +6 -0
  86. ccxt/abstract/idex.py +26 -0
  87. ccxt/abstract/independentreserve.py +37 -0
  88. ccxt/abstract/indodax.py +26 -0
  89. ccxt/abstract/jibitex.py +7 -0
  90. ccxt/abstract/kraken.py +57 -0
  91. ccxt/abstract/krakenfutures.py +38 -0
  92. ccxt/abstract/kucoin.py +214 -0
  93. ccxt/abstract/kucoinfutures.py +233 -0
  94. ccxt/abstract/kuna.py +182 -0
  95. ccxt/abstract/latoken.py +56 -0
  96. ccxt/abstract/lbank.py +61 -0
  97. ccxt/abstract/luno.py +37 -0
  98. ccxt/abstract/lykke.py +29 -0
  99. ccxt/abstract/mercado.py +25 -0
  100. ccxt/abstract/mexc.py +178 -0
  101. ccxt/abstract/ndax.py +97 -0
  102. ccxt/abstract/nobitex.py +7 -0
  103. ccxt/abstract/novadax.py +29 -0
  104. ccxt/abstract/oceanex.py +22 -0
  105. ccxt/abstract/okcoin.py +74 -0
  106. ccxt/abstract/okexchange.py +8 -0
  107. ccxt/abstract/okx.py +324 -0
  108. ccxt/abstract/ompfinex.py +7 -0
  109. ccxt/abstract/onetrading.py +35 -0
  110. ccxt/abstract/oxfun.py +34 -0
  111. ccxt/abstract/p2b.py +22 -0
  112. ccxt/abstract/paradex.py +40 -0
  113. ccxt/abstract/paymium.py +28 -0
  114. ccxt/abstract/phemex.py +115 -0
  115. ccxt/abstract/poloniex.py +69 -0
  116. ccxt/abstract/poloniexfutures.py +48 -0
  117. ccxt/abstract/probit.py +23 -0
  118. ccxt/abstract/ramzinex.py +7 -0
  119. ccxt/abstract/sarmayex.py +5 -0
  120. ccxt/abstract/sarrafex.py +7 -0
  121. ccxt/abstract/tabdeal.py +7 -0
  122. ccxt/abstract/tetherland.py +5 -0
  123. ccxt/abstract/timex.py +62 -0
  124. ccxt/abstract/tokocrypto.py +37 -0
  125. ccxt/abstract/tradeogre.py +16 -0
  126. ccxt/abstract/twox.py +5 -0
  127. ccxt/abstract/ubitex.py +7 -0
  128. ccxt/abstract/upbit.py +38 -0
  129. ccxt/abstract/vertex.py +19 -0
  130. ccxt/abstract/wallex.py +8 -0
  131. ccxt/abstract/wavesexchange.py +154 -0
  132. ccxt/abstract/wazirx.py +30 -0
  133. ccxt/abstract/whitebit.py +98 -0
  134. ccxt/abstract/woo.py +83 -0
  135. ccxt/abstract/woofipro.py +119 -0
  136. ccxt/abstract/xt.py +152 -0
  137. ccxt/abstract/yobit.py +16 -0
  138. ccxt/abstract/zaif.py +38 -0
  139. ccxt/abstract/zonda.py +53 -0
  140. ccxt/ace.py +1012 -0
  141. ccxt/afratether.py +293 -0
  142. ccxt/alpaca.py +1083 -0
  143. ccxt/arzinja.py +285 -0
  144. ccxt/arzplus.py +412 -0
  145. ccxt/ascendex.py +3330 -0
  146. ccxt/async_support/__init__.py +337 -0
  147. ccxt/async_support/abantether.py +316 -0
  148. ccxt/async_support/ace.py +1012 -0
  149. ccxt/async_support/afratether.py +293 -0
  150. ccxt/async_support/alpaca.py +1083 -0
  151. ccxt/async_support/arzinja.py +285 -0
  152. ccxt/async_support/arzplus.py +412 -0
  153. ccxt/async_support/ascendex.py +3330 -0
  154. ccxt/async_support/base/__init__.py +1 -0
  155. ccxt/async_support/base/exchange.py +1966 -0
  156. ccxt/async_support/base/throttler.py +50 -0
  157. ccxt/async_support/base/ws/__init__.py +38 -0
  158. ccxt/async_support/base/ws/aiohttp_client.py +125 -0
  159. ccxt/async_support/base/ws/cache.py +212 -0
  160. ccxt/async_support/base/ws/client.py +193 -0
  161. ccxt/async_support/base/ws/fast_client.py +96 -0
  162. ccxt/async_support/base/ws/functions.py +59 -0
  163. ccxt/async_support/base/ws/future.py +58 -0
  164. ccxt/async_support/base/ws/order_book.py +78 -0
  165. ccxt/async_support/base/ws/order_book_side.py +174 -0
  166. ccxt/async_support/bequant.py +33 -0
  167. ccxt/async_support/bigone.py +2113 -0
  168. ccxt/async_support/binance.py +12234 -0
  169. ccxt/async_support/binancecoinm.py +45 -0
  170. ccxt/async_support/binanceus.py +211 -0
  171. ccxt/async_support/binanceusdm.py +58 -0
  172. ccxt/async_support/bingx.py +4325 -0
  173. ccxt/async_support/bit2c.py +866 -0
  174. ccxt/async_support/bitbank.py +1001 -0
  175. ccxt/async_support/bitbay.py +17 -0
  176. ccxt/async_support/bitbns.py +1154 -0
  177. ccxt/async_support/bitcoincom.py +17 -0
  178. ccxt/async_support/bitfinex.py +1617 -0
  179. ccxt/async_support/bitfinex2.py +3552 -0
  180. ccxt/async_support/bitflyer.py +995 -0
  181. ccxt/async_support/bitget.py +8273 -0
  182. ccxt/async_support/bithumb.py +1061 -0
  183. ccxt/async_support/bitimen.py +401 -0
  184. ccxt/async_support/bitir.py +490 -0
  185. ccxt/async_support/bitmart.py +4415 -0
  186. ccxt/async_support/bitmex.py +2756 -0
  187. ccxt/async_support/bitopro.py +1630 -0
  188. ccxt/async_support/bitpanda.py +16 -0
  189. ccxt/async_support/bitpin.py +454 -0
  190. ccxt/async_support/bitrue.py +3027 -0
  191. ccxt/async_support/bitso.py +1670 -0
  192. ccxt/async_support/bitstamp.py +2203 -0
  193. ccxt/async_support/bitteam.py +2239 -0
  194. ccxt/async_support/bitvavo.py +1968 -0
  195. ccxt/async_support/bl3p.py +485 -0
  196. ccxt/async_support/blockchaincom.py +1104 -0
  197. ccxt/async_support/blofin.py +2066 -0
  198. ccxt/async_support/btcalpha.py +891 -0
  199. ccxt/async_support/btcbox.py +544 -0
  200. ccxt/async_support/btcmarkets.py +1221 -0
  201. ccxt/async_support/btcturk.py +911 -0
  202. ccxt/async_support/bybit.py +8159 -0
  203. ccxt/async_support/cex.py +1605 -0
  204. ccxt/async_support/coinbase.py +4475 -0
  205. ccxt/async_support/coinbaseadvanced.py +17 -0
  206. ccxt/async_support/coinbaseexchange.py +1734 -0
  207. ccxt/async_support/coinbaseinternational.py +1899 -0
  208. ccxt/async_support/coincatch.py +5069 -0
  209. ccxt/async_support/coincheck.py +815 -0
  210. ccxt/async_support/coinex.py +5526 -0
  211. ccxt/async_support/coinlist.py +2243 -0
  212. ccxt/async_support/coinmate.py +1067 -0
  213. ccxt/async_support/coinmetro.py +1797 -0
  214. ccxt/async_support/coinone.py +1127 -0
  215. ccxt/async_support/coinsph.py +1850 -0
  216. ccxt/async_support/coinspot.py +534 -0
  217. ccxt/async_support/cryptocom.py +2822 -0
  218. ccxt/async_support/currencycom.py +1950 -0
  219. ccxt/async_support/delta.py +3376 -0
  220. ccxt/async_support/deribit.py +3437 -0
  221. ccxt/async_support/digifinex.py +3960 -0
  222. ccxt/async_support/eterex.py +286 -0
  223. ccxt/async_support/excoino.py +399 -0
  224. ccxt/async_support/exir.py +375 -0
  225. ccxt/async_support/exmo.py +2462 -0
  226. ccxt/async_support/exnovin.py +360 -0
  227. ccxt/async_support/farhadexchange.py +266 -0
  228. ccxt/async_support/fmfwio.py +34 -0
  229. ccxt/async_support/gate.py +6976 -0
  230. ccxt/async_support/gateio.py +16 -0
  231. ccxt/async_support/gemini.py +1825 -0
  232. ccxt/async_support/hashkey.py +4150 -0
  233. ccxt/async_support/hitbtc.py +3423 -0
  234. ccxt/async_support/hitbtc3.py +16 -0
  235. ccxt/async_support/hitobit.py +391 -0
  236. ccxt/async_support/hollaex.py +1813 -0
  237. ccxt/async_support/htx.py +8506 -0
  238. ccxt/async_support/huobi.py +16 -0
  239. ccxt/async_support/huobijp.py +1801 -0
  240. ccxt/async_support/hyperliquid.py +2431 -0
  241. ccxt/async_support/idex.py +1766 -0
  242. ccxt/async_support/independentreserve.py +784 -0
  243. ccxt/async_support/indodax.py +1247 -0
  244. ccxt/async_support/jibitex.py +395 -0
  245. ccxt/async_support/kraken.py +2894 -0
  246. ccxt/async_support/krakenfutures.py +2601 -0
  247. ccxt/async_support/kucoin.py +4602 -0
  248. ccxt/async_support/kucoinfutures.py +2698 -0
  249. ccxt/async_support/kuna.py +1841 -0
  250. ccxt/async_support/latoken.py +1664 -0
  251. ccxt/async_support/lbank.py +2683 -0
  252. ccxt/async_support/luno.py +1067 -0
  253. ccxt/async_support/lykke.py +1270 -0
  254. ccxt/async_support/mercado.py +842 -0
  255. ccxt/async_support/mexc.py +5369 -0
  256. ccxt/async_support/ndax.py +2354 -0
  257. ccxt/async_support/nobitex.py +419 -0
  258. ccxt/async_support/novadax.py +1484 -0
  259. ccxt/async_support/oceanex.py +903 -0
  260. ccxt/async_support/okcoin.py +2936 -0
  261. ccxt/async_support/okexchange.py +349 -0
  262. ccxt/async_support/okx.py +7827 -0
  263. ccxt/async_support/ompfinex.py +472 -0
  264. ccxt/async_support/onetrading.py +1911 -0
  265. ccxt/async_support/oxfun.py +2773 -0
  266. ccxt/async_support/p2b.py +1194 -0
  267. ccxt/async_support/paradex.py +2015 -0
  268. ccxt/async_support/paymium.py +564 -0
  269. ccxt/async_support/phemex.py +4473 -0
  270. ccxt/async_support/poloniex.py +2232 -0
  271. ccxt/async_support/poloniexfutures.py +1717 -0
  272. ccxt/async_support/probit.py +1734 -0
  273. ccxt/async_support/ramzinex.py +476 -0
  274. ccxt/async_support/sarmayex.py +357 -0
  275. ccxt/async_support/sarrafex.py +478 -0
  276. ccxt/async_support/tabdeal.py +364 -0
  277. ccxt/async_support/tetherland.py +349 -0
  278. ccxt/async_support/timex.py +1593 -0
  279. ccxt/async_support/tokocrypto.py +2405 -0
  280. ccxt/async_support/tradeogre.py +608 -0
  281. ccxt/async_support/twox.py +326 -0
  282. ccxt/async_support/ubitex.py +409 -0
  283. ccxt/async_support/upbit.py +1833 -0
  284. ccxt/async_support/vertex.py +2922 -0
  285. ccxt/async_support/wallex.py +445 -0
  286. ccxt/async_support/wavesexchange.py +2473 -0
  287. ccxt/async_support/wazirx.py +1224 -0
  288. ccxt/async_support/whitebit.py +2469 -0
  289. ccxt/async_support/woo.py +3114 -0
  290. ccxt/async_support/woofipro.py +2533 -0
  291. ccxt/async_support/xt.py +4454 -0
  292. ccxt/async_support/yobit.py +1283 -0
  293. ccxt/async_support/zaif.py +725 -0
  294. ccxt/async_support/zonda.py +1828 -0
  295. ccxt/base/__init__.py +27 -0
  296. ccxt/base/decimal_to_precision.py +174 -0
  297. ccxt/base/errors.py +242 -0
  298. ccxt/base/exchange.py +5941 -0
  299. ccxt/base/precise.py +287 -0
  300. ccxt/base/types.py +502 -0
  301. ccxt/bequant.py +33 -0
  302. ccxt/bigone.py +2112 -0
  303. ccxt/binance.py +12233 -0
  304. ccxt/binancecoinm.py +45 -0
  305. ccxt/binanceus.py +211 -0
  306. ccxt/binanceusdm.py +58 -0
  307. ccxt/bingx.py +4324 -0
  308. ccxt/bit2c.py +866 -0
  309. ccxt/bitbank.py +1001 -0
  310. ccxt/bitbay.py +17 -0
  311. ccxt/bitbns.py +1154 -0
  312. ccxt/bitcoincom.py +17 -0
  313. ccxt/bitfinex.py +1617 -0
  314. ccxt/bitfinex2.py +3552 -0
  315. ccxt/bitflyer.py +995 -0
  316. ccxt/bitget.py +8272 -0
  317. ccxt/bithumb.py +1061 -0
  318. ccxt/bitimen.py +401 -0
  319. ccxt/bitir.py +490 -0
  320. ccxt/bitmart.py +4415 -0
  321. ccxt/bitmex.py +2756 -0
  322. ccxt/bitopro.py +1630 -0
  323. ccxt/bitpanda.py +16 -0
  324. ccxt/bitpin.py +454 -0
  325. ccxt/bitrue.py +3026 -0
  326. ccxt/bitso.py +1670 -0
  327. ccxt/bitstamp.py +2203 -0
  328. ccxt/bitteam.py +2239 -0
  329. ccxt/bitvavo.py +1968 -0
  330. ccxt/bl3p.py +485 -0
  331. ccxt/blockchaincom.py +1104 -0
  332. ccxt/blofin.py +2066 -0
  333. ccxt/btcalpha.py +891 -0
  334. ccxt/btcbox.py +544 -0
  335. ccxt/btcmarkets.py +1221 -0
  336. ccxt/btcturk.py +911 -0
  337. ccxt/bybit.py +8158 -0
  338. ccxt/cex.py +1605 -0
  339. ccxt/coinbase.py +4474 -0
  340. ccxt/coinbaseadvanced.py +17 -0
  341. ccxt/coinbaseexchange.py +1734 -0
  342. ccxt/coinbaseinternational.py +1899 -0
  343. ccxt/coincatch.py +5069 -0
  344. ccxt/coincheck.py +815 -0
  345. ccxt/coinex.py +5525 -0
  346. ccxt/coinlist.py +2243 -0
  347. ccxt/coinmate.py +1067 -0
  348. ccxt/coinmetro.py +1797 -0
  349. ccxt/coinone.py +1127 -0
  350. ccxt/coinsph.py +1850 -0
  351. ccxt/coinspot.py +534 -0
  352. ccxt/cryptocom.py +2822 -0
  353. ccxt/currencycom.py +1950 -0
  354. ccxt/delta.py +3376 -0
  355. ccxt/deribit.py +3437 -0
  356. ccxt/digifinex.py +3959 -0
  357. ccxt/eterex.py +286 -0
  358. ccxt/excoino.py +399 -0
  359. ccxt/exir.py +375 -0
  360. ccxt/exmo.py +2462 -0
  361. ccxt/exnovin.py +360 -0
  362. ccxt/farhadexchange.py +266 -0
  363. ccxt/fmfwio.py +34 -0
  364. ccxt/gate.py +6975 -0
  365. ccxt/gateio.py +16 -0
  366. ccxt/gemini.py +1824 -0
  367. ccxt/hashkey.py +4150 -0
  368. ccxt/hitbtc.py +3423 -0
  369. ccxt/hitbtc3.py +16 -0
  370. ccxt/hitobit.py +391 -0
  371. ccxt/hollaex.py +1813 -0
  372. ccxt/htx.py +8505 -0
  373. ccxt/huobi.py +16 -0
  374. ccxt/huobijp.py +1801 -0
  375. ccxt/hyperliquid.py +2430 -0
  376. ccxt/idex.py +1766 -0
  377. ccxt/independentreserve.py +784 -0
  378. ccxt/indodax.py +1247 -0
  379. ccxt/jibitex.py +395 -0
  380. ccxt/kraken.py +2894 -0
  381. ccxt/krakenfutures.py +2601 -0
  382. ccxt/kucoin.py +4601 -0
  383. ccxt/kucoinfutures.py +2698 -0
  384. ccxt/kuna.py +1841 -0
  385. ccxt/latoken.py +1664 -0
  386. ccxt/lbank.py +2682 -0
  387. ccxt/luno.py +1067 -0
  388. ccxt/lykke.py +1270 -0
  389. ccxt/mercado.py +842 -0
  390. ccxt/mexc.py +5369 -0
  391. ccxt/ndax.py +2354 -0
  392. ccxt/nobitex.py +419 -0
  393. ccxt/novadax.py +1484 -0
  394. ccxt/oceanex.py +903 -0
  395. ccxt/okcoin.py +2936 -0
  396. ccxt/okexchange.py +349 -0
  397. ccxt/okx.py +7826 -0
  398. ccxt/ompfinex.py +472 -0
  399. ccxt/onetrading.py +1911 -0
  400. ccxt/oxfun.py +2772 -0
  401. ccxt/p2b.py +1194 -0
  402. ccxt/paradex.py +2015 -0
  403. ccxt/paymium.py +564 -0
  404. ccxt/phemex.py +4473 -0
  405. ccxt/poloniex.py +2232 -0
  406. ccxt/poloniexfutures.py +1717 -0
  407. ccxt/pro/__init__.py +149 -0
  408. ccxt/pro/alpaca.py +685 -0
  409. ccxt/pro/ascendex.py +916 -0
  410. ccxt/pro/bequant.py +38 -0
  411. ccxt/pro/binance.py +3488 -0
  412. ccxt/pro/binancecoinm.py +28 -0
  413. ccxt/pro/binanceus.py +48 -0
  414. ccxt/pro/binanceusdm.py +31 -0
  415. ccxt/pro/bingx.py +1264 -0
  416. ccxt/pro/bitcoincom.py +34 -0
  417. ccxt/pro/bitfinex.py +621 -0
  418. ccxt/pro/bitfinex2.py +1083 -0
  419. ccxt/pro/bitget.py +1692 -0
  420. ccxt/pro/bithumb.py +368 -0
  421. ccxt/pro/bitmart.py +1449 -0
  422. ccxt/pro/bitmex.py +1656 -0
  423. ccxt/pro/bitopro.py +445 -0
  424. ccxt/pro/bitpanda.py +15 -0
  425. ccxt/pro/bitrue.py +447 -0
  426. ccxt/pro/bitstamp.py +522 -0
  427. ccxt/pro/bitvavo.py +1270 -0
  428. ccxt/pro/blockchaincom.py +738 -0
  429. ccxt/pro/blofin.py +692 -0
  430. ccxt/pro/bybit.py +2000 -0
  431. ccxt/pro/cex.py +1440 -0
  432. ccxt/pro/coinbase.py +678 -0
  433. ccxt/pro/coinbaseadvanced.py +16 -0
  434. ccxt/pro/coinbaseexchange.py +895 -0
  435. ccxt/pro/coinbaseinternational.py +620 -0
  436. ccxt/pro/coincatch.py +1464 -0
  437. ccxt/pro/coincheck.py +199 -0
  438. ccxt/pro/coinex.py +1061 -0
  439. ccxt/pro/coinone.py +395 -0
  440. ccxt/pro/cryptocom.py +947 -0
  441. ccxt/pro/currencycom.py +536 -0
  442. ccxt/pro/deribit.py +892 -0
  443. ccxt/pro/exmo.py +629 -0
  444. ccxt/pro/gate.py +1416 -0
  445. ccxt/pro/gateio.py +15 -0
  446. ccxt/pro/gemini.py +865 -0
  447. ccxt/pro/hashkey.py +802 -0
  448. ccxt/pro/hitbtc.py +1216 -0
  449. ccxt/pro/hollaex.py +563 -0
  450. ccxt/pro/htx.py +2215 -0
  451. ccxt/pro/huobi.py +15 -0
  452. ccxt/pro/huobijp.py +570 -0
  453. ccxt/pro/hyperliquid.py +525 -0
  454. ccxt/pro/idex.py +672 -0
  455. ccxt/pro/independentreserve.py +270 -0
  456. ccxt/pro/kraken.py +1356 -0
  457. ccxt/pro/krakenfutures.py +1492 -0
  458. ccxt/pro/kucoin.py +1133 -0
  459. ccxt/pro/kucoinfutures.py +1081 -0
  460. ccxt/pro/lbank.py +843 -0
  461. ccxt/pro/luno.py +303 -0
  462. ccxt/pro/mexc.py +1122 -0
  463. ccxt/pro/ndax.py +506 -0
  464. ccxt/pro/okcoin.py +698 -0
  465. ccxt/pro/okx.py +1851 -0
  466. ccxt/pro/onetrading.py +1275 -0
  467. ccxt/pro/oxfun.py +950 -0
  468. ccxt/pro/p2b.py +419 -0
  469. ccxt/pro/paradex.py +352 -0
  470. ccxt/pro/phemex.py +1441 -0
  471. ccxt/pro/poloniex.py +1166 -0
  472. ccxt/pro/poloniexfutures.py +990 -0
  473. ccxt/pro/probit.py +551 -0
  474. ccxt/pro/upbit.py +520 -0
  475. ccxt/pro/vertex.py +943 -0
  476. ccxt/pro/wazirx.py +749 -0
  477. ccxt/pro/whitebit.py +864 -0
  478. ccxt/pro/woo.py +1078 -0
  479. ccxt/pro/woofipro.py +1183 -0
  480. ccxt/pro/xt.py +1067 -0
  481. ccxt/probit.py +1734 -0
  482. ccxt/ramzinex.py +476 -0
  483. ccxt/sarmayex.py +357 -0
  484. ccxt/sarrafex.py +478 -0
  485. ccxt/static_dependencies/__init__.py +1 -0
  486. ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  487. ccxt/static_dependencies/ecdsa/_version.py +520 -0
  488. ccxt/static_dependencies/ecdsa/curves.py +56 -0
  489. ccxt/static_dependencies/ecdsa/der.py +221 -0
  490. ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  491. ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  492. ccxt/static_dependencies/ecdsa/keys.py +332 -0
  493. ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  494. ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  495. ccxt/static_dependencies/ecdsa/util.py +266 -0
  496. ccxt/static_dependencies/ethereum/__init__.py +7 -0
  497. ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  498. ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  499. ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  500. ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  501. ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  502. ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  503. ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  504. ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  505. ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  506. ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  507. ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  508. ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  509. ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  510. ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  511. ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  512. ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  513. ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  514. ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  515. ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  516. ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  517. ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  518. ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  519. ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  520. ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  521. ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  522. ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  523. ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  524. ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  525. ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  526. ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  527. ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  528. ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  529. ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  530. ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  531. ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  532. ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  533. ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  534. ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  535. ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  536. ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  537. ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  538. ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  539. ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  540. ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  541. ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  542. ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  543. ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  544. ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  545. ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  546. ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  547. ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  548. ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  549. ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  550. ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  551. ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  552. ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  553. ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  554. ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  555. ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  556. ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  557. ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  558. ccxt/static_dependencies/keccak/__init__.py +3 -0
  559. ccxt/static_dependencies/keccak/keccak.py +197 -0
  560. ccxt/static_dependencies/lark/__init__.py +38 -0
  561. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  562. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  563. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  564. ccxt/static_dependencies/lark/common.py +86 -0
  565. ccxt/static_dependencies/lark/exceptions.py +292 -0
  566. ccxt/static_dependencies/lark/grammar.py +130 -0
  567. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  568. ccxt/static_dependencies/lark/indenter.py +143 -0
  569. ccxt/static_dependencies/lark/lark.py +658 -0
  570. ccxt/static_dependencies/lark/lexer.py +678 -0
  571. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  572. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  573. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  574. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  575. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  576. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  577. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  578. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  579. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  580. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  581. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  582. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  583. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  584. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  585. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  586. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  587. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  588. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  589. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  590. ccxt/static_dependencies/lark/tree.py +267 -0
  591. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  592. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  593. ccxt/static_dependencies/lark/utils.py +343 -0
  594. ccxt/static_dependencies/lark/visitors.py +596 -0
  595. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  596. ccxt/static_dependencies/marshmallow/base.py +65 -0
  597. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  598. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  599. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  600. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  601. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  602. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  603. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  604. ccxt/static_dependencies/marshmallow/types.py +12 -0
  605. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  606. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  607. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  608. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  609. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  610. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  611. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  612. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  613. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  614. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  615. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  616. ccxt/static_dependencies/msgpack/__init__.py +55 -0
  617. ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  618. ccxt/static_dependencies/msgpack/ext.py +168 -0
  619. ccxt/static_dependencies/msgpack/fallback.py +951 -0
  620. ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  621. ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  622. ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  623. ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  624. ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  625. ccxt/static_dependencies/parsimonious/utils.py +40 -0
  626. ccxt/static_dependencies/starknet/__init__.py +0 -0
  627. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  628. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  629. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  630. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  631. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  632. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  633. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  634. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  635. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  636. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  637. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  638. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  639. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  640. ccxt/static_dependencies/starknet/common.py +15 -0
  641. ccxt/static_dependencies/starknet/constants.py +39 -0
  642. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  643. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  644. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  645. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  646. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  647. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  648. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  649. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  650. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  651. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  652. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  653. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  654. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  655. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  656. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  657. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  658. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  659. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  660. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  661. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  662. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  663. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  664. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  665. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  666. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  667. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  668. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  669. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  670. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  671. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  672. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  673. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  674. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  675. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  676. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  677. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  678. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  679. ccxt/static_dependencies/starkware/__init__.py +0 -0
  680. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  681. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  682. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  683. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  684. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  685. ccxt/static_dependencies/sympy/__init__.py +0 -0
  686. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  687. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  688. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  689. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  690. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  691. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  692. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  693. ccxt/static_dependencies/toolz/__init__.py +26 -0
  694. ccxt/static_dependencies/toolz/_signatures.py +784 -0
  695. ccxt/static_dependencies/toolz/_version.py +520 -0
  696. ccxt/static_dependencies/toolz/compatibility.py +30 -0
  697. ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  698. ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  699. ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  700. ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  701. ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  702. ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  703. ccxt/static_dependencies/toolz/recipes.py +46 -0
  704. ccxt/static_dependencies/toolz/utils.py +9 -0
  705. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  706. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  707. ccxt/tabdeal.py +364 -0
  708. ccxt/test/__init__.py +3 -0
  709. ccxt/test/base/__init__.py +29 -0
  710. ccxt/test/base/test_account.py +26 -0
  711. ccxt/test/base/test_balance.py +56 -0
  712. ccxt/test/base/test_borrow_interest.py +35 -0
  713. ccxt/test/base/test_borrow_rate.py +32 -0
  714. ccxt/test/base/test_calculate_fee.py +51 -0
  715. ccxt/test/base/test_crypto.py +127 -0
  716. ccxt/test/base/test_currency.py +76 -0
  717. ccxt/test/base/test_datetime.py +109 -0
  718. ccxt/test/base/test_decimal_to_precision.py +392 -0
  719. ccxt/test/base/test_deep_extend.py +68 -0
  720. ccxt/test/base/test_deposit_withdrawal.py +50 -0
  721. ccxt/test/base/test_exchange_datetime_functions.py +76 -0
  722. ccxt/test/base/test_funding_rate_history.py +29 -0
  723. ccxt/test/base/test_last_price.py +31 -0
  724. ccxt/test/base/test_ledger_entry.py +45 -0
  725. ccxt/test/base/test_ledger_item.py +48 -0
  726. ccxt/test/base/test_leverage_tier.py +33 -0
  727. ccxt/test/base/test_liquidation.py +50 -0
  728. ccxt/test/base/test_margin_mode.py +24 -0
  729. ccxt/test/base/test_margin_modification.py +35 -0
  730. ccxt/test/base/test_market.py +193 -0
  731. ccxt/test/base/test_number.py +411 -0
  732. ccxt/test/base/test_ohlcv.py +33 -0
  733. ccxt/test/base/test_open_interest.py +32 -0
  734. ccxt/test/base/test_order.py +64 -0
  735. ccxt/test/base/test_order_book.py +69 -0
  736. ccxt/test/base/test_position.py +60 -0
  737. ccxt/test/base/test_shared_methods.py +353 -0
  738. ccxt/test/base/test_status.py +24 -0
  739. ccxt/test/base/test_throttle.py +126 -0
  740. ccxt/test/base/test_ticker.py +92 -0
  741. ccxt/test/base/test_trade.py +47 -0
  742. ccxt/test/base/test_trading_fee.py +26 -0
  743. ccxt/test/base/test_transaction.py +39 -0
  744. ccxt/test/test_async.py +1649 -0
  745. ccxt/test/test_sync.py +1648 -0
  746. ccxt/test/tests_async.py +1558 -0
  747. ccxt/test/tests_helpers.py +287 -0
  748. ccxt/test/tests_init.py +39 -0
  749. ccxt/test/tests_sync.py +1555 -0
  750. ccxt/tetherland.py +349 -0
  751. ccxt/timex.py +1593 -0
  752. ccxt/tokocrypto.py +2405 -0
  753. ccxt/tradeogre.py +608 -0
  754. ccxt/twox.py +326 -0
  755. ccxt/ubitex.py +409 -0
  756. ccxt/upbit.py +1833 -0
  757. ccxt/vertex.py +2922 -0
  758. ccxt/wallex.py +445 -0
  759. ccxt/wavesexchange.py +2472 -0
  760. ccxt/wazirx.py +1224 -0
  761. ccxt/whitebit.py +2469 -0
  762. ccxt/woo.py +3114 -0
  763. ccxt/woofipro.py +2533 -0
  764. ccxt/xt.py +4453 -0
  765. ccxt/yobit.py +1283 -0
  766. ccxt/zaif.py +725 -0
  767. ccxt/zonda.py +1828 -0
  768. ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
  769. ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
  770. ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
  771. ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
  772. ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,895 @@
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
8
+ import hashlib
9
+ from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, 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 AuthenticationError
14
+ from ccxt.base.errors import ArgumentsRequired
15
+ from ccxt.base.errors import BadRequest
16
+ from ccxt.base.errors import BadSymbol
17
+
18
+
19
+ class coinbaseexchange(ccxt.async_support.coinbaseexchange):
20
+
21
+ def describe(self):
22
+ return self.deep_extend(super(coinbaseexchange, self).describe(), {
23
+ 'has': {
24
+ 'ws': True,
25
+ 'watchOHLCV': False, # missing on the exchange side
26
+ 'watchOrderBook': True,
27
+ 'watchOrderBookForSymbols': True,
28
+ 'watchTicker': True,
29
+ 'watchTickers': True,
30
+ 'watchTrades': True,
31
+ 'watchTradesForSymbols': True,
32
+ 'watchMyTradesForSymbols': True,
33
+ 'watchBalance': False,
34
+ 'watchStatus': False, # for now
35
+ 'watchOrders': True,
36
+ 'watchOrdersForSymbols': True,
37
+ 'watchMyTrades': True,
38
+ },
39
+ 'urls': {
40
+ 'api': {
41
+ 'ws': 'wss://ws-feed.exchange.coinbase.com',
42
+ },
43
+ 'test': {
44
+ 'ws': 'wss://ws-feed-public.sandbox.exchange.coinbase.com',
45
+ },
46
+ },
47
+ 'options': {
48
+ 'tradesLimit': 1000,
49
+ 'ordersLimit': 1000,
50
+ 'myTradesLimit': 1000,
51
+ },
52
+ })
53
+
54
+ def authenticate(self):
55
+ self.check_required_credentials()
56
+ path = '/users/self/verify'
57
+ nonce = self.nonce()
58
+ payload = str(nonce) + 'GET' + path
59
+ signature = self.hmac(self.encode(payload), self.base64_to_binary(self.secret), hashlib.sha256, 'base64')
60
+ return {
61
+ 'timestamp': nonce,
62
+ 'key': self.apiKey,
63
+ 'signature': signature,
64
+ 'passphrase': self.password,
65
+ }
66
+
67
+ async def subscribe(self, name, symbol=None, messageHashStart=None, params={}):
68
+ await self.load_markets()
69
+ market = None
70
+ messageHash = messageHashStart
71
+ productIds = []
72
+ if symbol is not None:
73
+ market = self.market(symbol)
74
+ messageHash += ':' + market['id']
75
+ productIds.append(market['id'])
76
+ url = self.urls['api']['ws']
77
+ if 'signature' in params:
78
+ # need to distinguish between public trades and user trades
79
+ url = url + '?'
80
+ subscribe: dict = {
81
+ 'type': 'subscribe',
82
+ 'product_ids': productIds,
83
+ 'channels': [
84
+ name,
85
+ ],
86
+ }
87
+ request = self.extend(subscribe, params)
88
+ return await self.watch(url, messageHash, request, messageHash)
89
+
90
+ async def subscribe_multiple(self, name, symbols=[], messageHashStart=None, params={}):
91
+ await self.load_markets()
92
+ market = None
93
+ symbols = self.market_symbols(symbols)
94
+ messageHashes = []
95
+ productIds = []
96
+ for i in range(0, len(symbols)):
97
+ symbol = symbols[i]
98
+ market = self.market(symbol)
99
+ productIds.append(market['id'])
100
+ messageHashes.append(messageHashStart + ':' + market['symbol'])
101
+ url = self.urls['api']['ws']
102
+ if 'signature' in params:
103
+ # need to distinguish between public trades and user trades
104
+ url = url + '?'
105
+ subscribe: dict = {
106
+ 'type': 'subscribe',
107
+ 'product_ids': productIds,
108
+ 'channels': [
109
+ name,
110
+ ],
111
+ }
112
+ request = self.extend(subscribe, params)
113
+ return await self.watch_multiple(url, messageHashes, request, messageHashes)
114
+
115
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
116
+ """
117
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
118
+ :param str symbol: unified symbol of the market to fetch the ticker for
119
+ :param dict [params]: extra parameters specific to the exchange API endpoint
120
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
121
+ """
122
+ name = 'ticker'
123
+ return await self.subscribe(name, symbol, name, params)
124
+
125
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
126
+ """
127
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
128
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
129
+ :param dict [params]: extra parameters specific to the exchange API endpoint
130
+ :param str [params.channel]: the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
131
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
132
+ """
133
+ await self.load_markets()
134
+ symbolsLength = len(symbols)
135
+ if symbolsLength == 0:
136
+ raise BadSymbol(self.id + ' watchTickers requires a non-empty symbols array')
137
+ channel = 'ticker'
138
+ messageHash = 'ticker'
139
+ ticker = await self.subscribe_multiple(channel, symbols, messageHash, params)
140
+ if self.newUpdates:
141
+ result: dict = {}
142
+ result[ticker['symbol']] = ticker
143
+ return result
144
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
145
+
146
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
147
+ """
148
+ get the list of most recent trades for a particular symbol
149
+ :param str symbol: unified symbol of the market to fetch trades for
150
+ :param int [since]: timestamp in ms of the earliest trade to fetch
151
+ :param int [limit]: the maximum amount of trades to fetch
152
+ :param dict [params]: extra parameters specific to the exchange API endpoint
153
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
154
+ """
155
+ await self.load_markets()
156
+ symbol = self.symbol(symbol)
157
+ name = 'matches'
158
+ trades = await self.subscribe(name, symbol, name, params)
159
+ if self.newUpdates:
160
+ limit = trades.getLimit(symbol, limit)
161
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
162
+
163
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
164
+ """
165
+ get the list of most recent trades for a particular symbol
166
+ :param str symbol: unified symbol of the market to fetch trades for
167
+ :param int [since]: timestamp in ms of the earliest trade to fetch
168
+ :param int [limit]: the maximum amount of trades to fetch
169
+ :param dict [params]: extra parameters specific to the exchange API endpoint
170
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
171
+ """
172
+ symbolsLength = len(symbols)
173
+ if symbolsLength == 0:
174
+ raise BadRequest(self.id + ' watchTradesForSymbols() requires a non-empty array of symbols')
175
+ await self.load_markets()
176
+ symbols = self.market_symbols(symbols)
177
+ name = 'matches'
178
+ trades = await self.subscribe_multiple(name, symbols, name, params)
179
+ if self.newUpdates:
180
+ first = self.safe_value(trades, 0)
181
+ tradeSymbol = self.safe_string(first, 'symbol')
182
+ limit = trades.getLimit(tradeSymbol, limit)
183
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
184
+
185
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
186
+ """
187
+ watches information on multiple trades made by the user
188
+ :param str symbol: unified market symbol of the market trades were made in
189
+ :param int [since]: the earliest time in ms to fetch trades for
190
+ :param int [limit]: the maximum number of trade structures to retrieve
191
+ :param dict [params]: extra parameters specific to the exchange API endpoint
192
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
193
+ """
194
+ if symbol is None:
195
+ raise ArgumentsRequired(self.id + ' watchMyTrades() requires a symbol argument')
196
+ await self.load_markets()
197
+ symbol = self.symbol(symbol)
198
+ name = 'user'
199
+ messageHash = 'myTrades'
200
+ authentication = self.authenticate()
201
+ trades = await self.subscribe(name, symbol, messageHash, self.extend(params, authentication))
202
+ if self.newUpdates:
203
+ limit = trades.getLimit(symbol, limit)
204
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
205
+
206
+ async def watch_my_trades_for_symbols(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
207
+ """
208
+ watches information on multiple trades made by the user
209
+ :param str[] symbols: unified symbol of the market to fetch trades for
210
+ :param int [since]: the earliest time in ms to fetch trades for
211
+ :param int [limit]: the maximum number of trade structures to retrieve
212
+ :param dict [params]: extra parameters specific to the exchange API endpoint
213
+ :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
214
+ """
215
+ symbols = self.market_symbols(symbols, None, False)
216
+ await self.load_markets()
217
+ name = 'user'
218
+ messageHash = 'myTrades'
219
+ authentication = self.authenticate()
220
+ trades = await self.subscribe_multiple(name, symbols, messageHash, self.extend(params, authentication))
221
+ if self.newUpdates:
222
+ first = self.safe_value(trades, 0)
223
+ tradeSymbol = self.safe_string(first, 'symbol')
224
+ limit = trades.getLimit(tradeSymbol, limit)
225
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
226
+
227
+ async def watch_orders_for_symbols(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
228
+ """
229
+ watches information on multiple orders made by the user
230
+ :param str[] symbols: unified symbol of the market to fetch orders for
231
+ :param int [since]: the earliest time in ms to fetch orders for
232
+ :param int [limit]: the maximum number of trade structures to retrieve
233
+ :param dict [params]: extra parameters specific to the exchange API endpoint
234
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
235
+ """
236
+ await self.load_markets()
237
+ symbols = self.market_symbols(symbols, None, False)
238
+ name = 'user'
239
+ messageHash = 'orders'
240
+ authentication = self.authenticate()
241
+ orders = await self.subscribe_multiple(name, symbols, messageHash, self.extend(params, authentication))
242
+ if self.newUpdates:
243
+ first = self.safe_value(orders, 0)
244
+ tradeSymbol = self.safe_string(first, 'symbol')
245
+ limit = orders.getLimit(tradeSymbol, limit)
246
+ return self.filter_by_since_limit(orders, since, limit, 'timestamp', True)
247
+
248
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
249
+ """
250
+ watches information on multiple orders made by the user
251
+ :param str symbol: unified market symbol of the market orders were made in
252
+ :param int [since]: the earliest time in ms to fetch orders for
253
+ :param int [limit]: the maximum number of order structures to retrieve
254
+ :param dict [params]: extra parameters specific to the exchange API endpoint
255
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
256
+ """
257
+ if symbol is None:
258
+ raise BadSymbol(self.id + ' watchMyTrades requires a symbol')
259
+ await self.load_markets()
260
+ symbol = self.symbol(symbol)
261
+ name = 'user'
262
+ messageHash = 'orders'
263
+ authentication = self.authenticate()
264
+ orders = await self.subscribe(name, symbol, messageHash, self.extend(params, authentication))
265
+ if self.newUpdates:
266
+ limit = orders.getLimit(symbol, limit)
267
+ return self.filter_by_since_limit(orders, since, limit, 'timestamp', True)
268
+
269
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
270
+ """
271
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
272
+ :param str[] symbols: unified array of symbols
273
+ :param int [limit]: the maximum amount of order book entries to return
274
+ :param dict [params]: extra parameters specific to the exchange API endpoint
275
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
276
+ """
277
+ symbolsLength = len(symbols)
278
+ if symbolsLength == 0:
279
+ raise BadRequest(self.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols')
280
+ name = 'level2'
281
+ await self.load_markets()
282
+ symbols = self.market_symbols(symbols)
283
+ marketIds = self.market_ids(symbols)
284
+ messageHashes = []
285
+ for i in range(0, symbolsLength):
286
+ marketId = marketIds[i]
287
+ messageHashes.append(name + ':' + marketId)
288
+ url = self.urls['api']['ws']
289
+ subscribe: dict = {
290
+ 'type': 'subscribe',
291
+ 'product_ids': marketIds,
292
+ 'channels': [
293
+ name,
294
+ ],
295
+ }
296
+ request = self.extend(subscribe, params)
297
+ subscription: dict = {
298
+ 'messageHash': name,
299
+ 'symbols': symbols,
300
+ 'marketIds': marketIds,
301
+ 'limit': limit,
302
+ }
303
+ authentication = self.authenticate()
304
+ orderbook = await self.watch_multiple(url, messageHashes, self.extend(request, authentication), messageHashes, subscription)
305
+ return orderbook.limit()
306
+
307
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
308
+ """
309
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
310
+ :param str symbol: unified symbol of the market to fetch the order book for
311
+ :param int [limit]: the maximum amount of order book entries to return
312
+ :param dict [params]: extra parameters specific to the exchange API endpoint
313
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
314
+ """
315
+ name = 'level2'
316
+ await self.load_markets()
317
+ market = self.market(symbol)
318
+ symbol = market['symbol']
319
+ messageHash = name + ':' + market['id']
320
+ url = self.urls['api']['ws']
321
+ subscribe: dict = {
322
+ 'type': 'subscribe',
323
+ 'product_ids': [
324
+ market['id'],
325
+ ],
326
+ 'channels': [
327
+ name,
328
+ ],
329
+ }
330
+ request = self.extend(subscribe, params)
331
+ subscription: dict = {
332
+ 'messageHash': messageHash,
333
+ 'symbol': symbol,
334
+ 'marketId': market['id'],
335
+ 'limit': limit,
336
+ }
337
+ authentication = self.authenticate()
338
+ orderbook = await self.watch(url, messageHash, self.extend(request, authentication), messageHash, subscription)
339
+ return orderbook.limit()
340
+
341
+ def handle_trade(self, client: Client, message):
342
+ #
343
+ # {
344
+ # "type": "match",
345
+ # "trade_id": 82047307,
346
+ # "maker_order_id": "0f358725-2134-435e-be11-753912a326e0",
347
+ # "taker_order_id": "252b7002-87a3-425c-ac73-f5b9e23f3caf",
348
+ # "side": "sell",
349
+ # "size": "0.00513192",
350
+ # "price": "9314.78",
351
+ # "product_id": "BTC-USD",
352
+ # "sequence": 12038915443,
353
+ # "time": "2020-01-31T20:03:41.158814Z"
354
+ # }
355
+ #
356
+ marketId = self.safe_string(message, 'product_id')
357
+ if marketId is not None:
358
+ trade = self.parse_ws_trade(message)
359
+ symbol = trade['symbol']
360
+ # the exchange sends type = 'match'
361
+ # but requires 'matches' upon subscribing
362
+ # therefore we resolve 'matches' here instead of 'match'
363
+ type = 'matches'
364
+ messageHash = type + ':' + marketId
365
+ tradesArray = self.safe_value(self.trades, symbol)
366
+ if tradesArray is None:
367
+ tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
368
+ tradesArray = ArrayCache(tradesLimit)
369
+ self.trades[symbol] = tradesArray
370
+ tradesArray.append(trade)
371
+ client.resolve(tradesArray, messageHash)
372
+ return message
373
+
374
+ def handle_my_trade(self, client: Client, message):
375
+ marketId = self.safe_string(message, 'product_id')
376
+ if marketId is not None:
377
+ trade = self.parse_ws_trade(message)
378
+ type = 'myTrades'
379
+ messageHash = type + ':' + marketId
380
+ tradesArray = self.myTrades
381
+ if tradesArray is None:
382
+ limit = self.safe_integer(self.options, 'myTradesLimit', 1000)
383
+ tradesArray = ArrayCacheBySymbolById(limit)
384
+ self.myTrades = tradesArray
385
+ tradesArray.append(trade)
386
+ client.resolve(tradesArray, messageHash)
387
+ return message
388
+
389
+ def parse_ws_trade(self, trade, market=None):
390
+ #
391
+ # private trades
392
+ # {
393
+ # "type": "match",
394
+ # "trade_id": 10,
395
+ # "sequence": 50,
396
+ # "maker_order_id": "ac928c66-ca53-498f-9c13-a110027a60e8",
397
+ # "taker_order_id": "132fb6ae-456b-4654-b4e0-d681ac05cea1",
398
+ # "time": "2014-11-07T08:19:27.028459Z",
399
+ # "product_id": "BTC-USD",
400
+ # "size": "5.23512",
401
+ # "price": "400.23",
402
+ # "side": "sell",
403
+ # "taker_user_id: "5844eceecf7e803e259d0365",
404
+ # "user_id": "5844eceecf7e803e259d0365",
405
+ # "taker_profile_id": "765d1549-9660-4be2-97d4-fa2d65fa3352",
406
+ # "profile_id": "765d1549-9660-4be2-97d4-fa2d65fa3352",
407
+ # "taker_fee_rate": "0.005"
408
+ # }
409
+ #
410
+ # {
411
+ # "type": "match",
412
+ # "trade_id": 10,
413
+ # "sequence": 50,
414
+ # "maker_order_id": "ac928c66-ca53-498f-9c13-a110027a60e8",
415
+ # "taker_order_id": "132fb6ae-456b-4654-b4e0-d681ac05cea1",
416
+ # "time": "2014-11-07T08:19:27.028459Z",
417
+ # "product_id": "BTC-USD",
418
+ # "size": "5.23512",
419
+ # "price": "400.23",
420
+ # "side": "sell",
421
+ # "maker_user_id: "5844eceecf7e803e259d0365",
422
+ # "maker_id": "5844eceecf7e803e259d0365",
423
+ # "maker_profile_id": "765d1549-9660-4be2-97d4-fa2d65fa3352",
424
+ # "profile_id": "765d1549-9660-4be2-97d4-fa2d65fa3352",
425
+ # "maker_fee_rate": "0.001"
426
+ # }
427
+ #
428
+ # public trades
429
+ # {
430
+ # "type": "received",
431
+ # "time": "2014-11-07T08:19:27.028459Z",
432
+ # "product_id": "BTC-USD",
433
+ # "sequence": 10,
434
+ # "order_id": "d50ec984-77a8-460a-b958-66f114b0de9b",
435
+ # "size": "1.34",
436
+ # "price": "502.1",
437
+ # "side": "buy",
438
+ # "order_type": "limit"
439
+ # }
440
+ parsed = super(coinbaseexchange, self).parse_trade(trade)
441
+ feeRate = None
442
+ isMaker = False
443
+ if 'maker_fee_rate' in trade:
444
+ isMaker = True
445
+ parsed['takerOrMaker'] = 'maker'
446
+ feeRate = self.safe_number(trade, 'maker_fee_rate')
447
+ else:
448
+ parsed['takerOrMaker'] = 'taker'
449
+ feeRate = self.safe_number(trade, 'taker_fee_rate')
450
+ # side always represents the maker side of the trade
451
+ # so if we're taker, we invert it
452
+ currentSide = parsed['side']
453
+ parsed['side'] = self.safe_string({
454
+ 'buy': 'sell',
455
+ 'sell': 'buy',
456
+ }, currentSide, currentSide)
457
+ idKey = 'maker_order_id' if isMaker else 'taker_order_id'
458
+ parsed['order'] = self.safe_string(trade, idKey)
459
+ market = self.market(parsed['symbol'])
460
+ feeCurrency = market['quote']
461
+ feeCost = None
462
+ if (parsed['cost'] is not None) and (feeRate is not None):
463
+ cost = self.safe_number(parsed, 'cost')
464
+ feeCost = cost * feeRate
465
+ parsed['fee'] = {
466
+ 'rate': feeRate,
467
+ 'cost': feeCost,
468
+ 'currency': feeCurrency,
469
+ }
470
+ return parsed
471
+
472
+ def parse_ws_order_status(self, status):
473
+ statuses: dict = {
474
+ 'filled': 'closed',
475
+ 'canceled': 'canceled',
476
+ }
477
+ return self.safe_string(statuses, status, 'open')
478
+
479
+ def handle_order(self, client: Client, message):
480
+ #
481
+ # Order is created
482
+ #
483
+ # {
484
+ # "type": "received",
485
+ # "side": "sell",
486
+ # "product_id": "BTC-USDC",
487
+ # "time": "2021-03-05T16:42:21.878177Z",
488
+ # "sequence": 5641953814,
489
+ # "profile_id": "774ee0ce-fdda-405f-aa8d-47189a14ba0a",
490
+ # "user_id": "54fc141576dcf32596000133",
491
+ # "order_id": "11838707-bf9c-4d65-8cec-b57c9a7cab42",
492
+ # "order_type": "limit",
493
+ # "size": "0.0001",
494
+ # "price": "50000",
495
+ # "client_oid": "a317abb9-2b30-4370-ebfe-0deecb300180"
496
+ # }
497
+ #
498
+ # {
499
+ # "type": "received",
500
+ # "time": "2014-11-09T08:19:27.028459Z",
501
+ # "product_id": "BTC-USD",
502
+ # "sequence": 12,
503
+ # "order_id": "dddec984-77a8-460a-b958-66f114b0de9b",
504
+ # "funds": "3000.234",
505
+ # "side": "buy",
506
+ # "order_type": "market"
507
+ # }
508
+ #
509
+ # Order is on the order book
510
+ #
511
+ # {
512
+ # "type": "open",
513
+ # "side": "sell",
514
+ # "product_id": "BTC-USDC",
515
+ # "time": "2021-03-05T16:42:21.878177Z",
516
+ # "sequence": 5641953815,
517
+ # "profile_id": "774ee0ce-fdda-405f-aa8d-47189a14ba0a",
518
+ # "user_id": "54fc141576dcf32596000133",
519
+ # "price": "50000",
520
+ # "order_id": "11838707-bf9c-4d65-8cec-b57c9a7cab42",
521
+ # "remaining_size": "0.0001"
522
+ # }
523
+ #
524
+ # Order is partially or completely filled
525
+ #
526
+ # {
527
+ # "type": "match",
528
+ # "side": "sell",
529
+ # "product_id": "BTC-USDC",
530
+ # "time": "2021-03-05T16:37:13.396107Z",
531
+ # "sequence": 5641897876,
532
+ # "profile_id": "774ee0ce-fdda-405f-aa8d-47189a14ba0a",
533
+ # "user_id": "54fc141576dcf32596000133",
534
+ # "trade_id": 5455505,
535
+ # "maker_order_id": "e5f5754d-70a3-4346-95a6-209bcb503629",
536
+ # "taker_order_id": "88bf7086-7b15-40ff-8b19-ab4e08516d69",
537
+ # "size": "0.00021019",
538
+ # "price": "47338.46",
539
+ # "taker_profile_id": "774ee0ce-fdda-405f-aa8d-47189a14ba0a",
540
+ # "taker_user_id": "54fc141576dcf32596000133",
541
+ # "taker_fee_rate": "0.005"
542
+ # }
543
+ #
544
+ # Order is canceled / closed
545
+ #
546
+ # {
547
+ # "type": "done",
548
+ # "side": "buy",
549
+ # "product_id": "BTC-USDC",
550
+ # "time": "2021-03-05T16:37:13.396107Z",
551
+ # "sequence": 5641897877,
552
+ # "profile_id": "774ee0ce-fdda-405f-aa8d-47189a14ba0a",
553
+ # "user_id": "54fc141576dcf32596000133",
554
+ # "order_id": "88bf7086-7b15-40ff-8b19-ab4e08516d69",
555
+ # "reason": "filled"
556
+ # }
557
+ #
558
+ currentOrders = self.orders
559
+ if currentOrders is None:
560
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
561
+ currentOrders = ArrayCacheBySymbolById(limit)
562
+ self.orders = currentOrders
563
+ type = self.safe_string(message, 'type')
564
+ marketId = self.safe_string(message, 'product_id')
565
+ if marketId is not None:
566
+ messageHash = 'orders:' + marketId
567
+ symbol = self.safe_symbol(marketId)
568
+ orderId = self.safe_string(message, 'order_id')
569
+ makerOrderId = self.safe_string(message, 'maker_order_id')
570
+ takerOrderId = self.safe_string(message, 'taker_order_id')
571
+ orders = self.orders
572
+ previousOrders = self.safe_value(orders.hashmap, symbol, {})
573
+ previousOrder = self.safe_value(previousOrders, orderId)
574
+ if previousOrder is None:
575
+ previousOrder = self.safe_value_2(previousOrders, makerOrderId, takerOrderId)
576
+ if previousOrder is None:
577
+ parsed = self.parse_ws_order(message)
578
+ orders.append(parsed)
579
+ client.resolve(orders, messageHash)
580
+ else:
581
+ sequence = self.safe_integer(message, 'sequence')
582
+ previousInfo = self.safe_value(previousOrder, 'info', {})
583
+ previousSequence = self.safe_integer(previousInfo, 'sequence')
584
+ if (previousSequence is None) or (sequence > previousSequence):
585
+ if type == 'match':
586
+ trade = self.parse_ws_trade(message)
587
+ if previousOrder['trades'] is None:
588
+ previousOrder['trades'] = []
589
+ previousOrder['trades'].append(trade)
590
+ previousOrder['lastTradeTimestamp'] = trade['timestamp']
591
+ totalCost = 0
592
+ totalAmount = 0
593
+ trades = previousOrder['trades']
594
+ for i in range(0, len(trades)):
595
+ tradeEntry = trades[i]
596
+ totalCost = self.sum(totalCost, tradeEntry['cost'])
597
+ totalAmount = self.sum(totalAmount, tradeEntry['amount'])
598
+ if totalAmount > 0:
599
+ previousOrder['average'] = totalCost / totalAmount
600
+ previousOrder['cost'] = totalCost
601
+ if previousOrder['filled'] is not None:
602
+ previousOrder['filled'] += trade['amount']
603
+ if previousOrder['amount'] is not None:
604
+ previousOrder['remaining'] = previousOrder['amount'] - previousOrder['filled']
605
+ if previousOrder['fee'] is None:
606
+ previousOrder['fee'] = {
607
+ 'cost': 0,
608
+ 'currency': trade['fee']['currency'],
609
+ }
610
+ if (previousOrder['fee']['cost'] is not None) and (trade['fee']['cost'] is not None):
611
+ previousOrder['fee']['cost'] = self.sum(previousOrder['fee']['cost'], trade['fee']['cost'])
612
+ # update the newUpdates count
613
+ orders.append(previousOrder)
614
+ client.resolve(orders, messageHash)
615
+ elif (type == 'received') or (type == 'done'):
616
+ info = self.extend(previousOrder['info'], message)
617
+ order = self.parse_ws_order(info)
618
+ keys = list(order.keys())
619
+ # update the reference
620
+ for i in range(0, len(keys)):
621
+ key = keys[i]
622
+ if order[key] is not None:
623
+ previousOrder[key] = order[key]
624
+ # update the newUpdates count
625
+ orders.append(previousOrder)
626
+ client.resolve(orders, messageHash)
627
+
628
+ def parse_ws_order(self, order, market=None):
629
+ id = self.safe_string(order, 'order_id')
630
+ clientOrderId = self.safe_string(order, 'client_oid')
631
+ marketId = self.safe_string(order, 'product_id')
632
+ symbol = self.safe_symbol(marketId)
633
+ side = self.safe_string(order, 'side')
634
+ price = self.safe_number(order, 'price')
635
+ amount = self.safe_number_2(order, 'size', 'funds')
636
+ time = self.safe_string(order, 'time')
637
+ timestamp = self.parse8601(time)
638
+ reason = self.safe_string(order, 'reason')
639
+ status = self.parse_ws_order_status(reason)
640
+ orderType = self.safe_string(order, 'order_type')
641
+ remaining = self.safe_number(order, 'remaining_size')
642
+ type = self.safe_string(order, 'type')
643
+ filled = None
644
+ if (amount is not None) and (remaining is not None):
645
+ filled = amount - remaining
646
+ elif type == 'received':
647
+ filled = 0
648
+ if amount is not None:
649
+ remaining = amount - filled
650
+ return self.safe_order({
651
+ 'info': order,
652
+ 'symbol': symbol,
653
+ 'id': id,
654
+ 'clientOrderId': clientOrderId,
655
+ 'timestamp': timestamp,
656
+ 'datetime': self.iso8601(timestamp),
657
+ 'lastTradeTimestamp': None,
658
+ 'type': orderType,
659
+ 'timeInForce': None,
660
+ 'postOnly': None,
661
+ 'side': side,
662
+ 'price': price,
663
+ 'stopPrice': None,
664
+ 'triggerPrice': None,
665
+ 'amount': amount,
666
+ 'cost': None,
667
+ 'average': None,
668
+ 'filled': filled,
669
+ 'remaining': remaining,
670
+ 'status': status,
671
+ 'fee': None,
672
+ 'trades': None,
673
+ })
674
+
675
+ def handle_ticker(self, client: Client, message):
676
+ #
677
+ # {
678
+ # "type": "ticker",
679
+ # "sequence": 12042642428,
680
+ # "product_id": "BTC-USD",
681
+ # "price": "9380.55",
682
+ # "open_24h": "9450.81000000",
683
+ # "volume_24h": "9611.79166047",
684
+ # "low_24h": "9195.49000000",
685
+ # "high_24h": "9475.19000000",
686
+ # "volume_30d": "327812.00311873",
687
+ # "best_bid": "9380.54",
688
+ # "best_ask": "9380.55",
689
+ # "side": "buy",
690
+ # "time": "2020-02-01T01:40:16.253563Z",
691
+ # "trade_id": 82062566,
692
+ # "last_size": "0.41969131"
693
+ # }
694
+ #
695
+ marketId = self.safe_string(message, 'product_id')
696
+ if marketId is not None:
697
+ ticker = self.parse_ticker(message)
698
+ symbol = ticker['symbol']
699
+ self.tickers[symbol] = ticker
700
+ messageHash = 'ticker:' + symbol
701
+ idMessageHash = 'ticker:' + marketId
702
+ client.resolve(ticker, messageHash)
703
+ client.resolve(ticker, idMessageHash)
704
+ return message
705
+
706
+ def parse_ticker(self, ticker, market=None) -> Ticker:
707
+ #
708
+ # {
709
+ # "type": "ticker",
710
+ # "sequence": 7388547310,
711
+ # "product_id": "BTC-USDT",
712
+ # "price": "22345.67",
713
+ # "open_24h": "22308.13",
714
+ # "volume_24h": "470.21123644",
715
+ # "low_24h": "22150",
716
+ # "high_24h": "22495.15",
717
+ # "volume_30d": "25713.98401605",
718
+ # "best_bid": "22345.67",
719
+ # "best_bid_size": "0.10647825",
720
+ # "best_ask": "22349.68",
721
+ # "best_ask_size": "0.03131702",
722
+ # "side": "sell",
723
+ # "time": "2023-03-04T03:37:20.799258Z",
724
+ # "trade_id": 11586478,
725
+ # "last_size": "0.00352175"
726
+ # }
727
+ #
728
+ type = self.safe_string(ticker, 'type')
729
+ if type is None:
730
+ return super(coinbaseexchange, self).parse_ticker(ticker, market)
731
+ marketId = self.safe_string(ticker, 'product_id')
732
+ symbol = self.safe_symbol(marketId, market, '-')
733
+ timestamp = self.parse8601(self.safe_string(ticker, 'time'))
734
+ last = self.safe_string(ticker, 'price')
735
+ return self.safe_ticker({
736
+ 'symbol': symbol,
737
+ 'timestamp': timestamp,
738
+ 'datetime': self.iso8601(timestamp),
739
+ 'high': self.safe_string(ticker, 'high_24h'),
740
+ 'low': self.safe_string(ticker, 'low_24h'),
741
+ 'bid': self.safe_string(ticker, 'best_bid'),
742
+ 'bidVolume': self.safe_string(ticker, 'best_bid_size'),
743
+ 'ask': self.safe_string(ticker, 'best_ask'),
744
+ 'askVolume': self.safe_string(ticker, 'best_ask_size'),
745
+ 'vwap': None,
746
+ 'open': self.safe_string(ticker, 'open_24h'),
747
+ 'close': last,
748
+ 'last': last,
749
+ 'previousClose': None,
750
+ 'change': None,
751
+ 'percentage': None,
752
+ 'average': None,
753
+ 'baseVolume': self.safe_string(ticker, 'volume_24h'),
754
+ 'quoteVolume': None,
755
+ 'info': ticker,
756
+ })
757
+
758
+ def handle_delta(self, bookside, delta):
759
+ price = self.safe_number(delta, 0)
760
+ amount = self.safe_number(delta, 1)
761
+ bookside.store(price, amount)
762
+
763
+ def handle_deltas(self, bookside, deltas):
764
+ for i in range(0, len(deltas)):
765
+ self.handle_delta(bookside, deltas[i])
766
+
767
+ def handle_order_book(self, client: Client, message):
768
+ #
769
+ # first message(snapshot)
770
+ #
771
+ # {
772
+ # "type": "snapshot",
773
+ # "product_id": "BTC-USD",
774
+ # "bids": [
775
+ # ["10101.10", "0.45054140"]
776
+ # ],
777
+ # "asks": [
778
+ # ["10102.55", "0.57753524"]
779
+ # ]
780
+ # }
781
+ #
782
+ # subsequent updates
783
+ #
784
+ # {
785
+ # "type": "l2update",
786
+ # "product_id": "BTC-USD",
787
+ # "time": "2019-08-14T20:42:27.265Z",
788
+ # "changes": [
789
+ # ["buy", "10101.80000000", "0.162567"]
790
+ # ]
791
+ # }
792
+ #
793
+ type = self.safe_string(message, 'type')
794
+ marketId = self.safe_string(message, 'product_id')
795
+ market = self.safe_market(marketId, None, '-')
796
+ symbol = market['symbol']
797
+ name = 'level2'
798
+ messageHash = name + ':' + marketId
799
+ subscription = self.safe_value(client.subscriptions, messageHash, {})
800
+ limit = self.safe_integer(subscription, 'limit')
801
+ if type == 'snapshot':
802
+ self.orderbooks[symbol] = self.order_book({}, limit)
803
+ orderbook = self.orderbooks[symbol]
804
+ self.handle_deltas(orderbook['asks'], self.safe_value(message, 'asks', []))
805
+ self.handle_deltas(orderbook['bids'], self.safe_value(message, 'bids', []))
806
+ orderbook['timestamp'] = None
807
+ orderbook['datetime'] = None
808
+ orderbook['symbol'] = symbol
809
+ client.resolve(orderbook, messageHash)
810
+ elif type == 'l2update':
811
+ orderbook = self.orderbooks[symbol]
812
+ timestamp = self.parse8601(self.safe_string(message, 'time'))
813
+ changes = self.safe_value(message, 'changes', [])
814
+ sides: dict = {
815
+ 'sell': 'asks',
816
+ 'buy': 'bids',
817
+ }
818
+ for i in range(0, len(changes)):
819
+ change = changes[i]
820
+ key = self.safe_string(change, 0)
821
+ side = self.safe_string(sides, key)
822
+ price = self.safe_number(change, 1)
823
+ amount = self.safe_number(change, 2)
824
+ bookside = orderbook[side]
825
+ bookside.store(price, amount)
826
+ orderbook['timestamp'] = timestamp
827
+ orderbook['datetime'] = self.iso8601(timestamp)
828
+ client.resolve(orderbook, messageHash)
829
+
830
+ def handle_subscription_status(self, client: Client, message):
831
+ #
832
+ # {
833
+ # "type": "subscriptions",
834
+ # "channels": [
835
+ # {
836
+ # "name": "level2",
837
+ # "product_ids": ["ETH-BTC"]
838
+ # }
839
+ # ]
840
+ # }
841
+ #
842
+ return message
843
+
844
+ def handle_error_message(self, client: Client, message):
845
+ #
846
+ # {
847
+ # "type": "error",
848
+ # "message": "error message",
849
+ # /* ..."""
850
+ # }
851
+ #
852
+ # auth error
853
+ #
854
+ # {
855
+ # "type": "error",
856
+ # "message": "Authentication Failed",
857
+ # "reason": "{"message":"Invalid API Key"}"
858
+ # }
859
+ #
860
+ errMsg = self.safe_string(message, 'message')
861
+ reason = self.safe_string(message, 'reason')
862
+ try:
863
+ if errMsg == 'Authentication Failed':
864
+ raise AuthenticationError('Authentication failed: ' + reason)
865
+ else:
866
+ raise ExchangeError(self.id + ' ' + reason)
867
+ except Exception as error:
868
+ client.reject(error)
869
+ return True
870
+
871
+ def handle_message(self, client: Client, message):
872
+ type = self.safe_string(message, 'type')
873
+ methods: dict = {
874
+ 'snapshot': self.handle_order_book,
875
+ 'l2update': self.handle_order_book,
876
+ 'subscribe': self.handle_subscription_status,
877
+ 'ticker': self.handle_ticker,
878
+ 'received': self.handle_order,
879
+ 'open': self.handle_order,
880
+ 'change': self.handle_order,
881
+ 'done': self.handle_order,
882
+ 'error': self.handle_error_message,
883
+ }
884
+ length = len(client.url) - 0
885
+ authenticated = client.url[length - 1] == '?'
886
+ method = self.safe_value(methods, type)
887
+ if method is None:
888
+ if type == 'match':
889
+ if authenticated:
890
+ self.handle_my_trade(client, message)
891
+ self.handle_order(client, message)
892
+ else:
893
+ self.handle_trade(client, message)
894
+ else:
895
+ method(client, message)