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,50 @@
1
+ import asyncio
2
+ import collections
3
+ from time import time
4
+
5
+
6
+ class Throttler:
7
+ def __init__(self, config, loop=None):
8
+ self.loop = loop
9
+ self.config = {
10
+ 'refillRate': 1.0,
11
+ 'delay': 0.001,
12
+ 'cost': 1.0,
13
+ 'tokens': 0,
14
+ 'maxCapacity': 2000,
15
+ 'capacity': 1.0,
16
+ }
17
+ self.config.update(config)
18
+ self.queue = collections.deque()
19
+ self.running = False
20
+
21
+ async def looper(self):
22
+ last_timestamp = time() * 1000
23
+ while self.running:
24
+ future, cost = self.queue[0]
25
+ cost = self.config['cost'] if cost is None else cost
26
+ if self.config['tokens'] >= 0:
27
+ self.config['tokens'] -= cost
28
+ if not future.done():
29
+ future.set_result(None)
30
+ self.queue.popleft()
31
+ # context switch
32
+ await asyncio.sleep(0)
33
+ if len(self.queue) == 0:
34
+ self.running = False
35
+ else:
36
+ await asyncio.sleep(self.config['delay'])
37
+ now = time() * 1000
38
+ elapsed = now - last_timestamp
39
+ last_timestamp = now
40
+ self.config['tokens'] = min(self.config['tokens'] + elapsed * self.config['refillRate'], self.config['capacity'])
41
+
42
+ def __call__(self, cost=None):
43
+ future = asyncio.Future()
44
+ if len(self.queue) > self.config['maxCapacity']:
45
+ raise RuntimeError('throttle queue is over maxCapacity (' + str(int(self.config['maxCapacity'])) + '), see https://github.com/ccxt/ccxt/issues/11645#issuecomment-1195695526')
46
+ self.queue.append((future, cost))
47
+ if not self.running:
48
+ self.running = True
49
+ asyncio.ensure_future(self.looper(), loop=self.loop)
50
+ return future
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from ccxt.base import errors
4
+
5
+ # -----------------------------------------------------------------------------
6
+
7
+ from ccxt.base import decimal_to_precision
8
+
9
+ from ccxt import BaseError # noqa: F401
10
+ from ccxt import ExchangeError # noqa: F401
11
+ from ccxt import NotSupported # noqa: F401
12
+ from ccxt import AuthenticationError # noqa: F401
13
+ from ccxt import PermissionDenied # noqa: F401
14
+ from ccxt import AccountSuspended # noqa: F401
15
+ from ccxt import InvalidNonce # noqa: F401
16
+ from ccxt import InsufficientFunds # noqa: F401
17
+ from ccxt import InvalidOrder # noqa: F401
18
+ from ccxt import OrderNotFound # noqa: F401
19
+ from ccxt import OrderNotCached # noqa: F401
20
+ from ccxt import DuplicateOrderId # noqa: F401
21
+ from ccxt import CancelPending # noqa: F401
22
+ from ccxt import NetworkError # noqa: F401
23
+ from ccxt import DDoSProtection # noqa: F401
24
+ from ccxt import RateLimitExceeded # noqa: F401
25
+ from ccxt import RequestTimeout # noqa: F401
26
+ from ccxt import ExchangeNotAvailable # noqa: F401
27
+ from ccxt import OnMaintenance # noqa: F401
28
+ from ccxt import InvalidAddress # noqa: F401
29
+ from ccxt import AddressPending # noqa: F401
30
+ from ccxt import ArgumentsRequired # noqa: F401
31
+ from ccxt import BadRequest # noqa: F401
32
+ from ccxt import BadResponse # noqa: F401
33
+ from ccxt import NullResponse # noqa: F401
34
+ from ccxt import OrderImmediatelyFillable # noqa: F401
35
+ from ccxt import OrderNotFillable # noqa: F401
36
+
37
+
38
+ __all__ = decimal_to_precision.__all__ + errors.__all__ # noqa: F405
@@ -0,0 +1,125 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ import json
4
+ from asyncio import sleep, ensure_future
5
+ from aiohttp import WSMsgType
6
+ from .functions import milliseconds, iso8601, is_json_encoded_object
7
+ from ccxt.async_support.base.ws.client import Client
8
+ from ccxt.async_support.base.ws.functions import gunzip, inflate
9
+ from ccxt import NetworkError, RequestTimeout, ExchangeClosedByUser
10
+
11
+
12
+ class AiohttpClient(Client):
13
+
14
+ proxy = None
15
+
16
+ def closed(self):
17
+ return (self.connection is None) or self.connection.closed
18
+
19
+ def receive(self):
20
+ return self.connection.receive()
21
+
22
+ # helper method for binary and text messages
23
+ def handle_text_or_binary_message(self, data):
24
+ if self.verbose:
25
+ self.log(iso8601(milliseconds()), 'message', data)
26
+ if isinstance(data, bytes):
27
+ data = data.decode()
28
+ decoded = json.loads(data) if is_json_encoded_object(data) else data
29
+ self.on_message_callback(self, decoded)
30
+
31
+ def handle_message(self, message):
32
+ # self.log(iso8601(milliseconds()), message)
33
+ if message.type == WSMsgType.TEXT:
34
+ self.handle_text_or_binary_message(message.data)
35
+ elif message.type == WSMsgType.BINARY:
36
+ data = message.data
37
+ if self.gunzip:
38
+ data = gunzip(data)
39
+ elif self.inflate:
40
+ data = inflate(data)
41
+ self.handle_text_or_binary_message(data)
42
+ # autoping is responsible for automatically replying with pong
43
+ # to a ping incoming from a server, we have to disable autoping
44
+ # with aiohttp's websockets and respond with pong manually
45
+ # otherwise aiohttp's websockets client won't trigger WSMsgType.PONG
46
+ elif message.type == WSMsgType.PING:
47
+ if self.verbose:
48
+ self.log(iso8601(milliseconds()), 'ping', message)
49
+ ensure_future(self.connection.pong(message.data), loop=self.asyncio_loop)
50
+ elif message.type == WSMsgType.PONG:
51
+ self.lastPong = milliseconds()
52
+ if self.verbose:
53
+ self.log(iso8601(milliseconds()), 'pong', message)
54
+ pass
55
+ elif message.type == WSMsgType.CLOSE:
56
+ if self.verbose:
57
+ self.log(iso8601(milliseconds()), 'close', self.closed(), message)
58
+ self.on_close(message.data)
59
+ elif message.type == WSMsgType.CLOSED:
60
+ if self.verbose:
61
+ self.log(iso8601(milliseconds()), 'closed', self.closed(), message)
62
+ self.on_close(1000)
63
+ elif message.type == WSMsgType.ERROR:
64
+ if self.verbose:
65
+ self.log(iso8601(milliseconds()), 'error', message)
66
+ error = NetworkError(str(message))
67
+ self.on_error(error)
68
+
69
+ def create_connection(self, session):
70
+ # autoping is responsible for automatically replying with pong
71
+ # to a ping incoming from a server, we have to disable autoping
72
+ # with aiohttp's websockets and respond with pong manually
73
+ # otherwise aiohttp's websockets client won't trigger WSMsgType.PONG
74
+ # call aenter here to simulate async with otherwise we get the error "await not called with future"
75
+ # if connecting to a non-existent endpoint
76
+ if (self.proxy):
77
+ return session.ws_connect(self.url, autoping=False, autoclose=False, headers=self.options.get('headers'), proxy=self.proxy).__aenter__()
78
+ return session.ws_connect(self.url, autoping=False, autoclose=False, headers=self.options.get('headers')).__aenter__()
79
+
80
+ async def send(self, message):
81
+ if self.verbose:
82
+ self.log(iso8601(milliseconds()), 'sending', message)
83
+ return await self.connection.send_str(message if isinstance(message, str) else json.dumps(message, separators=(',', ':')))
84
+
85
+ async def close(self, code=1000):
86
+ if self.verbose:
87
+ self.log(iso8601(milliseconds()), 'closing', code)
88
+ if not self.closed():
89
+ await self.connection.close()
90
+ # these will end automatically once self.closed() = True
91
+ # so we don't need to cancel them
92
+ if self.ping_looper:
93
+ self.ping_looper.cancel()
94
+ if self.receive_looper:
95
+ self.receive_looper.cancel() # cancel all pending futures stored in self.futures
96
+ for key in self.futures:
97
+ future = self.futures[key]
98
+ if not future.done():
99
+ if future.is_race_future:
100
+ future.cancel() # this is an "internal" future so we want to cancel it silently
101
+ else:
102
+ future.reject(ExchangeClosedByUser('Connection closed by the user'))
103
+
104
+
105
+ async def ping_loop(self):
106
+ if self.verbose:
107
+ self.log(iso8601(milliseconds()), 'ping loop')
108
+ while self.keepAlive and not self.closed():
109
+ now = milliseconds()
110
+ self.lastPong = now if self.lastPong is None else self.lastPong
111
+ if (self.lastPong + self.keepAlive * self.maxPingPongMisses) < now:
112
+ self.on_error(RequestTimeout('Connection to ' + self.url + ' timed out due to a ping-pong keepalive missing on time'))
113
+ # the following ping-clause is not necessary with aiohttp's built-in ws
114
+ # since it has a heartbeat option (see create_connection above)
115
+ # however some exchanges require a text-type ping message
116
+ # therefore we need this clause anyway
117
+ else:
118
+ if self.ping:
119
+ try:
120
+ await self.send(self.ping(self))
121
+ except Exception as e:
122
+ self.on_error(e)
123
+ else:
124
+ await self.connection.ping()
125
+ await sleep(self.keepAlive / 1000)
@@ -0,0 +1,212 @@
1
+ import collections
2
+
3
+
4
+ class Delegate:
5
+ def __init__(self, name, delegated):
6
+ self.name = name
7
+ self.delegated = delegated
8
+
9
+ def __get__(self, instance, owner):
10
+ deque = getattr(instance, self.delegated)
11
+ return getattr(deque, self.name)
12
+
13
+
14
+ class BaseCache(list):
15
+ # implicitly called magic methods don't invoke __getattribute__
16
+ # https://docs.python.org/3/reference/datamodel.html#special-method-lookup
17
+ # all method lookups obey the descriptor protocol
18
+ # this is how the implicit api is defined in ccxt
19
+ __iter__ = Delegate('__iter__', '_deque')
20
+ __setitem__ = Delegate('__setitem__', '_deque')
21
+ __delitem__ = Delegate('__delitem__', '_deque')
22
+ __len__ = Delegate('__len__', '_deque')
23
+ __contains__ = Delegate('__contains__', '_deque')
24
+ __reversed__ = Delegate('__reversed__', '_deque')
25
+ clear = Delegate('clear', '_deque')
26
+
27
+ def __init__(self, max_size=None):
28
+ super(BaseCache, self).__init__()
29
+ self.max_size = max_size
30
+ self._deque = collections.deque([], max_size)
31
+
32
+ def __eq__(self, other):
33
+ return list(self) == other
34
+
35
+ def __repr__(self):
36
+ return str(list(self))
37
+
38
+ def __add__(self, other):
39
+ return list(self) + other
40
+
41
+ def __getitem__(self, item):
42
+ # deque doesn't support slicing
43
+ deque = super(list, self).__getattribute__('_deque')
44
+ if isinstance(item, slice):
45
+ start, stop, step = item.indices(len(deque))
46
+ return [deque[i] for i in range(start, stop, step)]
47
+ else:
48
+ return deque[item]
49
+
50
+ # to be overriden
51
+ def getLimit(self, symbol, limit):
52
+ pass
53
+
54
+ # support transpiled snake_case calls
55
+ def get_limit(self, symbol, limit):
56
+ return self.getLimit(symbol, limit)
57
+
58
+
59
+ class ArrayCache(BaseCache):
60
+ def __init__(self, max_size=None):
61
+ super(ArrayCache, self).__init__(max_size)
62
+ self._nested_new_updates_by_symbol = False
63
+ self._new_updates_by_symbol = {}
64
+ self._clear_updates_by_symbol = {}
65
+ self._all_new_updates = 0
66
+ self._clear_all_updates = False
67
+
68
+ def getLimit(self, symbol, limit):
69
+ if symbol is None:
70
+ new_updates_value = self._all_new_updates
71
+ self._clear_all_updates = True
72
+ else:
73
+ new_updates_value = self._new_updates_by_symbol.get(symbol)
74
+ if new_updates_value is not None and self._nested_new_updates_by_symbol:
75
+ new_updates_value = len(new_updates_value)
76
+ self._clear_updates_by_symbol[symbol] = True
77
+
78
+ if new_updates_value is None:
79
+ return limit
80
+ elif limit is not None:
81
+ return min(new_updates_value, limit)
82
+ else:
83
+ return new_updates_value
84
+
85
+ def append(self, item):
86
+ self._deque.append(item)
87
+ if self._clear_all_updates:
88
+ self._clear_all_updates = False
89
+ self._clear_updates_by_symbol.clear()
90
+ self._all_new_updates = 0
91
+ self._new_updates_by_symbol.clear()
92
+ if self._clear_updates_by_symbol.get(item['symbol']):
93
+ self._clear_updates_by_symbol[item['symbol']] = False
94
+ self._new_updates_by_symbol[item['symbol']] = 0
95
+ self._new_updates_by_symbol[item['symbol']] = self._new_updates_by_symbol.get(item['symbol'], 0) + 1
96
+ self._all_new_updates = (self._all_new_updates or 0) + 1
97
+
98
+
99
+ class ArrayCacheByTimestamp(BaseCache):
100
+ def __init__(self, max_size=None):
101
+ super(ArrayCacheByTimestamp, self).__init__(max_size)
102
+ self.hashmap = {}
103
+ self._size_tracker = set()
104
+ self._new_updates = 0
105
+ self._clear_updates = False
106
+
107
+ def getLimit(self, symbol, limit):
108
+ self._clear_updates = True
109
+ if limit is None:
110
+ return self._new_updates
111
+ return min(self._new_updates, limit)
112
+
113
+ def append(self, item):
114
+ if item[0] in self.hashmap:
115
+ reference = self.hashmap[item[0]]
116
+ if reference != item:
117
+ reference[0:len(item)] = item
118
+ else:
119
+ self.hashmap[item[0]] = item
120
+ if len(self._deque) == self._deque.maxlen:
121
+ delete_reference = self._deque.popleft()
122
+ del self.hashmap[delete_reference[0]]
123
+ self._deque.append(item)
124
+ if self._clear_updates:
125
+ self._clear_updates = False
126
+ self._size_tracker.clear()
127
+ self._size_tracker.add(item[0])
128
+ self._new_updates = len(self._size_tracker)
129
+
130
+
131
+ class ArrayCacheBySymbolById(ArrayCache):
132
+ def __init__(self, max_size=None):
133
+ super(ArrayCacheBySymbolById, self).__init__(max_size)
134
+ self._nested_new_updates_by_symbol = True
135
+ self.hashmap = {}
136
+ self._index = collections.deque([], max_size)
137
+
138
+ def append(self, item):
139
+ by_id = self.hashmap.setdefault(item['symbol'], {})
140
+ if item['id'] in by_id:
141
+ reference = by_id[item['id']]
142
+ if reference != item:
143
+ reference.update(item)
144
+ item = reference
145
+ index = self._index.index(item['id'])
146
+ del self._deque[index]
147
+ del self._index[index]
148
+ else:
149
+ by_id[item['id']] = item
150
+ if len(self._deque) == self._deque.maxlen:
151
+ delete_item = self._deque.popleft()
152
+ self._index.popleft()
153
+ del self.hashmap[delete_item['symbol']][delete_item['id']]
154
+ self._deque.append(item)
155
+ self._index.append(item['id'])
156
+ if self._clear_all_updates:
157
+ self._clear_all_updates = False
158
+ self._clear_updates_by_symbol.clear()
159
+ self._all_new_updates = 0
160
+ self._new_updates_by_symbol.clear()
161
+ if item['symbol'] not in self._new_updates_by_symbol:
162
+ self._new_updates_by_symbol[item['symbol']] = set()
163
+ if self._clear_updates_by_symbol.get(item['symbol']):
164
+ self._clear_updates_by_symbol[item['symbol']] = False
165
+ self._new_updates_by_symbol[item['symbol']].clear()
166
+ id_set = self._new_updates_by_symbol[item['symbol']]
167
+ before_length = len(id_set)
168
+ id_set.add(item['id'])
169
+ after_length = len(id_set)
170
+ self._all_new_updates = (self._all_new_updates or 0) + (after_length - before_length)
171
+
172
+
173
+ class ArrayCacheBySymbolBySide(ArrayCache):
174
+ def __init__(self, max_size=None):
175
+ super(ArrayCacheBySymbolBySide, self).__init__(max_size)
176
+ self._nested_new_updates_by_symbol = True
177
+ self.hashmap = {}
178
+ self._index = collections.deque([], max_size)
179
+
180
+ def append(self, item):
181
+ by_side = self.hashmap.setdefault(item['symbol'], {})
182
+ if item['side'] in by_side:
183
+ reference = by_side[item['side']]
184
+ if reference != item:
185
+ reference.update(item)
186
+ item = reference
187
+ index = self._index.index(item['side'])
188
+ del self._deque[index]
189
+ del self._index[index]
190
+ else:
191
+ by_side[item['side']] = item
192
+ if len(self._deque) == self._deque.maxlen:
193
+ delete_item = self._deque.popleft()
194
+ self._index.popleft()
195
+ del self.hashmap[delete_item['symbol']][delete_item['side']]
196
+ self._deque.append(item)
197
+ self._index.append(item['side'])
198
+ if self._clear_all_updates:
199
+ self._clear_all_updates = False
200
+ self._clear_updates_by_symbol.clear()
201
+ self._all_new_updates = 0
202
+ self._new_updates_by_symbol.clear()
203
+ if item['symbol'] not in self._new_updates_by_symbol:
204
+ self._new_updates_by_symbol[item['symbol']] = set()
205
+ if self._clear_updates_by_symbol.get(item['symbol']):
206
+ self._clear_updates_by_symbol[item['symbol']] = False
207
+ self._new_updates_by_symbol[item['symbol']].clear()
208
+ side_set = self._new_updates_by_symbol[item['symbol']]
209
+ before_length = len(side_set)
210
+ side_set.add(item['side'])
211
+ after_length = len(side_set)
212
+ self._all_new_updates = (self._all_new_updates or 0) + (after_length - before_length)
@@ -0,0 +1,193 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ from asyncio import sleep, ensure_future, wait_for, TimeoutError
4
+ from .functions import milliseconds, iso8601, deep_extend
5
+ from ccxt import NetworkError, RequestTimeout, NotSupported
6
+ from ccxt.async_support.base.ws.future import Future
7
+
8
+
9
+ class Client(object):
10
+
11
+ url = None
12
+ ws = None
13
+ futures = {}
14
+ options = {} # ws-specific options
15
+ subscriptions = {}
16
+ rejections = {}
17
+ on_message_callback = None
18
+ on_error_callback = None
19
+ on_close_callback = None
20
+ on_connected_callback = None
21
+ connectionStarted = None
22
+ connectionEstablished = None
23
+ isConnected = False
24
+ connectionTimeout = 10000 # ms, false to disable
25
+ connection = None
26
+ error = None # low-level networking exception, if any
27
+ connected = None # connection-related Future
28
+ keepAlive = 5000
29
+ heartbeat = True
30
+ maxPingPongMisses = 2.0 # how many missed pongs to raise a timeout
31
+ lastPong = None
32
+ ping = None # ping-function if defined
33
+ verbose = False # verbose output
34
+ gunzip = False
35
+ inflate = False
36
+ throttle = None
37
+ connecting = False
38
+ asyncio_loop = None
39
+ ping_looper = None
40
+ receive_looper = None
41
+
42
+ def __init__(self, url, on_message_callback, on_error_callback, on_close_callback, on_connected_callback, config={}):
43
+ defaults = {
44
+ 'url': url,
45
+ 'futures': {},
46
+ 'subscriptions': {},
47
+ 'rejections': {},
48
+ 'on_message_callback': on_message_callback,
49
+ 'on_error_callback': on_error_callback,
50
+ 'on_close_callback': on_close_callback,
51
+ 'on_connected_callback': on_connected_callback,
52
+ }
53
+ settings = {}
54
+ settings.update(defaults)
55
+ settings.update(config)
56
+ for key in settings:
57
+ if hasattr(self, key) and isinstance(getattr(self, key), dict):
58
+ setattr(self, key, deep_extend(getattr(self, key), settings[key]))
59
+ else:
60
+ setattr(self, key, settings[key])
61
+ # connection-related Future
62
+ self.connected = Future()
63
+
64
+ def future(self, message_hash):
65
+ if message_hash not in self.futures or self.futures[message_hash].cancelled():
66
+ self.futures[message_hash] = Future()
67
+ future = self.futures[message_hash]
68
+ if message_hash in self.rejections:
69
+ future.reject(self.rejections[message_hash])
70
+ del self.rejections[message_hash]
71
+ return future
72
+
73
+ def resolve(self, result, message_hash):
74
+ if self.verbose and message_hash is None:
75
+ self.log(iso8601(milliseconds()), 'resolve received None messageHash')
76
+ if message_hash in self.futures:
77
+ future = self.futures[message_hash]
78
+ future.resolve(result)
79
+ del self.futures[message_hash]
80
+ return result
81
+
82
+ def reject(self, result, message_hash=None):
83
+ if message_hash:
84
+ if message_hash in self.futures:
85
+ future = self.futures[message_hash]
86
+ future.reject(result)
87
+ del self.futures[message_hash]
88
+ else:
89
+ self.rejections[message_hash] = result
90
+ else:
91
+ message_hashes = list(self.futures.keys())
92
+ for message_hash in message_hashes:
93
+ self.reject(result, message_hash)
94
+ return result
95
+
96
+ async def receive_loop(self):
97
+ if self.verbose:
98
+ self.log(iso8601(milliseconds()), 'receive loop')
99
+ while not self.closed():
100
+ try:
101
+ message = await self.receive()
102
+ # self.log(iso8601(milliseconds()), 'received', message)
103
+ self.handle_message(message)
104
+ except Exception as e:
105
+ error = NetworkError(str(e))
106
+ if self.verbose:
107
+ self.log(iso8601(milliseconds()), 'receive_loop', 'Exception', error)
108
+ self.reset(error)
109
+
110
+ async def open(self, session, backoff_delay=0):
111
+ # exponential backoff for consequent connections if necessary
112
+ if backoff_delay:
113
+ await sleep(backoff_delay)
114
+ if self.verbose:
115
+ self.log(iso8601(milliseconds()), 'connecting to', self.url, 'with timeout', self.connectionTimeout, 'ms')
116
+ self.connectionStarted = milliseconds()
117
+ try:
118
+ coroutine = self.create_connection(session)
119
+ self.connection = await wait_for(coroutine, timeout=int(self.connectionTimeout / 1000))
120
+ self.connecting = False
121
+ self.connectionEstablished = milliseconds()
122
+ self.isConnected = True
123
+ if self.verbose:
124
+ self.log(iso8601(milliseconds()), 'connected')
125
+ self.connected.resolve(self.url)
126
+ self.on_connected_callback(self)
127
+ # run both loops forever
128
+ self.ping_looper = ensure_future(self.ping_loop(), loop=self.asyncio_loop)
129
+ self.receive_looper = ensure_future(self.receive_loop(), loop=self.asyncio_loop)
130
+ except TimeoutError:
131
+ # connection timeout
132
+ error = RequestTimeout('Connection timeout')
133
+ if self.verbose:
134
+ self.log(iso8601(milliseconds()), 'RequestTimeout', error)
135
+ self.on_error(error)
136
+ except Exception as e:
137
+ # connection failed or rejected (ConnectionRefusedError, ClientConnectorError)
138
+ error = NetworkError(e)
139
+ if self.verbose:
140
+ self.log(iso8601(milliseconds()), 'NetworkError', error)
141
+ self.on_error(error)
142
+
143
+ def connect(self, session, backoff_delay=0):
144
+ if not self.connection and not self.connecting:
145
+ self.connecting = True
146
+ ensure_future(self.open(session, backoff_delay), loop=self.asyncio_loop)
147
+ return self.connected
148
+
149
+ def on_error(self, error):
150
+ if self.verbose:
151
+ self.log(iso8601(milliseconds()), 'on_error', error)
152
+ self.error = error
153
+ self.reset(error)
154
+ self.on_error_callback(self, error)
155
+ if not self.closed():
156
+ ensure_future(self.close(1006), loop=self.asyncio_loop)
157
+
158
+ def on_close(self, code):
159
+ if self.verbose:
160
+ self.log(iso8601(milliseconds()), 'on_close', code)
161
+ if not self.error:
162
+ self.reset(NetworkError('Connection closed by remote server, closing code ' + str(code)))
163
+ self.on_close_callback(self, code)
164
+ if not self.closed():
165
+ ensure_future(self.close(code), loop=self.asyncio_loop)
166
+
167
+ def reset(self, error):
168
+ self.reject(error)
169
+
170
+ async def ping_loop(self):
171
+ if self.verbose:
172
+ self.log(iso8601(milliseconds()), 'ping loop')
173
+
174
+ def receive(self):
175
+ raise NotSupported('receive() not implemented')
176
+
177
+ def handle_message(self, message):
178
+ raise NotSupported('handle_message() not implemented')
179
+
180
+ def closed(self):
181
+ raise NotSupported('closed() not implemented')
182
+
183
+ async def send(self, message):
184
+ raise NotSupported('send() not implemented')
185
+
186
+ async def close(self, code=1000):
187
+ raise NotSupported('close() not implemented')
188
+
189
+ def create_connection(self, session):
190
+ raise NotSupported('create_connection() not implemented')
191
+
192
+ def log(self, *args):
193
+ print(*args)