ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__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 +3205 -937
  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 +1525 -573
  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 +223 -97
  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 +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -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 +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -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 +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -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 +3205 -937
  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 +1525 -573
  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 +223 -97
  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 +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -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 +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -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 +143 -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.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.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.49.dist-info}/top_level.txt +0 -0
@@ -8,9 +8,10 @@ from ccxt.abstract.bitrue import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
11
+ from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
+ from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import PermissionDenied
15
16
  from ccxt.base.errors import AccountSuspended
16
17
  from ccxt.base.errors import ArgumentsRequired
@@ -26,7 +27,6 @@ from ccxt.base.errors import RateLimitExceeded
26
27
  from ccxt.base.errors import ExchangeNotAvailable
27
28
  from ccxt.base.errors import OnMaintenance
28
29
  from ccxt.base.errors import InvalidNonce
29
- from ccxt.base.errors import AuthenticationError
30
30
  from ccxt.base.decimal_to_precision import TRUNCATE
31
31
  from ccxt.base.decimal_to_precision import TICK_SIZE
32
32
  from ccxt.base.precise import Precise
@@ -73,7 +73,10 @@ class bitrue(Exchange, ImplicitAPI):
73
73
  'fetchDepositsWithdrawals': False,
74
74
  'fetchDepositWithdrawFee': 'emulated',
75
75
  'fetchDepositWithdrawFees': True,
76
+ 'fetchFundingHistory': False,
76
77
  'fetchFundingRate': False,
78
+ 'fetchFundingRateHistory': False,
79
+ 'fetchFundingRates': False,
77
80
  'fetchIsolatedBorrowRate': False,
78
81
  'fetchIsolatedBorrowRates': False,
79
82
  'fetchMarginMode': False,
@@ -113,7 +116,7 @@ class bitrue(Exchange, ImplicitAPI):
113
116
  '1w': '1W',
114
117
  },
115
118
  'urls': {
116
- 'logo': 'https://user-images.githubusercontent.com/1294454/139516488-243a830d-05dd-446b-91c6-c1f18fe30c63.jpg',
119
+ 'logo': 'https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e',
117
120
  'api': {
118
121
  'spot': 'https://www.bitrue.com/api',
119
122
  'fapi': 'https://fapi.bitrue.com/fapi',
@@ -345,6 +348,7 @@ class bitrue(Exchange, ImplicitAPI):
345
348
  # 'fetchTradesMethod': 'publicGetAggTrades', # publicGetTrades, publicGetHistoricalTrades
346
349
  'fetchMyTradesMethod': 'v2PrivateGetMyTrades', # spotV1PrivateGetMyTrades
347
350
  'hasAlreadyAuthenticatedSuccessfully': False,
351
+ 'currencyToPrecisionRoundingMode': TRUNCATE,
348
352
  'recvWindow': 5 * 1000, # 5 sec, binance default
349
353
  'timeDifference': 0, # the difference between system clock and Binance clock
350
354
  'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
@@ -356,6 +360,67 @@ class bitrue(Exchange, ImplicitAPI):
356
360
  'networks': {
357
361
  'ERC20': 'ETH',
358
362
  'TRC20': 'TRX',
363
+ 'AETERNITY': 'Aeternity',
364
+ 'AION': 'AION',
365
+ 'ALGO': 'Algorand',
366
+ 'ASK': 'ASK',
367
+ 'ATOM': 'ATOM',
368
+ 'AVAXC': 'AVAX C-Chain',
369
+ 'BCH': 'BCH',
370
+ 'BEP2': 'BEP2',
371
+ 'BEP20': 'BEP20',
372
+ 'Bitcoin': 'Bitcoin',
373
+ 'BRP20': 'BRP20',
374
+ 'ADA': 'Cardano',
375
+ 'CASINOCOIN': 'CasinoCoin',
376
+ 'CASINOCOIN-XRPL': 'CasinoCoin XRPL',
377
+ 'CONTENTOS': 'Contentos',
378
+ 'DASH': 'Dash',
379
+ 'DECOIN': 'Decoin',
380
+ 'DFI': 'DeFiChain',
381
+ 'DGB': 'DGB',
382
+ 'DIVI': 'Divi',
383
+ 'DOGE': 'dogecoin',
384
+ 'EOS': 'EOS',
385
+ 'ETC': 'ETC',
386
+ 'FILECOIN': 'Filecoin',
387
+ 'FREETON': 'FREETON',
388
+ 'HBAR': 'HBAR',
389
+ 'HEDERA': 'Hedera Hashgraph',
390
+ 'HRC20': 'HRC20',
391
+ 'ICON': 'ICON',
392
+ 'ICP': 'ICP',
393
+ 'IGNIS': 'Ignis',
394
+ 'INTERNETCOMPUTER': 'Internet Computer',
395
+ 'IOTA': 'IOTA',
396
+ 'KAVA': 'KAVA',
397
+ 'KSM': 'KSM',
398
+ 'LTC': 'LiteCoin',
399
+ 'LUNA': 'Luna',
400
+ 'MATIC': 'MATIC',
401
+ 'MOBILECOIN': 'Mobile Coin',
402
+ 'MONACOIN': 'MonaCoin',
403
+ 'XMR': 'Monero',
404
+ 'NEM': 'NEM',
405
+ 'NEP5': 'NEP5',
406
+ 'OMNI': 'OMNI',
407
+ 'PAC': 'PAC',
408
+ 'DOT': 'Polkadot',
409
+ 'RAVEN': 'Ravencoin',
410
+ 'SAFEX': 'Safex',
411
+ 'SOL': 'SOLANA',
412
+ 'SGB': 'Songbird',
413
+ 'XML': 'Stellar Lumens',
414
+ 'XYM': 'Symbol',
415
+ 'XTZ': 'Tezos',
416
+ 'theta': 'theta',
417
+ 'THETA': 'THETA',
418
+ 'VECHAIN': 'VeChain',
419
+ 'WANCHAIN': 'Wanchain',
420
+ 'XINFIN': 'XinFin Network',
421
+ 'XRP': 'XRP',
422
+ 'XRPL': 'XRPL',
423
+ 'ZIL': 'ZIL',
359
424
  },
360
425
  'defaultType': 'spot',
361
426
  'timeframes': {
@@ -395,7 +460,92 @@ class bitrue(Exchange, ImplicitAPI):
395
460
  'MIM': 'MIM Swarm',
396
461
  },
397
462
  'precisionMode': TICK_SIZE,
398
- # https://binance-docs.github.io/apidocs/spot/en/#error-codes-2
463
+ 'features': {
464
+ 'default': {
465
+ 'sandbox': False,
466
+ 'createOrder': {
467
+ 'marginMode': False,
468
+ 'triggerPrice': True,
469
+ 'triggerPriceType': None,
470
+ 'triggerDirection': None,
471
+ 'stopLossPrice': False, # todo
472
+ 'takeProfitPrice': False, # todo
473
+ 'attachedStopLossTakeProfit': None,
474
+ 'timeInForce': {
475
+ 'IOC': True,
476
+ 'FOK': True,
477
+ 'PO': True,
478
+ 'GTD': False,
479
+ },
480
+ 'hedged': False,
481
+ 'trailing': False,
482
+ 'leverage': False,
483
+ 'marketBuyRequiresPrice': True, # todo revise
484
+ 'marketBuyByCost': True,
485
+ 'selfTradePrevention': False,
486
+ 'iceberg': True, # todo implement
487
+ },
488
+ 'createOrders': None,
489
+ 'fetchMyTrades': {
490
+ 'marginMode': False,
491
+ 'limit': 1000,
492
+ 'daysBack': 100000,
493
+ 'untilDays': 100000,
494
+ },
495
+ 'fetchOrder': {
496
+ 'marginMode': False,
497
+ 'trigger': False,
498
+ 'trailing': False,
499
+ },
500
+ 'fetchOpenOrders': {
501
+ 'marginMode': False,
502
+ 'limit': None,
503
+ 'trigger': False,
504
+ 'trailing': False,
505
+ },
506
+ 'fetchOrders': None,
507
+ 'fetchClosedOrders': {
508
+ 'marginMode': False,
509
+ 'limit': 1000,
510
+ 'daysBack': 90,
511
+ 'daysBackCanceled': 1,
512
+ 'untilDays': 90,
513
+ 'trigger': False,
514
+ 'trailing': False,
515
+ },
516
+ 'fetchOHLCV': {
517
+ 'limit': 1440,
518
+ },
519
+ },
520
+ 'spot': {
521
+ 'extends': 'default',
522
+ },
523
+ 'forDerivatives': {
524
+ 'extends': 'default',
525
+ 'createOrder': {
526
+ 'marginMode': True,
527
+ 'leverage': True,
528
+ 'marketBuyRequiresPrice': False,
529
+ 'marketBuyByCost': False,
530
+ },
531
+ 'fetchOHLCV': {
532
+ 'limit': 300,
533
+ },
534
+ 'fetchClosedOrders': None,
535
+ },
536
+ 'swap': {
537
+ 'linear': {
538
+ 'extends': 'forDerivatives',
539
+ },
540
+ 'inverse': {
541
+ 'extends': 'forDerivatives',
542
+ },
543
+ },
544
+ 'future': {
545
+ 'linear': None,
546
+ 'inverse': None,
547
+ },
548
+ },
399
549
  'exceptions': {
400
550
  'exact': {
401
551
  'System is under maintenance.': OnMaintenance, # {"code":1,"msg":"System is under maintenance."}
@@ -422,7 +572,7 @@ class bitrue(Exchange, ImplicitAPI):
422
572
  '-1022': AuthenticationError, # {"code":-1022,"msg":"Signature for self request is not valid."}
423
573
  '-1100': BadRequest, # createOrder(symbol, 1, asdf) -> 'Illegal characters found in parameter 'price'
424
574
  '-1101': BadRequest, # Too many parameters; expected %s and received %s.
425
- '-1102': BadRequest, # Param %s or %s must be sent, but both were empty
575
+ '-1102': BadRequest, # Param %s or %s must be sent, but both were empty # {"code":-1102,"msg":"timestamp IllegalArgumentException.","data":null}
426
576
  '-1103': BadRequest, # An unknown parameter was sent.
427
577
  '-1104': BadRequest, # Not all sent parameters were read, read 8 parameters but was sent 9
428
578
  '-1105': BadRequest, # Parameter %s was empty.
@@ -467,26 +617,22 @@ class bitrue(Exchange, ImplicitAPI):
467
617
  '-4051': InsufficientFunds, # {"code":-4051,"msg":"Isolated balance insufficient."}
468
618
  },
469
619
  'broad': {
620
+ 'Insufficient account balance': InsufficientFunds, # {"code":-2010,"msg":"Insufficient account balance.","data":null}
470
621
  'has no operation privilege': PermissionDenied,
471
622
  'MAX_POSITION': InvalidOrder, # {"code":-2010,"msg":"Filter failure: MAX_POSITION"}
472
623
  },
473
624
  },
474
625
  })
475
626
 
476
- def currency_to_precision(self, code, fee, networkCode=None):
477
- # info is available in currencies only if the user has configured his api keys
478
- if self.safe_value(self.currencies[code], 'precision') is not None:
479
- return self.decimal_to_precision(fee, TRUNCATE, self.currencies[code]['precision'], self.precisionMode, self.paddingMode)
480
- else:
481
- return self.number_to_string(fee)
482
-
483
627
  def nonce(self):
484
628
  return self.milliseconds() - self.options['timeDifference']
485
629
 
486
630
  async def fetch_status(self, params={}):
487
631
  """
488
632
  the latest known information on the availability of the exchange API
489
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
633
+
634
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
635
+
490
636
  :param dict [params]: extra parameters specific to the exchange API endpoint
491
637
  :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
492
638
  """
@@ -510,7 +656,9 @@ class bitrue(Exchange, ImplicitAPI):
510
656
  async def fetch_time(self, params={}):
511
657
  """
512
658
  fetches the current integer timestamp in milliseconds from the exchange server
513
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
659
+
660
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
661
+
514
662
  :param dict [params]: extra parameters specific to the exchange API endpoint
515
663
  :returns int: the current integer timestamp in milliseconds from the exchange server
516
664
  """
@@ -522,78 +670,7 @@ class bitrue(Exchange, ImplicitAPI):
522
670
  #
523
671
  return self.safe_integer(response, 'serverTime')
524
672
 
525
- def safe_network(self, networkId):
526
- uppercaseNetworkId = networkId.upper()
527
- networksById = {
528
- 'Aeternity': 'Aeternity',
529
- 'AION': 'AION',
530
- 'Algorand': 'Algorand',
531
- 'ASK': 'ASK',
532
- 'ATOM': 'ATOM',
533
- 'AVAX C-Chain': 'AVAX C-Chain',
534
- 'bch': 'bch',
535
- 'BCH': 'BCH',
536
- 'BEP2': 'BEP2',
537
- 'BEP20': 'BEP20',
538
- 'Bitcoin': 'Bitcoin',
539
- 'BRP20': 'BRP20',
540
- 'Cardano': 'ADA',
541
- 'CasinoCoin': 'CasinoCoin',
542
- 'CasinoCoin XRPL': 'CasinoCoin XRPL',
543
- 'Contentos': 'Contentos',
544
- 'Dash': 'Dash',
545
- 'Decoin': 'Decoin',
546
- 'DeFiChain': 'DeFiChain',
547
- 'DGB': 'DGB',
548
- 'Divi': 'Divi',
549
- 'dogecoin': 'DOGE',
550
- 'EOS': 'EOS',
551
- 'ERC20': 'ERC20',
552
- 'ETC': 'ETC',
553
- 'Filecoin': 'Filecoin',
554
- 'FREETON': 'FREETON',
555
- 'HBAR': 'HBAR',
556
- 'Hedera Hashgraph': 'Hedera Hashgraph',
557
- 'HRC20': 'HRC20',
558
- 'ICON': 'ICON',
559
- 'ICP': 'ICP',
560
- 'Ignis': 'Ignis',
561
- 'Internet Computer': 'Internet Computer',
562
- 'IOTA': 'IOTA',
563
- 'KAVA': 'KAVA',
564
- 'KSM': 'KSM',
565
- 'LiteCoin': 'LiteCoin',
566
- 'Luna': 'Luna',
567
- 'MATIC': 'MATIC',
568
- 'Mobile Coin': 'Mobile Coin',
569
- 'MonaCoin': 'MonaCoin',
570
- 'Monero': 'Monero',
571
- 'NEM': 'NEM',
572
- 'NEP5': 'NEP5',
573
- 'OMNI': 'OMNI',
574
- 'PAC': 'PAC',
575
- 'Polkadot': 'Polkadot',
576
- 'Ravencoin': 'Ravencoin',
577
- 'Safex': 'Safex',
578
- 'SOLANA': 'SOL',
579
- 'Songbird': 'Songbird',
580
- 'Stellar Lumens': 'Stellar Lumens',
581
- 'Symbol': 'Symbol',
582
- 'Tezos': 'XTZ',
583
- 'theta': 'theta',
584
- 'THETA': 'THETA',
585
- 'TRC20': 'TRC20',
586
- 'VeChain': 'VeChain',
587
- 'VECHAIN': 'VECHAIN',
588
- 'Wanchain': 'Wanchain',
589
- 'XinFin Network': 'XinFin Network',
590
- 'XRP': 'XRP',
591
- 'XRPL': 'XRPL',
592
- 'ZIL': 'ZIL',
593
- }
594
- return self.safe_string_2(networksById, networkId, uppercaseNetworkId, networkId)
595
-
596
- async def fetch_currencies(self, params={}):
673
+ async def fetch_currencies(self, params={}) -> Currencies:
597
674
  """
598
675
  fetches all available currencies on an exchange
599
676
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -646,8 +723,8 @@ class bitrue(Exchange, ImplicitAPI):
646
723
  # ],
647
724
  # }
648
725
  #
649
- result = {}
650
- coins = self.safe_value(response, 'coins', [])
726
+ result: dict = {}
727
+ coins = self.safe_list(response, 'coins', [])
651
728
  for i in range(0, len(coins)):
652
729
  currency = coins[i]
653
730
  id = self.safe_string(currency, 'coin')
@@ -658,15 +735,15 @@ class bitrue(Exchange, ImplicitAPI):
658
735
  minWithdrawString = None
659
736
  maxWithdrawString = None
660
737
  minWithdrawFeeString = None
661
- networkDetails = self.safe_value(currency, 'chainDetail', [])
662
- networks = {}
738
+ networkDetails = self.safe_list(currency, 'chainDetail', [])
739
+ networks: dict = {}
663
740
  for j in range(0, len(networkDetails)):
664
741
  entry = networkDetails[j]
665
742
  networkId = self.safe_string(entry, 'chain')
666
743
  network = self.network_id_to_code(networkId, code)
667
- enableDeposit = self.safe_value(entry, 'enableDeposit')
744
+ enableDeposit = self.safe_bool(entry, 'enableDeposit')
668
745
  deposit = enableDeposit if (enableDeposit) else deposit
669
- enableWithdraw = self.safe_value(entry, 'enableWithdraw')
746
+ enableWithdraw = self.safe_bool(entry, 'enableWithdraw')
670
747
  withdraw = enableWithdraw if (enableWithdraw) else withdraw
671
748
  networkWithdrawFeeString = self.safe_string(entry, 'withdrawFee')
672
749
  if networkWithdrawFeeString is not None:
@@ -714,12 +791,14 @@ class bitrue(Exchange, ImplicitAPI):
714
791
  }
715
792
  return result
716
793
 
717
- async def fetch_markets(self, params={}):
794
+ async def fetch_markets(self, params={}) -> List[Market]:
718
795
  """
719
796
  retrieves data on all markets for bitrue
720
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
721
- :see: https://www.bitrue.com/api-docs#current-open-contract
722
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
797
+
798
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
799
+ https://www.bitrue.com/api-docs#current-open-contract
800
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
801
+
723
802
  :param dict [params]: extra parameters specific to the exchange api endpoint
724
803
  :returns dict[]: an array of objects representing market data
725
804
  """
@@ -810,7 +889,7 @@ class bitrue(Exchange, ImplicitAPI):
810
889
  await self.load_time_difference()
811
890
  return self.parse_markets(markets)
812
891
 
813
- def parse_market(self, market) -> Market:
892
+ def parse_market(self, market: dict) -> Market:
814
893
  id = self.safe_string(market, 'symbol')
815
894
  lowercaseId = self.safe_string_lower(market, 'symbol')
816
895
  side = self.safe_integer(market, 'side') # 1 linear, 0 inverse, None spot
@@ -842,11 +921,11 @@ class bitrue(Exchange, ImplicitAPI):
842
921
  symbol = base + '/' + quote
843
922
  if settle is not None:
844
923
  symbol += ':' + settle
845
- filters = self.safe_value(market, 'filters', [])
924
+ filters = self.safe_list(market, 'filters', [])
846
925
  filtersByType = self.index_by(filters, 'filterType')
847
926
  status = self.safe_string(market, 'status')
848
- priceFilter = self.safe_value(filtersByType, 'PRICE_FILTER', {})
849
- amountFilter = self.safe_value(filtersByType, 'LOT_SIZE', {})
927
+ priceFilter = self.safe_dict(filtersByType, 'PRICE_FILTER', {})
928
+ amountFilter = self.safe_dict(filtersByType, 'LOT_SIZE', {})
850
929
  defaultPricePrecision = self.safe_string(market, 'pricePrecision')
851
930
  defaultAmountPrecision = self.safe_string(market, 'quantityPrecision')
852
931
  pricePrecision = self.safe_string(priceFilter, 'priceScale', defaultPricePrecision)
@@ -956,7 +1035,7 @@ class bitrue(Exchange, ImplicitAPI):
956
1035
  # ]
957
1036
  # }
958
1037
  #
959
- result = {
1038
+ result: dict = {
960
1039
  'info': response,
961
1040
  }
962
1041
  timestamp = self.safe_integer(response, 'updateTime')
@@ -976,9 +1055,11 @@ class bitrue(Exchange, ImplicitAPI):
976
1055
  async def fetch_balance(self, params={}) -> Balances:
977
1056
  """
978
1057
  query for balance and get the amount of funds available for trading or funds locked in orders
979
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
980
- :see: https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
981
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
1058
+
1059
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
1060
+ https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
1061
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
1062
+
982
1063
  :param dict [params]: extra parameters specific to the exchange API endpoint
983
1064
  :param str [params.type]: 'future', 'delivery', 'spot', 'swap'
984
1065
  :param str [params.subType]: 'linear', 'inverse'
@@ -994,7 +1075,7 @@ class bitrue(Exchange, ImplicitAPI):
994
1075
  if type == 'swap':
995
1076
  if subType is not None and subType == 'inverse':
996
1077
  response = await self.dapiV2PrivateGetAccount(params)
997
- result = self.safe_value(response, 'data', {})
1078
+ result = self.safe_dict(response, 'data', {})
998
1079
  #
999
1080
  # {
1000
1081
  # "code":"0",
@@ -1027,7 +1108,7 @@ class bitrue(Exchange, ImplicitAPI):
1027
1108
  #
1028
1109
  else:
1029
1110
  response = await self.fapiV2PrivateGetAccount(params)
1030
- result = self.safe_value(response, 'data', {})
1111
+ result = self.safe_dict(response, 'data', {})
1031
1112
  #
1032
1113
  # {
1033
1114
  # "code":"0",
@@ -1083,9 +1164,11 @@ class bitrue(Exchange, ImplicitAPI):
1083
1164
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
1084
1165
  """
1085
1166
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
1086
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
1087
- :see: https://www.bitrue.com/api-docs#order-book
1088
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
1167
+
1168
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
1169
+ https://www.bitrue.com/api-docs#order-book
1170
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
1171
+
1089
1172
  :param str symbol: unified symbol of the market to fetch the order book for
1090
1173
  :param int [limit]: the maximum amount of order book entries to return
1091
1174
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1095,7 +1178,7 @@ class bitrue(Exchange, ImplicitAPI):
1095
1178
  market = self.market(symbol)
1096
1179
  response = None
1097
1180
  if market['swap']:
1098
- request = {
1181
+ request: dict = {
1099
1182
  'contractName': market['id'],
1100
1183
  }
1101
1184
  if limit is not None:
@@ -1107,7 +1190,7 @@ class bitrue(Exchange, ImplicitAPI):
1107
1190
  elif market['inverse']:
1108
1191
  response = await self.dapiV1PublicGetDepth(self.extend(request, params))
1109
1192
  elif market['spot']:
1110
- request = {
1193
+ request: dict = {
1111
1194
  'symbol': market['id'],
1112
1195
  }
1113
1196
  if limit is not None:
@@ -1147,7 +1230,7 @@ class bitrue(Exchange, ImplicitAPI):
1147
1230
  orderbook['nonce'] = self.safe_integer(response, 'lastUpdateId')
1148
1231
  return orderbook
1149
1232
 
1150
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1233
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1151
1234
  #
1152
1235
  # fetchBidsAsks
1153
1236
  #
@@ -1217,9 +1300,11 @@ class bitrue(Exchange, ImplicitAPI):
1217
1300
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1218
1301
  """
1219
1302
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1220
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1221
- :see: https://www.bitrue.com/api-docs#ticker
1222
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1303
+
1304
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1305
+ https://www.bitrue.com/api-docs#ticker
1306
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1307
+
1223
1308
  :param str symbol: unified symbol of the market to fetch the ticker for
1224
1309
  :param dict [params]: extra parameters specific to the exchange API endpoint
1225
1310
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1229,7 +1314,7 @@ class bitrue(Exchange, ImplicitAPI):
1229
1314
  response = None
1230
1315
  data = None
1231
1316
  if market['swap']:
1232
- request = {
1317
+ request: dict = {
1233
1318
  'contractName': market['id'],
1234
1319
  }
1235
1320
  if market['linear']:
@@ -1238,11 +1323,11 @@ class bitrue(Exchange, ImplicitAPI):
1238
1323
  response = await self.dapiV1PublicGetTicker(self.extend(request, params))
1239
1324
  data = response
1240
1325
  elif market['spot']:
1241
- request = {
1326
+ request: dict = {
1242
1327
  'symbol': market['id'],
1243
1328
  }
1244
1329
  response = await self.spotV1PublicGetTicker24hr(self.extend(request, params))
1245
- data = self.safe_value(response, 0, {})
1330
+ data = self.safe_dict(response, 0, {})
1246
1331
  else:
1247
1332
  raise NotSupported(self.id + ' fetchTicker only support spot & swap markets')
1248
1333
  #
@@ -1288,9 +1373,10 @@ class bitrue(Exchange, ImplicitAPI):
1288
1373
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1289
1374
  """
1290
1375
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1291
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#kline-data
1292
- :see: https://www.bitrue.com/api-docs#kline-candlestick-data
1293
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#kline-candlestick-data
1376
+
1377
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#kline-data
1378
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#kline-candlestick-data
1379
+
1294
1380
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1295
1381
  :param str timeframe: the length of time each candle represents
1296
1382
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1300,19 +1386,17 @@ class bitrue(Exchange, ImplicitAPI):
1300
1386
  """
1301
1387
  await self.load_markets()
1302
1388
  market = self.market(symbol)
1303
- timeframes = self.safe_value(self.options, 'timeframes', {})
1389
+ timeframes = self.safe_dict(self.options, 'timeframes', {})
1304
1390
  response = None
1305
1391
  data = None
1306
1392
  if market['swap']:
1307
- timeframesFuture = self.safe_value(timeframes, 'future', {})
1308
- request = {
1393
+ timeframesFuture = self.safe_dict(timeframes, 'future', {})
1394
+ request: dict = {
1309
1395
  'contractName': market['id'],
1310
1396
  # 1min / 5min / 15min / 30min / 1h / 1day / 1week / 1month
1311
1397
  'interval': self.safe_string(timeframesFuture, timeframe, '1min'),
1312
1398
  }
1313
1399
  if limit is not None:
1314
- if limit > 300:
1315
- limit = 300
1316
1400
  request['limit'] = limit
1317
1401
  if market['linear']:
1318
1402
  response = await self.fapiV1PublicGetKlines(self.extend(request, params))
@@ -1320,20 +1404,18 @@ class bitrue(Exchange, ImplicitAPI):
1320
1404
  response = await self.dapiV1PublicGetKlines(self.extend(request, params))
1321
1405
  data = response
1322
1406
  elif market['spot']:
1323
- timeframesSpot = self.safe_value(timeframes, 'spot', {})
1324
- request = {
1407
+ timeframesSpot = self.safe_dict(timeframes, 'spot', {})
1408
+ request: dict = {
1325
1409
  'symbol': market['id'],
1326
1410
  # 1m / 5m / 15m / 30m / 1H / 2H / 4H / 12H / 1D / 1W
1327
1411
  'scale': self.safe_string(timeframesSpot, timeframe, '1m'),
1328
1412
  }
1329
1413
  if limit is not None:
1330
- if limit > 1440:
1331
- limit = 1440
1332
1414
  request['limit'] = limit
1333
1415
  if since is not None:
1334
1416
  request['fromIdx'] = since
1335
1417
  response = await self.spotV1PublicGetMarketKline(self.extend(request, params))
1336
- data = self.safe_value(response, 'data', [])
1418
+ data = self.safe_list(response, 'data', [])
1337
1419
  else:
1338
1420
  raise NotSupported(self.id + ' fetchOHLCV only support spot & swap markets')
1339
1421
  #
@@ -1410,9 +1492,11 @@ class bitrue(Exchange, ImplicitAPI):
1410
1492
  async def fetch_bids_asks(self, symbols: Strings = None, params={}):
1411
1493
  """
1412
1494
  fetches the bid and ask price and volume for multiple markets
1413
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
1414
- :see: https://www.bitrue.com/api-docs#ticker
1415
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1495
+
1496
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
1497
+ https://www.bitrue.com/api-docs#ticker
1498
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1499
+
1416
1500
  :param str[]|None symbols: unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
1417
1501
  :param dict [params]: extra parameters specific to the exchange API endpoint
1418
1502
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1423,7 +1507,7 @@ class bitrue(Exchange, ImplicitAPI):
1423
1507
  market = self.market(first)
1424
1508
  response = None
1425
1509
  if market['swap']:
1426
- request = {
1510
+ request: dict = {
1427
1511
  'contractName': market['id'],
1428
1512
  }
1429
1513
  if market['linear']:
@@ -1431,7 +1515,7 @@ class bitrue(Exchange, ImplicitAPI):
1431
1515
  elif market['inverse']:
1432
1516
  response = await self.dapiV1PublicGetTicker(self.extend(request, params))
1433
1517
  elif market['spot']:
1434
- request = {
1518
+ request: dict = {
1435
1519
  'symbol': market['id'],
1436
1520
  }
1437
1521
  response = await self.spotV1PublicGetTickerBookTicker(self.extend(request, params))
@@ -1461,16 +1545,18 @@ class bitrue(Exchange, ImplicitAPI):
1461
1545
  # "time": 1699348013000
1462
1546
  # }
1463
1547
  #
1464
- data = {}
1548
+ data: dict = {}
1465
1549
  data[market['id']] = response
1466
1550
  return self.parse_tickers(data, symbols)
1467
1551
 
1468
1552
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1469
1553
  """
1470
1554
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1471
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1472
- :see: https://www.bitrue.com/api-docs#ticker
1473
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1555
+
1556
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1557
+ https://www.bitrue.com/api-docs#ticker
1558
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1559
+
1474
1560
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1475
1561
  :param dict [params]: extra parameters specific to the exchange API endpoint
1476
1562
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1479,7 +1565,7 @@ class bitrue(Exchange, ImplicitAPI):
1479
1565
  symbols = self.market_symbols(symbols)
1480
1566
  response = None
1481
1567
  data = None
1482
- request = {}
1568
+ request: dict = {}
1483
1569
  type = None
1484
1570
  if symbols is not None:
1485
1571
  first = self.safe_string(symbols, 0)
@@ -1538,14 +1624,14 @@ class bitrue(Exchange, ImplicitAPI):
1538
1624
  # the exchange returns market ids with an underscore from the tickers endpoint
1539
1625
  # the market ids do not have an underscore, so it has to be removed
1540
1626
  # https://github.com/ccxt/ccxt/issues/13856
1541
- tickers = {}
1627
+ tickers: dict = {}
1542
1628
  for i in range(0, len(data)):
1543
- ticker = self.safe_value(data, i, {})
1629
+ ticker = self.safe_dict(data, i, {})
1544
1630
  market = self.market(self.safe_value(ticker, 'symbol'))
1545
1631
  tickers[market['id']] = ticker
1546
1632
  return self.parse_tickers(tickers, symbols)
1547
1633
 
1548
- def parse_trade(self, trade, market: Market = None) -> Trade:
1634
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1549
1635
  #
1550
1636
  # fetchTrades
1551
1637
  #
@@ -1602,8 +1688,8 @@ class bitrue(Exchange, ImplicitAPI):
1602
1688
  orderId = self.safe_string(trade, 'orderId')
1603
1689
  id = self.safe_string_2(trade, 'id', 'tradeId')
1604
1690
  side = None
1605
- buyerMaker = self.safe_value(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
1606
- isBuyer = self.safe_value(trade, 'isBuyer')
1691
+ buyerMaker = self.safe_bool(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
1692
+ isBuyer = self.safe_bool(trade, 'isBuyer')
1607
1693
  if buyerMaker is not None:
1608
1694
  side = 'sell' if buyerMaker else 'buy'
1609
1695
  if isBuyer is not None:
@@ -1615,7 +1701,7 @@ class bitrue(Exchange, ImplicitAPI):
1615
1701
  'currency': self.safe_currency_code(self.safe_string(trade, 'commissionAssert')),
1616
1702
  }
1617
1703
  takerOrMaker = None
1618
- isMaker = self.safe_value(trade, 'isMaker')
1704
+ isMaker = self.safe_bool(trade, 'isMaker')
1619
1705
  if isMaker is not None:
1620
1706
  takerOrMaker = 'maker' if isMaker else 'taker'
1621
1707
  return self.safe_trade({
@@ -1637,7 +1723,9 @@ class bitrue(Exchange, ImplicitAPI):
1637
1723
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1638
1724
  """
1639
1725
  get the list of most recent trades for a particular symbol
1640
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1726
+
1727
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1728
+
1641
1729
  :param str symbol: unified symbol of the market to fetch trades for
1642
1730
  :param int [since]: timestamp in ms of the earliest trade to fetch
1643
1731
  :param int [limit]: the maximum amount of trades to fetch
@@ -1648,7 +1736,7 @@ class bitrue(Exchange, ImplicitAPI):
1648
1736
  market = self.market(symbol)
1649
1737
  response = None
1650
1738
  if market['spot']:
1651
- request = {
1739
+ request: dict = {
1652
1740
  'symbol': market['id'],
1653
1741
  # 'limit': 100, # default 100, max = 1000
1654
1742
  }
@@ -1673,8 +1761,8 @@ class bitrue(Exchange, ImplicitAPI):
1673
1761
  #
1674
1762
  return self.parse_trades(response, market, since, limit)
1675
1763
 
1676
- def parse_order_status(self, status):
1677
- statuses = {
1764
+ def parse_order_status(self, status: Str):
1765
+ statuses: dict = {
1678
1766
  'INIT': 'open',
1679
1767
  'PENDING_CREATE': 'open',
1680
1768
  'NEW': 'open',
@@ -1687,7 +1775,7 @@ class bitrue(Exchange, ImplicitAPI):
1687
1775
  }
1688
1776
  return self.safe_string(statuses, status, status)
1689
1777
 
1690
- def parse_order(self, order, market: Market = None) -> Order:
1778
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1691
1779
  #
1692
1780
  # createOrder - spot
1693
1781
  #
@@ -1768,14 +1856,13 @@ class bitrue(Exchange, ImplicitAPI):
1768
1856
  id = self.safe_string(order, 'orderId')
1769
1857
  type = self.safe_string_lower(order, 'type')
1770
1858
  side = self.safe_string_lower(order, 'side')
1771
- fills = self.safe_value(order, 'fills', [])
1859
+ fills = self.safe_list(order, 'fills', [])
1772
1860
  clientOrderId = self.safe_string(order, 'clientOrderId')
1773
1861
  timeInForce = self.safe_string(order, 'timeInForce')
1774
1862
  postOnly = (type == 'limit_maker') or (timeInForce == 'GTX') or (type == 'post_only')
1775
1863
  if type == 'limit_maker':
1776
1864
  type = 'limit'
1777
- stopPriceString = self.safe_string(order, 'stopPrice')
1778
- stopPrice = self.parse_number(self.omit_zero(stopPriceString))
1865
+ triggerPrice = self.parse_number(self.omit_zero(self.safe_string(order, 'stopPrice')))
1779
1866
  return self.safe_order({
1780
1867
  'info': order,
1781
1868
  'id': id,
@@ -1789,8 +1876,7 @@ class bitrue(Exchange, ImplicitAPI):
1789
1876
  'postOnly': postOnly,
1790
1877
  'side': side,
1791
1878
  'price': price,
1792
- 'stopPrice': stopPrice,
1793
- 'triggerPrice': stopPrice,
1879
+ 'triggerPrice': triggerPrice,
1794
1880
  'amount': amount,
1795
1881
  'cost': cost,
1796
1882
  'average': average,
@@ -1804,8 +1890,10 @@ class bitrue(Exchange, ImplicitAPI):
1804
1890
  async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1805
1891
  """
1806
1892
  create a market buy order by providing the symbol and cost
1807
- :see: https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1808
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1893
+
1894
+ https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1895
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1896
+
1809
1897
  :param str symbol: unified symbol of the market to create an order in
1810
1898
  :param float cost: how much you want to trade in units of the quote currency
1811
1899
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1821,14 +1909,15 @@ class bitrue(Exchange, ImplicitAPI):
1821
1909
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1822
1910
  """
1823
1911
  create a trade order
1824
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1825
- :see: https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1826
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1912
+
1913
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#new-order-trade
1914
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#new-order-trade-hmac-sha256
1915
+
1827
1916
  :param str symbol: unified symbol of the market to create an order in
1828
1917
  :param str type: 'market' or 'limit'
1829
1918
  :param str side: 'buy' or 'sell'
1830
1919
  :param float amount: how much of currency you want to trade in units of base currency
1831
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1920
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1832
1921
  :param dict [params]: extra parameters specific to the exchange API endpoint
1833
1922
  :param float [params.triggerPrice]: *spot only* the price at which a trigger order is triggered at
1834
1923
  :param str [params.clientOrderId]: a unique id for the order, automatically generated if not sent
@@ -1836,7 +1925,7 @@ class bitrue(Exchange, ImplicitAPI):
1836
1925
  :param str [params.timeInForce]: 'fok', 'ioc' or 'po'
1837
1926
  :param bool [params.postOnly]: default False
1838
1927
  :param bool [params.reduceOnly]: default False
1839
- * EXCHANGE SPECIFIC PARAMETERS
1928
+ EXCHANGE SPECIFIC PARAMETERS
1840
1929
  :param decimal [params.icebergQty]:
1841
1930
  :param long [params.recvWindow]:
1842
1931
  :param float [params.cost]: *swap market buy only* the quote quantity that can be used alternative for the amount
@@ -1847,7 +1936,7 @@ class bitrue(Exchange, ImplicitAPI):
1847
1936
  response = None
1848
1937
  data = None
1849
1938
  uppercaseType = type.upper()
1850
- request = {
1939
+ request: dict = {
1851
1940
  'side': side.upper(),
1852
1941
  'type': uppercaseType,
1853
1942
  # 'timeInForce': '',
@@ -1898,7 +1987,7 @@ class bitrue(Exchange, ImplicitAPI):
1898
1987
  response = await self.fapiV2PrivatePostOrder(self.extend(request, params))
1899
1988
  elif market['inverse']:
1900
1989
  response = await self.dapiV2PrivatePostOrder(self.extend(request, params))
1901
- data = self.safe_value(response, 'data', {})
1990
+ data = self.safe_dict(response, 'data', {})
1902
1991
  elif market['spot']:
1903
1992
  request['symbol'] = market['id']
1904
1993
  request['quantity'] = self.amount_to_precision(symbol, amount)
@@ -1909,10 +1998,10 @@ class bitrue(Exchange, ImplicitAPI):
1909
1998
  if clientOrderId is not None:
1910
1999
  params = self.omit(params, ['newClientOrderId', 'clientOrderId'])
1911
2000
  request['newClientOrderId'] = clientOrderId
1912
- stopPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
1913
- if stopPrice is not None:
2001
+ triggerPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
2002
+ if triggerPrice is not None:
1914
2003
  params = self.omit(params, ['triggerPrice', 'stopPrice'])
1915
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
2004
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1916
2005
  response = await self.spotV1PrivatePostOrder(self.extend(request, params))
1917
2006
  data = response
1918
2007
  else:
@@ -1943,9 +2032,11 @@ class bitrue(Exchange, ImplicitAPI):
1943
2032
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1944
2033
  """
1945
2034
  fetches information on an order made by the user
1946
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#query-order-user_data
1947
- :see: https://www.bitrue.com/api-docs#query-order-user_data-hmac-sha256
1948
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#query-order-user_data-hmac-sha256
2035
+
2036
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#query-order-user_data
2037
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#query-order-user_data-hmac-sha256
2038
+
2039
+ :param str id: the order id
1949
2040
  :param str symbol: unified symbol of the market the order was made in
1950
2041
  :param dict [params]: extra parameters specific to the exchange API endpoint
1951
2042
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1958,7 +2049,7 @@ class bitrue(Exchange, ImplicitAPI):
1958
2049
  params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
1959
2050
  response = None
1960
2051
  data = None
1961
- request = {}
2052
+ request: dict = {}
1962
2053
  if origClientOrderId is None:
1963
2054
  request['orderId'] = id
1964
2055
  else:
@@ -1972,7 +2063,7 @@ class bitrue(Exchange, ImplicitAPI):
1972
2063
  response = await self.fapiV2PrivateGetOrder(self.extend(request, params))
1973
2064
  elif market['inverse']:
1974
2065
  response = await self.dapiV2PrivateGetOrder(self.extend(request, params))
1975
- data = self.safe_value(response, 'data', {})
2066
+ data = self.safe_dict(response, 'data', {})
1976
2067
  elif market['spot']:
1977
2068
  request['orderId'] = id # spot market id is mandatory
1978
2069
  request['symbol'] = market['id']
@@ -2028,7 +2119,9 @@ class bitrue(Exchange, ImplicitAPI):
2028
2119
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2029
2120
  """
2030
2121
  fetches information on multiple closed orders made by the user
2031
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#all-orders-user_data
2122
+
2123
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#all-orders-user_data
2124
+
2032
2125
  :param str symbol: unified market symbol of the market orders were made in
2033
2126
  :param int [since]: the earliest time in ms to fetch orders for
2034
2127
  :param int [limit]: the maximum number of order structures to retrieve
@@ -2041,7 +2134,7 @@ class bitrue(Exchange, ImplicitAPI):
2041
2134
  market = self.market(symbol)
2042
2135
  if not market['spot']:
2043
2136
  raise NotSupported(self.id + ' fetchClosedOrders only support spot markets')
2044
- request = {
2137
+ request: dict = {
2045
2138
  'symbol': market['id'],
2046
2139
  # 'orderId': 123445, # long
2047
2140
  # 'startTime': since,
@@ -2080,9 +2173,10 @@ class bitrue(Exchange, ImplicitAPI):
2080
2173
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2081
2174
  """
2082
2175
  fetch all unfilled currently open orders
2083
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#current-open-orders-user_data
2084
- :see: https://www.bitrue.com/api-docs#current-all-open-orders-user_data-hmac-sha256
2085
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#current-all-open-orders-user_data-hmac-sha256
2176
+
2177
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#current-open-orders-user_data
2178
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#cancel-all-open-orders-trade-hmac-sha256
2179
+
2086
2180
  :param str symbol: unified market symbol
2087
2181
  :param int [since]: the earliest time in ms to fetch open orders for
2088
2182
  :param int [limit]: the maximum number of open order structures to retrieve
@@ -2095,14 +2189,14 @@ class bitrue(Exchange, ImplicitAPI):
2095
2189
  market = self.market(symbol)
2096
2190
  response = None
2097
2191
  data = None
2098
- request = {}
2192
+ request: dict = {}
2099
2193
  if market['swap']:
2100
2194
  request['contractName'] = market['id']
2101
2195
  if market['linear']:
2102
2196
  response = await self.fapiV2PrivateGetOpenOrders(self.extend(request, params))
2103
2197
  elif market['inverse']:
2104
2198
  response = await self.dapiV2PrivateGetOpenOrders(self.extend(request, params))
2105
- data = self.safe_value(response, 'data', [])
2199
+ data = self.safe_list(response, 'data', [])
2106
2200
  elif market['spot']:
2107
2201
  request['symbol'] = market['id']
2108
2202
  response = await self.spotV1PrivateGetOpenOrders(self.extend(request, params))
@@ -2160,9 +2254,11 @@ class bitrue(Exchange, ImplicitAPI):
2160
2254
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
2161
2255
  """
2162
2256
  cancels an open order
2163
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
2164
- :see: https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
2165
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
2257
+
2258
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
2259
+ https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
2260
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
2261
+
2166
2262
  :param str id: order id
2167
2263
  :param str symbol: unified symbol of the market the order was made in
2168
2264
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2176,7 +2272,7 @@ class bitrue(Exchange, ImplicitAPI):
2176
2272
  params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
2177
2273
  response = None
2178
2274
  data = None
2179
- request = {}
2275
+ request: dict = {}
2180
2276
  if origClientOrderId is None:
2181
2277
  request['orderId'] = id
2182
2278
  else:
@@ -2190,7 +2286,7 @@ class bitrue(Exchange, ImplicitAPI):
2190
2286
  response = await self.fapiV2PrivatePostCancel(self.extend(request, params))
2191
2287
  elif market['inverse']:
2192
2288
  response = await self.dapiV2PrivatePostCancel(self.extend(request, params))
2193
- data = self.safe_value(response, 'data', {})
2289
+ data = self.safe_dict(response, 'data', {})
2194
2290
  elif market['spot']:
2195
2291
  request['symbol'] = market['id']
2196
2292
  response = await self.spotV1PrivateDeleteOrder(self.extend(request, params))
@@ -2222,8 +2318,10 @@ class bitrue(Exchange, ImplicitAPI):
2222
2318
  async def cancel_all_orders(self, symbol: Str = None, params={}):
2223
2319
  """
2224
2320
  cancel all open orders in a market
2225
- :see: https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
2226
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
2321
+
2322
+ https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
2323
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
2324
+
2227
2325
  :param str symbol: unified market symbol of the market to cancel orders in
2228
2326
  :param dict [params]: extra parameters specific to the exchange API endpoint
2229
2327
  :param str [params.marginMode]: 'cross' or 'isolated', for spot margin trading
@@ -2234,14 +2332,14 @@ class bitrue(Exchange, ImplicitAPI):
2234
2332
  response = None
2235
2333
  data = None
2236
2334
  if market['swap']:
2237
- request = {
2335
+ request: dict = {
2238
2336
  'contractName': market['id'],
2239
2337
  }
2240
2338
  if market['linear']:
2241
2339
  response = await self.fapiV2PrivatePostAllOpenOrders(self.extend(request, params))
2242
2340
  elif market['inverse']:
2243
2341
  response = await self.dapiV2PrivatePostAllOpenOrders(self.extend(request, params))
2244
- data = self.safe_value(response, 'data', [])
2342
+ data = self.safe_list(response, 'data', [])
2245
2343
  else:
2246
2344
  raise NotSupported(self.id + ' cancelAllOrders only support future markets')
2247
2345
  #
@@ -2258,9 +2356,10 @@ class bitrue(Exchange, ImplicitAPI):
2258
2356
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2259
2357
  """
2260
2358
  fetch all trades made by the user
2261
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#account-trade-list-user_data
2262
- :see: https://www.bitrue.com/api-docs#account-trade-list-user_data-hmac-sha256
2263
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#account-trade-list-user_data-hmac-sha256
2359
+
2360
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#account-trade-list-user_data
2361
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#account-trade-list-user_data-hmac-sha256
2362
+
2264
2363
  :param str symbol: unified market symbol
2265
2364
  :param int [since]: the earliest time in ms to fetch trades for
2266
2365
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -2273,7 +2372,7 @@ class bitrue(Exchange, ImplicitAPI):
2273
2372
  market = self.market(symbol)
2274
2373
  response = None
2275
2374
  data = None
2276
- request = {}
2375
+ request: dict = {}
2277
2376
  if since is not None:
2278
2377
  request['startTime'] = since
2279
2378
  if limit is not None:
@@ -2286,7 +2385,7 @@ class bitrue(Exchange, ImplicitAPI):
2286
2385
  response = await self.fapiV2PrivateGetMyTrades(self.extend(request, params))
2287
2386
  elif market['inverse']:
2288
2387
  response = await self.dapiV2PrivateGetMyTrades(self.extend(request, params))
2289
- data = self.safe_value(response, 'data', [])
2388
+ data = self.safe_list(response, 'data', [])
2290
2389
  elif market['spot']:
2291
2390
  request['symbol'] = market['id']
2292
2391
  response = await self.spotV2PrivateGetMyTrades(self.extend(request, params))
@@ -2343,7 +2442,9 @@ class bitrue(Exchange, ImplicitAPI):
2343
2442
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2344
2443
  """
2345
2444
  fetch all deposits made to an account
2346
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
2445
+
2446
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
2447
+
2347
2448
  :param str code: unified currency code
2348
2449
  :param int [since]: the earliest time in ms to fetch deposits for
2349
2450
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -2354,7 +2455,7 @@ class bitrue(Exchange, ImplicitAPI):
2354
2455
  raise ArgumentsRequired(self.id + ' fetchDeposits() requires a code argument')
2355
2456
  await self.load_markets()
2356
2457
  currency = self.currency(code)
2357
- request = {
2458
+ request: dict = {
2358
2459
  'coin': currency['id'],
2359
2460
  'status': 1, # 0 init, 1 finished, default 0
2360
2461
  # 'offset': 0,
@@ -2404,13 +2505,15 @@ class bitrue(Exchange, ImplicitAPI):
2404
2505
  # ]
2405
2506
  # }
2406
2507
  #
2407
- data = self.safe_value(response, 'data', [])
2508
+ data = self.safe_list(response, 'data', [])
2408
2509
  return self.parse_transactions(data, currency, since, limit)
2409
2510
 
2410
2511
  async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2411
2512
  """
2412
2513
  fetch all withdrawals made from an account
2413
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
2514
+
2515
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
2516
+
2414
2517
  :param str code: unified currency code
2415
2518
  :param int [since]: the earliest time in ms to fetch withdrawals for
2416
2519
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -2421,7 +2524,7 @@ class bitrue(Exchange, ImplicitAPI):
2421
2524
  raise ArgumentsRequired(self.id + ' fetchWithdrawals() requires a code argument')
2422
2525
  await self.load_markets()
2423
2526
  currency = self.currency(code)
2424
- request = {
2527
+ request: dict = {
2425
2528
  'coin': currency['id'],
2426
2529
  'status': 5, # 0 init, 5 finished, 6 canceled, default 0
2427
2530
  # 'offset': 0,
@@ -2462,7 +2565,7 @@ class bitrue(Exchange, ImplicitAPI):
2462
2565
  return self.parse_transactions(data, currency)
2463
2566
 
2464
2567
  def parse_transaction_status_by_type(self, status, type=None):
2465
- statusesByType = {
2568
+ statusesByType: dict = {
2466
2569
  'deposit': {
2467
2570
  '0': 'pending',
2468
2571
  '1': 'ok',
@@ -2473,10 +2576,10 @@ class bitrue(Exchange, ImplicitAPI):
2473
2576
  '6': 'canceled',
2474
2577
  },
2475
2578
  }
2476
- statuses = self.safe_value(statusesByType, type, {})
2579
+ statuses = self.safe_dict(statusesByType, type, {})
2477
2580
  return self.safe_string(statuses, status, status)
2478
2581
 
2479
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2582
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2480
2583
  #
2481
2584
  # fetchDeposits
2482
2585
  #
@@ -2596,10 +2699,12 @@ class bitrue(Exchange, ImplicitAPI):
2596
2699
  'fee': fee,
2597
2700
  }
2598
2701
 
2599
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2702
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2600
2703
  """
2601
2704
  make a withdrawal
2602
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
2705
+
2706
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
2707
+
2603
2708
  :param str code: unified currency code
2604
2709
  :param float amount: the amount to withdraw
2605
2710
  :param str address: the address to withdraw to
@@ -2611,7 +2716,7 @@ class bitrue(Exchange, ImplicitAPI):
2611
2716
  self.check_address(address)
2612
2717
  await self.load_markets()
2613
2718
  currency = self.currency(code)
2614
- request = {
2719
+ request: dict = {
2615
2720
  'coin': currency['id'],
2616
2721
  'amount': amount,
2617
2722
  'addressTo': address,
@@ -2642,7 +2747,7 @@ class bitrue(Exchange, ImplicitAPI):
2642
2747
  # }
2643
2748
  # }
2644
2749
  #
2645
- data = self.safe_value(response, 'data', {})
2750
+ data = self.safe_dict(response, 'data', {})
2646
2751
  return self.parse_transaction(data, currency)
2647
2752
 
2648
2753
  def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
@@ -2654,9 +2759,9 @@ class bitrue(Exchange, ImplicitAPI):
2654
2759
  # "chainDetail": [[Object]]
2655
2760
  # }
2656
2761
  #
2657
- chainDetails = self.safe_value(fee, 'chainDetail', [])
2762
+ chainDetails = self.safe_list(fee, 'chainDetail', [])
2658
2763
  chainDetailLength = len(chainDetails)
2659
- result = {
2764
+ result: dict = {
2660
2765
  'info': fee,
2661
2766
  'withdraw': {
2662
2767
  'fee': None,
@@ -2686,14 +2791,16 @@ class bitrue(Exchange, ImplicitAPI):
2686
2791
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2687
2792
  """
2688
2793
  fetch deposit and withdraw fees
2689
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
2794
+
2795
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
2796
+
2690
2797
  :param str[]|None codes: list of unified currency codes
2691
2798
  :param dict [params]: extra parameters specific to the exchange API endpoint
2692
2799
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
2693
2800
  """
2694
2801
  await self.load_markets()
2695
2802
  response = await self.spotV1PublicGetExchangeInfo(params)
2696
- coins = self.safe_value(response, 'coins')
2803
+ coins = self.safe_list(response, 'coins')
2697
2804
  return self.parse_deposit_withdraw_fees(coins, codes, 'coin')
2698
2805
 
2699
2806
  def parse_transfer(self, transfer, currency=None):
@@ -2732,11 +2839,13 @@ class bitrue(Exchange, ImplicitAPI):
2732
2839
  'status': 'ok',
2733
2840
  }
2734
2841
 
2735
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2842
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
2736
2843
  """
2737
2844
  fetch a history of internal transfers made on an account
2738
- :see: https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
2739
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
2845
+
2846
+ https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
2847
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
2848
+
2740
2849
  :param str code: unified currency code of the currency transferred
2741
2850
  :param int [since]: the earliest time in ms to fetch transfers for
2742
2851
  :param int [limit]: the maximum number of transfers structures to retrieve
@@ -2747,7 +2856,7 @@ class bitrue(Exchange, ImplicitAPI):
2747
2856
  """
2748
2857
  await self.load_markets()
2749
2858
  type = self.safe_string_2(params, 'type', 'transferType')
2750
- request = {
2859
+ request: dict = {
2751
2860
  'transferType': type,
2752
2861
  }
2753
2862
  currency = None
@@ -2784,8 +2893,10 @@ class bitrue(Exchange, ImplicitAPI):
2784
2893
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2785
2894
  """
2786
2895
  transfer currency internally between wallets on the same account
2787
- :see: https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
2788
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
2896
+
2897
+ https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
2898
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
2899
+
2789
2900
  :param str code: unified currency code
2790
2901
  :param float amount: amount to transfer
2791
2902
  :param str fromAccount: account to transfer from
@@ -2795,10 +2906,10 @@ class bitrue(Exchange, ImplicitAPI):
2795
2906
  """
2796
2907
  await self.load_markets()
2797
2908
  currency = self.currency(code)
2798
- accountTypes = self.safe_value(self.options, 'accountsByType', {})
2909
+ accountTypes = self.safe_dict(self.options, 'accountsByType', {})
2799
2910
  fromId = self.safe_string(accountTypes, fromAccount, fromAccount)
2800
2911
  toId = self.safe_string(accountTypes, toAccount, toAccount)
2801
- request = {
2912
+ request: dict = {
2802
2913
  'coinSymbol': currency['id'],
2803
2914
  'amount': self.currency_to_precision(code, amount),
2804
2915
  'transferType': fromId + '_to_' + toId,
@@ -2811,14 +2922,16 @@ class bitrue(Exchange, ImplicitAPI):
2811
2922
  # 'data': null
2812
2923
  # }
2813
2924
  #
2814
- data = self.safe_value(response, 'data', {})
2925
+ data = self.safe_dict(response, 'data', {})
2815
2926
  return self.parse_transfer(data, currency)
2816
2927
 
2817
2928
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
2818
2929
  """
2819
2930
  set the level of leverage for a market
2820
- :see: https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
2821
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
2931
+
2932
+ https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
2933
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
2934
+
2822
2935
  :param float leverage: the rate of leverage
2823
2936
  :param str symbol: unified market symbol
2824
2937
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2831,7 +2944,7 @@ class bitrue(Exchange, ImplicitAPI):
2831
2944
  await self.load_markets()
2832
2945
  market = self.market(symbol)
2833
2946
  response = None
2834
- request = {
2947
+ request: dict = {
2835
2948
  'contractName': market['id'],
2836
2949
  'leverage': leverage,
2837
2950
  }
@@ -2843,21 +2956,36 @@ class bitrue(Exchange, ImplicitAPI):
2843
2956
  response = await self.dapiV2PrivatePostLevelEdit(self.extend(request, params))
2844
2957
  return response
2845
2958
 
2846
- def parse_margin_modification(self, data, market=None):
2959
+ def parse_margin_modification(self, data, market=None) -> MarginModification:
2960
+ #
2961
+ # setMargin
2962
+ #
2963
+ # {
2964
+ # "code": 0,
2965
+ # "msg": "success"
2966
+ # "data": null
2967
+ # }
2968
+ #
2847
2969
  return {
2848
2970
  'info': data,
2971
+ 'symbol': market['symbol'],
2849
2972
  'type': None,
2973
+ 'marginMode': 'isolated',
2850
2974
  'amount': None,
2975
+ 'total': None,
2851
2976
  'code': None,
2852
- 'symbol': market['symbol'],
2853
2977
  'status': None,
2978
+ 'timestamp': None,
2979
+ 'datetime': None,
2854
2980
  }
2855
2981
 
2856
- async def set_margin(self, symbol: str, amount: float, params={}):
2982
+ async def set_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
2857
2983
  """
2858
2984
  Either adds or reduces margin in an isolated position in order to set the margin to a specific value
2859
- :see: https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
2860
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
2985
+
2986
+ https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
2987
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
2988
+
2861
2989
  :param str symbol: unified market symbol of the market to set margin in
2862
2990
  :param float amount: the amount to set the margin to
2863
2991
  :param dict [params]: parameters specific to the exchange API endpoint
@@ -2868,7 +2996,7 @@ class bitrue(Exchange, ImplicitAPI):
2868
2996
  if not market['swap']:
2869
2997
  raise NotSupported(self.id + ' setMargin only support swap markets')
2870
2998
  response = None
2871
- request = {
2999
+ request: dict = {
2872
3000
  'contractName': market['id'],
2873
3001
  'amount': self.parse_to_numeric(amount),
2874
3002
  }
@@ -2890,7 +3018,7 @@ class bitrue(Exchange, ImplicitAPI):
2890
3018
  version = self.safe_string(api, 1)
2891
3019
  access = self.safe_string(api, 2)
2892
3020
  url = None
2893
- if type == 'api' and version == 'kline':
3021
+ if (type == 'api' and version == 'kline') or (type == 'open' and path.find('listenKey') >= 0):
2894
3022
  url = self.urls['api'][type]
2895
3023
  else:
2896
3024
  url = self.urls['api'][type] + '/' + version
@@ -2899,7 +3027,7 @@ class bitrue(Exchange, ImplicitAPI):
2899
3027
  if access == 'private':
2900
3028
  self.check_required_credentials()
2901
3029
  recvWindow = self.safe_integer(self.options, 'recvWindow', 5000)
2902
- if type == 'spot':
3030
+ if type == 'spot' or type == 'open':
2903
3031
  query = self.urlencode(self.extend({
2904
3032
  'timestamp': self.nonce(),
2905
3033
  'recvWindow': recvWindow,
@@ -2924,6 +3052,10 @@ class bitrue(Exchange, ImplicitAPI):
2924
3052
  signPath = signPath + '/' + version + '/' + path
2925
3053
  signMessage = timestamp + method + signPath
2926
3054
  if method == 'GET':
3055
+ keys = list(params.keys())
3056
+ keysLength = len(keys)
3057
+ if keysLength > 0:
3058
+ signMessage += '?' + self.urlencode(params)
2927
3059
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2928
3060
  headers = {
2929
3061
  'X-CH-APIKEY': self.apiKey,
@@ -2936,7 +3068,7 @@ class bitrue(Exchange, ImplicitAPI):
2936
3068
  'recvWindow': recvWindow,
2937
3069
  }, params)
2938
3070
  body = self.json(query)
2939
- signMessage = signMessage + json.dumps(body)
3071
+ signMessage += body
2940
3072
  signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
2941
3073
  headers = {
2942
3074
  'Content-Type': 'application/json',
@@ -2949,7 +3081,7 @@ class bitrue(Exchange, ImplicitAPI):
2949
3081
  url += '?' + self.urlencode(params)
2950
3082
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
2951
3083
 
2952
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
3084
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2953
3085
  if (code == 418) or (code == 429):
2954
3086
  raise DDoSProtection(self.id + ' ' + str(code) + ' ' + reason + ' ' + body)
2955
3087
  # error response in a form: {"code": -1013, "msg": "Invalid quantity."}