ccxt-ir 4.3.46.0.3__py2.py3-none-any.whl → 4.5.0__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 (529) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +8 -8
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +8 -8
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/__test__.py +0 -7
  438. ccxt/abstract/ace.py +0 -15
  439. ccxt/abstract/bitbay.py +0 -53
  440. ccxt/abstract/bitcoincom.py +0 -115
  441. ccxt/abstract/bitfinex2.py +0 -139
  442. ccxt/abstract/bitpanda.py +0 -35
  443. ccxt/abstract/bl3p.py +0 -19
  444. ccxt/abstract/coinlist.py +0 -54
  445. ccxt/abstract/currencycom.py +0 -68
  446. ccxt/abstract/hitbtc3.py +0 -115
  447. ccxt/abstract/idex.py +0 -26
  448. ccxt/abstract/kuna.py +0 -182
  449. ccxt/abstract/lykke.py +0 -29
  450. ccxt/abstract/poloniexfutures.py +0 -48
  451. ccxt/abstract/wazirx.py +0 -30
  452. ccxt/ace.py +0 -1012
  453. ccxt/async_support/ace.py +0 -1012
  454. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  455. ccxt/async_support/base/ws/fast_client.py +0 -96
  456. ccxt/async_support/bitbay.py +0 -17
  457. ccxt/async_support/bitcoincom.py +0 -17
  458. ccxt/async_support/bitfinex2.py +0 -3552
  459. ccxt/async_support/bitpanda.py +0 -16
  460. ccxt/async_support/bl3p.py +0 -485
  461. ccxt/async_support/coinlist.py +0 -2243
  462. ccxt/async_support/currencycom.py +0 -1950
  463. ccxt/async_support/hitbtc3.py +0 -16
  464. ccxt/async_support/idex.py +0 -1766
  465. ccxt/async_support/kuna.py +0 -1841
  466. ccxt/async_support/lykke.py +0 -1270
  467. ccxt/async_support/poloniexfutures.py +0 -1717
  468. ccxt/async_support/wazirx.py +0 -1224
  469. ccxt/bitbay.py +0 -17
  470. ccxt/bitcoincom.py +0 -17
  471. ccxt/bitfinex2.py +0 -3552
  472. ccxt/bitpanda.py +0 -16
  473. ccxt/bl3p.py +0 -485
  474. ccxt/coinlist.py +0 -2243
  475. ccxt/currencycom.py +0 -1950
  476. ccxt/hitbtc3.py +0 -16
  477. ccxt/idex.py +0 -1766
  478. ccxt/kuna.py +0 -1841
  479. ccxt/lykke.py +0 -1270
  480. ccxt/poloniexfutures.py +0 -1717
  481. ccxt/pro/bitcoincom.py +0 -34
  482. ccxt/pro/bitfinex2.py +0 -1083
  483. ccxt/pro/bitpanda.py +0 -15
  484. ccxt/pro/currencycom.py +0 -536
  485. ccxt/pro/idex.py +0 -672
  486. ccxt/pro/poloniexfutures.py +0 -990
  487. ccxt/pro/wazirx.py +0 -749
  488. ccxt/test/base/__init__.py +0 -29
  489. ccxt/test/base/test_account.py +0 -26
  490. ccxt/test/base/test_balance.py +0 -56
  491. ccxt/test/base/test_borrow_interest.py +0 -35
  492. ccxt/test/base/test_borrow_rate.py +0 -32
  493. ccxt/test/base/test_calculate_fee.py +0 -51
  494. ccxt/test/base/test_crypto.py +0 -127
  495. ccxt/test/base/test_currency.py +0 -76
  496. ccxt/test/base/test_datetime.py +0 -109
  497. ccxt/test/base/test_decimal_to_precision.py +0 -392
  498. ccxt/test/base/test_deep_extend.py +0 -68
  499. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  500. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  501. ccxt/test/base/test_funding_rate_history.py +0 -29
  502. ccxt/test/base/test_last_price.py +0 -31
  503. ccxt/test/base/test_ledger_entry.py +0 -45
  504. ccxt/test/base/test_ledger_item.py +0 -48
  505. ccxt/test/base/test_leverage_tier.py +0 -33
  506. ccxt/test/base/test_liquidation.py +0 -50
  507. ccxt/test/base/test_margin_mode.py +0 -24
  508. ccxt/test/base/test_margin_modification.py +0 -35
  509. ccxt/test/base/test_market.py +0 -193
  510. ccxt/test/base/test_number.py +0 -411
  511. ccxt/test/base/test_ohlcv.py +0 -33
  512. ccxt/test/base/test_open_interest.py +0 -32
  513. ccxt/test/base/test_order.py +0 -64
  514. ccxt/test/base/test_order_book.py +0 -69
  515. ccxt/test/base/test_position.py +0 -60
  516. ccxt/test/base/test_shared_methods.py +0 -353
  517. ccxt/test/base/test_status.py +0 -24
  518. ccxt/test/base/test_throttle.py +0 -126
  519. ccxt/test/base/test_ticker.py +0 -92
  520. ccxt/test/base/test_trade.py +0 -47
  521. ccxt/test/base/test_trading_fee.py +0 -26
  522. ccxt/test/base/test_transaction.py +0 -39
  523. ccxt/test/test_async.py +0 -1649
  524. ccxt/test/test_sync.py +0 -1648
  525. ccxt/wazirx.py +0 -1224
  526. ccxt_ir-4.3.46.0.3.dist-info/RECORD +0 -773
  527. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  528. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  529. {ccxt_ir-4.3.46.0.3.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,7 @@ 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, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry, TransferEntries
11
+ from ccxt.base.types import Any, 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
14
  from ccxt.base.errors import AuthenticationError
@@ -34,12 +34,12 @@ from ccxt.base.precise import Precise
34
34
 
35
35
  class bitrue(Exchange, ImplicitAPI):
36
36
 
37
- def describe(self):
37
+ def describe(self) -> Any:
38
38
  return self.deep_extend(super(bitrue, self).describe(), {
39
39
  'id': 'bitrue',
40
40
  'name': 'Bitrue',
41
41
  'countries': ['SG'], # Singapore, Malta
42
- 'rateLimit': 1000,
42
+ 'rateLimit': 10,
43
43
  'certified': False,
44
44
  'version': 'v1',
45
45
  'pro': True,
@@ -51,19 +51,32 @@ class bitrue(Exchange, ImplicitAPI):
51
51
  'swap': True,
52
52
  'future': False,
53
53
  'option': False,
54
+ 'addMargin': False,
55
+ 'borrowCrossMargin': False,
56
+ 'borrowIsolatedMargin': False,
57
+ 'borrowMargin': False,
54
58
  'cancelAllOrders': True,
55
59
  'cancelOrder': True,
60
+ 'closeAllPositions': False,
61
+ 'closePosition': False,
56
62
  'createMarketBuyOrderWithCost': True,
57
63
  'createMarketOrderWithCost': False,
58
64
  'createMarketSellOrderWithCost': False,
59
65
  'createOrder': True,
66
+ 'createOrderWithTakeProfitAndStopLoss': False,
67
+ 'createOrderWithTakeProfitAndStopLossWs': False,
68
+ 'createReduceOnlyOrder': True,
60
69
  'createStopLimitOrder': True,
61
70
  'createStopMarketOrder': True,
62
71
  'createStopOrder': True,
63
72
  'fetchBalance': True,
64
73
  'fetchBidsAsks': True,
74
+ 'fetchBorrowInterest': False,
75
+ 'fetchBorrowRate': False,
65
76
  'fetchBorrowRateHistories': False,
66
77
  'fetchBorrowRateHistory': False,
78
+ 'fetchBorrowRates': False,
79
+ 'fetchBorrowRatesPerSymbol': False,
67
80
  'fetchClosedOrders': True,
68
81
  'fetchCrossBorrowRate': False,
69
82
  'fetchCrossBorrowRates': False,
@@ -73,18 +86,51 @@ class bitrue(Exchange, ImplicitAPI):
73
86
  'fetchDepositsWithdrawals': False,
74
87
  'fetchDepositWithdrawFee': 'emulated',
75
88
  'fetchDepositWithdrawFees': True,
89
+ 'fetchFundingHistory': False,
90
+ 'fetchFundingInterval': False,
91
+ 'fetchFundingIntervals': False,
76
92
  'fetchFundingRate': False,
93
+ 'fetchFundingRateHistory': False,
94
+ 'fetchFundingRates': False,
95
+ 'fetchGreeks': False,
96
+ 'fetchIndexOHLCV': False,
77
97
  'fetchIsolatedBorrowRate': False,
78
98
  'fetchIsolatedBorrowRates': False,
99
+ 'fetchIsolatedPositions': False,
100
+ 'fetchLeverage': False,
101
+ 'fetchLeverages': False,
102
+ 'fetchLeverageTiers': False,
103
+ 'fetchLiquidations': False,
104
+ 'fetchLongShortRatio': False,
105
+ 'fetchLongShortRatioHistory': False,
106
+ 'fetchMarginAdjustmentHistory': False,
79
107
  'fetchMarginMode': False,
108
+ 'fetchMarginModes': False,
109
+ 'fetchMarketLeverageTiers': False,
80
110
  'fetchMarkets': True,
111
+ 'fetchMarkOHLCV': False,
112
+ 'fetchMarkPrices': False,
113
+ 'fetchMyLiquidations': False,
114
+ 'fetchMySettlementHistory': False,
81
115
  'fetchMyTrades': True,
82
116
  'fetchOHLCV': True,
117
+ 'fetchOpenInterest': False,
118
+ 'fetchOpenInterestHistory': False,
119
+ 'fetchOpenInterests': False,
83
120
  'fetchOpenOrders': True,
121
+ 'fetchOption': False,
122
+ 'fetchOptionChain': False,
84
123
  'fetchOrder': True,
85
124
  'fetchOrderBook': True,
86
125
  'fetchOrders': False,
126
+ 'fetchPosition': False,
127
+ 'fetchPositionHistory': False,
87
128
  'fetchPositionMode': False,
129
+ 'fetchPositions': False,
130
+ 'fetchPositionsHistory': False,
131
+ 'fetchPositionsRisk': False,
132
+ 'fetchPremiumIndexOHLCV': False,
133
+ 'fetchSettlementHistory': False,
88
134
  'fetchStatus': True,
89
135
  'fetchTicker': True,
90
136
  'fetchTickers': True,
@@ -95,9 +141,15 @@ class bitrue(Exchange, ImplicitAPI):
95
141
  'fetchTransactionFees': False,
96
142
  'fetchTransactions': False,
97
143
  'fetchTransfers': True,
144
+ 'fetchVolatilityHistory': False,
98
145
  'fetchWithdrawals': True,
146
+ 'reduceMargin': False,
147
+ 'repayCrossMargin': False,
148
+ 'repayIsolatedMargin': False,
99
149
  'setLeverage': True,
100
150
  'setMargin': True,
151
+ 'setMarginMode': False,
152
+ 'setPositionMode': False,
101
153
  'transfer': True,
102
154
  'withdraw': True,
103
155
  },
@@ -113,7 +165,7 @@ class bitrue(Exchange, ImplicitAPI):
113
165
  '1w': '1W',
114
166
  },
115
167
  'urls': {
116
- 'logo': 'https://user-images.githubusercontent.com/1294454/139516488-243a830d-05dd-446b-91c6-c1f18fe30c63.jpg',
168
+ 'logo': 'https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e',
117
169
  'api': {
118
170
  'spot': 'https://www.bitrue.com/api',
119
171
  'fapi': 'https://fapi.bitrue.com/fapi',
@@ -128,56 +180,62 @@ class bitrue(Exchange, ImplicitAPI):
128
180
  ],
129
181
  'fees': 'https://bitrue.zendesk.com/hc/en-001/articles/4405479952537',
130
182
  },
183
+ # from spotV1PublicGetExchangeInfo:
184
+ # general 25000 weight in 1 minute per IP. = 416.66 per second a weight of 0.24 for 1
185
+ # orders 750 weight in 6 seconds per IP. = 125 per second a weight of 0.8 for 1
186
+ # orders 200 weight in 10 seconds per User. = 20 per second a weight of 5 for 1
187
+ # withdraw 3000 weight in 1 hour per User. = 0.833 per second a weight of 120 for 1
188
+ # withdraw 1000 weight in 1 day per User. = 0.011574 per second a weight of 8640 for 1
131
189
  'api': {
132
190
  'spot': {
133
191
  'kline': {
134
192
  'public': {
135
193
  'get': {
136
- 'public.json': 1,
137
- 'public{currency}.json': 1,
194
+ 'public.json': 0.24,
195
+ 'public{currency}.json': 0.24,
138
196
  },
139
197
  },
140
198
  },
141
199
  'v1': {
142
200
  'public': {
143
201
  'get': {
144
- 'ping': 1,
145
- 'time': 1,
146
- 'exchangeInfo': 1,
147
- 'depth': {'cost': 1, 'byLimit': [[100, 1], [500, 5], [1000, 10]]},
148
- 'trades': 1,
149
- 'historicalTrades': 5,
150
- 'aggTrades': 1,
151
- 'ticker/24hr': {'cost': 1, 'noSymbol': 40},
152
- 'ticker/price': {'cost': 1, 'noSymbol': 2},
153
- 'ticker/bookTicker': {'cost': 1, 'noSymbol': 2},
154
- 'market/kline': 1,
202
+ 'ping': 0.24,
203
+ 'time': 0.24,
204
+ 'exchangeInfo': 0.24,
205
+ 'depth': {'cost': 1, 'byLimit': [[100, 0.24], [500, 1.2], [1000, 2.4]]},
206
+ 'trades': 0.24,
207
+ 'historicalTrades': 1.2,
208
+ 'aggTrades': 0.24,
209
+ 'ticker/24hr': {'cost': 0.24, 'noSymbol': 9.6},
210
+ 'ticker/price': 0.24,
211
+ 'ticker/bookTicker': 0.24,
212
+ 'market/kline': 0.24,
155
213
  },
156
214
  },
157
215
  'private': {
158
216
  'get': {
159
- 'order': 1,
160
- 'openOrders': 1,
161
- 'allOrders': 5,
162
- 'account': 5,
163
- 'myTrades': {'cost': 5, 'noSymbol': 40},
164
- 'etf/net-value/{symbol}': 1,
165
- 'withdraw/history': 1,
166
- 'deposit/history': 1,
217
+ 'order': 5,
218
+ 'openOrders': 5,
219
+ 'allOrders': 25,
220
+ 'account': 25,
221
+ 'myTrades': 25,
222
+ 'etf/net-value/{symbol}': 0.24,
223
+ 'withdraw/history': 120,
224
+ 'deposit/history': 120,
167
225
  },
168
226
  'post': {
169
- 'order': 4,
170
- 'withdraw/commit': 1,
227
+ 'order': 5,
228
+ 'withdraw/commit': 120,
171
229
  },
172
230
  'delete': {
173
- 'order': 1,
231
+ 'order': 5,
174
232
  },
175
233
  },
176
234
  },
177
235
  'v2': {
178
236
  'private': {
179
237
  'get': {
180
- 'myTrades': 5,
238
+ 'myTrades': 1.2,
181
239
  },
182
240
  },
183
241
  },
@@ -186,34 +244,34 @@ class bitrue(Exchange, ImplicitAPI):
186
244
  'v1': {
187
245
  'public': {
188
246
  'get': {
189
- 'ping': 1,
190
- 'time': 1,
191
- 'contracts': 1,
192
- 'depth': 1,
193
- 'ticker': 1,
194
- 'klines': 1,
247
+ 'ping': 0.24,
248
+ 'time': 0.24,
249
+ 'contracts': 0.24,
250
+ 'depth': 0.24,
251
+ 'ticker': 0.24,
252
+ 'klines': 0.24,
195
253
  },
196
254
  },
197
255
  },
198
256
  'v2': {
199
257
  'private': {
200
258
  'get': {
201
- 'myTrades': 1,
202
- 'openOrders': 1,
203
- 'order': 1,
204
- 'account': 1,
205
- 'leverageBracket': 1,
206
- 'commissionRate': 1,
207
- 'futures_transfer_history': 1,
208
- 'forceOrdersHistory': 1,
259
+ 'myTrades': 5,
260
+ 'openOrders': 5,
261
+ 'order': 5,
262
+ 'account': 5,
263
+ 'leverageBracket': 5,
264
+ 'commissionRate': 5,
265
+ 'futures_transfer_history': 5,
266
+ 'forceOrdersHistory': 5,
209
267
  },
210
268
  'post': {
211
- 'positionMargin': 1,
212
- 'level_edit': 1,
213
- 'cancel': 1,
214
- 'order': 1,
215
- 'allOpenOrders': 1,
216
- 'futures_transfer': 1,
269
+ 'positionMargin': 5,
270
+ 'level_edit': 5,
271
+ 'cancel': 5,
272
+ 'order': 25,
273
+ 'allOpenOrders': 5,
274
+ 'futures_transfer': 5,
217
275
  },
218
276
  },
219
277
  },
@@ -222,34 +280,34 @@ class bitrue(Exchange, ImplicitAPI):
222
280
  'v1': {
223
281
  'public': {
224
282
  'get': {
225
- 'ping': 1,
226
- 'time': 1,
227
- 'contracts': 1,
228
- 'depth': 1,
229
- 'ticker': 1,
230
- 'klines': 1,
283
+ 'ping': 0.24,
284
+ 'time': 0.24,
285
+ 'contracts': 0.24,
286
+ 'depth': 0.24,
287
+ 'ticker': 0.24,
288
+ 'klines': 0.24,
231
289
  },
232
290
  },
233
291
  },
234
292
  'v2': {
235
293
  'private': {
236
294
  'get': {
237
- 'myTrades': 1,
238
- 'openOrders': 1,
239
- 'order': 1,
240
- 'account': 1,
241
- 'leverageBracket': 1,
242
- 'commissionRate': 1,
243
- 'futures_transfer_history': 1,
244
- 'forceOrdersHistory': 1,
295
+ 'myTrades': 5,
296
+ 'openOrders': 5,
297
+ 'order': 5,
298
+ 'account': 5,
299
+ 'leverageBracket': 5,
300
+ 'commissionRate': 5,
301
+ 'futures_transfer_history': 5,
302
+ 'forceOrdersHistory': 5,
245
303
  },
246
304
  'post': {
247
- 'positionMargin': 1,
248
- 'level_edit': 1,
249
- 'cancel': 1,
250
- 'order': 1,
251
- 'allOpenOrders': 1,
252
- 'futures_transfer': 1,
305
+ 'positionMargin': 5,
306
+ 'level_edit': 5,
307
+ 'cancel': 5,
308
+ 'order': 5,
309
+ 'allOpenOrders': 5,
310
+ 'futures_transfer': 5,
253
311
  },
254
312
  },
255
313
  },
@@ -337,14 +395,13 @@ class bitrue(Exchange, ImplicitAPI):
337
395
  # exchange-specific options
338
396
  'options': {
339
397
  'createMarketBuyOrderRequiresPrice': True,
340
- 'fetchMarkets': [
341
- 'spot',
342
- 'linear',
343
- 'inverse',
344
- ],
398
+ 'fetchMarkets': {
399
+ 'types': ['spot', 'linear', 'inverse'],
400
+ },
345
401
  # 'fetchTradesMethod': 'publicGetAggTrades', # publicGetTrades, publicGetHistoricalTrades
346
402
  'fetchMyTradesMethod': 'v2PrivateGetMyTrades', # spotV1PrivateGetMyTrades
347
403
  'hasAlreadyAuthenticatedSuccessfully': False,
404
+ 'currencyToPrecisionRoundingMode': TRUNCATE,
348
405
  'recvWindow': 5 * 1000, # 5 sec, binance default
349
406
  'timeDifference': 0, # the difference between system clock and Binance clock
350
407
  'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
@@ -356,6 +413,67 @@ class bitrue(Exchange, ImplicitAPI):
356
413
  'networks': {
357
414
  'ERC20': 'ETH',
358
415
  'TRC20': 'TRX',
416
+ 'AETERNITY': 'Aeternity',
417
+ 'AION': 'AION',
418
+ 'ALGO': 'Algorand',
419
+ 'ASK': 'ASK',
420
+ 'ATOM': 'ATOM',
421
+ 'AVAXC': 'AVAX C-Chain',
422
+ 'BCH': 'BCH',
423
+ 'BEP2': 'BEP2',
424
+ 'BEP20': 'BEP20',
425
+ 'Bitcoin': 'Bitcoin',
426
+ 'BRP20': 'BRP20',
427
+ 'ADA': 'Cardano',
428
+ 'CASINOCOIN': 'CasinoCoin',
429
+ 'CASINOCOIN-XRPL': 'CasinoCoin XRPL',
430
+ 'CONTENTOS': 'Contentos',
431
+ 'DASH': 'Dash',
432
+ 'DECOIN': 'Decoin',
433
+ 'DFI': 'DeFiChain',
434
+ 'DGB': 'DGB',
435
+ 'DIVI': 'Divi',
436
+ 'DOGE': 'dogecoin',
437
+ 'EOS': 'EOS',
438
+ 'ETC': 'ETC',
439
+ 'FILECOIN': 'Filecoin',
440
+ 'FREETON': 'FREETON',
441
+ 'HBAR': 'HBAR',
442
+ 'HEDERA': 'Hedera Hashgraph',
443
+ 'HRC20': 'HRC20',
444
+ 'ICON': 'ICON',
445
+ 'ICP': 'ICP',
446
+ 'IGNIS': 'Ignis',
447
+ 'INTERNETCOMPUTER': 'Internet Computer',
448
+ 'IOTA': 'IOTA',
449
+ 'KAVA': 'KAVA',
450
+ 'KSM': 'KSM',
451
+ 'LTC': 'LiteCoin',
452
+ 'LUNA': 'Luna',
453
+ 'MATIC': 'MATIC',
454
+ 'MOBILECOIN': 'Mobile Coin',
455
+ 'MONACOIN': 'MonaCoin',
456
+ 'XMR': 'Monero',
457
+ 'NEM': 'NEM',
458
+ 'NEP5': 'NEP5',
459
+ 'OMNI': 'OMNI',
460
+ 'PAC': 'PAC',
461
+ 'DOT': 'Polkadot',
462
+ 'RAVEN': 'Ravencoin',
463
+ 'SAFEX': 'Safex',
464
+ 'SOL': 'SOLANA',
465
+ 'SGB': 'Songbird',
466
+ 'XML': 'Stellar Lumens',
467
+ 'XYM': 'Symbol',
468
+ 'XTZ': 'Tezos',
469
+ 'theta': 'theta',
470
+ 'THETA': 'THETA',
471
+ 'VECHAIN': 'VeChain',
472
+ 'WANCHAIN': 'Wanchain',
473
+ 'XINFIN': 'XinFin Network',
474
+ 'XRP': 'XRP',
475
+ 'XRPL': 'XRPL',
476
+ 'ZIL': 'ZIL',
359
477
  },
360
478
  'defaultType': 'spot',
361
479
  'timeframes': {
@@ -395,7 +513,96 @@ class bitrue(Exchange, ImplicitAPI):
395
513
  'MIM': 'MIM Swarm',
396
514
  },
397
515
  'precisionMode': TICK_SIZE,
398
- # https://binance-docs.github.io/apidocs/spot/en/#error-codes-2
516
+ 'features': {
517
+ 'default': {
518
+ 'sandbox': False,
519
+ 'createOrder': {
520
+ 'marginMode': False,
521
+ 'triggerPrice': True,
522
+ 'triggerPriceType': None,
523
+ 'triggerDirection': None,
524
+ 'stopLossPrice': False, # todo
525
+ 'takeProfitPrice': False, # todo
526
+ 'attachedStopLossTakeProfit': None,
527
+ 'timeInForce': {
528
+ 'IOC': True,
529
+ 'FOK': True,
530
+ 'PO': True,
531
+ 'GTD': False,
532
+ },
533
+ 'hedged': False,
534
+ 'trailing': False,
535
+ 'leverage': False,
536
+ 'marketBuyRequiresPrice': True, # todo revise
537
+ 'marketBuyByCost': True,
538
+ 'selfTradePrevention': False,
539
+ 'iceberg': True, # todo implement
540
+ },
541
+ 'createOrders': None,
542
+ 'fetchMyTrades': {
543
+ 'marginMode': False,
544
+ 'limit': 1000,
545
+ 'daysBack': 100000,
546
+ 'untilDays': 100000,
547
+ 'symbolRequired': True,
548
+ },
549
+ 'fetchOrder': {
550
+ 'marginMode': False,
551
+ 'trigger': False,
552
+ 'trailing': False,
553
+ 'symbolRequired': True,
554
+ },
555
+ 'fetchOpenOrders': {
556
+ 'marginMode': False,
557
+ 'limit': None,
558
+ 'trigger': False,
559
+ 'trailing': False,
560
+ 'symbolRequired': True,
561
+ },
562
+ 'fetchOrders': None,
563
+ 'fetchClosedOrders': {
564
+ 'marginMode': False,
565
+ 'limit': 1000,
566
+ 'daysBack': 90,
567
+ 'daysBackCanceled': 1,
568
+ 'untilDays': 90,
569
+ 'trigger': False,
570
+ 'trailing': False,
571
+ 'symbolRequired': True,
572
+ },
573
+ 'fetchOHLCV': {
574
+ 'limit': 1440,
575
+ },
576
+ },
577
+ 'spot': {
578
+ 'extends': 'default',
579
+ },
580
+ 'forDerivatives': {
581
+ 'extends': 'default',
582
+ 'createOrder': {
583
+ 'marginMode': True,
584
+ 'leverage': True,
585
+ 'marketBuyRequiresPrice': False,
586
+ 'marketBuyByCost': False,
587
+ },
588
+ 'fetchOHLCV': {
589
+ 'limit': 300,
590
+ },
591
+ 'fetchClosedOrders': None,
592
+ },
593
+ 'swap': {
594
+ 'linear': {
595
+ 'extends': 'forDerivatives',
596
+ },
597
+ 'inverse': {
598
+ 'extends': 'forDerivatives',
599
+ },
600
+ },
601
+ 'future': {
602
+ 'linear': None,
603
+ 'inverse': None,
604
+ },
605
+ },
399
606
  'exceptions': {
400
607
  'exact': {
401
608
  'System is under maintenance.': OnMaintenance, # {"code":1,"msg":"System is under maintenance."}
@@ -467,26 +674,22 @@ class bitrue(Exchange, ImplicitAPI):
467
674
  '-4051': InsufficientFunds, # {"code":-4051,"msg":"Isolated balance insufficient."}
468
675
  },
469
676
  'broad': {
677
+ 'Insufficient account balance': InsufficientFunds, # {"code":-2010,"msg":"Insufficient account balance.","data":null}
470
678
  'has no operation privilege': PermissionDenied,
471
679
  'MAX_POSITION': InvalidOrder, # {"code":-2010,"msg":"Filter failure: MAX_POSITION"}
472
680
  },
473
681
  },
474
682
  })
475
683
 
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
684
  def nonce(self):
484
685
  return self.milliseconds() - self.options['timeDifference']
485
686
 
486
687
  async def fetch_status(self, params={}):
487
688
  """
488
689
  the latest known information on the availability of the exchange API
489
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
690
+
691
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
692
+
490
693
  :param dict [params]: extra parameters specific to the exchange API endpoint
491
694
  :returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
492
695
  """
@@ -507,10 +710,12 @@ class bitrue(Exchange, ImplicitAPI):
507
710
  'info': response,
508
711
  }
509
712
 
510
- async def fetch_time(self, params={}):
713
+ async def fetch_time(self, params={}) -> Int:
511
714
  """
512
715
  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
716
+
717
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
718
+
514
719
  :param dict [params]: extra parameters specific to the exchange API endpoint
515
720
  :returns int: the current integer timestamp in milliseconds from the exchange server
516
721
  """
@@ -522,77 +727,6 @@ class bitrue(Exchange, ImplicitAPI):
522
727
  #
523
728
  return self.safe_integer(response, 'serverTime')
524
729
 
525
- def safe_network(self, networkId):
526
- uppercaseNetworkId = networkId.upper()
527
- networksById: dict = {
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
730
  async def fetch_currencies(self, params={}) -> Currencies:
597
731
  """
598
732
  fetches all available currencies on an exchange
@@ -647,86 +781,78 @@ class bitrue(Exchange, ImplicitAPI):
647
781
  # }
648
782
  #
649
783
  result: dict = {}
650
- coins = self.safe_value(response, 'coins', [])
784
+ coins = self.safe_list(response, 'coins', [])
651
785
  for i in range(0, len(coins)):
652
786
  currency = coins[i]
653
787
  id = self.safe_string(currency, 'coin')
654
788
  name = self.safe_string(currency, 'coinFulName')
655
789
  code = self.safe_currency_code(id)
656
- deposit = None
657
- withdraw = None
658
- minWithdrawString = None
659
- maxWithdrawString = None
660
- minWithdrawFeeString = None
661
- networkDetails = self.safe_value(currency, 'chainDetail', [])
790
+ networkDetails = self.safe_list(currency, 'chainDetail', [])
662
791
  networks: dict = {}
663
792
  for j in range(0, len(networkDetails)):
664
793
  entry = networkDetails[j]
665
794
  networkId = self.safe_string(entry, 'chain')
666
795
  network = self.network_id_to_code(networkId, code)
667
- enableDeposit = self.safe_value(entry, 'enableDeposit')
668
- deposit = enableDeposit if (enableDeposit) else deposit
669
- enableWithdraw = self.safe_value(entry, 'enableWithdraw')
670
- withdraw = enableWithdraw if (enableWithdraw) else withdraw
671
- networkWithdrawFeeString = self.safe_string(entry, 'withdrawFee')
672
- if networkWithdrawFeeString is not None:
673
- minWithdrawFeeString = networkWithdrawFeeString if (minWithdrawFeeString is None) else Precise.string_min(networkWithdrawFeeString, minWithdrawFeeString)
674
- networkMinWithdrawString = self.safe_string(entry, 'minWithdraw')
675
- if networkMinWithdrawString is not None:
676
- minWithdrawString = networkMinWithdrawString if (minWithdrawString is None) else Precise.string_min(networkMinWithdrawString, minWithdrawString)
677
- networkMaxWithdrawString = self.safe_string(entry, 'maxWithdraw')
678
- if networkMaxWithdrawString is not None:
679
- maxWithdrawString = networkMaxWithdrawString if (maxWithdrawString is None) else Precise.string_max(networkMaxWithdrawString, maxWithdrawString)
680
796
  networks[network] = {
681
797
  'info': entry,
682
798
  'id': networkId,
683
799
  'network': network,
684
- 'deposit': enableDeposit,
685
- 'withdraw': enableWithdraw,
686
- 'active': enableDeposit and enableWithdraw,
687
- 'fee': self.parse_number(networkWithdrawFeeString),
800
+ 'deposit': self.safe_bool(entry, 'enableDeposit'),
801
+ 'withdraw': self.safe_bool(entry, 'enableWithdraw'),
802
+ 'active': None,
803
+ 'fee': self.safe_number(entry, 'withdrawFee'),
688
804
  'precision': None,
689
805
  'limits': {
690
806
  'withdraw': {
691
- 'min': self.parse_number(networkMinWithdrawString),
692
- 'max': self.parse_number(networkMaxWithdrawString),
807
+ 'min': self.safe_number(entry, 'minWithdraw'),
808
+ 'max': self.safe_number(entry, 'maxWithdraw'),
693
809
  },
694
810
  },
695
811
  }
696
- result[code] = {
812
+ result[code] = self.safe_currency_structure({
697
813
  'id': id,
698
814
  'name': name,
699
815
  'code': code,
700
816
  'precision': None,
701
817
  'info': currency,
702
- 'active': deposit and withdraw,
703
- 'deposit': deposit,
704
- 'withdraw': withdraw,
818
+ 'active': None,
819
+ 'deposit': None,
820
+ 'withdraw': None,
705
821
  'networks': networks,
706
- 'fee': self.parse_number(minWithdrawFeeString),
707
- # 'fees': fees,
822
+ 'fee': None,
823
+ 'fees': None,
824
+ 'type': 'crypto',
708
825
  'limits': {
709
826
  'withdraw': {
710
- 'min': self.parse_number(minWithdrawString),
711
- 'max': self.parse_number(maxWithdrawString),
827
+ 'min': None,
828
+ 'max': None,
712
829
  },
713
830
  },
714
- }
831
+ })
715
832
  return result
716
833
 
717
834
  async def fetch_markets(self, params={}) -> List[Market]:
718
835
  """
719
836
  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
837
+
838
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
839
+ https://www.bitrue.com/api-docs#current-open-contract
840
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
841
+
723
842
  :param dict [params]: extra parameters specific to the exchange api endpoint
724
843
  :returns dict[]: an array of objects representing market data
725
844
  """
726
845
  promisesRaw = []
727
- fetchMarkets = self.safe_value(self.options, 'fetchMarkets', ['spot', 'linear', 'inverse'])
728
- for i in range(0, len(fetchMarkets)):
729
- marketType = fetchMarkets[i]
846
+ types = None
847
+ defaultTypes = ['spot', 'linear', 'inverse']
848
+ fetchMarketsOptions = self.safe_dict(self.options, 'fetchMarkets')
849
+ if fetchMarketsOptions is not None:
850
+ types = self.safe_list(fetchMarketsOptions, 'types', defaultTypes)
851
+ else:
852
+ # for backward-compatibility
853
+ types = self.safe_list(self.options, 'fetchMarkets', defaultTypes)
854
+ for i in range(0, len(types)):
855
+ marketType = types[i]
730
856
  if marketType == 'spot':
731
857
  promisesRaw.append(self.spotV1PublicGetExchangeInfo(params))
732
858
  elif marketType == 'linear':
@@ -842,11 +968,11 @@ class bitrue(Exchange, ImplicitAPI):
842
968
  symbol = base + '/' + quote
843
969
  if settle is not None:
844
970
  symbol += ':' + settle
845
- filters = self.safe_value(market, 'filters', [])
971
+ filters = self.safe_list(market, 'filters', [])
846
972
  filtersByType = self.index_by(filters, 'filterType')
847
973
  status = self.safe_string(market, 'status')
848
- priceFilter = self.safe_value(filtersByType, 'PRICE_FILTER', {})
849
- amountFilter = self.safe_value(filtersByType, 'LOT_SIZE', {})
974
+ priceFilter = self.safe_dict(filtersByType, 'PRICE_FILTER', {})
975
+ amountFilter = self.safe_dict(filtersByType, 'LOT_SIZE', {})
850
976
  defaultPricePrecision = self.safe_string(market, 'pricePrecision')
851
977
  defaultAmountPrecision = self.safe_string(market, 'quantityPrecision')
852
978
  pricePrecision = self.safe_string(priceFilter, 'priceScale', defaultPricePrecision)
@@ -976,9 +1102,11 @@ class bitrue(Exchange, ImplicitAPI):
976
1102
  async def fetch_balance(self, params={}) -> Balances:
977
1103
  """
978
1104
  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
1105
+
1106
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
1107
+ https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
1108
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
1109
+
982
1110
  :param dict [params]: extra parameters specific to the exchange API endpoint
983
1111
  :param str [params.type]: 'future', 'delivery', 'spot', 'swap'
984
1112
  :param str [params.subType]: 'linear', 'inverse'
@@ -994,7 +1122,7 @@ class bitrue(Exchange, ImplicitAPI):
994
1122
  if type == 'swap':
995
1123
  if subType is not None and subType == 'inverse':
996
1124
  response = await self.dapiV2PrivateGetAccount(params)
997
- result = self.safe_value(response, 'data', {})
1125
+ result = self.safe_dict(response, 'data', {})
998
1126
  #
999
1127
  # {
1000
1128
  # "code":"0",
@@ -1027,7 +1155,7 @@ class bitrue(Exchange, ImplicitAPI):
1027
1155
  #
1028
1156
  else:
1029
1157
  response = await self.fapiV2PrivateGetAccount(params)
1030
- result = self.safe_value(response, 'data', {})
1158
+ result = self.safe_dict(response, 'data', {})
1031
1159
  #
1032
1160
  # {
1033
1161
  # "code":"0",
@@ -1083,9 +1211,11 @@ class bitrue(Exchange, ImplicitAPI):
1083
1211
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
1084
1212
  """
1085
1213
  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
1214
+
1215
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
1216
+ https://www.bitrue.com/api-docs#order-book
1217
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
1218
+
1089
1219
  :param str symbol: unified symbol of the market to fetch the order book for
1090
1220
  :param int [limit]: the maximum amount of order book entries to return
1091
1221
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1142,7 +1272,7 @@ class bitrue(Exchange, ImplicitAPI):
1142
1272
  # "time": 1699338305000
1143
1273
  # }
1144
1274
  #
1145
- timestamp = self.safe_integer(response, 'time')
1275
+ timestamp = self.safe_integer_2(response, 'time', 'lastUpdateId')
1146
1276
  orderbook = self.parse_order_book(response, symbol, timestamp)
1147
1277
  orderbook['nonce'] = self.safe_integer(response, 'lastUpdateId')
1148
1278
  return orderbook
@@ -1217,9 +1347,11 @@ class bitrue(Exchange, ImplicitAPI):
1217
1347
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1218
1348
  """
1219
1349
  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
1350
+
1351
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1352
+ https://www.bitrue.com/api-docs#ticker
1353
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1354
+
1223
1355
  :param str symbol: unified symbol of the market to fetch the ticker for
1224
1356
  :param dict [params]: extra parameters specific to the exchange API endpoint
1225
1357
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1242,7 +1374,7 @@ class bitrue(Exchange, ImplicitAPI):
1242
1374
  'symbol': market['id'],
1243
1375
  }
1244
1376
  response = await self.spotV1PublicGetTicker24hr(self.extend(request, params))
1245
- data = self.safe_value(response, 0, {})
1377
+ data = self.safe_dict(response, 0, {})
1246
1378
  else:
1247
1379
  raise NotSupported(self.id + ' fetchTicker only support spot & swap markets')
1248
1380
  #
@@ -1288,23 +1420,25 @@ class bitrue(Exchange, ImplicitAPI):
1288
1420
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1289
1421
  """
1290
1422
  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
1423
+
1424
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#kline-data
1425
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#kline-candlestick-data
1426
+
1294
1427
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1295
1428
  :param str timeframe: the length of time each candle represents
1296
1429
  :param int [since]: timestamp in ms of the earliest candle to fetch
1297
1430
  :param int [limit]: the maximum amount of candles to fetch
1298
1431
  :param dict [params]: extra parameters specific to the exchange API endpoint
1432
+ :param int [params.until]: the latest time in ms to fetch transfers for
1299
1433
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
1300
1434
  """
1301
1435
  await self.load_markets()
1302
1436
  market = self.market(symbol)
1303
- timeframes = self.safe_value(self.options, 'timeframes', {})
1437
+ timeframes = self.safe_dict(self.options, 'timeframes', {})
1304
1438
  response = None
1305
1439
  data = None
1306
1440
  if market['swap']:
1307
- timeframesFuture = self.safe_value(timeframes, 'future', {})
1441
+ timeframesFuture = self.safe_dict(timeframes, 'future', {})
1308
1442
  request: dict = {
1309
1443
  'contractName': market['id'],
1310
1444
  # 1min / 5min / 15min / 30min / 1h / 1day / 1week / 1month
@@ -1318,7 +1452,7 @@ class bitrue(Exchange, ImplicitAPI):
1318
1452
  response = await self.dapiV1PublicGetKlines(self.extend(request, params))
1319
1453
  data = response
1320
1454
  elif market['spot']:
1321
- timeframesSpot = self.safe_value(timeframes, 'spot', {})
1455
+ timeframesSpot = self.safe_dict(timeframes, 'spot', {})
1322
1456
  request: dict = {
1323
1457
  'symbol': market['id'],
1324
1458
  # 1m / 5m / 15m / 30m / 1H / 2H / 4H / 12H / 1D / 1W
@@ -1326,10 +1460,12 @@ class bitrue(Exchange, ImplicitAPI):
1326
1460
  }
1327
1461
  if limit is not None:
1328
1462
  request['limit'] = limit
1329
- if since is not None:
1330
- request['fromIdx'] = since
1463
+ until = self.safe_integer(params, 'until')
1464
+ if until is not None:
1465
+ params = self.omit(params, 'until')
1466
+ request['fromIdx'] = until
1331
1467
  response = await self.spotV1PublicGetMarketKline(self.extend(request, params))
1332
- data = self.safe_value(response, 'data', [])
1468
+ data = self.safe_list(response, 'data', [])
1333
1469
  else:
1334
1470
  raise NotSupported(self.id + ' fetchOHLCV only support spot & swap markets')
1335
1471
  #
@@ -1406,9 +1542,11 @@ class bitrue(Exchange, ImplicitAPI):
1406
1542
  async def fetch_bids_asks(self, symbols: Strings = None, params={}):
1407
1543
  """
1408
1544
  fetches the bid and ask price and volume for multiple markets
1409
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
1410
- :see: https://www.bitrue.com/api-docs#ticker
1411
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1545
+
1546
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
1547
+ https://www.bitrue.com/api-docs#ticker
1548
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1549
+
1412
1550
  :param str[]|None symbols: unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
1413
1551
  :param dict [params]: extra parameters specific to the exchange API endpoint
1414
1552
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1464,9 +1602,11 @@ class bitrue(Exchange, ImplicitAPI):
1464
1602
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
1465
1603
  """
1466
1604
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1467
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1468
- :see: https://www.bitrue.com/api-docs#ticker
1469
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1605
+
1606
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
1607
+ https://www.bitrue.com/api-docs#ticker
1608
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
1609
+
1470
1610
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1471
1611
  :param dict [params]: extra parameters specific to the exchange API endpoint
1472
1612
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -1536,8 +1676,8 @@ class bitrue(Exchange, ImplicitAPI):
1536
1676
  # https://github.com/ccxt/ccxt/issues/13856
1537
1677
  tickers: dict = {}
1538
1678
  for i in range(0, len(data)):
1539
- ticker = self.safe_value(data, i, {})
1540
- market = self.market(self.safe_value(ticker, 'symbol'))
1679
+ ticker = self.safe_dict(data, i, {})
1680
+ market = self.safe_market(self.safe_string(ticker, 'symbol'))
1541
1681
  tickers[market['id']] = ticker
1542
1682
  return self.parse_tickers(tickers, symbols)
1543
1683
 
@@ -1598,8 +1738,8 @@ class bitrue(Exchange, ImplicitAPI):
1598
1738
  orderId = self.safe_string(trade, 'orderId')
1599
1739
  id = self.safe_string_2(trade, 'id', 'tradeId')
1600
1740
  side = None
1601
- buyerMaker = self.safe_value(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
1602
- isBuyer = self.safe_value(trade, 'isBuyer')
1741
+ buyerMaker = self.safe_bool(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
1742
+ isBuyer = self.safe_bool(trade, 'isBuyer')
1603
1743
  if buyerMaker is not None:
1604
1744
  side = 'sell' if buyerMaker else 'buy'
1605
1745
  if isBuyer is not None:
@@ -1611,7 +1751,7 @@ class bitrue(Exchange, ImplicitAPI):
1611
1751
  'currency': self.safe_currency_code(self.safe_string(trade, 'commissionAssert')),
1612
1752
  }
1613
1753
  takerOrMaker = None
1614
- isMaker = self.safe_value(trade, 'isMaker')
1754
+ isMaker = self.safe_bool(trade, 'isMaker')
1615
1755
  if isMaker is not None:
1616
1756
  takerOrMaker = 'maker' if isMaker else 'taker'
1617
1757
  return self.safe_trade({
@@ -1633,7 +1773,9 @@ class bitrue(Exchange, ImplicitAPI):
1633
1773
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1634
1774
  """
1635
1775
  get the list of most recent trades for a particular symbol
1636
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1776
+
1777
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1778
+
1637
1779
  :param str symbol: unified symbol of the market to fetch trades for
1638
1780
  :param int [since]: timestamp in ms of the earliest trade to fetch
1639
1781
  :param int [limit]: the maximum amount of trades to fetch
@@ -1764,14 +1906,13 @@ class bitrue(Exchange, ImplicitAPI):
1764
1906
  id = self.safe_string(order, 'orderId')
1765
1907
  type = self.safe_string_lower(order, 'type')
1766
1908
  side = self.safe_string_lower(order, 'side')
1767
- fills = self.safe_value(order, 'fills', [])
1909
+ fills = self.safe_list(order, 'fills', [])
1768
1910
  clientOrderId = self.safe_string(order, 'clientOrderId')
1769
1911
  timeInForce = self.safe_string(order, 'timeInForce')
1770
1912
  postOnly = (type == 'limit_maker') or (timeInForce == 'GTX') or (type == 'post_only')
1771
1913
  if type == 'limit_maker':
1772
1914
  type = 'limit'
1773
- stopPriceString = self.safe_string(order, 'stopPrice')
1774
- stopPrice = self.parse_number(self.omit_zero(stopPriceString))
1915
+ triggerPrice = self.parse_number(self.omit_zero(self.safe_string(order, 'stopPrice')))
1775
1916
  return self.safe_order({
1776
1917
  'info': order,
1777
1918
  'id': id,
@@ -1785,8 +1926,7 @@ class bitrue(Exchange, ImplicitAPI):
1785
1926
  'postOnly': postOnly,
1786
1927
  'side': side,
1787
1928
  'price': price,
1788
- 'stopPrice': stopPrice,
1789
- 'triggerPrice': stopPrice,
1929
+ 'triggerPrice': triggerPrice,
1790
1930
  'amount': amount,
1791
1931
  'cost': cost,
1792
1932
  'average': average,
@@ -1800,8 +1940,10 @@ class bitrue(Exchange, ImplicitAPI):
1800
1940
  async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1801
1941
  """
1802
1942
  create a market buy order by providing the symbol and cost
1803
- :see: https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1804
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1943
+
1944
+ https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1945
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1946
+
1805
1947
  :param str symbol: unified symbol of the market to create an order in
1806
1948
  :param float cost: how much you want to trade in units of the quote currency
1807
1949
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1817,14 +1959,15 @@ class bitrue(Exchange, ImplicitAPI):
1817
1959
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1818
1960
  """
1819
1961
  create a trade order
1820
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
1821
- :see: https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
1822
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
1962
+
1963
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#new-order-trade
1964
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#new-order-trade-hmac-sha256
1965
+
1823
1966
  :param str symbol: unified symbol of the market to create an order in
1824
1967
  :param str type: 'market' or 'limit'
1825
1968
  :param str side: 'buy' or 'sell'
1826
1969
  :param float amount: how much of currency you want to trade in units of base currency
1827
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1970
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1828
1971
  :param dict [params]: extra parameters specific to the exchange API endpoint
1829
1972
  :param float [params.triggerPrice]: *spot only* the price at which a trigger order is triggered at
1830
1973
  :param str [params.clientOrderId]: a unique id for the order, automatically generated if not sent
@@ -1832,7 +1975,7 @@ class bitrue(Exchange, ImplicitAPI):
1832
1975
  :param str [params.timeInForce]: 'fok', 'ioc' or 'po'
1833
1976
  :param bool [params.postOnly]: default False
1834
1977
  :param bool [params.reduceOnly]: default False
1835
- * EXCHANGE SPECIFIC PARAMETERS
1978
+ EXCHANGE SPECIFIC PARAMETERS
1836
1979
  :param decimal [params.icebergQty]:
1837
1980
  :param long [params.recvWindow]:
1838
1981
  :param float [params.cost]: *swap market buy only* the quote quantity that can be used alternative for the amount
@@ -1894,7 +2037,7 @@ class bitrue(Exchange, ImplicitAPI):
1894
2037
  response = await self.fapiV2PrivatePostOrder(self.extend(request, params))
1895
2038
  elif market['inverse']:
1896
2039
  response = await self.dapiV2PrivatePostOrder(self.extend(request, params))
1897
- data = self.safe_value(response, 'data', {})
2040
+ data = self.safe_dict(response, 'data', {})
1898
2041
  elif market['spot']:
1899
2042
  request['symbol'] = market['id']
1900
2043
  request['quantity'] = self.amount_to_precision(symbol, amount)
@@ -1905,10 +2048,10 @@ class bitrue(Exchange, ImplicitAPI):
1905
2048
  if clientOrderId is not None:
1906
2049
  params = self.omit(params, ['newClientOrderId', 'clientOrderId'])
1907
2050
  request['newClientOrderId'] = clientOrderId
1908
- stopPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
1909
- if stopPrice is not None:
2051
+ triggerPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
2052
+ if triggerPrice is not None:
1910
2053
  params = self.omit(params, ['triggerPrice', 'stopPrice'])
1911
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
2054
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1912
2055
  response = await self.spotV1PrivatePostOrder(self.extend(request, params))
1913
2056
  data = response
1914
2057
  else:
@@ -1939,9 +2082,11 @@ class bitrue(Exchange, ImplicitAPI):
1939
2082
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
1940
2083
  """
1941
2084
  fetches information on an order made by the user
1942
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#query-order-user_data
1943
- :see: https://www.bitrue.com/api-docs#query-order-user_data-hmac-sha256
1944
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#query-order-user_data-hmac-sha256
2085
+
2086
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#query-order-user_data
2087
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#query-order-user_data-hmac-sha256
2088
+
2089
+ :param str id: the order id
1945
2090
  :param str symbol: unified symbol of the market the order was made in
1946
2091
  :param dict [params]: extra parameters specific to the exchange API endpoint
1947
2092
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1968,7 +2113,7 @@ class bitrue(Exchange, ImplicitAPI):
1968
2113
  response = await self.fapiV2PrivateGetOrder(self.extend(request, params))
1969
2114
  elif market['inverse']:
1970
2115
  response = await self.dapiV2PrivateGetOrder(self.extend(request, params))
1971
- data = self.safe_value(response, 'data', {})
2116
+ data = self.safe_dict(response, 'data', {})
1972
2117
  elif market['spot']:
1973
2118
  request['orderId'] = id # spot market id is mandatory
1974
2119
  request['symbol'] = market['id']
@@ -2024,7 +2169,9 @@ class bitrue(Exchange, ImplicitAPI):
2024
2169
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2025
2170
  """
2026
2171
  fetches information on multiple closed orders made by the user
2027
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#all-orders-user_data
2172
+
2173
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#all-orders-user_data
2174
+
2028
2175
  :param str symbol: unified market symbol of the market orders were made in
2029
2176
  :param int [since]: the earliest time in ms to fetch orders for
2030
2177
  :param int [limit]: the maximum number of order structures to retrieve
@@ -2076,9 +2223,10 @@ class bitrue(Exchange, ImplicitAPI):
2076
2223
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2077
2224
  """
2078
2225
  fetch all unfilled currently open orders
2079
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#current-open-orders-user_data
2080
- :see: https://www.bitrue.com/api-docs#current-all-open-orders-user_data-hmac-sha256
2081
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#current-all-open-orders-user_data-hmac-sha256
2226
+
2227
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#current-open-orders-user_data
2228
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#cancel-all-open-orders-trade-hmac-sha256
2229
+
2082
2230
  :param str symbol: unified market symbol
2083
2231
  :param int [since]: the earliest time in ms to fetch open orders for
2084
2232
  :param int [limit]: the maximum number of open order structures to retrieve
@@ -2098,7 +2246,7 @@ class bitrue(Exchange, ImplicitAPI):
2098
2246
  response = await self.fapiV2PrivateGetOpenOrders(self.extend(request, params))
2099
2247
  elif market['inverse']:
2100
2248
  response = await self.dapiV2PrivateGetOpenOrders(self.extend(request, params))
2101
- data = self.safe_value(response, 'data', [])
2249
+ data = self.safe_list(response, 'data', [])
2102
2250
  elif market['spot']:
2103
2251
  request['symbol'] = market['id']
2104
2252
  response = await self.spotV1PrivateGetOpenOrders(self.extend(request, params))
@@ -2156,9 +2304,11 @@ class bitrue(Exchange, ImplicitAPI):
2156
2304
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
2157
2305
  """
2158
2306
  cancels an open order
2159
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
2160
- :see: https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
2161
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
2307
+
2308
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
2309
+ https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
2310
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
2311
+
2162
2312
  :param str id: order id
2163
2313
  :param str symbol: unified symbol of the market the order was made in
2164
2314
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2186,7 +2336,7 @@ class bitrue(Exchange, ImplicitAPI):
2186
2336
  response = await self.fapiV2PrivatePostCancel(self.extend(request, params))
2187
2337
  elif market['inverse']:
2188
2338
  response = await self.dapiV2PrivatePostCancel(self.extend(request, params))
2189
- data = self.safe_value(response, 'data', {})
2339
+ data = self.safe_dict(response, 'data', {})
2190
2340
  elif market['spot']:
2191
2341
  request['symbol'] = market['id']
2192
2342
  response = await self.spotV1PrivateDeleteOrder(self.extend(request, params))
@@ -2218,8 +2368,10 @@ class bitrue(Exchange, ImplicitAPI):
2218
2368
  async def cancel_all_orders(self, symbol: Str = None, params={}):
2219
2369
  """
2220
2370
  cancel all open orders in a market
2221
- :see: https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
2222
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
2371
+
2372
+ https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
2373
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
2374
+
2223
2375
  :param str symbol: unified market symbol of the market to cancel orders in
2224
2376
  :param dict [params]: extra parameters specific to the exchange API endpoint
2225
2377
  :param str [params.marginMode]: 'cross' or 'isolated', for spot margin trading
@@ -2237,7 +2389,7 @@ class bitrue(Exchange, ImplicitAPI):
2237
2389
  response = await self.fapiV2PrivatePostAllOpenOrders(self.extend(request, params))
2238
2390
  elif market['inverse']:
2239
2391
  response = await self.dapiV2PrivatePostAllOpenOrders(self.extend(request, params))
2240
- data = self.safe_value(response, 'data', [])
2392
+ data = self.safe_list(response, 'data', [])
2241
2393
  else:
2242
2394
  raise NotSupported(self.id + ' cancelAllOrders only support future markets')
2243
2395
  #
@@ -2254,9 +2406,10 @@ class bitrue(Exchange, ImplicitAPI):
2254
2406
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2255
2407
  """
2256
2408
  fetch all trades made by the user
2257
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#account-trade-list-user_data
2258
- :see: https://www.bitrue.com/api-docs#account-trade-list-user_data-hmac-sha256
2259
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#account-trade-list-user_data-hmac-sha256
2409
+
2410
+ https://www.bitrue.com/api_docs_includes_file/spot/index.html#account-trade-list-user_data
2411
+ https://www.bitrue.com/api_docs_includes_file/futures/index.html#account-trade-list-user_data-hmac-sha256
2412
+
2260
2413
  :param str symbol: unified market symbol
2261
2414
  :param int [since]: the earliest time in ms to fetch trades for
2262
2415
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -2282,7 +2435,7 @@ class bitrue(Exchange, ImplicitAPI):
2282
2435
  response = await self.fapiV2PrivateGetMyTrades(self.extend(request, params))
2283
2436
  elif market['inverse']:
2284
2437
  response = await self.dapiV2PrivateGetMyTrades(self.extend(request, params))
2285
- data = self.safe_value(response, 'data', [])
2438
+ data = self.safe_list(response, 'data', [])
2286
2439
  elif market['spot']:
2287
2440
  request['symbol'] = market['id']
2288
2441
  response = await self.spotV2PrivateGetMyTrades(self.extend(request, params))
@@ -2339,7 +2492,9 @@ class bitrue(Exchange, ImplicitAPI):
2339
2492
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2340
2493
  """
2341
2494
  fetch all deposits made to an account
2342
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
2495
+
2496
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
2497
+
2343
2498
  :param str code: unified currency code
2344
2499
  :param int [since]: the earliest time in ms to fetch deposits for
2345
2500
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -2406,7 +2561,9 @@ class bitrue(Exchange, ImplicitAPI):
2406
2561
  async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
2407
2562
  """
2408
2563
  fetch all withdrawals made from an account
2409
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
2564
+
2565
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
2566
+
2410
2567
  :param str code: unified currency code
2411
2568
  :param int [since]: the earliest time in ms to fetch withdrawals for
2412
2569
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -2469,7 +2626,7 @@ class bitrue(Exchange, ImplicitAPI):
2469
2626
  '6': 'canceled',
2470
2627
  },
2471
2628
  }
2472
- statuses = self.safe_value(statusesByType, type, {})
2629
+ statuses = self.safe_dict(statusesByType, type, {})
2473
2630
  return self.safe_string(statuses, status, status)
2474
2631
 
2475
2632
  def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
@@ -2592,10 +2749,12 @@ class bitrue(Exchange, ImplicitAPI):
2592
2749
  'fee': fee,
2593
2750
  }
2594
2751
 
2595
- async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
2752
+ async def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
2596
2753
  """
2597
2754
  make a withdrawal
2598
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
2755
+
2756
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
2757
+
2599
2758
  :param str code: unified currency code
2600
2759
  :param float amount: the amount to withdraw
2601
2760
  :param str address: the address to withdraw to
@@ -2650,7 +2809,7 @@ class bitrue(Exchange, ImplicitAPI):
2650
2809
  # "chainDetail": [[Object]]
2651
2810
  # }
2652
2811
  #
2653
- chainDetails = self.safe_value(fee, 'chainDetail', [])
2812
+ chainDetails = self.safe_list(fee, 'chainDetail', [])
2654
2813
  chainDetailLength = len(chainDetails)
2655
2814
  result: dict = {
2656
2815
  'info': fee,
@@ -2682,7 +2841,9 @@ class bitrue(Exchange, ImplicitAPI):
2682
2841
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2683
2842
  """
2684
2843
  fetch deposit and withdraw fees
2685
- :see: https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
2844
+
2845
+ https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
2846
+
2686
2847
  :param str[]|None codes: list of unified currency codes
2687
2848
  :param dict [params]: extra parameters specific to the exchange API endpoint
2688
2849
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -2728,11 +2889,13 @@ class bitrue(Exchange, ImplicitAPI):
2728
2889
  'status': 'ok',
2729
2890
  }
2730
2891
 
2731
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> TransferEntries:
2892
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
2732
2893
  """
2733
2894
  fetch a history of internal transfers made on an account
2734
- :see: https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
2735
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
2895
+
2896
+ https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
2897
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
2898
+
2736
2899
  :param str code: unified currency code of the currency transferred
2737
2900
  :param int [since]: the earliest time in ms to fetch transfers for
2738
2901
  :param int [limit]: the maximum number of transfers structures to retrieve
@@ -2780,8 +2943,10 @@ class bitrue(Exchange, ImplicitAPI):
2780
2943
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2781
2944
  """
2782
2945
  transfer currency internally between wallets on the same account
2783
- :see: https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
2784
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
2946
+
2947
+ https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
2948
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
2949
+
2785
2950
  :param str code: unified currency code
2786
2951
  :param float amount: amount to transfer
2787
2952
  :param str fromAccount: account to transfer from
@@ -2791,7 +2956,7 @@ class bitrue(Exchange, ImplicitAPI):
2791
2956
  """
2792
2957
  await self.load_markets()
2793
2958
  currency = self.currency(code)
2794
- accountTypes = self.safe_value(self.options, 'accountsByType', {})
2959
+ accountTypes = self.safe_dict(self.options, 'accountsByType', {})
2795
2960
  fromId = self.safe_string(accountTypes, fromAccount, fromAccount)
2796
2961
  toId = self.safe_string(accountTypes, toAccount, toAccount)
2797
2962
  request: dict = {
@@ -2810,11 +2975,13 @@ class bitrue(Exchange, ImplicitAPI):
2810
2975
  data = self.safe_dict(response, 'data', {})
2811
2976
  return self.parse_transfer(data, currency)
2812
2977
 
2813
- async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
2978
+ async def set_leverage(self, leverage: int, symbol: Str = None, params={}):
2814
2979
  """
2815
2980
  set the level of leverage for a market
2816
- :see: https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
2817
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
2981
+
2982
+ https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
2983
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
2984
+
2818
2985
  :param float leverage: the rate of leverage
2819
2986
  :param str symbol: unified market symbol
2820
2987
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2865,8 +3032,10 @@ class bitrue(Exchange, ImplicitAPI):
2865
3032
  async def set_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
2866
3033
  """
2867
3034
  Either adds or reduces margin in an isolated position in order to set the margin to a specific value
2868
- :see: https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
2869
- :see: https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
3035
+
3036
+ https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
3037
+ https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
3038
+
2870
3039
  :param str symbol: unified market symbol of the market to set margin in
2871
3040
  :param float amount: the amount to set the margin to
2872
3041
  :param dict [params]: parameters specific to the exchange API endpoint
@@ -2899,7 +3068,7 @@ class bitrue(Exchange, ImplicitAPI):
2899
3068
  version = self.safe_string(api, 1)
2900
3069
  access = self.safe_string(api, 2)
2901
3070
  url = None
2902
- if type == 'api' and version == 'kline':
3071
+ if (type == 'api' and version == 'kline') or (type == 'open' and path.find('listenKey') >= 0):
2903
3072
  url = self.urls['api'][type]
2904
3073
  else:
2905
3074
  url = self.urls['api'][type] + '/' + version
@@ -2908,7 +3077,7 @@ class bitrue(Exchange, ImplicitAPI):
2908
3077
  if access == 'private':
2909
3078
  self.check_required_credentials()
2910
3079
  recvWindow = self.safe_integer(self.options, 'recvWindow', 5000)
2911
- if type == 'spot':
3080
+ if type == 'spot' or type == 'open':
2912
3081
  query = self.urlencode(self.extend({
2913
3082
  'timestamp': self.nonce(),
2914
3083
  'recvWindow': recvWindow,