ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__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 (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3205 -937
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1525 -573
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +223 -97
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3205 -937
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1525 -573
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +223 -97
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +143 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/top_level.txt +0 -0
ccxt/pro/coinbase.py CHANGED
@@ -9,6 +9,7 @@ import hashlib
9
9
  from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import ArgumentsRequired
12
13
 
13
14
 
14
15
  class coinbase(ccxt.async_support.coinbase):
@@ -30,10 +31,12 @@ class coinbase(ccxt.async_support.coinbase):
30
31
  'watchMyTrades': False,
31
32
  'watchOHLCV': False,
32
33
  'watchOrderBook': True,
34
+ 'watchOrderBookForSymbols': True,
33
35
  'watchOrders': True,
34
36
  'watchTicker': True,
35
37
  'watchTickers': True,
36
38
  'watchTrades': True,
39
+ 'watchTradesForSymbols': True,
37
40
  },
38
41
  'urls': {
39
42
  'api': {
@@ -51,18 +54,20 @@ class coinbase(ccxt.async_support.coinbase):
51
54
  },
52
55
  })
53
56
 
54
- async def subscribe(self, name, symbol=None, params={}):
57
+ async def subscribe(self, name: str, isPrivate: bool, symbol=None, params={}):
55
58
  """
56
- * @ignore
59
+ @ignore
57
60
  subscribes to a websocket channel
58
- :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
+
59
64
  :param str name: the name of the channel
60
- :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
61
67
  :param dict [params]: extra parameters specific to the exchange API endpoint
62
68
  :returns dict: subscription to a websocket channel
63
69
  """
64
70
  await self.load_markets()
65
- self.check_required_credentials()
66
71
  market = None
67
72
  messageHash = name
68
73
  productIds = []
@@ -76,33 +81,94 @@ class coinbase(ccxt.async_support.coinbase):
76
81
  messageHash = name + '::' + market['id']
77
82
  productIds = [market['id']]
78
83
  url = self.urls['api']['ws']
79
- timestamp = self.number_to_string(self.seconds())
80
- auth = timestamp + name + ','.join(productIds)
81
84
  subscribe = {
82
85
  'type': 'subscribe',
83
86
  'product_ids': productIds,
84
87
  'channel': name,
85
- 'api_key': self.apiKey,
86
- 'timestamp': timestamp,
87
- 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
88
+ # 'api_key': self.apiKey,
89
+ # 'timestamp': timestamp,
90
+ # 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
88
91
  }
92
+ if isPrivate:
93
+ subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
89
94
  return await self.watch(url, messageHash, subscribe, messageHash)
90
95
 
96
+ async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
97
+ """
98
+ @ignore
99
+ subscribes to a websocket channel
100
+
101
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
102
+
103
+ :param str name: the name of the channel
104
+ :param boolean isPrivate: whether the channel is private or not
105
+ :param str[] [symbols]: unified market symbol
106
+ :param dict [params]: extra parameters specific to the exchange API endpoint
107
+ :returns dict: subscription to a websocket channel
108
+ """
109
+ await self.load_markets()
110
+ productIds = []
111
+ messageHashes = []
112
+ symbols = self.market_symbols(symbols, None, False)
113
+ for i in range(0, len(symbols)):
114
+ symbol = symbols[i]
115
+ market = self.market(symbol)
116
+ marketId = market['id']
117
+ productIds.append(marketId)
118
+ messageHashes.append(name + '::' + marketId)
119
+ url = self.urls['api']['ws']
120
+ subscribe = {
121
+ 'type': 'subscribe',
122
+ 'product_ids': productIds,
123
+ 'channel': name,
124
+ }
125
+ if isPrivate:
126
+ subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
127
+ return await self.watch_multiple(url, messageHashes, subscribe, messageHashes)
128
+
129
+ def create_ws_auth(self, name: str, productIds: List[str]):
130
+ subscribe: dict = {}
131
+ timestamp = self.number_to_string(self.seconds())
132
+ self.check_required_credentials()
133
+ isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
134
+ auth = timestamp + name + ','.join(productIds)
135
+ if not isCloudAPiKey:
136
+ subscribe['api_key'] = self.apiKey
137
+ subscribe['timestamp'] = timestamp
138
+ subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
139
+ else:
140
+ if self.apiKey.startswith('-----BEGIN'):
141
+ raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
142
+ currentToken = self.safe_string(self.options, 'wsToken')
143
+ tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
144
+ seconds = self.seconds()
145
+ if currentToken is None or tokenTimestamp + 120 < seconds:
146
+ # we should generate new token
147
+ token = self.create_auth_token(seconds)
148
+ self.options['wsToken'] = token
149
+ self.options['wsTokenTimestamp'] = seconds
150
+ subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
151
+ return subscribe
152
+
91
153
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
92
154
  """
93
155
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
94
- :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
+
95
159
  :param str [symbol]: unified symbol of the market to fetch the ticker for
96
160
  :param dict [params]: extra parameters specific to the exchange API endpoint
97
161
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
98
162
  """
99
163
  name = 'ticker'
100
- return await self.subscribe(name, symbol, params)
164
+ return await self.subscribe(name, False, symbol, params)
101
165
 
102
166
  async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
103
167
  """
104
168
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
105
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
169
+
170
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
171
+
106
172
  :param str[] [symbols]: unified symbol of the market to fetch the ticker for
107
173
  :param dict [params]: extra parameters specific to the exchange API endpoint
108
174
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -110,7 +176,7 @@ class coinbase(ccxt.async_support.coinbase):
110
176
  if symbols is None:
111
177
  symbols = self.symbols
112
178
  name = 'ticker_batch'
113
- tickers = await self.subscribe(name, symbols, params)
179
+ tickers = await self.subscribe(name, False, symbols, params)
114
180
  if self.newUpdates:
115
181
  return tickers
116
182
  return self.tickers
@@ -136,6 +202,11 @@ class coinbase(ccxt.async_support.coinbase):
136
202
  # "low_52_w": "15460",
137
203
  # "high_52_w": "48240",
138
204
  # "price_percent_chg_24_h": "-4.15775596190603"
205
+ # new 2024-04-12
206
+ # "best_bid":"21835.29",
207
+ # "best_bid_quantity": "0.02000000",
208
+ # "best_ask":"23011.18",
209
+ # "best_ask_quantity": "0.01500000"
139
210
  # }
140
211
  # ]
141
212
  # }
@@ -161,27 +232,68 @@ class coinbase(ccxt.async_support.coinbase):
161
232
  # "low_52_w": "0.04908",
162
233
  # "high_52_w": "0.1801",
163
234
  # "price_percent_chg_24_h": "0.50177456859626"
235
+ # new 2024-04-12
236
+ # "best_bid":"0.07989",
237
+ # "best_bid_quantity": "500.0",
238
+ # "best_ask":"0.08308",
239
+ # "best_ask_quantity": "300.0"
240
+ # }
241
+ # ]
242
+ # }
243
+ # ]
244
+ # }
245
+ #
246
+ # note! seems coinbase might also send empty data like:
247
+ #
248
+ # {
249
+ # "channel": "ticker_batch",
250
+ # "client_id": "",
251
+ # "timestamp": "2024-05-24T18:22:24.546809523Z",
252
+ # "sequence_num": 1,
253
+ # "events": [
254
+ # {
255
+ # "type": "snapshot",
256
+ # "tickers": [
257
+ # {
258
+ # "type": "ticker",
259
+ # "product_id": "",
260
+ # "price": "",
261
+ # "volume_24_h": "",
262
+ # "low_24_h": "",
263
+ # "high_24_h": "",
264
+ # "low_52_w": "",
265
+ # "high_52_w": "",
266
+ # "price_percent_chg_24_h": ""
164
267
  # }
165
268
  # ]
166
269
  # }
167
270
  # ]
168
271
  # }
169
272
  #
273
+ #
170
274
  channel = self.safe_string(message, 'channel')
171
275
  events = self.safe_value(message, 'events', [])
276
+ datetime = self.safe_string(message, 'timestamp')
277
+ timestamp = self.parse8601(datetime)
172
278
  newTickers = []
173
279
  for i in range(0, len(events)):
174
280
  tickersObj = events[i]
175
- tickers = self.safe_value(tickersObj, 'tickers', [])
281
+ tickers = self.safe_list(tickersObj, 'tickers', [])
176
282
  for j in range(0, len(tickers)):
177
283
  ticker = tickers[j]
178
284
  result = self.parse_ws_ticker(ticker)
285
+ result['timestamp'] = timestamp
286
+ result['datetime'] = datetime
179
287
  symbol = result['symbol']
180
288
  self.tickers[symbol] = result
181
289
  wsMarketId = self.safe_string(ticker, 'product_id')
290
+ if wsMarketId is None:
291
+ continue
182
292
  messageHash = channel + '::' + wsMarketId
183
293
  newTickers.append(result)
184
294
  client.resolve(result, messageHash)
295
+ if messageHash.endswith('USD'):
296
+ client.resolve(result, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
185
297
  messageHashes = self.find_message_hashes(client, 'ticker_batch::')
186
298
  for i in range(0, len(messageHashes)):
187
299
  messageHash = messageHashes[i]
@@ -191,6 +303,8 @@ class coinbase(ccxt.async_support.coinbase):
191
303
  tickers = self.filter_by_array(newTickers, 'symbol', symbols)
192
304
  if not self.is_empty(tickers):
193
305
  client.resolve(tickers, messageHash)
306
+ if messageHash.endswith('USD'):
307
+ client.resolve(tickers, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
194
308
  return message
195
309
 
196
310
  def parse_ws_ticker(self, ticker, market=None):
@@ -205,6 +319,11 @@ class coinbase(ccxt.async_support.coinbase):
205
319
  # "low_52_w": "0.04908",
206
320
  # "high_52_w": "0.1801",
207
321
  # "price_percent_chg_24_h": "0.50177456859626"
322
+ # new 2024-04-12
323
+ # "best_bid":"0.07989",
324
+ # "best_bid_quantity": "500.0",
325
+ # "best_ask":"0.08308",
326
+ # "best_ask_quantity": "300.0"
208
327
  # }
209
328
  #
210
329
  marketId = self.safe_string(ticker, 'product_id')
@@ -217,10 +336,10 @@ class coinbase(ccxt.async_support.coinbase):
217
336
  'datetime': self.iso8601(timestamp),
218
337
  'high': self.safe_string(ticker, 'high_24_h'),
219
338
  'low': self.safe_string(ticker, 'low_24_h'),
220
- 'bid': None,
221
- 'bidVolume': None,
222
- 'ask': None,
223
- 'askVolume': None,
339
+ 'bid': self.safe_string(ticker, 'best_bid'),
340
+ 'bidVolume': self.safe_string(ticker, 'best_bid_quantity'),
341
+ 'ask': self.safe_string(ticker, 'best_ask'),
342
+ 'askVolume': self.safe_string(ticker, 'best_ask_quantity'),
224
343
  'vwap': None,
225
344
  'open': None,
226
345
  'close': last,
@@ -236,7 +355,9 @@ class coinbase(ccxt.async_support.coinbase):
236
355
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
237
356
  """
238
357
  get the list of most recent trades for a particular symbol
239
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
358
+
359
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
360
+
240
361
  :param str symbol: unified symbol of the market to fetch trades for
241
362
  :param int [since]: timestamp in ms of the earliest trade to fetch
242
363
  :param int [limit]: the maximum amount of trades to fetch
@@ -246,15 +367,38 @@ class coinbase(ccxt.async_support.coinbase):
246
367
  await self.load_markets()
247
368
  symbol = self.symbol(symbol)
248
369
  name = 'market_trades'
249
- trades = await self.subscribe(name, symbol, params)
370
+ trades = await self.subscribe(name, False, symbol, params)
250
371
  if self.newUpdates:
251
372
  limit = trades.getLimit(symbol, limit)
252
373
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
253
374
 
375
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
376
+ """
377
+ get the list of most recent trades for a particular symbol
378
+
379
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
380
+
381
+ :param str[] symbols: unified symbol of the market to fetch trades for
382
+ :param int [since]: timestamp in ms of the earliest trade to fetch
383
+ :param int [limit]: the maximum amount of trades to fetch
384
+ :param dict [params]: extra parameters specific to the exchange API endpoint
385
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
386
+ """
387
+ await self.load_markets()
388
+ name = 'market_trades'
389
+ trades = await self.subscribe_multiple(name, False, symbols, params)
390
+ if self.newUpdates:
391
+ first = self.safe_dict(trades, 0)
392
+ tradeSymbol = self.safe_string(first, 'symbol')
393
+ limit = trades.getLimit(tradeSymbol, limit)
394
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
395
+
254
396
  async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
255
397
  """
256
398
  watches information on multiple orders made by the user
257
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
399
+
400
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
401
+
258
402
  :param str [symbol]: unified market symbol of the market orders were made in
259
403
  :param int [since]: the earliest time in ms to fetch orders for
260
404
  :param int [limit]: the maximum number of order structures to retrieve
@@ -263,7 +407,7 @@ class coinbase(ccxt.async_support.coinbase):
263
407
  """
264
408
  await self.load_markets()
265
409
  name = 'user'
266
- orders = await self.subscribe(name, symbol, params)
410
+ orders = await self.subscribe(name, True, symbol, params)
267
411
  if self.newUpdates:
268
412
  limit = orders.getLimit(symbol, limit)
269
413
  return self.filter_by_since_limit(orders, since, limit, 'timestamp', True)
@@ -271,7 +415,9 @@ class coinbase(ccxt.async_support.coinbase):
271
415
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
272
416
  """
273
417
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
274
- :see: https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
418
+
419
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
420
+
275
421
  :param str symbol: unified symbol of the market to fetch the order book for
276
422
  :param int [limit]: the maximum amount of order book entries to return
277
423
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -281,7 +427,23 @@ class coinbase(ccxt.async_support.coinbase):
281
427
  name = 'level2'
282
428
  market = self.market(symbol)
283
429
  symbol = market['symbol']
284
- orderbook = await self.subscribe(name, symbol, params)
430
+ orderbook = await self.subscribe(name, False, symbol, params)
431
+ return orderbook.limit()
432
+
433
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
434
+ """
435
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
436
+
437
+ https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
438
+
439
+ :param str[] symbols: unified array of symbols
440
+ :param int [limit]: the maximum amount of order book entries to return
441
+ :param dict [params]: extra parameters specific to the exchange API endpoint
442
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
443
+ """
444
+ await self.load_markets()
445
+ name = 'level2'
446
+ orderbook = await self.subscribe_multiple(name, False, symbols, params)
285
447
  return orderbook.limit()
286
448
 
287
449
  def handle_trade(self, client, message):
@@ -327,6 +489,8 @@ class coinbase(ccxt.async_support.coinbase):
327
489
  item = currentTrades[i]
328
490
  tradesArray.append(self.parse_trade(item))
329
491
  client.resolve(tradesArray, messageHash)
492
+ if marketId.endswith('USD'):
493
+ client.resolve(tradesArray, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
330
494
  return message
331
495
 
332
496
  def handle_order(self, client, message):
@@ -378,6 +542,8 @@ class coinbase(ccxt.async_support.coinbase):
378
542
  marketId = marketIds[i]
379
543
  messageHash = 'user::' + marketId
380
544
  client.resolve(self.orders, messageHash)
545
+ if messageHash.endswith('USD'):
546
+ client.resolve(self.orders, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
381
547
  client.resolve(self.orders, 'user')
382
548
  return message
383
549
 
@@ -484,10 +650,12 @@ class coinbase(ccxt.async_support.coinbase):
484
650
  self.orderbooks[symbol] = self.order_book({}, limit)
485
651
  orderbook = self.orderbooks[symbol]
486
652
  self.handle_order_book_helper(orderbook, updates)
487
- orderbook['timestamp'] = None
488
- orderbook['datetime'] = None
653
+ orderbook['timestamp'] = self.parse8601(datetime)
654
+ orderbook['datetime'] = datetime
489
655
  orderbook['symbol'] = symbol
490
656
  client.resolve(orderbook, messageHash)
657
+ if messageHash.endswith('USD'):
658
+ client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
491
659
  elif type == 'update':
492
660
  orderbook = self.orderbooks[symbol]
493
661
  self.handle_order_book_helper(orderbook, updates)
@@ -495,7 +663,8 @@ class coinbase(ccxt.async_support.coinbase):
495
663
  orderbook['timestamp'] = self.parse8601(datetime)
496
664
  orderbook['symbol'] = symbol
497
665
  client.resolve(orderbook, messageHash)
498
- return message
666
+ if messageHash.endswith('USD'):
667
+ client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
499
668
 
500
669
  def handle_subscription_status(self, client, message):
501
670
  #
@@ -511,19 +680,40 @@ class coinbase(ccxt.async_support.coinbase):
511
680
  #
512
681
  return message
513
682
 
683
+ def handle_heartbeats(self, client, message):
684
+ # although the subscription takes a product_ids parameter(i.e. symbol),
685
+ # there is no(clear) way of mapping the message back to the symbol.
686
+ #
687
+ # {
688
+ # "channel": "heartbeats",
689
+ # "client_id": "",
690
+ # "timestamp": "2023-06-23T20:31:26.122969572Z",
691
+ # "sequence_num": 0,
692
+ # "events": [
693
+ # {
694
+ # "current_time": "2023-06-23 20:31:56.121961769 +0000 UTC m=+91717.525857105",
695
+ # "heartbeat_counter": "3049"
696
+ # }
697
+ # ]
698
+ # }
699
+ #
700
+ return message
701
+
514
702
  def handle_message(self, client, message):
515
703
  channel = self.safe_string(message, 'channel')
516
- methods = {
704
+ methods: dict = {
517
705
  'subscriptions': self.handle_subscription_status,
518
706
  'ticker': self.handle_tickers,
519
707
  'ticker_batch': self.handle_tickers,
520
708
  'market_trades': self.handle_trade,
521
709
  'user': self.handle_order,
522
710
  'l2_data': self.handle_order_book,
711
+ 'heartbeats': self.handle_heartbeats,
523
712
  }
524
713
  type = self.safe_string(message, 'type')
525
714
  if type == 'error':
526
715
  errorMessage = self.safe_string(message, 'message')
527
716
  raise ExchangeError(errorMessage)
528
717
  method = self.safe_value(methods, channel)
529
- method(client, message)
718
+ if method:
719
+ method(client, message)
@@ -3,14 +3,14 @@
3
3
  # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
- from ccxt.async_support.hitbtc import hitbtc
7
- from ccxt.abstract.hitbtc3 import ImplicitAPI
6
+ from ccxt.pro.coinbase import coinbase
8
7
 
9
8
 
10
- class hitbtc3(hitbtc, ImplicitAPI):
9
+ class coinbaseadvanced(coinbase):
11
10
 
12
11
  def describe(self):
13
- return self.deep_extend(super(hitbtc3, self).describe(), {
14
- 'id': 'hitbtc3',
12
+ return self.deep_extend(super(coinbaseadvanced, self).describe(), {
13
+ 'id': 'coinbaseadvanced',
14
+ 'name': 'Coinbase Advanced',
15
15
  'alias': True,
16
16
  })
@@ -10,16 +10,16 @@ from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers
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
13
+ from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import ArgumentsRequired
14
15
  from ccxt.base.errors import BadRequest
15
16
  from ccxt.base.errors import BadSymbol
16
- from ccxt.base.errors import AuthenticationError
17
17
 
18
18
 
19
- class coinbasepro(ccxt.async_support.coinbasepro):
19
+ class coinbaseexchange(ccxt.async_support.coinbaseexchange):
20
20
 
21
21
  def describe(self):
22
- return self.deep_extend(super(coinbasepro, self).describe(), {
22
+ return self.deep_extend(super(coinbaseexchange, self).describe(), {
23
23
  'has': {
24
24
  'ws': True,
25
25
  'watchOHLCV': False, # missing on the exchange side
@@ -38,7 +38,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
38
38
  },
39
39
  'urls': {
40
40
  'api': {
41
- 'ws': 'wss://ws-feed.pro.coinbase.com',
41
+ 'ws': 'wss://ws-feed.exchange.coinbase.com',
42
42
  },
43
43
  'test': {
44
44
  'ws': 'wss://ws-feed-public.sandbox.exchange.coinbase.com',
@@ -77,7 +77,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
77
77
  if 'signature' in params:
78
78
  # need to distinguish between public trades and user trades
79
79
  url = url + '?'
80
- subscribe = {
80
+ subscribe: dict = {
81
81
  'type': 'subscribe',
82
82
  'product_ids': productIds,
83
83
  'channels': [
@@ -102,7 +102,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
102
102
  if 'signature' in params:
103
103
  # need to distinguish between public trades and user trades
104
104
  url = url + '?'
105
- subscribe = {
105
+ subscribe: dict = {
106
106
  'type': 'subscribe',
107
107
  'product_ids': productIds,
108
108
  'channels': [
@@ -138,7 +138,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
138
138
  messageHash = 'ticker'
139
139
  ticker = await self.subscribe_multiple(channel, symbols, messageHash, params)
140
140
  if self.newUpdates:
141
- result = {}
141
+ result: dict = {}
142
142
  result[ticker['symbol']] = ticker
143
143
  return result
144
144
  return self.filter_by_array(self.tickers, 'symbol', symbols)
@@ -163,7 +163,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
163
163
  async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
164
164
  """
165
165
  get the list of most recent trades for a particular symbol
166
- :param str symbol: unified symbol of the market to fetch trades for
166
+ :param str[] symbols: unified symbol of the market to fetch trades for
167
167
  :param int [since]: timestamp in ms of the earliest trade to fetch
168
168
  :param int [limit]: the maximum amount of trades to fetch
169
169
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -189,7 +189,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
189
189
  :param int [since]: the earliest time in ms to fetch trades for
190
190
  :param int [limit]: the maximum number of trade structures to retrieve
191
191
  :param dict [params]: extra parameters specific to the exchange API endpoint
192
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
192
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
193
193
  """
194
194
  if symbol is None:
195
195
  raise ArgumentsRequired(self.id + ' watchMyTrades() requires a symbol argument')
@@ -210,7 +210,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
210
210
  :param int [since]: the earliest time in ms to fetch trades for
211
211
  :param int [limit]: the maximum number of trade structures to retrieve
212
212
  :param dict [params]: extra parameters specific to the exchange API endpoint
213
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
213
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
214
214
  """
215
215
  symbols = self.market_symbols(symbols, None, False)
216
216
  await self.load_markets()
@@ -286,7 +286,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
286
286
  marketId = marketIds[i]
287
287
  messageHashes.append(name + ':' + marketId)
288
288
  url = self.urls['api']['ws']
289
- subscribe = {
289
+ subscribe: dict = {
290
290
  'type': 'subscribe',
291
291
  'product_ids': marketIds,
292
292
  'channels': [
@@ -294,7 +294,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
294
294
  ],
295
295
  }
296
296
  request = self.extend(subscribe, params)
297
- subscription = {
297
+ subscription: dict = {
298
298
  'messageHash': name,
299
299
  'symbols': symbols,
300
300
  'marketIds': marketIds,
@@ -318,7 +318,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
318
318
  symbol = market['symbol']
319
319
  messageHash = name + ':' + market['id']
320
320
  url = self.urls['api']['ws']
321
- subscribe = {
321
+ subscribe: dict = {
322
322
  'type': 'subscribe',
323
323
  'product_ids': [
324
324
  market['id'],
@@ -328,7 +328,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
328
328
  ],
329
329
  }
330
330
  request = self.extend(subscribe, params)
331
- subscription = {
331
+ subscription: dict = {
332
332
  'messageHash': messageHash,
333
333
  'symbol': symbol,
334
334
  'marketId': market['id'],
@@ -437,7 +437,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
437
437
  # "side": "buy",
438
438
  # "order_type": "limit"
439
439
  # }
440
- parsed = super(coinbasepro, self).parse_trade(trade)
440
+ parsed = super(coinbaseexchange, self).parse_trade(trade)
441
441
  feeRate = None
442
442
  isMaker = False
443
443
  if 'maker_fee_rate' in trade:
@@ -470,7 +470,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
470
470
  return parsed
471
471
 
472
472
  def parse_ws_order_status(self, status):
473
- statuses = {
473
+ statuses: dict = {
474
474
  'filled': 'closed',
475
475
  'canceled': 'canceled',
476
476
  }
@@ -727,7 +727,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
727
727
  #
728
728
  type = self.safe_string(ticker, 'type')
729
729
  if type is None:
730
- return super(coinbasepro, self).parse_ticker(ticker, market)
730
+ return super(coinbaseexchange, self).parse_ticker(ticker, market)
731
731
  marketId = self.safe_string(ticker, 'product_id')
732
732
  symbol = self.safe_symbol(marketId, market, '-')
733
733
  timestamp = self.parse8601(self.safe_string(ticker, 'time'))
@@ -811,7 +811,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
811
811
  orderbook = self.orderbooks[symbol]
812
812
  timestamp = self.parse8601(self.safe_string(message, 'time'))
813
813
  changes = self.safe_value(message, 'changes', [])
814
- sides = {
814
+ sides: dict = {
815
815
  'sell': 'asks',
816
816
  'buy': 'bids',
817
817
  }
@@ -870,7 +870,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
870
870
 
871
871
  def handle_message(self, client: Client, message):
872
872
  type = self.safe_string(message, 'type')
873
- methods = {
873
+ methods: dict = {
874
874
  'snapshot': self.handle_order_book,
875
875
  'l2update': self.handle_order_book,
876
876
  'subscribe': self.handle_subscription_status,