ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__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 +3104 -880
  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 +1513 -563
  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 +206 -89
  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 +557 -323
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -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 +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1633 -268
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -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 +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -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 +3104 -880
  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 +1513 -563
  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 +206 -89
  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 +557 -323
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1632 -268
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -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 +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -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 +138 -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.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.48.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.48.dist-info}/top_level.txt +0 -0
ccxt/pro/bitvavo.py CHANGED
@@ -6,12 +6,12 @@
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, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees
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 ArgumentsRequired
14
13
  from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.errors import ArgumentsRequired
15
15
 
16
16
 
17
17
  class bitvavo(ccxt.async_support.bitvavo):
@@ -25,6 +25,8 @@ class bitvavo(ccxt.async_support.bitvavo):
25
25
  'watchOrderBook': True,
26
26
  'watchTrades': True,
27
27
  'watchTicker': True,
28
+ 'watchTickers': True,
29
+ 'watchBidsAsks': True,
28
30
  'watchOHLCV': True,
29
31
  'watchOrders': True,
30
32
  'watchMyTrades': True,
@@ -71,7 +73,7 @@ class bitvavo(ccxt.async_support.bitvavo):
71
73
  market = self.market(symbol)
72
74
  messageHash = name + '@' + market['id']
73
75
  url = self.urls['api']['ws']
74
- request = {
76
+ request: dict = {
75
77
  'action': 'subscribe',
76
78
  'channels': [
77
79
  {
@@ -85,15 +87,55 @@ class bitvavo(ccxt.async_support.bitvavo):
85
87
  message = self.extend(request, params)
86
88
  return await self.watch(url, messageHash, message, messageHash)
87
89
 
90
+ async def watch_public_multiple(self, methodName, channelName: str, symbols, params={}):
91
+ await self.load_markets()
92
+ symbols = self.market_symbols(symbols)
93
+ messageHashes = [methodName]
94
+ args = []
95
+ for i in range(0, len(symbols)):
96
+ market = self.market(symbols[i])
97
+ args.append(market['id'])
98
+ url = self.urls['api']['ws']
99
+ request: dict = {
100
+ 'action': 'subscribe',
101
+ 'channels': [
102
+ {
103
+ 'name': channelName,
104
+ 'markets': args,
105
+ },
106
+ ],
107
+ }
108
+ message = self.extend(request, params)
109
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
110
+
88
111
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
89
112
  """
90
113
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
114
+
115
+ https://docs.bitvavo.com/#tag/Market-data-subscription-WebSocket/paths/~1subscribeTicker24h/post
116
+
91
117
  :param str symbol: unified symbol of the market to fetch the ticker for
92
118
  :param dict [params]: extra parameters specific to the exchange API endpoint
93
119
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
94
120
  """
95
121
  return await self.watch_public('ticker24h', symbol, params)
96
122
 
123
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
124
+ """
125
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
126
+
127
+ https://docs.bitvavo.com/#tag/Market-data-subscription-WebSocket/paths/~1subscribeTicker24h/post
128
+
129
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
130
+ :param dict [params]: extra parameters specific to the exchange API endpoint
131
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
132
+ """
133
+ await self.load_markets()
134
+ symbols = self.market_symbols(symbols, None, False)
135
+ channel = 'ticker24h'
136
+ tickers = await self.watch_public_multiple(channel, channel, symbols, params)
137
+ return self.filter_by_array(tickers, 'symbol', symbols)
138
+
97
139
  def handle_ticker(self, client: Client, message):
98
140
  #
99
141
  # {
@@ -116,8 +158,10 @@ class bitvavo(ccxt.async_support.bitvavo):
116
158
  # ]
117
159
  # }
118
160
  #
161
+ self.handle_bid_ask(client, message)
119
162
  event = self.safe_string(message, 'event')
120
163
  tickers = self.safe_value(message, 'data', [])
164
+ result = []
121
165
  for i in range(0, len(tickers)):
122
166
  data = tickers[i]
123
167
  marketId = self.safe_string(data, 'market')
@@ -126,8 +170,55 @@ class bitvavo(ccxt.async_support.bitvavo):
126
170
  ticker = self.parse_ticker(data, market)
127
171
  symbol = ticker['symbol']
128
172
  self.tickers[symbol] = ticker
173
+ result.append(ticker)
129
174
  client.resolve(ticker, messageHash)
130
- return message
175
+ client.resolve(result, event)
176
+
177
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
178
+ """
179
+ watches best bid & ask for symbols
180
+
181
+ https://docs.bitvavo.com/#tag/Market-data-subscription-WebSocket/paths/~1subscribeTicker24h/post
182
+
183
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
184
+ :param dict [params]: extra parameters specific to the exchange API endpoint
185
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
186
+ """
187
+ await self.load_markets()
188
+ symbols = self.market_symbols(symbols, None, False)
189
+ channel = 'ticker24h'
190
+ tickers = await self.watch_public_multiple('bidask', channel, symbols, params)
191
+ return self.filter_by_array(tickers, 'symbol', symbols)
192
+
193
+ def handle_bid_ask(self, client: Client, message):
194
+ event = 'bidask'
195
+ tickers = self.safe_value(message, 'data', [])
196
+ result = []
197
+ for i in range(0, len(tickers)):
198
+ data = tickers[i]
199
+ ticker = self.parse_ws_bid_ask(data)
200
+ symbol = ticker['symbol']
201
+ self.bidsasks[symbol] = ticker
202
+ result.append(ticker)
203
+ messageHash = event + ':' + symbol
204
+ client.resolve(ticker, messageHash)
205
+ client.resolve(result, event)
206
+
207
+ def parse_ws_bid_ask(self, ticker, market=None):
208
+ marketId = self.safe_string(ticker, 'market')
209
+ market = self.safe_market(marketId, None, '-')
210
+ symbol = self.safe_string(market, 'symbol')
211
+ timestamp = self.safe_integer(ticker, 'timestamp')
212
+ return self.safe_ticker({
213
+ 'symbol': symbol,
214
+ 'timestamp': timestamp,
215
+ 'datetime': self.iso8601(timestamp),
216
+ 'ask': self.safe_number(ticker, 'ask'),
217
+ 'askVolume': self.safe_number(ticker, 'askSize'),
218
+ 'bid': self.safe_number(ticker, 'bid'),
219
+ 'bidVolume': self.safe_number(ticker, 'bidSize'),
220
+ 'info': ticker,
221
+ }, market)
131
222
 
132
223
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
133
224
  """
@@ -189,7 +280,7 @@ class bitvavo(ccxt.async_support.bitvavo):
189
280
  interval = self.safe_string(self.timeframes, timeframe, timeframe)
190
281
  messageHash = name + '@' + marketId + '_' + interval
191
282
  url = self.urls['api']['ws']
192
- request = {
283
+ request: dict = {
193
284
  'action': 'subscribe',
194
285
  'channels': [
195
286
  {
@@ -215,10 +306,9 @@ class bitvavo(ccxt.async_support.bitvavo):
215
306
  # ]
216
307
  # }
217
308
  #
218
- action = self.safe_string(message, 'action')
219
309
  response = self.safe_value(message, 'response')
220
310
  ohlcv = self.parse_ohlcvs(response, None, None, None)
221
- messageHash = self.build_message_hash(action)
311
+ messageHash = self.safe_string(message, 'requestId')
222
312
  client.resolve(ohlcv, messageHash)
223
313
 
224
314
  def handle_ohlcv(self, client: Client, message):
@@ -274,7 +364,7 @@ class bitvavo(ccxt.async_support.bitvavo):
274
364
  name = 'book'
275
365
  messageHash = name + '@' + market['id']
276
366
  url = self.urls['api']['ws']
277
- request = {
367
+ request: dict = {
278
368
  'action': 'subscribe',
279
369
  'channels': [
280
370
  {
@@ -285,7 +375,7 @@ class bitvavo(ccxt.async_support.bitvavo):
285
375
  },
286
376
  ],
287
377
  }
288
- subscription = {
378
+ subscription: dict = {
289
379
  'messageHash': messageHash,
290
380
  'name': name,
291
381
  'symbol': symbol,
@@ -371,7 +461,7 @@ class bitvavo(ccxt.async_support.bitvavo):
371
461
  name = 'getBook'
372
462
  messageHash = name + '@' + marketId
373
463
  url = self.urls['api']['ws']
374
- request = {
464
+ request: dict = {
375
465
  'action': name,
376
466
  'market': marketId,
377
467
  }
@@ -455,7 +545,7 @@ class bitvavo(ccxt.async_support.bitvavo):
455
545
  url = self.urls['api']['ws']
456
546
  name = 'account'
457
547
  messageHash = 'order:' + symbol
458
- request = {
548
+ request: dict = {
459
549
  'action': 'subscribe',
460
550
  'channels': [
461
551
  {
@@ -476,7 +566,7 @@ class bitvavo(ccxt.async_support.bitvavo):
476
566
  :param int [since]: the earliest time in ms to fetch trades for
477
567
  :param int [limit]: the maximum number of trade structures to retrieve
478
568
  :param dict [params]: extra parameters specific to the exchange API endpoint
479
- :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=ortradeder-structure
569
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
480
570
  """
481
571
  if symbol is None:
482
572
  raise ArgumentsRequired(self.id + ' watchMyTrades() requires a symbol argument')
@@ -488,7 +578,7 @@ class bitvavo(ccxt.async_support.bitvavo):
488
578
  url = self.urls['api']['ws']
489
579
  name = 'account'
490
580
  messageHash = 'myTrades:' + symbol
491
- request = {
581
+ request: dict = {
492
582
  'action': 'subscribe',
493
583
  'channels': [
494
584
  {
@@ -505,12 +595,14 @@ class bitvavo(ccxt.async_support.bitvavo):
505
595
  async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
506
596
  """
507
597
  create a trade order
508
- :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/post
598
+
599
+ https://docs.bitvavo.com/#tag/Orders/paths/~1order/post
600
+
509
601
  :param str symbol: unified symbol of the market to create an order in
510
602
  :param str type: 'market' or 'limit'
511
603
  :param str side: 'buy' or 'sell'
512
604
  :param float amount: how much of currency you want to trade in units of base currency
513
- :param float price: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
605
+ :param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
514
606
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
515
607
  :param str [params.timeInForce]: "GTC", "IOC", or "PO"
516
608
  :param float [params.stopPrice]: The price at which a trigger order is triggered at
@@ -533,13 +625,15 @@ class bitvavo(ccxt.async_support.bitvavo):
533
625
  async def edit_order_ws(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
534
626
  """
535
627
  edit a trade order
536
- :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/put
628
+
629
+ https://docs.bitvavo.com/#tag/Orders/paths/~1order/put
630
+
537
631
  :param str id: cancel order id
538
632
  :param str symbol: unified symbol of the market to create an order in
539
633
  :param str type: 'market' or 'limit'
540
634
  :param str side: 'buy' or 'sell'
541
635
  :param float [amount]: how much of currency you want to trade in units of base currency
542
- :param float [price]: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
636
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
543
637
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
544
638
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
545
639
  """
@@ -550,7 +644,9 @@ class bitvavo(ccxt.async_support.bitvavo):
550
644
 
551
645
  async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
552
646
  """
553
- :see: https://docs.bitvavo.com/#tag/Orders/paths/~1order/delete
647
+
648
+ https://docs.bitvavo.com/#tag/Orders/paths/~1order/delete
649
+
554
650
  cancels an open order
555
651
  :param str id: order id
556
652
  :param str symbol: unified symbol of the market the order was made in
@@ -559,12 +655,14 @@ class bitvavo(ccxt.async_support.bitvavo):
559
655
  """
560
656
  await self.load_markets()
561
657
  await self.authenticate()
562
- request = self.cancelOrderRequest(id, symbol, params)
658
+ request = self.cancel_order_request(id, symbol, params)
563
659
  return await self.watch_request('privateCancelOrder', request)
564
660
 
565
661
  async def cancel_all_orders_ws(self, symbol: Str = None, params={}):
566
662
  """
567
- :see: https://docs.bitvavo.com/#tag/Orders/paths/~1orders/delete
663
+
664
+ https://docs.bitvavo.com/#tag/Orders/paths/~1orders/delete
665
+
568
666
  cancel all open orders
569
667
  :param str symbol: unified market symbol, only orders in the market of self symbol are cancelled when symbol is not None
570
668
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
@@ -572,7 +670,7 @@ class bitvavo(ccxt.async_support.bitvavo):
572
670
  """
573
671
  await self.load_markets()
574
672
  await self.authenticate()
575
- request = {}
673
+ request: dict = {}
576
674
  market = None
577
675
  if symbol is not None:
578
676
  market = self.market(symbol)
@@ -588,20 +686,24 @@ class bitvavo(ccxt.async_support.bitvavo):
588
686
  # }]
589
687
  # }
590
688
  #
591
- action = self.safe_string(message, 'action')
592
- response = self.safe_value(message, 'response')
593
- firstRawOrder = self.safe_value(response, 0, {})
594
- marketId = self.safe_string(firstRawOrder, 'market')
689
+ # action = self.safe_string(message, 'action')
690
+ response = self.safe_list(message, 'response')
691
+ # firstRawOrder = self.safe_value(response, 0, {})
692
+ # marketId = self.safe_string(firstRawOrder, 'market')
595
693
  orders = self.parse_orders(response)
596
- messageHash = self.build_message_hash(action, {'market': marketId})
597
- client.resolve(orders, messageHash)
598
- messageHash = self.build_message_hash(action, message)
694
+ # messageHash = self.build_message_hash(action, {'market': marketId})
695
+ # client.resolve(orders, messageHash)
696
+ # messageHash = self.build_message_hash(action, message)
697
+ messageHash = self.safe_string(message, 'requestId')
599
698
  client.resolve(orders, messageHash)
600
699
 
601
700
  async def fetch_order_ws(self, id: str, symbol: Str = None, params={}) -> Order:
602
701
  """
603
- :see: https://docs.bitvavo.com/#tag/General/paths/~1assets/get
702
+
703
+ https://docs.bitvavo.com/#tag/General/paths/~1assets/get
704
+
604
705
  fetches information on an order made by the user
706
+ :param str id: the order id
605
707
  :param str symbol: unified symbol of the market the order was made in
606
708
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
607
709
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -611,7 +713,7 @@ class bitvavo(ccxt.async_support.bitvavo):
611
713
  await self.load_markets()
612
714
  await self.authenticate()
613
715
  market = self.market(symbol)
614
- request = {
716
+ request: dict = {
615
717
  'orderId': id,
616
718
  'market': market['id'],
617
719
  }
@@ -619,7 +721,9 @@ class bitvavo(ccxt.async_support.bitvavo):
619
721
 
620
722
  async def fetch_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
621
723
  """
622
- :see: https://docs.bitvavo.com/#tag/Orders/paths/~1orders/get
724
+
725
+ https://docs.bitvavo.com/#tag/Orders/paths/~1orders/get
726
+
623
727
  fetches information on multiple orders made by the user
624
728
  :param str symbol: unified market symbol of the market orders were made in
625
729
  :param int [since]: the earliest time in ms to fetch orders for
@@ -635,12 +739,19 @@ class bitvavo(ccxt.async_support.bitvavo):
635
739
  orders = await self.watch_request('privateGetOrders', request)
636
740
  return self.filter_by_symbol_since_limit(orders, symbol, since, limit)
637
741
 
742
+ def request_id(self):
743
+ ts = str(self.milliseconds())
744
+ randomNumber = self.rand_number(4)
745
+ randomPart = str(randomNumber)
746
+ return int(ts + randomPart)
747
+
638
748
  async def watch_request(self, action, request):
749
+ messageHash = self.request_id()
750
+ messageHashStr = str(messageHash)
639
751
  request['action'] = action
640
- messageHash = self.build_message_hash(action, request)
641
- self.check_message_hash_does_not_exist(messageHash)
752
+ request['requestId'] = messageHash
642
753
  url = self.urls['api']['ws']
643
- return await self.watch(url, messageHash, request, messageHash)
754
+ return await self.watch(url, messageHashStr, request, messageHashStr)
644
755
 
645
756
  async def fetch_open_orders_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
646
757
  """
@@ -653,7 +764,7 @@ class bitvavo(ccxt.async_support.bitvavo):
653
764
  """
654
765
  await self.load_markets()
655
766
  await self.authenticate()
656
- request = {
767
+ request: dict = {
657
768
  # 'market': market['id'], # rate limit 25 without a market, 1 with market specified
658
769
  }
659
770
  market = None
@@ -665,7 +776,9 @@ class bitvavo(ccxt.async_support.bitvavo):
665
776
 
666
777
  async def fetch_my_trades_ws(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
667
778
  """
668
- :see: https://docs.bitvavo.com/#tag/Trades
779
+
780
+ https://docs.bitvavo.com/#tag/Trades
781
+
669
782
  fetch all trades made by the user
670
783
  :param str symbol: unified market symbol
671
784
  :param int [since]: the earliest time in ms to fetch trades for
@@ -703,12 +816,12 @@ class bitvavo(ccxt.async_support.bitvavo):
703
816
  # }
704
817
  #
705
818
  #
706
- action = self.safe_string(message, 'action')
707
- response = self.safe_value(message, 'response')
708
- firstRawTrade = self.safe_value(response, 0, {})
709
- marketId = self.safe_string(firstRawTrade, 'market')
819
+ # action = self.safe_string(message, 'action')
820
+ response = self.safe_list(message, 'response')
821
+ # marketId = self.safe_string(firstRawTrade, 'market')
710
822
  trades = self.parse_trades(response, None, None, None)
711
- messageHash = self.build_message_hash(action, {'market': marketId})
823
+ # messageHash = self.build_message_hash(action, {'market': marketId})
824
+ messageHash = self.safe_string(message, 'requestId')
712
825
  client.resolve(trades, messageHash)
713
826
 
714
827
  async def withdraw_ws(self, code: str, amount, address, tag=None, params={}):
@@ -739,15 +852,18 @@ class bitvavo(ccxt.async_support.bitvavo):
739
852
  # }
740
853
  # }
741
854
  #
742
- action = self.safe_string(message, 'action')
743
- messageHash = self.build_message_hash(action, message)
855
+ # action = self.safe_string(message, 'action')
856
+ # messageHash = self.build_message_hash(action, message)
857
+ messageHash = self.safe_string(message, 'requestId')
744
858
  response = self.safe_value(message, 'response')
745
859
  withdraw = self.parse_transaction(response)
746
860
  client.resolve(withdraw, messageHash)
747
861
 
748
862
  async def fetch_withdrawals_ws(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
749
863
  """
750
- :see: https://docs.bitvavo.com/#tag/Account/paths/~1withdrawalHistory/get
864
+
865
+ https://docs.bitvavo.com/#tag/Account/paths/~1withdrawalHistory/get
866
+
751
867
  fetch all withdrawals made from an account
752
868
  :param str code: unified currency code
753
869
  :param int [since]: the earliest time in ms to fetch withdrawals for
@@ -777,15 +893,18 @@ class bitvavo(ccxt.async_support.bitvavo):
777
893
  # ]
778
894
  # }
779
895
  #
780
- action = self.safe_string(message, 'action')
781
- messageHash = self.build_message_hash(action, message)
782
- response = self.safe_value(message, 'response')
896
+ # action = self.safe_string(message, 'action')
897
+ # messageHash = self.build_message_hash(action, message)
898
+ response = self.safe_list(message, 'response')
899
+ messageHash = self.safe_string(message, 'requestId')
783
900
  withdrawals = self.parse_transactions(response, None, None, None, {'type': 'withdrawal'})
784
901
  client.resolve(withdrawals, messageHash)
785
902
 
786
903
  async def fetch_ohlcv_ws(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
787
904
  """
788
- :see: https://docs.bitvavo.com/#tag/Market-Data/paths/~1{market}~1candles/get
905
+
906
+ https://docs.bitvavo.com/#tag/Market-Data/paths/~1{market}~1candles/get
907
+
789
908
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
790
909
  :param str symbol: unified symbol of the market to fetch OHLCV data for
791
910
  :param str timeframe: the length of time each candle represents
@@ -802,7 +921,9 @@ class bitvavo(ccxt.async_support.bitvavo):
802
921
 
803
922
  async def fetch_deposits_ws(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
804
923
  """
805
- :see: https://docs.bitvavo.com/#tag/Account/paths/~1depositHistory/get
924
+
925
+ https://docs.bitvavo.com/#tag/Account/paths/~1depositHistory/get
926
+
806
927
  fetch all deposits made to an account
807
928
  :param str code: unified currency code
808
929
  :param int [since]: the earliest time in ms to fetch deposits for
@@ -832,15 +953,16 @@ class bitvavo(ccxt.async_support.bitvavo):
832
953
  # ]
833
954
  # }
834
955
  #
835
- action = self.safe_string(message, 'action')
836
- messageHash = self.build_message_hash(action, message)
837
956
  response = self.safe_value(message, 'response')
838
957
  deposits = self.parse_transactions(response, None, None, None, {'type': 'deposit'})
958
+ messageHash = self.safe_string(message, 'requestId')
839
959
  client.resolve(deposits, messageHash)
840
960
 
841
- async def fetch_trading_fees_ws(self, params={}):
961
+ async def fetch_trading_fees_ws(self, params={}) -> TradingFees:
842
962
  """
843
- :see: https://docs.bitvavo.com/#tag/Account/paths/~1account/get
963
+
964
+ https://docs.bitvavo.com/#tag/Account/paths/~1account/get
965
+
844
966
  fetch the trading fees for multiple markets
845
967
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
846
968
  :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
@@ -851,7 +973,9 @@ class bitvavo(ccxt.async_support.bitvavo):
851
973
 
852
974
  async def fetch_markets_ws(self, params={}):
853
975
  """
854
- :see: https://docs.bitvavo.com/#tag/General/paths/~1markets/get
976
+
977
+ https://docs.bitvavo.com/#tag/General/paths/~1markets/get
978
+
855
979
  retrieves data on all markets for bitvavo
856
980
  :param dict [params]: extra parameters specific to the exchange api endpoint
857
981
  :returns dict[]: an array of objects representing market data
@@ -860,7 +984,9 @@ class bitvavo(ccxt.async_support.bitvavo):
860
984
 
861
985
  async def fetch_currencies_ws(self, params={}):
862
986
  """
863
- :see: https://docs.bitvavo.com/#tag/General/paths/~1assets/get
987
+
988
+ https://docs.bitvavo.com/#tag/General/paths/~1assets/get
989
+
864
990
  fetches all available currencies on an exchange
865
991
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
866
992
  :returns dict: an associative dictionary of currencies
@@ -889,10 +1015,9 @@ class bitvavo(ccxt.async_support.bitvavo):
889
1015
  # ]
890
1016
  # }
891
1017
  #
892
- action = self.safe_string(message, 'action')
893
- messageHash = self.build_message_hash(action, message)
1018
+ messageHash = self.safe_string(message, 'requestId')
894
1019
  response = self.safe_value(message, 'response')
895
- currencies = self.parseCurrencies(response)
1020
+ currencies = self.parse_currencies(response)
896
1021
  client.resolve(currencies, messageHash)
897
1022
 
898
1023
  def handle_trading_fees(self, client, message):
@@ -908,15 +1033,16 @@ class bitvavo(ccxt.async_support.bitvavo):
908
1033
  # }
909
1034
  # }
910
1035
  #
911
- action = self.safe_string(message, 'action')
912
- messageHash = self.build_message_hash(action, message)
1036
+ messageHash = self.safe_string(message, 'requestId')
913
1037
  response = self.safe_value(message, 'response')
914
1038
  fees = self.parse_trading_fees(response)
915
1039
  client.resolve(fees, messageHash)
916
1040
 
917
1041
  async def fetch_balance_ws(self, params={}) -> Balances:
918
1042
  """
919
- :see: https://docs.bitvavo.com/#tag/Account/paths/~1balance/get
1043
+
1044
+ https://docs.bitvavo.com/#tag/Account/paths/~1balance/get
1045
+
920
1046
  query for balance and get the amount of funds available for trading or funds locked in orders
921
1047
  :param dict [params]: extra parameters specific to the bitvavo api endpoint
922
1048
  :returns dict: a `balance structure <https://docs.ccxt.com/en/latest/manual.html?#balance-structure>`
@@ -938,8 +1064,7 @@ class bitvavo(ccxt.async_support.bitvavo):
938
1064
  # ]
939
1065
  # }
940
1066
  #
941
- action = self.safe_string(message, 'action', 'privateGetBalance')
942
- messageHash = self.build_message_hash(action, message)
1067
+ messageHash = self.safe_string(message, 'requestId')
943
1068
  response = self.safe_value(message, 'response', [])
944
1069
  balance = self.parse_balance(response)
945
1070
  client.resolve(balance, messageHash)
@@ -973,10 +1098,9 @@ class bitvavo(ccxt.async_support.bitvavo):
973
1098
  # }
974
1099
  # }
975
1100
  #
976
- action = self.safe_string(message, 'action')
977
1101
  response = self.safe_value(message, 'response', {})
978
1102
  order = self.parse_order(response)
979
- messageHash = self.build_message_hash(action, response)
1103
+ messageHash = self.safe_string(message, 'requestId')
980
1104
  client.resolve(order, messageHash)
981
1105
 
982
1106
  def handle_markets(self, client: Client, message):
@@ -999,14 +1123,13 @@ class bitvavo(ccxt.async_support.bitvavo):
999
1123
  # ]
1000
1124
  # }
1001
1125
  #
1002
- action = self.safe_string(message, 'action')
1003
1126
  response = self.safe_value(message, 'response', {})
1004
1127
  markets = self.parse_markets(response)
1005
- messageHash = self.build_message_hash(action, response)
1128
+ messageHash = self.safe_string(message, 'requestId')
1006
1129
  client.resolve(markets, messageHash)
1007
1130
 
1008
1131
  def build_message_hash(self, action, params={}):
1009
- methods = {
1132
+ methods: dict = {
1010
1133
  'privateCreateOrder': self.action_and_market_message_hash,
1011
1134
  'privateUpdateOrder': self.action_and_order_id_message_hash,
1012
1135
  'privateCancelOrder': self.action_and_order_id_message_hash,
@@ -1019,15 +1142,6 @@ class bitvavo(ccxt.async_support.bitvavo):
1019
1142
  messageHash = method(action, params)
1020
1143
  return messageHash
1021
1144
 
1022
- def check_message_hash_does_not_exist(self, messageHash):
1023
- supressMultipleWsRequestsError = self.safe_bool(self.options, 'supressMultipleWsRequestsError', False)
1024
- if not supressMultipleWsRequestsError:
1025
- client = self.safe_value(self.clients, self.urls['api']['ws'])
1026
- if client is not None:
1027
- future = self.safe_value(client.futures, messageHash)
1028
- if future is not None:
1029
- raise ExchangeError(self.id + ' a similar request with messageHash ' + messageHash + ' is already pending, you must wait for a response, or turn off self error by setting supressMultipleWsRequestsError in the options to True')
1030
-
1031
1145
  def action_and_market_message_hash(self, action, params={}):
1032
1146
  symbol = self.safe_string(params, 'market', '')
1033
1147
  return action + symbol
@@ -1110,7 +1224,7 @@ class bitvavo(ccxt.async_support.bitvavo):
1110
1224
  # }
1111
1225
  #
1112
1226
  subscriptions = self.safe_value(message, 'subscriptions', {})
1113
- methods = {
1227
+ methods: dict = {
1114
1228
  'book': self.handle_order_book_subscriptions,
1115
1229
  }
1116
1230
  names = list(subscriptions.keys())
@@ -1133,7 +1247,7 @@ class bitvavo(ccxt.async_support.bitvavo):
1133
1247
  auth = stringTimestamp + 'GET/' + self.version + '/websocket'
1134
1248
  signature = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
1135
1249
  action = 'authenticate'
1136
- request = {
1250
+ request: dict = {
1137
1251
  'action': action,
1138
1252
  'key': self.apiKey,
1139
1253
  'signature': signature,
@@ -1171,11 +1285,19 @@ class bitvavo(ccxt.async_support.bitvavo):
1171
1285
  # errorCode: 217,
1172
1286
  # error: 'Minimum order size in quote currency is 5 EUR or 0.001 BTC.'
1173
1287
  # }
1288
+ # {
1289
+ # action: 'privateCreateOrder',
1290
+ # requestId: '17317539426571916',
1291
+ # market: 'USDT-EUR',
1292
+ # errorCode: 216,
1293
+ # error: 'You do not have sufficient balance to complete self operation.'
1294
+ # }
1174
1295
  #
1175
1296
  error = self.safe_string(message, 'error')
1176
1297
  code = self.safe_integer(error, 'errorCode')
1177
1298
  action = self.safe_string(message, 'action')
1178
- messageHash = self.build_message_hash(action, message)
1299
+ buildMessage = self.build_message_hash(action, message)
1300
+ messageHash = self.safe_string(message, 'requestId', buildMessage)
1179
1301
  rejected = False
1180
1302
  try:
1181
1303
  self.handle_errors(code, error, client.url, None, None, error, message, None, None)
@@ -1232,7 +1354,7 @@ class bitvavo(ccxt.async_support.bitvavo):
1232
1354
  error = self.safe_string(message, 'error')
1233
1355
  if error is not None:
1234
1356
  self.handle_error_message(client, message)
1235
- methods = {
1357
+ methods: dict = {
1236
1358
  'subscribed': self.handle_subscription_status,
1237
1359
  'book': self.handle_order_book,
1238
1360
  'getBook': self.handle_order_book_snapshot,