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