ccxt 4.2.76__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 +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -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 +3513 -1511
  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 +3105 -881
  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 +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  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 +403 -150
  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 +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  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 +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  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 +1473 -464
  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 +1634 -269
  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 +1050 -355
  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 +1777 -455
  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 +1155 -295
  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 +1729 -482
  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 +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  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 +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  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 +403 -150
  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 +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  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 +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  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 +1633 -269
  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 +1050 -355
  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 +1777 -455
  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 +63 -15
  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 +204 -82
  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 +967 -661
  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 +168 -32
  309. ccxt/pro/exmo.py +253 -21
  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 +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  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 +486 -70
  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} +465 -407
  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} +465 -409
  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 +1155 -295
  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.76.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.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/upbit.py CHANGED
@@ -4,8 +4,8 @@
4
4
  # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
5
 
6
6
  import ccxt.async_support
7
- from ccxt.async_support.base.ws.cache import ArrayCache
8
- from ccxt.base.types import Int, OrderBook, Ticker, Trade
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
+ from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
11
 
@@ -18,11 +18,16 @@ class upbit(ccxt.async_support.upbit):
18
18
  'ws': True,
19
19
  'watchOrderBook': True,
20
20
  'watchTicker': True,
21
+ 'watchTickers': True,
21
22
  'watchTrades': True,
23
+ 'watchTradesForSymbols': True,
24
+ 'watchOrders': True,
25
+ 'watchMyTrades': True,
26
+ 'watchBalance': True,
22
27
  },
23
28
  'urls': {
24
29
  'api': {
25
- 'ws': 'wss://api.upbit.com/websocket/v1',
30
+ 'ws': 'wss://{hostname}/websocket/v1',
26
31
  },
27
32
  },
28
33
  'options': {
@@ -35,7 +40,9 @@ class upbit(ccxt.async_support.upbit):
35
40
  market = self.market(symbol)
36
41
  symbol = market['symbol']
37
42
  marketId = market['id']
38
- url = self.urls['api']['ws']
43
+ url = self.implode_params(self.urls['api']['ws'], {
44
+ 'hostname': self.hostname,
45
+ })
39
46
  self.options[channel] = self.safe_value(self.options, channel, {})
40
47
  self.options[channel][symbol] = True
41
48
  symbols = list(self.options[channel].keys())
@@ -54,34 +61,127 @@ class upbit(ccxt.async_support.upbit):
54
61
  messageHash = channel + ':' + marketId
55
62
  return await self.watch(url, messageHash, request, messageHash)
56
63
 
64
+ async def watch_public_multiple(self, symbols: Strings, channel, params={}):
65
+ await self.load_markets()
66
+ if symbols is None:
67
+ symbols = self.symbols
68
+ symbols = self.market_symbols(symbols)
69
+ marketIds = self.market_ids(symbols)
70
+ url = self.implode_params(self.urls['api']['ws'], {
71
+ 'hostname': self.hostname,
72
+ })
73
+ messageHashes = []
74
+ for i in range(0, len(marketIds)):
75
+ messageHashes.append(channel + ':' + marketIds[i])
76
+ request = [
77
+ {
78
+ 'ticket': self.uuid(),
79
+ },
80
+ {
81
+ 'type': channel,
82
+ 'codes': marketIds,
83
+ # 'isOnlySnapshot': False,
84
+ # 'isOnlyRealtime': False,
85
+ },
86
+ ]
87
+ return await self.watch_multiple(url, messageHashes, request, messageHashes)
88
+
57
89
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
58
90
  """
59
91
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
92
+
93
+ https://global-docs.upbit.com/reference/websocket-ticker
94
+
60
95
  :param str symbol: unified symbol of the market to fetch the ticker for
61
96
  :param dict [params]: extra parameters specific to the exchange API endpoint
62
97
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
63
98
  """
64
99
  return await self.watch_public(symbol, 'ticker')
65
100
 
101
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
102
+ """
103
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
104
+
105
+ https://global-docs.upbit.com/reference/websocket-ticker
106
+
107
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
108
+ :param dict [params]: extra parameters specific to the exchange API endpoint
109
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
110
+ """
111
+ newTickers = await self.watch_public_multiple(symbols, 'ticker')
112
+ if self.newUpdates:
113
+ tickers: dict = {}
114
+ tickers[newTickers['symbol']] = newTickers
115
+ return tickers
116
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
117
+
66
118
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
67
119
  """
68
120
  get the list of most recent trades for a particular symbol
121
+
122
+ https://global-docs.upbit.com/reference/websocket-trade
123
+
69
124
  :param str symbol: unified symbol of the market to fetch trades for
70
125
  :param int [since]: timestamp in ms of the earliest trade to fetch
71
126
  :param int [limit]: the maximum amount of trades to fetch
72
127
  :param dict [params]: extra parameters specific to the exchange API endpoint
73
128
  :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
74
129
  """
130
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
131
+
132
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
133
+ """
134
+ get the list of most recent trades for a list of symbols
135
+
136
+ https://global-docs.upbit.com/reference/websocket-trade
137
+
138
+ :param str[] symbols: unified symbol of the market to fetch trades for
139
+ :param int [since]: timestamp in ms of the earliest trade to fetch
140
+ :param int [limit]: the maximum amount of trades to fetch
141
+ :param dict [params]: extra parameters specific to the exchange API endpoint
142
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
143
+ """
75
144
  await self.load_markets()
76
- symbol = self.symbol(symbol)
77
- trades = await self.watch_public(symbol, 'trade')
145
+ symbols = self.market_symbols(symbols, None, False, True, True)
146
+ channel = 'trade'
147
+ messageHashes = []
148
+ url = self.implode_params(self.urls['api']['ws'], {
149
+ 'hostname': self.hostname,
150
+ })
151
+ if symbols is not None:
152
+ for i in range(0, len(symbols)):
153
+ market = self.market(symbols[i])
154
+ marketId = market['id']
155
+ symbol = market['symbol']
156
+ self.options[channel] = self.safe_value(self.options, channel, {})
157
+ self.options[channel][symbol] = True
158
+ messageHashes.append(channel + ':' + marketId)
159
+ optionSymbols = list(self.options[channel].keys())
160
+ marketIds = self.market_ids(optionSymbols)
161
+ request = [
162
+ {
163
+ 'ticket': self.uuid(),
164
+ },
165
+ {
166
+ 'type': channel,
167
+ 'codes': marketIds,
168
+ # 'isOnlySnapshot': False,
169
+ # 'isOnlyRealtime': False,
170
+ },
171
+ ]
172
+ trades = await self.watch_multiple(url, messageHashes, request, messageHashes)
78
173
  if self.newUpdates:
79
- limit = trades.getLimit(symbol, limit)
174
+ first = self.safe_value(trades, 0)
175
+ tradeSymbol = self.safe_string(first, 'symbol')
176
+ limit = trades.getLimit(tradeSymbol, limit)
80
177
  return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
81
178
 
82
179
  async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
83
180
  """
84
181
  watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
182
+
183
+ https://global-docs.upbit.com/reference/websocket-orderbook
184
+
85
185
  :param str symbol: unified symbol of the market to fetch the order book for
86
186
  :param int [limit]: the maximum amount of order book entries to return
87
187
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -213,11 +313,304 @@ class upbit(ccxt.async_support.upbit):
213
313
  messageHash = 'trade:' + marketId
214
314
  client.resolve(stored, messageHash)
215
315
 
316
+ async def authenticate(self, params={}):
317
+ self.check_required_credentials()
318
+ wsOptions: dict = self.safe_dict(self.options, 'ws', {})
319
+ authenticated = self.safe_string(wsOptions, 'token')
320
+ if authenticated is None:
321
+ auth: dict = {
322
+ 'access_key': self.apiKey,
323
+ 'nonce': self.uuid(),
324
+ }
325
+ token = self.jwt(auth, self.encode(self.secret), 'sha256', False)
326
+ wsOptions['token'] = token
327
+ wsOptions['options'] = {
328
+ 'headers': {
329
+ 'authorization': 'Bearer ' + token,
330
+ },
331
+ }
332
+ self.options['ws'] = wsOptions
333
+ url = self.urls['api']['ws'] + '/private'
334
+ client = self.client(url)
335
+ return client
336
+
337
+ async def watch_private(self, symbol, channel, messageHash, params={}):
338
+ await self.authenticate()
339
+ request = {
340
+ 'type': channel,
341
+ }
342
+ if symbol is not None:
343
+ await self.load_markets()
344
+ market = self.market(symbol)
345
+ symbol = market['symbol']
346
+ symbols = [symbol]
347
+ marketIds = self.market_ids(symbols)
348
+ request['codes'] = marketIds
349
+ messageHash = messageHash + ':' + symbol
350
+ url = self.implode_params(self.urls['api']['ws'], {
351
+ 'hostname': self.hostname,
352
+ })
353
+ url += '/private'
354
+ message = [
355
+ {
356
+ 'ticket': self.uuid(),
357
+ },
358
+ request,
359
+ ]
360
+ return await self.watch(url, messageHash, message, messageHash)
361
+
362
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
363
+ """
364
+ watches information on multiple orders made by the user
365
+
366
+ https://global-docs.upbit.com/reference/websocket-myorder
367
+
368
+ :param str symbol: unified market symbol of the market orders were made in
369
+ :param int [since]: the earliest time in ms to fetch orders for
370
+ :param int [limit]: the maximum number of order structures to retrieve
371
+ :param dict [params]: extra parameters specific to the exchange API endpoint
372
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
373
+ """
374
+ await self.load_markets()
375
+ channel = 'myOrder'
376
+ messageHash = 'myOrder'
377
+ orders = await self.watch_private(symbol, channel, messageHash)
378
+ if self.newUpdates:
379
+ limit = orders.getLimit(symbol, limit)
380
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
381
+
382
+ async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
383
+ """
384
+ watches information on multiple trades made by the user
385
+
386
+ https://global-docs.upbit.com/reference/websocket-myorder
387
+
388
+ :param str symbol: unified market symbol of the market orders were made in
389
+ :param int [since]: the earliest time in ms to fetch orders for
390
+ :param int [limit]: the maximum number of order structures to retrieve
391
+ :param dict [params]: extra parameters specific to the exchange API endpoint
392
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
393
+ """
394
+ await self.load_markets()
395
+ channel = 'myOrder'
396
+ messageHash = 'myTrades'
397
+ trades = await self.watch_private(symbol, channel, messageHash)
398
+ if self.newUpdates:
399
+ limit = trades.getLimit(symbol, limit)
400
+ return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
401
+
402
+ def parse_ws_order_status(self, status: Str):
403
+ statuses: dict = {
404
+ 'wait': 'open',
405
+ 'done': 'closed',
406
+ 'cancel': 'canceled',
407
+ 'watch': 'open', # not sure what self status means
408
+ 'trade': 'open',
409
+ }
410
+ return self.safe_string(statuses, status, status)
411
+
412
+ def parse_ws_order(self, order, market=None):
413
+ #
414
+ # {
415
+ # "type": "myOrder",
416
+ # "code": "SGD-XRP",
417
+ # "uuid": "ac2dc2a3-fce9-40a2-a4f6-5987c25c438f",
418
+ # "ask_bid": "BID",
419
+ # "order_type": "limit",
420
+ # "state": "trade",
421
+ # "price": 0.001453,
422
+ # "avg_price": 0.00145372,
423
+ # "volume": 30925891.29839369,
424
+ # "remaining_volume": 29968038.09235948,
425
+ # "executed_volume": 30925891.29839369,
426
+ # "trades_count": 1,
427
+ # "reserved_fee": 44.23943970238218,
428
+ # "remaining_fee": 21.77177967409916,
429
+ # "paid_fee": 22.467660028283017,
430
+ # "locked": 43565.33112787242,
431
+ # "executed_funds": 44935.32005656603,
432
+ # "order_timestamp": 1710751590000,
433
+ # "timestamp": 1710751597500,
434
+ # "stream_type": "REALTIME"
435
+ # }
436
+ #
437
+ id = self.safe_string(order, 'uuid')
438
+ side = self.safe_string_lower(order, 'ask_bid')
439
+ if side == 'bid':
440
+ side = 'buy'
441
+ else:
442
+ side = 'sell'
443
+ timestamp = self.parse8601(self.safe_string(order, 'order_timestamp'))
444
+ status = self.parse_ws_order_status(self.safe_string(order, 'state'))
445
+ marketId = self.safe_string(order, 'code')
446
+ market = self.safe_market(marketId, market)
447
+ fee = None
448
+ feeCost = self.safe_string(order, 'paid_fee')
449
+ if feeCost is not None:
450
+ fee = {
451
+ 'currency': market['quote'],
452
+ 'cost': feeCost,
453
+ }
454
+ return self.safe_order({
455
+ 'info': order,
456
+ 'id': id,
457
+ 'clientOrderId': None,
458
+ 'timestamp': timestamp,
459
+ 'datetime': self.iso8601(timestamp),
460
+ 'lastTradeTimestamp': self.safe_string(order, 'trade_timestamp'),
461
+ 'symbol': market['symbol'],
462
+ 'type': self.safe_string(order, 'order_type'),
463
+ 'timeInForce': self.safe_string(order, 'time_in_force'),
464
+ 'postOnly': None,
465
+ 'side': side,
466
+ 'price': self.safe_string(order, 'price'),
467
+ 'stopPrice': None,
468
+ 'triggerPrice': None,
469
+ 'cost': self.safe_string(order, 'executed_funds'),
470
+ 'average': self.safe_string(order, 'avg_price'),
471
+ 'amount': self.safe_string(order, 'volume'),
472
+ 'filled': self.safe_string(order, 'executed_volume'),
473
+ 'remaining': self.safe_string(order, 'remaining_volume'),
474
+ 'status': status,
475
+ 'fee': fee,
476
+ 'trades': None,
477
+ })
478
+
479
+ def parse_ws_trade(self, trade, market=None):
480
+ # see: parseWsOrder
481
+ side = self.safe_string_lower(trade, 'ask_bid')
482
+ if side == 'bid':
483
+ side = 'buy'
484
+ else:
485
+ side = 'sell'
486
+ timestamp = self.parse8601(self.safe_string(trade, 'trade_timestamp'))
487
+ marketId = self.safe_string(trade, 'code')
488
+ market = self.safe_market(marketId, market)
489
+ fee = None
490
+ feeCost = self.safe_string(trade, 'paid_fee')
491
+ if feeCost is not None:
492
+ fee = {
493
+ 'currency': market['quote'],
494
+ 'cost': feeCost,
495
+ }
496
+ return self.safe_trade({
497
+ 'id': self.safe_string(trade, 'trade_uuid'),
498
+ 'timestamp': timestamp,
499
+ 'datetime': self.iso8601(timestamp),
500
+ 'symbol': market['symbol'],
501
+ 'side': side,
502
+ 'price': self.safe_string(trade, 'price'),
503
+ 'amount': self.safe_string(trade, 'volume'),
504
+ 'cost': self.safe_string(trade, 'executed_funds'),
505
+ 'order': self.safe_string(trade, 'uuid'),
506
+ 'takerOrMaker': None,
507
+ 'type': self.safe_string(trade, 'order_type'),
508
+ 'fee': fee,
509
+ 'info': trade,
510
+ }, market)
511
+
512
+ def handle_my_order(self, client: Client, message):
513
+ # see: parseWsOrder
514
+ tradeId = self.safe_string(message, 'trade_uuid')
515
+ if tradeId is not None:
516
+ self.handle_my_trade(client, message)
517
+ self.handle_order(client, message)
518
+
519
+ def handle_my_trade(self, client: Client, message):
520
+ # see: parseWsOrder
521
+ myTrades = self.myTrades
522
+ if myTrades is None:
523
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
524
+ myTrades = ArrayCacheBySymbolById(limit)
525
+ trade = self.parse_ws_trade(message)
526
+ myTrades.append(trade)
527
+ messageHash = 'myTrades'
528
+ client.resolve(myTrades, messageHash)
529
+ messageHash = 'myTrades:' + trade['symbol']
530
+ client.resolve(myTrades, messageHash)
531
+
532
+ def handle_order(self, client: Client, message):
533
+ parsed = self.parse_ws_order(message)
534
+ symbol = self.safe_string(parsed, 'symbol')
535
+ orderId = self.safe_string(parsed, 'id')
536
+ if self.orders is None:
537
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
538
+ self.orders = ArrayCacheBySymbolById(limit)
539
+ cachedOrders = self.orders
540
+ orders = self.safe_value(cachedOrders.hashmap, symbol, {})
541
+ order = self.safe_value(orders, orderId)
542
+ if order is not None:
543
+ fee = self.safe_value(order, 'fee')
544
+ if fee is not None:
545
+ parsed['fee'] = fee
546
+ fees = self.safe_value(order, 'fees')
547
+ if fees is not None:
548
+ parsed['fees'] = fees
549
+ parsed['trades'] = self.safe_value(order, 'trades')
550
+ parsed['timestamp'] = self.safe_integer(order, 'timestamp')
551
+ parsed['datetime'] = self.safe_string(order, 'datetime')
552
+ cachedOrders.append(parsed)
553
+ messageHash = 'myOrder'
554
+ client.resolve(self.orders, messageHash)
555
+ messageHash = messageHash + ':' + symbol
556
+ client.resolve(self.orders, messageHash)
557
+
558
+ async def watch_balance(self, params={}) -> Balances:
559
+ """
560
+
561
+ https://global-docs.upbit.com/reference/websocket-myasset
562
+
563
+ query for balance and get the amount of funds available for trading or funds locked in orders
564
+ :param dict [params]: extra parameters specific to the exchange API endpoint
565
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
566
+ """
567
+ await self.load_markets()
568
+ channel = 'myAsset'
569
+ messageHash = 'myAsset'
570
+ return await self.watch_private(None, channel, messageHash)
571
+
572
+ def handle_balance(self, client: Client, message):
573
+ #
574
+ # {
575
+ # "type": "myAsset",
576
+ # "asset_uuid": "e635f223-1609-4969-8fb6-4376937baad6",
577
+ # "assets": [
578
+ # {
579
+ # "currency": "SGD",
580
+ # "balance": 1386929.37231066771348207123,
581
+ # "locked": 10329.670127489597585685
582
+ # }
583
+ # ],
584
+ # "asset_timestamp": 1710146517259,
585
+ # "timestamp": 1710146517267,
586
+ # "stream_type": "REALTIME"
587
+ # }
588
+ #
589
+ data = self.safe_list(message, 'assets', [])
590
+ timestamp = self.safe_integer(message, 'timestamp')
591
+ self.balance['timestamp'] = timestamp
592
+ self.balance['datetime'] = self.iso8601(timestamp)
593
+ for i in range(0, len(data)):
594
+ balance = data[i]
595
+ currencyId = self.safe_string(balance, 'currency')
596
+ code = self.safe_currency_code(currencyId)
597
+ available = self.safe_string(balance, 'balance')
598
+ frozen = self.safe_string(balance, 'locked')
599
+ account = self.account()
600
+ account['free'] = available
601
+ account['used'] = frozen
602
+ self.balance[code] = account
603
+ self.balance = self.safe_balance(self.balance)
604
+ messageHash = self.safe_string(message, 'type')
605
+ client.resolve(self.balance, messageHash)
606
+
216
607
  def handle_message(self, client: Client, message):
217
- methods = {
608
+ methods: dict = {
218
609
  'ticker': self.handle_ticker,
219
610
  'orderbook': self.handle_order_book,
220
611
  'trade': self.handle_trades,
612
+ 'myOrder': self.handle_my_order,
613
+ 'myAsset': self.handle_balance,
221
614
  }
222
615
  methodName = self.safe_string(message, 'type')
223
616
  method = self.safe_value(methods, methodName)