ccxt 4.2.77__py2.py3-none-any.whl → 4.4.49__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3205 -937
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1525 -573
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +223 -97
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3205 -937
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1525 -573
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +223 -97
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +143 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/top_level.txt +0 -0
@@ -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,8 +1374,10 @@ 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
@@ -1201,7 +1388,7 @@ class blofin(Exchange, ImplicitAPI):
1201
1388
  raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
1202
1389
  await self.load_markets()
1203
1390
  market = self.market(symbol)
1204
- request = {
1391
+ request: dict = {
1205
1392
  'instId': market['id'],
1206
1393
  }
1207
1394
  isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'], False)
@@ -1226,8 +1413,11 @@ class blofin(Exchange, ImplicitAPI):
1226
1413
  async def create_orders(self, orders: List[OrderRequest], params={}) -> List[Order]:
1227
1414
  """
1228
1415
  create a list of trade orders
1229
- :see: https://blofin.com/docs#place-multiple-orders
1416
+
1417
+ https://blofin.com/docs#place-multiple-orders
1418
+
1230
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
1231
1421
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1232
1422
  """
1233
1423
  await self.load_markets()
@@ -1250,13 +1440,15 @@ class blofin(Exchange, ImplicitAPI):
1250
1440
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1251
1441
  """
1252
1442
  Fetch orders that are still open
1253
- :see: https://blofin.com/docs#get-active-orders
1254
- :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
+
1255
1447
  :param str symbol: unified market symbol
1256
1448
  :param int [since]: the earliest time in ms to fetch open orders for
1257
1449
  :param int [limit]: the maximum number of open orders structures to retrieve
1258
1450
  :param dict [params]: extra parameters specific to the exchange API endpoint
1259
- :param bool [params.stop]: True if fetching trigger or conditional orders
1451
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1260
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)
1261
1453
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1262
1454
  """
@@ -1265,7 +1457,7 @@ class blofin(Exchange, ImplicitAPI):
1265
1457
  paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
1266
1458
  if paginate:
1267
1459
  return await self.fetch_paginated_call_dynamic('fetchOpenOrders', symbol, since, limit, params)
1268
- request = {
1460
+ request: dict = {
1269
1461
  }
1270
1462
  market = None
1271
1463
  if symbol is not None:
@@ -1273,12 +1465,12 @@ class blofin(Exchange, ImplicitAPI):
1273
1465
  request['instId'] = market['id']
1274
1466
  if limit is not None:
1275
1467
  request['limit'] = limit # default 100, max 100
1276
- isStop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1468
+ isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1277
1469
  method: Str = None
1278
1470
  method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersPending')
1279
1471
  query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
1280
1472
  response = None
1281
- if isStop or (method == 'privateGetTradeOrdersTpslPending'):
1473
+ if isTrigger or (method == 'privateGetTradeOrdersTpslPending'):
1282
1474
  response = await self.privateGetTradeOrdersTpslPending(self.extend(request, query))
1283
1475
  else:
1284
1476
  response = await self.privateGetTradeOrdersPending(self.extend(request, query))
@@ -1288,7 +1480,9 @@ class blofin(Exchange, ImplicitAPI):
1288
1480
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1289
1481
  """
1290
1482
  fetch all trades made by the user
1291
- :see: https://blofin.com/docs#get-trade-history
1483
+
1484
+ https://blofin.com/docs#get-trade-history
1485
+
1292
1486
  :param str symbol: unified market symbol
1293
1487
  :param int [since]: the earliest time in ms to fetch trades for
1294
1488
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1302,7 +1496,7 @@ class blofin(Exchange, ImplicitAPI):
1302
1496
  paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
1303
1497
  if paginate:
1304
1498
  return await self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
1305
- request = {
1499
+ request: dict = {
1306
1500
  }
1307
1501
  market = None
1308
1502
  if symbol is not None:
@@ -1318,7 +1512,9 @@ class blofin(Exchange, ImplicitAPI):
1318
1512
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1319
1513
  """
1320
1514
  fetch all deposits made to an account
1321
- :see: https://blofin.com/docs#get-deposite-history
1515
+
1516
+ https://blofin.com/docs#get-deposite-history
1517
+
1322
1518
  :param str code: unified currency code
1323
1519
  :param int [since]: the earliest time in ms to fetch deposits for
1324
1520
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -1332,7 +1528,7 @@ class blofin(Exchange, ImplicitAPI):
1332
1528
  paginate, params = self.handle_option_and_params(params, 'fetchDeposits', 'paginate')
1333
1529
  if paginate:
1334
1530
  return await self.fetch_paginated_call_dynamic('fetchDeposits', code, since, limit, params)
1335
- request = {
1531
+ request: dict = {
1336
1532
  }
1337
1533
  currency = None
1338
1534
  if code is not None:
@@ -1350,7 +1546,9 @@ class blofin(Exchange, ImplicitAPI):
1350
1546
  async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1351
1547
  """
1352
1548
  fetch all withdrawals made from an account
1353
- :see: https://blofin.com/docs#get-withdraw-history
1549
+
1550
+ https://blofin.com/docs#get-withdraw-history
1551
+
1354
1552
  :param str code: unified currency code
1355
1553
  :param int [since]: the earliest time in ms to fetch withdrawals for
1356
1554
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -1364,7 +1562,7 @@ class blofin(Exchange, ImplicitAPI):
1364
1562
  paginate, params = self.handle_option_and_params(params, 'fetchWithdrawals', 'paginate')
1365
1563
  if paginate:
1366
1564
  return await self.fetch_paginated_call_dynamic('fetchWithdrawals', code, since, limit, params)
1367
- request = {
1565
+ request: dict = {
1368
1566
  }
1369
1567
  currency = None
1370
1568
  if code is not None:
@@ -1379,25 +1577,27 @@ class blofin(Exchange, ImplicitAPI):
1379
1577
  data = self.safe_list(response, 'data', [])
1380
1578
  return self.parse_transactions(data, currency, since, limit, params)
1381
1579
 
1382
- 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]:
1383
1581
  """
1384
- fetch the history of changes, actions done by the user or operations that altered balance of the user
1385
- :see: https://blofin.com/docs#get-funds-transfer-history
1386
- :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
1387
1587
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
1388
- :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
1389
1589
  :param dict [params]: extra parameters specific to the exchange API endpoint
1390
1590
  :param str [params.marginMode]: 'cross' or 'isolated'
1391
1591
  :param int [params.until]: the latest time in ms to fetch entries for
1392
- :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)
1393
- :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>`
1394
1594
  """
1395
1595
  await self.load_markets()
1396
1596
  paginate = False
1397
1597
  paginate, params = self.handle_option_and_params(params, 'fetchLedger', 'paginate')
1398
1598
  if paginate:
1399
1599
  return await self.fetch_paginated_call_dynamic('fetchLedger', code, since, limit, params)
1400
- request = {
1600
+ request: dict = {
1401
1601
  }
1402
1602
  if limit is not None:
1403
1603
  request['limit'] = limit
@@ -1411,7 +1611,7 @@ class blofin(Exchange, ImplicitAPI):
1411
1611
  data = self.safe_list(response, 'data', [])
1412
1612
  return self.parse_ledger(data, currency, since, limit)
1413
1613
 
1414
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1614
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1415
1615
  #
1416
1616
  #
1417
1617
  # fetchDeposits
@@ -1495,8 +1695,8 @@ class blofin(Exchange, ImplicitAPI):
1495
1695
  },
1496
1696
  }
1497
1697
 
1498
- def parse_transaction_status(self, status):
1499
- statuses = {
1698
+ def parse_transaction_status(self, status: Str):
1699
+ statuses: dict = {
1500
1700
  '0': 'pending',
1501
1701
  '1': 'ok',
1502
1702
  '2': 'failed',
@@ -1505,7 +1705,7 @@ class blofin(Exchange, ImplicitAPI):
1505
1705
  return self.safe_string(statuses, status, status)
1506
1706
 
1507
1707
  def parse_ledger_entry_type(self, type):
1508
- types = {
1708
+ types: dict = {
1509
1709
  '1': 'transfer', # transfer
1510
1710
  '2': 'trade', # trade
1511
1711
  '3': 'trade', # delivery
@@ -1520,34 +1720,32 @@ class blofin(Exchange, ImplicitAPI):
1520
1720
  }
1521
1721
  return self.safe_string(types, type, type)
1522
1722
 
1523
- def parse_ledger_entry(self, item, currency: Currency = None):
1524
- id = self.safe_string(item, 'transferId')
1525
- referenceId = self.safe_string(item, 'clientId')
1526
- fromAccount = self.safe_string(item, 'fromAccount')
1527
- toAccount = self.safe_string(item, 'toAccount')
1528
- type = self.parse_ledger_entry_type(self.safe_string(item, 'type'))
1529
- code = self.safe_currency_code(self.safe_string(item, 'currency'), currency)
1530
- amountString = self.safe_string(item, 'amount')
1531
- 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)
1532
1727
  timestamp = self.safe_integer(item, 'ts')
1533
- status = 'ok'
1534
- return {
1535
- 'id': id,
1728
+ return self.safe_ledger_entry({
1536
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'),
1537
1738
  'timestamp': timestamp,
1538
1739
  'datetime': self.iso8601(timestamp),
1539
- 'fromAccount': fromAccount,
1540
- 'toAccount': toAccount,
1541
- 'type': type,
1542
- 'currency': code,
1543
- 'amount': amount,
1544
- 'clientId': referenceId, # balance before
1545
- 'status': status,
1546
- }
1740
+ 'before': None,
1741
+ 'after': None,
1742
+ 'status': 'ok',
1743
+ 'fee': None,
1744
+ }, currency)
1547
1745
 
1548
1746
  def parse_ids(self, ids):
1549
1747
  """
1550
- * @ignore
1748
+ @ignore
1551
1749
  :param string[]|str ids: order ids
1552
1750
  :returns str[]: list of order ids
1553
1751
  """
@@ -1559,7 +1757,9 @@ class blofin(Exchange, ImplicitAPI):
1559
1757
  async def cancel_orders(self, ids, symbol: Str = None, params={}):
1560
1758
  """
1561
1759
  cancel multiple orders
1562
- :see: https://blofin.com/docs#cancel-multiple-orders
1760
+
1761
+ https://blofin.com/docs#cancel-multiple-orders
1762
+
1563
1763
  :param str[] ids: order ids
1564
1764
  :param str symbol: unified market symbol
1565
1765
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1577,8 +1777,8 @@ class blofin(Exchange, ImplicitAPI):
1577
1777
  method = self.safe_string(params, 'method', defaultMethod)
1578
1778
  clientOrderIds = self.parse_ids(self.safe_value(params, 'clientOrderId'))
1579
1779
  tpslIds = self.parse_ids(self.safe_value(params, 'tpslId'))
1580
- stop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
1581
- if stop:
1780
+ trigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl'])
1781
+ if trigger:
1582
1782
  method = 'privatePostTradeCancelTpsl'
1583
1783
  if clientOrderIds is None:
1584
1784
  ids = self.parse_ids(ids)
@@ -1589,7 +1789,7 @@ class blofin(Exchange, ImplicitAPI):
1589
1789
  'instId': market['id'],
1590
1790
  })
1591
1791
  for i in range(0, len(ids)):
1592
- if stop:
1792
+ if trigger:
1593
1793
  request.append({
1594
1794
  'tpslId': ids[i],
1595
1795
  'instId': market['id'],
@@ -1616,7 +1816,9 @@ class blofin(Exchange, ImplicitAPI):
1616
1816
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
1617
1817
  """
1618
1818
  transfer currency internally between wallets on the same account
1619
- :see: https://blofin.com/docs#funds-transfer
1819
+
1820
+ https://blofin.com/docs#funds-transfer
1821
+
1620
1822
  :param str code: unified currency code
1621
1823
  :param float amount: amount to transfer
1622
1824
  :param str fromAccount: account to transfer from(funding, swap, copy_trading, earn)
@@ -1629,7 +1831,7 @@ class blofin(Exchange, ImplicitAPI):
1629
1831
  accountsByType = self.safe_dict(self.options, 'accountsByType', {})
1630
1832
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
1631
1833
  toId = self.safe_string(accountsByType, toAccount, toAccount)
1632
- request = {
1834
+ request: dict = {
1633
1835
  'currency': currency['id'],
1634
1836
  'amount': self.currency_to_precision(code, amount),
1635
1837
  'fromAccount': fromId,
@@ -1639,7 +1841,7 @@ class blofin(Exchange, ImplicitAPI):
1639
1841
  data = self.safe_dict(response, 'data', {})
1640
1842
  return self.parse_transfer(data, currency)
1641
1843
 
1642
- def parse_transfer(self, transfer, currency: Currency = None):
1844
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
1643
1845
  id = self.safe_string(transfer, 'transferId')
1644
1846
  return {
1645
1847
  'info': transfer,
@@ -1656,7 +1858,9 @@ class blofin(Exchange, ImplicitAPI):
1656
1858
  async def fetch_position(self, symbol: str, params={}) -> Position:
1657
1859
  """
1658
1860
  fetch data on a single open contract trade position
1659
- :see: https://blofin.com/docs#get-positions
1861
+
1862
+ https://blofin.com/docs#get-positions
1863
+
1660
1864
  :param str symbol: unified market symbol of the market the position is held in, default is None
1661
1865
  :param dict [params]: extra parameters specific to the exchange API endpoint
1662
1866
  :param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
@@ -1664,7 +1868,7 @@ class blofin(Exchange, ImplicitAPI):
1664
1868
  """
1665
1869
  await self.load_markets()
1666
1870
  market = self.market(symbol)
1667
- request = {
1871
+ request: dict = {
1668
1872
  'instId': market['id'],
1669
1873
  }
1670
1874
  response = await self.privateGetAccountPositions(self.extend(request, params))
@@ -1674,10 +1878,12 @@ class blofin(Exchange, ImplicitAPI):
1674
1878
  return None
1675
1879
  return self.parse_position(position, market)
1676
1880
 
1677
- async def fetch_positions(self, symbols: List[str] = None, params={}) -> List[Position]:
1881
+ async def fetch_positions(self, symbols: Strings = None, params={}) -> List[Position]:
1678
1882
  """
1679
1883
  fetch data on a single open contract trade position
1680
- :see: https://blofin.com/docs#get-positions
1884
+
1885
+ https://blofin.com/docs#get-positions
1886
+
1681
1887
  :param str[] [symbols]: list of unified market symbols
1682
1888
  :param dict [params]: extra parameters specific to the exchange API endpoint
1683
1889
  :param str [params.instType]: MARGIN, SWAP, FUTURES, OPTION
@@ -1690,7 +1896,33 @@ class blofin(Exchange, ImplicitAPI):
1690
1896
  result = self.parse_positions(data)
1691
1897
  return self.filter_by_array_positions(result, 'symbol', symbols, False)
1692
1898
 
1693
- 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
+ #
1694
1926
  marketId = self.safe_string(position, 'instId')
1695
1927
  market = self.safe_market(marketId, market)
1696
1928
  symbol = market['symbol']
@@ -1771,10 +2003,12 @@ class blofin(Exchange, ImplicitAPI):
1771
2003
  'takeProfitPrice': None,
1772
2004
  })
1773
2005
 
1774
- async def fetch_leverages(self, symbols: List[str] = None, params={}) -> Leverages:
2006
+ async def fetch_leverages(self, symbols: Strings = None, params={}) -> Leverages:
1775
2007
  """
1776
2008
  fetch the set leverage for all contract markets
1777
- :see: https://docs.blofin.com/index.html#get-multiple-leverage
2009
+
2010
+ https://docs.blofin.com/index.html#get-multiple-leverage
2011
+
1778
2012
  :param str[] symbols: a list of unified market symbols, required on blofin
1779
2013
  :param dict [params]: extra parameters specific to the exchange API endpoint
1780
2014
  :param str [params.marginMode]: 'cross' or 'isolated'
@@ -1798,7 +2032,7 @@ class blofin(Exchange, ImplicitAPI):
1798
2032
  instIds = instIds + ',' + entryMarket['id']
1799
2033
  else:
1800
2034
  instIds = instIds + entryMarket['id']
1801
- request = {
2035
+ request: dict = {
1802
2036
  'instId': instIds,
1803
2037
  'marginMode': marginMode,
1804
2038
  }
@@ -1822,7 +2056,9 @@ class blofin(Exchange, ImplicitAPI):
1822
2056
  async def fetch_leverage(self, symbol: str, params={}) -> Leverage:
1823
2057
  """
1824
2058
  fetch the set leverage for a market
1825
- :see: https://docs.blofin.com/index.html#get-leverage
2059
+
2060
+ https://docs.blofin.com/index.html#get-leverage
2061
+
1826
2062
  :param str symbol: unified market symbol
1827
2063
  :param dict [params]: extra parameters specific to the exchange API endpoint
1828
2064
  :param str [params.marginMode]: 'cross' or 'isolated'
@@ -1836,7 +2072,7 @@ class blofin(Exchange, ImplicitAPI):
1836
2072
  if (marginMode != 'cross') and (marginMode != 'isolated'):
1837
2073
  raise BadRequest(self.id + ' fetchLeverage() requires a marginMode parameter that must be either cross or isolated')
1838
2074
  market = self.market(symbol)
1839
- request = {
2075
+ request: dict = {
1840
2076
  'instId': market['id'],
1841
2077
  'marginMode': marginMode,
1842
2078
  }
@@ -1855,7 +2091,7 @@ class blofin(Exchange, ImplicitAPI):
1855
2091
  data = self.safe_dict(response, 'data', {})
1856
2092
  return self.parse_leverage(data, market)
1857
2093
 
1858
- def parse_leverage(self, leverage, market=None) -> Leverage:
2094
+ def parse_leverage(self, leverage: dict, market: Market = None) -> Leverage:
1859
2095
  marketId = self.safe_string(leverage, 'instId')
1860
2096
  leverageValue = self.safe_integer(leverage, 'leverage')
1861
2097
  return {
@@ -1869,7 +2105,9 @@ class blofin(Exchange, ImplicitAPI):
1869
2105
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
1870
2106
  """
1871
2107
  set the level of leverage for a market
1872
- :see: https://blofin.com/docs#set-leverage
2108
+
2109
+ https://blofin.com/docs#set-leverage
2110
+
1873
2111
  :param int leverage: the rate of leverage
1874
2112
  :param str symbol: unified market symbol
1875
2113
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1888,7 +2126,7 @@ class blofin(Exchange, ImplicitAPI):
1888
2126
  marginMode, params = self.handle_margin_mode_and_params('setLeverage', params, 'cross')
1889
2127
  if (marginMode != 'cross') and (marginMode != 'isolated'):
1890
2128
  raise BadRequest(self.id + ' setLeverage() requires a marginMode parameter that must be either cross or isolated')
1891
- request = {
2129
+ request: dict = {
1892
2130
  'leverage': leverage,
1893
2131
  'marginMode': marginMode,
1894
2132
  'instId': market['id'],
@@ -1899,15 +2137,17 @@ class blofin(Exchange, ImplicitAPI):
1899
2137
  async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
1900
2138
  """
1901
2139
  closes open positions for a market
1902
- :see: https://blofin.com/docs#close-positions
2140
+
2141
+ https://blofin.com/docs#close-positions
2142
+
1903
2143
  :param str symbol: Unified CCXT market symbol
1904
2144
  :param str [side]: 'buy' or 'sell', leave in net mode
1905
2145
  :param dict [params]: extra parameters specific to the blofin api endpoint
1906
2146
  :param str [params.clientOrderId]: a unique identifier for the order
1907
2147
  :param str [params.marginMode]: 'cross' or 'isolated', default is 'cross
1908
2148
  :param str [params.code]: *required in the case of closing cross MARGIN position for Single-currency margin* margin currency
1909
- *
1910
- * EXCHANGE SPECIFIC PARAMETERS
2149
+
2150
+ EXCHANGE SPECIFIC PARAMETERS
1911
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
1912
2152
  :param str [params.tag]: order tag a combination of case-sensitive alphanumerics, all numbers, or all letters of up to 16 characters
1913
2153
  :returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
@@ -1917,7 +2157,7 @@ class blofin(Exchange, ImplicitAPI):
1917
2157
  clientOrderId = self.safe_string(params, 'clientOrderId')
1918
2158
  marginMode = None
1919
2159
  marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
1920
- request = {
2160
+ request: dict = {
1921
2161
  'instId': market['id'],
1922
2162
  'marginMode': marginMode,
1923
2163
  }
@@ -1929,13 +2169,15 @@ class blofin(Exchange, ImplicitAPI):
1929
2169
  async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1930
2170
  """
1931
2171
  fetches information on multiple closed orders made by the user
1932
- :see: https://blofin.com/docs#get-order-history
1933
- :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
+
1934
2176
  :param str symbol: unified market symbol of the market orders were made in
1935
2177
  :param int [since]: the earliest time in ms to fetch orders for
1936
2178
  :param int [limit]: the maximum number of orde structures to retrieve
1937
2179
  :param dict [params]: extra parameters specific to the exchange API endpoint
1938
- :param bool [params.stop]: True if fetching trigger or conditional orders
2180
+ :param bool [params.trigger]: True if fetching trigger or conditional orders
1939
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)
1940
2182
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1941
2183
  """
@@ -1944,7 +2186,7 @@ class blofin(Exchange, ImplicitAPI):
1944
2186
  paginate, params = self.handle_option_and_params(params, 'fetchClosedOrders', 'paginate')
1945
2187
  if paginate:
1946
2188
  return await self.fetch_paginated_call_dynamic('fetchClosedOrders', symbol, since, limit, params)
1947
- request = {
2189
+ request: dict = {
1948
2190
  }
1949
2191
  market = None
1950
2192
  if symbol is not None:
@@ -1954,12 +2196,12 @@ class blofin(Exchange, ImplicitAPI):
1954
2196
  request['limit'] = limit # default 100, max 100
1955
2197
  if since is not None:
1956
2198
  request['begin'] = since
1957
- isStop = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
2199
+ isTrigger = self.safe_bool_n(params, ['stop', 'trigger', 'tpsl', 'TPSL'], False)
1958
2200
  method: Str = None
1959
2201
  method, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'method', 'privateGetTradeOrdersHistory')
1960
2202
  query = self.omit(params, ['method', 'stop', 'trigger', 'tpsl', 'TPSL'])
1961
2203
  response = None
1962
- if (isStop) or (method == 'privateGetTradeOrdersTpslHistory'):
2204
+ if (isTrigger) or (method == 'privateGetTradeOrdersTpslHistory'):
1963
2205
  response = await self.privateGetTradeOrdersTpslHistory(self.extend(request, query))
1964
2206
  else:
1965
2207
  response = await self.privateGetTradeOrdersHistory(self.extend(request, query))
@@ -1969,7 +2211,9 @@ class blofin(Exchange, ImplicitAPI):
1969
2211
  async def fetch_margin_mode(self, symbol: str, params={}) -> MarginMode:
1970
2212
  """
1971
2213
  fetches the margin mode of a trading pair
1972
- :see: https://docs.blofin.com/index.html#get-margin-mode
2214
+
2215
+ https://docs.blofin.com/index.html#get-margin-mode
2216
+
1973
2217
  :param str symbol: unified symbol of the market to fetch the margin mode for
1974
2218
  :param dict [params]: extra parameters specific to the exchange API endpoint
1975
2219
  :returns dict: a `margin mode structure <https://docs.ccxt.com/#/?id=margin-mode-structure>`
@@ -1989,14 +2233,14 @@ class blofin(Exchange, ImplicitAPI):
1989
2233
  data = self.safe_dict(response, 'data', {})
1990
2234
  return self.parse_margin_mode(data, market)
1991
2235
 
1992
- def parse_margin_mode(self, marginMode, market=None) -> MarginMode:
2236
+ def parse_margin_mode(self, marginMode: dict, market=None) -> MarginMode:
1993
2237
  return {
1994
2238
  'info': marginMode,
1995
2239
  'symbol': market['symbol'],
1996
2240
  'marginMode': self.safe_string(marginMode, 'marginMode'),
1997
2241
  }
1998
2242
 
1999
- 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):
2000
2244
  if response is None:
2001
2245
  return None # fallback to default error handler
2002
2246
  #