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