ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3104 -880
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +557 -323
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1633 -268
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3104 -880
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +557 -323
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1632 -268
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/wavesexchange.py CHANGED
@@ -6,10 +6,11 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.wavesexchange import ImplicitAPI
8
8
  import json
9
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
10
  from typing import List
11
11
  from typing import Any
12
12
  from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import AccountSuspended
14
15
  from ccxt.base.errors import ArgumentsRequired
15
16
  from ccxt.base.errors import BadRequest
@@ -19,8 +20,7 @@ from ccxt.base.errors import InvalidOrder
19
20
  from ccxt.base.errors import OrderNotFound
20
21
  from ccxt.base.errors import DuplicateOrderId
21
22
  from ccxt.base.errors import ExchangeNotAvailable
22
- from ccxt.base.errors import AuthenticationError
23
- from ccxt.base.decimal_to_precision import DECIMAL_PLACES
23
+ from ccxt.base.decimal_to_precision import TICK_SIZE
24
24
  from ccxt.base.precise import Precise
25
25
 
26
26
 
@@ -33,6 +33,7 @@ class wavesexchange(Exchange, ImplicitAPI):
33
33
  'countries': ['CH'], # Switzerland
34
34
  'certified': False,
35
35
  'pro': False,
36
+ 'dex': True,
36
37
  'has': {
37
38
  'CORS': None,
38
39
  'spot': True,
@@ -57,6 +58,8 @@ class wavesexchange(Exchange, ImplicitAPI):
57
58
  'fetchCrossBorrowRate': False,
58
59
  'fetchCrossBorrowRates': False,
59
60
  'fetchDepositAddress': True,
61
+ 'fetchDepositAddresses': None,
62
+ 'fetchDepositAddressesByNetwork': None,
60
63
  'fetchDepositWithdrawFee': 'emulated',
61
64
  'fetchDepositWithdrawFees': True,
62
65
  'fetchFundingHistory': False,
@@ -79,8 +82,11 @@ class wavesexchange(Exchange, ImplicitAPI):
79
82
  'fetchOrderBook': True,
80
83
  'fetchOrders': True,
81
84
  'fetchPosition': False,
85
+ 'fetchPositionHistory': False,
82
86
  'fetchPositionMode': False,
83
87
  'fetchPositions': False,
88
+ 'fetchPositionsForSymbol': False,
89
+ 'fetchPositionsHistory': False,
84
90
  'fetchPositionsRisk': False,
85
91
  'fetchPremiumIndexOHLCV': False,
86
92
  'fetchTicker': True,
@@ -89,6 +95,7 @@ class wavesexchange(Exchange, ImplicitAPI):
89
95
  'fetchTransfer': False,
90
96
  'fetchTransfers': False,
91
97
  'reduceMargin': False,
98
+ 'sandbox': True,
92
99
  'setLeverage': False,
93
100
  'setMarginMode': False,
94
101
  'setPositionMode': False,
@@ -130,7 +137,13 @@ class wavesexchange(Exchange, ImplicitAPI):
130
137
  'forward': 'https://wx.network/api/v1/forward/matcher',
131
138
  'market': 'https://wx.network/api/v1/forward/marketdata/api/v1',
132
139
  },
133
- 'doc': 'https://docs.wx.network',
140
+ 'doc': [
141
+ 'https://docs.wx.network',
142
+ 'https://docs.waves.tech',
143
+ 'https://api.wavesplatform.com/v0/docs/',
144
+ 'https://nodes.wavesnodes.com/api-docs/index.html',
145
+ 'https://matcher.waves.exchange/api-docs/index.html',
146
+ ],
134
147
  'www': 'https://wx.network',
135
148
  },
136
149
  'api': {
@@ -324,9 +337,9 @@ class wavesexchange(Exchange, ImplicitAPI):
324
337
  },
325
338
  },
326
339
  'currencies': {
327
- 'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.parse_to_int('8')}),
340
+ 'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.parse_number('1e-8')}),
328
341
  },
329
- 'precisionMode': DECIMAL_PLACES,
342
+ 'precisionMode': TICK_SIZE,
330
343
  'options': {
331
344
  'allowedCandles': 1440,
332
345
  'accessToken': None,
@@ -337,7 +350,7 @@ class wavesexchange(Exchange, ImplicitAPI):
337
350
  'wavesAddress': None,
338
351
  'withdrawFeeUSDN': 7420,
339
352
  'withdrawFeeWAVES': 100000,
340
- 'wavesPrecision': 8,
353
+ 'wavesPrecision': 1e-8,
341
354
  'messagePrefix': 'W', # W for production, T for testnet
342
355
  'networks': {
343
356
  'ERC20': 'ETH',
@@ -385,8 +398,8 @@ class wavesexchange(Exchange, ImplicitAPI):
385
398
  def get_fees_for_asset(self, symbol: str, side, amount, price, params={}):
386
399
  self.load_markets()
387
400
  market = self.market(symbol)
388
- amount = self.custom_amount_to_precision(symbol, amount)
389
- price = self.custom_price_to_precision(symbol, price)
401
+ amount = self.to_real_symbol_amount(symbol, amount)
402
+ price = self.to_real_symbol_price(symbol, price)
390
403
  request = self.extend({
391
404
  'baseId': market['baseId'],
392
405
  'quoteId': market['quoteId'],
@@ -417,7 +430,7 @@ class wavesexchange(Exchange, ImplicitAPI):
417
430
  matcherFee = self.safe_string(mode, 'matcherFee')
418
431
  feeAssetId = self.safe_string(mode, 'feeAssetId')
419
432
  feeAsset = self.safe_currency_code(feeAssetId)
420
- adjustedMatcherFee = self.currency_from_precision(feeAsset, matcherFee)
433
+ adjustedMatcherFee = self.from_real_currency_amount(feeAsset, matcherFee)
421
434
  amountAsString = self.number_to_string(amount)
422
435
  priceAsString = self.number_to_string(price)
423
436
  feeCost = self.fee_to_precision(symbol, self.parse_number(adjustedMatcherFee))
@@ -494,7 +507,7 @@ class wavesexchange(Exchange, ImplicitAPI):
494
507
  self.options['quotes'] = quotes
495
508
  return quotes
496
509
 
497
- def fetch_markets(self, params={}):
510
+ def fetch_markets(self, params={}) -> List[Market]:
498
511
  """
499
512
  retrieves data on all markets for wavesexchange
500
513
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -565,8 +578,8 @@ class wavesexchange(Exchange, ImplicitAPI):
565
578
  'strike': None,
566
579
  'optionType': None,
567
580
  'precision': {
568
- 'amount': self.safe_integer(entry, 'amountAssetDecimals'),
569
- 'price': self.safe_integer(entry, 'priceAssetDecimals'),
581
+ 'amount': self.parse_number(self.parse_precision(self.safe_string(entry, 'amountAssetDecimals'))),
582
+ 'price': self.parse_number(self.parse_precision(self.safe_string(entry, 'priceAssetDecimals'))),
570
583
  },
571
584
  'limits': {
572
585
  'leverage': {
@@ -594,6 +607,9 @@ class wavesexchange(Exchange, ImplicitAPI):
594
607
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
595
608
  """
596
609
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
610
+
611
+ https://matcher.waves.exchange/api-docs/index.html#/markets/getOrderBook
612
+
597
613
  :param str symbol: unified symbol of the market to fetch the order book for
598
614
  :param int [limit]: the maximum amount of order book entries to return
599
615
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -620,12 +636,11 @@ class wavesexchange(Exchange, ImplicitAPI):
620
636
 
621
637
  def parse_order_book_side(self, bookSide, market=None, limit: Int = None):
622
638
  precision = market['precision']
623
- wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '8')
624
- amountPrecision = '1e' + self.number_to_string(precision['amount'])
625
- amountPrecisionString = self.number_to_string(precision['amount'])
626
- pricePrecisionString = self.number_to_string(precision['price'])
627
- difference = Precise.string_sub(amountPrecisionString, pricePrecisionString)
628
- pricePrecision = '1e' + Precise.string_sub(wavesPrecision, difference)
639
+ wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '1e-8')
640
+ amountPrecisionString = self.safe_string(precision, 'amount')
641
+ pricePrecisionString = self.safe_string(precision, 'price')
642
+ difference = Precise.string_div(amountPrecisionString, pricePrecisionString)
643
+ pricePrecision = Precise.string_div(wavesPrecision, difference)
629
644
  result = []
630
645
  for i in range(0, len(bookSide)):
631
646
  entry = bookSide[i]
@@ -634,9 +649,9 @@ class wavesexchange(Exchange, ImplicitAPI):
634
649
  price = None
635
650
  amount = None
636
651
  if (pricePrecision is not None) and (entryPrice is not None):
637
- price = Precise.string_div(entryPrice, pricePrecision)
638
- if (amountPrecision is not None) and (entryAmount is not None):
639
- amount = Precise.string_div(entryAmount, amountPrecision)
652
+ price = Precise.string_mul(entryPrice, pricePrecision)
653
+ if (amountPrecisionString is not None) and (entryAmount is not None):
654
+ amount = Precise.string_mul(entryAmount, amountPrecisionString)
640
655
  if (limit is not None) and (i > limit):
641
656
  break
642
657
  result.append([
@@ -715,6 +730,9 @@ class wavesexchange(Exchange, ImplicitAPI):
715
730
  def sign_in(self, params={}):
716
731
  """
717
732
  sign in, must be called prior to using other authenticated methods
733
+
734
+ https://docs.wx.network/en/api/auth/oauth2-token
735
+
718
736
  :param dict [params]: extra parameters specific to the exchange API endpoint
719
737
  :returns: response from exchange
720
738
  """
@@ -731,7 +749,7 @@ class wavesexchange(Exchange, ImplicitAPI):
731
749
  payload = prefix + messageHex
732
750
  hexKey = self.binary_to_base16(self.base58_to_binary(self.secret))
733
751
  signature = self.axolotl(payload, hexKey, 'ed25519')
734
- request = {
752
+ request: dict = {
735
753
  'grant_type': 'password',
736
754
  'scope': 'general',
737
755
  'username': self.apiKey,
@@ -748,7 +766,7 @@ class wavesexchange(Exchange, ImplicitAPI):
748
766
  return self.options['accessToken']
749
767
  return None
750
768
 
751
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
769
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
752
770
  #
753
771
  # {
754
772
  # "symbol": "WAVES/BTC",
@@ -825,13 +843,16 @@ class wavesexchange(Exchange, ImplicitAPI):
825
843
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
826
844
  """
827
845
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
846
+
847
+ https://api.wavesplatform.com/v0/docs/#/pairs/getPairsListAll
848
+
828
849
  :param str symbol: unified symbol of the market to fetch the ticker for
829
850
  :param dict [params]: extra parameters specific to the exchange API endpoint
830
851
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
831
852
  """
832
853
  self.load_markets()
833
854
  market = self.market(symbol)
834
- request = {
855
+ request: dict = {
835
856
  'pairs': market['id'],
836
857
  }
837
858
  response = self.publicGetPairs(self.extend(request, params))
@@ -860,13 +881,13 @@ class wavesexchange(Exchange, ImplicitAPI):
860
881
  #
861
882
  data = self.safe_value(response, 'data', [])
862
883
  ticker = self.safe_value(data, 0, {})
863
- dataTicker = self.safe_value(ticker, 'data', {})
884
+ dataTicker = self.safe_dict(ticker, 'data', {})
864
885
  return self.parse_ticker(dataTicker, market)
865
886
 
866
887
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
867
888
  """
868
889
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
869
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
890
+ :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
870
891
  :param dict [params]: extra parameters specific to the exchange API endpoint
871
892
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
872
893
  """
@@ -905,6 +926,9 @@ class wavesexchange(Exchange, ImplicitAPI):
905
926
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
906
927
  """
907
928
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
929
+
930
+ https://api.wavesplatform.com/v0/docs/#/candles/getCandles
931
+
908
932
  :param str symbol: unified symbol of the market to fetch OHLCV data for
909
933
  :param str timeframe: the length of time each candle represents
910
934
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -914,7 +938,7 @@ class wavesexchange(Exchange, ImplicitAPI):
914
938
  """
915
939
  self.load_markets()
916
940
  market = self.market(symbol)
917
- request = {
941
+ request: dict = {
918
942
  'baseId': market['baseId'],
919
943
  'quoteId': market['quoteId'],
920
944
  'interval': self.safe_string(self.timeframes, timeframe, timeframe),
@@ -1014,7 +1038,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1014
1038
  self.safe_number(data, 'volume', 0),
1015
1039
  ]
1016
1040
 
1017
- def fetch_deposit_address(self, code: str, params={}):
1041
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1018
1042
  """
1019
1043
  fetch the deposit address for a currency associated with self account
1020
1044
  :param str code: unified currency code
@@ -1059,8 +1083,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1059
1083
  # ]
1060
1084
  # }
1061
1085
  #
1062
- currencies = {}
1063
- networksByCurrency = {}
1086
+ currencies: dict = {}
1087
+ networksByCurrency: dict = {}
1064
1088
  items = self.safe_value(supportedCurrencies, 'items', [])
1065
1089
  for i in range(0, len(items)):
1066
1090
  entry = items[i]
@@ -1077,7 +1101,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1077
1101
  raise ExchangeError(self.id + ' fetchDepositAddress() ' + code + ' not supported. Currency code must be one of ' + ', '.join(codes))
1078
1102
  response = None
1079
1103
  if network is None:
1080
- request = {
1104
+ request: dict = {
1081
1105
  'currency': code,
1082
1106
  }
1083
1107
  response = self.privateGetDepositAddressesCurrency(self.extend(request, params))
@@ -1087,21 +1111,20 @@ class wavesexchange(Exchange, ImplicitAPI):
1087
1111
  supportedNetworkKeys = list(supportedNetworks.keys())
1088
1112
  raise ExchangeError(self.id + ' ' + network + ' network ' + code + ' deposit address not supported. Network must be one of ' + ', '.join(supportedNetworkKeys))
1089
1113
  if network == 'WAVES':
1090
- request = {
1114
+ request: dict = {
1091
1115
  'publicKey': self.apiKey,
1092
1116
  }
1093
1117
  responseInner = self.nodeGetAddressesPublicKeyPublicKey(self.extend(request, request))
1094
1118
  addressInner = self.safe_string(response, 'address')
1095
1119
  return {
1096
- 'address': addressInner,
1097
- 'code': code, # kept here for backward-compatibility, but will be removed soon
1120
+ 'info': responseInner,
1098
1121
  'currency': code,
1099
1122
  'network': network,
1123
+ 'address': addressInner,
1100
1124
  'tag': None,
1101
- 'info': responseInner,
1102
1125
  }
1103
1126
  else:
1104
- request = {
1127
+ request: dict = {
1105
1128
  'currency': code,
1106
1129
  'platform': network,
1107
1130
  }
@@ -1136,12 +1159,11 @@ class wavesexchange(Exchange, ImplicitAPI):
1136
1159
  addresses = self.safe_value(response, 'deposit_addresses')
1137
1160
  address = self.safe_string(addresses, 0)
1138
1161
  return {
1139
- 'address': address,
1140
- 'code': code, # kept here for backward-compatibility, but will be removed soon
1162
+ 'info': response,
1141
1163
  'currency': code,
1142
- 'tag': None,
1143
1164
  'network': unifiedNetwork,
1144
- 'info': response,
1165
+ 'address': address,
1166
+ 'tag': None,
1145
1167
  }
1146
1168
 
1147
1169
  def get_matcher_public_key(self):
@@ -1166,50 +1188,35 @@ class wavesexchange(Exchange, ImplicitAPI):
1166
1188
  return ''
1167
1189
  return currencyId
1168
1190
 
1169
- def custom_price_to_precision(self, symbol, price):
1191
+ def to_real_currency_amount(self, code: str, amount: float, networkCode=None):
1192
+ currency = self.currency(code)
1193
+ stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(currency, 'precision'))
1194
+ return int(stringValue)
1195
+
1196
+ def from_real_currency_amount(self, code: str, amountString: str):
1197
+ if not (code in self.currencies):
1198
+ return amountString
1199
+ currency = self.currency(code)
1200
+ precisionAmount = self.safe_string(currency, 'precision')
1201
+ return Precise.string_mul(amountString, precisionAmount)
1202
+
1203
+ def to_real_symbol_price(self, symbol: str, price: float):
1204
+ market = self.market(symbol)
1205
+ stringValue = Precise.string_div(self.number_to_string(price), self.safe_string(market['precision'], 'price'))
1206
+ return int(stringValue)
1207
+
1208
+ def from_real_symbol_price(self, symbol: str, priceString: str):
1170
1209
  market = self.markets[symbol]
1171
- wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '8')
1172
- amount = self.number_to_string(market['precision']['amount'])
1173
- precisionPrice = self.number_to_string(market['precision']['price'])
1174
- difference = Precise.string_sub(amount, precisionPrice)
1175
- precision = Precise.string_sub(wavesPrecision, difference)
1176
- pricePrecision = self.to_precision(price, str(precision))
1177
- return self.parse_to_int(float(pricePrecision))
1178
-
1179
- def custom_amount_to_precision(self, symbol, amount):
1180
- amountPrecision = self.number_to_string(self.to_precision(amount, self.number_to_string(self.markets[symbol]['precision']['amount'])))
1181
- return self.parse_to_int(float(amountPrecision))
1182
-
1183
- def currency_to_precision(self, code, amount, networkCode=None):
1184
- amountPrecision = self.number_to_string(self.to_precision(amount, self.currencies[code]['precision']))
1185
- return self.parse_to_int(float(amountPrecision))
1186
-
1187
- def from_precision(self, amount, scale):
1188
- if amount is None:
1189
- return None
1190
- precise = Precise(amount)
1191
- precise.decimals = self.sum(precise.decimals, scale)
1192
- precise.reduce()
1193
- return str(precise)
1194
-
1195
- def to_precision(self, amount, scale):
1196
- amountString = self.number_to_string(amount)
1197
- precise = Precise(amountString)
1198
- # precise.decimals should be integer
1199
- precise.decimals = self.parse_to_int(Precise.string_sub(self.number_to_string(precise.decimals), self.number_to_string(scale)))
1200
- precise.reduce()
1201
- stringValue = str(precise)
1202
- return stringValue
1203
-
1204
- def currency_from_precision(self, currency, amount):
1205
- scale = self.currencies[currency]['precision']
1206
- return self.from_precision(amount, scale)
1207
-
1208
- def price_from_precision(self, symbol, price):
1210
+ return Precise.string_mul(priceString, self.safe_string(market['precision'], 'price'))
1211
+
1212
+ def to_real_symbol_amount(self, symbol: str, amount: float):
1213
+ market = self.market(symbol)
1214
+ stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(market['precision'], 'amount'))
1215
+ return int(stringValue)
1216
+
1217
+ def from_real_symbol_amount(self, symbol: str, amountString: str):
1209
1218
  market = self.markets[symbol]
1210
- wavesPrecision = self.safe_integer(self.options, 'wavesPrecision', 8)
1211
- scale = self.sum(wavesPrecision, market['precision']['price']) - market['precision']['amount']
1212
- return self.from_precision(price, scale)
1219
+ return Precise.string_mul(amountString, market['precision']['amount'])
1213
1220
 
1214
1221
  def safe_get_dynamic(self, settings):
1215
1222
  orderFee = self.safe_value(settings, 'orderFee')
@@ -1227,13 +1234,16 @@ class wavesexchange(Exchange, ImplicitAPI):
1227
1234
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1228
1235
  """
1229
1236
  create a trade order
1237
+
1238
+ https://matcher.waves.exchange/api-docs/index.html#/serialize/serializeOrder
1239
+
1230
1240
  :param str symbol: unified symbol of the market to create an order in
1231
1241
  :param str type: 'market' or 'limit'
1232
1242
  :param str side: 'buy' or 'sell'
1233
1243
  :param float amount: how much of currency you want to trade in units of base currency
1234
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1244
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1235
1245
  :param dict [params]: extra parameters specific to the exchange API endpoint
1236
- :param float [params.stopPrice]: The price at which a stop order is triggered at
1246
+ :param float [params.triggerPrice]: The price at which a stop order is triggered at
1237
1247
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1238
1248
  """
1239
1249
  self.check_required_dependencies()
@@ -1244,12 +1254,13 @@ class wavesexchange(Exchange, ImplicitAPI):
1244
1254
  amountAsset = self.get_asset_id(market['baseId'])
1245
1255
  priceAsset = self.get_asset_id(market['quoteId'])
1246
1256
  isMarketOrder = (type == 'market')
1247
- stopPrice = self.safe_float_2(params, 'triggerPrice', 'stopPrice')
1248
- isStopOrder = (stopPrice is not None)
1257
+ triggerPrice = self.safe_float_2(params, 'triggerPrice', 'stopPrice')
1258
+ isStopOrder = (triggerPrice is not None)
1249
1259
  if (isMarketOrder) and (price is None):
1250
1260
  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')
1251
1261
  timestamp = self.milliseconds()
1252
- defaultExpiryDelta = self.safe_integer(self.options, 'createOrderDefaultExpiry', 2419200000)
1262
+ defaultExpiryDelta = None
1263
+ defaultExpiryDelta, params = self.handle_option_and_params(params, 'createOrder', 'defaultExpiry', self.safe_integer(self.options, 'createOrderDefaultExpiry', 2419200000))
1253
1264
  expiration = self.sum(timestamp, defaultExpiryDelta)
1254
1265
  matcherFees = self.get_fees_for_asset(symbol, side, amount, price)
1255
1266
  # {
@@ -1283,33 +1294,33 @@ class wavesexchange(Exchange, ImplicitAPI):
1283
1294
  raise InvalidOrder(self.id + ' asset fee must be ' + baseFeeAsset + ' or ' + discountFeeAsset)
1284
1295
  matcherFeeAsset = self.safe_currency_code(matcherFeeAssetId)
1285
1296
  rawMatcherFee = baseMatcherFee if (matcherFeeAssetId == baseFeeAssetId) else discountMatcherFee
1286
- floatMatcherFee = float(self.currency_from_precision(matcherFeeAsset, rawMatcherFee))
1297
+ floatMatcherFee = float(self.from_real_currency_amount(matcherFeeAsset, rawMatcherFee))
1287
1298
  if (matcherFeeAsset in balances) and (balances[matcherFeeAsset]['free'] >= floatMatcherFee):
1288
1299
  matcherFee = int(rawMatcherFee)
1289
1300
  else:
1290
1301
  raise InsufficientFunds(self.id + ' not enough funds of the selected asset fee')
1302
+ floatBaseMatcherFee = self.from_real_currency_amount(baseFeeAsset, baseMatcherFee)
1303
+ floatDiscountMatcherFee = self.from_real_currency_amount(discountFeeAsset, discountMatcherFee)
1291
1304
  if matcherFeeAssetId is None:
1292
1305
  # try to the pay the fee using the base first then discount asset
1293
- floatBaseMatcherFee = float(self.currency_from_precision(baseFeeAsset, baseMatcherFee))
1294
- if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= floatBaseMatcherFee):
1306
+ if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= float(floatBaseMatcherFee)):
1295
1307
  matcherFeeAssetId = baseFeeAssetId
1296
1308
  matcherFee = int(baseMatcherFee)
1297
1309
  else:
1298
- floatDiscountMatcherFee = float(self.currency_from_precision(discountFeeAsset, discountMatcherFee))
1299
- if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= floatDiscountMatcherFee):
1310
+ if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= float(floatDiscountMatcherFee)):
1300
1311
  matcherFeeAssetId = discountFeeAssetId
1301
1312
  matcherFee = int(discountMatcherFee)
1302
1313
  if matcherFeeAssetId is None:
1303
- raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees')
1304
- amount = self.custom_amount_to_precision(symbol, amount)
1305
- price = self.custom_price_to_precision(symbol, price)
1306
- assetPair = {
1314
+ raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees: ' + baseFeeAsset + ' ' + floatBaseMatcherFee + ' or ' + discountFeeAsset + ' ' + floatDiscountMatcherFee)
1315
+ amount = self.to_real_symbol_amount(symbol, amount)
1316
+ price = self.to_real_symbol_price(symbol, price)
1317
+ assetPair: dict = {
1307
1318
  'amountAsset': amountAsset,
1308
1319
  'priceAsset': priceAsset,
1309
1320
  }
1310
1321
  sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
1311
1322
  chainId = 84 if (sandboxMode) else 87
1312
- body = {
1323
+ body: dict = {
1313
1324
  'senderPublicKey': self.apiKey,
1314
1325
  'matcherPublicKey': matcherPublicKey,
1315
1326
  'assetPair': assetPair,
@@ -1335,12 +1346,12 @@ class wavesexchange(Exchange, ImplicitAPI):
1335
1346
  # },
1336
1347
  # }
1337
1348
  #
1338
- attachment = {
1349
+ attachment: dict = {
1339
1350
  'v': 1,
1340
1351
  'c': {
1341
1352
  't': 'sp',
1342
1353
  'v': {
1343
- 'p': self.custom_price_to_precision(symbol, stopPrice),
1354
+ 'p': self.to_real_symbol_price(symbol, triggerPrice),
1344
1355
  },
1345
1356
  },
1346
1357
  }
@@ -1384,17 +1395,20 @@ class wavesexchange(Exchange, ImplicitAPI):
1384
1395
  # }
1385
1396
  #
1386
1397
  if isMarketOrder:
1387
- response = self.matcherPostMatcherOrderbookMarket(body)
1388
- value = self.safe_value(response, 'message')
1398
+ response = self.matcherPostMatcherOrderbookMarket(self.extend(body, params))
1399
+ value = self.safe_dict(response, 'message')
1389
1400
  return self.parse_order(value, market)
1390
1401
  else:
1391
- response = self.matcherPostMatcherOrderbook(body)
1392
- value = self.safe_value(response, 'message')
1402
+ response = self.matcherPostMatcherOrderbook(self.extend(body, params))
1403
+ value = self.safe_dict(response, 'message')
1393
1404
  return self.parse_order(value, market)
1394
1405
 
1395
1406
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1396
1407
  """
1397
1408
  cancels an open order
1409
+
1410
+ https://matcher.waves.exchange/api-docs/index.html#/cancel/cancelOrdersByIdsWithKeyOrSignature
1411
+
1398
1412
  :param str id: order id
1399
1413
  :param str symbol: unified symbol of the market the order was made in
1400
1414
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1417,7 +1431,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1417
1431
  firstMessage = self.safe_value(message, 0)
1418
1432
  firstOrder = self.safe_value(firstMessage, 0)
1419
1433
  returnedId = self.safe_string(firstOrder, 'orderId')
1420
- return {
1434
+ return self.safe_order({
1421
1435
  'info': response,
1422
1436
  'id': returnedId,
1423
1437
  'clientOrderId': None,
@@ -1436,11 +1450,15 @@ class wavesexchange(Exchange, ImplicitAPI):
1436
1450
  'status': None,
1437
1451
  'fee': None,
1438
1452
  'trades': None,
1439
- }
1453
+ })
1440
1454
 
1441
1455
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1442
1456
  """
1443
1457
  fetches information on an order made by the user
1458
+
1459
+ https://matcher.waves.exchange/api-docs/index.html#/status/getOrderStatusByPKAndIdWithSig
1460
+
1461
+ :param str id: order id
1444
1462
  :param str symbol: unified symbol of the market the order was made in
1445
1463
  :param dict [params]: extra parameters specific to the exchange API endpoint
1446
1464
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1459,7 +1477,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1459
1477
  binary = self.binary_concat_array(byteArray)
1460
1478
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1461
1479
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1462
- request = {
1480
+ request: dict = {
1463
1481
  'Timestamp': str(timestamp),
1464
1482
  'Signature': signature,
1465
1483
  'publicKey': self.apiKey,
@@ -1491,7 +1509,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1491
1509
  binary = self.binary_concat_array(byteArray)
1492
1510
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1493
1511
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1494
- request = {
1512
+ request: dict = {
1495
1513
  'Accept': 'application/json',
1496
1514
  'Timestamp': str(timestamp),
1497
1515
  'Signature': signature,
@@ -1532,7 +1550,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1532
1550
  if symbol is not None:
1533
1551
  market = self.market(symbol)
1534
1552
  address = self.get_waves_address()
1535
- request = {
1553
+ request: dict = {
1536
1554
  'address': address,
1537
1555
  'activeOnly': True,
1538
1556
  }
@@ -1554,7 +1572,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1554
1572
  if symbol is not None:
1555
1573
  market = self.market(symbol)
1556
1574
  address = self.get_waves_address()
1557
- request = {
1575
+ request: dict = {
1558
1576
  'address': address,
1559
1577
  'closedOnly': True,
1560
1578
  }
@@ -1581,8 +1599,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1581
1599
  # ]
1582
1600
  return self.parse_orders(response, market, since, limit)
1583
1601
 
1584
- def parse_order_status(self, status):
1585
- statuses = {
1602
+ def parse_order_status(self, status: Str):
1603
+ statuses: dict = {
1586
1604
  'Cancelled': 'canceled',
1587
1605
  'Accepted': 'open',
1588
1606
  'Filled': 'closed',
@@ -1596,7 +1614,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1596
1614
  quoteId = self.safe_string(assetPair, 'priceAsset', 'WAVES')
1597
1615
  return self.safe_currency_code(baseId) + '/' + self.safe_currency_code(quoteId)
1598
1616
 
1599
- def parse_order(self, order, market: Market = None) -> Order:
1617
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1600
1618
  #
1601
1619
  # createOrder
1602
1620
  #
@@ -1666,23 +1684,23 @@ class wavesexchange(Exchange, ImplicitAPI):
1666
1684
  elif market is not None:
1667
1685
  symbol = market['symbol']
1668
1686
  amountCurrency = self.safe_currency_code(self.safe_string(assetPair, 'amountAsset', 'WAVES'))
1669
- price = self.price_from_precision(symbol, priceString)
1670
- amount = self.currency_from_precision(amountCurrency, amountString)
1671
- filled = self.currency_from_precision(amountCurrency, filledString)
1672
- average = self.price_from_precision(symbol, self.safe_string(order, 'avgWeighedPrice'))
1687
+ price = self.from_real_symbol_price(symbol, priceString)
1688
+ amount = self.from_real_currency_amount(amountCurrency, amountString)
1689
+ filled = self.from_real_currency_amount(amountCurrency, filledString)
1690
+ average = self.from_real_symbol_price(symbol, self.safe_string(order, 'avgWeighedPrice'))
1673
1691
  status = self.parse_order_status(self.safe_string(order, 'status'))
1674
1692
  fee = None
1675
1693
  if 'type' in order:
1676
- currency = self.safe_currency_code(self.safe_string(order, 'feeAsset'))
1694
+ code = self.safe_currency_code(self.safe_string(order, 'feeAsset'))
1677
1695
  fee = {
1678
- 'currency': currency,
1679
- 'fee': self.parse_number(self.currency_from_precision(currency, self.safe_string(order, 'filledFee'))),
1696
+ 'currency': code,
1697
+ 'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'filledFee'))),
1680
1698
  }
1681
1699
  else:
1682
- currency = self.safe_currency_code(self.safe_string(order, 'matcherFeeAssetId', 'WAVES'))
1700
+ code = self.safe_currency_code(self.safe_string(order, 'matcherFeeAssetId', 'WAVES'))
1683
1701
  fee = {
1684
- 'currency': currency,
1685
- 'fee': self.parse_number(self.currency_from_precision(currency, self.safe_string(order, 'matcherFee'))),
1702
+ 'currency': code,
1703
+ 'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'matcherFee'))),
1686
1704
  }
1687
1705
  triggerPrice = None
1688
1706
  attachment = self.safe_string(order, 'attachment')
@@ -1707,7 +1725,6 @@ class wavesexchange(Exchange, ImplicitAPI):
1707
1725
  'postOnly': None,
1708
1726
  'side': side,
1709
1727
  'price': price,
1710
- 'stopPrice': triggerPrice,
1711
1728
  'triggerPrice': triggerPrice,
1712
1729
  'amount': amount,
1713
1730
  'cost': None,
@@ -1722,7 +1739,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1722
1739
  def get_waves_address(self):
1723
1740
  cachedAddreess = self.safe_string(self.options, 'wavesAddress')
1724
1741
  if cachedAddreess is None:
1725
- request = {
1742
+ request: dict = {
1726
1743
  'publicKey': self.apiKey,
1727
1744
  }
1728
1745
  response = self.nodeGetAddressesPublicKeyPublicKey(request)
@@ -1747,7 +1764,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1747
1764
  self.check_required_keys()
1748
1765
  self.load_markets()
1749
1766
  wavesAddress = self.get_waves_address()
1750
- request = {
1767
+ request: dict = {
1751
1768
  'address': wavesAddress,
1752
1769
  }
1753
1770
  totalBalance = self.nodeGetAssetsBalanceAddress(request)
@@ -1786,7 +1803,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1786
1803
  # ]
1787
1804
  # }
1788
1805
  balances = self.safe_value(totalBalance, 'balances', [])
1789
- result = {}
1806
+ result: dict = {}
1790
1807
  timestamp = None
1791
1808
  assetIds = []
1792
1809
  nonStandardBalances = []
@@ -1797,19 +1814,17 @@ class wavesexchange(Exchange, ImplicitAPI):
1797
1814
  issueTransaction = self.safe_value(entry, 'issueTransaction')
1798
1815
  currencyId = self.safe_string(entry, 'assetId')
1799
1816
  balance = self.safe_string(entry, 'balance')
1800
- if issueTransaction is None:
1801
- assetIds.append(currencyId)
1802
- nonStandardBalances.append(balance)
1803
- continue
1804
- decimals = self.safe_integer(issueTransaction, 'decimals')
1805
- code = None
1806
- if currencyId in self.currencies_by_id:
1817
+ currencyExists = (currencyId in self.currencies_by_id)
1818
+ if currencyExists:
1807
1819
  code = self.safe_currency_code(currencyId)
1808
1820
  result[code] = self.account()
1809
- result[code]['total'] = self.from_precision(balance, decimals)
1821
+ result[code]['total'] = self.from_real_currency_amount(code, balance)
1822
+ elif issueTransaction is None:
1823
+ assetIds.append(currencyId)
1824
+ nonStandardBalances.append(balance)
1810
1825
  nonStandardAssets = len(assetIds)
1811
1826
  if nonStandardAssets:
1812
- requestInner = {
1827
+ requestInner: dict = {
1813
1828
  'ids': assetIds,
1814
1829
  }
1815
1830
  response = self.publicGetAssets(requestInner)
@@ -1818,11 +1833,11 @@ class wavesexchange(Exchange, ImplicitAPI):
1818
1833
  entry = data[i]
1819
1834
  balance = nonStandardBalances[i]
1820
1835
  inner = self.safe_value(entry, 'data')
1821
- decimals = self.safe_integer(inner, 'precision')
1836
+ precision = self.parse_precision(self.safe_string(inner, 'precision'))
1822
1837
  ticker = self.safe_string(inner, 'ticker')
1823
1838
  code = self.safe_currency_code(ticker)
1824
1839
  result[code] = self.account()
1825
- result[code]['total'] = self.from_precision(balance, decimals)
1840
+ result[code]['total'] = Precise.string_mul(balance, precision)
1826
1841
  currentTimestamp = self.milliseconds()
1827
1842
  byteArray = [
1828
1843
  self.base58_to_binary(self.apiKey),
@@ -1831,7 +1846,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1831
1846
  binary = self.binary_concat_array(byteArray)
1832
1847
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
1833
1848
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
1834
- matcherRequest = {
1849
+ matcherRequest: dict = {
1835
1850
  'publicKey': self.apiKey,
1836
1851
  'signature': signature,
1837
1852
  'timestamp': str(currentTimestamp),
@@ -1845,11 +1860,8 @@ class wavesexchange(Exchange, ImplicitAPI):
1845
1860
  if not (code in result):
1846
1861
  result[code] = self.account()
1847
1862
  amount = self.safe_string(reservedBalance, currencyId)
1848
- if code in self.currencies:
1849
- result[code]['used'] = self.currency_from_precision(code, amount)
1850
- else:
1851
- result[code]['used'] = amount
1852
- wavesRequest = {
1863
+ result[code]['used'] = self.from_real_currency_amount(code, amount)
1864
+ wavesRequest: dict = {
1853
1865
  'address': wavesAddress,
1854
1866
  }
1855
1867
  wavesTotal = self.nodeGetAddressesBalanceAddress(wavesRequest)
@@ -1858,20 +1870,27 @@ class wavesexchange(Exchange, ImplicitAPI):
1858
1870
  # "confirmations": 0,
1859
1871
  # "balance": 909085978
1860
1872
  # }
1861
- result['WAVES'] = self.safe_value(result, 'WAVES', {})
1862
- result['WAVES']['total'] = self.currency_from_precision('WAVES', self.safe_string(wavesTotal, 'balance'))
1863
- codes = list(result.keys())
1864
- for i in range(0, len(codes)):
1865
- code = codes[i]
1866
- if self.safe_value(result[code], 'used') is None:
1867
- result[code]['used'] = '0'
1873
+ result['WAVES'] = self.safe_value(result, 'WAVES', self.account())
1874
+ result['WAVES']['total'] = self.from_real_currency_amount('WAVES', self.safe_string(wavesTotal, 'balance'))
1875
+ result = self.set_undefined_balances_to_zero(result)
1868
1876
  result['timestamp'] = timestamp
1869
1877
  result['datetime'] = self.iso8601(timestamp)
1870
1878
  return self.safe_balance(result)
1871
1879
 
1880
+ def set_undefined_balances_to_zero(self, balances, key='used'):
1881
+ codes = list(balances.keys())
1882
+ for i in range(0, len(codes)):
1883
+ code = codes[i]
1884
+ if self.safe_value(balances[code], 'used') is None:
1885
+ balances[code][key] = '0'
1886
+ return balances
1887
+
1872
1888
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1873
1889
  """
1874
1890
  fetch all trades made by the user
1891
+
1892
+ https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
1893
+
1875
1894
  :param str symbol: unified market symbol
1876
1895
  :param int [since]: the earliest time in ms to fetch trades for
1877
1896
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1880,7 +1899,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1880
1899
  """
1881
1900
  self.load_markets()
1882
1901
  address = self.get_waves_address()
1883
- request = {
1902
+ request: dict = {
1884
1903
  'sender': address,
1885
1904
  }
1886
1905
  market = None
@@ -1961,6 +1980,9 @@ class wavesexchange(Exchange, ImplicitAPI):
1961
1980
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1962
1981
  """
1963
1982
  get the list of most recent trades for a particular symbol
1983
+
1984
+ https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
1985
+
1964
1986
  :param str symbol: unified symbol of the market to fetch trades for
1965
1987
  :param int [since]: timestamp in ms of the earliest trade to fetch
1966
1988
  :param int [limit]: the maximum amount of trades to fetch
@@ -1969,7 +1991,7 @@ class wavesexchange(Exchange, ImplicitAPI):
1969
1991
  """
1970
1992
  self.load_markets()
1971
1993
  market = self.market(symbol)
1972
- request = {
1994
+ request: dict = {
1973
1995
  'amountAsset': market['baseId'],
1974
1996
  'priceAsset': market['quoteId'],
1975
1997
  }
@@ -2047,7 +2069,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2047
2069
  #
2048
2070
  return self.parse_trades(data, market, since, limit)
2049
2071
 
2050
- def parse_trade(self, trade, market: Market = None) -> Trade:
2072
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
2051
2073
  #
2052
2074
  # {__type: "transaction",
2053
2075
  # "data":
@@ -2137,7 +2159,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2137
2159
  }, market)
2138
2160
 
2139
2161
  def parse_deposit_withdraw_fees(self, response, codes: Strings = None, currencyIdKey=None) -> Any:
2140
- depositWithdrawFees = {}
2162
+ depositWithdrawFees: dict = {}
2141
2163
  codes = self.market_codes(codes)
2142
2164
  for i in range(0, len(response)):
2143
2165
  entry = response[i]
@@ -2202,8 +2224,10 @@ class wavesexchange(Exchange, ImplicitAPI):
2202
2224
  def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2203
2225
  """
2204
2226
  fetch deposit and withdraw fees
2205
- :see: https://docs.wx.network/en/api/gateways/deposit/currencies
2206
- :see: https://docs.wx.network/en/api/gateways/withdraw/currencies
2227
+
2228
+ https://docs.wx.network/en/api/gateways/deposit/currencies
2229
+ https://docs.wx.network/en/api/gateways/withdraw/currencies
2230
+
2207
2231
  :param str[]|None codes: list of unified currency codes
2208
2232
  :param dict [params]: extra parameters specific to the exchange API endpoint
2209
2233
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -2275,7 +2299,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2275
2299
  data = self.array_concat(data, items)
2276
2300
  return self.parse_deposit_withdraw_fees(data, codes, 'id')
2277
2301
 
2278
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
2302
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2279
2303
  errorCode = self.safe_string(response, 'error')
2280
2304
  success = self.safe_bool(response, 'success', True)
2281
2305
  Exception = self.safe_value(self.exceptions, errorCode)
@@ -2289,7 +2313,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2289
2313
  raise ExchangeError(self.id + ' ' + body)
2290
2314
  return None
2291
2315
 
2292
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2316
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2293
2317
  """
2294
2318
  make a withdrawal
2295
2319
  :param str code: unified currency code
@@ -2303,7 +2327,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2303
2327
  # currently only works for BTC and WAVES
2304
2328
  if code != 'WAVES':
2305
2329
  supportedCurrencies = self.privateGetWithdrawCurrencies()
2306
- currencies = {}
2330
+ currencies: dict = {}
2307
2331
  items = self.safe_value(supportedCurrencies, 'items', [])
2308
2332
  for i in range(0, len(items)):
2309
2333
  entry = items[i]
@@ -2314,7 +2338,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2314
2338
  raise ExchangeError(self.id + ' withdraw() ' + code + ' not supported. Currency code must be one of ' + str(codes))
2315
2339
  self.load_markets()
2316
2340
  hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
2317
- set = {}
2341
+ set: dict = {}
2318
2342
  for i in range(0, len(hexChars)):
2319
2343
  key = hexChars[i]
2320
2344
  set[key] = True
@@ -2332,7 +2356,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2332
2356
  if code == 'WAVES' and not isErc20:
2333
2357
  proxyAddress = address
2334
2358
  else:
2335
- withdrawAddressRequest = {
2359
+ withdrawAddressRequest: dict = {
2336
2360
  'address': address,
2337
2361
  'currency': code,
2338
2362
  }
@@ -2369,7 +2393,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2369
2393
  feeAssetId = 'WAVES'
2370
2394
  type = 4 # transfer
2371
2395
  version = 2
2372
- amountInteger = self.currency_to_precision(code, amount)
2396
+ amountInteger = self.to_real_currency_amount(code, amount)
2373
2397
  currency = self.currency(code)
2374
2398
  timestamp = self.milliseconds()
2375
2399
  byteArray = [
@@ -2387,7 +2411,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2387
2411
  binary = self.binary_concat_array(byteArray)
2388
2412
  hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
2389
2413
  signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
2390
- request = {
2414
+ request: dict = {
2391
2415
  'senderPublicKey': self.apiKey,
2392
2416
  'amount': amountInteger,
2393
2417
  'fee': fee,
@@ -2416,7 +2440,7 @@ class wavesexchange(Exchange, ImplicitAPI):
2416
2440
  #
2417
2441
  return self.parse_transaction(result, currency)
2418
2442
 
2419
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2443
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2420
2444
  #
2421
2445
  # withdraw
2422
2446
  #
@@ -2429,18 +2453,45 @@ class wavesexchange(Exchange, ImplicitAPI):
2429
2453
  # "amount": 0
2430
2454
  # }
2431
2455
  #
2456
+ # withdraw new:
2457
+ # {
2458
+ # type: "4",
2459
+ # id: "2xnWTqG9ar7jEDrLxfbVyyspPZ6XZNrrw9ai9sQ81Eya",
2460
+ # fee: "100000",
2461
+ # feeAssetId: null,
2462
+ # timestamp: "1715786263807",
2463
+ # version: "2",
2464
+ # sender: "3P81LLX1kk2CSJC9L8C2enxdHB7XvnSGAEE",
2465
+ # senderPublicKey: "DdmzmXf9mty1FBE8AdVGnrncVLEAzP4gR4nWoTFAJoXz",
2466
+ # proofs: ["RyoKwdSYv3EqotJCYftfFM9JE2j1ZpDRxKwYfiRhLAFeyNp6VfJUXNDS884XfeCeHeNypNmTCZt5NYR1ekyjCX3",],
2467
+ # recipient: "3P9tXxu38a8tgewNEKFzourVxeqHd11ppOc",
2468
+ # assetId: null,
2469
+ # feeAsset: null,
2470
+ # amount: "2000000",
2471
+ # attachment: "",
2472
+ # }
2473
+ #
2432
2474
  currency = self.safe_currency(None, currency)
2475
+ code = currency['code']
2476
+ typeRaw = self.safe_string(transaction, 'type')
2477
+ type = 'withdraw' if (typeRaw == '4') else 'deposit'
2478
+ amount = self.parse_number(self.from_real_currency_amount(code, self.safe_string(transaction, 'amount')))
2479
+ feeString = self.safe_string(transaction, 'fee')
2480
+ feeAssetId = self.safe_string(transaction, 'feeAssetId', 'WAVES')
2481
+ feeCode = self.safe_currency_code(feeAssetId)
2482
+ feeAmount = self.parse_number(self.from_real_currency_amount(feeCode, feeString))
2483
+ timestamp = self.safe_integer(transaction, 'timestamp')
2433
2484
  return {
2434
- 'id': None,
2485
+ 'id': self.safe_string(transaction, 'id'),
2435
2486
  'txid': None,
2436
- 'timestamp': None,
2437
- 'datetime': None,
2487
+ 'timestamp': timestamp,
2488
+ 'datetime': self.iso8601(timestamp),
2438
2489
  'network': None,
2439
- 'addressFrom': None,
2490
+ 'addressFrom': self.safe_string(transaction, 'sender'),
2440
2491
  'address': None,
2441
- 'addressTo': None,
2442
- 'amount': None,
2443
- 'type': None,
2492
+ 'addressTo': self.safe_string(transaction, 'recipient'),
2493
+ 'amount': amount,
2494
+ 'type': type,
2444
2495
  'currency': currency['code'],
2445
2496
  'status': None,
2446
2497
  'updated': None,
@@ -2449,6 +2500,9 @@ class wavesexchange(Exchange, ImplicitAPI):
2449
2500
  'tagTo': None,
2450
2501
  'comment': None,
2451
2502
  'internal': None,
2452
- 'fee': None,
2503
+ 'fee': {
2504
+ 'currency': feeCode,
2505
+ 'cost': feeAmount,
2506
+ },
2453
2507
  'info': transaction,
2454
2508
  }