ccxt-ir 4.3.46.0.3__py2.py3-none-any.whl → 4.5.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 (529) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +8 -8
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +8 -8
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +8 -8
  68. ccxt/async_support/afratether.py +10 -10
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +32 -38
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +32 -27
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +34 -30
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +15 -14
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +30 -36
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +29 -24
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +32 -28
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +13 -12
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.1.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/WHEEL +1 -1
  437. ccxt/__test__.py +0 -7
  438. ccxt/abstract/ace.py +0 -15
  439. ccxt/abstract/bitbay.py +0 -53
  440. ccxt/abstract/bitcoincom.py +0 -115
  441. ccxt/abstract/bitfinex2.py +0 -139
  442. ccxt/abstract/bitpanda.py +0 -35
  443. ccxt/abstract/bl3p.py +0 -19
  444. ccxt/abstract/coinlist.py +0 -54
  445. ccxt/abstract/currencycom.py +0 -68
  446. ccxt/abstract/hitbtc3.py +0 -115
  447. ccxt/abstract/idex.py +0 -26
  448. ccxt/abstract/kuna.py +0 -182
  449. ccxt/abstract/lykke.py +0 -29
  450. ccxt/abstract/poloniexfutures.py +0 -48
  451. ccxt/abstract/wazirx.py +0 -30
  452. ccxt/ace.py +0 -1012
  453. ccxt/async_support/ace.py +0 -1012
  454. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  455. ccxt/async_support/base/ws/fast_client.py +0 -96
  456. ccxt/async_support/bitbay.py +0 -17
  457. ccxt/async_support/bitcoincom.py +0 -17
  458. ccxt/async_support/bitfinex2.py +0 -3552
  459. ccxt/async_support/bitpanda.py +0 -16
  460. ccxt/async_support/bl3p.py +0 -485
  461. ccxt/async_support/coinlist.py +0 -2243
  462. ccxt/async_support/currencycom.py +0 -1950
  463. ccxt/async_support/hitbtc3.py +0 -16
  464. ccxt/async_support/idex.py +0 -1766
  465. ccxt/async_support/kuna.py +0 -1841
  466. ccxt/async_support/lykke.py +0 -1270
  467. ccxt/async_support/poloniexfutures.py +0 -1717
  468. ccxt/async_support/wazirx.py +0 -1224
  469. ccxt/bitbay.py +0 -17
  470. ccxt/bitcoincom.py +0 -17
  471. ccxt/bitfinex2.py +0 -3552
  472. ccxt/bitpanda.py +0 -16
  473. ccxt/bl3p.py +0 -485
  474. ccxt/coinlist.py +0 -2243
  475. ccxt/currencycom.py +0 -1950
  476. ccxt/hitbtc3.py +0 -16
  477. ccxt/idex.py +0 -1766
  478. ccxt/kuna.py +0 -1841
  479. ccxt/lykke.py +0 -1270
  480. ccxt/poloniexfutures.py +0 -1717
  481. ccxt/pro/bitcoincom.py +0 -34
  482. ccxt/pro/bitfinex2.py +0 -1083
  483. ccxt/pro/bitpanda.py +0 -15
  484. ccxt/pro/currencycom.py +0 -536
  485. ccxt/pro/idex.py +0 -672
  486. ccxt/pro/poloniexfutures.py +0 -990
  487. ccxt/pro/wazirx.py +0 -749
  488. ccxt/test/base/__init__.py +0 -29
  489. ccxt/test/base/test_account.py +0 -26
  490. ccxt/test/base/test_balance.py +0 -56
  491. ccxt/test/base/test_borrow_interest.py +0 -35
  492. ccxt/test/base/test_borrow_rate.py +0 -32
  493. ccxt/test/base/test_calculate_fee.py +0 -51
  494. ccxt/test/base/test_crypto.py +0 -127
  495. ccxt/test/base/test_currency.py +0 -76
  496. ccxt/test/base/test_datetime.py +0 -109
  497. ccxt/test/base/test_decimal_to_precision.py +0 -392
  498. ccxt/test/base/test_deep_extend.py +0 -68
  499. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  500. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  501. ccxt/test/base/test_funding_rate_history.py +0 -29
  502. ccxt/test/base/test_last_price.py +0 -31
  503. ccxt/test/base/test_ledger_entry.py +0 -45
  504. ccxt/test/base/test_ledger_item.py +0 -48
  505. ccxt/test/base/test_leverage_tier.py +0 -33
  506. ccxt/test/base/test_liquidation.py +0 -50
  507. ccxt/test/base/test_margin_mode.py +0 -24
  508. ccxt/test/base/test_margin_modification.py +0 -35
  509. ccxt/test/base/test_market.py +0 -193
  510. ccxt/test/base/test_number.py +0 -411
  511. ccxt/test/base/test_ohlcv.py +0 -33
  512. ccxt/test/base/test_open_interest.py +0 -32
  513. ccxt/test/base/test_order.py +0 -64
  514. ccxt/test/base/test_order_book.py +0 -69
  515. ccxt/test/base/test_position.py +0 -60
  516. ccxt/test/base/test_shared_methods.py +0 -353
  517. ccxt/test/base/test_status.py +0 -24
  518. ccxt/test/base/test_throttle.py +0 -126
  519. ccxt/test/base/test_ticker.py +0 -92
  520. ccxt/test/base/test_trade.py +0 -47
  521. ccxt/test/base/test_trading_fee.py +0 -26
  522. ccxt/test/base/test_transaction.py +0 -39
  523. ccxt/test/test_async.py +0 -1649
  524. ccxt/test/test_sync.py +0 -1648
  525. ccxt/wazirx.py +0 -1224
  526. ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
  527. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  528. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info/licenses}/LICENSE.txt +0 -0
  529. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.1.dist-info}/top_level.txt +0 -0
ccxt/pro/cex.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.base.types import Any, Balances, Bool, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
@@ -17,7 +17,7 @@ from ccxt.base.precise import Precise
17
17
 
18
18
  class cex(ccxt.async_support.cex):
19
19
 
20
- def describe(self):
20
+ def describe(self) -> Any:
21
21
  return self.deep_extend(super(cex, self).describe(), {
22
22
  'has': {
23
23
  'ws': True,
@@ -25,6 +25,7 @@ class cex(ccxt.async_support.cex):
25
25
  'watchTicker': True,
26
26
  'watchTickers': True,
27
27
  'watchTrades': True,
28
+ 'watchTradesForSymbols': False,
28
29
  'watchMyTrades': True,
29
30
  'watchOrders': True,
30
31
  'watchOrderBook': True,
@@ -61,7 +62,9 @@ class cex(ccxt.async_support.cex):
61
62
  async def watch_balance(self, params={}) -> Balances:
62
63
  """
63
64
  watch balance and get the amount of funds available for trading or funds locked in orders
64
- :see: https://cex.io/websocket-api#get-balance
65
+
66
+ https://cex.io/websocket-api#get-balance
67
+
65
68
  :param dict [params]: extra parameters specific to the exchange API endpoint
66
69
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
67
70
  """
@@ -118,7 +121,9 @@ class cex(ccxt.async_support.cex):
118
121
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
119
122
  """
120
123
  get the list of most recent trades for a particular symbol. Note: can only watch one symbol at a time.
121
- :see: https://cex.io/websocket-api#old-pair-room
124
+
125
+ https://cex.io/websocket-api#old-pair-room
126
+
122
127
  :param str symbol: unified symbol of the market to fetch trades for
123
128
  :param int [since]: timestamp in ms of the earliest trade to fetch
124
129
  :param int [limit]: the maximum amount of trades to fetch
@@ -235,7 +240,9 @@ class cex(ccxt.async_support.cex):
235
240
 
236
241
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
237
242
  """
238
- :see: https://cex.io/websocket-api#ticker-subscription
243
+
244
+ https://cex.io/websocket-api#ticker-subscription
245
+
239
246
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
240
247
  :param str symbol: unified symbol of the market to fetch the ticker for
241
248
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -270,7 +277,9 @@ class cex(ccxt.async_support.cex):
270
277
 
271
278
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
272
279
  """
273
- :see: https://cex.io/websocket-api#ticker-subscription
280
+
281
+ https://cex.io/websocket-api#ticker-subscription
282
+
274
283
  watches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
275
284
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
276
285
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -299,7 +308,9 @@ class cex(ccxt.async_support.cex):
299
308
 
300
309
  async def fetch_ticker_ws(self, symbol: str, params={}) -> Ticker:
301
310
  """
302
- :see: https://docs.cex.io/#ws-api-ticker-deprecated
311
+
312
+ https://docs.cex.io/#ws-api-ticker-deprecated
313
+
303
314
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
304
315
  :param str symbol: unified symbol of the market to fetch the ticker for
305
316
  :param dict [params]: extra parameters specific to the cex api endpoint
@@ -404,7 +415,9 @@ class cex(ccxt.async_support.cex):
404
415
 
405
416
  async def fetch_balance_ws(self, params={}) -> Balances:
406
417
  """
407
- :see: https://docs.cex.io/#ws-api-get-balance
418
+
419
+ https://docs.cex.io/#ws-api-get-balance
420
+
408
421
  query for balance and get the amount of funds available for trading or funds locked in orders
409
422
  :param dict [params]: extra parameters specific to the cex api endpoint
410
423
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
@@ -422,7 +435,9 @@ class cex(ccxt.async_support.cex):
422
435
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
423
436
  """
424
437
  get the list of orders associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods(~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
425
- :see: https://docs.cex.io/#ws-api-open-orders
438
+
439
+ https://docs.cex.io/#ws-api-open-orders
440
+
426
441
  :param str symbol: unified symbol of the market to fetch trades for
427
442
  :param int [since]: timestamp in ms of the earliest trade to fetch
428
443
  :param int [limit]: the maximum amount of trades to fetch
@@ -456,7 +471,9 @@ class cex(ccxt.async_support.cex):
456
471
  async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
457
472
  """
458
473
  get the list of trades associated with the user. Note: In CEX.IO system, orders can be present in trade engine or in archive database. There can be time periods(~2 seconds or more), when order is done/canceled, but still not moved to archive database. That means, you cannot see it using calls: archived-orders/open-orders.
459
- :see: https://docs.cex.io/#ws-api-open-orders
474
+
475
+ https://docs.cex.io/#ws-api-open-orders
476
+
460
477
  :param str symbol: unified symbol of the market to fetch trades for
461
478
  :param int [since]: timestamp in ms of the earliest trade to fetch
462
479
  :param int [limit]: the maximum amount of trades to fetch
@@ -640,7 +657,7 @@ class cex(ccxt.async_support.cex):
640
657
  # }
641
658
  # }
642
659
  # }
643
- # fullfilledOrder
660
+ # fulfilledOrder
644
661
  # {
645
662
  # "e": "order",
646
663
  # "data": {
@@ -868,7 +885,9 @@ class cex(ccxt.async_support.cex):
868
885
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
869
886
  """
870
887
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
871
- :see: https://cex.io/websocket-api#orderbook-subscribe
888
+
889
+ https://cex.io/websocket-api#orderbook-subscribe
890
+
872
891
  :param str symbol: unified symbol of the market to fetch the order book for
873
892
  :param int [limit]: the maximum amount of order book entries to return
874
893
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -961,7 +980,7 @@ class cex(ccxt.async_support.cex):
961
980
  # }
962
981
  #
963
982
  data = self.safe_value(message, 'data', {})
964
- incrementalId = self.safe_number(data, 'id')
983
+ incrementalId = self.safe_integer(data, 'id')
965
984
  pair = self.safe_string(data, 'pair', '')
966
985
  symbol = self.pair_to_symbol(pair)
967
986
  storedOrderBook = self.safe_value(self.orderbooks, symbol)
@@ -989,7 +1008,9 @@ class cex(ccxt.async_support.cex):
989
1008
 
990
1009
  async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
991
1010
  """
992
- :see: https://cex.io/websocket-api#minute-data
1011
+
1012
+ https://cex.io/websocket-api#minute-data
1013
+
993
1014
  watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. It will return the last 120 minutes with the selected timeframe and then 1m candle updates after that.
994
1015
  :param str symbol: unified symbol of the market to fetch OHLCV data for
995
1016
  :param str timeframe: the length of time each candle represents.
@@ -1128,7 +1149,10 @@ class cex(ccxt.async_support.cex):
1128
1149
  async def fetch_order_ws(self, id: str, symbol: Str = None, params={}):
1129
1150
  """
1130
1151
  fetches information on an order made by the user
1131
- :see: https://docs.cex.io/#ws-api-get-order
1152
+
1153
+ https://docs.cex.io/#ws-api-get-order
1154
+
1155
+ :param str id: the order id
1132
1156
  :param str symbol: not used by cex fetchOrder
1133
1157
  :param dict [params]: extra parameters specific to the cex api endpoint
1134
1158
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1153,7 +1177,9 @@ class cex(ccxt.async_support.cex):
1153
1177
 
1154
1178
  async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1155
1179
  """
1156
- :see: https://docs.cex.io/#ws-api-open-orders
1180
+
1181
+ https://docs.cex.io/#ws-api-open-orders
1182
+
1157
1183
  fetch all unfilled currently open orders
1158
1184
  :param str symbol: unified market symbol
1159
1185
  :param int [since]: the earliest time in ms to fetch open orders for
@@ -1162,7 +1188,7 @@ class cex(ccxt.async_support.cex):
1162
1188
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1163
1189
  """
1164
1190
  if symbol is None:
1165
- raise ArgumentsRequired(self.id + 'fetchOpenOrdersWs requires a symbol.')
1191
+ raise ArgumentsRequired(self.id + ' fetchOpenOrdersWs requires a symbol.')
1166
1192
  await self.load_markets()
1167
1193
  await self.authenticate()
1168
1194
  market = self.market(symbol)
@@ -1181,13 +1207,15 @@ class cex(ccxt.async_support.cex):
1181
1207
 
1182
1208
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
1183
1209
  """
1184
- :see: https://docs.cex.io/#ws-api-order-placement
1210
+
1211
+ https://docs.cex.io/#ws-api-order-placement
1212
+
1185
1213
  create a trade order
1186
1214
  :param str symbol: unified symbol of the market to create an order in
1187
1215
  :param str type: 'market' or 'limit'
1188
1216
  :param str side: 'buy' or 'sell'
1189
1217
  :param float amount: how much of currency you want to trade in units of base currency
1190
- :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1218
+ :param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1191
1219
  :param dict [params]: extra parameters specific to the kraken api endpoint
1192
1220
  :param boolean [params.maker_only]: Optional, maker only places an order only if offers best sell(<= max) or buy(>= max) price for self pair, if not order placement will be rejected with an error - "Order is not maker"
1193
1221
  :returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`
@@ -1216,13 +1244,15 @@ class cex(ccxt.async_support.cex):
1216
1244
  async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
1217
1245
  """
1218
1246
  edit a trade order
1219
- :see: https://docs.cex.io/#ws-api-cancel-replace
1247
+
1248
+ https://docs.cex.io/#ws-api-cancel-replace
1249
+
1220
1250
  :param str id: order id
1221
1251
  :param str symbol: unified symbol of the market to create an order in
1222
1252
  :param str type: 'market' or 'limit'
1223
1253
  :param str side: 'buy' or 'sell'
1224
1254
  :param float amount: how much of the currency you want to trade in units of the base currency
1225
- :param float|None [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1255
+ :param float|None [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1226
1256
  :param dict [params]: extra parameters specific to the cex api endpoint
1227
1257
  :returns dict: an `order structure <https://docs.ccxt.com/en/latest/manual.html#order-structure>`
1228
1258
  """
@@ -1252,7 +1282,9 @@ class cex(ccxt.async_support.cex):
1252
1282
 
1253
1283
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
1254
1284
  """
1255
- :see: https://docs.cex.io/#ws-api-order-cancel
1285
+
1286
+ https://docs.cex.io/#ws-api-order-cancel
1287
+
1256
1288
  cancels an open order
1257
1289
  :param str id: order id
1258
1290
  :param str symbol: not used by cex cancelOrder()
@@ -1280,7 +1312,9 @@ class cex(ccxt.async_support.cex):
1280
1312
  async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
1281
1313
  """
1282
1314
  cancel multiple orders
1283
- :see: https://docs.cex.io/#ws-api-mass-cancel-place
1315
+
1316
+ https://docs.cex.io/#ws-api-mass-cancel-place
1317
+
1284
1318
  :param str[] ids: order ids
1285
1319
  :param str symbol: not used by cex cancelOrders()
1286
1320
  :param dict [params]: extra parameters specific to the cex api endpoint
@@ -1344,7 +1378,7 @@ class cex(ccxt.async_support.cex):
1344
1378
  #
1345
1379
  return message
1346
1380
 
1347
- def handle_error_message(self, client: Client, message):
1381
+ def handle_error_message(self, client: Client, message) -> Bool:
1348
1382
  #
1349
1383
  # {
1350
1384
  # "e": "get-balance",
@@ -1366,6 +1400,7 @@ class cex(ccxt.async_support.cex):
1366
1400
  future = self.safe_value(client['futures'], messageHash)
1367
1401
  if future is not None:
1368
1402
  client.reject(error, messageHash)
1403
+ return True
1369
1404
  else:
1370
1405
  raise error
1371
1406
 
ccxt/pro/coinbase.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCacheBySymbolById
8
8
  import hashlib
9
- from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.base.types import Any, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import ArgumentsRequired
@@ -14,7 +14,7 @@ from ccxt.base.errors import ArgumentsRequired
14
14
 
15
15
  class coinbase(ccxt.async_support.coinbase):
16
16
 
17
- def describe(self):
17
+ def describe(self) -> Any:
18
18
  return self.deep_extend(super(coinbase, self).describe(), {
19
19
  'has': {
20
20
  'ws': True,
@@ -56,11 +56,14 @@ class coinbase(ccxt.async_support.coinbase):
56
56
 
57
57
  async def subscribe(self, name: str, isPrivate: bool, symbol=None, params={}):
58
58
  """
59
- * @ignore
59
+ @ignore
60
60
  subscribes to a websocket channel
61
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
61
+
62
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
63
+
62
64
  :param str name: the name of the channel
63
- :param string|str[] [symbol]: unified market symbol
65
+ :param boolean isPrivate: whether the channel is private or not
66
+ :param str [symbol]: unified market symbol
64
67
  :param dict [params]: extra parameters specific to the exchange API endpoint
65
68
  :returns dict: subscription to a websocket channel
66
69
  """
@@ -75,7 +78,7 @@ class coinbase(ccxt.async_support.coinbase):
75
78
  messageHash = messageHash + '::' + ','.join(symbol)
76
79
  elif symbol is not None:
77
80
  market = self.market(symbol)
78
- messageHash = name + '::' + market['id']
81
+ messageHash = name + '::' + symbol
79
82
  productIds = [market['id']]
80
83
  url = self.urls['api']['ws']
81
84
  subscribe = {
@@ -92,10 +95,13 @@ class coinbase(ccxt.async_support.coinbase):
92
95
 
93
96
  async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
94
97
  """
95
- * @ignore
98
+ @ignore
96
99
  subscribes to a websocket channel
97
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
100
+
101
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
102
+
98
103
  :param str name: the name of the channel
104
+ :param boolean isPrivate: whether the channel is private or not
99
105
  :param str[] [symbols]: unified market symbol
100
106
  :param dict [params]: extra parameters specific to the exchange API endpoint
101
107
  :returns dict: subscription to a websocket channel
@@ -109,7 +115,7 @@ class coinbase(ccxt.async_support.coinbase):
109
115
  market = self.market(symbol)
110
116
  marketId = market['id']
111
117
  productIds.append(marketId)
112
- messageHashes.append(name + '::' + marketId)
118
+ messageHashes.append(name + '::' + symbol)
113
119
  url = self.urls['api']['ws']
114
120
  subscribe = {
115
121
  'type': 'subscribe',
@@ -147,27 +153,36 @@ class coinbase(ccxt.async_support.coinbase):
147
153
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
148
154
  """
149
155
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
150
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-channel
156
+
157
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-channel
158
+
151
159
  :param str [symbol]: unified symbol of the market to fetch the ticker for
152
160
  :param dict [params]: extra parameters specific to the exchange API endpoint
153
161
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
154
162
  """
163
+ await self.load_markets()
155
164
  name = 'ticker'
156
165
  return await self.subscribe(name, False, symbol, params)
157
166
 
158
167
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
159
168
  """
160
169
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
161
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
170
+
171
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
172
+
162
173
  :param str[] [symbols]: unified symbol of the market to fetch the ticker for
163
174
  :param dict [params]: extra parameters specific to the exchange API endpoint
164
175
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
165
176
  """
177
+ await self.load_markets()
166
178
  if symbols is None:
167
179
  symbols = self.symbols
168
180
  name = 'ticker_batch'
169
- tickers = await self.subscribe(name, False, symbols, params)
181
+ ticker = await self.subscribe_multiple(name, False, symbols, params)
170
182
  if self.newUpdates:
183
+ tickers = {}
184
+ symbol = ticker['symbol']
185
+ tickers[symbol] = ticker
171
186
  return tickers
172
187
  return self.tickers
173
188
 
@@ -262,7 +277,7 @@ class coinbase(ccxt.async_support.coinbase):
262
277
  #
263
278
  #
264
279
  channel = self.safe_string(message, 'channel')
265
- events = self.safe_value(message, 'events', [])
280
+ events = self.safe_list(message, 'events', [])
266
281
  datetime = self.safe_string(message, 'timestamp')
267
282
  timestamp = self.parse8601(datetime)
268
283
  newTickers = []
@@ -271,31 +286,18 @@ class coinbase(ccxt.async_support.coinbase):
271
286
  tickers = self.safe_list(tickersObj, 'tickers', [])
272
287
  for j in range(0, len(tickers)):
273
288
  ticker = tickers[j]
289
+ wsMarketId = self.safe_string(ticker, 'product_id')
290
+ if wsMarketId is None:
291
+ continue
274
292
  result = self.parse_ws_ticker(ticker)
275
293
  result['timestamp'] = timestamp
276
294
  result['datetime'] = datetime
277
295
  symbol = result['symbol']
278
296
  self.tickers[symbol] = result
279
- wsMarketId = self.safe_string(ticker, 'product_id')
280
- if wsMarketId is None:
281
- continue
282
- messageHash = channel + '::' + wsMarketId
283
297
  newTickers.append(result)
298
+ messageHash = channel + '::' + symbol
284
299
  client.resolve(result, messageHash)
285
- if messageHash.endswith('USD'):
286
- client.resolve(result, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
287
- messageHashes = self.find_message_hashes(client, 'ticker_batch::')
288
- for i in range(0, len(messageHashes)):
289
- messageHash = messageHashes[i]
290
- parts = messageHash.split('::')
291
- symbolsString = parts[1]
292
- symbols = symbolsString.split(',')
293
- tickers = self.filter_by_array(newTickers, 'symbol', symbols)
294
- if not self.is_empty(tickers):
295
- client.resolve(tickers, messageHash)
296
- if messageHash.endswith('USD'):
297
- client.resolve(tickers, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
298
- return message
300
+ self.try_resolve_usdc(client, messageHash, result)
299
301
 
300
302
  def parse_ws_ticker(self, ticker, market=None):
301
303
  #
@@ -345,7 +347,9 @@ class coinbase(ccxt.async_support.coinbase):
345
347
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
346
348
  """
347
349
  get the list of most recent trades for a particular symbol
348
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
350
+
351
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
352
+
349
353
  :param str symbol: unified symbol of the market to fetch trades for
350
354
  :param int [since]: timestamp in ms of the earliest trade to fetch
351
355
  :param int [limit]: the maximum amount of trades to fetch
@@ -363,7 +367,9 @@ class coinbase(ccxt.async_support.coinbase):
363
367
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
364
368
  """
365
369
  get the list of most recent trades for a particular symbol
366
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
370
+
371
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
372
+
367
373
  :param str[] symbols: unified symbol of the market to fetch trades for
368
374
  :param int [since]: timestamp in ms of the earliest trade to fetch
369
375
  :param int [limit]: the maximum amount of trades to fetch
@@ -382,7 +388,9 @@ class coinbase(ccxt.async_support.coinbase):
382
388
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
383
389
  """
384
390
  watches information on multiple orders made by the user
385
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
391
+
392
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
393
+
386
394
  :param str [symbol]: unified market symbol of the market orders were made in
387
395
  :param int [since]: the earliest time in ms to fetch orders for
388
396
  :param int [limit]: the maximum number of order structures to retrieve
@@ -399,7 +407,9 @@ class coinbase(ccxt.async_support.coinbase):
399
407
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
400
408
  """
401
409
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
402
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
410
+
411
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
412
+
403
413
  :param str symbol: unified symbol of the market to fetch the order book for
404
414
  :param int [limit]: the maximum amount of order book entries to return
405
415
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -415,7 +425,9 @@ class coinbase(ccxt.async_support.coinbase):
415
425
  async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
416
426
  """
417
427
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
418
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
428
+
429
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
430
+
419
431
  :param str[] symbols: unified array of symbols
420
432
  :param int [limit]: the maximum amount of order book entries to return
421
433
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -450,13 +462,13 @@ class coinbase(ccxt.async_support.coinbase):
450
462
  # ]
451
463
  # }
452
464
  #
453
- events = self.safe_value(message, 'events')
465
+ events = self.safe_list(message, 'events')
454
466
  event = self.safe_value(events, 0)
455
- trades = self.safe_value(event, 'trades')
456
- trade = self.safe_value(trades, 0)
467
+ trades = self.safe_list(event, 'trades')
468
+ trade = self.safe_dict(trades, 0)
457
469
  marketId = self.safe_string(trade, 'product_id')
458
- messageHash = 'market_trades::' + marketId
459
470
  symbol = self.safe_symbol(marketId)
471
+ messageHash = 'market_trades::' + symbol
460
472
  tradesArray = self.safe_value(self.trades, symbol)
461
473
  if tradesArray is None:
462
474
  tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
@@ -464,14 +476,12 @@ class coinbase(ccxt.async_support.coinbase):
464
476
  self.trades[symbol] = tradesArray
465
477
  for i in range(0, len(events)):
466
478
  currentEvent = events[i]
467
- currentTrades = self.safe_value(currentEvent, 'trades')
479
+ currentTrades = self.safe_list(currentEvent, 'trades')
468
480
  for j in range(0, len(currentTrades)):
469
481
  item = currentTrades[i]
470
482
  tradesArray.append(self.parse_trade(item))
471
483
  client.resolve(tradesArray, messageHash)
472
- if marketId.endswith('USD'):
473
- client.resolve(tradesArray, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
474
- return message
484
+ self.try_resolve_usdc(client, messageHash, tradesArray)
475
485
 
476
486
  def handle_order(self, client, message):
477
487
  #
@@ -502,14 +512,14 @@ class coinbase(ccxt.async_support.coinbase):
502
512
  # ]
503
513
  # }
504
514
  #
505
- events = self.safe_value(message, 'events')
515
+ events = self.safe_list(message, 'events')
506
516
  marketIds = []
507
517
  if self.orders is None:
508
518
  limit = self.safe_integer(self.options, 'ordersLimit', 1000)
509
519
  self.orders = ArrayCacheBySymbolById(limit)
510
520
  for i in range(0, len(events)):
511
521
  event = events[i]
512
- responseOrders = self.safe_value(event, 'orders')
522
+ responseOrders = self.safe_list(event, 'orders')
513
523
  for j in range(0, len(responseOrders)):
514
524
  responseOrder = responseOrders[j]
515
525
  parsed = self.parse_ws_order(responseOrder)
@@ -520,12 +530,11 @@ class coinbase(ccxt.async_support.coinbase):
520
530
  cachedOrders.append(parsed)
521
531
  for i in range(0, len(marketIds)):
522
532
  marketId = marketIds[i]
523
- messageHash = 'user::' + marketId
533
+ symbol = self.safe_symbol(marketId)
534
+ messageHash = 'user::' + symbol
524
535
  client.resolve(self.orders, messageHash)
525
- if messageHash.endswith('USD'):
526
- client.resolve(self.orders, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
536
+ self.try_resolve_usdc(client, messageHash, self.orders)
527
537
  client.resolve(self.orders, 'user')
528
- return message
529
538
 
530
539
  def parse_ws_order(self, order, market=None):
531
540
  #
@@ -601,7 +610,7 @@ class coinbase(ccxt.async_support.coinbase):
601
610
  # {
602
611
  # "side": "bid",
603
612
  # "event_time": "1970-01-01T00:00:00Z",
604
- # "price_level": "21921.73",
613
+ # "price_level": "21921.74",
605
614
  # "new_quantity": "0.06317902"
606
615
  # },
607
616
  # {
@@ -615,36 +624,35 @@ class coinbase(ccxt.async_support.coinbase):
615
624
  # ]
616
625
  # }
617
626
  #
618
- events = self.safe_value(message, 'events')
627
+ events = self.safe_list(message, 'events')
619
628
  datetime = self.safe_string(message, 'timestamp')
620
629
  for i in range(0, len(events)):
621
630
  event = events[i]
622
- updates = self.safe_value(event, 'updates', [])
631
+ updates = self.safe_list(event, 'updates', [])
623
632
  marketId = self.safe_string(event, 'product_id')
624
- messageHash = 'level2::' + marketId
633
+ # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD, are aliases
634
+ market = self.safe_market(marketId)
635
+ symbol = market['symbol']
636
+ messageHash = 'level2::' + symbol
625
637
  subscription = self.safe_value(client.subscriptions, messageHash, {})
626
638
  limit = self.safe_integer(subscription, 'limit')
627
- symbol = self.safe_symbol(marketId)
628
639
  type = self.safe_string(event, 'type')
629
640
  if type == 'snapshot':
630
641
  self.orderbooks[symbol] = self.order_book({}, limit)
631
- orderbook = self.orderbooks[symbol]
632
- self.handle_order_book_helper(orderbook, updates)
633
- orderbook['timestamp'] = self.parse8601(datetime)
634
- orderbook['datetime'] = datetime
635
- orderbook['symbol'] = symbol
636
- client.resolve(orderbook, messageHash)
637
- if messageHash.endswith('USD'):
638
- client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
639
- elif type == 'update':
640
- orderbook = self.orderbooks[symbol]
641
- self.handle_order_book_helper(orderbook, updates)
642
- orderbook['datetime'] = datetime
643
- orderbook['timestamp'] = self.parse8601(datetime)
644
- orderbook['symbol'] = symbol
645
- client.resolve(orderbook, messageHash)
646
- if messageHash.endswith('USD'):
647
- client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
642
+ # unknown bug, can't reproduce, but sometimes orderbook is None
643
+ if not (symbol in self.orderbooks) and self.orderbooks[symbol] is None:
644
+ continue
645
+ orderbook = self.orderbooks[symbol]
646
+ self.handle_order_book_helper(orderbook, updates)
647
+ orderbook['timestamp'] = self.parse8601(datetime)
648
+ orderbook['datetime'] = datetime
649
+ orderbook['symbol'] = symbol
650
+ client.resolve(orderbook, messageHash)
651
+ self.try_resolve_usdc(client, messageHash, orderbook)
652
+
653
+ def try_resolve_usdc(self, client, messageHash, result):
654
+ if messageHash.endswith('/USD') or messageHash.endswith('-USD'):
655
+ client.resolve(result, messageHash + 'C') # when subscribing to BTC/USDC and coinbase returns BTC/USD, so resolve USDC too
648
656
 
649
657
  def handle_subscription_status(self, client, message):
650
658
  #
@@ -660,6 +668,25 @@ class coinbase(ccxt.async_support.coinbase):
660
668
  #
661
669
  return message
662
670
 
671
+ def handle_heartbeats(self, client, message):
672
+ # although the subscription takes a product_ids parameter(i.e. symbol),
673
+ # there is no(clear) way of mapping the message back to the symbol.
674
+ #
675
+ # {
676
+ # "channel": "heartbeats",
677
+ # "client_id": "",
678
+ # "timestamp": "2023-06-23T20:31:26.122969572Z",
679
+ # "sequence_num": 0,
680
+ # "events": [
681
+ # {
682
+ # "current_time": "2023-06-23 20:31:56.121961769 +0000 UTC m=+91717.525857105",
683
+ # "heartbeat_counter": "3049"
684
+ # }
685
+ # ]
686
+ # }
687
+ #
688
+ return message
689
+
663
690
  def handle_message(self, client, message):
664
691
  channel = self.safe_string(message, 'channel')
665
692
  methods: dict = {
@@ -669,10 +696,12 @@ class coinbase(ccxt.async_support.coinbase):
669
696
  'market_trades': self.handle_trade,
670
697
  'user': self.handle_order,
671
698
  'l2_data': self.handle_order_book,
699
+ 'heartbeats': self.handle_heartbeats,
672
700
  }
673
701
  type = self.safe_string(message, 'type')
674
702
  if type == 'error':
675
703
  errorMessage = self.safe_string(message, 'message')
676
704
  raise ExchangeError(errorMessage)
677
705
  method = self.safe_value(methods, channel)
678
- method(client, message)
706
+ if method:
707
+ method(client, message)
@@ -4,11 +4,12 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  from ccxt.pro.coinbase import coinbase
7
+ from ccxt.base.types import Any
7
8
 
8
9
 
9
10
  class coinbaseadvanced(coinbase):
10
11
 
11
- def describe(self):
12
+ def describe(self) -> Any:
12
13
  return self.deep_extend(super(coinbaseadvanced, self).describe(), {
13
14
  'id': 'coinbaseadvanced',
14
15
  'name': 'Coinbase Advanced',