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