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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3205 -937
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1525 -573
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +223 -97
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3205 -937
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1525 -573
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +223 -97
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +143 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/top_level.txt +0 -0
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',
@@ -248,6 +253,109 @@ class digifinex(Exchange, ImplicitAPI):
248
253
  },
249
254
  },
250
255
  },
256
+ 'features': {
257
+ 'default': {
258
+ 'sandbox': False,
259
+ 'createOrder': {
260
+ 'marginMode': True,
261
+ 'triggerPrice': False,
262
+ 'triggerPriceType': None,
263
+ 'triggerDirection': False,
264
+ 'stopLossPrice': False,
265
+ 'takeProfitPrice': False,
266
+ 'attachedStopLossTakeProfit': None,
267
+ 'timeInForce': {
268
+ 'IOC': False,
269
+ 'FOK': False,
270
+ 'PO': True,
271
+ 'GTD': False,
272
+ },
273
+ 'hedged': False,
274
+ 'selfTradePrevention': False,
275
+ 'trailing': False,
276
+ 'leverage': False,
277
+ 'marketBuyByCost': False,
278
+ 'marketBuyRequiresPrice': False,
279
+ 'iceberg': False,
280
+ },
281
+ 'createOrders': {
282
+ 'max': 10,
283
+ 'marginMode': True,
284
+ },
285
+ 'fetchMyTrades': {
286
+ 'marginMode': True,
287
+ 'limit': 500,
288
+ 'daysBack': 100000, # todo
289
+ 'untilDays': 30,
290
+ },
291
+ 'fetchOrder': {
292
+ 'marginMode': True,
293
+ 'trigger': False,
294
+ 'trailing': False,
295
+ 'marketType': True,
296
+ },
297
+ 'fetchOpenOrders': {
298
+ 'marginMode': True,
299
+ 'limit': None,
300
+ 'trigger': False,
301
+ 'trailing': False,
302
+ },
303
+ 'fetchOrders': {
304
+ 'marginMode': True,
305
+ 'limit': 100,
306
+ 'daysBack': 100000, # todo
307
+ 'untilDays': 30,
308
+ 'trigger': False,
309
+ 'trailing': False,
310
+ },
311
+ 'fetchClosedOrders': None,
312
+ 'fetchOHLCV': {
313
+ 'limit': 500,
314
+ },
315
+ },
316
+ 'spot': {
317
+ 'extends': 'default',
318
+ },
319
+ 'forDerivatives': {
320
+ 'extends': 'default',
321
+ 'createOrders': {
322
+ 'max': 20,
323
+ 'marginMode': False,
324
+ },
325
+ 'fetchMyTrades': {
326
+ 'marginMode': False,
327
+ 'limit': 100,
328
+ 'daysBack': 100000, # todo
329
+ 'untilDays': 100000, # todo
330
+ },
331
+ 'fetchOrder': {
332
+ 'marginMode': False,
333
+ },
334
+ 'fetchOpenOrders': {
335
+ 'marginMode': False,
336
+ 'limit': 100,
337
+ },
338
+ 'fetchOrders': {
339
+ 'marginMode': False,
340
+ 'daysBack': 100000, # todo
341
+ },
342
+ 'fetchOHLCV': {
343
+ 'limit': 100,
344
+ },
345
+ },
346
+ 'swap': {
347
+ 'linear': {
348
+ 'extends': 'forDerivatives',
349
+ },
350
+ 'inverse': {
351
+ 'extends': 'forDerivatives',
352
+ },
353
+ },
354
+ 'future': {
355
+ 'linear': None,
356
+ 'inverse': None,
357
+ },
358
+ },
251
359
  'fees': {
252
360
  'trading': {
253
361
  'tierBased': True,
@@ -365,7 +473,7 @@ class digifinex(Exchange, ImplicitAPI):
365
473
  },
366
474
  })
367
475
 
368
- def fetch_currencies(self, params={}):
476
+ def fetch_currencies(self, params={}) -> Currencies:
369
477
  """
370
478
  fetches all available currencies on an exchange
371
479
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -410,7 +518,7 @@ class digifinex(Exchange, ImplicitAPI):
410
518
  # }
411
519
  #
412
520
  data = self.safe_value(response, 'data', [])
413
- result = {}
521
+ result: dict = {}
414
522
  for i in range(0, len(data)):
415
523
  currency = data[i]
416
524
  id = self.safe_string(currency, 'currency')
@@ -433,7 +541,7 @@ class digifinex(Exchange, ImplicitAPI):
433
541
  networkCode = None
434
542
  if networkId is not None:
435
543
  networkCode = self.network_id_to_code(networkId)
436
- network = {
544
+ network: dict = {
437
545
  'info': currency,
438
546
  'id': networkId,
439
547
  'network': networkCode,
@@ -522,7 +630,7 @@ class digifinex(Exchange, ImplicitAPI):
522
630
  result[code]['precision'] = precision if (result[code]['precision'] is None) else max(result[code]['precision'], precision)
523
631
  return result
524
632
 
525
- def fetch_markets(self, params={}):
633
+ def fetch_markets(self, params={}) -> List[Market]:
526
634
  """
527
635
  retrieves data on all markets for digifinex
528
636
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -788,7 +896,7 @@ class digifinex(Exchange, ImplicitAPI):
788
896
  # "time_stamp": 1661487402396
789
897
  # }
790
898
  #
791
- result = {'info': response}
899
+ result: dict = {'info': response}
792
900
  for i in range(0, len(response)):
793
901
  balance = response[i]
794
902
  currencyId = self.safe_string(balance, 'currency')
@@ -805,9 +913,11 @@ class digifinex(Exchange, ImplicitAPI):
805
913
  def fetch_balance(self, params={}) -> Balances:
806
914
  """
807
915
  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
916
+
917
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-account-assets
918
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
919
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accountbalance
920
+
811
921
  :param dict [params]: extra parameters specific to the exchange API endpoint
812
922
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
813
923
  """
@@ -868,8 +978,10 @@ class digifinex(Exchange, ImplicitAPI):
868
978
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
869
979
  """
870
980
  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
981
+
982
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-orderbook
983
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderbook
984
+
873
985
  :param str symbol: unified symbol of the market to fetch the order book for
874
986
  :param int [limit]: the maximum amount of order book entries to return
875
987
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -878,7 +990,7 @@ class digifinex(Exchange, ImplicitAPI):
878
990
  self.load_markets()
879
991
  market = self.market(symbol)
880
992
  marketType, query = self.handle_market_type_and_params('fetchOrderBook', market, params)
881
- request = {}
993
+ request: dict = {}
882
994
  if limit is not None:
883
995
  request['limit'] = limit
884
996
  response = None
@@ -939,8 +1051,10 @@ class digifinex(Exchange, ImplicitAPI):
939
1051
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
940
1052
  """
941
1053
  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
1054
+
1055
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1056
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tickers
1057
+
944
1058
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
945
1059
  :param dict [params]: extra parameters specific to the exchange API endpoint
946
1060
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -953,7 +1067,7 @@ class digifinex(Exchange, ImplicitAPI):
953
1067
  market = self.market(first)
954
1068
  type = None
955
1069
  type, params = self.handle_market_type_and_params('fetchTickers', market, params)
956
- request = {}
1070
+ request: dict = {}
957
1071
  response = None
958
1072
  if type == 'swap':
959
1073
  response = self.publicSwapGetPublicTickers(self.extend(request, params))
@@ -1007,7 +1121,7 @@ class digifinex(Exchange, ImplicitAPI):
1007
1121
  # ]
1008
1122
  # }
1009
1123
  #
1010
- result = {}
1124
+ result: dict = {}
1011
1125
  tickers = self.safe_value_2(response, 'ticker', 'data', [])
1012
1126
  date = self.safe_integer(response, 'date')
1013
1127
  for i in range(0, len(tickers)):
@@ -1022,15 +1136,17 @@ class digifinex(Exchange, ImplicitAPI):
1022
1136
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1023
1137
  """
1024
1138
  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
1139
+
1140
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1141
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#ticker
1142
+
1027
1143
  :param str symbol: unified symbol of the market to fetch the ticker for
1028
1144
  :param dict [params]: extra parameters specific to the exchange API endpoint
1029
1145
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1030
1146
  """
1031
1147
  self.load_markets()
1032
1148
  market = self.market(symbol)
1033
- request = {}
1149
+ request: dict = {}
1034
1150
  response = None
1035
1151
  if market['swap']:
1036
1152
  request['instrument_id'] = market['id']
@@ -1094,7 +1210,7 @@ class digifinex(Exchange, ImplicitAPI):
1094
1210
  result = self.extend({'date': date}, firstTicker)
1095
1211
  return self.parse_ticker(result, market)
1096
1212
 
1097
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1213
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1098
1214
  #
1099
1215
  # spot: fetchTicker, fetchTickers
1100
1216
  #
@@ -1163,10 +1279,12 @@ class digifinex(Exchange, ImplicitAPI):
1163
1279
  'average': None,
1164
1280
  'baseVolume': self.safe_string_2(ticker, 'vol', 'volume_24h'),
1165
1281
  'quoteVolume': self.safe_string(ticker, 'base_vol'),
1282
+ 'markPrice': self.safe_string(ticker, 'mark_price'),
1283
+ 'indexPrice': indexPrice,
1166
1284
  'info': ticker,
1167
1285
  }, market)
1168
1286
 
1169
- def parse_trade(self, trade, market: Market = None) -> Trade:
1287
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1170
1288
  #
1171
1289
  # spot: fetchTrades
1172
1290
  #
@@ -1335,8 +1453,10 @@ class digifinex(Exchange, ImplicitAPI):
1335
1453
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1336
1454
  """
1337
1455
  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
1456
+
1457
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-recent-trades
1458
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recenttrades
1459
+
1340
1460
  :param str symbol: unified symbol of the market to fetch trades for
1341
1461
  :param int [since]: timestamp in ms of the earliest trade to fetch
1342
1462
  :param int [limit]: the maximum amount of trades to fetch
@@ -1345,7 +1465,7 @@ class digifinex(Exchange, ImplicitAPI):
1345
1465
  """
1346
1466
  self.load_markets()
1347
1467
  market = self.market(symbol)
1348
- request = {}
1468
+ request: dict = {}
1349
1469
  if limit is not None:
1350
1470
  request['limit'] = min(limit, 100) if market['swap'] else limit
1351
1471
  response = None
@@ -1396,7 +1516,7 @@ class digifinex(Exchange, ImplicitAPI):
1396
1516
  # ]
1397
1517
  # }
1398
1518
  #
1399
- data = self.safe_value(response, 'data', [])
1519
+ data = self.safe_list(response, 'data', [])
1400
1520
  return self.parse_trades(data, market, since, limit)
1401
1521
 
1402
1522
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
@@ -1432,39 +1552,53 @@ class digifinex(Exchange, ImplicitAPI):
1432
1552
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1433
1553
  """
1434
1554
  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
1555
+
1556
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-candles-data
1557
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recentcandle
1558
+
1437
1559
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1438
1560
  :param str timeframe: the length of time each candle represents
1439
1561
  :param int [since]: timestamp in ms of the earliest candle to fetch
1440
1562
  :param int [limit]: the maximum amount of candles to fetch
1441
1563
  :param dict [params]: extra parameters specific to the exchange API endpoint
1564
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
1442
1565
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
1443
1566
  """
1444
1567
  self.load_markets()
1445
1568
  market = self.market(symbol)
1446
- request = {}
1569
+ request: dict = {}
1447
1570
  response = None
1448
1571
  if market['swap']:
1449
1572
  request['instrument_id'] = market['id']
1450
1573
  request['granularity'] = timeframe
1451
1574
  if limit is not None:
1452
- request['limit'] = limit
1575
+ request['limit'] = min(limit, 100)
1453
1576
  response = self.publicSwapGetPublicCandles(self.extend(request, params))
1454
1577
  else:
1578
+ until = self.safe_integer(params, 'until')
1455
1579
  request['symbol'] = market['id']
1456
1580
  request['period'] = self.safe_string(self.timeframes, timeframe, timeframe)
1457
- if since is not None:
1458
- startTime = self.parse_to_int(since / 1000)
1581
+ startTime = since
1582
+ duration = self.parse_timeframe(timeframe)
1583
+ if startTime is None:
1584
+ if (limit is not None) or (until is not None):
1585
+ endTime = until if (until is not None) else self.milliseconds()
1586
+ startLimit = limit if (limit is not None) else 200
1587
+ startTime = endTime - (startLimit * duration * 1000)
1588
+ if startTime is not None:
1589
+ startTime = self.parse_to_int(startTime / 1000)
1459
1590
  request['start_time'] = startTime
1460
- if limit is not None:
1461
- duration = self.parse_timeframe(timeframe)
1462
- request['end_time'] = self.sum(startTime, limit * duration)
1463
- elif limit is not None:
1464
- endTime = self.seconds()
1465
- duration = self.parse_timeframe(timeframe)
1466
- auxLimit = limit # in c# -limit is mutating the arg
1467
- request['start_time'] = self.sum(endTime, -auxLimit * duration)
1591
+ if (limit is not None) or (until is not None):
1592
+ if until is not None:
1593
+ endByUntil = self.parse_to_int(until / 1000)
1594
+ if limit is not None:
1595
+ endByLimit = self.sum(startTime, limit * duration)
1596
+ request['end_time'] = min(endByLimit, endByUntil)
1597
+ else:
1598
+ request['end_time'] = endByUntil
1599
+ else:
1600
+ request['end_time'] = self.sum(startTime, limit * duration)
1601
+ params = self.omit(params, 'until')
1468
1602
  response = self.publicSpotGetKline(self.extend(request, params))
1469
1603
  #
1470
1604
  # spot
@@ -1504,13 +1638,15 @@ class digifinex(Exchange, ImplicitAPI):
1504
1638
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1505
1639
  """
1506
1640
  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
1641
+
1642
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1643
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderplace
1644
+
1509
1645
  :param str symbol: unified symbol of the market to create an order in
1510
1646
  :param str type: 'market' or 'limit'
1511
1647
  :param str side: 'buy' or 'sell'
1512
1648
  :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
1649
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1514
1650
  :param dict [params]: extra parameters specific to the exchange API endpoint
1515
1651
  :param str [params.timeInForce]: "GTC", "IOC", "FOK", or "PO"
1516
1652
  :param bool [params.postOnly]: True or False
@@ -1558,8 +1694,10 @@ class digifinex(Exchange, ImplicitAPI):
1558
1694
  def create_orders(self, orders: List[OrderRequest], params={}):
1559
1695
  """
1560
1696
  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
1697
+
1698
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1699
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1700
+
1563
1701
  :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
1702
  :param dict [params]: extra parameters specific to the exchange API endpoint
1565
1703
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1592,7 +1730,7 @@ class digifinex(Exchange, ImplicitAPI):
1592
1730
  orderRequest = self.create_order_request(marketId, type, side, amount, price, orderParams)
1593
1731
  ordersRequests.append(orderRequest)
1594
1732
  market = self.market(symbol)
1595
- request = {}
1733
+ request: dict = {}
1596
1734
  response = None
1597
1735
  if market['swap']:
1598
1736
  response = self.privateSwapPostTradeBatchOrder(ordersRequests)
@@ -1630,7 +1768,7 @@ class digifinex(Exchange, ImplicitAPI):
1630
1768
  result = []
1631
1769
  for i in range(0, len(orders)):
1632
1770
  rawOrder = orders[i]
1633
- individualOrder = {}
1771
+ individualOrder: dict = {}
1634
1772
  individualOrder['order_id'] = data[i]
1635
1773
  individualOrder['instrument_id'] = market['id']
1636
1774
  individualOrder['amount'] = self.safe_number(rawOrder, 'amount')
@@ -1640,13 +1778,13 @@ class digifinex(Exchange, ImplicitAPI):
1640
1778
 
1641
1779
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1642
1780
  """
1643
- * @ignore
1781
+ @ignore
1644
1782
  helper function to build request
1645
1783
  :param str symbol: unified symbol of the market to create an order in
1646
1784
  :param str type: 'market' or 'limit'
1647
1785
  :param str side: 'buy' or 'sell'
1648
1786
  :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
1787
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1650
1788
  :param dict [params]: extra parameters specific to the exchange API endpoint
1651
1789
  :returns dict: request to be sent to the exchange
1652
1790
  """
@@ -1657,7 +1795,7 @@ class digifinex(Exchange, ImplicitAPI):
1657
1795
  marginMode, params = self.handle_margin_mode_and_params('createOrderRequest', params)
1658
1796
  if marginMode is not None:
1659
1797
  marketType = 'margin'
1660
- request = {}
1798
+ request: dict = {}
1661
1799
  swap = (marketType == 'swap')
1662
1800
  isMarketOrder = (type == 'market')
1663
1801
  isLimitOrder = (type == 'limit')
@@ -1732,7 +1870,9 @@ class digifinex(Exchange, ImplicitAPI):
1732
1870
  def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1733
1871
  """
1734
1872
  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
1873
+
1874
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1875
+
1736
1876
  :param str symbol: unified symbol of the market to create an order in
1737
1877
  :param float cost: how much you want to trade in units of the quote currency
1738
1878
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1748,8 +1888,10 @@ class digifinex(Exchange, ImplicitAPI):
1748
1888
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1749
1889
  """
1750
1890
  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
1891
+
1892
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#cancel-order
1893
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#cancelorder
1894
+
1753
1895
  :param str id: order id
1754
1896
  :param str symbol: not used by digifinex cancelOrder()
1755
1897
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1762,7 +1904,7 @@ class digifinex(Exchange, ImplicitAPI):
1762
1904
  id = str(id)
1763
1905
  marketType = None
1764
1906
  marketType, params = self.handle_market_type_and_params('cancelOrder', market, params)
1765
- request = {
1907
+ request: dict = {
1766
1908
  'order_id': id,
1767
1909
  }
1768
1910
  if marketType == 'swap':
@@ -1808,7 +1950,34 @@ class digifinex(Exchange, ImplicitAPI):
1808
1950
  numCanceledOrders = len(canceledOrders)
1809
1951
  if numCanceledOrders != 1:
1810
1952
  raise OrderNotFound(self.id + ' cancelOrder() ' + id + ' not found')
1811
- return response
1953
+ orders = self.parse_cancel_orders(response)
1954
+ return self.safe_dict(orders, 0)
1955
+ else:
1956
+ return self.safe_order({
1957
+ 'info': response,
1958
+ 'orderId': self.safe_string(response, 'data'),
1959
+ })
1960
+
1961
+ def parse_cancel_orders(self, response):
1962
+ success = self.safe_list(response, 'success')
1963
+ error = self.safe_list(response, 'error')
1964
+ result = []
1965
+ for i in range(0, len(success)):
1966
+ order = success[i]
1967
+ result.append(self.safe_order({
1968
+ 'info': order,
1969
+ 'id': order,
1970
+ 'status': 'canceled',
1971
+ }))
1972
+ for i in range(0, len(error)):
1973
+ order = error[i]
1974
+ result.append(self.safe_order({
1975
+ 'info': order,
1976
+ 'id': self.safe_string_2(order, 'order-id', 'order_id'),
1977
+ 'status': 'failed',
1978
+ 'clientOrderId': self.safe_string(order, 'client-order-id'),
1979
+ }))
1980
+ return result
1812
1981
 
1813
1982
  def cancel_orders(self, ids, symbol: Str = None, params={}):
1814
1983
  """
@@ -1822,7 +1991,7 @@ class digifinex(Exchange, ImplicitAPI):
1822
1991
  defaultType = self.safe_string(self.options, 'defaultType', 'spot')
1823
1992
  orderType = self.safe_string(params, 'type', defaultType)
1824
1993
  params = self.omit(params, 'type')
1825
- request = {
1994
+ request: dict = {
1826
1995
  'market': orderType,
1827
1996
  'order_id': ','.join(ids),
1828
1997
  }
@@ -1839,14 +2008,10 @@ class digifinex(Exchange, ImplicitAPI):
1839
2008
  # ]
1840
2009
  # }
1841
2010
  #
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
2011
+ return self.parse_cancel_orders(response)
1847
2012
 
1848
- def parse_order_status(self, status):
1849
- statuses = {
2013
+ def parse_order_status(self, status: Str):
2014
+ statuses: dict = {
1850
2015
  '0': 'open',
1851
2016
  '1': 'open', # partially filled
1852
2017
  '2': 'closed',
@@ -1855,7 +2020,7 @@ class digifinex(Exchange, ImplicitAPI):
1855
2020
  }
1856
2021
  return self.safe_string(statuses, status, status)
1857
2022
 
1858
- def parse_order(self, order, market: Market = None) -> Order:
2023
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1859
2024
  #
1860
2025
  # spot: createOrder
1861
2026
  #
@@ -1974,7 +2139,6 @@ class digifinex(Exchange, ImplicitAPI):
1974
2139
  'postOnly': None,
1975
2140
  'side': side,
1976
2141
  'price': self.safe_number(order, 'price'),
1977
- 'stopPrice': None,
1978
2142
  'triggerPrice': None,
1979
2143
  'amount': self.safe_number_2(order, 'amount', 'size'),
1980
2144
  'filled': self.safe_number_2(order, 'executed_amount', 'filled_qty'),
@@ -1991,8 +2155,10 @@ class digifinex(Exchange, ImplicitAPI):
1991
2155
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1992
2156
  """
1993
2157
  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
2158
+
2159
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#current-active-orders
2160
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#openorder
2161
+
1996
2162
  :param str symbol: unified market symbol
1997
2163
  :param int [since]: the earliest time in ms to fetch open orders for
1998
2164
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -2006,7 +2172,7 @@ class digifinex(Exchange, ImplicitAPI):
2006
2172
  marketType = None
2007
2173
  marketType, params = self.handle_market_type_and_params('fetchOpenOrders', market, params)
2008
2174
  marginMode, query = self.handle_margin_mode_and_params('fetchOpenOrders', params)
2009
- request = {}
2175
+ request: dict = {}
2010
2176
  swap = (marketType == 'swap')
2011
2177
  if swap:
2012
2178
  if since is not None:
@@ -2079,14 +2245,16 @@ class digifinex(Exchange, ImplicitAPI):
2079
2245
  # ]
2080
2246
  # }
2081
2247
  #
2082
- data = self.safe_value(response, 'data', [])
2248
+ data = self.safe_list(response, 'data', [])
2083
2249
  return self.parse_orders(data, market, since, limit)
2084
2250
 
2085
2251
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2086
2252
  """
2087
2253
  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
2254
+
2255
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-all-orders-including-history-orders
2256
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historyorder
2257
+
2090
2258
  :param str symbol: unified market symbol of the market orders were made in
2091
2259
  :param int [since]: the earliest time in ms to fetch orders for
2092
2260
  :param int [limit]: the maximum number of order structures to retrieve
@@ -2100,7 +2268,7 @@ class digifinex(Exchange, ImplicitAPI):
2100
2268
  marketType = None
2101
2269
  marketType, params = self.handle_market_type_and_params('fetchOrders', market, params)
2102
2270
  marginMode, query = self.handle_margin_mode_and_params('fetchOrders', params)
2103
- request = {}
2271
+ request: dict = {}
2104
2272
  if marketType == 'swap':
2105
2273
  if since is not None:
2106
2274
  request['start_timestamp'] = since
@@ -2174,14 +2342,16 @@ class digifinex(Exchange, ImplicitAPI):
2174
2342
  # ]
2175
2343
  # }
2176
2344
  #
2177
- data = self.safe_value(response, 'data', [])
2345
+ data = self.safe_list(response, 'data', [])
2178
2346
  return self.parse_orders(data, market, since, limit)
2179
2347
 
2180
2348
  def fetch_order(self, id: str, symbol: Str = None, params={}):
2181
2349
  """
2182
2350
  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
2351
+
2352
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-order-status
2353
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderinfo
2354
+
2185
2355
  :param str id: order id
2186
2356
  :param str symbol: unified symbol of the market the order was made in
2187
2357
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2194,7 +2364,7 @@ class digifinex(Exchange, ImplicitAPI):
2194
2364
  marketType = None
2195
2365
  marketType, params = self.handle_market_type_and_params('fetchOrder', market, params)
2196
2366
  marginMode, query = self.handle_margin_mode_and_params('fetchOrder', params)
2197
- request = {
2367
+ request: dict = {
2198
2368
  'order_id': id,
2199
2369
  }
2200
2370
  if marketType == 'swap':
@@ -2269,8 +2439,10 @@ class digifinex(Exchange, ImplicitAPI):
2269
2439
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2270
2440
  """
2271
2441
  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
2442
+
2443
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#customer-39-s-trades
2444
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historytrade
2445
+
2274
2446
  :param str symbol: unified market symbol
2275
2447
  :param int [since]: the earliest time in ms to fetch trades for
2276
2448
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -2279,7 +2451,7 @@ class digifinex(Exchange, ImplicitAPI):
2279
2451
  """
2280
2452
  self.load_markets()
2281
2453
  market = None
2282
- request = {}
2454
+ request: dict = {}
2283
2455
  if symbol is not None:
2284
2456
  market = self.market(symbol)
2285
2457
  marketType = None
@@ -2353,14 +2525,14 @@ class digifinex(Exchange, ImplicitAPI):
2353
2525
  # }
2354
2526
  #
2355
2527
  responseRequest = 'data' if (marketType == 'swap') else 'list'
2356
- data = self.safe_value(response, responseRequest, [])
2528
+ data = self.safe_list(response, responseRequest, [])
2357
2529
  return self.parse_trades(data, market, since, limit)
2358
2530
 
2359
2531
  def parse_ledger_entry_type(self, type):
2360
- types = {}
2532
+ types: dict = {}
2361
2533
  return self.safe_string(types, type, type)
2362
2534
 
2363
- def parse_ledger_entry(self, item, currency: Currency = None):
2535
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2364
2536
  #
2365
2537
  # spot and margin
2366
2538
  #
@@ -2382,13 +2554,15 @@ class digifinex(Exchange, ImplicitAPI):
2382
2554
  # }
2383
2555
  #
2384
2556
  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)
2557
+ currencyId = self.safe_string_2(item, 'currency_mark', 'currency')
2558
+ code = self.safe_currency_code(currencyId, currency)
2559
+ currency = self.safe_currency(currencyId, currency)
2386
2560
  amount = self.safe_number_2(item, 'num', 'change')
2387
2561
  after = self.safe_number(item, 'balance')
2388
2562
  timestamp = self.safe_timestamp(item, 'time')
2389
2563
  if timestamp is None:
2390
2564
  timestamp = self.safe_integer(item, 'timestamp')
2391
- return {
2565
+ return self.safe_ledger_entry({
2392
2566
  'info': item,
2393
2567
  'id': None,
2394
2568
  'direction': None,
@@ -2404,21 +2578,23 @@ class digifinex(Exchange, ImplicitAPI):
2404
2578
  'timestamp': timestamp,
2405
2579
  'datetime': self.iso8601(timestamp),
2406
2580
  'fee': None,
2407
- }
2581
+ }, currency)
2408
2582
 
2409
- def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2583
+ def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2410
2584
  """
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
2585
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
2586
+
2587
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-margin-otc-financial-logs
2588
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#bills
2589
+
2590
+ :param str [code]: unified currency code, default is None
2415
2591
  :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
2592
+ :param int [limit]: max number of ledger entries to return, default is None
2417
2593
  :param dict [params]: extra parameters specific to the exchange API endpoint
2418
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2594
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
2419
2595
  """
2420
2596
  self.load_markets()
2421
- request = {}
2597
+ request: dict = {}
2422
2598
  marketType = None
2423
2599
  marketType, params = self.handle_market_type_and_params('fetchLedger', None, params)
2424
2600
  marginMode, query = self.handle_margin_mode_and_params('fetchLedger', params)
@@ -2487,7 +2663,7 @@ class digifinex(Exchange, ImplicitAPI):
2487
2663
  ledger = self.safe_value(data, 'finance', [])
2488
2664
  return self.parse_ledger(ledger, currency, since, limit)
2489
2665
 
2490
- def parse_deposit_address(self, depositAddress, currency: Currency = None):
2666
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
2491
2667
  #
2492
2668
  # {
2493
2669
  # "addressTag":"",
@@ -2503,12 +2679,12 @@ class digifinex(Exchange, ImplicitAPI):
2503
2679
  return {
2504
2680
  'info': depositAddress,
2505
2681
  'currency': code,
2682
+ 'network': None,
2506
2683
  'address': address,
2507
2684
  'tag': tag,
2508
- 'network': None,
2509
2685
  }
2510
2686
 
2511
- def fetch_deposit_address(self, code: str, params={}):
2687
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
2512
2688
  """
2513
2689
  fetch the deposit address for a currency associated with self account
2514
2690
  :param str code: unified currency code
@@ -2517,7 +2693,7 @@ class digifinex(Exchange, ImplicitAPI):
2517
2693
  """
2518
2694
  self.load_markets()
2519
2695
  currency = self.currency(code)
2520
- request = {
2696
+ request: dict = {
2521
2697
  'currency': currency['id'],
2522
2698
  }
2523
2699
  response = self.privateSpotGetDepositAddress(self.extend(request, params))
@@ -2544,7 +2720,7 @@ class digifinex(Exchange, ImplicitAPI):
2544
2720
  def fetch_transactions_by_type(self, type, code: Str = None, since: Int = None, limit: Int = None, params={}):
2545
2721
  self.load_markets()
2546
2722
  currency = None
2547
- request = {
2723
+ request: dict = {
2548
2724
  # 'currency': currency['id'],
2549
2725
  # '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
2726
  # 'size': 100, # default 100, max 500
@@ -2580,7 +2756,7 @@ class digifinex(Exchange, ImplicitAPI):
2580
2756
  # ]
2581
2757
  # }
2582
2758
  #
2583
- data = self.safe_value(response, 'data', [])
2759
+ data = self.safe_list(response, 'data', [])
2584
2760
  return self.parse_transactions(data, currency, since, limit, {'type': type})
2585
2761
 
2586
2762
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
@@ -2605,10 +2781,10 @@ class digifinex(Exchange, ImplicitAPI):
2605
2781
  """
2606
2782
  return self.fetch_transactions_by_type('withdrawal', code, since, limit, params)
2607
2783
 
2608
- def parse_transaction_status(self, status):
2784
+ def parse_transaction_status(self, status: Str):
2609
2785
  # deposit state includes: 1(in deposit), 2(to be confirmed), 3(successfully deposited), 4(stopped)
2610
2786
  # withdrawal state includes: 1(application in progress), 2(to be confirmed), 3(completed), 4(rejected)
2611
- statuses = {
2787
+ statuses: dict = {
2612
2788
  '1': 'pending', # in Progress
2613
2789
  '2': 'pending', # to be confirmed
2614
2790
  '3': 'ok', # Completed
@@ -2616,7 +2792,7 @@ class digifinex(Exchange, ImplicitAPI):
2616
2792
  }
2617
2793
  return self.safe_string(statuses, status, status)
2618
2794
 
2619
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2795
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2620
2796
  #
2621
2797
  # withdraw
2622
2798
  #
@@ -2679,20 +2855,31 @@ class digifinex(Exchange, ImplicitAPI):
2679
2855
  'fee': fee,
2680
2856
  }
2681
2857
 
2682
- def parse_transfer_status(self, status):
2683
- statuses = {
2858
+ def parse_transfer_status(self, status: Str) -> Str:
2859
+ statuses: dict = {
2684
2860
  '0': 'ok',
2685
2861
  }
2686
2862
  return self.safe_string(statuses, status, status)
2687
2863
 
2688
- def parse_transfer(self, transfer, currency: Currency = None):
2864
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
2689
2865
  #
2690
- # transfer
2866
+ # transfer between spot, margin and OTC
2691
2867
  #
2692
2868
  # {
2693
2869
  # "code": 0
2694
2870
  # }
2695
2871
  #
2872
+ # transfer between spot and swap
2873
+ #
2874
+ # {
2875
+ # "code": 0,
2876
+ # "data": {
2877
+ # "type": 2,
2878
+ # "currency": "USDT",
2879
+ # "transfer_amount": "5"
2880
+ # }
2881
+ # }
2882
+ #
2696
2883
  # fetchTransfers
2697
2884
  #
2698
2885
  # {
@@ -2705,7 +2892,8 @@ class digifinex(Exchange, ImplicitAPI):
2705
2892
  #
2706
2893
  fromAccount = None
2707
2894
  toAccount = None
2708
- type = self.safe_integer(transfer, 'type')
2895
+ data = self.safe_dict(transfer, 'data', transfer)
2896
+ type = self.safe_integer(data, 'type')
2709
2897
  if type == 1:
2710
2898
  fromAccount = 'spot'
2711
2899
  toAccount = 'swap'
@@ -2718,8 +2906,8 @@ class digifinex(Exchange, ImplicitAPI):
2718
2906
  'id': self.safe_string(transfer, 'transfer_id'),
2719
2907
  'timestamp': timestamp,
2720
2908
  'datetime': self.iso8601(timestamp),
2721
- 'currency': self.safe_currency_code(self.safe_string(transfer, 'currency'), currency),
2722
- 'amount': self.safe_number(transfer, 'amount'),
2909
+ 'currency': self.safe_currency_code(self.safe_string(data, 'currency'), currency),
2910
+ 'amount': self.safe_number_2(data, 'amount', 'transfer_amount'),
2723
2911
  'fromAccount': fromAccount,
2724
2912
  'toAccount': toAccount,
2725
2913
  'status': self.parse_transfer_status(self.safe_string(transfer, 'code')),
@@ -2728,33 +2916,59 @@ class digifinex(Exchange, ImplicitAPI):
2728
2916
  def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2729
2917
  """
2730
2918
  transfer currency internally between wallets on the same account
2919
+
2920
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#transfer-assets-among-accounts
2921
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accounttransfer
2922
+
2731
2923
  :param str code: unified currency code
2732
2924
  :param float amount: amount to transfer
2733
- :param str fromAccount: account to transfer from
2734
- :param str toAccount: account to transfer to
2925
+ :param str fromAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer from
2926
+ :param str toAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer to
2735
2927
  :param dict [params]: extra parameters specific to the exchange API endpoint
2736
2928
  :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
2737
2929
  """
2738
2930
  self.load_markets()
2739
2931
  currency = self.currency(code)
2932
+ currencyId = currency['id']
2740
2933
  accountsByType = self.safe_value(self.options, 'accountsByType', {})
2741
2934
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
2742
2935
  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
- #
2936
+ request = {}
2937
+ fromSwap = (fromAccount == 'swap')
2938
+ toSwap = (toAccount == 'swap')
2939
+ response = None
2940
+ amountString = self.currency_to_precision(code, amount)
2941
+ if fromSwap or toSwap:
2942
+ if (fromId != '1') and (toId != '1'):
2943
+ raise ExchangeError(self.id + ' transfer() supports transferring between spot and swap, spot and margin, spot and OTC only')
2944
+ request['type'] = 1 if toSwap else 2 # 1 = spot to swap, 2 = swap to spot
2945
+ request['currency'] = currencyId
2946
+ request['transfer_amount'] = amountString
2947
+ #
2948
+ # {
2949
+ # "code": 0,
2950
+ # "data": {
2951
+ # "type": 2,
2952
+ # "currency": "USDT",
2953
+ # "transfer_amount": "5"
2954
+ # }
2955
+ # }
2956
+ #
2957
+ response = self.privateSwapPostAccountTransfer(self.extend(request, params))
2958
+ else:
2959
+ request['currency_mark'] = currencyId
2960
+ request['num'] = amountString
2961
+ request['from'] = fromId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2962
+ request['to'] = toId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2963
+ #
2964
+ # {
2965
+ # "code": 0
2966
+ # }
2967
+ #
2968
+ response = self.privateSpotPostTransfer(self.extend(request, params))
2755
2969
  return self.parse_transfer(response, currency)
2756
2970
 
2757
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2971
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2758
2972
  """
2759
2973
  make a withdrawal
2760
2974
  :param str code: unified currency code
@@ -2768,7 +2982,7 @@ class digifinex(Exchange, ImplicitAPI):
2768
2982
  self.check_address(address)
2769
2983
  self.load_markets()
2770
2984
  currency = self.currency(code)
2771
- request = {
2985
+ request: dict = {
2772
2986
  # 'chain': 'ERC20', 'OMNI', 'TRC20', # required for USDT
2773
2987
  'address': address,
2774
2988
  'amount': self.currency_to_precision(code, amount),
@@ -2785,9 +2999,9 @@ class digifinex(Exchange, ImplicitAPI):
2785
2999
  #
2786
3000
  return self.parse_transaction(response, currency)
2787
3001
 
2788
- def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3002
+ def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[BorrowInterest]:
2789
3003
  self.load_markets()
2790
- request = {}
3004
+ request: dict = {}
2791
3005
  market = None
2792
3006
  if symbol is not None:
2793
3007
  market = self.market(symbol)
@@ -2818,7 +3032,7 @@ class digifinex(Exchange, ImplicitAPI):
2818
3032
  interest = self.parse_borrow_interests(rows, market)
2819
3033
  return self.filter_by_currency_since_limit(interest, code, since, limit)
2820
3034
 
2821
- def parse_borrow_interest(self, info, market: Market = None):
3035
+ def parse_borrow_interest(self, info: dict, market: Market = None) -> BorrowInterest:
2822
3036
  #
2823
3037
  # {
2824
3038
  # "amount": 0.0006103,
@@ -2840,27 +3054,29 @@ class digifinex(Exchange, ImplicitAPI):
2840
3054
  currency = None if (market is None) else market['base']
2841
3055
  symbol = self.safe_symbol(marketId, market)
2842
3056
  return {
2843
- 'account': symbol,
3057
+ 'info': info,
2844
3058
  'symbol': symbol,
2845
3059
  'currency': currency,
2846
3060
  'interest': None,
2847
3061
  'interestRate': 0.001, # all interest rates on digifinex are 0.1%
2848
3062
  'amountBorrowed': self.parse_number(amountBorrowed),
3063
+ 'marginMode': None,
2849
3064
  'timestamp': None,
2850
3065
  'datetime': None,
2851
- 'info': info,
2852
3066
  }
2853
3067
 
2854
- def fetch_cross_borrow_rate(self, code: str, params={}):
3068
+ def fetch_cross_borrow_rate(self, code: str, params={}) -> CrossBorrowRate:
2855
3069
  """
2856
3070
  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
3071
+
3072
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3073
+
2858
3074
  :param str code: unified currency code
2859
3075
  :param dict [params]: extra parameters specific to the exchange API endpoint
2860
3076
  :returns dict: a `borrow rate structure <https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure>`
2861
3077
  """
2862
3078
  self.load_markets()
2863
- request = {}
3079
+ request: dict = {}
2864
3080
  response = self.privateSpotGetMarginAssets(self.extend(request, params))
2865
3081
  #
2866
3082
  # {
@@ -2888,10 +3104,12 @@ class digifinex(Exchange, ImplicitAPI):
2888
3104
  currency = self.currency(code)
2889
3105
  return self.parse_borrow_rate(result, currency)
2890
3106
 
2891
- def fetch_cross_borrow_rates(self, params={}):
3107
+ def fetch_cross_borrow_rates(self, params={}) -> CrossBorrowRates:
2892
3108
  """
2893
3109
  fetch the borrow interest rates of all currencies
2894
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3110
+
3111
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3112
+
2895
3113
  :param dict [params]: extra parameters specific to the exchange API endpoint
2896
3114
  :returns dict: a list of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>`
2897
3115
  """
@@ -2946,7 +3164,7 @@ class digifinex(Exchange, ImplicitAPI):
2946
3164
  # "currency": "USDT"
2947
3165
  # },
2948
3166
  #
2949
- result = {}
3167
+ result: dict = {}
2950
3168
  for i in range(0, len(info)):
2951
3169
  item = info[i]
2952
3170
  currency = self.safe_string(item, codeKey)
@@ -2955,10 +3173,12 @@ class digifinex(Exchange, ImplicitAPI):
2955
3173
  result[code] = borrowRate
2956
3174
  return result
2957
3175
 
2958
- def fetch_funding_rate(self, symbol: str, params={}):
3176
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
2959
3177
  """
2960
3178
  fetch the current funding rate
2961
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3179
+
3180
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3181
+
2962
3182
  :param str symbol: unified market symbol
2963
3183
  :param dict [params]: extra parameters specific to the exchange API endpoint
2964
3184
  :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
@@ -2967,7 +3187,7 @@ class digifinex(Exchange, ImplicitAPI):
2967
3187
  market = self.market(symbol)
2968
3188
  if not market['swap']:
2969
3189
  raise BadSymbol(self.id + ' fetchFundingRate() supports swap contracts only')
2970
- request = {
3190
+ request: dict = {
2971
3191
  'instrument_id': market['id'],
2972
3192
  }
2973
3193
  response = self.publicSwapGetPublicFundingRate(self.extend(request, params))
@@ -2983,10 +3203,22 @@ class digifinex(Exchange, ImplicitAPI):
2983
3203
  # }
2984
3204
  # }
2985
3205
  #
2986
- data = self.safe_value(response, 'data', {})
3206
+ data = self.safe_dict(response, 'data', {})
2987
3207
  return self.parse_funding_rate(data, market)
2988
3208
 
2989
- def parse_funding_rate(self, contract, market: Market = None):
3209
+ def fetch_funding_interval(self, symbol: str, params={}) -> FundingRate:
3210
+ """
3211
+ fetch the current funding rate interval
3212
+
3213
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3214
+
3215
+ :param str symbol: unified market symbol
3216
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3217
+ :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
3218
+ """
3219
+ return self.fetch_funding_rate(symbol, params)
3220
+
3221
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
2990
3222
  #
2991
3223
  # {
2992
3224
  # "instrument_id": "BTCUSDTPERP",
@@ -2999,6 +3231,9 @@ class digifinex(Exchange, ImplicitAPI):
2999
3231
  marketId = self.safe_string(contract, 'instrument_id')
3000
3232
  timestamp = self.safe_integer(contract, 'funding_time')
3001
3233
  nextTimestamp = self.safe_integer(contract, 'next_funding_time')
3234
+ fundingTimeString = self.safe_string(contract, 'funding_time')
3235
+ nextFundingTimeString = self.safe_string(contract, 'next_funding_time')
3236
+ millisecondsInterval = Precise.string_sub(nextFundingTimeString, fundingTimeString)
3002
3237
  return {
3003
3238
  'info': contract,
3004
3239
  'symbol': self.safe_symbol(marketId, market),
@@ -3011,14 +3246,25 @@ class digifinex(Exchange, ImplicitAPI):
3011
3246
  'fundingRate': self.safe_number(contract, 'funding_rate'),
3012
3247
  'fundingTimestamp': timestamp,
3013
3248
  'fundingDatetime': self.iso8601(timestamp),
3014
- 'nextFundingRate': self.safe_string(contract, 'next_funding_rate'),
3249
+ 'nextFundingRate': self.safe_number(contract, 'next_funding_rate'),
3015
3250
  'nextFundingTimestamp': nextTimestamp,
3016
3251
  'nextFundingDatetime': self.iso8601(nextTimestamp),
3017
3252
  'previousFundingRate': None,
3018
3253
  'previousFundingTimestamp': None,
3019
3254
  'previousFundingDatetime': None,
3255
+ 'interval': self.parse_funding_interval(millisecondsInterval),
3020
3256
  }
3021
3257
 
3258
+ def parse_funding_interval(self, interval):
3259
+ intervals: dict = {
3260
+ '3600000': '1h',
3261
+ '14400000': '4h',
3262
+ '28800000': '8h',
3263
+ '57600000': '16h',
3264
+ '86400000': '24h',
3265
+ }
3266
+ return self.safe_string(intervals, interval, interval)
3267
+
3022
3268
  def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3023
3269
  """
3024
3270
  fetches historical funding rate prices
@@ -3034,7 +3280,7 @@ class digifinex(Exchange, ImplicitAPI):
3034
3280
  market = self.market(symbol)
3035
3281
  if not market['swap']:
3036
3282
  raise BadSymbol(self.id + ' fetchFundingRateHistory() supports swap contracts only')
3037
- request = {
3283
+ request: dict = {
3038
3284
  'instrument_id': market['id'],
3039
3285
  }
3040
3286
  if since is not None:
@@ -3075,10 +3321,12 @@ class digifinex(Exchange, ImplicitAPI):
3075
3321
  sorted = self.sort_by(rates, 'timestamp')
3076
3322
  return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
3077
3323
 
3078
- def fetch_trading_fee(self, symbol: str, params={}):
3324
+ def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
3079
3325
  """
3080
3326
  fetch the trading fees for a market
3081
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3327
+
3328
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3329
+
3082
3330
  :param str symbol: unified market symbol
3083
3331
  :param dict [params]: extra parameters specific to the exchange API endpoint
3084
3332
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3087,7 +3335,7 @@ class digifinex(Exchange, ImplicitAPI):
3087
3335
  market = self.market(symbol)
3088
3336
  if not market['swap']:
3089
3337
  raise BadRequest(self.id + ' fetchTradingFee() supports swap markets only')
3090
- request = {
3338
+ request: dict = {
3091
3339
  'instrument_id': market['id'],
3092
3340
  }
3093
3341
  response = self.privateSwapGetAccountTradingFeeRate(self.extend(request, params))
@@ -3104,7 +3352,7 @@ class digifinex(Exchange, ImplicitAPI):
3104
3352
  data = self.safe_value(response, 'data', {})
3105
3353
  return self.parse_trading_fee(data, market)
3106
3354
 
3107
- def parse_trading_fee(self, fee, market: Market = None):
3355
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
3108
3356
  #
3109
3357
  # {
3110
3358
  # "instrument_id": "BTCUSDTPERP",
@@ -3119,20 +3367,24 @@ class digifinex(Exchange, ImplicitAPI):
3119
3367
  'symbol': symbol,
3120
3368
  'maker': self.safe_number(fee, 'maker_fee_rate'),
3121
3369
  'taker': self.safe_number(fee, 'taker_fee_rate'),
3370
+ 'percentage': None,
3371
+ 'tierBased': None,
3122
3372
  }
3123
3373
 
3124
3374
  def fetch_positions(self, symbols: Strings = None, params={}):
3125
3375
  """
3126
3376
  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
3377
+
3378
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3379
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3380
+
3129
3381
  :param str[]|None symbols: list of unified market symbols
3130
3382
  :param dict [params]: extra parameters specific to the exchange API endpoint
3131
3383
  :returns dict[]: a list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
3132
3384
  """
3133
3385
  self.load_markets()
3134
3386
  symbols = self.market_symbols(symbols)
3135
- request = {}
3387
+ request: dict = {}
3136
3388
  market = None
3137
3389
  marketType = None
3138
3390
  if symbols is not None:
@@ -3221,8 +3473,10 @@ class digifinex(Exchange, ImplicitAPI):
3221
3473
 
3222
3474
  def fetch_position(self, symbol: str, params={}):
3223
3475
  """
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
3476
+
3477
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3478
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3479
+
3226
3480
  fetch data on a single open contract trade position
3227
3481
  :param str symbol: unified market symbol of the market the position is held in
3228
3482
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3230,7 +3484,7 @@ class digifinex(Exchange, ImplicitAPI):
3230
3484
  """
3231
3485
  self.load_markets()
3232
3486
  market = self.market(symbol)
3233
- request = {}
3487
+ request: dict = {}
3234
3488
  marketType = None
3235
3489
  marketType, params = self.handle_market_type_and_params('fetchPosition', market, params)
3236
3490
  marginMode, query = self.handle_margin_mode_and_params('fetchPosition', params)
@@ -3306,7 +3560,7 @@ class digifinex(Exchange, ImplicitAPI):
3306
3560
  position['marginRatio'] = self.safe_number(response, 'margin_rate')
3307
3561
  return position
3308
3562
 
3309
- def parse_position(self, position, market: Market = None):
3563
+ def parse_position(self, position: dict, market: Market = None):
3310
3564
  #
3311
3565
  # swap
3312
3566
  #
@@ -3390,7 +3644,9 @@ class digifinex(Exchange, ImplicitAPI):
3390
3644
  def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
3391
3645
  """
3392
3646
  set the level of leverage for a market
3393
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3647
+
3648
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3649
+
3394
3650
  :param float leverage: the rate of leverage
3395
3651
  :param str symbol: unified market symbol
3396
3652
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3406,7 +3662,7 @@ class digifinex(Exchange, ImplicitAPI):
3406
3662
  raise BadSymbol(self.id + ' setLeverage() supports swap contracts only')
3407
3663
  if (leverage < 1) or (leverage > 100):
3408
3664
  raise BadRequest(self.id + ' leverage should be between 1 and 100')
3409
- request = {
3665
+ request: dict = {
3410
3666
  'instrument_id': market['id'],
3411
3667
  'leverage': leverage,
3412
3668
  }
@@ -3436,10 +3692,12 @@ class digifinex(Exchange, ImplicitAPI):
3436
3692
  # }
3437
3693
  #
3438
3694
 
3439
- def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
3695
+ def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3440
3696
  """
3441
3697
  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
3698
+
3699
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#transferrecord
3700
+
3443
3701
  :param str code: unified currency code of the currency transferred
3444
3702
  :param int [since]: the earliest time in ms to fetch transfers for
3445
3703
  :param int [limit]: the maximum number of transfers to retrieve
@@ -3448,7 +3706,7 @@ class digifinex(Exchange, ImplicitAPI):
3448
3706
  """
3449
3707
  self.load_markets()
3450
3708
  currency = None
3451
- request = {}
3709
+ request: dict = {}
3452
3710
  if code is not None:
3453
3711
  currency = self.safe_currency_code(code)
3454
3712
  request['currency'] = currency['id']
@@ -3472,12 +3730,14 @@ class digifinex(Exchange, ImplicitAPI):
3472
3730
  # ]
3473
3731
  # }
3474
3732
  #
3475
- transfers = self.safe_value(response, 'data', [])
3733
+ transfers = self.safe_list(response, 'data', [])
3476
3734
  return self.parse_transfers(transfers, currency, since, limit)
3477
3735
 
3478
- def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
3736
+ def fetch_leverage_tiers(self, symbols: Strings = None, params={}) -> LeverageTiers:
3479
3737
  """
3480
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3738
+
3739
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3740
+
3481
3741
  retrieve information on the maximum leverage, for different trade sizes
3482
3742
  :param str[]|None symbols: a list of unified market symbols
3483
3743
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3516,56 +3776,14 @@ class digifinex(Exchange, ImplicitAPI):
3516
3776
  #
3517
3777
  data = self.safe_value(response, 'data', [])
3518
3778
  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
3779
+ return self.parse_leverage_tiers(data, symbols, 'instrument_id')
3564
3780
 
3565
- def fetch_market_leverage_tiers(self, symbol: str, params={}):
3781
+ def fetch_market_leverage_tiers(self, symbol: str, params={}) -> List[LeverageTier]:
3566
3782
  """
3567
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3568
3783
  retrieve information on the maximum leverage, for different trade sizes for a single market
3784
+
3785
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3786
+
3569
3787
  :param str symbol: unified market symbol
3570
3788
  :param dict [params]: extra parameters specific to the exchange API endpoint
3571
3789
  :returns dict: a `leverage tiers structure <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`
@@ -3574,7 +3792,7 @@ class digifinex(Exchange, ImplicitAPI):
3574
3792
  market = self.market(symbol)
3575
3793
  if not market['swap']:
3576
3794
  raise BadRequest(self.id + ' fetchMarketLeverageTiers() supports swap markets only')
3577
- request = {
3795
+ request: dict = {
3578
3796
  'instrument_id': market['id'],
3579
3797
  }
3580
3798
  response = self.publicSwapGetPublicInstrument(self.extend(request, params))
@@ -3608,7 +3826,7 @@ class digifinex(Exchange, ImplicitAPI):
3608
3826
  data = self.safe_value(response, 'data', {})
3609
3827
  return self.parse_market_leverage_tiers(data, market)
3610
3828
 
3611
- def parse_market_leverage_tiers(self, info, market: Market = None):
3829
+ def parse_market_leverage_tiers(self, info, market: Market = None) -> List[LeverageTier]:
3612
3830
  #
3613
3831
  # {
3614
3832
  # "instrument_id": "BTCUSDTPERP",
@@ -3638,9 +3856,10 @@ class digifinex(Exchange, ImplicitAPI):
3638
3856
  for i in range(0, len(brackets)):
3639
3857
  tier = brackets[i]
3640
3858
  marketId = self.safe_string(info, 'instrument_id')
3641
- market = self.safe_market(marketId)
3859
+ market = self.safe_market(marketId, market)
3642
3860
  tiers.append({
3643
3861
  'tier': self.sum(i, 1),
3862
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3644
3863
  'currency': market['settle'],
3645
3864
  'minNotional': None,
3646
3865
  'maxNotional': self.safe_number(tier, 'max_limit'),
@@ -3652,7 +3871,7 @@ class digifinex(Exchange, ImplicitAPI):
3652
3871
 
3653
3872
  def handle_margin_mode_and_params(self, methodName, params={}, defaultValue=None):
3654
3873
  """
3655
- * @ignore
3874
+ @ignore
3656
3875
  marginMode specified by params["marginMode"], self.options["marginMode"], self.options["defaultMarginMode"], params["margin"] = True or self.options["defaultType"] = 'margin'
3657
3876
  :param dict [params]: extra parameters specific to the exchange API endpoint
3658
3877
  :returns Array: the marginMode in lowercase
@@ -3672,7 +3891,9 @@ class digifinex(Exchange, ImplicitAPI):
3672
3891
  def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
3673
3892
  """
3674
3893
  fetch deposit and withdraw fees
3675
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3894
+
3895
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3896
+
3676
3897
  :param str[]|None codes: not used by fetchDepositWithdrawFees()
3677
3898
  :param dict [params]: extra parameters specific to the exchange API endpoint
3678
3899
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3708,7 +3929,7 @@ class digifinex(Exchange, ImplicitAPI):
3708
3929
  # "code": 200,
3709
3930
  # }
3710
3931
  #
3711
- data = self.safe_value(response, 'data')
3932
+ data = self.safe_list(response, 'data')
3712
3933
  return self.parse_deposit_withdraw_fees(data, codes)
3713
3934
 
3714
3935
  def parse_deposit_withdraw_fees(self, response, codes=None, currencyIdKey=None):
@@ -3738,7 +3959,7 @@ class digifinex(Exchange, ImplicitAPI):
3738
3959
  # },
3739
3960
  # ]
3740
3961
  #
3741
- depositWithdrawFees = {}
3962
+ depositWithdrawFees: dict = {}
3742
3963
  codes = self.market_codes(codes)
3743
3964
  for i in range(0, len(response)):
3744
3965
  entry = response[i]
@@ -3752,11 +3973,11 @@ class digifinex(Exchange, ImplicitAPI):
3752
3973
  depositWithdrawFees[code]['info'].append(entry)
3753
3974
  networkId = self.safe_string(entry, 'chain')
3754
3975
  withdrawFee = self.safe_value(entry, 'min_withdraw_fee')
3755
- withdrawResult = {
3976
+ withdrawResult: dict = {
3756
3977
  'fee': withdrawFee,
3757
3978
  'percentage': False if (withdrawFee is not None) else None,
3758
3979
  }
3759
- depositResult = {
3980
+ depositResult: dict = {
3760
3981
  'fee': None,
3761
3982
  'percentage': None,
3762
3983
  }
@@ -3776,10 +3997,12 @@ class digifinex(Exchange, ImplicitAPI):
3776
3997
  depositWithdrawFees[code] = self.assign_default_deposit_withdraw_fees(depositWithdrawFees[code], currency)
3777
3998
  return depositWithdrawFees
3778
3999
 
3779
- def add_margin(self, symbol: str, amount, params={}):
4000
+ def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3780
4001
  """
3781
4002
  add margin to a position
3782
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4003
+
4004
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4005
+
3783
4006
  :param str symbol: unified market symbol
3784
4007
  :param float amount: amount of margin to add
3785
4008
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3790,10 +4013,12 @@ class digifinex(Exchange, ImplicitAPI):
3790
4013
  self.check_required_argument('addMargin', side, 'side', ['long', 'short'])
3791
4014
  return self.modify_margin_helper(symbol, amount, 1, params)
3792
4015
 
3793
- def reduce_margin(self, symbol: str, amount, params={}):
4016
+ def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3794
4017
  """
3795
4018
  remove margin from a position
3796
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4019
+
4020
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4021
+
3797
4022
  :param str symbol: unified market symbol
3798
4023
  :param float amount: the amount of margin to remove
3799
4024
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3804,11 +4029,11 @@ class digifinex(Exchange, ImplicitAPI):
3804
4029
  self.check_required_argument('reduceMargin', side, 'side', ['long', 'short'])
3805
4030
  return self.modify_margin_helper(symbol, amount, 2, params)
3806
4031
 
3807
- def modify_margin_helper(self, symbol: str, amount, type, params={}):
4032
+ def modify_margin_helper(self, symbol: str, amount, type, params={}) -> MarginModification:
3808
4033
  self.load_markets()
3809
4034
  side = self.safe_string(params, 'side')
3810
4035
  market = self.market(symbol)
3811
- request = {
4036
+ request: dict = {
3812
4037
  'instrument_id': market['id'],
3813
4038
  'amount': self.number_to_string(amount),
3814
4039
  'type': type,
@@ -3833,7 +4058,7 @@ class digifinex(Exchange, ImplicitAPI):
3833
4058
  'status': status,
3834
4059
  })
3835
4060
 
3836
- def parse_margin_modification(self, data, market: Market = None):
4061
+ def parse_margin_modification(self, data: dict, market: Market = None) -> MarginModification:
3837
4062
  #
3838
4063
  # {
3839
4064
  # "instrument_id": "BTCUSDTPERP",
@@ -3846,18 +4071,23 @@ class digifinex(Exchange, ImplicitAPI):
3846
4071
  rawType = self.safe_integer(data, 'type')
3847
4072
  return {
3848
4073
  'info': data,
4074
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3849
4075
  'type': 'add' if (rawType == 1) else 'reduce',
4076
+ 'marginMode': 'isolated',
3850
4077
  'amount': self.safe_number(data, 'amount'),
3851
4078
  'total': None,
3852
4079
  'code': market['settle'],
3853
- 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3854
4080
  'status': None,
4081
+ 'timestamp': None,
4082
+ 'datetime': None,
3855
4083
  }
3856
4084
 
3857
4085
  def fetch_funding_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3858
4086
  """
3859
4087
  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
4088
+
4089
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#funding-fee
4090
+
3861
4091
  :param str [symbol]: unified market symbol
3862
4092
  :param int [since]: the earliest time in ms to fetch funding history for
3863
4093
  :param int [limit]: the maximum number of funding history structures to retrieve
@@ -3866,7 +4096,7 @@ class digifinex(Exchange, ImplicitAPI):
3866
4096
  :returns dict: a `funding history structure <https://docs.ccxt.com/#/?id=funding-history-structure>`
3867
4097
  """
3868
4098
  self.load_markets()
3869
- request = {}
4099
+ request: dict = {}
3870
4100
  request, params = self.handle_until_option('end_timestamp', request, params)
3871
4101
  market = None
3872
4102
  if symbol is not None:
@@ -3890,7 +4120,7 @@ class digifinex(Exchange, ImplicitAPI):
3890
4120
  # ]
3891
4121
  # }
3892
4122
  #
3893
- data = self.safe_value(response, 'data', [])
4123
+ data = self.safe_list(response, 'data', [])
3894
4124
  return self.parse_incomes(data, market, since, limit)
3895
4125
 
3896
4126
  def parse_income(self, income, market: Market = None):
@@ -3918,7 +4148,9 @@ class digifinex(Exchange, ImplicitAPI):
3918
4148
  def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
3919
4149
  """
3920
4150
  set margin mode to 'cross' or 'isolated'
3921
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4151
+
4152
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4153
+
3922
4154
  :param str marginMode: 'cross' or 'isolated'
3923
4155
  :param str symbol: unified market symbol
3924
4156
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3931,7 +4163,7 @@ class digifinex(Exchange, ImplicitAPI):
3931
4163
  marginMode = marginMode.lower()
3932
4164
  if marginMode == 'cross':
3933
4165
  marginMode = 'crossed'
3934
- request = {
4166
+ request: dict = {
3935
4167
  'instrument_id': market['id'],
3936
4168
  'margin_mode': marginMode,
3937
4169
  }
@@ -3984,7 +4216,7 @@ class digifinex(Exchange, ImplicitAPI):
3984
4216
  url += '?' + urlencoded
3985
4217
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
3986
4218
 
3987
- def handle_errors(self, statusCode, statusText, url, method, responseHeaders, responseBody, response, requestHeaders, requestBody):
4219
+ def handle_errors(self, statusCode: int, statusText: str, url: str, method: str, responseHeaders: dict, responseBody, response, requestHeaders, requestBody):
3988
4220
  if not response:
3989
4221
  return None # fall back to default error handler
3990
4222
  code = self.safe_string(response, 'code')