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/defx.py ADDED
@@ -0,0 +1,832 @@
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, ArrayCacheByTimestamp
8
+ from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.async_support.base.ws.client import Client
10
+ from typing import List
11
+ from typing import Any
12
+ from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import ArgumentsRequired
14
+
15
+
16
+ class defx(ccxt.async_support.defx):
17
+
18
+ def describe(self):
19
+ return self.deep_extend(super(defx, self).describe(), {
20
+ 'has': {
21
+ 'ws': True,
22
+ 'watchBalance': True,
23
+ 'watchTicker': True,
24
+ 'watchTickers': True,
25
+ 'watchBidsAsks': True,
26
+ 'watchTrades': True,
27
+ 'watchTradesForSymbols': True,
28
+ 'watchMyTrades': False,
29
+ 'watchOrders': True,
30
+ 'watchOrderBook': True,
31
+ 'watchOrderBookForSymbols': True,
32
+ 'watchOHLCV': True,
33
+ 'watchOHLCVForSymbols': True,
34
+ },
35
+ 'urls': {
36
+ 'test': {
37
+ 'ws': {
38
+ 'public': 'wss://stream.testnet.defx.com/pricefeed',
39
+ 'private': 'wss://ws.testnet.defx.com/user',
40
+ },
41
+ },
42
+ 'api': {
43
+ 'ws': {
44
+ 'public': 'wss://marketfeed.api.defx.com/pricefeed',
45
+ 'private': 'wss://userfeed.api.defx.com/user',
46
+ },
47
+ },
48
+ },
49
+ 'options': {
50
+ 'listenKeyRefreshRate': 3540000, # 1 hour(59 mins so we have 1min to renew the token)
51
+ 'ws': {
52
+ 'timeframes': {
53
+ '1m': '1m',
54
+ '3m': '3m',
55
+ '5m': '5m',
56
+ '15m': '15m',
57
+ '30m': '30m',
58
+ '1h': '1h',
59
+ '2h': '2h',
60
+ '4h': '4h',
61
+ '12h': '12h',
62
+ '1d': '1d',
63
+ '1w': '1w',
64
+ '1M': '1M',
65
+ },
66
+ },
67
+ },
68
+ 'streaming': {
69
+ },
70
+ 'exceptions': {
71
+ },
72
+ })
73
+
74
+ async def watch_public(self, topics, messageHashes, params={}):
75
+ await self.load_markets()
76
+ url = self.urls['api']['ws']['public']
77
+ request: dict = {
78
+ 'method': 'SUBSCRIBE',
79
+ 'topics': topics,
80
+ }
81
+ message = self.extend(request, params)
82
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
83
+
84
+ async def un_watch_public(self, topics, messageHashes, params={}):
85
+ await self.load_markets()
86
+ url = self.urls['api']['ws']['public']
87
+ request: dict = {
88
+ 'method': 'UNSUBSCRIBE',
89
+ 'topics': topics,
90
+ }
91
+ message = self.extend(request, params)
92
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
93
+
94
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
95
+ """
96
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
97
+
98
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
99
+
100
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
101
+ :param str timeframe: the length of time each candle represents
102
+ :param int [since]: timestamp in ms of the earliest candle to fetch
103
+ :param int [limit]: the maximum amount of candles to fetch
104
+ :param dict [params]: extra parameters specific to the exchange API endpoint
105
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
106
+ """
107
+ result = await self.watch_ohlcv_for_symbols([[symbol, timeframe]], since, limit, params)
108
+ return result[symbol][timeframe]
109
+
110
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
111
+ """
112
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
113
+
114
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
115
+
116
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
117
+ :param str timeframe: the length of time each candle represents
118
+ :param dict [params]: extra parameters specific to the exchange API endpoint
119
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
120
+ """
121
+ return await self.un_watch_ohlcv_for_symbols([[symbol, timeframe]], params)
122
+
123
+ async def watch_ohlcv_for_symbols(self, symbolsAndTimeframes: List[List[str]], since: Int = None, limit: Int = None, params={}):
124
+ """
125
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
126
+
127
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
128
+
129
+ :param str[][] symbolsAndTimeframes: array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
130
+ :param int [since]: timestamp in ms of the earliest candle to fetch
131
+ :param int [limit]: the maximum amount of candles to fetch
132
+ :param dict [params]: extra parameters specific to the exchange API endpoint
133
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
134
+ """
135
+ symbolsLength = len(symbolsAndTimeframes)
136
+ if symbolsLength == 0 or not isinstance(symbolsAndTimeframes[0], list):
137
+ raise ArgumentsRequired(self.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]")
138
+ await self.load_markets()
139
+ topics = []
140
+ messageHashes = []
141
+ for i in range(0, len(symbolsAndTimeframes)):
142
+ symbolAndTimeframe = symbolsAndTimeframes[i]
143
+ marketId = self.safe_string(symbolAndTimeframe, 0)
144
+ market = self.market(marketId)
145
+ tf = self.safe_string(symbolAndTimeframe, 1)
146
+ interval = self.safe_string(self.timeframes, tf, tf)
147
+ topics.append('symbol:' + market['id'] + ':ohlc:' + interval)
148
+ messageHashes.append('candles:' + interval + ':' + market['symbol'])
149
+ symbol, timeframe, candles = await self.watch_public(topics, messageHashes, params)
150
+ if self.newUpdates:
151
+ limit = candles.getLimit(symbol, limit)
152
+ filtered = self.filter_by_since_limit(candles, since, limit, 0, True)
153
+ return self.create_ohlcv_object(symbol, timeframe, filtered)
154
+
155
+ async def un_watch_ohlcv_for_symbols(self, symbolsAndTimeframes: List[List[str]], params={}) -> Any:
156
+ """
157
+ unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
158
+
159
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
160
+
161
+ :param str[][] symbolsAndTimeframes: array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
162
+ :param dict [params]: extra parameters specific to the exchange API endpoint
163
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
164
+ """
165
+ symbolsLength = len(symbolsAndTimeframes)
166
+ if symbolsLength == 0 or not isinstance(symbolsAndTimeframes[0], list):
167
+ raise ArgumentsRequired(self.id + " unWatchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]")
168
+ await self.load_markets()
169
+ topics = []
170
+ messageHashes = []
171
+ for i in range(0, len(symbolsAndTimeframes)):
172
+ symbolAndTimeframe = symbolsAndTimeframes[i]
173
+ marketId = self.safe_string(symbolAndTimeframe, 0)
174
+ market = self.market(marketId)
175
+ tf = self.safe_string(symbolAndTimeframe, 1)
176
+ interval = self.safe_string(self.timeframes, tf, tf)
177
+ topics.append('symbol:' + market['id'] + ':ohlc:' + interval)
178
+ messageHashes.append('candles:' + interval + ':' + market['symbol'])
179
+ return await self.un_watch_public(topics, messageHashes, params)
180
+
181
+ def handle_ohlcv(self, client: Client, message):
182
+ #
183
+ # {
184
+ # "topic": "symbol:BTC_USDC:ohlc:3m",
185
+ # "event": "ohlc",
186
+ # "timestamp": 1730794277104,
187
+ # "data": {
188
+ # "symbol": "BTC_USDC",
189
+ # "window": "3m",
190
+ # "open": "57486.90000000",
191
+ # "high": "57486.90000000",
192
+ # "low": "57486.90000000",
193
+ # "close": "57486.90000000",
194
+ # "volume": "0.000",
195
+ # "quoteAssetVolume": "0.00000000",
196
+ # "takerBuyAssetVolume": "0.000",
197
+ # "takerBuyQuoteAssetVolume": "0.00000000",
198
+ # "numberOfTrades": 0,
199
+ # "start": 1730794140000,
200
+ # "end": 1730794320000,
201
+ # "isClosed": False
202
+ # }
203
+ # }
204
+ #
205
+ data = self.safe_dict(message, 'data', {})
206
+ marketId = self.safe_string(data, 'symbol')
207
+ market = self.market(marketId)
208
+ symbol = market['symbol']
209
+ timeframe = self.safe_string(data, 'window')
210
+ if not (symbol in self.ohlcvs):
211
+ self.ohlcvs[symbol] = {}
212
+ if not (timeframe in self.ohlcvs[symbol]):
213
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
214
+ stored = ArrayCacheByTimestamp(limit)
215
+ self.ohlcvs[symbol][timeframe] = stored
216
+ ohlcv = self.ohlcvs[symbol][timeframe]
217
+ parsed = self.parse_ohlcv(data)
218
+ ohlcv.append(parsed)
219
+ messageHash = 'candles:' + timeframe + ':' + symbol
220
+ client.resolve([symbol, timeframe, ohlcv], messageHash)
221
+
222
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
223
+ """
224
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
225
+
226
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
227
+
228
+ :param str symbol: unified symbol of the market to fetch the ticker for
229
+ :param dict [params]: extra parameters specific to the exchange API endpoint
230
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
231
+ """
232
+ await self.load_markets()
233
+ market = self.market(symbol)
234
+ symbol = market['symbol']
235
+ topic = 'symbol:' + market['id'] + ':24hrTicker'
236
+ messageHash = 'ticker:' + symbol
237
+ return await self.watch_public([topic], [messageHash], params)
238
+
239
+ async def un_watch_ticker(self, symbol: str, params={}) -> Any:
240
+ """
241
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
242
+
243
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
244
+
245
+ :param str symbol: unified symbol of the market to fetch the ticker for
246
+ :param dict [params]: extra parameters specific to the exchange API endpoint
247
+ :param str [params.channel]: the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
248
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
249
+ """
250
+ return await self.un_watch_tickers([symbol], params)
251
+
252
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
253
+ """
254
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
255
+
256
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
257
+
258
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
259
+ :param dict [params]: extra parameters specific to the exchange API endpoint
260
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
261
+ """
262
+ await self.load_markets()
263
+ symbols = self.market_symbols(symbols, None, False)
264
+ topics = []
265
+ messageHashes = []
266
+ for i in range(0, len(symbols)):
267
+ symbol = symbols[i]
268
+ marketId = self.market_id(symbol)
269
+ topics.append('symbol:' + marketId + ':24hrTicker')
270
+ messageHashes.append('ticker:' + symbol)
271
+ await self.watch_public(topics, messageHashes, params)
272
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
273
+
274
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
275
+ """
276
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
277
+
278
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
279
+
280
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
281
+ :param dict [params]: extra parameters specific to the exchange API endpoint
282
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
283
+ """
284
+ await self.load_markets()
285
+ symbols = self.market_symbols(symbols, None, False)
286
+ topics = []
287
+ messageHashes = []
288
+ for i in range(0, len(symbols)):
289
+ symbol = symbols[i]
290
+ marketId = self.market_id(symbol)
291
+ topics.append('symbol:' + marketId + ':24hrTicker')
292
+ messageHashes.append('ticker:' + symbol)
293
+ return await self.un_watch_public(topics, messageHashes, params)
294
+
295
+ def handle_ticker(self, client: Client, message):
296
+ #
297
+ # {
298
+ # "topic": "symbol:BTC_USDC:24hrTicker",
299
+ # "event": "24hrTicker",
300
+ # "timestamp": 1730862543095,
301
+ # "data": {
302
+ # "symbol": "BTC_USDC",
303
+ # "priceChange": "17114.70000000",
304
+ # "priceChangePercent": "29.77",
305
+ # "weightedAvgPrice": "6853147668",
306
+ # "lastPrice": "74378.90000000",
307
+ # "lastQty": "0.107",
308
+ # "bestBidPrice": "61987.60000000",
309
+ # "bestBidQty": "0.005",
310
+ # "bestAskPrice": "84221.60000000",
311
+ # "bestAskQty": "0.015",
312
+ # "openPrice": "57486.90000000",
313
+ # "highPrice": "88942.60000000",
314
+ # "lowPrice": "47364.20000000",
315
+ # "volume": "28.980",
316
+ # "quoteVolume": "1986042.19424035",
317
+ # "openTime": 1730776080000,
318
+ # "closeTime": 1730862540000,
319
+ # "openInterestBase": "67.130",
320
+ # "openInterestQuote": "5008005.40800000"
321
+ # }
322
+ # }
323
+ #
324
+ self.handle_bid_ask(client, message)
325
+ data = self.safe_dict(message, 'data', {})
326
+ parsedTicker = self.parse_ticker(data)
327
+ symbol = parsedTicker['symbol']
328
+ timestamp = self.safe_integer(message, 'timestamp')
329
+ parsedTicker['timestamp'] = timestamp
330
+ parsedTicker['datetime'] = self.iso8601(timestamp)
331
+ self.tickers[symbol] = parsedTicker
332
+ messageHash = 'ticker:' + symbol
333
+ client.resolve(parsedTicker, messageHash)
334
+
335
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
336
+ """
337
+ watches best bid & ask for symbols
338
+
339
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
340
+
341
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
342
+ :param dict [params]: extra parameters specific to the exchange API endpoint
343
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
344
+ """
345
+ await self.load_markets()
346
+ symbols = self.market_symbols(symbols, None, False)
347
+ topics = []
348
+ messageHashes = []
349
+ for i in range(0, len(symbols)):
350
+ symbol = symbols[i]
351
+ marketId = self.market_id(symbol)
352
+ topics.append('symbol:' + marketId + ':24hrTicker')
353
+ messageHashes.append('bidask:' + symbol)
354
+ await self.watch_public(topics, messageHashes, params)
355
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
356
+
357
+ def handle_bid_ask(self, client: Client, message):
358
+ data = self.safe_dict(message, 'data', {})
359
+ parsedTicker = self.parse_ws_bid_ask(data)
360
+ symbol = parsedTicker['symbol']
361
+ timestamp = self.safe_integer(message, 'timestamp')
362
+ parsedTicker['timestamp'] = timestamp
363
+ parsedTicker['datetime'] = self.iso8601(timestamp)
364
+ self.bidsasks[symbol] = parsedTicker
365
+ messageHash = 'bidask:' + symbol
366
+ client.resolve(parsedTicker, messageHash)
367
+
368
+ def parse_ws_bid_ask(self, ticker, market=None):
369
+ marketId = self.safe_string(ticker, 'symbol')
370
+ market = self.safe_market(marketId, market)
371
+ symbol = self.safe_string(market, 'symbol')
372
+ return self.safe_ticker({
373
+ 'symbol': symbol,
374
+ 'timestamp': None,
375
+ 'datetime': None,
376
+ 'ask': self.safe_string(ticker, 'bestAskPrice'),
377
+ 'askVolume': self.safe_string(ticker, 'bestAskQty'),
378
+ 'bid': self.safe_string(ticker, 'bestBidPrice'),
379
+ 'bidVolume': self.safe_string(ticker, 'bestBidQty'),
380
+ 'info': ticker,
381
+ }, market)
382
+
383
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
384
+ """
385
+ watches information on multiple trades made in a market
386
+
387
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
388
+
389
+ :param str symbol: unified symbol of the market to fetch the ticker for
390
+ :param int [since]: the earliest time in ms to fetch trades for
391
+ :param int [limit]: the maximum number of trade structures to retrieve
392
+ :param dict [params]: extra parameters specific to the exchange API endpoint
393
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
394
+ """
395
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
396
+
397
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
398
+ """
399
+ unWatches from the stream channel
400
+
401
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
402
+
403
+ :param str symbol: unified symbol of the market to fetch trades for
404
+ :param dict [params]: extra parameters specific to the exchange API endpoint
405
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
406
+ """
407
+ return await self.un_watch_trades_for_symbols([symbol], params)
408
+
409
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
410
+ """
411
+ watches information on multiple trades made in a market
412
+
413
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
414
+
415
+ :param str[] symbols: unified symbol of the market to fetch trades for
416
+ :param int [since]: the earliest time in ms to fetch trades for
417
+ :param int [limit]: the maximum number of trade structures to retrieve
418
+ :param dict [params]: extra parameters specific to the exchange API endpoint
419
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
420
+ """
421
+ await self.load_markets()
422
+ symbols = self.market_symbols(symbols)
423
+ symbolsLength = len(symbols)
424
+ if symbolsLength == 0:
425
+ raise ArgumentsRequired(self.id + ' watchTradesForSymbols() requires a non-empty array of symbols')
426
+ topics = []
427
+ messageHashes = []
428
+ for i in range(0, len(symbols)):
429
+ symbol = symbols[i]
430
+ marketId = self.market_id(symbol)
431
+ topics.append('symbol:' + marketId + ':trades')
432
+ messageHashes.append('trade:' + symbol)
433
+ trades = await self.watch_public(topics, messageHashes, params)
434
+ if self.newUpdates:
435
+ first = self.safe_value(trades, 0)
436
+ tradeSymbol = self.safe_string(first, 'symbol')
437
+ limit = trades.getLimit(tradeSymbol, limit)
438
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
439
+
440
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
441
+ """
442
+ unWatches from the stream channel
443
+
444
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
445
+
446
+ :param str[] symbols: unified symbol of the market to fetch trades for
447
+ :param dict [params]: extra parameters specific to the exchange API endpoint
448
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
449
+ """
450
+ await self.load_markets()
451
+ symbols = self.market_symbols(symbols)
452
+ symbolsLength = len(symbols)
453
+ if symbolsLength == 0:
454
+ raise ArgumentsRequired(self.id + ' unWatchTradesForSymbols() requires a non-empty array of symbols')
455
+ topics = []
456
+ messageHashes = []
457
+ for i in range(0, len(symbols)):
458
+ symbol = symbols[i]
459
+ marketId = self.market_id(symbol)
460
+ topics.append('symbol:' + marketId + ':trades')
461
+ messageHashes.append('trade:' + symbol)
462
+ return await self.un_watch_public(topics, messageHashes, params)
463
+
464
+ def handle_trades(self, client: Client, message):
465
+ #
466
+ # {
467
+ # "topic": "symbol:SOL_USDC:trades",
468
+ # "event": "trades",
469
+ # "timestamp": 1730967426331,
470
+ # "data": {
471
+ # "buyerMaker": True,
472
+ # "price": "188.38700000",
473
+ # "qty": "1.00",
474
+ # "symbol": "SOL_USDC",
475
+ # "timestamp": 1730967426328
476
+ # }
477
+ # }
478
+ #
479
+ data = self.safe_dict(message, 'data', {})
480
+ parsedTrade = self.parse_trade(data)
481
+ symbol = parsedTrade['symbol']
482
+ if not (symbol in self.trades):
483
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
484
+ stored = ArrayCache(limit)
485
+ self.trades[symbol] = stored
486
+ trades = self.trades[symbol]
487
+ trades.append(parsedTrade)
488
+ messageHash = 'trade:' + symbol
489
+ client.resolve(trades, messageHash)
490
+
491
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
492
+ """
493
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
494
+
495
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
496
+
497
+ :param str symbol: unified symbol of the market to fetch the order book for
498
+ :param int [limit]: the maximum amount of order book entries to return
499
+ :param dict [params]: extra parameters specific to the exchange API endpoint
500
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
501
+ """
502
+ return await self.watch_order_book_for_symbols([symbol], limit, params)
503
+
504
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
505
+ """
506
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
507
+
508
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
509
+
510
+ :param str symbol: unified array of symbols
511
+ :param dict [params]: extra parameters specific to the exchange API endpoint
512
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
513
+ """
514
+ return await self.un_watch_order_book_for_symbols([symbol], params)
515
+
516
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
517
+ """
518
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
519
+
520
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
521
+
522
+ :param str[] symbols: unified array of symbols
523
+ :param int [limit]: the maximum amount of order book entries to return
524
+ :param dict [params]: extra parameters specific to the exchange API endpoint
525
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
526
+ """
527
+ await self.load_markets()
528
+ symbolsLength = len(symbols)
529
+ if symbolsLength == 0:
530
+ raise ArgumentsRequired(self.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols')
531
+ symbols = self.market_symbols(symbols)
532
+ topics = []
533
+ messageHashes = []
534
+ for i in range(0, len(symbols)):
535
+ symbol = symbols[i]
536
+ marketId = self.market_id(symbol)
537
+ topics.append('symbol:' + marketId + ':depth:20:0.001')
538
+ messageHashes.append('orderbook:' + symbol)
539
+ orderbook = await self.watch_public(topics, messageHashes, params)
540
+ return orderbook.limit()
541
+
542
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
543
+ """
544
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
545
+
546
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
547
+
548
+ :param str[] symbols: unified array of symbols
549
+ :param dict [params]: extra parameters specific to the exchange API endpoint
550
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
551
+ """
552
+ await self.load_markets()
553
+ symbolsLength = len(symbols)
554
+ if symbolsLength == 0:
555
+ raise ArgumentsRequired(self.id + ' unWatchOrderBookForSymbols() requires a non-empty array of symbols')
556
+ symbols = self.market_symbols(symbols)
557
+ topics = []
558
+ messageHashes = []
559
+ for i in range(0, len(symbols)):
560
+ symbol = symbols[i]
561
+ marketId = self.market_id(symbol)
562
+ topics.append('symbol:' + marketId + ':depth:20:0.001')
563
+ messageHashes.append('orderbook:' + symbol)
564
+ return await self.un_watch_public(topics, messageHashes, params)
565
+
566
+ def handle_order_book(self, client: Client, message):
567
+ #
568
+ # {
569
+ # "topic": "symbol:SOL_USDC:depth:20:0.01",
570
+ # "event": "depth",
571
+ # "timestamp": 1731030695319,
572
+ # "data": {
573
+ # "symbol": "SOL_USDC",
574
+ # "timestamp": 1731030695319,
575
+ # "lastTradeTimestamp": 1731030275258,
576
+ # "level": "20",
577
+ # "slab": "0.01",
578
+ # "bids": [
579
+ # {
580
+ # "price": "198.27000000",
581
+ # "qty": "1.52"
582
+ # }
583
+ # ],
584
+ # "asks": [
585
+ # {
586
+ # "price": "198.44000000",
587
+ # "qty": "6.61"
588
+ # }
589
+ # ]
590
+ # }
591
+ # }
592
+ #
593
+ data = self.safe_dict(message, 'data', {})
594
+ marketId = self.safe_string(data, 'symbol')
595
+ market = self.market(marketId)
596
+ symbol = market['symbol']
597
+ timestamp = self.safe_integer(data, 'timestamp')
598
+ snapshot = self.parse_order_book(data, symbol, timestamp, 'bids', 'asks', 'price', 'qty')
599
+ if not (symbol in self.orderbooks):
600
+ ob = self.order_book(snapshot)
601
+ self.orderbooks[symbol] = ob
602
+ orderbook = self.orderbooks[symbol]
603
+ orderbook.reset(snapshot)
604
+ messageHash = 'orderbook:' + symbol
605
+ client.resolve(orderbook, messageHash)
606
+
607
+ async def keep_alive_listen_key(self, params={}):
608
+ listenKey = self.safe_string(self.options, 'listenKey')
609
+ if listenKey is None:
610
+ # A network error happened: we can't renew a listen key that does not exist.
611
+ return
612
+ try:
613
+ await self.v1PrivatePutApiUsersSocketListenKeysListenKey({'listenKey': listenKey}) # self.extend the expiry
614
+ except Exception as error:
615
+ url = self.urls['api']['ws']['private'] + '?listenKey=' + listenKey
616
+ client = self.client(url)
617
+ messageHashes = list(client.futures.keys())
618
+ for j in range(0, len(messageHashes)):
619
+ messageHash = messageHashes[j]
620
+ client.reject(error, messageHash)
621
+ self.options['listenKey'] = None
622
+ self.options['lastAuthenticatedTime'] = 0
623
+ return
624
+ # whether or not to schedule another listenKey keepAlive request
625
+ listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 3540000)
626
+ self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, params)
627
+
628
+ async def authenticate(self, params={}):
629
+ time = self.milliseconds()
630
+ lastAuthenticatedTime = self.safe_integer(self.options, 'lastAuthenticatedTime', 0)
631
+ listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 3540000) # 1 hour
632
+ if time - lastAuthenticatedTime > listenKeyRefreshRate:
633
+ response = await self.v1PrivatePostApiUsersSocketListenKeys()
634
+ self.options['listenKey'] = self.safe_string(response, 'listenKey')
635
+ self.options['lastAuthenticatedTime'] = time
636
+ self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, params)
637
+
638
+ async def watch_balance(self, params={}) -> Balances:
639
+ """
640
+ query for balance and get the amount of funds available for trading or funds locked in orders
641
+
642
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
643
+
644
+ :param dict [params]: extra parameters specific to the exchange API endpoint
645
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
646
+ """
647
+ await self.load_markets()
648
+ await self.authenticate()
649
+ baseUrl = self.urls['api']['ws']['private']
650
+ messageHash = 'WALLET_BALANCE_UPDATE'
651
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
652
+ return await self.watch(url, messageHash, None, messageHash)
653
+
654
+ def handle_balance(self, client: Client, message):
655
+ #
656
+ # {
657
+ # "event": "WALLET_BALANCE_UPDATE",
658
+ # "timestamp": 1711015961397,
659
+ # "data": {
660
+ # "asset": "USDC", "balance": "27.64712963"
661
+ # }
662
+ # }
663
+ #
664
+ messageHash = self.safe_string(message, 'event')
665
+ data = self.safe_dict(message, 'data', [])
666
+ timestamp = self.safe_integer(message, 'timestamp')
667
+ if self.balance is None:
668
+ self.balance = {}
669
+ self.balance['info'] = data
670
+ self.balance['timestamp'] = timestamp
671
+ self.balance['datetime'] = self.iso8601(timestamp)
672
+ currencyId = self.safe_string(data, 'asset')
673
+ code = self.safe_currency_code(currencyId)
674
+ account = self.balance[code] if (code in self.balance) else self.account()
675
+ account['free'] = self.safe_string(data, 'balance')
676
+ self.balance[code] = account
677
+ self.balance = self.safe_balance(self.balance)
678
+ client.resolve(self.balance, messageHash)
679
+
680
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
681
+ """
682
+ watches information on multiple orders made by the user
683
+
684
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
685
+
686
+ :param str [symbol]: unified market symbol of the market the orders were made in
687
+ :param int [since]: the earliest time in ms to fetch orders for
688
+ :param int [limit]: the maximum number of order structures to retrieve
689
+ :param dict [params]: extra parameters specific to the exchange API endpoint
690
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
691
+ """
692
+ await self.load_markets()
693
+ await self.authenticate()
694
+ baseUrl = self.urls['api']['ws']['private']
695
+ messageHash = 'orders'
696
+ if symbol is not None:
697
+ market = self.market(symbol)
698
+ messageHash += ':' + market['symbol']
699
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
700
+ orders = await self.watch(url, messageHash, None, messageHash)
701
+ if self.newUpdates:
702
+ limit = orders.getLimit(symbol, limit)
703
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
704
+
705
+ def handle_order(self, client: Client, message):
706
+ #
707
+ # {
708
+ # "event": "ORDER_UPDATE",
709
+ # "timestamp": 1731417961446,
710
+ # "data": {
711
+ # "orderId": "766738557656630928",
712
+ # "symbol": "SOL_USDC",
713
+ # "side": "SELL",
714
+ # "type": "MARKET",
715
+ # "status": "FILLED",
716
+ # "clientOrderId": "0193208d-717b-7811-a80e-c036e220ad9b",
717
+ # "reduceOnly": False,
718
+ # "postOnly": False,
719
+ # "timeInForce": "GTC",
720
+ # "isTriggered": False,
721
+ # "createdAt": "2024-11-12T13:26:00.829Z",
722
+ # "updatedAt": "2024-11-12T13:26:01.436Z",
723
+ # "avgPrice": "209.60000000",
724
+ # "cumulativeQuote": "104.80000000",
725
+ # "totalFee": "0.05764000",
726
+ # "executedQty": "0.50",
727
+ # "origQty": "0.50",
728
+ # "role": "TAKER",
729
+ # "pnl": "0.00000000",
730
+ # "lastFillPnL": "0.00000000",
731
+ # "lastFillPrice": "209.60000000",
732
+ # "lastFillQty": "0.50",
733
+ # "linkedOrderParentType": null,
734
+ # "workingType": null
735
+ # }
736
+ # }
737
+ #
738
+ channel = 'orders'
739
+ data = self.safe_dict(message, 'data', {})
740
+ if self.orders is None:
741
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
742
+ self.orders = ArrayCacheBySymbolById(limit)
743
+ orders = self.orders
744
+ parsedOrder = self.parse_order(data)
745
+ orders.append(parsedOrder)
746
+ messageHash = channel + ':' + parsedOrder['symbol']
747
+ client.resolve(orders, channel)
748
+ client.resolve(orders, messageHash)
749
+
750
+ async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
751
+ """
752
+ watch all open positions
753
+
754
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
755
+
756
+ :param str[]|None symbols: list of unified market symbols
757
+ :param number [since]: since timestamp
758
+ :param number [limit]: limit
759
+ :param dict params: extra parameters specific to the exchange API endpoint
760
+ :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
761
+ """
762
+ await self.load_markets()
763
+ await self.authenticate()
764
+ symbols = self.market_symbols(symbols)
765
+ baseUrl = self.urls['api']['ws']['private']
766
+ channel = 'positions'
767
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
768
+ newPosition = None
769
+ if symbols is not None:
770
+ messageHashes = []
771
+ for i in range(0, len(symbols)):
772
+ symbol = symbols[i]
773
+ messageHashes.append(channel + ':' + symbol)
774
+ newPosition = await self.watch_multiple(url, messageHashes, None, messageHashes)
775
+ else:
776
+ newPosition = await self.watch(url, channel, None, channel)
777
+ if self.newUpdates:
778
+ return newPosition
779
+ return self.filter_by_symbols_since_limit(self.positions, symbols, since, limit, True)
780
+
781
+ def handle_positions(self, client, message):
782
+ #
783
+ # {
784
+ # "event": "POSITION_UPDATE",
785
+ # "timestamp": 1731417961456,
786
+ # "data": {
787
+ # "positionId": "0193208d-735d-7fe9-90bd-8bc6d6bc1eda",
788
+ # "createdAt": 1289847904328,
789
+ # "symbol": "SOL_USDC",
790
+ # "positionSide": "SHORT",
791
+ # "entryPrice": "209.60000000",
792
+ # "quantity": "0.50",
793
+ # "status": "ACTIVE",
794
+ # "marginAsset": "USDC",
795
+ # "marginAmount": "15.17475649",
796
+ # "realizedPnL": "0.00000000"
797
+ # }
798
+ # }
799
+ #
800
+ channel = 'positions'
801
+ data = self.safe_dict(message, 'data', {})
802
+ if self.positions is None:
803
+ self.positions = ArrayCacheBySymbolById()
804
+ cache = self.positions
805
+ parsedPosition = self.parse_position(data)
806
+ timestamp = self.safe_integer(message, 'timestamp')
807
+ parsedPosition['timestamp'] = timestamp
808
+ parsedPosition['datetime'] = self.iso8601(timestamp)
809
+ cache.append(parsedPosition)
810
+ messageHash = channel + ':' + parsedPosition['symbol']
811
+ client.resolve([parsedPosition], channel)
812
+ client.resolve([parsedPosition], messageHash)
813
+
814
+ def handle_message(self, client: Client, message):
815
+ error = self.safe_string(message, 'code')
816
+ if error is not None:
817
+ errorMsg = self.safe_string(message, 'msg')
818
+ raise ExchangeError(self.id + ' ' + errorMsg)
819
+ event = self.safe_string(message, 'event')
820
+ if event is not None:
821
+ methods: dict = {
822
+ 'ohlc': self.handle_ohlcv,
823
+ '24hrTicker': self.handle_ticker,
824
+ 'trades': self.handle_trades,
825
+ 'depth': self.handle_order_book,
826
+ 'WALLET_BALANCE_UPDATE': self.handle_balance,
827
+ 'ORDER_UPDATE': self.handle_order,
828
+ 'POSITION_UPDATE': self.handle_positions,
829
+ }
830
+ exacMethod = self.safe_value(methods, event)
831
+ if exacMethod is not None:
832
+ exacMethod(client, message)