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
@@ -8,15 +8,15 @@ from ccxt.abstract.digifinex import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
11
+ from ccxt.base.types import Balances, BorrowInterest, CrossBorrowRate, CrossBorrowRates, Currencies, Currency, DepositAddress, Int, LedgerEntry, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, Trade, TradingFeeInterface, Transaction, TransferEntry
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
+ from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import PermissionDenied
15
16
  from ccxt.base.errors import AccountSuspended
16
17
  from ccxt.base.errors import ArgumentsRequired
17
18
  from ccxt.base.errors import BadRequest
18
19
  from ccxt.base.errors import BadSymbol
19
- from ccxt.base.errors import BadResponse
20
20
  from ccxt.base.errors import InsufficientFunds
21
21
  from ccxt.base.errors import InvalidAddress
22
22
  from ccxt.base.errors import InvalidOrder
@@ -26,7 +26,7 @@ from ccxt.base.errors import NetworkError
26
26
  from ccxt.base.errors import DDoSProtection
27
27
  from ccxt.base.errors import RateLimitExceeded
28
28
  from ccxt.base.errors import InvalidNonce
29
- from ccxt.base.errors import AuthenticationError
29
+ from ccxt.base.errors import BadResponse
30
30
  from ccxt.base.decimal_to_precision import TICK_SIZE
31
31
  from ccxt.base.precise import Precise
32
32
 
@@ -68,10 +68,14 @@ class digifinex(Exchange, ImplicitAPI):
68
68
  'fetchCrossBorrowRates': True,
69
69
  'fetchCurrencies': True,
70
70
  'fetchDepositAddress': True,
71
+ 'fetchDepositAddresses': False,
72
+ 'fetchDepositAddressesByNetwork': False,
71
73
  'fetchDeposits': True,
72
74
  'fetchDepositWithdrawFee': 'emulated',
73
75
  'fetchDepositWithdrawFees': True,
74
76
  'fetchFundingHistory': True,
77
+ 'fetchFundingInterval': True,
78
+ 'fetchFundingIntervals': False,
75
79
  'fetchFundingRate': True,
76
80
  'fetchFundingRateHistory': True,
77
81
  'fetchFundingRates': False,
@@ -227,6 +231,7 @@ class digifinex(Exchange, ImplicitAPI):
227
231
  'trade/order_info',
228
232
  ],
229
233
  'post': [
234
+ 'account/transfer',
230
235
  'account/leverage',
231
236
  'account/position_mode',
232
237
  'account/position_margin',
@@ -366,7 +371,7 @@ class digifinex(Exchange, ImplicitAPI):
366
371
  },
367
372
  })
368
373
 
369
- async def fetch_currencies(self, params={}):
374
+ async def fetch_currencies(self, params={}) -> Currencies:
370
375
  """
371
376
  fetches all available currencies on an exchange
372
377
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -411,7 +416,7 @@ class digifinex(Exchange, ImplicitAPI):
411
416
  # }
412
417
  #
413
418
  data = self.safe_value(response, 'data', [])
414
- result = {}
419
+ result: dict = {}
415
420
  for i in range(0, len(data)):
416
421
  currency = data[i]
417
422
  id = self.safe_string(currency, 'currency')
@@ -434,7 +439,7 @@ class digifinex(Exchange, ImplicitAPI):
434
439
  networkCode = None
435
440
  if networkId is not None:
436
441
  networkCode = self.network_id_to_code(networkId)
437
- network = {
442
+ network: dict = {
438
443
  'info': currency,
439
444
  'id': networkId,
440
445
  'network': networkCode,
@@ -523,7 +528,7 @@ class digifinex(Exchange, ImplicitAPI):
523
528
  result[code]['precision'] = precision if (result[code]['precision'] is None) else max(result[code]['precision'], precision)
524
529
  return result
525
530
 
526
- async def fetch_markets(self, params={}):
531
+ async def fetch_markets(self, params={}) -> List[Market]:
527
532
  """
528
533
  retrieves data on all markets for digifinex
529
534
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -789,7 +794,7 @@ class digifinex(Exchange, ImplicitAPI):
789
794
  # "time_stamp": 1661487402396
790
795
  # }
791
796
  #
792
- result = {'info': response}
797
+ result: dict = {'info': response}
793
798
  for i in range(0, len(response)):
794
799
  balance = response[i]
795
800
  currencyId = self.safe_string(balance, 'currency')
@@ -806,9 +811,11 @@ class digifinex(Exchange, ImplicitAPI):
806
811
  async def fetch_balance(self, params={}) -> Balances:
807
812
  """
808
813
  query for balance and get the amount of funds available for trading or funds locked in orders
809
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-account-assets
810
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
811
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#accountbalance
814
+
815
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-account-assets
816
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
817
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accountbalance
818
+
812
819
  :param dict [params]: extra parameters specific to the exchange API endpoint
813
820
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
814
821
  """
@@ -869,8 +876,10 @@ class digifinex(Exchange, ImplicitAPI):
869
876
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
870
877
  """
871
878
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
872
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-orderbook
873
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderbook
879
+
880
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-orderbook
881
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderbook
882
+
874
883
  :param str symbol: unified symbol of the market to fetch the order book for
875
884
  :param int [limit]: the maximum amount of order book entries to return
876
885
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -879,7 +888,7 @@ class digifinex(Exchange, ImplicitAPI):
879
888
  await self.load_markets()
880
889
  market = self.market(symbol)
881
890
  marketType, query = self.handle_market_type_and_params('fetchOrderBook', market, params)
882
- request = {}
891
+ request: dict = {}
883
892
  if limit is not None:
884
893
  request['limit'] = limit
885
894
  response = None
@@ -940,8 +949,10 @@ class digifinex(Exchange, ImplicitAPI):
940
949
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
941
950
  """
942
951
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
943
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
944
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#tickers
952
+
953
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
954
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tickers
955
+
945
956
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
946
957
  :param dict [params]: extra parameters specific to the exchange API endpoint
947
958
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -954,7 +965,7 @@ class digifinex(Exchange, ImplicitAPI):
954
965
  market = self.market(first)
955
966
  type = None
956
967
  type, params = self.handle_market_type_and_params('fetchTickers', market, params)
957
- request = {}
968
+ request: dict = {}
958
969
  response = None
959
970
  if type == 'swap':
960
971
  response = await self.publicSwapGetPublicTickers(self.extend(request, params))
@@ -1008,7 +1019,7 @@ class digifinex(Exchange, ImplicitAPI):
1008
1019
  # ]
1009
1020
  # }
1010
1021
  #
1011
- result = {}
1022
+ result: dict = {}
1012
1023
  tickers = self.safe_value_2(response, 'ticker', 'data', [])
1013
1024
  date = self.safe_integer(response, 'date')
1014
1025
  for i in range(0, len(tickers)):
@@ -1023,15 +1034,17 @@ class digifinex(Exchange, ImplicitAPI):
1023
1034
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1024
1035
  """
1025
1036
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1026
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1027
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#ticker
1037
+
1038
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1039
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#ticker
1040
+
1028
1041
  :param str symbol: unified symbol of the market to fetch the ticker for
1029
1042
  :param dict [params]: extra parameters specific to the exchange API endpoint
1030
1043
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1031
1044
  """
1032
1045
  await self.load_markets()
1033
1046
  market = self.market(symbol)
1034
- request = {}
1047
+ request: dict = {}
1035
1048
  response = None
1036
1049
  if market['swap']:
1037
1050
  request['instrument_id'] = market['id']
@@ -1095,7 +1108,7 @@ class digifinex(Exchange, ImplicitAPI):
1095
1108
  result = self.extend({'date': date}, firstTicker)
1096
1109
  return self.parse_ticker(result, market)
1097
1110
 
1098
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1111
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1099
1112
  #
1100
1113
  # spot: fetchTicker, fetchTickers
1101
1114
  #
@@ -1164,10 +1177,12 @@ class digifinex(Exchange, ImplicitAPI):
1164
1177
  'average': None,
1165
1178
  'baseVolume': self.safe_string_2(ticker, 'vol', 'volume_24h'),
1166
1179
  'quoteVolume': self.safe_string(ticker, 'base_vol'),
1180
+ 'markPrice': self.safe_string(ticker, 'mark_price'),
1181
+ 'indexPrice': indexPrice,
1167
1182
  'info': ticker,
1168
1183
  }, market)
1169
1184
 
1170
- def parse_trade(self, trade, market: Market = None) -> Trade:
1185
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1171
1186
  #
1172
1187
  # spot: fetchTrades
1173
1188
  #
@@ -1336,8 +1351,10 @@ class digifinex(Exchange, ImplicitAPI):
1336
1351
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1337
1352
  """
1338
1353
  get the list of most recent trades for a particular symbol
1339
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-recent-trades
1340
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#recenttrades
1354
+
1355
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-recent-trades
1356
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recenttrades
1357
+
1341
1358
  :param str symbol: unified symbol of the market to fetch trades for
1342
1359
  :param int [since]: timestamp in ms of the earliest trade to fetch
1343
1360
  :param int [limit]: the maximum amount of trades to fetch
@@ -1346,7 +1363,7 @@ class digifinex(Exchange, ImplicitAPI):
1346
1363
  """
1347
1364
  await self.load_markets()
1348
1365
  market = self.market(symbol)
1349
- request = {}
1366
+ request: dict = {}
1350
1367
  if limit is not None:
1351
1368
  request['limit'] = min(limit, 100) if market['swap'] else limit
1352
1369
  response = None
@@ -1397,7 +1414,7 @@ class digifinex(Exchange, ImplicitAPI):
1397
1414
  # ]
1398
1415
  # }
1399
1416
  #
1400
- data = self.safe_value(response, 'data', [])
1417
+ data = self.safe_list(response, 'data', [])
1401
1418
  return self.parse_trades(data, market, since, limit)
1402
1419
 
1403
1420
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
@@ -1433,8 +1450,10 @@ class digifinex(Exchange, ImplicitAPI):
1433
1450
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1434
1451
  """
1435
1452
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1436
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-candles-data
1437
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#recentcandle
1453
+
1454
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-candles-data
1455
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recentcandle
1456
+
1438
1457
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1439
1458
  :param str timeframe: the length of time each candle represents
1440
1459
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -1444,13 +1463,13 @@ class digifinex(Exchange, ImplicitAPI):
1444
1463
  """
1445
1464
  await self.load_markets()
1446
1465
  market = self.market(symbol)
1447
- request = {}
1466
+ request: dict = {}
1448
1467
  response = None
1449
1468
  if market['swap']:
1450
1469
  request['instrument_id'] = market['id']
1451
1470
  request['granularity'] = timeframe
1452
1471
  if limit is not None:
1453
- request['limit'] = limit
1472
+ request['limit'] = min(limit, 100)
1454
1473
  response = await self.publicSwapGetPublicCandles(self.extend(request, params))
1455
1474
  else:
1456
1475
  request['symbol'] = market['id']
@@ -1505,13 +1524,15 @@ class digifinex(Exchange, ImplicitAPI):
1505
1524
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1506
1525
  """
1507
1526
  create a trade order
1508
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1509
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderplace
1527
+
1528
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1529
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderplace
1530
+
1510
1531
  :param str symbol: unified symbol of the market to create an order in
1511
1532
  :param str type: 'market' or 'limit'
1512
1533
  :param str side: 'buy' or 'sell'
1513
1534
  :param float amount: how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1514
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1535
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1515
1536
  :param dict [params]: extra parameters specific to the exchange API endpoint
1516
1537
  :param str [params.timeInForce]: "GTC", "IOC", "FOK", or "PO"
1517
1538
  :param bool [params.postOnly]: True or False
@@ -1559,8 +1580,10 @@ class digifinex(Exchange, ImplicitAPI):
1559
1580
  async def create_orders(self, orders: List[OrderRequest], params={}):
1560
1581
  """
1561
1582
  create a list of trade orders(all orders should be of the same symbol)
1562
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1563
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1583
+
1584
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1585
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1586
+
1564
1587
  :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
1565
1588
  :param dict [params]: extra parameters specific to the exchange API endpoint
1566
1589
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1593,7 +1616,7 @@ class digifinex(Exchange, ImplicitAPI):
1593
1616
  orderRequest = self.create_order_request(marketId, type, side, amount, price, orderParams)
1594
1617
  ordersRequests.append(orderRequest)
1595
1618
  market = self.market(symbol)
1596
- request = {}
1619
+ request: dict = {}
1597
1620
  response = None
1598
1621
  if market['swap']:
1599
1622
  response = await self.privateSwapPostTradeBatchOrder(ordersRequests)
@@ -1631,7 +1654,7 @@ class digifinex(Exchange, ImplicitAPI):
1631
1654
  result = []
1632
1655
  for i in range(0, len(orders)):
1633
1656
  rawOrder = orders[i]
1634
- individualOrder = {}
1657
+ individualOrder: dict = {}
1635
1658
  individualOrder['order_id'] = data[i]
1636
1659
  individualOrder['instrument_id'] = market['id']
1637
1660
  individualOrder['amount'] = self.safe_number(rawOrder, 'amount')
@@ -1641,13 +1664,13 @@ class digifinex(Exchange, ImplicitAPI):
1641
1664
 
1642
1665
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1643
1666
  """
1644
- * @ignore
1667
+ @ignore
1645
1668
  helper function to build request
1646
1669
  :param str symbol: unified symbol of the market to create an order in
1647
1670
  :param str type: 'market' or 'limit'
1648
1671
  :param str side: 'buy' or 'sell'
1649
1672
  :param float amount: how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1650
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1673
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1651
1674
  :param dict [params]: extra parameters specific to the exchange API endpoint
1652
1675
  :returns dict: request to be sent to the exchange
1653
1676
  """
@@ -1658,7 +1681,7 @@ class digifinex(Exchange, ImplicitAPI):
1658
1681
  marginMode, params = self.handle_margin_mode_and_params('createOrderRequest', params)
1659
1682
  if marginMode is not None:
1660
1683
  marketType = 'margin'
1661
- request = {}
1684
+ request: dict = {}
1662
1685
  swap = (marketType == 'swap')
1663
1686
  isMarketOrder = (type == 'market')
1664
1687
  isLimitOrder = (type == 'limit')
@@ -1733,7 +1756,9 @@ class digifinex(Exchange, ImplicitAPI):
1733
1756
  async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1734
1757
  """
1735
1758
  create a market buy order by providing the symbol and cost
1736
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1759
+
1760
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1761
+
1737
1762
  :param str symbol: unified symbol of the market to create an order in
1738
1763
  :param float cost: how much you want to trade in units of the quote currency
1739
1764
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1749,8 +1774,10 @@ class digifinex(Exchange, ImplicitAPI):
1749
1774
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1750
1775
  """
1751
1776
  cancels an open order
1752
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#cancel-order
1753
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#cancelorder
1777
+
1778
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#cancel-order
1779
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#cancelorder
1780
+
1754
1781
  :param str id: order id
1755
1782
  :param str symbol: not used by digifinex cancelOrder()
1756
1783
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1763,7 +1790,7 @@ class digifinex(Exchange, ImplicitAPI):
1763
1790
  id = str(id)
1764
1791
  marketType = None
1765
1792
  marketType, params = self.handle_market_type_and_params('cancelOrder', market, params)
1766
- request = {
1793
+ request: dict = {
1767
1794
  'order_id': id,
1768
1795
  }
1769
1796
  if marketType == 'swap':
@@ -1809,7 +1836,34 @@ class digifinex(Exchange, ImplicitAPI):
1809
1836
  numCanceledOrders = len(canceledOrders)
1810
1837
  if numCanceledOrders != 1:
1811
1838
  raise OrderNotFound(self.id + ' cancelOrder() ' + id + ' not found')
1812
- return response
1839
+ orders = self.parse_cancel_orders(response)
1840
+ return self.safe_dict(orders, 0)
1841
+ else:
1842
+ return self.safe_order({
1843
+ 'info': response,
1844
+ 'orderId': self.safe_string(response, 'data'),
1845
+ })
1846
+
1847
+ def parse_cancel_orders(self, response):
1848
+ success = self.safe_list(response, 'success')
1849
+ error = self.safe_list(response, 'error')
1850
+ result = []
1851
+ for i in range(0, len(success)):
1852
+ order = success[i]
1853
+ result.append(self.safe_order({
1854
+ 'info': order,
1855
+ 'id': order,
1856
+ 'status': 'canceled',
1857
+ }))
1858
+ for i in range(0, len(error)):
1859
+ order = error[i]
1860
+ result.append(self.safe_order({
1861
+ 'info': order,
1862
+ 'id': self.safe_string_2(order, 'order-id', 'order_id'),
1863
+ 'status': 'failed',
1864
+ 'clientOrderId': self.safe_string(order, 'client-order-id'),
1865
+ }))
1866
+ return result
1813
1867
 
1814
1868
  async def cancel_orders(self, ids, symbol: Str = None, params={}):
1815
1869
  """
@@ -1823,7 +1877,7 @@ class digifinex(Exchange, ImplicitAPI):
1823
1877
  defaultType = self.safe_string(self.options, 'defaultType', 'spot')
1824
1878
  orderType = self.safe_string(params, 'type', defaultType)
1825
1879
  params = self.omit(params, 'type')
1826
- request = {
1880
+ request: dict = {
1827
1881
  'market': orderType,
1828
1882
  'order_id': ','.join(ids),
1829
1883
  }
@@ -1840,14 +1894,10 @@ class digifinex(Exchange, ImplicitAPI):
1840
1894
  # ]
1841
1895
  # }
1842
1896
  #
1843
- canceledOrders = self.safe_value(response, 'success', [])
1844
- numCanceledOrders = len(canceledOrders)
1845
- if numCanceledOrders < 1:
1846
- raise OrderNotFound(self.id + ' cancelOrders() error')
1847
- return response
1897
+ return self.parse_cancel_orders(response)
1848
1898
 
1849
- def parse_order_status(self, status):
1850
- statuses = {
1899
+ def parse_order_status(self, status: Str):
1900
+ statuses: dict = {
1851
1901
  '0': 'open',
1852
1902
  '1': 'open', # partially filled
1853
1903
  '2': 'closed',
@@ -1856,7 +1906,7 @@ class digifinex(Exchange, ImplicitAPI):
1856
1906
  }
1857
1907
  return self.safe_string(statuses, status, status)
1858
1908
 
1859
- def parse_order(self, order, market: Market = None) -> Order:
1909
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1860
1910
  #
1861
1911
  # spot: createOrder
1862
1912
  #
@@ -1975,7 +2025,6 @@ class digifinex(Exchange, ImplicitAPI):
1975
2025
  'postOnly': None,
1976
2026
  'side': side,
1977
2027
  'price': self.safe_number(order, 'price'),
1978
- 'stopPrice': None,
1979
2028
  'triggerPrice': None,
1980
2029
  'amount': self.safe_number_2(order, 'amount', 'size'),
1981
2030
  'filled': self.safe_number_2(order, 'executed_amount', 'filled_qty'),
@@ -1992,8 +2041,10 @@ class digifinex(Exchange, ImplicitAPI):
1992
2041
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1993
2042
  """
1994
2043
  fetch all unfilled currently open orders
1995
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#current-active-orders
1996
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#openorder
2044
+
2045
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#current-active-orders
2046
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#openorder
2047
+
1997
2048
  :param str symbol: unified market symbol
1998
2049
  :param int [since]: the earliest time in ms to fetch open orders for
1999
2050
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -2007,7 +2058,7 @@ class digifinex(Exchange, ImplicitAPI):
2007
2058
  marketType = None
2008
2059
  marketType, params = self.handle_market_type_and_params('fetchOpenOrders', market, params)
2009
2060
  marginMode, query = self.handle_margin_mode_and_params('fetchOpenOrders', params)
2010
- request = {}
2061
+ request: dict = {}
2011
2062
  swap = (marketType == 'swap')
2012
2063
  if swap:
2013
2064
  if since is not None:
@@ -2080,14 +2131,16 @@ class digifinex(Exchange, ImplicitAPI):
2080
2131
  # ]
2081
2132
  # }
2082
2133
  #
2083
- data = self.safe_value(response, 'data', [])
2134
+ data = self.safe_list(response, 'data', [])
2084
2135
  return self.parse_orders(data, market, since, limit)
2085
2136
 
2086
2137
  async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2087
2138
  """
2088
2139
  fetches information on multiple orders made by the user
2089
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-all-orders-including-history-orders
2090
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#historyorder
2140
+
2141
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-all-orders-including-history-orders
2142
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historyorder
2143
+
2091
2144
  :param str symbol: unified market symbol of the market orders were made in
2092
2145
  :param int [since]: the earliest time in ms to fetch orders for
2093
2146
  :param int [limit]: the maximum number of order structures to retrieve
@@ -2101,7 +2154,7 @@ class digifinex(Exchange, ImplicitAPI):
2101
2154
  marketType = None
2102
2155
  marketType, params = self.handle_market_type_and_params('fetchOrders', market, params)
2103
2156
  marginMode, query = self.handle_margin_mode_and_params('fetchOrders', params)
2104
- request = {}
2157
+ request: dict = {}
2105
2158
  if marketType == 'swap':
2106
2159
  if since is not None:
2107
2160
  request['start_timestamp'] = since
@@ -2175,14 +2228,16 @@ class digifinex(Exchange, ImplicitAPI):
2175
2228
  # ]
2176
2229
  # }
2177
2230
  #
2178
- data = self.safe_value(response, 'data', [])
2231
+ data = self.safe_list(response, 'data', [])
2179
2232
  return self.parse_orders(data, market, since, limit)
2180
2233
 
2181
2234
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
2182
2235
  """
2183
2236
  fetches information on an order made by the user
2184
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-order-status
2185
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderinfo
2237
+
2238
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-order-status
2239
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderinfo
2240
+
2186
2241
  :param str id: order id
2187
2242
  :param str symbol: unified symbol of the market the order was made in
2188
2243
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2195,7 +2250,7 @@ class digifinex(Exchange, ImplicitAPI):
2195
2250
  marketType = None
2196
2251
  marketType, params = self.handle_market_type_and_params('fetchOrder', market, params)
2197
2252
  marginMode, query = self.handle_margin_mode_and_params('fetchOrder', params)
2198
- request = {
2253
+ request: dict = {
2199
2254
  'order_id': id,
2200
2255
  }
2201
2256
  if marketType == 'swap':
@@ -2270,8 +2325,10 @@ class digifinex(Exchange, ImplicitAPI):
2270
2325
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2271
2326
  """
2272
2327
  fetch all trades made by the user
2273
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#customer-39-s-trades
2274
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#historytrade
2328
+
2329
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#customer-39-s-trades
2330
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historytrade
2331
+
2275
2332
  :param str symbol: unified market symbol
2276
2333
  :param int [since]: the earliest time in ms to fetch trades for
2277
2334
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -2280,7 +2337,7 @@ class digifinex(Exchange, ImplicitAPI):
2280
2337
  """
2281
2338
  await self.load_markets()
2282
2339
  market = None
2283
- request = {}
2340
+ request: dict = {}
2284
2341
  if symbol is not None:
2285
2342
  market = self.market(symbol)
2286
2343
  marketType = None
@@ -2354,14 +2411,14 @@ class digifinex(Exchange, ImplicitAPI):
2354
2411
  # }
2355
2412
  #
2356
2413
  responseRequest = 'data' if (marketType == 'swap') else 'list'
2357
- data = self.safe_value(response, responseRequest, [])
2414
+ data = self.safe_list(response, responseRequest, [])
2358
2415
  return self.parse_trades(data, market, since, limit)
2359
2416
 
2360
2417
  def parse_ledger_entry_type(self, type):
2361
- types = {}
2418
+ types: dict = {}
2362
2419
  return self.safe_string(types, type, type)
2363
2420
 
2364
- def parse_ledger_entry(self, item, currency: Currency = None):
2421
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2365
2422
  #
2366
2423
  # spot and margin
2367
2424
  #
@@ -2383,13 +2440,15 @@ class digifinex(Exchange, ImplicitAPI):
2383
2440
  # }
2384
2441
  #
2385
2442
  type = self.parse_ledger_entry_type(self.safe_string_2(item, 'type', 'finance_type'))
2386
- code = self.safe_currency_code(self.safe_string_2(item, 'currency_mark', 'currency'), currency)
2443
+ currencyId = self.safe_string_2(item, 'currency_mark', 'currency')
2444
+ code = self.safe_currency_code(currencyId, currency)
2445
+ currency = self.safe_currency(currencyId, currency)
2387
2446
  amount = self.safe_number_2(item, 'num', 'change')
2388
2447
  after = self.safe_number(item, 'balance')
2389
2448
  timestamp = self.safe_timestamp(item, 'time')
2390
2449
  if timestamp is None:
2391
2450
  timestamp = self.safe_integer(item, 'timestamp')
2392
- return {
2451
+ return self.safe_ledger_entry({
2393
2452
  'info': item,
2394
2453
  'id': None,
2395
2454
  'direction': None,
@@ -2405,21 +2464,23 @@ class digifinex(Exchange, ImplicitAPI):
2405
2464
  'timestamp': timestamp,
2406
2465
  'datetime': self.iso8601(timestamp),
2407
2466
  'fee': None,
2408
- }
2467
+ }, currency)
2409
2468
 
2410
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2469
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2411
2470
  """
2412
- fetch the history of changes, actions done by the user or operations that altered balance of the user
2413
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-margin-otc-financial-logs
2414
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#bills
2415
- :param str code: unified currency code, default is None
2471
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
2472
+
2473
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-margin-otc-financial-logs
2474
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#bills
2475
+
2476
+ :param str [code]: unified currency code, default is None
2416
2477
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
2417
- :param int [limit]: max number of ledger entrys to return, default is None
2478
+ :param int [limit]: max number of ledger entries to return, default is None
2418
2479
  :param dict [params]: extra parameters specific to the exchange API endpoint
2419
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2480
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
2420
2481
  """
2421
2482
  await self.load_markets()
2422
- request = {}
2483
+ request: dict = {}
2423
2484
  marketType = None
2424
2485
  marketType, params = self.handle_market_type_and_params('fetchLedger', None, params)
2425
2486
  marginMode, query = self.handle_margin_mode_and_params('fetchLedger', params)
@@ -2488,7 +2549,7 @@ class digifinex(Exchange, ImplicitAPI):
2488
2549
  ledger = self.safe_value(data, 'finance', [])
2489
2550
  return self.parse_ledger(ledger, currency, since, limit)
2490
2551
 
2491
- def parse_deposit_address(self, depositAddress, currency: Currency = None):
2552
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
2492
2553
  #
2493
2554
  # {
2494
2555
  # "addressTag":"",
@@ -2504,12 +2565,12 @@ class digifinex(Exchange, ImplicitAPI):
2504
2565
  return {
2505
2566
  'info': depositAddress,
2506
2567
  'currency': code,
2568
+ 'network': None,
2507
2569
  'address': address,
2508
2570
  'tag': tag,
2509
- 'network': None,
2510
2571
  }
2511
2572
 
2512
- async def fetch_deposit_address(self, code: str, params={}):
2573
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
2513
2574
  """
2514
2575
  fetch the deposit address for a currency associated with self account
2515
2576
  :param str code: unified currency code
@@ -2518,7 +2579,7 @@ class digifinex(Exchange, ImplicitAPI):
2518
2579
  """
2519
2580
  await self.load_markets()
2520
2581
  currency = self.currency(code)
2521
- request = {
2582
+ request: dict = {
2522
2583
  'currency': currency['id'],
2523
2584
  }
2524
2585
  response = await self.privateSpotGetDepositAddress(self.extend(request, params))
@@ -2545,7 +2606,7 @@ class digifinex(Exchange, ImplicitAPI):
2545
2606
  async def fetch_transactions_by_type(self, type, code: Str = None, since: Int = None, limit: Int = None, params={}):
2546
2607
  await self.load_markets()
2547
2608
  currency = None
2548
- request = {
2609
+ request: dict = {
2549
2610
  # 'currency': currency['id'],
2550
2611
  # 'from': 'fromId', # When direct is' prev ', from is 1, returning from old to new ascending, when direct is' next ', from is the ID of the most recent record, returned from the old descending order
2551
2612
  # 'size': 100, # default 100, max 500
@@ -2581,7 +2642,7 @@ class digifinex(Exchange, ImplicitAPI):
2581
2642
  # ]
2582
2643
  # }
2583
2644
  #
2584
- data = self.safe_value(response, 'data', [])
2645
+ data = self.safe_list(response, 'data', [])
2585
2646
  return self.parse_transactions(data, currency, since, limit, {'type': type})
2586
2647
 
2587
2648
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
@@ -2606,10 +2667,10 @@ class digifinex(Exchange, ImplicitAPI):
2606
2667
  """
2607
2668
  return await self.fetch_transactions_by_type('withdrawal', code, since, limit, params)
2608
2669
 
2609
- def parse_transaction_status(self, status):
2670
+ def parse_transaction_status(self, status: Str):
2610
2671
  # deposit state includes: 1(in deposit), 2(to be confirmed), 3(successfully deposited), 4(stopped)
2611
2672
  # withdrawal state includes: 1(application in progress), 2(to be confirmed), 3(completed), 4(rejected)
2612
- statuses = {
2673
+ statuses: dict = {
2613
2674
  '1': 'pending', # in Progress
2614
2675
  '2': 'pending', # to be confirmed
2615
2676
  '3': 'ok', # Completed
@@ -2617,7 +2678,7 @@ class digifinex(Exchange, ImplicitAPI):
2617
2678
  }
2618
2679
  return self.safe_string(statuses, status, status)
2619
2680
 
2620
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2681
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2621
2682
  #
2622
2683
  # withdraw
2623
2684
  #
@@ -2680,20 +2741,31 @@ class digifinex(Exchange, ImplicitAPI):
2680
2741
  'fee': fee,
2681
2742
  }
2682
2743
 
2683
- def parse_transfer_status(self, status):
2684
- statuses = {
2744
+ def parse_transfer_status(self, status: Str) -> Str:
2745
+ statuses: dict = {
2685
2746
  '0': 'ok',
2686
2747
  }
2687
2748
  return self.safe_string(statuses, status, status)
2688
2749
 
2689
- def parse_transfer(self, transfer, currency: Currency = None):
2750
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
2690
2751
  #
2691
- # transfer
2752
+ # transfer between spot, margin and OTC
2692
2753
  #
2693
2754
  # {
2694
2755
  # "code": 0
2695
2756
  # }
2696
2757
  #
2758
+ # transfer between spot and swap
2759
+ #
2760
+ # {
2761
+ # "code": 0,
2762
+ # "data": {
2763
+ # "type": 2,
2764
+ # "currency": "USDT",
2765
+ # "transfer_amount": "5"
2766
+ # }
2767
+ # }
2768
+ #
2697
2769
  # fetchTransfers
2698
2770
  #
2699
2771
  # {
@@ -2706,7 +2778,8 @@ class digifinex(Exchange, ImplicitAPI):
2706
2778
  #
2707
2779
  fromAccount = None
2708
2780
  toAccount = None
2709
- type = self.safe_integer(transfer, 'type')
2781
+ data = self.safe_dict(transfer, 'data', transfer)
2782
+ type = self.safe_integer(data, 'type')
2710
2783
  if type == 1:
2711
2784
  fromAccount = 'spot'
2712
2785
  toAccount = 'swap'
@@ -2719,8 +2792,8 @@ class digifinex(Exchange, ImplicitAPI):
2719
2792
  'id': self.safe_string(transfer, 'transfer_id'),
2720
2793
  'timestamp': timestamp,
2721
2794
  'datetime': self.iso8601(timestamp),
2722
- 'currency': self.safe_currency_code(self.safe_string(transfer, 'currency'), currency),
2723
- 'amount': self.safe_number(transfer, 'amount'),
2795
+ 'currency': self.safe_currency_code(self.safe_string(data, 'currency'), currency),
2796
+ 'amount': self.safe_number_2(data, 'amount', 'transfer_amount'),
2724
2797
  'fromAccount': fromAccount,
2725
2798
  'toAccount': toAccount,
2726
2799
  'status': self.parse_transfer_status(self.safe_string(transfer, 'code')),
@@ -2729,33 +2802,59 @@ class digifinex(Exchange, ImplicitAPI):
2729
2802
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2730
2803
  """
2731
2804
  transfer currency internally between wallets on the same account
2805
+
2806
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#transfer-assets-among-accounts
2807
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accounttransfer
2808
+
2732
2809
  :param str code: unified currency code
2733
2810
  :param float amount: amount to transfer
2734
- :param str fromAccount: account to transfer from
2735
- :param str toAccount: account to transfer to
2811
+ :param str fromAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer from
2812
+ :param str toAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer to
2736
2813
  :param dict [params]: extra parameters specific to the exchange API endpoint
2737
2814
  :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
2738
2815
  """
2739
2816
  await self.load_markets()
2740
2817
  currency = self.currency(code)
2818
+ currencyId = currency['id']
2741
2819
  accountsByType = self.safe_value(self.options, 'accountsByType', {})
2742
2820
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
2743
2821
  toId = self.safe_string(accountsByType, toAccount, toAccount)
2744
- request = {
2745
- 'currency_mark': currency['id'],
2746
- 'num': self.currency_to_precision(code, amount),
2747
- 'from': fromId, # 1 = SPOT, 2 = MARGIN, 3 = OTC
2748
- 'to': toId, # 1 = SPOT, 2 = MARGIN, 3 = OTC
2749
- }
2750
- response = await self.privateSpotPostTransfer(self.extend(request, params))
2751
- #
2752
- # {
2753
- # "code": 0
2754
- # }
2755
- #
2822
+ request = {}
2823
+ fromSwap = (fromAccount == 'swap')
2824
+ toSwap = (toAccount == 'swap')
2825
+ response = None
2826
+ amountString = self.currency_to_precision(code, amount)
2827
+ if fromSwap or toSwap:
2828
+ if (fromId != '1') and (toId != '1'):
2829
+ raise ExchangeError(self.id + ' transfer() supports transferring between spot and swap, spot and margin, spot and OTC only')
2830
+ request['type'] = 1 if toSwap else 2 # 1 = spot to swap, 2 = swap to spot
2831
+ request['currency'] = currencyId
2832
+ request['transfer_amount'] = amountString
2833
+ #
2834
+ # {
2835
+ # "code": 0,
2836
+ # "data": {
2837
+ # "type": 2,
2838
+ # "currency": "USDT",
2839
+ # "transfer_amount": "5"
2840
+ # }
2841
+ # }
2842
+ #
2843
+ response = await self.privateSwapPostAccountTransfer(self.extend(request, params))
2844
+ else:
2845
+ request['currency_mark'] = currencyId
2846
+ request['num'] = amountString
2847
+ request['from'] = fromId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2848
+ request['to'] = toId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2849
+ #
2850
+ # {
2851
+ # "code": 0
2852
+ # }
2853
+ #
2854
+ response = await self.privateSpotPostTransfer(self.extend(request, params))
2756
2855
  return self.parse_transfer(response, currency)
2757
2856
 
2758
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2857
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2759
2858
  """
2760
2859
  make a withdrawal
2761
2860
  :param str code: unified currency code
@@ -2769,7 +2868,7 @@ class digifinex(Exchange, ImplicitAPI):
2769
2868
  self.check_address(address)
2770
2869
  await self.load_markets()
2771
2870
  currency = self.currency(code)
2772
- request = {
2871
+ request: dict = {
2773
2872
  # 'chain': 'ERC20', 'OMNI', 'TRC20', # required for USDT
2774
2873
  'address': address,
2775
2874
  'amount': self.currency_to_precision(code, amount),
@@ -2786,9 +2885,9 @@ class digifinex(Exchange, ImplicitAPI):
2786
2885
  #
2787
2886
  return self.parse_transaction(response, currency)
2788
2887
 
2789
- async def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2888
+ async def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[BorrowInterest]:
2790
2889
  await self.load_markets()
2791
- request = {}
2890
+ request: dict = {}
2792
2891
  market = None
2793
2892
  if symbol is not None:
2794
2893
  market = self.market(symbol)
@@ -2819,7 +2918,7 @@ class digifinex(Exchange, ImplicitAPI):
2819
2918
  interest = self.parse_borrow_interests(rows, market)
2820
2919
  return self.filter_by_currency_since_limit(interest, code, since, limit)
2821
2920
 
2822
- def parse_borrow_interest(self, info, market: Market = None):
2921
+ def parse_borrow_interest(self, info: dict, market: Market = None) -> BorrowInterest:
2823
2922
  #
2824
2923
  # {
2825
2924
  # "amount": 0.0006103,
@@ -2841,27 +2940,29 @@ class digifinex(Exchange, ImplicitAPI):
2841
2940
  currency = None if (market is None) else market['base']
2842
2941
  symbol = self.safe_symbol(marketId, market)
2843
2942
  return {
2844
- 'account': symbol,
2943
+ 'info': info,
2845
2944
  'symbol': symbol,
2846
2945
  'currency': currency,
2847
2946
  'interest': None,
2848
2947
  'interestRate': 0.001, # all interest rates on digifinex are 0.1%
2849
2948
  'amountBorrowed': self.parse_number(amountBorrowed),
2949
+ 'marginMode': None,
2850
2950
  'timestamp': None,
2851
2951
  'datetime': None,
2852
- 'info': info,
2853
2952
  }
2854
2953
 
2855
- async def fetch_cross_borrow_rate(self, code: str, params={}):
2954
+ async def fetch_cross_borrow_rate(self, code: str, params={}) -> CrossBorrowRate:
2856
2955
  """
2857
2956
  fetch the rate of interest to borrow a currency for margin trading
2858
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
2957
+
2958
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
2959
+
2859
2960
  :param str code: unified currency code
2860
2961
  :param dict [params]: extra parameters specific to the exchange API endpoint
2861
2962
  :returns dict: a `borrow rate structure <https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure>`
2862
2963
  """
2863
2964
  await self.load_markets()
2864
- request = {}
2965
+ request: dict = {}
2865
2966
  response = await self.privateSpotGetMarginAssets(self.extend(request, params))
2866
2967
  #
2867
2968
  # {
@@ -2889,10 +2990,12 @@ class digifinex(Exchange, ImplicitAPI):
2889
2990
  currency = self.currency(code)
2890
2991
  return self.parse_borrow_rate(result, currency)
2891
2992
 
2892
- async def fetch_cross_borrow_rates(self, params={}):
2993
+ async def fetch_cross_borrow_rates(self, params={}) -> CrossBorrowRates:
2893
2994
  """
2894
2995
  fetch the borrow interest rates of all currencies
2895
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
2996
+
2997
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
2998
+
2896
2999
  :param dict [params]: extra parameters specific to the exchange API endpoint
2897
3000
  :returns dict: a list of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>`
2898
3001
  """
@@ -2947,7 +3050,7 @@ class digifinex(Exchange, ImplicitAPI):
2947
3050
  # "currency": "USDT"
2948
3051
  # },
2949
3052
  #
2950
- result = {}
3053
+ result: dict = {}
2951
3054
  for i in range(0, len(info)):
2952
3055
  item = info[i]
2953
3056
  currency = self.safe_string(item, codeKey)
@@ -2956,10 +3059,12 @@ class digifinex(Exchange, ImplicitAPI):
2956
3059
  result[code] = borrowRate
2957
3060
  return result
2958
3061
 
2959
- async def fetch_funding_rate(self, symbol: str, params={}):
3062
+ async def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
2960
3063
  """
2961
3064
  fetch the current funding rate
2962
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3065
+
3066
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3067
+
2963
3068
  :param str symbol: unified market symbol
2964
3069
  :param dict [params]: extra parameters specific to the exchange API endpoint
2965
3070
  :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
@@ -2968,7 +3073,7 @@ class digifinex(Exchange, ImplicitAPI):
2968
3073
  market = self.market(symbol)
2969
3074
  if not market['swap']:
2970
3075
  raise BadSymbol(self.id + ' fetchFundingRate() supports swap contracts only')
2971
- request = {
3076
+ request: dict = {
2972
3077
  'instrument_id': market['id'],
2973
3078
  }
2974
3079
  response = await self.publicSwapGetPublicFundingRate(self.extend(request, params))
@@ -2984,10 +3089,22 @@ class digifinex(Exchange, ImplicitAPI):
2984
3089
  # }
2985
3090
  # }
2986
3091
  #
2987
- data = self.safe_value(response, 'data', {})
3092
+ data = self.safe_dict(response, 'data', {})
2988
3093
  return self.parse_funding_rate(data, market)
2989
3094
 
2990
- def parse_funding_rate(self, contract, market: Market = None):
3095
+ async def fetch_funding_interval(self, symbol: str, params={}) -> FundingRate:
3096
+ """
3097
+ fetch the current funding rate interval
3098
+
3099
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3100
+
3101
+ :param str symbol: unified market symbol
3102
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3103
+ :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
3104
+ """
3105
+ return await self.fetch_funding_rate(symbol, params)
3106
+
3107
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
2991
3108
  #
2992
3109
  # {
2993
3110
  # "instrument_id": "BTCUSDTPERP",
@@ -3000,6 +3117,9 @@ class digifinex(Exchange, ImplicitAPI):
3000
3117
  marketId = self.safe_string(contract, 'instrument_id')
3001
3118
  timestamp = self.safe_integer(contract, 'funding_time')
3002
3119
  nextTimestamp = self.safe_integer(contract, 'next_funding_time')
3120
+ fundingTimeString = self.safe_string(contract, 'funding_time')
3121
+ nextFundingTimeString = self.safe_string(contract, 'next_funding_time')
3122
+ millisecondsInterval = Precise.string_sub(nextFundingTimeString, fundingTimeString)
3003
3123
  return {
3004
3124
  'info': contract,
3005
3125
  'symbol': self.safe_symbol(marketId, market),
@@ -3012,14 +3132,25 @@ class digifinex(Exchange, ImplicitAPI):
3012
3132
  'fundingRate': self.safe_number(contract, 'funding_rate'),
3013
3133
  'fundingTimestamp': timestamp,
3014
3134
  'fundingDatetime': self.iso8601(timestamp),
3015
- 'nextFundingRate': self.safe_string(contract, 'next_funding_rate'),
3135
+ 'nextFundingRate': self.safe_number(contract, 'next_funding_rate'),
3016
3136
  'nextFundingTimestamp': nextTimestamp,
3017
3137
  'nextFundingDatetime': self.iso8601(nextTimestamp),
3018
3138
  'previousFundingRate': None,
3019
3139
  'previousFundingTimestamp': None,
3020
3140
  'previousFundingDatetime': None,
3141
+ 'interval': self.parse_funding_interval(millisecondsInterval),
3021
3142
  }
3022
3143
 
3144
+ def parse_funding_interval(self, interval):
3145
+ intervals: dict = {
3146
+ '3600000': '1h',
3147
+ '14400000': '4h',
3148
+ '28800000': '8h',
3149
+ '57600000': '16h',
3150
+ '86400000': '24h',
3151
+ }
3152
+ return self.safe_string(intervals, interval, interval)
3153
+
3023
3154
  async def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3024
3155
  """
3025
3156
  fetches historical funding rate prices
@@ -3035,7 +3166,7 @@ class digifinex(Exchange, ImplicitAPI):
3035
3166
  market = self.market(symbol)
3036
3167
  if not market['swap']:
3037
3168
  raise BadSymbol(self.id + ' fetchFundingRateHistory() supports swap contracts only')
3038
- request = {
3169
+ request: dict = {
3039
3170
  'instrument_id': market['id'],
3040
3171
  }
3041
3172
  if since is not None:
@@ -3076,10 +3207,12 @@ class digifinex(Exchange, ImplicitAPI):
3076
3207
  sorted = self.sort_by(rates, 'timestamp')
3077
3208
  return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
3078
3209
 
3079
- async def fetch_trading_fee(self, symbol: str, params={}):
3210
+ async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
3080
3211
  """
3081
3212
  fetch the trading fees for a market
3082
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3213
+
3214
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3215
+
3083
3216
  :param str symbol: unified market symbol
3084
3217
  :param dict [params]: extra parameters specific to the exchange API endpoint
3085
3218
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3088,7 +3221,7 @@ class digifinex(Exchange, ImplicitAPI):
3088
3221
  market = self.market(symbol)
3089
3222
  if not market['swap']:
3090
3223
  raise BadRequest(self.id + ' fetchTradingFee() supports swap markets only')
3091
- request = {
3224
+ request: dict = {
3092
3225
  'instrument_id': market['id'],
3093
3226
  }
3094
3227
  response = await self.privateSwapGetAccountTradingFeeRate(self.extend(request, params))
@@ -3105,7 +3238,7 @@ class digifinex(Exchange, ImplicitAPI):
3105
3238
  data = self.safe_value(response, 'data', {})
3106
3239
  return self.parse_trading_fee(data, market)
3107
3240
 
3108
- def parse_trading_fee(self, fee, market: Market = None):
3241
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
3109
3242
  #
3110
3243
  # {
3111
3244
  # "instrument_id": "BTCUSDTPERP",
@@ -3120,20 +3253,24 @@ class digifinex(Exchange, ImplicitAPI):
3120
3253
  'symbol': symbol,
3121
3254
  'maker': self.safe_number(fee, 'maker_fee_rate'),
3122
3255
  'taker': self.safe_number(fee, 'taker_fee_rate'),
3256
+ 'percentage': None,
3257
+ 'tierBased': None,
3123
3258
  }
3124
3259
 
3125
3260
  async def fetch_positions(self, symbols: Strings = None, params={}):
3126
3261
  """
3127
3262
  fetch all open positions
3128
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3129
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3263
+
3264
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3265
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3266
+
3130
3267
  :param str[]|None symbols: list of unified market symbols
3131
3268
  :param dict [params]: extra parameters specific to the exchange API endpoint
3132
3269
  :returns dict[]: a list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
3133
3270
  """
3134
3271
  await self.load_markets()
3135
3272
  symbols = self.market_symbols(symbols)
3136
- request = {}
3273
+ request: dict = {}
3137
3274
  market = None
3138
3275
  marketType = None
3139
3276
  if symbols is not None:
@@ -3222,8 +3359,10 @@ class digifinex(Exchange, ImplicitAPI):
3222
3359
 
3223
3360
  async def fetch_position(self, symbol: str, params={}):
3224
3361
  """
3225
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3226
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3362
+
3363
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3364
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3365
+
3227
3366
  fetch data on a single open contract trade position
3228
3367
  :param str symbol: unified market symbol of the market the position is held in
3229
3368
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3231,7 +3370,7 @@ class digifinex(Exchange, ImplicitAPI):
3231
3370
  """
3232
3371
  await self.load_markets()
3233
3372
  market = self.market(symbol)
3234
- request = {}
3373
+ request: dict = {}
3235
3374
  marketType = None
3236
3375
  marketType, params = self.handle_market_type_and_params('fetchPosition', market, params)
3237
3376
  marginMode, query = self.handle_margin_mode_and_params('fetchPosition', params)
@@ -3307,7 +3446,7 @@ class digifinex(Exchange, ImplicitAPI):
3307
3446
  position['marginRatio'] = self.safe_number(response, 'margin_rate')
3308
3447
  return position
3309
3448
 
3310
- def parse_position(self, position, market: Market = None):
3449
+ def parse_position(self, position: dict, market: Market = None):
3311
3450
  #
3312
3451
  # swap
3313
3452
  #
@@ -3391,7 +3530,9 @@ class digifinex(Exchange, ImplicitAPI):
3391
3530
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
3392
3531
  """
3393
3532
  set the level of leverage for a market
3394
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3533
+
3534
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3535
+
3395
3536
  :param float leverage: the rate of leverage
3396
3537
  :param str symbol: unified market symbol
3397
3538
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3407,7 +3548,7 @@ class digifinex(Exchange, ImplicitAPI):
3407
3548
  raise BadSymbol(self.id + ' setLeverage() supports swap contracts only')
3408
3549
  if (leverage < 1) or (leverage > 100):
3409
3550
  raise BadRequest(self.id + ' leverage should be between 1 and 100')
3410
- request = {
3551
+ request: dict = {
3411
3552
  'instrument_id': market['id'],
3412
3553
  'leverage': leverage,
3413
3554
  }
@@ -3437,10 +3578,12 @@ class digifinex(Exchange, ImplicitAPI):
3437
3578
  # }
3438
3579
  #
3439
3580
 
3440
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
3581
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3441
3582
  """
3442
3583
  fetch the transfer history, only transfers between spot and swap accounts are supported
3443
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#transferrecord
3584
+
3585
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#transferrecord
3586
+
3444
3587
  :param str code: unified currency code of the currency transferred
3445
3588
  :param int [since]: the earliest time in ms to fetch transfers for
3446
3589
  :param int [limit]: the maximum number of transfers to retrieve
@@ -3449,7 +3592,7 @@ class digifinex(Exchange, ImplicitAPI):
3449
3592
  """
3450
3593
  await self.load_markets()
3451
3594
  currency = None
3452
- request = {}
3595
+ request: dict = {}
3453
3596
  if code is not None:
3454
3597
  currency = self.safe_currency_code(code)
3455
3598
  request['currency'] = currency['id']
@@ -3473,12 +3616,14 @@ class digifinex(Exchange, ImplicitAPI):
3473
3616
  # ]
3474
3617
  # }
3475
3618
  #
3476
- transfers = self.safe_value(response, 'data', [])
3619
+ transfers = self.safe_list(response, 'data', [])
3477
3620
  return self.parse_transfers(transfers, currency, since, limit)
3478
3621
 
3479
- async def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
3622
+ async def fetch_leverage_tiers(self, symbols: Strings = None, params={}) -> LeverageTiers:
3480
3623
  """
3481
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3624
+
3625
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3626
+
3482
3627
  retrieve information on the maximum leverage, for different trade sizes
3483
3628
  :param str[]|None symbols: a list of unified market symbols
3484
3629
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3517,56 +3662,14 @@ class digifinex(Exchange, ImplicitAPI):
3517
3662
  #
3518
3663
  data = self.safe_value(response, 'data', [])
3519
3664
  symbols = self.market_symbols(symbols)
3520
- return self.parse_leverage_tiers(data, symbols, 'symbol')
3521
-
3522
- def parse_leverage_tiers(self, response, symbols: Strings = None, marketIdKey=None):
3523
- #
3524
- # [
3525
- # {
3526
- # "instrument_id": "BTCUSDTPERP",
3527
- # "type": "REAL",
3528
- # "contract_type": "PERPETUAL",
3529
- # "base_currency": "BTC",
3530
- # "quote_currency": "USDT",
3531
- # "clear_currency": "USDT",
3532
- # "contract_value": "0.001",
3533
- # "contract_value_currency": "BTC",
3534
- # "is_inverse": False,
3535
- # "is_trading": True,
3536
- # "status": "ONLINE",
3537
- # "price_precision": 1,
3538
- # "tick_size": "0.1",
3539
- # "min_order_amount": 1,
3540
- # "open_max_limits": [
3541
- # {
3542
- # "leverage": "50",
3543
- # "max_limit": "1000000"
3544
- # }
3545
- # ]
3546
- # },
3547
- # ]
3548
- #
3549
- tiers = {}
3550
- result = {}
3551
- for i in range(0, len(response)):
3552
- entry = response[i]
3553
- marketId = self.safe_string(entry, 'instrument_id')
3554
- market = self.safe_market(marketId)
3555
- symbol = self.safe_symbol(marketId, market)
3556
- symbolsLength = 0
3557
- tiers[symbol] = self.parse_market_leverage_tiers(response[i], market)
3558
- if symbols is not None:
3559
- symbolsLength = len(symbols)
3560
- if self.in_array(symbol, symbols):
3561
- result[symbol] = self.parse_market_leverage_tiers(response[i], market)
3562
- if symbol is not None and (symbolsLength == 0 or self.in_array(symbols, symbol)):
3563
- result[symbol] = self.parse_market_leverage_tiers(response[i], market)
3564
- return result
3665
+ return self.parse_leverage_tiers(data, symbols, 'instrument_id')
3565
3666
 
3566
- async def fetch_market_leverage_tiers(self, symbol: str, params={}):
3667
+ async def fetch_market_leverage_tiers(self, symbol: str, params={}) -> List[LeverageTier]:
3567
3668
  """
3568
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3569
3669
  retrieve information on the maximum leverage, for different trade sizes for a single market
3670
+
3671
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3672
+
3570
3673
  :param str symbol: unified market symbol
3571
3674
  :param dict [params]: extra parameters specific to the exchange API endpoint
3572
3675
  :returns dict: a `leverage tiers structure <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`
@@ -3575,7 +3678,7 @@ class digifinex(Exchange, ImplicitAPI):
3575
3678
  market = self.market(symbol)
3576
3679
  if not market['swap']:
3577
3680
  raise BadRequest(self.id + ' fetchMarketLeverageTiers() supports swap markets only')
3578
- request = {
3681
+ request: dict = {
3579
3682
  'instrument_id': market['id'],
3580
3683
  }
3581
3684
  response = await self.publicSwapGetPublicInstrument(self.extend(request, params))
@@ -3609,7 +3712,7 @@ class digifinex(Exchange, ImplicitAPI):
3609
3712
  data = self.safe_value(response, 'data', {})
3610
3713
  return self.parse_market_leverage_tiers(data, market)
3611
3714
 
3612
- def parse_market_leverage_tiers(self, info, market: Market = None):
3715
+ def parse_market_leverage_tiers(self, info, market: Market = None) -> List[LeverageTier]:
3613
3716
  #
3614
3717
  # {
3615
3718
  # "instrument_id": "BTCUSDTPERP",
@@ -3639,9 +3742,10 @@ class digifinex(Exchange, ImplicitAPI):
3639
3742
  for i in range(0, len(brackets)):
3640
3743
  tier = brackets[i]
3641
3744
  marketId = self.safe_string(info, 'instrument_id')
3642
- market = self.safe_market(marketId)
3745
+ market = self.safe_market(marketId, market)
3643
3746
  tiers.append({
3644
3747
  'tier': self.sum(i, 1),
3748
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3645
3749
  'currency': market['settle'],
3646
3750
  'minNotional': None,
3647
3751
  'maxNotional': self.safe_number(tier, 'max_limit'),
@@ -3653,7 +3757,7 @@ class digifinex(Exchange, ImplicitAPI):
3653
3757
 
3654
3758
  def handle_margin_mode_and_params(self, methodName, params={}, defaultValue=None):
3655
3759
  """
3656
- * @ignore
3760
+ @ignore
3657
3761
  marginMode specified by params["marginMode"], self.options["marginMode"], self.options["defaultMarginMode"], params["margin"] = True or self.options["defaultType"] = 'margin'
3658
3762
  :param dict [params]: extra parameters specific to the exchange API endpoint
3659
3763
  :returns Array: the marginMode in lowercase
@@ -3673,7 +3777,9 @@ class digifinex(Exchange, ImplicitAPI):
3673
3777
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
3674
3778
  """
3675
3779
  fetch deposit and withdraw fees
3676
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3780
+
3781
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3782
+
3677
3783
  :param str[]|None codes: not used by fetchDepositWithdrawFees()
3678
3784
  :param dict [params]: extra parameters specific to the exchange API endpoint
3679
3785
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3709,7 +3815,7 @@ class digifinex(Exchange, ImplicitAPI):
3709
3815
  # "code": 200,
3710
3816
  # }
3711
3817
  #
3712
- data = self.safe_value(response, 'data')
3818
+ data = self.safe_list(response, 'data')
3713
3819
  return self.parse_deposit_withdraw_fees(data, codes)
3714
3820
 
3715
3821
  def parse_deposit_withdraw_fees(self, response, codes=None, currencyIdKey=None):
@@ -3739,7 +3845,7 @@ class digifinex(Exchange, ImplicitAPI):
3739
3845
  # },
3740
3846
  # ]
3741
3847
  #
3742
- depositWithdrawFees = {}
3848
+ depositWithdrawFees: dict = {}
3743
3849
  codes = self.market_codes(codes)
3744
3850
  for i in range(0, len(response)):
3745
3851
  entry = response[i]
@@ -3753,11 +3859,11 @@ class digifinex(Exchange, ImplicitAPI):
3753
3859
  depositWithdrawFees[code]['info'].append(entry)
3754
3860
  networkId = self.safe_string(entry, 'chain')
3755
3861
  withdrawFee = self.safe_value(entry, 'min_withdraw_fee')
3756
- withdrawResult = {
3862
+ withdrawResult: dict = {
3757
3863
  'fee': withdrawFee,
3758
3864
  'percentage': False if (withdrawFee is not None) else None,
3759
3865
  }
3760
- depositResult = {
3866
+ depositResult: dict = {
3761
3867
  'fee': None,
3762
3868
  'percentage': None,
3763
3869
  }
@@ -3777,10 +3883,12 @@ class digifinex(Exchange, ImplicitAPI):
3777
3883
  depositWithdrawFees[code] = self.assign_default_deposit_withdraw_fees(depositWithdrawFees[code], currency)
3778
3884
  return depositWithdrawFees
3779
3885
 
3780
- async def add_margin(self, symbol: str, amount, params={}):
3886
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3781
3887
  """
3782
3888
  add margin to a position
3783
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
3889
+
3890
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
3891
+
3784
3892
  :param str symbol: unified market symbol
3785
3893
  :param float amount: amount of margin to add
3786
3894
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3791,10 +3899,12 @@ class digifinex(Exchange, ImplicitAPI):
3791
3899
  self.check_required_argument('addMargin', side, 'side', ['long', 'short'])
3792
3900
  return await self.modify_margin_helper(symbol, amount, 1, params)
3793
3901
 
3794
- async def reduce_margin(self, symbol: str, amount, params={}):
3902
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3795
3903
  """
3796
3904
  remove margin from a position
3797
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
3905
+
3906
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
3907
+
3798
3908
  :param str symbol: unified market symbol
3799
3909
  :param float amount: the amount of margin to remove
3800
3910
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3805,11 +3915,11 @@ class digifinex(Exchange, ImplicitAPI):
3805
3915
  self.check_required_argument('reduceMargin', side, 'side', ['long', 'short'])
3806
3916
  return await self.modify_margin_helper(symbol, amount, 2, params)
3807
3917
 
3808
- async def modify_margin_helper(self, symbol: str, amount, type, params={}):
3918
+ async def modify_margin_helper(self, symbol: str, amount, type, params={}) -> MarginModification:
3809
3919
  await self.load_markets()
3810
3920
  side = self.safe_string(params, 'side')
3811
3921
  market = self.market(symbol)
3812
- request = {
3922
+ request: dict = {
3813
3923
  'instrument_id': market['id'],
3814
3924
  'amount': self.number_to_string(amount),
3815
3925
  'type': type,
@@ -3834,7 +3944,7 @@ class digifinex(Exchange, ImplicitAPI):
3834
3944
  'status': status,
3835
3945
  })
3836
3946
 
3837
- def parse_margin_modification(self, data, market: Market = None):
3947
+ def parse_margin_modification(self, data: dict, market: Market = None) -> MarginModification:
3838
3948
  #
3839
3949
  # {
3840
3950
  # "instrument_id": "BTCUSDTPERP",
@@ -3847,18 +3957,23 @@ class digifinex(Exchange, ImplicitAPI):
3847
3957
  rawType = self.safe_integer(data, 'type')
3848
3958
  return {
3849
3959
  'info': data,
3960
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3850
3961
  'type': 'add' if (rawType == 1) else 'reduce',
3962
+ 'marginMode': 'isolated',
3851
3963
  'amount': self.safe_number(data, 'amount'),
3852
3964
  'total': None,
3853
3965
  'code': market['settle'],
3854
- 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3855
3966
  'status': None,
3967
+ 'timestamp': None,
3968
+ 'datetime': None,
3856
3969
  }
3857
3970
 
3858
3971
  async def fetch_funding_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3859
3972
  """
3860
3973
  fetch the history of funding payments paid and received on self account
3861
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#funding-fee
3974
+
3975
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#funding-fee
3976
+
3862
3977
  :param str [symbol]: unified market symbol
3863
3978
  :param int [since]: the earliest time in ms to fetch funding history for
3864
3979
  :param int [limit]: the maximum number of funding history structures to retrieve
@@ -3867,7 +3982,7 @@ class digifinex(Exchange, ImplicitAPI):
3867
3982
  :returns dict: a `funding history structure <https://docs.ccxt.com/#/?id=funding-history-structure>`
3868
3983
  """
3869
3984
  await self.load_markets()
3870
- request = {}
3985
+ request: dict = {}
3871
3986
  request, params = self.handle_until_option('end_timestamp', request, params)
3872
3987
  market = None
3873
3988
  if symbol is not None:
@@ -3891,7 +4006,7 @@ class digifinex(Exchange, ImplicitAPI):
3891
4006
  # ]
3892
4007
  # }
3893
4008
  #
3894
- data = self.safe_value(response, 'data', [])
4009
+ data = self.safe_list(response, 'data', [])
3895
4010
  return self.parse_incomes(data, market, since, limit)
3896
4011
 
3897
4012
  def parse_income(self, income, market: Market = None):
@@ -3919,7 +4034,9 @@ class digifinex(Exchange, ImplicitAPI):
3919
4034
  async def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
3920
4035
  """
3921
4036
  set margin mode to 'cross' or 'isolated'
3922
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4037
+
4038
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4039
+
3923
4040
  :param str marginMode: 'cross' or 'isolated'
3924
4041
  :param str symbol: unified market symbol
3925
4042
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3932,7 +4049,7 @@ class digifinex(Exchange, ImplicitAPI):
3932
4049
  marginMode = marginMode.lower()
3933
4050
  if marginMode == 'cross':
3934
4051
  marginMode = 'crossed'
3935
- request = {
4052
+ request: dict = {
3936
4053
  'instrument_id': market['id'],
3937
4054
  'margin_mode': marginMode,
3938
4055
  }
@@ -3985,7 +4102,7 @@ class digifinex(Exchange, ImplicitAPI):
3985
4102
  url += '?' + urlencoded
3986
4103
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
3987
4104
 
3988
- def handle_errors(self, statusCode, statusText, url, method, responseHeaders, responseBody, response, requestHeaders, requestBody):
4105
+ def handle_errors(self, statusCode: int, statusText: str, url: str, method: str, responseHeaders: dict, responseBody, response, requestHeaders, requestBody):
3989
4106
  if not response:
3990
4107
  return None # fall back to default error handler
3991
4108
  code = self.safe_string(response, 'code')