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/bitfinex1.py ADDED
@@ -0,0 +1,635 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ import ccxt.async_support
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
+ import hashlib
9
+ from ccxt.base.types import Int, Order, OrderBook, Str, Ticker, Trade
10
+ from ccxt.async_support.base.ws.client import Client
11
+ from typing import List
12
+ from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
14
+ from ccxt.base.precise import Precise
15
+
16
+
17
+ class bitfinex1(ccxt.async_support.bitfinex1):
18
+
19
+ def describe(self):
20
+ return self.deep_extend(super(bitfinex1, self).describe(), {
21
+ 'has': {
22
+ 'ws': True,
23
+ 'watchTicker': True,
24
+ 'watchTickers': False,
25
+ 'watchOrderBook': True,
26
+ 'watchTrades': True,
27
+ 'watchTradesForSymbols': False,
28
+ 'watchBalance': False, # for now
29
+ 'watchOHLCV': False, # missing on the exchange side in v1
30
+ },
31
+ 'urls': {
32
+ 'api': {
33
+ 'ws': {
34
+ 'public': 'wss://api-pub.bitfinex.com/ws/1',
35
+ 'private': 'wss://api.bitfinex.com/ws/1',
36
+ },
37
+ },
38
+ },
39
+ 'options': {
40
+ 'watchOrderBook': {
41
+ 'prec': 'P0',
42
+ 'freq': 'F0',
43
+ },
44
+ 'ordersLimit': 1000,
45
+ },
46
+ })
47
+
48
+ async def subscribe(self, channel, symbol, params={}):
49
+ await self.load_markets()
50
+ market = self.market(symbol)
51
+ marketId = market['id']
52
+ url = self.urls['api']['ws']['public']
53
+ messageHash = channel + ':' + marketId
54
+ # channel = 'trades'
55
+ request: dict = {
56
+ 'event': 'subscribe',
57
+ 'channel': channel,
58
+ 'symbol': marketId,
59
+ 'messageHash': messageHash,
60
+ }
61
+ return await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
62
+
63
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
64
+ """
65
+ get the list of most recent trades for a particular symbol
66
+
67
+ https://docs.bitfinex.com/v1/reference/ws-public-trades
68
+
69
+ :param str symbol: unified symbol of the market to fetch trades for
70
+ :param int [since]: timestamp in ms of the earliest trade to fetch
71
+ :param int [limit]: the maximum amount of trades to fetch
72
+ :param dict [params]: extra parameters specific to the exchange API endpoint
73
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
74
+ """
75
+ await self.load_markets()
76
+ symbol = self.symbol(symbol)
77
+ trades = await self.subscribe('trades', symbol, params)
78
+ if self.newUpdates:
79
+ limit = trades.getLimit(symbol, limit)
80
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
81
+
82
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
83
+ """
84
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
85
+
86
+ https://docs.bitfinex.com/v1/reference/ws-public-ticker
87
+
88
+ :param str symbol: unified symbol of the market to fetch the ticker for
89
+ :param dict [params]: extra parameters specific to the exchange API endpoint
90
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
91
+ """
92
+ return await self.subscribe('ticker', symbol, params)
93
+
94
+ def handle_trades(self, client: Client, message, subscription):
95
+ #
96
+ # initial snapshot
97
+ #
98
+ # [
99
+ # 2,
100
+ # [
101
+ # [null, 1580565020, 9374.9, 0.005],
102
+ # [null, 1580565004, 9374.9, 0.005],
103
+ # [null, 1580565003, 9374.9, 0.005],
104
+ # ]
105
+ # ]
106
+ #
107
+ # when a trade does not have an id yet
108
+ #
109
+ # # channel id, update type, seq, time, price, amount
110
+ # [2, "te", "28462857-BTCUSD", 1580565041, 9374.9, 0.005],
111
+ #
112
+ # when a trade already has an id
113
+ #
114
+ # # channel id, update type, seq, trade id, time, price, amount
115
+ # [2, "tu", "28462857-BTCUSD", 413357662, 1580565041, 9374.9, 0.005]
116
+ #
117
+ channel = self.safe_value(subscription, 'channel')
118
+ marketId = self.safe_string(subscription, 'pair')
119
+ messageHash = channel + ':' + marketId
120
+ tradesLimit = self.safe_integer(self.options, 'tradesLimit', 1000)
121
+ market = self.safe_market(marketId)
122
+ symbol = market['symbol']
123
+ data = self.safe_value(message, 1)
124
+ stored = self.safe_value(self.trades, symbol)
125
+ if stored is None:
126
+ stored = ArrayCache(tradesLimit)
127
+ self.trades[symbol] = stored
128
+ if isinstance(data, list):
129
+ trades = self.parse_trades(data, market)
130
+ for i in range(0, len(trades)):
131
+ stored.append(trades[i])
132
+ else:
133
+ second = self.safe_string(message, 1)
134
+ if second != 'tu':
135
+ return
136
+ trade = self.parse_trade(message, market)
137
+ stored.append(trade)
138
+ client.resolve(stored, messageHash)
139
+
140
+ def parse_trade(self, trade, market=None) -> Trade:
141
+ #
142
+ # snapshot trade
143
+ #
144
+ # # null, time, price, amount
145
+ # [null, 1580565020, 9374.9, 0.005],
146
+ #
147
+ # when a trade does not have an id yet
148
+ #
149
+ # # channel id, update type, seq, time, price, amount
150
+ # [2, "te", "28462857-BTCUSD", 1580565041, 9374.9, 0.005],
151
+ #
152
+ # when a trade already has an id
153
+ #
154
+ # # channel id, update type, seq, trade id, time, price, amount
155
+ # [2, "tu", "28462857-BTCUSD", 413357662, 1580565041, 9374.9, 0.005]
156
+ #
157
+ if not isinstance(trade, list):
158
+ return super(bitfinex1, self).parse_trade(trade, market)
159
+ tradeLength = len(trade)
160
+ event = self.safe_string(trade, 1)
161
+ id = None
162
+ if event == 'tu':
163
+ id = self.safe_string(trade, tradeLength - 4)
164
+ timestamp = self.safe_timestamp(trade, tradeLength - 3)
165
+ price = self.safe_string(trade, tradeLength - 2)
166
+ amount = self.safe_string(trade, tradeLength - 1)
167
+ side = None
168
+ if amount is not None:
169
+ side = 'buy' if Precise.string_gt(amount, '0') else 'sell'
170
+ amount = Precise.string_abs(amount)
171
+ seq = self.safe_string(trade, 2)
172
+ parts = seq.split('-')
173
+ marketId = self.safe_string(parts, 1)
174
+ if marketId is not None:
175
+ marketId = marketId.replace('t', '')
176
+ symbol = self.safe_symbol(marketId, market)
177
+ takerOrMaker = None
178
+ orderId = None
179
+ return self.safe_trade({
180
+ 'info': trade,
181
+ 'timestamp': timestamp,
182
+ 'datetime': self.iso8601(timestamp),
183
+ 'symbol': symbol,
184
+ 'id': id,
185
+ 'order': orderId,
186
+ 'type': None,
187
+ 'takerOrMaker': takerOrMaker,
188
+ 'side': side,
189
+ 'price': price,
190
+ 'amount': amount,
191
+ 'cost': None,
192
+ 'fee': None,
193
+ })
194
+
195
+ def handle_ticker(self, client: Client, message, subscription):
196
+ #
197
+ # [
198
+ # 2, # 0 CHANNEL_ID integer Channel ID
199
+ # 236.62, # 1 BID float Price of last highest bid
200
+ # 9.0029, # 2 BID_SIZE float Size of the last highest bid
201
+ # 236.88, # 3 ASK float Price of last lowest ask
202
+ # 7.1138, # 4 ASK_SIZE float Size of the last lowest ask
203
+ # -1.02, # 5 DAILY_CHANGE float Amount that the last price has changed since yesterday
204
+ # 0, # 6 DAILY_CHANGE_PERC float Amount that the price has changed expressed in percentage terms
205
+ # 236.52, # 7 LAST_PRICE float Price of the last trade.
206
+ # 5191.36754297, # 8 VOLUME float Daily volume
207
+ # 250.01, # 9 HIGH float Daily high
208
+ # 220.05, # 10 LOW float Daily low
209
+ # ]
210
+ #
211
+ marketId = self.safe_string(subscription, 'pair')
212
+ symbol = self.safe_symbol(marketId)
213
+ channel = 'ticker'
214
+ messageHash = channel + ':' + marketId
215
+ last = self.safe_string(message, 7)
216
+ change = self.safe_string(message, 5)
217
+ open = None
218
+ if (last is not None) and (change is not None):
219
+ open = Precise.string_sub(last, change)
220
+ result = self.safe_ticker({
221
+ 'symbol': symbol,
222
+ 'timestamp': None,
223
+ 'datetime': None,
224
+ 'high': self.safe_string(message, 9),
225
+ 'low': self.safe_string(message, 10),
226
+ 'bid': self.safe_string(message, 1),
227
+ 'bidVolume': None,
228
+ 'ask': self.safe_string(message, 3),
229
+ 'askVolume': None,
230
+ 'vwap': None,
231
+ 'open': self.parse_number(open),
232
+ 'close': self.parse_number(last),
233
+ 'last': self.parse_number(last),
234
+ 'previousClose': None,
235
+ 'change': self.parse_number(change),
236
+ 'percentage': self.safe_string(message, 6),
237
+ 'average': None,
238
+ 'baseVolume': self.safe_string(message, 8),
239
+ 'quoteVolume': None,
240
+ 'info': message,
241
+ })
242
+ self.tickers[symbol] = result
243
+ client.resolve(result, messageHash)
244
+
245
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
246
+ """
247
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
248
+
249
+ https://docs.bitfinex.com/v1/reference/ws-public-order-books
250
+
251
+ :param str symbol: unified symbol of the market to fetch the order book for
252
+ :param int [limit]: the maximum amount of order book entries to return
253
+ :param dict [params]: extra parameters specific to the exchange API endpoint
254
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
255
+ """
256
+ if limit is not None:
257
+ if (limit != 25) and (limit != 100):
258
+ raise ExchangeError(self.id + ' watchOrderBook limit argument must be None, 25 or 100')
259
+ options = self.safe_value(self.options, 'watchOrderBook', {})
260
+ prec = self.safe_string(options, 'prec', 'P0')
261
+ freq = self.safe_string(options, 'freq', 'F0')
262
+ request: dict = {
263
+ # "event": "subscribe", # added in subscribe()
264
+ # "channel": channel, # added in subscribe()
265
+ # "symbol": marketId, # added in subscribe()
266
+ 'prec': prec, # string, level of price aggregation, 'P0', 'P1', 'P2', 'P3', 'P4', default P0
267
+ 'freq': freq, # string, frequency of updates 'F0' = realtime, 'F1' = 2 seconds, default is 'F0'
268
+ 'len': limit, # string, number of price points, '25', '100', default = '25'
269
+ }
270
+ orderbook = await self.subscribe('book', symbol, self.deep_extend(request, params))
271
+ return orderbook.limit()
272
+
273
+ def handle_order_book(self, client: Client, message, subscription):
274
+ #
275
+ # first message(snapshot)
276
+ #
277
+ # [
278
+ # 18691, # channel id
279
+ # [
280
+ # [7364.8, 10, 4.354802], # price, count, size > 0 = bid
281
+ # [7364.7, 1, 0.00288831],
282
+ # [7364.3, 12, 0.048],
283
+ # [7364.9, 3, -0.42028976], # price, count, size < 0 = ask
284
+ # [7365, 1, -0.25],
285
+ # [7365.5, 1, -0.00371937],
286
+ # ]
287
+ # ]
288
+ #
289
+ # subsequent updates
290
+ #
291
+ # [
292
+ # 30, # channel id
293
+ # 9339.9, # price
294
+ # 0, # count
295
+ # -1, # size > 0 = bid, size < 0 = ask
296
+ # ]
297
+ #
298
+ marketId = self.safe_string(subscription, 'pair')
299
+ symbol = self.safe_symbol(marketId)
300
+ channel = 'book'
301
+ messageHash = channel + ':' + marketId
302
+ prec = self.safe_string(subscription, 'prec', 'P0')
303
+ isRaw = (prec == 'R0')
304
+ # if it is an initial snapshot
305
+ if isinstance(message[1], list):
306
+ limit = self.safe_integer(subscription, 'len')
307
+ if isRaw:
308
+ # raw order books
309
+ self.orderbooks[symbol] = self.indexed_order_book({}, limit)
310
+ else:
311
+ # P0, P1, P2, P3, P4
312
+ self.orderbooks[symbol] = self.counted_order_book({}, limit)
313
+ orderbook = self.orderbooks[symbol]
314
+ if isRaw:
315
+ deltas = message[1]
316
+ for i in range(0, len(deltas)):
317
+ delta = deltas[i]
318
+ id = self.safe_string(delta, 0)
319
+ price = self.safe_float(delta, 1)
320
+ delta2Value = delta[2]
321
+ size = -delta2Value if (delta2Value < 0) else delta2Value
322
+ side = 'asks' if (delta2Value < 0) else 'bids'
323
+ bookside = orderbook[side]
324
+ bookside.storeArray([price, size, id])
325
+ else:
326
+ deltas = message[1]
327
+ for i in range(0, len(deltas)):
328
+ delta = deltas[i]
329
+ delta2 = delta[2]
330
+ size = -delta2 if (delta2 < 0) else delta2
331
+ side = 'asks' if (delta2 < 0) else 'bids'
332
+ countedBookSide = orderbook[side]
333
+ countedBookSide.storeArray([delta[0], size, delta[1]])
334
+ client.resolve(orderbook, messageHash)
335
+ else:
336
+ orderbook = self.orderbooks[symbol]
337
+ if isRaw:
338
+ id = self.safe_string(message, 1)
339
+ price = self.safe_string(message, 2)
340
+ message3 = message[3]
341
+ size = -message3 if (message3 < 0) else message3
342
+ side = 'asks' if (message3 < 0) else 'bids'
343
+ bookside = orderbook[side]
344
+ # price = 0 means that you have to remove the order from your book
345
+ amount = size if Precise.string_gt(price, '0') else '0'
346
+ bookside.storeArray([self.parse_number(price), self.parse_number(amount), id])
347
+ else:
348
+ message3Value = message[3]
349
+ size = -message3Value if (message3Value < 0) else message3Value
350
+ side = 'asks' if (message3Value < 0) else 'bids'
351
+ countedBookSide = orderbook[side]
352
+ countedBookSide.storeArray([message[1], size, message[2]])
353
+ client.resolve(orderbook, messageHash)
354
+
355
+ def handle_heartbeat(self, client: Client, message):
356
+ #
357
+ # every second(approx) if no other updates are sent
358
+ #
359
+ # {"event": "heartbeat"}
360
+ #
361
+ event = self.safe_string(message, 'event')
362
+ client.resolve(message, event)
363
+
364
+ def handle_system_status(self, client: Client, message):
365
+ #
366
+ # todo: answer the question whether handleSystemStatus should be renamed
367
+ # and unified for any usage pattern that
368
+ # involves system status and maintenance updates
369
+ #
370
+ # {
371
+ # "event": "info",
372
+ # "version": 2,
373
+ # "serverId": "e293377e-7bb7-427e-b28c-5db045b2c1d1",
374
+ # "platform": {status: 1}, # 1 for operative, 0 for maintenance
375
+ # }
376
+ #
377
+ return message
378
+
379
+ def handle_subscription_status(self, client: Client, message):
380
+ #
381
+ # {
382
+ # "event": "subscribed",
383
+ # "channel": "book",
384
+ # "chanId": 67473,
385
+ # "symbol": "tBTCUSD",
386
+ # "prec": "P0",
387
+ # "freq": "F0",
388
+ # "len": "25",
389
+ # "pair": "BTCUSD"
390
+ # }
391
+ #
392
+ channelId = self.safe_string(message, 'chanId')
393
+ client.subscriptions[channelId] = message
394
+ return message
395
+
396
+ async def authenticate(self, params={}):
397
+ url = self.urls['api']['ws']['private']
398
+ client = self.client(url)
399
+ future = client.future('authenticated')
400
+ method = 'auth'
401
+ authenticated = self.safe_value(client.subscriptions, method)
402
+ if authenticated is None:
403
+ nonce = self.milliseconds()
404
+ payload = 'AUTH' + str(nonce)
405
+ signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha384, 'hex')
406
+ request: dict = {
407
+ 'apiKey': self.apiKey,
408
+ 'authSig': signature,
409
+ 'authNonce': nonce,
410
+ 'authPayload': payload,
411
+ 'event': method,
412
+ 'filter': [
413
+ 'trading',
414
+ 'wallet',
415
+ ],
416
+ }
417
+ self.spawn(self.watch, url, method, request, 1)
418
+ return await future
419
+
420
+ def handle_authentication_message(self, client: Client, message):
421
+ status = self.safe_string(message, 'status')
422
+ if status == 'OK':
423
+ # we resolve the future here permanently so authentication only happens once
424
+ future = self.safe_value(client.futures, 'authenticated')
425
+ future.resolve(True)
426
+ else:
427
+ error = AuthenticationError(self.json(message))
428
+ client.reject(error, 'authenticated')
429
+ # allows further authentication attempts
430
+ method = self.safe_string(message, 'event')
431
+ if method in client.subscriptions:
432
+ del client.subscriptions[method]
433
+
434
+ async def watch_order(self, id, symbol: Str = None, params={}):
435
+ await self.load_markets()
436
+ url = self.urls['api']['ws']['private']
437
+ await self.authenticate()
438
+ return await self.watch(url, id, None, 1)
439
+
440
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
441
+ """
442
+ watches information on multiple orders made by the user
443
+
444
+ https://docs.bitfinex.com/v1/reference/ws-auth-order-updates
445
+ https://docs.bitfinex.com/v1/reference/ws-auth-order-snapshots
446
+
447
+ :param str symbol: unified market symbol of the market orders were made in
448
+ :param int [since]: the earliest time in ms to fetch orders for
449
+ :param int [limit]: the maximum number of order structures to retrieve
450
+ :param dict [params]: extra parameters specific to the exchange API endpoint
451
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
452
+ """
453
+ await self.load_markets()
454
+ await self.authenticate()
455
+ if symbol is not None:
456
+ symbol = self.symbol(symbol)
457
+ url = self.urls['api']['ws']['private']
458
+ orders = await self.watch(url, 'os', None, 1)
459
+ if self.newUpdates:
460
+ limit = orders.getLimit(symbol, limit)
461
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
462
+
463
+ def handle_orders(self, client: Client, message, subscription):
464
+ #
465
+ # order snapshot
466
+ #
467
+ # [
468
+ # 0,
469
+ # "os",
470
+ # [
471
+ # [
472
+ # 45287766631,
473
+ # "ETHUST",
474
+ # -0.07,
475
+ # -0.07,
476
+ # "EXCHANGE LIMIT",
477
+ # "ACTIVE",
478
+ # 210,
479
+ # 0,
480
+ # "2020-05-16T13:17:46Z",
481
+ # 0,
482
+ # 0,
483
+ # 0
484
+ # ]
485
+ # ]
486
+ # ]
487
+ #
488
+ # order cancel
489
+ #
490
+ # [
491
+ # 0,
492
+ # "oc",
493
+ # [
494
+ # 45287766631,
495
+ # "ETHUST",
496
+ # -0.07,
497
+ # -0.07,
498
+ # "EXCHANGE LIMIT",
499
+ # "CANCELED",
500
+ # 210,
501
+ # 0,
502
+ # "2020-05-16T13:17:46Z",
503
+ # 0,
504
+ # 0,
505
+ # 0,
506
+ # ]
507
+ # ]
508
+ #
509
+ data = self.safe_value(message, 2, [])
510
+ messageType = self.safe_string(message, 1)
511
+ if messageType == 'os':
512
+ for i in range(0, len(data)):
513
+ value = data[i]
514
+ self.handle_order(client, value)
515
+ else:
516
+ self.handle_order(client, data)
517
+ if self.orders is not None:
518
+ client.resolve(self.orders, 'os')
519
+
520
+ def parse_ws_order_status(self, status):
521
+ statuses: dict = {
522
+ 'ACTIVE': 'open',
523
+ 'CANCELED': 'canceled',
524
+ }
525
+ return self.safe_string(statuses, status, status)
526
+
527
+ def handle_order(self, client: Client, order):
528
+ # [45287766631,
529
+ # "ETHUST",
530
+ # -0.07,
531
+ # -0.07,
532
+ # "EXCHANGE LIMIT",
533
+ # "CANCELED",
534
+ # 210,
535
+ # 0,
536
+ # "2020-05-16T13:17:46Z",
537
+ # 0,
538
+ # 0,
539
+ # 0]
540
+ id = self.safe_string(order, 0)
541
+ marketId = self.safe_string(order, 1)
542
+ symbol = self.safe_symbol(marketId)
543
+ amount = self.safe_string(order, 2)
544
+ remaining = self.safe_string(order, 3)
545
+ side = 'buy'
546
+ if Precise.string_lt(amount, '0'):
547
+ amount = Precise.string_abs(amount)
548
+ remaining = Precise.string_abs(remaining)
549
+ side = 'sell'
550
+ type = self.safe_string(order, 4)
551
+ if type.find('LIMIT') > -1:
552
+ type = 'limit'
553
+ elif type.find('MARKET') > -1:
554
+ type = 'market'
555
+ status = self.parse_ws_order_status(self.safe_string(order, 5))
556
+ price = self.safe_string(order, 6)
557
+ rawDatetime = self.safe_string(order, 8)
558
+ timestamp = self.parse8601(rawDatetime)
559
+ parsed = self.safe_order({
560
+ 'info': order,
561
+ 'id': id,
562
+ 'clientOrderId': None,
563
+ 'timestamp': timestamp,
564
+ 'datetime': self.iso8601(timestamp),
565
+ 'lastTradeTimestamp': None,
566
+ 'symbol': symbol,
567
+ 'type': type,
568
+ 'side': side,
569
+ 'price': price,
570
+ 'stopPrice': None,
571
+ 'triggerPrice': None,
572
+ 'average': None,
573
+ 'amount': amount,
574
+ 'remaining': remaining,
575
+ 'filled': None,
576
+ 'status': status,
577
+ 'fee': None,
578
+ 'cost': None,
579
+ 'trades': None,
580
+ })
581
+ if self.orders is None:
582
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
583
+ self.orders = ArrayCacheBySymbolById(limit)
584
+ orders = self.orders
585
+ orders.append(parsed)
586
+ client.resolve(parsed, id)
587
+ return parsed
588
+
589
+ def handle_message(self, client: Client, message):
590
+ if isinstance(message, list):
591
+ channelId = self.safe_string(message, 0)
592
+ #
593
+ # [
594
+ # 1231,
595
+ # "hb",
596
+ # ]
597
+ #
598
+ if message[1] == 'hb':
599
+ return # skip heartbeats within subscription channels for now
600
+ subscription = self.safe_value(client.subscriptions, channelId, {})
601
+ channel = self.safe_string(subscription, 'channel')
602
+ name = self.safe_string(message, 1)
603
+ methods: dict = {
604
+ 'book': self.handle_order_book,
605
+ # 'ohlc': self.handleOHLCV,
606
+ 'ticker': self.handle_ticker,
607
+ 'trades': self.handle_trades,
608
+ 'os': self.handle_orders,
609
+ 'on': self.handle_orders,
610
+ 'oc': self.handle_orders,
611
+ }
612
+ method = self.safe_value_2(methods, channel, name)
613
+ if method is not None:
614
+ method(client, message, subscription)
615
+ else:
616
+ # todo add bitfinex handleErrorMessage
617
+ #
618
+ # {
619
+ # "event": "info",
620
+ # "version": 2,
621
+ # "serverId": "e293377e-7bb7-427e-b28c-5db045b2c1d1",
622
+ # "platform": {status: 1}, # 1 for operative, 0 for maintenance
623
+ # }
624
+ #
625
+ event = self.safe_string(message, 'event')
626
+ if event is not None:
627
+ methods: dict = {
628
+ 'info': self.handle_system_status,
629
+ # 'book': 'handleOrderBook',
630
+ 'subscribed': self.handle_subscription_status,
631
+ 'auth': self.handle_authentication_message,
632
+ }
633
+ method = self.safe_value(methods, event)
634
+ if method is not None:
635
+ method(client, message)