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
@@ -7,10 +7,11 @@ from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.wavesexchange import ImplicitAPI
8
8
  import asyncio
9
9
  import json
10
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
+ from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
11
11
  from typing import List
12
12
  from typing import Any
13
13
  from ccxt.base.errors import ExchangeError
14
+ from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import AccountSuspended
15
16
  from ccxt.base.errors import ArgumentsRequired
16
17
  from ccxt.base.errors import BadRequest
@@ -20,8 +21,7 @@ from ccxt.base.errors import InvalidOrder
20
21
  from ccxt.base.errors import OrderNotFound
21
22
  from ccxt.base.errors import DuplicateOrderId
22
23
  from ccxt.base.errors import ExchangeNotAvailable
23
- from ccxt.base.errors import AuthenticationError
24
- from ccxt.base.decimal_to_precision import DECIMAL_PLACES
24
+ from ccxt.base.decimal_to_precision import TICK_SIZE
25
25
  from ccxt.base.precise import Precise
26
26
 
27
27
 
@@ -34,6 +34,7 @@ class wavesexchange(Exchange, ImplicitAPI):
34
34
  'countries': ['CH'], # Switzerland
35
35
  'certified': False,
36
36
  'pro': False,
37
+ 'dex': True,
37
38
  'has': {
38
39
  'CORS': None,
39
40
  'spot': True,
@@ -58,6 +59,8 @@ class wavesexchange(Exchange, ImplicitAPI):
58
59
  'fetchCrossBorrowRate': False,
59
60
  'fetchCrossBorrowRates': False,
60
61
  'fetchDepositAddress': True,
62
+ 'fetchDepositAddresses': None,
63
+ 'fetchDepositAddressesByNetwork': None,
61
64
  'fetchDepositWithdrawFee': 'emulated',
62
65
  'fetchDepositWithdrawFees': True,
63
66
  'fetchFundingHistory': False,
@@ -80,8 +83,11 @@ class wavesexchange(Exchange, ImplicitAPI):
80
83
  'fetchOrderBook': True,
81
84
  'fetchOrders': True,
82
85
  'fetchPosition': False,
86
+ 'fetchPositionHistory': False,
83
87
  'fetchPositionMode': False,
84
88
  'fetchPositions': False,
89
+ 'fetchPositionsForSymbol': False,
90
+ 'fetchPositionsHistory': False,
85
91
  'fetchPositionsRisk': False,
86
92
  'fetchPremiumIndexOHLCV': False,
87
93
  'fetchTicker': True,
@@ -90,6 +96,7 @@ class wavesexchange(Exchange, ImplicitAPI):
90
96
  'fetchTransfer': False,
91
97
  'fetchTransfers': False,
92
98
  'reduceMargin': False,
99
+ 'sandbox': True,
93
100
  'setLeverage': False,
94
101
  'setMarginMode': False,
95
102
  'setPositionMode': False,
@@ -131,7 +138,13 @@ class wavesexchange(Exchange, ImplicitAPI):
131
138
  'forward': 'https://wx.network/api/v1/forward/matcher',
132
139
  'market': 'https://wx.network/api/v1/forward/marketdata/api/v1',
133
140
  },
134
- 'doc': 'https://docs.wx.network',
141
+ 'doc': [
142
+ 'https://docs.wx.network',
143
+ 'https://docs.waves.tech',
144
+ 'https://api.wavesplatform.com/v0/docs/',
145
+ 'https://nodes.wavesnodes.com/api-docs/index.html',
146
+ 'https://matcher.waves.exchange/api-docs/index.html',
147
+ ],
135
148
  'www': 'https://wx.network',
136
149
  },
137
150
  'api': {
@@ -325,9 +338,9 @@ class wavesexchange(Exchange, ImplicitAPI):
325
338
  },
326
339
  },
327
340
  'currencies': {
328
- 'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.parse_to_int('8')}),
341
+ 'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.parse_number('1e-8')}),
329
342
  },
330
- 'precisionMode': DECIMAL_PLACES,
343
+ 'precisionMode': TICK_SIZE,
331
344
  'options': {
332
345
  'allowedCandles': 1440,
333
346
  'accessToken': None,
@@ -338,7 +351,7 @@ class wavesexchange(Exchange, ImplicitAPI):
338
351
  'wavesAddress': None,
339
352
  'withdrawFeeUSDN': 7420,
340
353
  'withdrawFeeWAVES': 100000,
341
- 'wavesPrecision': 8,
354
+ 'wavesPrecision': 1e-8,
342
355
  'messagePrefix': 'W', # W for production, T for testnet
343
356
  'networks': {
344
357
  'ERC20': 'ETH',
@@ -386,8 +399,8 @@ class wavesexchange(Exchange, ImplicitAPI):
386
399
  async def get_fees_for_asset(self, symbol: str, side, amount, price, params={}):
387
400
  await self.load_markets()
388
401
  market = self.market(symbol)
389
- amount = self.custom_amount_to_precision(symbol, amount)
390
- price = self.custom_price_to_precision(symbol, price)
402
+ amount = self.to_real_symbol_amount(symbol, amount)
403
+ price = self.to_real_symbol_price(symbol, price)
391
404
  request = self.extend({
392
405
  'baseId': market['baseId'],
393
406
  'quoteId': market['quoteId'],
@@ -418,7 +431,7 @@ class wavesexchange(Exchange, ImplicitAPI):
418
431
  matcherFee = self.safe_string(mode, 'matcherFee')
419
432
  feeAssetId = self.safe_string(mode, 'feeAssetId')
420
433
  feeAsset = self.safe_currency_code(feeAssetId)
421
- adjustedMatcherFee = self.currency_from_precision(feeAsset, matcherFee)
434
+ adjustedMatcherFee = self.from_real_currency_amount(feeAsset, matcherFee)
422
435
  amountAsString = self.number_to_string(amount)
423
436
  priceAsString = self.number_to_string(price)
424
437
  feeCost = self.fee_to_precision(symbol, self.parse_number(adjustedMatcherFee))
@@ -495,7 +508,7 @@ class wavesexchange(Exchange, ImplicitAPI):
495
508
  self.options['quotes'] = quotes
496
509
  return quotes
497
510
 
498
- async def fetch_markets(self, params={}):
511
+ async def fetch_markets(self, params={}) -> List[Market]:
499
512
  """
500
513
  retrieves data on all markets for wavesexchange
501
514
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -566,8 +579,8 @@ class wavesexchange(Exchange, ImplicitAPI):
566
579
  'strike': None,
567
580
  'optionType': None,
568
581
  'precision': {
569
- 'amount': self.safe_integer(entry, 'amountAssetDecimals'),
570
- 'price': self.safe_integer(entry, 'priceAssetDecimals'),
582
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(entry, 'amountAssetDecimals'))),
583
+ 'price': self.parse_number(self.parse_precision(self.safe_string(entry, 'priceAssetDecimals'))),
571
584
  },
572
585
  'limits': {
573
586
  'leverage': {
@@ -595,6 +608,9 @@ class wavesexchange(Exchange, ImplicitAPI):
595
608
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
596
609
  """
597
610
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
611
+
612
+ https://matcher.waves.exchange/api-docs/index.html#/markets/getOrderBook
613
+
598
614
  :param str symbol: unified symbol of the market to fetch the order book for
599
615
  :param int [limit]: the maximum amount of order book entries to return
600
616
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -621,12 +637,11 @@ class wavesexchange(Exchange, ImplicitAPI):
621
637
 
622
638
  def parse_order_book_side(self, bookSide, market=None, limit: Int = None):
623
639
  precision = market['precision']
624
- wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '8')
625
- amountPrecision = '1e' + self.number_to_string(precision['amount'])
626
- amountPrecisionString = self.number_to_string(precision['amount'])
627
- pricePrecisionString = self.number_to_string(precision['price'])
628
- difference = Precise.string_sub(amountPrecisionString, pricePrecisionString)
629
- pricePrecision = '1e' + Precise.string_sub(wavesPrecision, difference)
640
+ wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '1e-8')
641
+ amountPrecisionString = self.safe_string(precision, 'amount')
642
+ pricePrecisionString = self.safe_string(precision, 'price')
643
+ difference = Precise.string_div(amountPrecisionString, pricePrecisionString)
644
+ pricePrecision = Precise.string_div(wavesPrecision, difference)
630
645
  result = []
631
646
  for i in range(0, len(bookSide)):
632
647
  entry = bookSide[i]
@@ -635,9 +650,9 @@ class wavesexchange(Exchange, ImplicitAPI):
635
650
  price = None
636
651
  amount = None
637
652
  if (pricePrecision is not None) and (entryPrice is not None):
638
- price = Precise.string_div(entryPrice, pricePrecision)
639
- if (amountPrecision is not None) and (entryAmount is not None):
640
- amount = Precise.string_div(entryAmount, amountPrecision)
653
+ price = Precise.string_mul(entryPrice, pricePrecision)
654
+ if (amountPrecisionString is not None) and (entryAmount is not None):
655
+ amount = Precise.string_mul(entryAmount, amountPrecisionString)
641
656
  if (limit is not None) and (i > limit):
642
657
  break
643
658
  result.append([
@@ -716,6 +731,9 @@ class wavesexchange(Exchange, ImplicitAPI):
716
731
  async def sign_in(self, params={}):
717
732
  """
718
733
  sign in, must be called prior to using other authenticated methods
734
+
735
+ https://docs.wx.network/en/api/auth/oauth2-token
736
+
719
737
  :param dict [params]: extra parameters specific to the exchange API endpoint
720
738
  :returns: response from exchange
721
739
  """
@@ -732,7 +750,7 @@ class wavesexchange(Exchange, ImplicitAPI):
732
750
  payload = prefix + messageHex
733
751
  hexKey = self.binary_to_base16(self.base58_to_binary(self.secret))
734
752
  signature = self.axolotl(payload, hexKey, 'ed25519')
735
- request = {
753
+ request: dict = {
736
754
  'grant_type': 'password',
737
755
  'scope': 'general',
738
756
  'username': self.apiKey,
@@ -749,7 +767,7 @@ class wavesexchange(Exchange, ImplicitAPI):
749
767
  return self.options['accessToken']
750
768
  return None
751
769
 
752
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
770
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
753
771
  #
754
772
  # {
755
773
  # "symbol": "WAVES/BTC",
@@ -826,13 +844,16 @@ class wavesexchange(Exchange, ImplicitAPI):
826
844
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
827
845
  """
828
846
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
847
+
848
+ https://api.wavesplatform.com/v0/docs/#/pairs/getPairsListAll
849
+
829
850
  :param str symbol: unified symbol of the market to fetch the ticker for
830
851
  :param dict [params]: extra parameters specific to the exchange API endpoint
831
852
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
832
853
  """
833
854
  await self.load_markets()
834
855
  market = self.market(symbol)
835
- request = {
856
+ request: dict = {
836
857
  'pairs': market['id'],
837
858
  }
838
859
  response = await self.publicGetPairs(self.extend(request, params))
@@ -861,13 +882,13 @@ class wavesexchange(Exchange, ImplicitAPI):
861
882
  #
862
883
  data = self.safe_value(response, 'data', [])
863
884
  ticker = self.safe_value(data, 0, {})
864
- dataTicker = self.safe_value(ticker, 'data', {})
885
+ dataTicker = self.safe_dict(ticker, 'data', {})
865
886
  return self.parse_ticker(dataTicker, market)
866
887
 
867
888
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
868
889
  """
869
890
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
870
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
891
+ :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
871
892
  :param dict [params]: extra parameters specific to the exchange API endpoint
872
893
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
873
894
  """
@@ -906,6 +927,9 @@ class wavesexchange(Exchange, ImplicitAPI):
906
927
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
907
928
  """
908
929
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
930
+
931
+ https://api.wavesplatform.com/v0/docs/#/candles/getCandles
932
+
909
933
  :param str symbol: unified symbol of the market to fetch OHLCV data for
910
934
  :param str timeframe: the length of time each candle represents
911
935
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -915,7 +939,7 @@ class wavesexchange(Exchange, ImplicitAPI):
915
939
  """
916
940
  await self.load_markets()
917
941
  market = self.market(symbol)
918
- request = {
942
+ request: dict = {
919
943
  'baseId': market['baseId'],
920
944
  'quoteId': market['quoteId'],
921
945
  'interval': self.safe_string(self.timeframes, timeframe, timeframe),
@@ -1015,7 +1039,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1015
1039
  self.safe_number(data, 'volume', 0),
1016
1040
  ]
1017
1041
 
1018
- async def fetch_deposit_address(self, code: str, params={}):
1042
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1019
1043
  """
1020
1044
  fetch the deposit address for a currency associated with self account
1021
1045
  :param str code: unified currency code
@@ -1060,8 +1084,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1060
1084
  # ]
1061
1085
  # }
1062
1086
  #
1063
- currencies = {}
1064
- networksByCurrency = {}
1087
+ currencies: dict = {}
1088
+ networksByCurrency: dict = {}
1065
1089
  items = self.safe_value(supportedCurrencies, 'items', [])
1066
1090
  for i in range(0, len(items)):
1067
1091
  entry = items[i]
@@ -1078,7 +1102,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1078
1102
  raise ExchangeError(self.id + ' fetchDepositAddress() ' + code + ' not supported. Currency code must be one of ' + ', '.join(codes))
1079
1103
  response = None
1080
1104
  if network is None:
1081
- request = {
1105
+ request: dict = {
1082
1106
  'currency': code,
1083
1107
  }
1084
1108
  response = await self.privateGetDepositAddressesCurrency(self.extend(request, params))
@@ -1088,21 +1112,20 @@ class wavesexchange(Exchange, ImplicitAPI):
1088
1112
  supportedNetworkKeys = list(supportedNetworks.keys())
1089
1113
  raise ExchangeError(self.id + ' ' + network + ' network ' + code + ' deposit address not supported. Network must be one of ' + ', '.join(supportedNetworkKeys))
1090
1114
  if network == 'WAVES':
1091
- request = {
1115
+ request: dict = {
1092
1116
  'publicKey': self.apiKey,
1093
1117
  }
1094
1118
  responseInner = await self.nodeGetAddressesPublicKeyPublicKey(self.extend(request, request))
1095
1119
  addressInner = self.safe_string(response, 'address')
1096
1120
  return {
1097
- 'address': addressInner,
1098
- 'code': code, # kept here for backward-compatibility, but will be removed soon
1121
+ 'info': responseInner,
1099
1122
  'currency': code,
1100
1123
  'network': network,
1124
+ 'address': addressInner,
1101
1125
  'tag': None,
1102
- 'info': responseInner,
1103
1126
  }
1104
1127
  else:
1105
- request = {
1128
+ request: dict = {
1106
1129
  'currency': code,
1107
1130
  'platform': network,
1108
1131
  }
@@ -1137,12 +1160,11 @@ class wavesexchange(Exchange, ImplicitAPI):
1137
1160
  addresses = self.safe_value(response, 'deposit_addresses')
1138
1161
  address = self.safe_string(addresses, 0)
1139
1162
  return {
1140
- 'address': address,
1141
- 'code': code, # kept here for backward-compatibility, but will be removed soon
1163
+ 'info': response,
1142
1164
  'currency': code,
1143
- 'tag': None,
1144
1165
  'network': unifiedNetwork,
1145
- 'info': response,
1166
+ 'address': address,
1167
+ 'tag': None,
1146
1168
  }
1147
1169
 
1148
1170
  async def get_matcher_public_key(self):
@@ -1167,50 +1189,35 @@ class wavesexchange(Exchange, ImplicitAPI):
1167
1189
  return ''
1168
1190
  return currencyId
1169
1191
 
1170
- def custom_price_to_precision(self, symbol, price):
1192
+ def to_real_currency_amount(self, code: str, amount: float, networkCode=None):
1193
+ currency = self.currency(code)
1194
+ stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(currency, 'precision'))
1195
+ return int(stringValue)
1196
+
1197
+ def from_real_currency_amount(self, code: str, amountString: str):
1198
+ if not (code in self.currencies):
1199
+ return amountString
1200
+ currency = self.currency(code)
1201
+ precisionAmount = self.safe_string(currency, 'precision')
1202
+ return Precise.string_mul(amountString, precisionAmount)
1203
+
1204
+ def to_real_symbol_price(self, symbol: str, price: float):
1205
+ market = self.market(symbol)
1206
+ stringValue = Precise.string_div(self.number_to_string(price), self.safe_string(market['precision'], 'price'))
1207
+ return int(stringValue)
1208
+
1209
+ def from_real_symbol_price(self, symbol: str, priceString: str):
1171
1210
  market = self.markets[symbol]
1172
- wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '8')
1173
- amount = self.number_to_string(market['precision']['amount'])
1174
- precisionPrice = self.number_to_string(market['precision']['price'])
1175
- difference = Precise.string_sub(amount, precisionPrice)
1176
- precision = Precise.string_sub(wavesPrecision, difference)
1177
- pricePrecision = self.to_precision(price, str(precision))
1178
- return self.parse_to_int(float(pricePrecision))
1179
-
1180
- def custom_amount_to_precision(self, symbol, amount):
1181
- amountPrecision = self.number_to_string(self.to_precision(amount, self.number_to_string(self.markets[symbol]['precision']['amount'])))
1182
- return self.parse_to_int(float(amountPrecision))
1183
-
1184
- def currency_to_precision(self, code, amount, networkCode=None):
1185
- amountPrecision = self.number_to_string(self.to_precision(amount, self.currencies[code]['precision']))
1186
- return self.parse_to_int(float(amountPrecision))
1187
-
1188
- def from_precision(self, amount, scale):
1189
- if amount is None:
1190
- return None
1191
- precise = Precise(amount)
1192
- precise.decimals = self.sum(precise.decimals, scale)
1193
- precise.reduce()
1194
- return str(precise)
1195
-
1196
- def to_precision(self, amount, scale):
1197
- amountString = self.number_to_string(amount)
1198
- precise = Precise(amountString)
1199
- # precise.decimals should be integer
1200
- precise.decimals = self.parse_to_int(Precise.string_sub(self.number_to_string(precise.decimals), self.number_to_string(scale)))
1201
- precise.reduce()
1202
- stringValue = str(precise)
1203
- return stringValue
1204
-
1205
- def currency_from_precision(self, currency, amount):
1206
- scale = self.currencies[currency]['precision']
1207
- return self.from_precision(amount, scale)
1208
-
1209
- def price_from_precision(self, symbol, price):
1211
+ return Precise.string_mul(priceString, self.safe_string(market['precision'], 'price'))
1212
+
1213
+ def to_real_symbol_amount(self, symbol: str, amount: float):
1214
+ market = self.market(symbol)
1215
+ stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(market['precision'], 'amount'))
1216
+ return int(stringValue)
1217
+
1218
+ def from_real_symbol_amount(self, symbol: str, amountString: str):
1210
1219
  market = self.markets[symbol]
1211
- wavesPrecision = self.safe_integer(self.options, 'wavesPrecision', 8)
1212
- scale = self.sum(wavesPrecision, market['precision']['price']) - market['precision']['amount']
1213
- return self.from_precision(price, scale)
1220
+ return Precise.string_mul(amountString, market['precision']['amount'])
1214
1221
 
1215
1222
  def safe_get_dynamic(self, settings):
1216
1223
  orderFee = self.safe_value(settings, 'orderFee')
@@ -1228,13 +1235,16 @@ class wavesexchange(Exchange, ImplicitAPI):
1228
1235
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1229
1236
  """
1230
1237
  create a trade order
1238
+
1239
+ https://matcher.waves.exchange/api-docs/index.html#/serialize/serializeOrder
1240
+
1231
1241
  :param str symbol: unified symbol of the market to create an order in
1232
1242
  :param str type: 'market' or 'limit'
1233
1243
  :param str side: 'buy' or 'sell'
1234
1244
  :param float amount: how much of currency you want to trade in units of base currency
1235
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1245
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1236
1246
  :param dict [params]: extra parameters specific to the exchange API endpoint
1237
- :param float [params.stopPrice]: The price at which a stop order is triggered at
1247
+ :param float [params.triggerPrice]: The price at which a stop order is triggered at
1238
1248
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1239
1249
  """
1240
1250
  self.check_required_dependencies()
@@ -1245,12 +1255,13 @@ class wavesexchange(Exchange, ImplicitAPI):
1245
1255
  amountAsset = self.get_asset_id(market['baseId'])
1246
1256
  priceAsset = self.get_asset_id(market['quoteId'])
1247
1257
  isMarketOrder = (type == 'market')
1248
- stopPrice = self.safe_float_2(params, 'triggerPrice', 'stopPrice')
1249
- isStopOrder = (stopPrice is not None)
1258
+ triggerPrice = self.safe_float_2(params, 'triggerPrice', 'stopPrice')
1259
+ isStopOrder = (triggerPrice is not None)
1250
1260
  if (isMarketOrder) and (price is None):
1251
1261
  raise InvalidOrder(self.id + ' createOrder() requires a price argument for ' + type + ' orders to determine the max price for buy and the min price for sell')
1252
1262
  timestamp = self.milliseconds()
1253
- defaultExpiryDelta = self.safe_integer(self.options, 'createOrderDefaultExpiry', 2419200000)
1263
+ defaultExpiryDelta = None
1264
+ defaultExpiryDelta, params = self.handle_option_and_params(params, 'createOrder', 'defaultExpiry', self.safe_integer(self.options, 'createOrderDefaultExpiry', 2419200000))
1254
1265
  expiration = self.sum(timestamp, defaultExpiryDelta)
1255
1266
  matcherFees = await self.get_fees_for_asset(symbol, side, amount, price)
1256
1267
  # {
@@ -1284,33 +1295,33 @@ class wavesexchange(Exchange, ImplicitAPI):
1284
1295
  raise InvalidOrder(self.id + ' asset fee must be ' + baseFeeAsset + ' or ' + discountFeeAsset)
1285
1296
  matcherFeeAsset = self.safe_currency_code(matcherFeeAssetId)
1286
1297
  rawMatcherFee = baseMatcherFee if (matcherFeeAssetId == baseFeeAssetId) else discountMatcherFee
1287
- floatMatcherFee = float(self.currency_from_precision(matcherFeeAsset, rawMatcherFee))
1298
+ floatMatcherFee = float(self.from_real_currency_amount(matcherFeeAsset, rawMatcherFee))
1288
1299
  if (matcherFeeAsset in balances) and (balances[matcherFeeAsset]['free'] >= floatMatcherFee):
1289
1300
  matcherFee = int(rawMatcherFee)
1290
1301
  else:
1291
1302
  raise InsufficientFunds(self.id + ' not enough funds of the selected asset fee')
1303
+ floatBaseMatcherFee = self.from_real_currency_amount(baseFeeAsset, baseMatcherFee)
1304
+ floatDiscountMatcherFee = self.from_real_currency_amount(discountFeeAsset, discountMatcherFee)
1292
1305
  if matcherFeeAssetId is None:
1293
1306
  # try to the pay the fee using the base first then discount asset
1294
- floatBaseMatcherFee = float(self.currency_from_precision(baseFeeAsset, baseMatcherFee))
1295
- if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= floatBaseMatcherFee):
1307
+ if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= float(floatBaseMatcherFee)):
1296
1308
  matcherFeeAssetId = baseFeeAssetId
1297
1309
  matcherFee = int(baseMatcherFee)
1298
1310
  else:
1299
- floatDiscountMatcherFee = float(self.currency_from_precision(discountFeeAsset, discountMatcherFee))
1300
- if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= floatDiscountMatcherFee):
1311
+ if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= float(floatDiscountMatcherFee)):
1301
1312
  matcherFeeAssetId = discountFeeAssetId
1302
1313
  matcherFee = int(discountMatcherFee)
1303
1314
  if matcherFeeAssetId is None:
1304
- raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees')
1305
- amount = self.custom_amount_to_precision(symbol, amount)
1306
- price = self.custom_price_to_precision(symbol, price)
1307
- assetPair = {
1315
+ raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees: ' + baseFeeAsset + ' ' + floatBaseMatcherFee + ' or ' + discountFeeAsset + ' ' + floatDiscountMatcherFee)
1316
+ amount = self.to_real_symbol_amount(symbol, amount)
1317
+ price = self.to_real_symbol_price(symbol, price)
1318
+ assetPair: dict = {
1308
1319
  'amountAsset': amountAsset,
1309
1320
  'priceAsset': priceAsset,
1310
1321
  }
1311
1322
  sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
1312
1323
  chainId = 84 if (sandboxMode) else 87
1313
- body = {
1324
+ body: dict = {
1314
1325
  'senderPublicKey': self.apiKey,
1315
1326
  'matcherPublicKey': matcherPublicKey,
1316
1327
  'assetPair': assetPair,
@@ -1336,12 +1347,12 @@ class wavesexchange(Exchange, ImplicitAPI):
1336
1347
  # },
1337
1348
  # }
1338
1349
  #
1339
- attachment = {
1350
+ attachment: dict = {
1340
1351
  'v': 1,
1341
1352
  'c': {
1342
1353
  't': 'sp',
1343
1354
  'v': {
1344
- 'p': self.custom_price_to_precision(symbol, stopPrice),
1355
+ 'p': self.to_real_symbol_price(symbol, triggerPrice),
1345
1356
  },
1346
1357
  },
1347
1358
  }
@@ -1385,17 +1396,20 @@ class wavesexchange(Exchange, ImplicitAPI):
1385
1396
  # }
1386
1397
  #
1387
1398
  if isMarketOrder:
1388
- response = await self.matcherPostMatcherOrderbookMarket(body)
1389
- value = self.safe_value(response, 'message')
1399
+ response = await self.matcherPostMatcherOrderbookMarket(self.extend(body, params))
1400
+ value = self.safe_dict(response, 'message')
1390
1401
  return self.parse_order(value, market)
1391
1402
  else:
1392
- response = await self.matcherPostMatcherOrderbook(body)
1393
- value = self.safe_value(response, 'message')
1403
+ response = await self.matcherPostMatcherOrderbook(self.extend(body, params))
1404
+ value = self.safe_dict(response, 'message')
1394
1405
  return self.parse_order(value, market)
1395
1406
 
1396
1407
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1397
1408
  """
1398
1409
  cancels an open order
1410
+
1411
+ https://matcher.waves.exchange/api-docs/index.html#/cancel/cancelOrdersByIdsWithKeyOrSignature
1412
+
1399
1413
  :param str id: order id
1400
1414
  :param str symbol: unified symbol of the market the order was made in
1401
1415
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1418,7 +1432,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1418
1432
  firstMessage = self.safe_value(message, 0)
1419
1433
  firstOrder = self.safe_value(firstMessage, 0)
1420
1434
  returnedId = self.safe_string(firstOrder, 'orderId')
1421
- return {
1435
+ return self.safe_order({
1422
1436
  'info': response,
1423
1437
  'id': returnedId,
1424
1438
  'clientOrderId': None,
@@ -1437,11 +1451,15 @@ class wavesexchange(Exchange, ImplicitAPI):
1437
1451
  'status': None,
1438
1452
  'fee': None,
1439
1453
  'trades': None,
1440
- }
1454
+ })
1441
1455
 
1442
1456
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1443
1457
  """
1444
1458
  fetches information on an order made by the user
1459
+
1460
+ https://matcher.waves.exchange/api-docs/index.html#/status/getOrderStatusByPKAndIdWithSig
1461
+
1462
+ :param str id: order id
1445
1463
  :param str symbol: unified symbol of the market the order was made in
1446
1464
  :param dict [params]: extra parameters specific to the exchange API endpoint
1447
1465
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1460,7 +1478,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1460
1478
  binary = self.binary_concat_array(byteArray)
1461
1479
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1462
1480
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1463
- request = {
1481
+ request: dict = {
1464
1482
  'Timestamp': str(timestamp),
1465
1483
  'Signature': signature,
1466
1484
  'publicKey': self.apiKey,
@@ -1492,7 +1510,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1492
1510
  binary = self.binary_concat_array(byteArray)
1493
1511
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1494
1512
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1495
- request = {
1513
+ request: dict = {
1496
1514
  'Accept': 'application/json',
1497
1515
  'Timestamp': str(timestamp),
1498
1516
  'Signature': signature,
@@ -1533,7 +1551,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1533
1551
  if symbol is not None:
1534
1552
  market = self.market(symbol)
1535
1553
  address = await self.get_waves_address()
1536
- request = {
1554
+ request: dict = {
1537
1555
  'address': address,
1538
1556
  'activeOnly': True,
1539
1557
  }
@@ -1555,7 +1573,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1555
1573
  if symbol is not None:
1556
1574
  market = self.market(symbol)
1557
1575
  address = await self.get_waves_address()
1558
- request = {
1576
+ request: dict = {
1559
1577
  'address': address,
1560
1578
  'closedOnly': True,
1561
1579
  }
@@ -1582,8 +1600,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1582
1600
  # ]
1583
1601
  return self.parse_orders(response, market, since, limit)
1584
1602
 
1585
- def parse_order_status(self, status):
1586
- statuses = {
1603
+ def parse_order_status(self, status: Str):
1604
+ statuses: dict = {
1587
1605
  'Cancelled': 'canceled',
1588
1606
  'Accepted': 'open',
1589
1607
  'Filled': 'closed',
@@ -1597,7 +1615,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1597
1615
  quoteId = self.safe_string(assetPair, 'priceAsset', 'WAVES')
1598
1616
  return self.safe_currency_code(baseId) + '/' + self.safe_currency_code(quoteId)
1599
1617
 
1600
- def parse_order(self, order, market: Market = None) -> Order:
1618
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1601
1619
  #
1602
1620
  # createOrder
1603
1621
  #
@@ -1667,23 +1685,23 @@ class wavesexchange(Exchange, ImplicitAPI):
1667
1685
  elif market is not None:
1668
1686
  symbol = market['symbol']
1669
1687
  amountCurrency = self.safe_currency_code(self.safe_string(assetPair, 'amountAsset', 'WAVES'))
1670
- price = self.price_from_precision(symbol, priceString)
1671
- amount = self.currency_from_precision(amountCurrency, amountString)
1672
- filled = self.currency_from_precision(amountCurrency, filledString)
1673
- average = self.price_from_precision(symbol, self.safe_string(order, 'avgWeighedPrice'))
1688
+ price = self.from_real_symbol_price(symbol, priceString)
1689
+ amount = self.from_real_currency_amount(amountCurrency, amountString)
1690
+ filled = self.from_real_currency_amount(amountCurrency, filledString)
1691
+ average = self.from_real_symbol_price(symbol, self.safe_string(order, 'avgWeighedPrice'))
1674
1692
  status = self.parse_order_status(self.safe_string(order, 'status'))
1675
1693
  fee = None
1676
1694
  if 'type' in order:
1677
- currency = self.safe_currency_code(self.safe_string(order, 'feeAsset'))
1695
+ code = self.safe_currency_code(self.safe_string(order, 'feeAsset'))
1678
1696
  fee = {
1679
- 'currency': currency,
1680
- 'fee': self.parse_number(self.currency_from_precision(currency, self.safe_string(order, 'filledFee'))),
1697
+ 'currency': code,
1698
+ 'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'filledFee'))),
1681
1699
  }
1682
1700
  else:
1683
- currency = self.safe_currency_code(self.safe_string(order, 'matcherFeeAssetId', 'WAVES'))
1701
+ code = self.safe_currency_code(self.safe_string(order, 'matcherFeeAssetId', 'WAVES'))
1684
1702
  fee = {
1685
- 'currency': currency,
1686
- 'fee': self.parse_number(self.currency_from_precision(currency, self.safe_string(order, 'matcherFee'))),
1703
+ 'currency': code,
1704
+ 'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'matcherFee'))),
1687
1705
  }
1688
1706
  triggerPrice = None
1689
1707
  attachment = self.safe_string(order, 'attachment')
@@ -1708,7 +1726,6 @@ class wavesexchange(Exchange, ImplicitAPI):
1708
1726
  'postOnly': None,
1709
1727
  'side': side,
1710
1728
  'price': price,
1711
- 'stopPrice': triggerPrice,
1712
1729
  'triggerPrice': triggerPrice,
1713
1730
  'amount': amount,
1714
1731
  'cost': None,
@@ -1723,7 +1740,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1723
1740
  async def get_waves_address(self):
1724
1741
  cachedAddreess = self.safe_string(self.options, 'wavesAddress')
1725
1742
  if cachedAddreess is None:
1726
- request = {
1743
+ request: dict = {
1727
1744
  'publicKey': self.apiKey,
1728
1745
  }
1729
1746
  response = await self.nodeGetAddressesPublicKeyPublicKey(request)
@@ -1748,7 +1765,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1748
1765
  self.check_required_keys()
1749
1766
  await self.load_markets()
1750
1767
  wavesAddress = await self.get_waves_address()
1751
- request = {
1768
+ request: dict = {
1752
1769
  'address': wavesAddress,
1753
1770
  }
1754
1771
  totalBalance = await self.nodeGetAssetsBalanceAddress(request)
@@ -1787,7 +1804,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1787
1804
  # ]
1788
1805
  # }
1789
1806
  balances = self.safe_value(totalBalance, 'balances', [])
1790
- result = {}
1807
+ result: dict = {}
1791
1808
  timestamp = None
1792
1809
  assetIds = []
1793
1810
  nonStandardBalances = []
@@ -1798,19 +1815,17 @@ class wavesexchange(Exchange, ImplicitAPI):
1798
1815
  issueTransaction = self.safe_value(entry, 'issueTransaction')
1799
1816
  currencyId = self.safe_string(entry, 'assetId')
1800
1817
  balance = self.safe_string(entry, 'balance')
1801
- if issueTransaction is None:
1802
- assetIds.append(currencyId)
1803
- nonStandardBalances.append(balance)
1804
- continue
1805
- decimals = self.safe_integer(issueTransaction, 'decimals')
1806
- code = None
1807
- if currencyId in self.currencies_by_id:
1818
+ currencyExists = (currencyId in self.currencies_by_id)
1819
+ if currencyExists:
1808
1820
  code = self.safe_currency_code(currencyId)
1809
1821
  result[code] = self.account()
1810
- result[code]['total'] = self.from_precision(balance, decimals)
1822
+ result[code]['total'] = self.from_real_currency_amount(code, balance)
1823
+ elif issueTransaction is None:
1824
+ assetIds.append(currencyId)
1825
+ nonStandardBalances.append(balance)
1811
1826
  nonStandardAssets = len(assetIds)
1812
1827
  if nonStandardAssets:
1813
- requestInner = {
1828
+ requestInner: dict = {
1814
1829
  'ids': assetIds,
1815
1830
  }
1816
1831
  response = await self.publicGetAssets(requestInner)
@@ -1819,11 +1834,11 @@ class wavesexchange(Exchange, ImplicitAPI):
1819
1834
  entry = data[i]
1820
1835
  balance = nonStandardBalances[i]
1821
1836
  inner = self.safe_value(entry, 'data')
1822
- decimals = self.safe_integer(inner, 'precision')
1837
+ precision = self.parse_precision(self.safe_string(inner, 'precision'))
1823
1838
  ticker = self.safe_string(inner, 'ticker')
1824
1839
  code = self.safe_currency_code(ticker)
1825
1840
  result[code] = self.account()
1826
- result[code]['total'] = self.from_precision(balance, decimals)
1841
+ result[code]['total'] = Precise.string_mul(balance, precision)
1827
1842
  currentTimestamp = self.milliseconds()
1828
1843
  byteArray = [
1829
1844
  self.base58_to_binary(self.apiKey),
@@ -1832,7 +1847,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1832
1847
  binary = self.binary_concat_array(byteArray)
1833
1848
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1834
1849
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1835
- matcherRequest = {
1850
+ matcherRequest: dict = {
1836
1851
  'publicKey': self.apiKey,
1837
1852
  'signature': signature,
1838
1853
  'timestamp': str(currentTimestamp),
@@ -1846,11 +1861,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1846
1861
  if not (code in result):
1847
1862
  result[code] = self.account()
1848
1863
  amount = self.safe_string(reservedBalance, currencyId)
1849
- if code in self.currencies:
1850
- result[code]['used'] = self.currency_from_precision(code, amount)
1851
- else:
1852
- result[code]['used'] = amount
1853
- wavesRequest = {
1864
+ result[code]['used'] = self.from_real_currency_amount(code, amount)
1865
+ wavesRequest: dict = {
1854
1866
  'address': wavesAddress,
1855
1867
  }
1856
1868
  wavesTotal = await self.nodeGetAddressesBalanceAddress(wavesRequest)
@@ -1859,20 +1871,27 @@ class wavesexchange(Exchange, ImplicitAPI):
1859
1871
  # "confirmations": 0,
1860
1872
  # "balance": 909085978
1861
1873
  # }
1862
- result['WAVES'] = self.safe_value(result, 'WAVES', {})
1863
- result['WAVES']['total'] = self.currency_from_precision('WAVES', self.safe_string(wavesTotal, 'balance'))
1864
- codes = list(result.keys())
1865
- for i in range(0, len(codes)):
1866
- code = codes[i]
1867
- if self.safe_value(result[code], 'used') is None:
1868
- result[code]['used'] = '0'
1874
+ result['WAVES'] = self.safe_value(result, 'WAVES', self.account())
1875
+ result['WAVES']['total'] = self.from_real_currency_amount('WAVES', self.safe_string(wavesTotal, 'balance'))
1876
+ result = self.set_undefined_balances_to_zero(result)
1869
1877
  result['timestamp'] = timestamp
1870
1878
  result['datetime'] = self.iso8601(timestamp)
1871
1879
  return self.safe_balance(result)
1872
1880
 
1881
+ def set_undefined_balances_to_zero(self, balances, key='used'):
1882
+ codes = list(balances.keys())
1883
+ for i in range(0, len(codes)):
1884
+ code = codes[i]
1885
+ if self.safe_value(balances[code], 'used') is None:
1886
+ balances[code][key] = '0'
1887
+ return balances
1888
+
1873
1889
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1874
1890
  """
1875
1891
  fetch all trades made by the user
1892
+
1893
+ https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
1894
+
1876
1895
  :param str symbol: unified market symbol
1877
1896
  :param int [since]: the earliest time in ms to fetch trades for
1878
1897
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1881,7 +1900,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1881
1900
  """
1882
1901
  await self.load_markets()
1883
1902
  address = await self.get_waves_address()
1884
- request = {
1903
+ request: dict = {
1885
1904
  'sender': address,
1886
1905
  }
1887
1906
  market = None
@@ -1962,6 +1981,9 @@ class wavesexchange(Exchange, ImplicitAPI):
1962
1981
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1963
1982
  """
1964
1983
  get the list of most recent trades for a particular symbol
1984
+
1985
+ https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
1986
+
1965
1987
  :param str symbol: unified symbol of the market to fetch trades for
1966
1988
  :param int [since]: timestamp in ms of the earliest trade to fetch
1967
1989
  :param int [limit]: the maximum amount of trades to fetch
@@ -1970,7 +1992,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1970
1992
  """
1971
1993
  await self.load_markets()
1972
1994
  market = self.market(symbol)
1973
- request = {
1995
+ request: dict = {
1974
1996
  'amountAsset': market['baseId'],
1975
1997
  'priceAsset': market['quoteId'],
1976
1998
  }
@@ -2048,7 +2070,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2048
2070
  #
2049
2071
  return self.parse_trades(data, market, since, limit)
2050
2072
 
2051
- def parse_trade(self, trade, market: Market = None) -> Trade:
2073
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
2052
2074
  #
2053
2075
  # {__type: "transaction",
2054
2076
  # "data":
@@ -2138,7 +2160,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2138
2160
  }, market)
2139
2161
 
2140
2162
  def parse_deposit_withdraw_fees(self, response, codes: Strings = None, currencyIdKey=None) -> Any:
2141
- depositWithdrawFees = {}
2163
+ depositWithdrawFees: dict = {}
2142
2164
  codes = self.market_codes(codes)
2143
2165
  for i in range(0, len(response)):
2144
2166
  entry = response[i]
@@ -2203,8 +2225,10 @@ class wavesexchange(Exchange, ImplicitAPI):
2203
2225
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2204
2226
  """
2205
2227
  fetch deposit and withdraw fees
2206
- :see: https://docs.wx.network/en/api/gateways/deposit/currencies
2207
- :see: https://docs.wx.network/en/api/gateways/withdraw/currencies
2228
+
2229
+ https://docs.wx.network/en/api/gateways/deposit/currencies
2230
+ https://docs.wx.network/en/api/gateways/withdraw/currencies
2231
+
2208
2232
  :param str[]|None codes: list of unified currency codes
2209
2233
  :param dict [params]: extra parameters specific to the exchange API endpoint
2210
2234
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -2276,7 +2300,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2276
2300
  data = self.array_concat(data, items)
2277
2301
  return self.parse_deposit_withdraw_fees(data, codes, 'id')
2278
2302
 
2279
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
2303
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2280
2304
  errorCode = self.safe_string(response, 'error')
2281
2305
  success = self.safe_bool(response, 'success', True)
2282
2306
  Exception = self.safe_value(self.exceptions, errorCode)
@@ -2290,7 +2314,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2290
2314
  raise ExchangeError(self.id + ' ' + body)
2291
2315
  return None
2292
2316
 
2293
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2317
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2294
2318
  """
2295
2319
  make a withdrawal
2296
2320
  :param str code: unified currency code
@@ -2304,7 +2328,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2304
2328
  # currently only works for BTC and WAVES
2305
2329
  if code != 'WAVES':
2306
2330
  supportedCurrencies = await self.privateGetWithdrawCurrencies()
2307
- currencies = {}
2331
+ currencies: dict = {}
2308
2332
  items = self.safe_value(supportedCurrencies, 'items', [])
2309
2333
  for i in range(0, len(items)):
2310
2334
  entry = items[i]
@@ -2315,7 +2339,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2315
2339
  raise ExchangeError(self.id + ' withdraw() ' + code + ' not supported. Currency code must be one of ' + str(codes))
2316
2340
  await self.load_markets()
2317
2341
  hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
2318
- set = {}
2342
+ set: dict = {}
2319
2343
  for i in range(0, len(hexChars)):
2320
2344
  key = hexChars[i]
2321
2345
  set[key] = True
@@ -2333,7 +2357,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2333
2357
  if code == 'WAVES' and not isErc20:
2334
2358
  proxyAddress = address
2335
2359
  else:
2336
- withdrawAddressRequest = {
2360
+ withdrawAddressRequest: dict = {
2337
2361
  'address': address,
2338
2362
  'currency': code,
2339
2363
  }
@@ -2370,7 +2394,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2370
2394
  feeAssetId = 'WAVES'
2371
2395
  type = 4 # transfer
2372
2396
  version = 2
2373
- amountInteger = self.currency_to_precision(code, amount)
2397
+ amountInteger = self.to_real_currency_amount(code, amount)
2374
2398
  currency = self.currency(code)
2375
2399
  timestamp = self.milliseconds()
2376
2400
  byteArray = [
@@ -2388,7 +2412,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2388
2412
  binary = self.binary_concat_array(byteArray)
2389
2413
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
2390
2414
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
2391
- request = {
2415
+ request: dict = {
2392
2416
  'senderPublicKey': self.apiKey,
2393
2417
  'amount': amountInteger,
2394
2418
  'fee': fee,
@@ -2417,7 +2441,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2417
2441
  #
2418
2442
  return self.parse_transaction(result, currency)
2419
2443
 
2420
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2444
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2421
2445
  #
2422
2446
  # withdraw
2423
2447
  #
@@ -2430,18 +2454,45 @@ class wavesexchange(Exchange, ImplicitAPI):
2430
2454
  # "amount": 0
2431
2455
  # }
2432
2456
  #
2457
+ # withdraw new:
2458
+ # {
2459
+ # type: "4",
2460
+ # id: "2xnWTqG9ar7jEDrLxfbVyyspPZ6XZNrrw9ai9sQ81Eya",
2461
+ # fee: "100000",
2462
+ # feeAssetId: null,
2463
+ # timestamp: "1715786263807",
2464
+ # version: "2",
2465
+ # sender: "3P81LLX1kk2CSJC9L8C2enxdHB7XvnSGAEE",
2466
+ # senderPublicKey: "DdmzmXf9mty1FBE8AdVGnrncVLEAzP4gR4nWoTFAJoXz",
2467
+ # proofs: ["RyoKwdSYv3EqotJCYftfFM9JE2j1ZpDRxKwYfiRhLAFeyNp6VfJUXNDS884XfeCeHeNypNmTCZt5NYR1ekyjCX3",],
2468
+ # recipient: "3P9tXxu38a8tgewNEKFzourVxeqHd11ppOc",
2469
+ # assetId: null,
2470
+ # feeAsset: null,
2471
+ # amount: "2000000",
2472
+ # attachment: "",
2473
+ # }
2474
+ #
2433
2475
  currency = self.safe_currency(None, currency)
2476
+ code = currency['code']
2477
+ typeRaw = self.safe_string(transaction, 'type')
2478
+ type = 'withdraw' if (typeRaw == '4') else 'deposit'
2479
+ amount = self.parse_number(self.from_real_currency_amount(code, self.safe_string(transaction, 'amount')))
2480
+ feeString = self.safe_string(transaction, 'fee')
2481
+ feeAssetId = self.safe_string(transaction, 'feeAssetId', 'WAVES')
2482
+ feeCode = self.safe_currency_code(feeAssetId)
2483
+ feeAmount = self.parse_number(self.from_real_currency_amount(feeCode, feeString))
2484
+ timestamp = self.safe_integer(transaction, 'timestamp')
2434
2485
  return {
2435
- 'id': None,
2486
+ 'id': self.safe_string(transaction, 'id'),
2436
2487
  'txid': None,
2437
- 'timestamp': None,
2438
- 'datetime': None,
2488
+ 'timestamp': timestamp,
2489
+ 'datetime': self.iso8601(timestamp),
2439
2490
  'network': None,
2440
- 'addressFrom': None,
2491
+ 'addressFrom': self.safe_string(transaction, 'sender'),
2441
2492
  'address': None,
2442
- 'addressTo': None,
2443
- 'amount': None,
2444
- 'type': None,
2493
+ 'addressTo': self.safe_string(transaction, 'recipient'),
2494
+ 'amount': amount,
2495
+ 'type': type,
2445
2496
  'currency': currency['code'],
2446
2497
  'status': None,
2447
2498
  'updated': None,
@@ -2450,6 +2501,9 @@ class wavesexchange(Exchange, ImplicitAPI):
2450
2501
  'tagTo': None,
2451
2502
  'comment': None,
2452
2503
  'internal': None,
2453
- 'fee': None,
2504
+ 'fee': {
2505
+ 'currency': feeCode,
2506
+ 'cost': feeAmount,
2507
+ },
2454
2508
  'info': transaction,
2455
2509
  }