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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
@@ -6,16 +6,16 @@
6
6
  from ccxt.async_support.base.exchange import Exchange
7
7
  from ccxt.abstract.blofin import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currency, Int, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
9
+ from ccxt.base.types import Balances, Currency, Int, LedgerEntry, Leverage, Leverages, MarginMode, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, FundingRate, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
12
13
  from ccxt.base.errors import ArgumentsRequired
13
14
  from ccxt.base.errors import BadRequest
14
15
  from ccxt.base.errors import InsufficientFunds
15
16
  from ccxt.base.errors import InvalidOrder
16
17
  from ccxt.base.errors import RateLimitExceeded
17
18
  from ccxt.base.errors import ExchangeNotAvailable
18
- from ccxt.base.errors import AuthenticationError
19
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
20
20
  from ccxt.base.precise import Precise
21
21
 
@@ -29,6 +29,7 @@ class blofin(Exchange, ImplicitAPI):
29
29
  'countries': ['US'],
30
30
  'version': 'v1',
31
31
  'rateLimit': 100,
32
+ 'pro': True,
32
33
  'has': {
33
34
  'CORS': None,
34
35
  'spot': False,
@@ -103,12 +104,11 @@ class blofin(Exchange, ImplicitAPI):
103
104
  'fetchOpenInterestHistory': False,
104
105
  'fetchOpenOrder': None,
105
106
  'fetchOpenOrders': True,
106
- 'fetchOrder': True,
107
+ 'fetchOrder': None,
107
108
  'fetchOrderBook': True,
108
109
  'fetchOrderBooks': False,
109
110
  'fetchOrders': False,
110
111
  'fetchOrderTrades': True,
111
- 'fetchPermissions': None,
112
112
  'fetchPosition': True,
113
113
  'fetchPositions': True,
114
114
  'fetchPositionsForSymbol': False,
@@ -153,20 +153,21 @@ class blofin(Exchange, ImplicitAPI):
153
153
  '2h': '2H',
154
154
  '4h': '4H',
155
155
  '6h': '6H',
156
+ '8h': '8H',
156
157
  '12h': '12H',
157
158
  '1d': '1D',
159
+ '3d': '3D',
158
160
  '1w': '1W',
159
161
  '1M': '1M',
160
- '3M': '3M',
161
162
  },
162
163
  'hostname': 'www.blofin.com',
163
164
  'urls': {
164
- 'logo': 'https://github.com/ccxt/ccxt/assets/43336371/255a7b29-341f-4d20-8342-fbfae4932807',
165
+ 'logo': 'https://github.com/user-attachments/assets/518cdf80-f05d-4821-a3e3-d48ceb41d73b',
165
166
  'api': {
166
167
  'rest': 'https://openapi.blofin.com',
167
168
  },
168
169
  'referral': {
169
- 'url': 'https://blofin.com/register?referral_code=jBd8U1',
170
+ 'url': 'https://blofin.com/register?referral_code=f79EsS',
170
171
  'discount': 0.05,
171
172
  },
172
173
  'www': 'https://www.blofin.com',
@@ -201,6 +202,20 @@ class blofin(Exchange, ImplicitAPI):
201
202
  'trade/orders-tpsl-pending': 1,
202
203
  'trade/orders-history': 1,
203
204
  'trade/orders-tpsl-history': 1,
205
+ 'user/query-apikey': 1,
206
+ 'affiliate/basic': 1,
207
+ 'copytrading/instruments': 1,
208
+ 'copytrading/account/balance': 1,
209
+ 'copytrading/account/positions-by-order': 1,
210
+ 'copytrading/account/positions-details-by-order': 1,
211
+ 'copytrading/account/positions-by-contract': 1,
212
+ 'copytrading/account/position-mode': 1,
213
+ 'copytrading/account/leverage-info': 1,
214
+ 'copytrading/trade/orders-pending': 1,
215
+ 'copytrading/trade/pending-tpsl-by-contract': 1,
216
+ 'copytrading/trade/position-history-by-order': 1,
217
+ 'copytrading/trade/orders-history': 1,
218
+ 'copytrading/trade/pending-tpsl-by-order': 1,
204
219
  },
205
220
  'post': {
206
221
  'trade/order': 1,
@@ -212,6 +227,16 @@ class blofin(Exchange, ImplicitAPI):
212
227
  'trade/cancel-tpsl': 1,
213
228
  'trade/close-position': 1,
214
229
  'asset/transfer': 1,
230
+ 'copytrading/account/set-position-mode': 1,
231
+ 'copytrading/account/set-leverage': 1,
232
+ 'copytrading/trade/place-order': 1,
233
+ 'copytrading/trade/cancel-order': 1,
234
+ 'copytrading/trade/place-tpsl-by-contract': 1,
235
+ 'copytrading/trade/cancel-tpsl-by-contract': 1,
236
+ 'copytrading/trade/place-tpsl-by-order': 1,
237
+ 'copytrading/trade/cancel-tpsl-by-order': 1,
238
+ 'copytrading/trade/close-position-by-order': 1,
239
+ 'copytrading/trade/close-position-by-contract': 1,
215
240
  },
216
241
  },
217
242
  },
@@ -226,6 +251,93 @@ class blofin(Exchange, ImplicitAPI):
226
251
  'secret': True,
227
252
  'password': True,
228
253
  },
254
+ 'features': {
255
+ 'default': {
256
+ 'sandbox': False,
257
+ 'createOrder': {
258
+ 'timeInForce': {
259
+ 'IOC': True,
260
+ 'FOK': True,
261
+ 'PO': True,
262
+ 'GTD': False,
263
+ },
264
+ 'leverage': False,
265
+ 'marketBuyRequiresPrice': False,
266
+ 'marketBuyByCost': False,
267
+ 'selfTradePrevention': False,
268
+ 'trailing': False,
269
+ 'iceberg': False,
270
+ },
271
+ 'createOrders': {
272
+ 'max': 10,
273
+ },
274
+ 'fetchMyTrades': {
275
+ 'marginMode': False,
276
+ 'limit': 100,
277
+ 'daysBack': 100000,
278
+ 'untilDays': 100000,
279
+ },
280
+ 'fetchOrder': None,
281
+ 'fetchOpenOrders': {
282
+ 'marginMode': False,
283
+ 'limit': 100,
284
+ 'trigger': True,
285
+ 'trailing': False,
286
+ },
287
+ 'fetchOrders': None,
288
+ 'fetchClosedOrders': {
289
+ 'marginMode': False,
290
+ 'limit': 1000,
291
+ 'daysBack': 100000,
292
+ 'daysBackCanceled': 1,
293
+ 'untilDays': 100000,
294
+ 'trigger': True,
295
+ 'trailing': False,
296
+ },
297
+ 'fetchOHLCV': {
298
+ 'max': 1440,
299
+ },
300
+ },
301
+ 'spot': {
302
+ 'extends': 'default',
303
+ 'createOrder': {
304
+ 'marginMode': False,
305
+ 'triggerPrice': False,
306
+ 'triggerPriceType': None,
307
+ 'triggerDirection': False,
308
+ 'stopLossPrice': False,
309
+ 'takeProfitPrice': False,
310
+ 'attachedStopLossTakeProfit': None,
311
+ 'hedged': False,
312
+ },
313
+ },
314
+ 'forDerivatives': {
315
+ 'extends': 'default',
316
+ 'createOrder': {
317
+ 'marginMode': True,
318
+ 'triggerPrice': False, # todo
319
+ 'triggerPriceType': None,
320
+ 'triggerDirection': False,
321
+ 'stopLossPrice': True,
322
+ 'takeProfitPrice': True,
323
+ 'attachedStopLossTakeProfit': {
324
+ 'triggerPriceType': None,
325
+ 'limit': True,
326
+ },
327
+ 'hedged': True,
328
+ },
329
+ },
330
+ 'swap': {
331
+ 'linear': {
332
+ 'extends': 'forDerivatives',
333
+ },
334
+ 'inverse': None,
335
+ },
336
+ 'future': {
337
+ 'linear': None,
338
+ 'inverse': None,
339
+ },
340
+ },
229
341
  'exceptions': {
230
342
  'exact': {
231
343
  '400': BadRequest, # Body can not be empty
@@ -284,12 +396,19 @@ class blofin(Exchange, ImplicitAPI):
284
396
  'brokerId': 'ec6dd3a7dd982d0b',
285
397
  'accountsByType': {
286
398
  'swap': 'futures',
399
+ 'funding': 'funding',
287
400
  'future': 'futures',
401
+ 'copy_trading': 'copy_trading',
402
+ 'earn': 'earn',
403
+ 'spot': 'spot',
288
404
  },
289
405
  'accountsById': {
406
+ 'funding': 'funding',
290
407
  'futures': 'swap',
408
+ 'copy_trading': 'copy_trading',
409
+ 'earn': 'earn',
410
+ 'spot': 'spot',
291
411
  },
292
- 'sandboxMode': False,
293
412
  'defaultNetwork': 'ERC20',
294
413
  'defaultNetworks': {
295
414
  'ETH': 'ERC20',
@@ -355,10 +474,12 @@ class blofin(Exchange, ImplicitAPI):
355
474
  },
356
475
  })
357
476
 
358
- async def fetch_markets(self, params={}):
477
+ async def fetch_markets(self, params={}) -> List[Market]:
359
478
  """
360
479
  retrieves data on all markets for blofin
361
- :see: https://blofin.com/docs#get-instruments
480
+
481
+ https://blofin.com/docs#get-instruments
482
+
362
483
  :param dict [params]: extra parameters specific to the exchange API endpoint
363
484
  :returns dict[]: an array of objects representing market data
364
485
  """
@@ -366,7 +487,7 @@ class blofin(Exchange, ImplicitAPI):
366
487
  data = self.safe_list(response, 'data', [])
367
488
  return self.parse_markets(data)
368
489
 
369
- def parse_market(self, market) -> Market:
490
+ def parse_market(self, market: dict) -> Market:
370
491
  id = self.safe_string(market, 'instId')
371
492
  type = self.safe_string_lower(market, 'instType')
372
493
  spot = (type == 'spot')
@@ -448,7 +569,9 @@ class blofin(Exchange, ImplicitAPI):
448
569
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
449
570
  """
450
571
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
451
- :see: https://blofin.com/docs#get-order-book
572
+
573
+ https://blofin.com/docs#get-order-book
574
+
452
575
  :param str symbol: unified symbol of the market to fetch the order book for
453
576
  :param int [limit]: the maximum amount of order book entries to return
454
577
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -456,7 +579,7 @@ class blofin(Exchange, ImplicitAPI):
456
579
  """
457
580
  await self.load_markets()
458
581
  market = self.market(symbol)
459
- request = {
582
+ request: dict = {
460
583
  'instId': market['id'],
461
584
  }
462
585
  limit = 50 if (limit is None) else limit
@@ -489,7 +612,26 @@ class blofin(Exchange, ImplicitAPI):
489
612
  timestamp = self.safe_integer(first, 'ts')
490
613
  return self.parse_order_book(first, symbol, timestamp)
491
614
 
492
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
615
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
616
+ #
617
+ # response similar for REST & WS
618
+ #
619
+ # {
620
+ # instId: "ADA-USDT",
621
+ # ts: "1707736811486",
622
+ # last: "0.5315",
623
+ # lastSize: "4",
624
+ # askPrice: "0.5318",
625
+ # askSize: "248",
626
+ # bidPrice: "0.5315",
627
+ # bidSize: "63",
628
+ # open24h: "0.5555",
629
+ # high24h: "0.5563",
630
+ # low24h: "0.5315",
631
+ # volCurrency24h: "198560100",
632
+ # vol24h: "1985601",
633
+ # }
634
+ #
493
635
  timestamp = self.safe_integer(ticker, 'ts')
494
636
  marketId = self.safe_string(ticker, 'instId')
495
637
  market = self.safe_market(marketId, market, '-')
@@ -521,20 +663,24 @@ class blofin(Exchange, ImplicitAPI):
521
663
  'average': None,
522
664
  'baseVolume': baseVolume,
523
665
  'quoteVolume': quoteVolume,
666
+ 'indexPrice': self.safe_string(ticker, 'indexPrice'),
667
+ 'markPrice': self.safe_string(ticker, 'markPrice'),
524
668
  'info': ticker,
525
669
  }, market)
526
670
 
527
671
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
528
672
  """
529
673
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
530
- :see: https://blofin.com/docs#get-tickers
674
+
675
+ https://blofin.com/docs#get-tickers
676
+
531
677
  :param str symbol: unified symbol of the market to fetch the ticker for
532
678
  :param dict [params]: extra parameters specific to the exchange API endpoint
533
679
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
534
680
  """
535
681
  await self.load_markets()
536
682
  market = self.market(symbol)
537
- request = {
683
+ request: dict = {
538
684
  'instId': market['id'],
539
685
  }
540
686
  response = await self.publicGetMarketTickers(self.extend(request, params))
@@ -542,10 +688,33 @@ class blofin(Exchange, ImplicitAPI):
542
688
  first = self.safe_dict(data, 0, {})
543
689
  return self.parse_ticker(first, market)
544
690
 
691
+ async def fetch_mark_price(self, symbol: str, params={}) -> Ticker:
692
+ """
693
+ fetches mark price for the market
694
+
695
+ https://docs.blofin.com/index.html#get-mark-price
696
+
697
+ :param str symbol: unified market symbol
698
+ :param dict [params]: extra parameters specific to the exchange API endpoint
699
+ :param str [params.subType]: "linear" or "inverse"
700
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
701
+ """
702
+ await self.load_markets()
703
+ market = self.market(symbol)
704
+ request = {
705
+ 'symbol': market['id'],
706
+ }
707
+ response = await self.publicGetMarketMarkPrice(self.extend(request, params))
708
+ data = self.safe_list(response, 'data', [])
709
+ first = self.safe_dict(data, 0, {})
710
+ return self.parse_ticker(first, market)
711
+
545
712
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
546
713
  """
547
714
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
548
- :see: https://blofin.com/docs#get-tickers
715
+
716
+ https://blofin.com/docs#get-tickers
717
+
549
718
  :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
550
719
  :param dict [params]: extra parameters specific to the exchange API endpoint
551
720
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -556,9 +725,10 @@ class blofin(Exchange, ImplicitAPI):
556
725
  tickers = self.safe_list(response, 'data', [])
557
726
  return self.parse_tickers(tickers, symbols)
558
727
 
559
- def parse_trade(self, trade, market: Market = None) -> Trade:
728
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
729
+ #
730
+ # fetch trades(response similar for REST & WS)
560
731
  #
561
- # fetch trades
562
732
  # {
563
733
  # "tradeId": "3263934920",
564
734
  # "instId": "LTC-USDT",
@@ -567,6 +737,7 @@ class blofin(Exchange, ImplicitAPI):
567
737
  # "side": "buy",
568
738
  # "ts": "1707232020854"
569
739
  # }
740
+ #
570
741
  # my trades
571
742
  # {
572
743
  # "instId": "LTC-USDT",
@@ -617,7 +788,9 @@ class blofin(Exchange, ImplicitAPI):
617
788
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
618
789
  """
619
790
  get the list of most recent trades for a particular symbol
620
- :see: https://blofin.com/docs#get-trades
791
+
792
+ https://blofin.com/docs#get-trades
793
+
621
794
  :param str symbol: unified symbol of the market to fetch trades for
622
795
  :param int [since]: timestamp in ms of the earliest trade to fetch
623
796
  :param int [limit]: the maximum amount of trades to fetch
@@ -631,7 +804,7 @@ class blofin(Exchange, ImplicitAPI):
631
804
  if paginate:
632
805
  return await self.fetch_paginated_call_cursor('fetchTrades', symbol, since, limit, params, 'tradeId', 'after', None, 100)
633
806
  market = self.market(symbol)
634
- request = {
807
+ request: dict = {
635
808
  'instId': market['id'],
636
809
  }
637
810
  response = None
@@ -670,7 +843,9 @@ class blofin(Exchange, ImplicitAPI):
670
843
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
671
844
  """
672
845
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
673
- :see: https://blofin.com/docs#get-candlesticks
846
+
847
+ https://blofin.com/docs#get-candlesticks
848
+
674
849
  :param str symbol: unified symbol of the market to fetch OHLCV data for
675
850
  :param str timeframe: the length of time each candle represents
676
851
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -688,7 +863,7 @@ class blofin(Exchange, ImplicitAPI):
688
863
  return await self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 100)
689
864
  if limit is None:
690
865
  limit = 100 # default 100, max 100
691
- request = {
866
+ request: dict = {
692
867
  'instId': market['id'],
693
868
  'bar': self.safe_string(self.timeframes, timeframe, timeframe),
694
869
  'limit': limit,
@@ -705,7 +880,9 @@ class blofin(Exchange, ImplicitAPI):
705
880
  async def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
706
881
  """
707
882
  fetches historical funding rate prices
708
- :see: https://blofin.com/docs#get-funding-rate-history
883
+
884
+ https://blofin.com/docs#get-funding-rate-history
885
+
709
886
  :param str symbol: unified symbol of the market to fetch the funding rate history for
710
887
  :param int [since]: timestamp in ms of the earliest funding rate to fetch
711
888
  :param int [limit]: the maximum amount of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-history-structure>` to fetch
@@ -721,7 +898,7 @@ class blofin(Exchange, ImplicitAPI):
721
898
  if paginate:
722
899
  return await self.fetch_paginated_call_deterministic('fetchFundingRateHistory', symbol, since, limit, '8h', params)
723
900
  market = self.market(symbol)
724
- request = {
901
+ request: dict = {
725
902
  'instId': market['id'],
726
903
  }
727
904
  if since is not None:
@@ -744,23 +921,16 @@ class blofin(Exchange, ImplicitAPI):
744
921
  sorted = self.sort_by(rates, 'timestamp')
745
922
  return self.filter_by_symbol_since_limit(sorted, market['symbol'], since, limit)
746
923
 
747
- def parse_funding_rate(self, contract, market: Market = None):
924
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
748
925
  #
749
926
  # {
750
927
  # "fundingRate": "0.00027815",
751
928
  # "fundingTime": "1634256000000",
752
929
  # "instId": "BTC-USD-SWAP",
753
- # "instType": "SWAP",
754
- # "nextFundingRate": "0.00017",
755
- # "nextFundingTime": "1634284800000"
756
930
  # }
757
931
  #
758
- # in the response above nextFundingRate is actually two funding rates from now
759
- #
760
- nextFundingRateTimestamp = self.safe_integer(contract, 'nextFundingTime')
761
932
  marketId = self.safe_string(contract, 'instId')
762
933
  symbol = self.safe_symbol(marketId, market)
763
- nextFundingRate = self.safe_number(contract, 'nextFundingRate')
764
934
  fundingTime = self.safe_integer(contract, 'fundingTime')
765
935
  # > The current interest is 0.
766
936
  return {
@@ -775,18 +945,21 @@ class blofin(Exchange, ImplicitAPI):
775
945
  'fundingRate': self.safe_number(contract, 'fundingRate'),
776
946
  'fundingTimestamp': fundingTime,
777
947
  'fundingDatetime': self.iso8601(fundingTime),
778
- 'nextFundingRate': nextFundingRate,
779
- 'nextFundingTimestamp': nextFundingRateTimestamp,
780
- 'nextFundingDatetime': self.iso8601(nextFundingRateTimestamp),
948
+ 'nextFundingRate': None,
949
+ 'nextFundingTimestamp': None,
950
+ 'nextFundingDatetime': None,
781
951
  'previousFundingRate': None,
782
952
  'previousFundingTimestamp': None,
783
953
  'previousFundingDatetime': None,
954
+ 'interval': None,
784
955
  }
785
956
 
786
- async def fetch_funding_rate(self, symbol: str, params={}):
957
+ async def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
787
958
  """
788
959
  fetch the current funding rate
789
- :see: https://blofin.com/docs#get-funding-rate
960
+
961
+ https://blofin.com/docs#get-funding-rate
962
+
790
963
  :param str symbol: unified market symbol
791
964
  :param dict [params]: extra parameters specific to the exchange API endpoint
792
965
  :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
@@ -795,7 +968,7 @@ class blofin(Exchange, ImplicitAPI):
795
968
  market = self.market(symbol)
796
969
  if not market['swap']:
797
970
  raise ExchangeError(self.id + ' fetchFundingRate() is only valid for swap markets')
798
- request = {
971
+ request: dict = {
799
972
  'instId': market['id'],
800
973
  }
801
974
  response = await self.publicGetMarketFundingRate(self.extend(request, params))
@@ -807,9 +980,6 @@ class blofin(Exchange, ImplicitAPI):
807
980
  # "fundingRate": "0.00027815",
808
981
  # "fundingTime": "1634256000000",
809
982
  # "instId": "BTC-USD-SWAP",
810
- # "instType": "SWAP",
811
- # "nextFundingRate": "0.00017",
812
- # "nextFundingTime": "1634284800000"
813
983
  # }
814
984
  # ],
815
985
  # "msg": ""
@@ -819,13 +989,16 @@ class blofin(Exchange, ImplicitAPI):
819
989
  entry = self.safe_dict(data, 0, {})
820
990
  return self.parse_funding_rate(entry, market)
821
991
 
822
- def parse_balance_by_type(self, type, response):
823
- if type:
992
+ def parse_balance_by_type(self, response):
993
+ data = self.safe_list(response, 'data')
994
+ if (data is not None) and isinstance(data, list):
824
995
  return self.parse_funding_balance(response)
825
996
  else:
826
- return self.parse_trading_balance(response)
997
+ return self.parse_balance(response)
827
998
 
828
- def parse_trading_balance(self, response):
999
+ def parse_balance(self, response):
1000
+ #
1001
+ # "data" similar for REST & WS
829
1002
  #
830
1003
  # {
831
1004
  # "code": "0",
@@ -847,13 +1020,14 @@ class blofin(Exchange, ImplicitAPI):
847
1020
  # "orderFrozen": "14920.994472632597427761",
848
1021
  # "equityUsd": "10011254.077985990315787910",
849
1022
  # "isolatedUnrealizedPnl": "-22.151999999999999999952",
850
- # "bonus": "0"
1023
+ # "bonus": "0" # present only in REST
1024
+ # "unrealizedPnl": "0" # present only in WS
851
1025
  # }
852
1026
  # ]
853
1027
  # }
854
1028
  # }
855
1029
  #
856
- result = {'info': response}
1030
+ result: dict = {'info': response}
857
1031
  data = self.safe_dict(response, 'data', {})
858
1032
  timestamp = self.safe_integer(data, 'ts')
859
1033
  details = self.safe_list(data, 'details', [])
@@ -892,7 +1066,7 @@ class blofin(Exchange, ImplicitAPI):
892
1066
  # ]
893
1067
  # }
894
1068
  #
895
- result = {'info': response}
1069
+ result: dict = {'info': response}
896
1070
  data = self.safe_list(response, 'data', [])
897
1071
  for i in range(0, len(data)):
898
1072
  balance = data[i]
@@ -906,42 +1080,46 @@ class blofin(Exchange, ImplicitAPI):
906
1080
  result[code] = account
907
1081
  return self.safe_balance(result)
908
1082
 
909
- def parse_trading_fee(self, fee, market: Market = None):
1083
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
910
1084
  return {
911
1085
  'info': fee,
912
1086
  'symbol': self.safe_symbol(None, market),
913
1087
  # blofin returns the fees values opposed to other exchanges, so the sign needs to be flipped
914
1088
  'maker': self.parse_number(Precise.string_neg(self.safe_string_2(fee, 'maker', 'makerU'))),
915
1089
  'taker': self.parse_number(Precise.string_neg(self.safe_string_2(fee, 'taker', 'takerU'))),
1090
+ 'percentage': None,
1091
+ 'tierBased': None,
916
1092
  }
917
1093
 
918
1094
  async def fetch_balance(self, params={}) -> Balances:
919
1095
  """
920
1096
  query for balance and get the amount of funds available for trading or funds locked in orders
921
- :see: https://blofin.com/docs#get-balance
922
- :see: https://blofin.com/docs#get-futures-account-balance
1097
+
1098
+ https://blofin.com/docs#get-balance
1099
+ https://blofin.com/docs#get-futures-account-balance
1100
+
923
1101
  :param dict [params]: extra parameters specific to the exchange API endpoint
924
1102
  :param str [params.accountType]: the type of account to fetch the balance for, either 'funding' or 'futures' or 'copy_trading' or 'earn'
925
1103
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
926
1104
  """
927
1105
  await self.load_markets()
928
- accountType = self.safe_string_2(params, 'accountType', 'type')
929
- params = self.omit(params, ['accountType', 'type'])
930
- request = {
1106
+ accountType = None
1107
+ accountType, params = self.handle_option_and_params_2(params, 'fetchBalance', 'accountType', 'type')
1108
+ request: dict = {
931
1109
  }
932
1110
  response = None
933
- if accountType is not None:
1111
+ if accountType is not None and accountType != 'swap':
934
1112
  options = self.safe_dict(self.options, 'accountsByType', {})
935
1113
  parsedAccountType = self.safe_string(options, accountType, accountType)
936
1114
  request['accountType'] = parsedAccountType
937
1115
  response = await self.privateGetAssetBalances(self.extend(request, params))
938
1116
  else:
939
1117
  response = await self.privateGetAccountBalance(self.extend(request, params))
940
- return self.parse_balance_by_type(accountType, response)
1118
+ return self.parse_balance_by_type(response)
941
1119
 
942
1120
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
943
1121
  market = self.market(symbol)
944
- request = {
1122
+ request: dict = {
945
1123
  'instId': market['id'],
946
1124
  'side': side,
947
1125
  'orderType': type,
@@ -982,8 +1160,8 @@ class blofin(Exchange, ImplicitAPI):
982
1160
  request['tpOrderPrice'] = self.price_to_precision(symbol, tpPrice)
983
1161
  return self.extend(request, params)
984
1162
 
985
- def parse_order_status(self, status):
986
- statuses = {
1163
+ def parse_order_status(self, status: Str):
1164
+ statuses: dict = {
987
1165
  'canceled': 'canceled',
988
1166
  'order_failed': 'canceled',
989
1167
  'live': 'open',
@@ -993,7 +1171,9 @@ class blofin(Exchange, ImplicitAPI):
993
1171
  }
994
1172
  return self.safe_string(statuses, status, status)
995
1173
 
996
- def parse_order(self, order, market: Market = None) -> Order:
1174
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1175
+ #
1176
+ # response similar for REST & WS
997
1177
  #
998
1178
  # {
999
1179
  # "orderId": "2075628533",
@@ -1022,6 +1202,9 @@ class blofin(Exchange, ImplicitAPI):
1022
1202
  # "cancelSource": "not_canceled",
1023
1203
  # "cancelSourceReason": null,
1024
1204
  # "brokerId": "ec6dd3a7dd982d0b"
1205
+ # "filled_amount": "1.000000000000000000", # filledAmount in "ws" watchOrders
1206
+ # "cancelSource": "", # only in WS
1207
+ # "instType": "SWAP", # only in WS
1025
1208
  # }
1026
1209
  #
1027
1210
  id = self.safe_string_2(order, 'tpslId', 'orderId')
@@ -1108,20 +1291,22 @@ class blofin(Exchange, ImplicitAPI):
1108
1291
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}) -> Order:
1109
1292
  """
1110
1293
  create a trade order
1111
- :see: https://blofin.com/docs#place-order
1112
- :see: https://blofin.com/docs#place-tpsl-order
1294
+
1295
+ https://blofin.com/docs#place-order
1296
+ https://blofin.com/docs#place-tpsl-order
1297
+
1113
1298
  :param str symbol: unified symbol of the market to create an order in
1114
1299
  :param str type: 'market' or 'limit' or 'post_only' or 'ioc' or 'fok'
1115
1300
  :param str side: 'buy' or 'sell'
1116
1301
  :param float amount: how much of currency you want to trade in units of base currency
1117
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1302
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1118
1303
  :param dict [params]: extra parameters specific to the exchange API endpoint
1119
1304
  :param bool [params.reduceOnly]: a mark to reduce the position size for margin, swap and future orders
1120
1305
  :param bool [params.postOnly]: True to place a post only order
1121
1306
  :param str [params.marginMode]: 'cross' or 'isolated', default is 'cross'
1122
1307
  :param float [params.stopLossPrice]: stop loss trigger price(will use privatePostTradeOrderTpsl)
1123
1308
  :param float [params.takeProfitPrice]: take profit trigger price(will use privatePostTradeOrderTpsl)
1124
- :param str [param.positionSide]: *stopLossPrice/takeProfitPrice orders only* 'long' or 'short' or 'net' default is 'net'
1309
+ :param str [params.positionSide]: *stopLossPrice/takeProfitPrice orders only* 'long' or 'short' or 'net' default is 'net'
1125
1310
  :param str [params.clientOrderId]: a unique id for the order
1126
1311
  :param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered
1127
1312
  :param float [params.takeProfit.triggerPrice]: take profit trigger price
@@ -1157,7 +1342,7 @@ class blofin(Exchange, ImplicitAPI):
1157
1342
  def create_tpsl_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
1158
1343
  market = self.market(symbol)
1159
1344
  positionSide = self.safe_string(params, 'positionSide', 'net')
1160
- request = {
1345
+ request: dict = {
1161
1346
  'instId': market['id'],
1162
1347
  'side': side,
1163
1348
  'positionSide': positionSide,
@@ -1189,26 +1374,37 @@ class blofin(Exchange, ImplicitAPI):
1189
1374
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1190
1375
  """
1191
1376
  cancels an open order
1192
- :see: https://blofin.com/docs#cancel-order
1193
- :see: https://blofin.com/docs#cancel-tpsl-order
1377
+
1378
+ https://blofin.com/docs#cancel-order
1379
+ https://blofin.com/docs#cancel-tpsl-order
1380
+
1194
1381
  :param str id: order id
1195
1382
  :param str symbol: unified symbol of the market the order was made in
1196
1383
  :param dict [params]: extra parameters specific to the exchange API endpoint
1384
+ :param boolean [params.trigger]: True if cancelling a trigger/conditional order/tp sl orders
1197
1385
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1198
1386
  """
1199
1387
  if symbol is None:
1200
1388
  raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
1201
1389
  await self.load_markets()
1202
1390
  market = self.market(symbol)
1203
- request = {
1391
+ request: dict = {
1204
1392
  'instId': market['id'],
1205
1393
  }
1394
+ isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'], False)
1206
1395
  clientOrderId = self.safe_string(params, 'clientOrderId')
1207
1396
  if clientOrderId is not None:
1208
1397
  request['clientOrderId'] = clientOrderId
1209
1398
  else:
1210
- request['orderId'] = id
1211
- query = self.omit(params, ['orderId', 'clientOrderId'])
1399
+ if not isTrigger:
1400
+ request['orderId'] = str(id)
1401
+ else:
1402
+ request['tpslId'] = str(id)
1403
+ query = self.omit(params, ['orderId', 'clientOrderId', 'stop', 'trigger', 'tpsl'])
1404
+ if isTrigger:
1405
+ tpslResponse = await self.cancel_orders([id], symbol, params)
1406
+ first = self.safe_dict(tpslResponse, 0)
1407
+ return first
1212
1408
  response = await self.privatePostTradeCancelOrder(self.extend(request, query))
1213
1409
  data = self.safe_list(response, 'data', [])
1214
1410
  order = self.safe_dict(data, 0)
@@ -1217,8 +1413,11 @@ class blofin(Exchange, ImplicitAPI):
1217
1413
  async def create_orders(self, orders: List[OrderRequest], params={}) -> List[Order]:
1218
1414
  """
1219
1415
  create a list of trade orders
1220
- :see: https://blofin.com/docs#place-multiple-orders
1416
+
1417
+ https://blofin.com/docs#place-multiple-orders
1418
+
1221
1419
  :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
1420
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1222
1421
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1223
1422
  """
1224
1423
  await self.load_markets()
@@ -1241,13 +1440,15 @@ class blofin(Exchange, ImplicitAPI):
1241
1440
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1242
1441
  """
1243
1442
  Fetch orders that are still open
1244
- :see: https://blofin.com/docs#get-active-orders
1245
- :see: https://blofin.com/docs#get-active-tpsl-orders
1443
+
1444
+ https://blofin.com/docs#get-active-orders
1445
+ https://blofin.com/docs#get-active-tpsl-orders
1446
+
1246
1447
  :param str symbol: unified market symbol
1247
1448
  :param int [since]: the earliest time in ms to fetch open orders for
1248
1449
  :param int [limit]: the maximum number of open orders structures to retrieve
1249
1450
  :param dict [params]: extra parameters specific to the exchange API endpoint
1250
- :param bool [params.stop]: True if fetching trigger or conditional orders
1451
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1251
1452
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1252
1453
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1253
1454
  """
@@ -1256,7 +1457,7 @@ class blofin(Exchange, ImplicitAPI):
1256
1457
  paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
1257
1458
  if paginate:
1258
1459
  return await self.fetch_paginated_call_dynamic('fetchOpenOrders', symbol, since, limit, params)
1259
- request = {
1460
+ request: dict = {
1260
1461
  }
1261
1462
  market = None
1262
1463
  if symbol is not None:
@@ -1264,12 +1465,12 @@ class blofin(Exchange, ImplicitAPI):
1264
1465
  request['instId'] = market['id']
1265
1466
  if limit is not None:
1266
1467
  request['limit'] = limit # default 100, max 100
1267
- isStop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1468
+ isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1268
1469
  method: Str = None
1269
1470
  method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersPending')
1270
1471
  query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
1271
1472
  response = None
1272
- if isStop or (method == 'privateGetTradeOrdersTpslPending'):
1473
+ if isTrigger or (method == 'privateGetTradeOrdersTpslPending'):
1273
1474
  response = await self.privateGetTradeOrdersTpslPending(self.extend(request, query))
1274
1475
  else:
1275
1476
  response = await self.privateGetTradeOrdersPending(self.extend(request, query))
@@ -1279,7 +1480,9 @@ class blofin(Exchange, ImplicitAPI):
1279
1480
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1280
1481
  """
1281
1482
  fetch all trades made by the user
1282
- :see: https://blofin.com/docs#get-trade-history
1483
+
1484
+ https://blofin.com/docs#get-trade-history
1485
+
1283
1486
  :param str symbol: unified market symbol
1284
1487
  :param int [since]: the earliest time in ms to fetch trades for
1285
1488
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1293,7 +1496,7 @@ class blofin(Exchange, ImplicitAPI):
1293
1496
  paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
1294
1497
  if paginate:
1295
1498
  return await self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
1296
- request = {
1499
+ request: dict = {
1297
1500
  }
1298
1501
  market = None
1299
1502
  if symbol is not None:
@@ -1309,7 +1512,9 @@ class blofin(Exchange, ImplicitAPI):
1309
1512
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1310
1513
  """
1311
1514
  fetch all deposits made to an account
1312
- :see: https://blofin.com/docs#get-deposite-history
1515
+
1516
+ https://blofin.com/docs#get-deposite-history
1517
+
1313
1518
  :param str code: unified currency code
1314
1519
  :param int [since]: the earliest time in ms to fetch deposits for
1315
1520
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -1323,7 +1528,7 @@ class blofin(Exchange, ImplicitAPI):
1323
1528
  paginate, params = self.handle_option_and_params(params, 'fetchDeposits', 'paginate')
1324
1529
  if paginate:
1325
1530
  return await self.fetch_paginated_call_dynamic('fetchDeposits', code, since, limit, params)
1326
- request = {
1531
+ request: dict = {
1327
1532
  }
1328
1533
  currency = None
1329
1534
  if code is not None:
@@ -1341,7 +1546,9 @@ class blofin(Exchange, ImplicitAPI):
1341
1546
  async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1342
1547
  """
1343
1548
  fetch all withdrawals made from an account
1344
- :see: https://blofin.com/docs#get-withdraw-history
1549
+
1550
+ https://blofin.com/docs#get-withdraw-history
1551
+
1345
1552
  :param str code: unified currency code
1346
1553
  :param int [since]: the earliest time in ms to fetch withdrawals for
1347
1554
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -1355,7 +1562,7 @@ class blofin(Exchange, ImplicitAPI):
1355
1562
  paginate, params = self.handle_option_and_params(params, 'fetchWithdrawals', 'paginate')
1356
1563
  if paginate:
1357
1564
  return await self.fetch_paginated_call_dynamic('fetchWithdrawals', code, since, limit, params)
1358
- request = {
1565
+ request: dict = {
1359
1566
  }
1360
1567
  currency = None
1361
1568
  if code is not None:
@@ -1370,25 +1577,27 @@ class blofin(Exchange, ImplicitAPI):
1370
1577
  data = self.safe_list(response, 'data', [])
1371
1578
  return self.parse_transactions(data, currency, since, limit, params)
1372
1579
 
1373
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1580
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
1374
1581
  """
1375
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1376
- :see: https://blofin.com/docs#get-funds-transfer-history
1377
- :param str code: unified currency code, default is None
1582
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1583
+
1584
+ https://blofin.com/docs#get-funds-transfer-history
1585
+
1586
+ :param str [code]: unified currency code, default is None
1378
1587
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1379
- :param int [limit]: max number of ledger entrys to return, default is None
1588
+ :param int [limit]: max number of ledger entries to return, default is None
1380
1589
  :param dict [params]: extra parameters specific to the exchange API endpoint
1381
1590
  :param str [params.marginMode]: 'cross' or 'isolated'
1382
1591
  :param int [params.until]: the latest time in ms to fetch entries for
1383
- :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1384
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
1592
+ :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1593
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
1385
1594
  """
1386
1595
  await self.load_markets()
1387
1596
  paginate = False
1388
1597
  paginate, params = self.handle_option_and_params(params, 'fetchLedger', 'paginate')
1389
1598
  if paginate:
1390
1599
  return await self.fetch_paginated_call_dynamic('fetchLedger', code, since, limit, params)
1391
- request = {
1600
+ request: dict = {
1392
1601
  }
1393
1602
  if limit is not None:
1394
1603
  request['limit'] = limit
@@ -1402,7 +1611,7 @@ class blofin(Exchange, ImplicitAPI):
1402
1611
  data = self.safe_list(response, 'data', [])
1403
1612
  return self.parse_ledger(data, currency, since, limit)
1404
1613
 
1405
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1614
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1406
1615
  #
1407
1616
  #
1408
1617
  # fetchDeposits
@@ -1486,8 +1695,8 @@ class blofin(Exchange, ImplicitAPI):
1486
1695
  },
1487
1696
  }
1488
1697
 
1489
- def parse_transaction_status(self, status):
1490
- statuses = {
1698
+ def parse_transaction_status(self, status: Str):
1699
+ statuses: dict = {
1491
1700
  '0': 'pending',
1492
1701
  '1': 'ok',
1493
1702
  '2': 'failed',
@@ -1496,7 +1705,7 @@ class blofin(Exchange, ImplicitAPI):
1496
1705
  return self.safe_string(statuses, status, status)
1497
1706
 
1498
1707
  def parse_ledger_entry_type(self, type):
1499
- types = {
1708
+ types: dict = {
1500
1709
  '1': 'transfer', # transfer
1501
1710
  '2': 'trade', # trade
1502
1711
  '3': 'trade', # delivery
@@ -1511,34 +1720,32 @@ class blofin(Exchange, ImplicitAPI):
1511
1720
  }
1512
1721
  return self.safe_string(types, type, type)
1513
1722
 
1514
- def parse_ledger_entry(self, item, currency: Currency = None):
1515
- id = self.safe_string(item, 'transferId')
1516
- referenceId = self.safe_string(item, 'clientId')
1517
- fromAccount = self.safe_string(item, 'fromAccount')
1518
- toAccount = self.safe_string(item, 'toAccount')
1519
- type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
1520
- code = self.safe_currency_code(self.safe_string(item, 'currency'), currency)
1521
- amountString = self.safe_string(item, 'amount')
1522
- amount = self.parse_number(amountString)
1723
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1724
+ currencyId = self.safe_string(item, 'currency')
1725
+ code = self.safe_currency_code(currencyId, currency)
1726
+ currency = self.safe_currency(currencyId, currency)
1523
1727
  timestamp = self.safe_integer(item, 'ts')
1524
- status = 'ok'
1525
- return {
1526
- 'id': id,
1728
+ return self.safe_ledger_entry({
1527
1729
  'info': item,
1730
+ 'id': self.safe_string(item, 'transferId'),
1731
+ 'direction': None,
1732
+ 'account': None,
1733
+ 'referenceId': self.safe_string(item, 'clientId'),
1734
+ 'referenceAccount': None,
1735
+ 'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
1736
+ 'currency': code,
1737
+ 'amount': self.safe_number(item, 'amount'),
1528
1738
  'timestamp': timestamp,
1529
1739
  'datetime': self.iso8601(timestamp),
1530
- 'fromAccount': fromAccount,
1531
- 'toAccount': toAccount,
1532
- 'type': type,
1533
- 'currency': code,
1534
- 'amount': amount,
1535
- 'clientId': referenceId, # balance before
1536
- 'status': status,
1537
- }
1740
+ 'before': None,
1741
+ 'after': None,
1742
+ 'status': 'ok',
1743
+ 'fee': None,
1744
+ }, currency)
1538
1745
 
1539
1746
  def parse_ids(self, ids):
1540
1747
  """
1541
- * @ignore
1748
+ @ignore
1542
1749
  :param string[]|str ids: order ids
1543
1750
  :returns str[]: list of order ids
1544
1751
  """
@@ -1550,7 +1757,9 @@ class blofin(Exchange, ImplicitAPI):
1550
1757
  async def cancel_orders(self, ids, symbol: Str = None, params={}):
1551
1758
  """
1552
1759
  cancel multiple orders
1553
- :see: https://blofin.com/docs#cancel-multiple-orders
1760
+
1761
+ https://blofin.com/docs#cancel-multiple-orders
1762
+
1554
1763
  :param str[] ids: order ids
1555
1764
  :param str symbol: unified market symbol
1556
1765
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1568,8 +1777,8 @@ class blofin(Exchange, ImplicitAPI):
1568
1777
  method = self.safe_string(params, 'method', defaultMethod)
1569
1778
  clientOrderIds = self.parse_ids(self.safe_value(params, 'clientOrderId'))
1570
1779
  tpslIds = self.parse_ids(self.safe_value(params, 'tpslId'))
1571
- stop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
1572
- if stop:
1780
+ trigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
1781
+ if trigger:
1573
1782
  method = 'privatePostTradeCancelTpsl'
1574
1783
  if clientOrderIds is None:
1575
1784
  ids = self.parse_ids(ids)
@@ -1580,7 +1789,7 @@ class blofin(Exchange, ImplicitAPI):
1580
1789
  'instId': market['id'],
1581
1790
  })
1582
1791
  for i in range(0, len(ids)):
1583
- if stop:
1792
+ if trigger:
1584
1793
  request.append({
1585
1794
  'tpslId': ids[i],
1586
1795
  'instId': market['id'],
@@ -1607,7 +1816,9 @@ class blofin(Exchange, ImplicitAPI):
1607
1816
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
1608
1817
  """
1609
1818
  transfer currency internally between wallets on the same account
1610
- :see: https://blofin.com/docs#funds-transfer
1819
+
1820
+ https://blofin.com/docs#funds-transfer
1821
+
1611
1822
  :param str code: unified currency code
1612
1823
  :param float amount: amount to transfer
1613
1824
  :param str fromAccount: account to transfer from(funding, swap, copy_trading, earn)
@@ -1620,7 +1831,7 @@ class blofin(Exchange, ImplicitAPI):
1620
1831
  accountsByType = self.safe_dict(self.options, 'accountsByType', {})
1621
1832
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
1622
1833
  toId = self.safe_string(accountsByType, toAccount, toAccount)
1623
- request = {
1834
+ request: dict = {
1624
1835
  'currency': currency['id'],
1625
1836
  'amount': self.currency_to_precision(code, amount),
1626
1837
  'fromAccount': fromId,
@@ -1630,7 +1841,7 @@ class blofin(Exchange, ImplicitAPI):
1630
1841
  data = self.safe_dict(response, 'data', {})
1631
1842
  return self.parse_transfer(data, currency)
1632
1843
 
1633
- def parse_transfer(self, transfer, currency: Currency = None):
1844
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
1634
1845
  id = self.safe_string(transfer, 'transferId')
1635
1846
  return {
1636
1847
  'info': transfer,
@@ -1647,7 +1858,9 @@ class blofin(Exchange, ImplicitAPI):
1647
1858
  async def fetch_position(self, symbol: str, params={}) -> Position:
1648
1859
  """
1649
1860
  fetch data on a single open contract trade position
1650
- :see: https://blofin.com/docs#get-positions
1861
+
1862
+ https://blofin.com/docs#get-positions
1863
+
1651
1864
  :param str symbol: unified market symbol of the market the position is held in, default is None
1652
1865
  :param dict [params]: extra parameters specific to the exchange API endpoint
1653
1866
  :param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
@@ -1655,7 +1868,7 @@ class blofin(Exchange, ImplicitAPI):
1655
1868
  """
1656
1869
  await self.load_markets()
1657
1870
  market = self.market(symbol)
1658
- request = {
1871
+ request: dict = {
1659
1872
  'instId': market['id'],
1660
1873
  }
1661
1874
  response = await self.privateGetAccountPositions(self.extend(request, params))
@@ -1665,10 +1878,12 @@ class blofin(Exchange, ImplicitAPI):
1665
1878
  return None
1666
1879
  return self.parse_position(position, market)
1667
1880
 
1668
- async def fetch_positions(self, symbols: List[str] = None, params={}) -> List[Position]:
1881
+ async def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
1669
1882
  """
1670
1883
  fetch data on a single open contract trade position
1671
- :see: https://blofin.com/docs#get-positions
1884
+
1885
+ https://blofin.com/docs#get-positions
1886
+
1672
1887
  :param str[] [symbols]: list of unified market symbols
1673
1888
  :param dict [params]: extra parameters specific to the exchange API endpoint
1674
1889
  :param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
@@ -1681,7 +1896,33 @@ class blofin(Exchange, ImplicitAPI):
1681
1896
  result = self.parse_positions(data)
1682
1897
  return self.filter_by_array_positions(result, 'symbol', symbols, False)
1683
1898
 
1684
- def parse_position(self, position, market: Market = None):
1899
+ def parse_position(self, position: dict, market: Market = None):
1900
+ #
1901
+ # response similar for REST & WS
1902
+ #
1903
+ # {
1904
+ # instType: 'SWAP',
1905
+ # instId: 'LTC-USDT',
1906
+ # marginMode: 'cross',
1907
+ # positionId: '644159',
1908
+ # positionSide: 'net',
1909
+ # positions: '1',
1910
+ # availablePositions: '1',
1911
+ # averagePrice: '68.16',
1912
+ # unrealizedPnl: '0.80631223',
1913
+ # unrealizedPnlRatio: '0.03548909463028169',
1914
+ # leverage: '3',
1915
+ # liquidationPrice: '10.116655172370356435',
1916
+ # markPrice: '68.96',
1917
+ # initialMargin: '22.988770743333333333',
1918
+ # margin: '', # self field might not exist in rest response
1919
+ # marginRatio: '152.523509620342499273',
1920
+ # maintenanceMargin: '0.34483156115',
1921
+ # adl: '4',
1922
+ # createTime: '1707235776528',
1923
+ # updateTime: '1707235776528'
1924
+ # }
1925
+ #
1685
1926
  marketId = self.safe_string(position, 'instId')
1686
1927
  market = self.safe_market(marketId, market)
1687
1928
  symbol = market['symbol']
@@ -1762,10 +2003,12 @@ class blofin(Exchange, ImplicitAPI):
1762
2003
  'takeProfitPrice': None,
1763
2004
  })
1764
2005
 
1765
- async def fetch_leverages(self, symbols: List[str] = None, params={}) -> Leverages:
2006
+ async def fetch_leverages(self, symbols: Strings = None, params={}) -> Leverages:
1766
2007
  """
1767
2008
  fetch the set leverage for all contract markets
1768
- :see: https://docs.blofin.com/index.html#get-multiple-leverage
2009
+
2010
+ https://docs.blofin.com/index.html#get-multiple-leverage
2011
+
1769
2012
  :param str[] symbols: a list of unified market symbols, required on blofin
1770
2013
  :param dict [params]: extra parameters specific to the exchange API endpoint
1771
2014
  :param str [params.marginMode]: 'cross' or 'isolated'
@@ -1789,7 +2032,7 @@ class blofin(Exchange, ImplicitAPI):
1789
2032
  instIds = instIds + ',' + entryMarket['id']
1790
2033
  else:
1791
2034
  instIds = instIds + entryMarket['id']
1792
- request = {
2035
+ request: dict = {
1793
2036
  'instId': instIds,
1794
2037
  'marginMode': marginMode,
1795
2038
  }
@@ -1813,7 +2056,9 @@ class blofin(Exchange, ImplicitAPI):
1813
2056
  async def fetch_leverage(self, symbol: str, params={}) -> Leverage:
1814
2057
  """
1815
2058
  fetch the set leverage for a market
1816
- :see: https://docs.blofin.com/index.html#get-leverage
2059
+
2060
+ https://docs.blofin.com/index.html#get-leverage
2061
+
1817
2062
  :param str symbol: unified market symbol
1818
2063
  :param dict [params]: extra parameters specific to the exchange API endpoint
1819
2064
  :param str [params.marginMode]: 'cross' or 'isolated'
@@ -1827,7 +2072,7 @@ class blofin(Exchange, ImplicitAPI):
1827
2072
  if (marginMode != 'cross') and (marginMode != 'isolated'):
1828
2073
  raise BadRequest(self.id + ' fetchLeverage() requires a marginMode parameter that must be either cross or isolated')
1829
2074
  market = self.market(symbol)
1830
- request = {
2075
+ request: dict = {
1831
2076
  'instId': market['id'],
1832
2077
  'marginMode': marginMode,
1833
2078
  }
@@ -1846,7 +2091,7 @@ class blofin(Exchange, ImplicitAPI):
1846
2091
  data = self.safe_dict(response, 'data', {})
1847
2092
  return self.parse_leverage(data, market)
1848
2093
 
1849
- def parse_leverage(self, leverage, market=None) -> Leverage:
2094
+ def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
1850
2095
  marketId = self.safe_string(leverage, 'instId')
1851
2096
  leverageValue = self.safe_integer(leverage, 'leverage')
1852
2097
  return {
@@ -1860,7 +2105,9 @@ class blofin(Exchange, ImplicitAPI):
1860
2105
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
1861
2106
  """
1862
2107
  set the level of leverage for a market
1863
- :see: https://blofin.com/docs#set-leverage
2108
+
2109
+ https://blofin.com/docs#set-leverage
2110
+
1864
2111
  :param int leverage: the rate of leverage
1865
2112
  :param str symbol: unified market symbol
1866
2113
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1879,7 +2126,7 @@ class blofin(Exchange, ImplicitAPI):
1879
2126
  marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
1880
2127
  if (marginMode != 'cross') and (marginMode != 'isolated'):
1881
2128
  raise BadRequest(self.id + ' setLeverage() requires a marginMode parameter that must be either cross or isolated')
1882
- request = {
2129
+ request: dict = {
1883
2130
  'leverage': leverage,
1884
2131
  'marginMode': marginMode,
1885
2132
  'instId': market['id'],
@@ -1890,15 +2137,17 @@ class blofin(Exchange, ImplicitAPI):
1890
2137
  async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
1891
2138
  """
1892
2139
  closes open positions for a market
1893
- :see: https://blofin.com/docs#close-positions
2140
+
2141
+ https://blofin.com/docs#close-positions
2142
+
1894
2143
  :param str symbol: Unified CCXT market symbol
1895
2144
  :param str [side]: 'buy' or 'sell', leave in net mode
1896
2145
  :param dict [params]: extra parameters specific to the blofin api endpoint
1897
2146
  :param str [params.clientOrderId]: a unique identifier for the order
1898
2147
  :param str [params.marginMode]: 'cross' or 'isolated', default is 'cross
1899
2148
  :param str [params.code]: *required in the case of closing cross MARGIN position for Single-currency margin* margin currency
1900
- *
1901
- * EXCHANGE SPECIFIC PARAMETERS
2149
+
2150
+ EXCHANGE SPECIFIC PARAMETERS
1902
2151
  :param boolean [params.autoCxl]: whether any pending orders for closing out needs to be automatically canceled when close position via a market order. False or True, the default is False
1903
2152
  :param str [params.tag]: order tag a combination of case-sensitive alphanumerics, all numbers, or all letters of up to 16 characters
1904
2153
  :returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
@@ -1908,7 +2157,7 @@ class blofin(Exchange, ImplicitAPI):
1908
2157
  clientOrderId = self.safe_string(params, 'clientOrderId')
1909
2158
  marginMode = None
1910
2159
  marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
1911
- request = {
2160
+ request: dict = {
1912
2161
  'instId': market['id'],
1913
2162
  'marginMode': marginMode,
1914
2163
  }
@@ -1920,13 +2169,15 @@ class blofin(Exchange, ImplicitAPI):
1920
2169
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1921
2170
  """
1922
2171
  fetches information on multiple closed orders made by the user
1923
- :see: https://blofin.com/docs#get-order-history
1924
- :see: https://blofin.com/docs#get-tpsl-order-history
2172
+
2173
+ https://blofin.com/docs#get-order-history
2174
+ https://blofin.com/docs#get-tpsl-order-history
2175
+
1925
2176
  :param str symbol: unified market symbol of the market orders were made in
1926
2177
  :param int [since]: the earliest time in ms to fetch orders for
1927
2178
  :param int [limit]: the maximum number of orde structures to retrieve
1928
2179
  :param dict [params]: extra parameters specific to the exchange API endpoint
1929
- :param bool [params.stop]: True if fetching trigger or conditional orders
2180
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1930
2181
  :param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
1931
2182
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1932
2183
  """
@@ -1935,7 +2186,7 @@ class blofin(Exchange, ImplicitAPI):
1935
2186
  paginate, params = self.handle_option_and_params(params, 'fetchClosedOrders', 'paginate')
1936
2187
  if paginate:
1937
2188
  return await self.fetch_paginated_call_dynamic('fetchClosedOrders', symbol, since, limit, params)
1938
- request = {
2189
+ request: dict = {
1939
2190
  }
1940
2191
  market = None
1941
2192
  if symbol is not None:
@@ -1945,12 +2196,12 @@ class blofin(Exchange, ImplicitAPI):
1945
2196
  request['limit'] = limit # default 100, max 100
1946
2197
  if since is not None:
1947
2198
  request['begin'] = since
1948
- isStop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
2199
+ isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1949
2200
  method: Str = None
1950
2201
  method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersHistory')
1951
2202
  query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
1952
2203
  response = None
1953
- if (isStop) or (method == 'privateGetTradeOrdersTpslHistory'):
2204
+ if (isTrigger) or (method == 'privateGetTradeOrdersTpslHistory'):
1954
2205
  response = await self.privateGetTradeOrdersTpslHistory(self.extend(request, query))
1955
2206
  else:
1956
2207
  response = await self.privateGetTradeOrdersHistory(self.extend(request, query))
@@ -1960,7 +2211,9 @@ class blofin(Exchange, ImplicitAPI):
1960
2211
  async def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
1961
2212
  """
1962
2213
  fetches the margin mode of a trading pair
1963
- :see: https://docs.blofin.com/index.html#get-margin-mode
2214
+
2215
+ https://docs.blofin.com/index.html#get-margin-mode
2216
+
1964
2217
  :param str symbol: unified symbol of the market to fetch the margin mode for
1965
2218
  :param dict [params]: extra parameters specific to the exchange API endpoint
1966
2219
  :returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
@@ -1980,14 +2233,14 @@ class blofin(Exchange, ImplicitAPI):
1980
2233
  data = self.safe_dict(response, 'data', {})
1981
2234
  return self.parse_margin_mode(data, market)
1982
2235
 
1983
- def parse_margin_mode(self, marginMode, market=None) -> MarginMode:
2236
+ def parse_margin_mode(self, marginMode: dict, market=None) -> MarginMode:
1984
2237
  return {
1985
2238
  'info': marginMode,
1986
2239
  'symbol': market['symbol'],
1987
2240
  'marginMode': self.safe_string(marginMode, 'marginMode'),
1988
2241
  }
1989
2242
 
1990
- def handle_errors(self, httpCode, reason, url, method, headers, body, response, requestHeaders, requestBody):
2243
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1991
2244
  if response is None:
1992
2245
  return None # fallback to default error handler
1993
2246
  #