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
@@ -8,15 +8,15 @@ from ccxt.abstract.digifinex import ImplicitAPI
8
8
  import asyncio
9
9
  import hashlib
10
10
  import json
11
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
11
+ from ccxt.base.types import Balances, BorrowInterest, CrossBorrowRate, CrossBorrowRates, Currencies, Currency, DepositAddress, Int, LedgerEntry, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, Trade, TradingFeeInterface, Transaction, TransferEntry
12
12
  from typing import List
13
13
  from ccxt.base.errors import ExchangeError
14
+ from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import PermissionDenied
15
16
  from ccxt.base.errors import AccountSuspended
16
17
  from ccxt.base.errors import ArgumentsRequired
17
18
  from ccxt.base.errors import BadRequest
18
19
  from ccxt.base.errors import BadSymbol
19
- from ccxt.base.errors import BadResponse
20
20
  from ccxt.base.errors import InsufficientFunds
21
21
  from ccxt.base.errors import InvalidAddress
22
22
  from ccxt.base.errors import InvalidOrder
@@ -26,7 +26,7 @@ from ccxt.base.errors import NetworkError
26
26
  from ccxt.base.errors import DDoSProtection
27
27
  from ccxt.base.errors import RateLimitExceeded
28
28
  from ccxt.base.errors import InvalidNonce
29
- from ccxt.base.errors import AuthenticationError
29
+ from ccxt.base.errors import BadResponse
30
30
  from ccxt.base.decimal_to_precision import TICK_SIZE
31
31
  from ccxt.base.precise import Precise
32
32
 
@@ -68,10 +68,14 @@ class digifinex(Exchange, ImplicitAPI):
68
68
  'fetchCrossBorrowRates': True,
69
69
  'fetchCurrencies': True,
70
70
  'fetchDepositAddress': True,
71
+ 'fetchDepositAddresses': False,
72
+ 'fetchDepositAddressesByNetwork': False,
71
73
  'fetchDeposits': True,
72
74
  'fetchDepositWithdrawFee': 'emulated',
73
75
  'fetchDepositWithdrawFees': True,
74
76
  'fetchFundingHistory': True,
77
+ 'fetchFundingInterval': True,
78
+ 'fetchFundingIntervals': False,
75
79
  'fetchFundingRate': True,
76
80
  'fetchFundingRateHistory': True,
77
81
  'fetchFundingRates': False,
@@ -227,6 +231,7 @@ class digifinex(Exchange, ImplicitAPI):
227
231
  'trade/order_info',
228
232
  ],
229
233
  'post': [
234
+ 'account/transfer',
230
235
  'account/leverage',
231
236
  'account/position_mode',
232
237
  'account/position_margin',
@@ -249,6 +254,109 @@ class digifinex(Exchange, ImplicitAPI):
249
254
  },
250
255
  },
251
256
  },
257
+ 'features': {
258
+ 'default': {
259
+ 'sandbox': False,
260
+ 'createOrder': {
261
+ 'marginMode': True,
262
+ 'triggerPrice': False,
263
+ 'triggerPriceType': None,
264
+ 'triggerDirection': False,
265
+ 'stopLossPrice': False,
266
+ 'takeProfitPrice': False,
267
+ 'attachedStopLossTakeProfit': None,
268
+ 'timeInForce': {
269
+ 'IOC': False,
270
+ 'FOK': False,
271
+ 'PO': True,
272
+ 'GTD': False,
273
+ },
274
+ 'hedged': False,
275
+ 'selfTradePrevention': False,
276
+ 'trailing': False,
277
+ 'leverage': False,
278
+ 'marketBuyByCost': False,
279
+ 'marketBuyRequiresPrice': False,
280
+ 'iceberg': False,
281
+ },
282
+ 'createOrders': {
283
+ 'max': 10,
284
+ 'marginMode': True,
285
+ },
286
+ 'fetchMyTrades': {
287
+ 'marginMode': True,
288
+ 'limit': 500,
289
+ 'daysBack': 100000, # todo
290
+ 'untilDays': 30,
291
+ },
292
+ 'fetchOrder': {
293
+ 'marginMode': True,
294
+ 'trigger': False,
295
+ 'trailing': False,
296
+ 'marketType': True,
297
+ },
298
+ 'fetchOpenOrders': {
299
+ 'marginMode': True,
300
+ 'limit': None,
301
+ 'trigger': False,
302
+ 'trailing': False,
303
+ },
304
+ 'fetchOrders': {
305
+ 'marginMode': True,
306
+ 'limit': 100,
307
+ 'daysBack': 100000, # todo
308
+ 'untilDays': 30,
309
+ 'trigger': False,
310
+ 'trailing': False,
311
+ },
312
+ 'fetchClosedOrders': None,
313
+ 'fetchOHLCV': {
314
+ 'limit': 500,
315
+ },
316
+ },
317
+ 'spot': {
318
+ 'extends': 'default',
319
+ },
320
+ 'forDerivatives': {
321
+ 'extends': 'default',
322
+ 'createOrders': {
323
+ 'max': 20,
324
+ 'marginMode': False,
325
+ },
326
+ 'fetchMyTrades': {
327
+ 'marginMode': False,
328
+ 'limit': 100,
329
+ 'daysBack': 100000, # todo
330
+ 'untilDays': 100000, # todo
331
+ },
332
+ 'fetchOrder': {
333
+ 'marginMode': False,
334
+ },
335
+ 'fetchOpenOrders': {
336
+ 'marginMode': False,
337
+ 'limit': 100,
338
+ },
339
+ 'fetchOrders': {
340
+ 'marginMode': False,
341
+ 'daysBack': 100000, # todo
342
+ },
343
+ 'fetchOHLCV': {
344
+ 'limit': 100,
345
+ },
346
+ },
347
+ 'swap': {
348
+ 'linear': {
349
+ 'extends': 'forDerivatives',
350
+ },
351
+ 'inverse': {
352
+ 'extends': 'forDerivatives',
353
+ },
354
+ },
355
+ 'future': {
356
+ 'linear': None,
357
+ 'inverse': None,
358
+ },
359
+ },
252
360
  'fees': {
253
361
  'trading': {
254
362
  'tierBased': True,
@@ -366,7 +474,7 @@ class digifinex(Exchange, ImplicitAPI):
366
474
  },
367
475
  })
368
476
 
369
- async def fetch_currencies(self, params={}):
477
+ async def fetch_currencies(self, params={}) -> Currencies:
370
478
  """
371
479
  fetches all available currencies on an exchange
372
480
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -411,7 +519,7 @@ class digifinex(Exchange, ImplicitAPI):
411
519
  # }
412
520
  #
413
521
  data = self.safe_value(response, 'data', [])
414
- result = {}
522
+ result: dict = {}
415
523
  for i in range(0, len(data)):
416
524
  currency = data[i]
417
525
  id = self.safe_string(currency, 'currency')
@@ -434,7 +542,7 @@ class digifinex(Exchange, ImplicitAPI):
434
542
  networkCode = None
435
543
  if networkId is not None:
436
544
  networkCode = self.network_id_to_code(networkId)
437
- network = {
545
+ network: dict = {
438
546
  'info': currency,
439
547
  'id': networkId,
440
548
  'network': networkCode,
@@ -523,7 +631,7 @@ class digifinex(Exchange, ImplicitAPI):
523
631
  result[code]['precision'] = precision if (result[code]['precision'] is None) else max(result[code]['precision'], precision)
524
632
  return result
525
633
 
526
- async def fetch_markets(self, params={}):
634
+ async def fetch_markets(self, params={}) -> List[Market]:
527
635
  """
528
636
  retrieves data on all markets for digifinex
529
637
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -789,7 +897,7 @@ class digifinex(Exchange, ImplicitAPI):
789
897
  # "time_stamp": 1661487402396
790
898
  # }
791
899
  #
792
- result = {'info': response}
900
+ result: dict = {'info': response}
793
901
  for i in range(0, len(response)):
794
902
  balance = response[i]
795
903
  currencyId = self.safe_string(balance, 'currency')
@@ -806,9 +914,11 @@ class digifinex(Exchange, ImplicitAPI):
806
914
  async def fetch_balance(self, params={}) -> Balances:
807
915
  """
808
916
  query for balance and get the amount of funds available for trading or funds locked in orders
809
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-account-assets
810
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
811
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#accountbalance
917
+
918
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-account-assets
919
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
920
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accountbalance
921
+
812
922
  :param dict [params]: extra parameters specific to the exchange API endpoint
813
923
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
814
924
  """
@@ -869,8 +979,10 @@ class digifinex(Exchange, ImplicitAPI):
869
979
  async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
870
980
  """
871
981
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
872
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-orderbook
873
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderbook
982
+
983
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-orderbook
984
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderbook
985
+
874
986
  :param str symbol: unified symbol of the market to fetch the order book for
875
987
  :param int [limit]: the maximum amount of order book entries to return
876
988
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -879,7 +991,7 @@ class digifinex(Exchange, ImplicitAPI):
879
991
  await self.load_markets()
880
992
  market = self.market(symbol)
881
993
  marketType, query = self.handle_market_type_and_params('fetchOrderBook', market, params)
882
- request = {}
994
+ request: dict = {}
883
995
  if limit is not None:
884
996
  request['limit'] = limit
885
997
  response = None
@@ -940,8 +1052,10 @@ class digifinex(Exchange, ImplicitAPI):
940
1052
  async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
941
1053
  """
942
1054
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
943
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
944
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#tickers
1055
+
1056
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1057
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tickers
1058
+
945
1059
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
946
1060
  :param dict [params]: extra parameters specific to the exchange API endpoint
947
1061
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -954,7 +1068,7 @@ class digifinex(Exchange, ImplicitAPI):
954
1068
  market = self.market(first)
955
1069
  type = None
956
1070
  type, params = self.handle_market_type_and_params('fetchTickers', market, params)
957
- request = {}
1071
+ request: dict = {}
958
1072
  response = None
959
1073
  if type == 'swap':
960
1074
  response = await self.publicSwapGetPublicTickers(self.extend(request, params))
@@ -1008,7 +1122,7 @@ class digifinex(Exchange, ImplicitAPI):
1008
1122
  # ]
1009
1123
  # }
1010
1124
  #
1011
- result = {}
1125
+ result: dict = {}
1012
1126
  tickers = self.safe_value_2(response, 'ticker', 'data', [])
1013
1127
  date = self.safe_integer(response, 'date')
1014
1128
  for i in range(0, len(tickers)):
@@ -1023,15 +1137,17 @@ class digifinex(Exchange, ImplicitAPI):
1023
1137
  async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
1024
1138
  """
1025
1139
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
1026
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1027
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#ticker
1140
+
1141
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#ticker-price
1142
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#ticker
1143
+
1028
1144
  :param str symbol: unified symbol of the market to fetch the ticker for
1029
1145
  :param dict [params]: extra parameters specific to the exchange API endpoint
1030
1146
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
1031
1147
  """
1032
1148
  await self.load_markets()
1033
1149
  market = self.market(symbol)
1034
- request = {}
1150
+ request: dict = {}
1035
1151
  response = None
1036
1152
  if market['swap']:
1037
1153
  request['instrument_id'] = market['id']
@@ -1095,7 +1211,7 @@ class digifinex(Exchange, ImplicitAPI):
1095
1211
  result = self.extend({'date': date}, firstTicker)
1096
1212
  return self.parse_ticker(result, market)
1097
1213
 
1098
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1214
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1099
1215
  #
1100
1216
  # spot: fetchTicker, fetchTickers
1101
1217
  #
@@ -1164,10 +1280,12 @@ class digifinex(Exchange, ImplicitAPI):
1164
1280
  'average': None,
1165
1281
  'baseVolume': self.safe_string_2(ticker, 'vol', 'volume_24h'),
1166
1282
  'quoteVolume': self.safe_string(ticker, 'base_vol'),
1283
+ 'markPrice': self.safe_string(ticker, 'mark_price'),
1284
+ 'indexPrice': indexPrice,
1167
1285
  'info': ticker,
1168
1286
  }, market)
1169
1287
 
1170
- def parse_trade(self, trade, market: Market = None) -> Trade:
1288
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1171
1289
  #
1172
1290
  # spot: fetchTrades
1173
1291
  #
@@ -1336,8 +1454,10 @@ class digifinex(Exchange, ImplicitAPI):
1336
1454
  async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
1337
1455
  """
1338
1456
  get the list of most recent trades for a particular symbol
1339
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-recent-trades
1340
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#recenttrades
1457
+
1458
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-recent-trades
1459
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recenttrades
1460
+
1341
1461
  :param str symbol: unified symbol of the market to fetch trades for
1342
1462
  :param int [since]: timestamp in ms of the earliest trade to fetch
1343
1463
  :param int [limit]: the maximum amount of trades to fetch
@@ -1346,7 +1466,7 @@ class digifinex(Exchange, ImplicitAPI):
1346
1466
  """
1347
1467
  await self.load_markets()
1348
1468
  market = self.market(symbol)
1349
- request = {}
1469
+ request: dict = {}
1350
1470
  if limit is not None:
1351
1471
  request['limit'] = min(limit, 100) if market['swap'] else limit
1352
1472
  response = None
@@ -1397,7 +1517,7 @@ class digifinex(Exchange, ImplicitAPI):
1397
1517
  # ]
1398
1518
  # }
1399
1519
  #
1400
- data = self.safe_value(response, 'data', [])
1520
+ data = self.safe_list(response, 'data', [])
1401
1521
  return self.parse_trades(data, market, since, limit)
1402
1522
 
1403
1523
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
@@ -1433,39 +1553,53 @@ class digifinex(Exchange, ImplicitAPI):
1433
1553
  async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
1434
1554
  """
1435
1555
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
1436
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-candles-data
1437
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#recentcandle
1556
+
1557
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-candles-data
1558
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#recentcandle
1559
+
1438
1560
  :param str symbol: unified symbol of the market to fetch OHLCV data for
1439
1561
  :param str timeframe: the length of time each candle represents
1440
1562
  :param int [since]: timestamp in ms of the earliest candle to fetch
1441
1563
  :param int [limit]: the maximum amount of candles to fetch
1442
1564
  :param dict [params]: extra parameters specific to the exchange API endpoint
1565
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
1443
1566
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
1444
1567
  """
1445
1568
  await self.load_markets()
1446
1569
  market = self.market(symbol)
1447
- request = {}
1570
+ request: dict = {}
1448
1571
  response = None
1449
1572
  if market['swap']:
1450
1573
  request['instrument_id'] = market['id']
1451
1574
  request['granularity'] = timeframe
1452
1575
  if limit is not None:
1453
- request['limit'] = limit
1576
+ request['limit'] = min(limit, 100)
1454
1577
  response = await self.publicSwapGetPublicCandles(self.extend(request, params))
1455
1578
  else:
1579
+ until = self.safe_integer(params, 'until')
1456
1580
  request['symbol'] = market['id']
1457
1581
  request['period'] = self.safe_string(self.timeframes, timeframe, timeframe)
1458
- if since is not None:
1459
- startTime = self.parse_to_int(since / 1000)
1582
+ startTime = since
1583
+ duration = self.parse_timeframe(timeframe)
1584
+ if startTime is None:
1585
+ if (limit is not None) or (until is not None):
1586
+ endTime = until if (until is not None) else self.milliseconds()
1587
+ startLimit = limit if (limit is not None) else 200
1588
+ startTime = endTime - (startLimit * duration * 1000)
1589
+ if startTime is not None:
1590
+ startTime = self.parse_to_int(startTime / 1000)
1460
1591
  request['start_time'] = startTime
1461
- if limit is not None:
1462
- duration = self.parse_timeframe(timeframe)
1463
- request['end_time'] = self.sum(startTime, limit * duration)
1464
- elif limit is not None:
1465
- endTime = self.seconds()
1466
- duration = self.parse_timeframe(timeframe)
1467
- auxLimit = limit # in c# -limit is mutating the arg
1468
- request['start_time'] = self.sum(endTime, -auxLimit * duration)
1592
+ if (limit is not None) or (until is not None):
1593
+ if until is not None:
1594
+ endByUntil = self.parse_to_int(until / 1000)
1595
+ if limit is not None:
1596
+ endByLimit = self.sum(startTime, limit * duration)
1597
+ request['end_time'] = min(endByLimit, endByUntil)
1598
+ else:
1599
+ request['end_time'] = endByUntil
1600
+ else:
1601
+ request['end_time'] = self.sum(startTime, limit * duration)
1602
+ params = self.omit(params, 'until')
1469
1603
  response = await self.publicSpotGetKline(self.extend(request, params))
1470
1604
  #
1471
1605
  # spot
@@ -1505,13 +1639,15 @@ class digifinex(Exchange, ImplicitAPI):
1505
1639
  async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1506
1640
  """
1507
1641
  create a trade order
1508
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1509
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderplace
1642
+
1643
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1644
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderplace
1645
+
1510
1646
  :param str symbol: unified symbol of the market to create an order in
1511
1647
  :param str type: 'market' or 'limit'
1512
1648
  :param str side: 'buy' or 'sell'
1513
1649
  :param float amount: how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1514
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1650
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1515
1651
  :param dict [params]: extra parameters specific to the exchange API endpoint
1516
1652
  :param str [params.timeInForce]: "GTC", "IOC", "FOK", or "PO"
1517
1653
  :param bool [params.postOnly]: True or False
@@ -1559,8 +1695,10 @@ class digifinex(Exchange, ImplicitAPI):
1559
1695
  async def create_orders(self, orders: List[OrderRequest], params={}):
1560
1696
  """
1561
1697
  create a list of trade orders(all orders should be of the same symbol)
1562
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1563
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1698
+
1699
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-multiple-order
1700
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#batchorder
1701
+
1564
1702
  :param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
1565
1703
  :param dict [params]: extra parameters specific to the exchange API endpoint
1566
1704
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1593,7 +1731,7 @@ class digifinex(Exchange, ImplicitAPI):
1593
1731
  orderRequest = self.create_order_request(marketId, type, side, amount, price, orderParams)
1594
1732
  ordersRequests.append(orderRequest)
1595
1733
  market = self.market(symbol)
1596
- request = {}
1734
+ request: dict = {}
1597
1735
  response = None
1598
1736
  if market['swap']:
1599
1737
  response = await self.privateSwapPostTradeBatchOrder(ordersRequests)
@@ -1631,7 +1769,7 @@ class digifinex(Exchange, ImplicitAPI):
1631
1769
  result = []
1632
1770
  for i in range(0, len(orders)):
1633
1771
  rawOrder = orders[i]
1634
- individualOrder = {}
1772
+ individualOrder: dict = {}
1635
1773
  individualOrder['order_id'] = data[i]
1636
1774
  individualOrder['instrument_id'] = market['id']
1637
1775
  individualOrder['amount'] = self.safe_number(rawOrder, 'amount')
@@ -1641,13 +1779,13 @@ class digifinex(Exchange, ImplicitAPI):
1641
1779
 
1642
1780
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1643
1781
  """
1644
- * @ignore
1782
+ @ignore
1645
1783
  helper function to build request
1646
1784
  :param str symbol: unified symbol of the market to create an order in
1647
1785
  :param str type: 'market' or 'limit'
1648
1786
  :param str side: 'buy' or 'sell'
1649
1787
  :param float amount: how much you want to trade in units of the base currency, spot market orders use the quote currency, swap requires the number of contracts
1650
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1788
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1651
1789
  :param dict [params]: extra parameters specific to the exchange API endpoint
1652
1790
  :returns dict: request to be sent to the exchange
1653
1791
  """
@@ -1658,7 +1796,7 @@ class digifinex(Exchange, ImplicitAPI):
1658
1796
  marginMode, params = self.handle_margin_mode_and_params('createOrderRequest', params)
1659
1797
  if marginMode is not None:
1660
1798
  marketType = 'margin'
1661
- request = {}
1799
+ request: dict = {}
1662
1800
  swap = (marketType == 'swap')
1663
1801
  isMarketOrder = (type == 'market')
1664
1802
  isLimitOrder = (type == 'limit')
@@ -1733,7 +1871,9 @@ class digifinex(Exchange, ImplicitAPI):
1733
1871
  async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
1734
1872
  """
1735
1873
  create a market buy order by providing the symbol and cost
1736
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1874
+
1875
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#create-new-order
1876
+
1737
1877
  :param str symbol: unified symbol of the market to create an order in
1738
1878
  :param float cost: how much you want to trade in units of the quote currency
1739
1879
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1749,8 +1889,10 @@ class digifinex(Exchange, ImplicitAPI):
1749
1889
  async def cancel_order(self, id: str, symbol: Str = None, params={}):
1750
1890
  """
1751
1891
  cancels an open order
1752
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#cancel-order
1753
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#cancelorder
1892
+
1893
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#cancel-order
1894
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#cancelorder
1895
+
1754
1896
  :param str id: order id
1755
1897
  :param str symbol: not used by digifinex cancelOrder()
1756
1898
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1763,7 +1905,7 @@ class digifinex(Exchange, ImplicitAPI):
1763
1905
  id = str(id)
1764
1906
  marketType = None
1765
1907
  marketType, params = self.handle_market_type_and_params('cancelOrder', market, params)
1766
- request = {
1908
+ request: dict = {
1767
1909
  'order_id': id,
1768
1910
  }
1769
1911
  if marketType == 'swap':
@@ -1809,7 +1951,34 @@ class digifinex(Exchange, ImplicitAPI):
1809
1951
  numCanceledOrders = len(canceledOrders)
1810
1952
  if numCanceledOrders != 1:
1811
1953
  raise OrderNotFound(self.id + ' cancelOrder() ' + id + ' not found')
1812
- return response
1954
+ orders = self.parse_cancel_orders(response)
1955
+ return self.safe_dict(orders, 0)
1956
+ else:
1957
+ return self.safe_order({
1958
+ 'info': response,
1959
+ 'orderId': self.safe_string(response, 'data'),
1960
+ })
1961
+
1962
+ def parse_cancel_orders(self, response):
1963
+ success = self.safe_list(response, 'success')
1964
+ error = self.safe_list(response, 'error')
1965
+ result = []
1966
+ for i in range(0, len(success)):
1967
+ order = success[i]
1968
+ result.append(self.safe_order({
1969
+ 'info': order,
1970
+ 'id': order,
1971
+ 'status': 'canceled',
1972
+ }))
1973
+ for i in range(0, len(error)):
1974
+ order = error[i]
1975
+ result.append(self.safe_order({
1976
+ 'info': order,
1977
+ 'id': self.safe_string_2(order, 'order-id', 'order_id'),
1978
+ 'status': 'failed',
1979
+ 'clientOrderId': self.safe_string(order, 'client-order-id'),
1980
+ }))
1981
+ return result
1813
1982
 
1814
1983
  async def cancel_orders(self, ids, symbol: Str = None, params={}):
1815
1984
  """
@@ -1823,7 +1992,7 @@ class digifinex(Exchange, ImplicitAPI):
1823
1992
  defaultType = self.safe_string(self.options, 'defaultType', 'spot')
1824
1993
  orderType = self.safe_string(params, 'type', defaultType)
1825
1994
  params = self.omit(params, 'type')
1826
- request = {
1995
+ request: dict = {
1827
1996
  'market': orderType,
1828
1997
  'order_id': ','.join(ids),
1829
1998
  }
@@ -1840,14 +2009,10 @@ class digifinex(Exchange, ImplicitAPI):
1840
2009
  # ]
1841
2010
  # }
1842
2011
  #
1843
- canceledOrders = self.safe_value(response, 'success', [])
1844
- numCanceledOrders = len(canceledOrders)
1845
- if numCanceledOrders < 1:
1846
- raise OrderNotFound(self.id + ' cancelOrders() error')
1847
- return response
2012
+ return self.parse_cancel_orders(response)
1848
2013
 
1849
- def parse_order_status(self, status):
1850
- statuses = {
2014
+ def parse_order_status(self, status: Str):
2015
+ statuses: dict = {
1851
2016
  '0': 'open',
1852
2017
  '1': 'open', # partially filled
1853
2018
  '2': 'closed',
@@ -1856,7 +2021,7 @@ class digifinex(Exchange, ImplicitAPI):
1856
2021
  }
1857
2022
  return self.safe_string(statuses, status, status)
1858
2023
 
1859
- def parse_order(self, order, market: Market = None) -> Order:
2024
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1860
2025
  #
1861
2026
  # spot: createOrder
1862
2027
  #
@@ -1975,7 +2140,6 @@ class digifinex(Exchange, ImplicitAPI):
1975
2140
  'postOnly': None,
1976
2141
  'side': side,
1977
2142
  'price': self.safe_number(order, 'price'),
1978
- 'stopPrice': None,
1979
2143
  'triggerPrice': None,
1980
2144
  'amount': self.safe_number_2(order, 'amount', 'size'),
1981
2145
  'filled': self.safe_number_2(order, 'executed_amount', 'filled_qty'),
@@ -1992,8 +2156,10 @@ class digifinex(Exchange, ImplicitAPI):
1992
2156
  async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1993
2157
  """
1994
2158
  fetch all unfilled currently open orders
1995
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#current-active-orders
1996
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#openorder
2159
+
2160
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#current-active-orders
2161
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#openorder
2162
+
1997
2163
  :param str symbol: unified market symbol
1998
2164
  :param int [since]: the earliest time in ms to fetch open orders for
1999
2165
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -2007,7 +2173,7 @@ class digifinex(Exchange, ImplicitAPI):
2007
2173
  marketType = None
2008
2174
  marketType, params = self.handle_market_type_and_params('fetchOpenOrders', market, params)
2009
2175
  marginMode, query = self.handle_margin_mode_and_params('fetchOpenOrders', params)
2010
- request = {}
2176
+ request: dict = {}
2011
2177
  swap = (marketType == 'swap')
2012
2178
  if swap:
2013
2179
  if since is not None:
@@ -2080,14 +2246,16 @@ class digifinex(Exchange, ImplicitAPI):
2080
2246
  # ]
2081
2247
  # }
2082
2248
  #
2083
- data = self.safe_value(response, 'data', [])
2249
+ data = self.safe_list(response, 'data', [])
2084
2250
  return self.parse_orders(data, market, since, limit)
2085
2251
 
2086
2252
  async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
2087
2253
  """
2088
2254
  fetches information on multiple orders made by the user
2089
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-all-orders-including-history-orders
2090
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#historyorder
2255
+
2256
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-all-orders-including-history-orders
2257
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historyorder
2258
+
2091
2259
  :param str symbol: unified market symbol of the market orders were made in
2092
2260
  :param int [since]: the earliest time in ms to fetch orders for
2093
2261
  :param int [limit]: the maximum number of order structures to retrieve
@@ -2101,7 +2269,7 @@ class digifinex(Exchange, ImplicitAPI):
2101
2269
  marketType = None
2102
2270
  marketType, params = self.handle_market_type_and_params('fetchOrders', market, params)
2103
2271
  marginMode, query = self.handle_margin_mode_and_params('fetchOrders', params)
2104
- request = {}
2272
+ request: dict = {}
2105
2273
  if marketType == 'swap':
2106
2274
  if since is not None:
2107
2275
  request['start_timestamp'] = since
@@ -2175,14 +2343,16 @@ class digifinex(Exchange, ImplicitAPI):
2175
2343
  # ]
2176
2344
  # }
2177
2345
  #
2178
- data = self.safe_value(response, 'data', [])
2346
+ data = self.safe_list(response, 'data', [])
2179
2347
  return self.parse_orders(data, market, since, limit)
2180
2348
 
2181
2349
  async def fetch_order(self, id: str, symbol: Str = None, params={}):
2182
2350
  """
2183
2351
  fetches information on an order made by the user
2184
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-order-status
2185
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderinfo
2352
+
2353
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-order-status
2354
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#orderinfo
2355
+
2186
2356
  :param str id: order id
2187
2357
  :param str symbol: unified symbol of the market the order was made in
2188
2358
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -2195,7 +2365,7 @@ class digifinex(Exchange, ImplicitAPI):
2195
2365
  marketType = None
2196
2366
  marketType, params = self.handle_market_type_and_params('fetchOrder', market, params)
2197
2367
  marginMode, query = self.handle_margin_mode_and_params('fetchOrder', params)
2198
- request = {
2368
+ request: dict = {
2199
2369
  'order_id': id,
2200
2370
  }
2201
2371
  if marketType == 'swap':
@@ -2270,8 +2440,10 @@ class digifinex(Exchange, ImplicitAPI):
2270
2440
  async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2271
2441
  """
2272
2442
  fetch all trades made by the user
2273
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#customer-39-s-trades
2274
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#historytrade
2443
+
2444
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#customer-39-s-trades
2445
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#historytrade
2446
+
2275
2447
  :param str symbol: unified market symbol
2276
2448
  :param int [since]: the earliest time in ms to fetch trades for
2277
2449
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -2280,7 +2452,7 @@ class digifinex(Exchange, ImplicitAPI):
2280
2452
  """
2281
2453
  await self.load_markets()
2282
2454
  market = None
2283
- request = {}
2455
+ request: dict = {}
2284
2456
  if symbol is not None:
2285
2457
  market = self.market(symbol)
2286
2458
  marketType = None
@@ -2354,14 +2526,14 @@ class digifinex(Exchange, ImplicitAPI):
2354
2526
  # }
2355
2527
  #
2356
2528
  responseRequest = 'data' if (marketType == 'swap') else 'list'
2357
- data = self.safe_value(response, responseRequest, [])
2529
+ data = self.safe_list(response, responseRequest, [])
2358
2530
  return self.parse_trades(data, market, since, limit)
2359
2531
 
2360
2532
  def parse_ledger_entry_type(self, type):
2361
- types = {}
2533
+ types: dict = {}
2362
2534
  return self.safe_string(types, type, type)
2363
2535
 
2364
- def parse_ledger_entry(self, item, currency: Currency = None):
2536
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2365
2537
  #
2366
2538
  # spot and margin
2367
2539
  #
@@ -2383,13 +2555,15 @@ class digifinex(Exchange, ImplicitAPI):
2383
2555
  # }
2384
2556
  #
2385
2557
  type = self.parse_ledger_entry_type(self.safe_string_2(item, 'type', 'finance_type'))
2386
- code = self.safe_currency_code(self.safe_string_2(item, 'currency_mark', 'currency'), currency)
2558
+ currencyId = self.safe_string_2(item, 'currency_mark', 'currency')
2559
+ code = self.safe_currency_code(currencyId, currency)
2560
+ currency = self.safe_currency(currencyId, currency)
2387
2561
  amount = self.safe_number_2(item, 'num', 'change')
2388
2562
  after = self.safe_number(item, 'balance')
2389
2563
  timestamp = self.safe_timestamp(item, 'time')
2390
2564
  if timestamp is None:
2391
2565
  timestamp = self.safe_integer(item, 'timestamp')
2392
- return {
2566
+ return self.safe_ledger_entry({
2393
2567
  'info': item,
2394
2568
  'id': None,
2395
2569
  'direction': None,
@@ -2405,21 +2579,23 @@ class digifinex(Exchange, ImplicitAPI):
2405
2579
  'timestamp': timestamp,
2406
2580
  'datetime': self.iso8601(timestamp),
2407
2581
  'fee': None,
2408
- }
2582
+ }, currency)
2409
2583
 
2410
- async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2584
+ async def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2411
2585
  """
2412
- fetch the history of changes, actions done by the user or operations that altered balance of the user
2413
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-margin-otc-financial-logs
2414
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#bills
2415
- :param str code: unified currency code, default is None
2586
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
2587
+
2588
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#spot-margin-otc-financial-logs
2589
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#bills
2590
+
2591
+ :param str [code]: unified currency code, default is None
2416
2592
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
2417
- :param int [limit]: max number of ledger entrys to return, default is None
2593
+ :param int [limit]: max number of ledger entries to return, default is None
2418
2594
  :param dict [params]: extra parameters specific to the exchange API endpoint
2419
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2595
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
2420
2596
  """
2421
2597
  await self.load_markets()
2422
- request = {}
2598
+ request: dict = {}
2423
2599
  marketType = None
2424
2600
  marketType, params = self.handle_market_type_and_params('fetchLedger', None, params)
2425
2601
  marginMode, query = self.handle_margin_mode_and_params('fetchLedger', params)
@@ -2488,7 +2664,7 @@ class digifinex(Exchange, ImplicitAPI):
2488
2664
  ledger = self.safe_value(data, 'finance', [])
2489
2665
  return self.parse_ledger(ledger, currency, since, limit)
2490
2666
 
2491
- def parse_deposit_address(self, depositAddress, currency: Currency = None):
2667
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
2492
2668
  #
2493
2669
  # {
2494
2670
  # "addressTag":"",
@@ -2504,12 +2680,12 @@ class digifinex(Exchange, ImplicitAPI):
2504
2680
  return {
2505
2681
  'info': depositAddress,
2506
2682
  'currency': code,
2683
+ 'network': None,
2507
2684
  'address': address,
2508
2685
  'tag': tag,
2509
- 'network': None,
2510
2686
  }
2511
2687
 
2512
- async def fetch_deposit_address(self, code: str, params={}):
2688
+ async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
2513
2689
  """
2514
2690
  fetch the deposit address for a currency associated with self account
2515
2691
  :param str code: unified currency code
@@ -2518,7 +2694,7 @@ class digifinex(Exchange, ImplicitAPI):
2518
2694
  """
2519
2695
  await self.load_markets()
2520
2696
  currency = self.currency(code)
2521
- request = {
2697
+ request: dict = {
2522
2698
  'currency': currency['id'],
2523
2699
  }
2524
2700
  response = await self.privateSpotGetDepositAddress(self.extend(request, params))
@@ -2545,7 +2721,7 @@ class digifinex(Exchange, ImplicitAPI):
2545
2721
  async def fetch_transactions_by_type(self, type, code: Str = None, since: Int = None, limit: Int = None, params={}):
2546
2722
  await self.load_markets()
2547
2723
  currency = None
2548
- request = {
2724
+ request: dict = {
2549
2725
  # 'currency': currency['id'],
2550
2726
  # 'from': 'fromId', # When direct is' prev ', from is 1, returning from old to new ascending, when direct is' next ', from is the ID of the most recent record, returned from the old descending order
2551
2727
  # 'size': 100, # default 100, max 500
@@ -2581,7 +2757,7 @@ class digifinex(Exchange, ImplicitAPI):
2581
2757
  # ]
2582
2758
  # }
2583
2759
  #
2584
- data = self.safe_value(response, 'data', [])
2760
+ data = self.safe_list(response, 'data', [])
2585
2761
  return self.parse_transactions(data, currency, since, limit, {'type': type})
2586
2762
 
2587
2763
  async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
@@ -2606,10 +2782,10 @@ class digifinex(Exchange, ImplicitAPI):
2606
2782
  """
2607
2783
  return await self.fetch_transactions_by_type('withdrawal', code, since, limit, params)
2608
2784
 
2609
- def parse_transaction_status(self, status):
2785
+ def parse_transaction_status(self, status: Str):
2610
2786
  # deposit state includes: 1(in deposit), 2(to be confirmed), 3(successfully deposited), 4(stopped)
2611
2787
  # withdrawal state includes: 1(application in progress), 2(to be confirmed), 3(completed), 4(rejected)
2612
- statuses = {
2788
+ statuses: dict = {
2613
2789
  '1': 'pending', # in Progress
2614
2790
  '2': 'pending', # to be confirmed
2615
2791
  '3': 'ok', # Completed
@@ -2617,7 +2793,7 @@ class digifinex(Exchange, ImplicitAPI):
2617
2793
  }
2618
2794
  return self.safe_string(statuses, status, status)
2619
2795
 
2620
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2796
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2621
2797
  #
2622
2798
  # withdraw
2623
2799
  #
@@ -2680,20 +2856,31 @@ class digifinex(Exchange, ImplicitAPI):
2680
2856
  'fee': fee,
2681
2857
  }
2682
2858
 
2683
- def parse_transfer_status(self, status):
2684
- statuses = {
2859
+ def parse_transfer_status(self, status: Str) -> Str:
2860
+ statuses: dict = {
2685
2861
  '0': 'ok',
2686
2862
  }
2687
2863
  return self.safe_string(statuses, status, status)
2688
2864
 
2689
- def parse_transfer(self, transfer, currency: Currency = None):
2865
+ def parse_transfer(self, transfer: dict, currency: Currency = None) -> TransferEntry:
2690
2866
  #
2691
- # transfer
2867
+ # transfer between spot, margin and OTC
2692
2868
  #
2693
2869
  # {
2694
2870
  # "code": 0
2695
2871
  # }
2696
2872
  #
2873
+ # transfer between spot and swap
2874
+ #
2875
+ # {
2876
+ # "code": 0,
2877
+ # "data": {
2878
+ # "type": 2,
2879
+ # "currency": "USDT",
2880
+ # "transfer_amount": "5"
2881
+ # }
2882
+ # }
2883
+ #
2697
2884
  # fetchTransfers
2698
2885
  #
2699
2886
  # {
@@ -2706,7 +2893,8 @@ class digifinex(Exchange, ImplicitAPI):
2706
2893
  #
2707
2894
  fromAccount = None
2708
2895
  toAccount = None
2709
- type = self.safe_integer(transfer, 'type')
2896
+ data = self.safe_dict(transfer, 'data', transfer)
2897
+ type = self.safe_integer(data, 'type')
2710
2898
  if type == 1:
2711
2899
  fromAccount = 'spot'
2712
2900
  toAccount = 'swap'
@@ -2719,8 +2907,8 @@ class digifinex(Exchange, ImplicitAPI):
2719
2907
  'id': self.safe_string(transfer, 'transfer_id'),
2720
2908
  'timestamp': timestamp,
2721
2909
  'datetime': self.iso8601(timestamp),
2722
- 'currency': self.safe_currency_code(self.safe_string(transfer, 'currency'), currency),
2723
- 'amount': self.safe_number(transfer, 'amount'),
2910
+ 'currency': self.safe_currency_code(self.safe_string(data, 'currency'), currency),
2911
+ 'amount': self.safe_number_2(data, 'amount', 'transfer_amount'),
2724
2912
  'fromAccount': fromAccount,
2725
2913
  'toAccount': toAccount,
2726
2914
  'status': self.parse_transfer_status(self.safe_string(transfer, 'code')),
@@ -2729,33 +2917,59 @@ class digifinex(Exchange, ImplicitAPI):
2729
2917
  async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
2730
2918
  """
2731
2919
  transfer currency internally between wallets on the same account
2920
+
2921
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#transfer-assets-among-accounts
2922
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#accounttransfer
2923
+
2732
2924
  :param str code: unified currency code
2733
2925
  :param float amount: amount to transfer
2734
- :param str fromAccount: account to transfer from
2735
- :param str toAccount: account to transfer to
2926
+ :param str fromAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer from
2927
+ :param str toAccount: 'spot', 'swap', 'margin', 'OTC' - account to transfer to
2736
2928
  :param dict [params]: extra parameters specific to the exchange API endpoint
2737
2929
  :returns dict: a `transfer structure <https://docs.ccxt.com/#/?id=transfer-structure>`
2738
2930
  """
2739
2931
  await self.load_markets()
2740
2932
  currency = self.currency(code)
2933
+ currencyId = currency['id']
2741
2934
  accountsByType = self.safe_value(self.options, 'accountsByType', {})
2742
2935
  fromId = self.safe_string(accountsByType, fromAccount, fromAccount)
2743
2936
  toId = self.safe_string(accountsByType, toAccount, toAccount)
2744
- request = {
2745
- 'currency_mark': currency['id'],
2746
- 'num': self.currency_to_precision(code, amount),
2747
- 'from': fromId, # 1 = SPOT, 2 = MARGIN, 3 = OTC
2748
- 'to': toId, # 1 = SPOT, 2 = MARGIN, 3 = OTC
2749
- }
2750
- response = await self.privateSpotPostTransfer(self.extend(request, params))
2751
- #
2752
- # {
2753
- # "code": 0
2754
- # }
2755
- #
2937
+ request = {}
2938
+ fromSwap = (fromAccount == 'swap')
2939
+ toSwap = (toAccount == 'swap')
2940
+ response = None
2941
+ amountString = self.currency_to_precision(code, amount)
2942
+ if fromSwap or toSwap:
2943
+ if (fromId != '1') and (toId != '1'):
2944
+ raise ExchangeError(self.id + ' transfer() supports transferring between spot and swap, spot and margin, spot and OTC only')
2945
+ request['type'] = 1 if toSwap else 2 # 1 = spot to swap, 2 = swap to spot
2946
+ request['currency'] = currencyId
2947
+ request['transfer_amount'] = amountString
2948
+ #
2949
+ # {
2950
+ # "code": 0,
2951
+ # "data": {
2952
+ # "type": 2,
2953
+ # "currency": "USDT",
2954
+ # "transfer_amount": "5"
2955
+ # }
2956
+ # }
2957
+ #
2958
+ response = await self.privateSwapPostAccountTransfer(self.extend(request, params))
2959
+ else:
2960
+ request['currency_mark'] = currencyId
2961
+ request['num'] = amountString
2962
+ request['from'] = fromId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2963
+ request['to'] = toId # 1 = SPOT, 2 = MARGIN, 3 = OTC
2964
+ #
2965
+ # {
2966
+ # "code": 0
2967
+ # }
2968
+ #
2969
+ response = await self.privateSpotPostTransfer(self.extend(request, params))
2756
2970
  return self.parse_transfer(response, currency)
2757
2971
 
2758
- async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
2972
+ async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
2759
2973
  """
2760
2974
  make a withdrawal
2761
2975
  :param str code: unified currency code
@@ -2769,7 +2983,7 @@ class digifinex(Exchange, ImplicitAPI):
2769
2983
  self.check_address(address)
2770
2984
  await self.load_markets()
2771
2985
  currency = self.currency(code)
2772
- request = {
2986
+ request: dict = {
2773
2987
  # 'chain': 'ERC20', 'OMNI', 'TRC20', # required for USDT
2774
2988
  'address': address,
2775
2989
  'amount': self.currency_to_precision(code, amount),
@@ -2786,9 +3000,9 @@ class digifinex(Exchange, ImplicitAPI):
2786
3000
  #
2787
3001
  return self.parse_transaction(response, currency)
2788
3002
 
2789
- async def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3003
+ async def fetch_borrow_interest(self, code: Str = None, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[BorrowInterest]:
2790
3004
  await self.load_markets()
2791
- request = {}
3005
+ request: dict = {}
2792
3006
  market = None
2793
3007
  if symbol is not None:
2794
3008
  market = self.market(symbol)
@@ -2819,7 +3033,7 @@ class digifinex(Exchange, ImplicitAPI):
2819
3033
  interest = self.parse_borrow_interests(rows, market)
2820
3034
  return self.filter_by_currency_since_limit(interest, code, since, limit)
2821
3035
 
2822
- def parse_borrow_interest(self, info, market: Market = None):
3036
+ def parse_borrow_interest(self, info: dict, market: Market = None) -> BorrowInterest:
2823
3037
  #
2824
3038
  # {
2825
3039
  # "amount": 0.0006103,
@@ -2841,27 +3055,29 @@ class digifinex(Exchange, ImplicitAPI):
2841
3055
  currency = None if (market is None) else market['base']
2842
3056
  symbol = self.safe_symbol(marketId, market)
2843
3057
  return {
2844
- 'account': symbol,
3058
+ 'info': info,
2845
3059
  'symbol': symbol,
2846
3060
  'currency': currency,
2847
3061
  'interest': None,
2848
3062
  'interestRate': 0.001, # all interest rates on digifinex are 0.1%
2849
3063
  'amountBorrowed': self.parse_number(amountBorrowed),
3064
+ 'marginMode': None,
2850
3065
  'timestamp': None,
2851
3066
  'datetime': None,
2852
- 'info': info,
2853
3067
  }
2854
3068
 
2855
- async def fetch_cross_borrow_rate(self, code: str, params={}):
3069
+ async def fetch_cross_borrow_rate(self, code: str, params={}) -> CrossBorrowRate:
2856
3070
  """
2857
3071
  fetch the rate of interest to borrow a currency for margin trading
2858
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3072
+
3073
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3074
+
2859
3075
  :param str code: unified currency code
2860
3076
  :param dict [params]: extra parameters specific to the exchange API endpoint
2861
3077
  :returns dict: a `borrow rate structure <https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure>`
2862
3078
  """
2863
3079
  await self.load_markets()
2864
- request = {}
3080
+ request: dict = {}
2865
3081
  response = await self.privateSpotGetMarginAssets(self.extend(request, params))
2866
3082
  #
2867
3083
  # {
@@ -2889,10 +3105,12 @@ class digifinex(Exchange, ImplicitAPI):
2889
3105
  currency = self.currency(code)
2890
3106
  return self.parse_borrow_rate(result, currency)
2891
3107
 
2892
- async def fetch_cross_borrow_rates(self, params={}):
3108
+ async def fetch_cross_borrow_rates(self, params={}) -> CrossBorrowRates:
2893
3109
  """
2894
3110
  fetch the borrow interest rates of all currencies
2895
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3111
+
3112
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-assets
3113
+
2896
3114
  :param dict [params]: extra parameters specific to the exchange API endpoint
2897
3115
  :returns dict: a list of `borrow rate structures <https://docs.ccxt.com/#/?id=borrow-rate-structure>`
2898
3116
  """
@@ -2947,7 +3165,7 @@ class digifinex(Exchange, ImplicitAPI):
2947
3165
  # "currency": "USDT"
2948
3166
  # },
2949
3167
  #
2950
- result = {}
3168
+ result: dict = {}
2951
3169
  for i in range(0, len(info)):
2952
3170
  item = info[i]
2953
3171
  currency = self.safe_string(item, codeKey)
@@ -2956,10 +3174,12 @@ class digifinex(Exchange, ImplicitAPI):
2956
3174
  result[code] = borrowRate
2957
3175
  return result
2958
3176
 
2959
- async def fetch_funding_rate(self, symbol: str, params={}):
3177
+ async def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
2960
3178
  """
2961
3179
  fetch the current funding rate
2962
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3180
+
3181
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3182
+
2963
3183
  :param str symbol: unified market symbol
2964
3184
  :param dict [params]: extra parameters specific to the exchange API endpoint
2965
3185
  :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
@@ -2968,7 +3188,7 @@ class digifinex(Exchange, ImplicitAPI):
2968
3188
  market = self.market(symbol)
2969
3189
  if not market['swap']:
2970
3190
  raise BadSymbol(self.id + ' fetchFundingRate() supports swap contracts only')
2971
- request = {
3191
+ request: dict = {
2972
3192
  'instrument_id': market['id'],
2973
3193
  }
2974
3194
  response = await self.publicSwapGetPublicFundingRate(self.extend(request, params))
@@ -2984,10 +3204,22 @@ class digifinex(Exchange, ImplicitAPI):
2984
3204
  # }
2985
3205
  # }
2986
3206
  #
2987
- data = self.safe_value(response, 'data', {})
3207
+ data = self.safe_dict(response, 'data', {})
2988
3208
  return self.parse_funding_rate(data, market)
2989
3209
 
2990
- def parse_funding_rate(self, contract, market: Market = None):
3210
+ async def fetch_funding_interval(self, symbol: str, params={}) -> FundingRate:
3211
+ """
3212
+ fetch the current funding rate interval
3213
+
3214
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#currentfundingrate
3215
+
3216
+ :param str symbol: unified market symbol
3217
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3218
+ :returns dict: a `funding rate structure <https://docs.ccxt.com/#/?id=funding-rate-structure>`
3219
+ """
3220
+ return await self.fetch_funding_rate(symbol, params)
3221
+
3222
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
2991
3223
  #
2992
3224
  # {
2993
3225
  # "instrument_id": "BTCUSDTPERP",
@@ -3000,6 +3232,9 @@ class digifinex(Exchange, ImplicitAPI):
3000
3232
  marketId = self.safe_string(contract, 'instrument_id')
3001
3233
  timestamp = self.safe_integer(contract, 'funding_time')
3002
3234
  nextTimestamp = self.safe_integer(contract, 'next_funding_time')
3235
+ fundingTimeString = self.safe_string(contract, 'funding_time')
3236
+ nextFundingTimeString = self.safe_string(contract, 'next_funding_time')
3237
+ millisecondsInterval = Precise.string_sub(nextFundingTimeString, fundingTimeString)
3003
3238
  return {
3004
3239
  'info': contract,
3005
3240
  'symbol': self.safe_symbol(marketId, market),
@@ -3012,14 +3247,25 @@ class digifinex(Exchange, ImplicitAPI):
3012
3247
  'fundingRate': self.safe_number(contract, 'funding_rate'),
3013
3248
  'fundingTimestamp': timestamp,
3014
3249
  'fundingDatetime': self.iso8601(timestamp),
3015
- 'nextFundingRate': self.safe_string(contract, 'next_funding_rate'),
3250
+ 'nextFundingRate': self.safe_number(contract, 'next_funding_rate'),
3016
3251
  'nextFundingTimestamp': nextTimestamp,
3017
3252
  'nextFundingDatetime': self.iso8601(nextTimestamp),
3018
3253
  'previousFundingRate': None,
3019
3254
  'previousFundingTimestamp': None,
3020
3255
  'previousFundingDatetime': None,
3256
+ 'interval': self.parse_funding_interval(millisecondsInterval),
3021
3257
  }
3022
3258
 
3259
+ def parse_funding_interval(self, interval):
3260
+ intervals: dict = {
3261
+ '3600000': '1h',
3262
+ '14400000': '4h',
3263
+ '28800000': '8h',
3264
+ '57600000': '16h',
3265
+ '86400000': '24h',
3266
+ }
3267
+ return self.safe_string(intervals, interval, interval)
3268
+
3023
3269
  async def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3024
3270
  """
3025
3271
  fetches historical funding rate prices
@@ -3035,7 +3281,7 @@ class digifinex(Exchange, ImplicitAPI):
3035
3281
  market = self.market(symbol)
3036
3282
  if not market['swap']:
3037
3283
  raise BadSymbol(self.id + ' fetchFundingRateHistory() supports swap contracts only')
3038
- request = {
3284
+ request: dict = {
3039
3285
  'instrument_id': market['id'],
3040
3286
  }
3041
3287
  if since is not None:
@@ -3076,10 +3322,12 @@ class digifinex(Exchange, ImplicitAPI):
3076
3322
  sorted = self.sort_by(rates, 'timestamp')
3077
3323
  return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
3078
3324
 
3079
- async def fetch_trading_fee(self, symbol: str, params={}):
3325
+ async def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
3080
3326
  """
3081
3327
  fetch the trading fees for a market
3082
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3328
+
3329
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#tradingfee
3330
+
3083
3331
  :param str symbol: unified market symbol
3084
3332
  :param dict [params]: extra parameters specific to the exchange API endpoint
3085
3333
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3088,7 +3336,7 @@ class digifinex(Exchange, ImplicitAPI):
3088
3336
  market = self.market(symbol)
3089
3337
  if not market['swap']:
3090
3338
  raise BadRequest(self.id + ' fetchTradingFee() supports swap markets only')
3091
- request = {
3339
+ request: dict = {
3092
3340
  'instrument_id': market['id'],
3093
3341
  }
3094
3342
  response = await self.privateSwapGetAccountTradingFeeRate(self.extend(request, params))
@@ -3105,7 +3353,7 @@ class digifinex(Exchange, ImplicitAPI):
3105
3353
  data = self.safe_value(response, 'data', {})
3106
3354
  return self.parse_trading_fee(data, market)
3107
3355
 
3108
- def parse_trading_fee(self, fee, market: Market = None):
3356
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
3109
3357
  #
3110
3358
  # {
3111
3359
  # "instrument_id": "BTCUSDTPERP",
@@ -3120,20 +3368,24 @@ class digifinex(Exchange, ImplicitAPI):
3120
3368
  'symbol': symbol,
3121
3369
  'maker': self.safe_number(fee, 'maker_fee_rate'),
3122
3370
  'taker': self.safe_number(fee, 'taker_fee_rate'),
3371
+ 'percentage': None,
3372
+ 'tierBased': None,
3123
3373
  }
3124
3374
 
3125
3375
  async def fetch_positions(self, symbols: Strings = None, params={}):
3126
3376
  """
3127
3377
  fetch all open positions
3128
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3129
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3378
+
3379
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3380
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3381
+
3130
3382
  :param str[]|None symbols: list of unified market symbols
3131
3383
  :param dict [params]: extra parameters specific to the exchange API endpoint
3132
3384
  :returns dict[]: a list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
3133
3385
  """
3134
3386
  await self.load_markets()
3135
3387
  symbols = self.market_symbols(symbols)
3136
- request = {}
3388
+ request: dict = {}
3137
3389
  market = None
3138
3390
  marketType = None
3139
3391
  if symbols is not None:
@@ -3222,8 +3474,10 @@ class digifinex(Exchange, ImplicitAPI):
3222
3474
 
3223
3475
  async def fetch_position(self, symbol: str, params={}):
3224
3476
  """
3225
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3226
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3477
+
3478
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#margin-positions
3479
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positions
3480
+
3227
3481
  fetch data on a single open contract trade position
3228
3482
  :param str symbol: unified market symbol of the market the position is held in
3229
3483
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3231,7 +3485,7 @@ class digifinex(Exchange, ImplicitAPI):
3231
3485
  """
3232
3486
  await self.load_markets()
3233
3487
  market = self.market(symbol)
3234
- request = {}
3488
+ request: dict = {}
3235
3489
  marketType = None
3236
3490
  marketType, params = self.handle_market_type_and_params('fetchPosition', market, params)
3237
3491
  marginMode, query = self.handle_margin_mode_and_params('fetchPosition', params)
@@ -3307,7 +3561,7 @@ class digifinex(Exchange, ImplicitAPI):
3307
3561
  position['marginRatio'] = self.safe_number(response, 'margin_rate')
3308
3562
  return position
3309
3563
 
3310
- def parse_position(self, position, market: Market = None):
3564
+ def parse_position(self, position: dict, market: Market = None):
3311
3565
  #
3312
3566
  # swap
3313
3567
  #
@@ -3391,7 +3645,9 @@ class digifinex(Exchange, ImplicitAPI):
3391
3645
  async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
3392
3646
  """
3393
3647
  set the level of leverage for a market
3394
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3648
+
3649
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#setleverage
3650
+
3395
3651
  :param float leverage: the rate of leverage
3396
3652
  :param str symbol: unified market symbol
3397
3653
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3407,7 +3663,7 @@ class digifinex(Exchange, ImplicitAPI):
3407
3663
  raise BadSymbol(self.id + ' setLeverage() supports swap contracts only')
3408
3664
  if (leverage < 1) or (leverage > 100):
3409
3665
  raise BadRequest(self.id + ' leverage should be between 1 and 100')
3410
- request = {
3666
+ request: dict = {
3411
3667
  'instrument_id': market['id'],
3412
3668
  'leverage': leverage,
3413
3669
  }
@@ -3437,10 +3693,12 @@ class digifinex(Exchange, ImplicitAPI):
3437
3693
  # }
3438
3694
  #
3439
3695
 
3440
- async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
3696
+ async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
3441
3697
  """
3442
3698
  fetch the transfer history, only transfers between spot and swap accounts are supported
3443
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#transferrecord
3699
+
3700
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#transferrecord
3701
+
3444
3702
  :param str code: unified currency code of the currency transferred
3445
3703
  :param int [since]: the earliest time in ms to fetch transfers for
3446
3704
  :param int [limit]: the maximum number of transfers to retrieve
@@ -3449,7 +3707,7 @@ class digifinex(Exchange, ImplicitAPI):
3449
3707
  """
3450
3708
  await self.load_markets()
3451
3709
  currency = None
3452
- request = {}
3710
+ request: dict = {}
3453
3711
  if code is not None:
3454
3712
  currency = self.safe_currency_code(code)
3455
3713
  request['currency'] = currency['id']
@@ -3473,12 +3731,14 @@ class digifinex(Exchange, ImplicitAPI):
3473
3731
  # ]
3474
3732
  # }
3475
3733
  #
3476
- transfers = self.safe_value(response, 'data', [])
3734
+ transfers = self.safe_list(response, 'data', [])
3477
3735
  return self.parse_transfers(transfers, currency, since, limit)
3478
3736
 
3479
- async def fetch_leverage_tiers(self, symbols: Strings = None, params={}):
3737
+ async def fetch_leverage_tiers(self, symbols: Strings = None, params={}) -> LeverageTiers:
3480
3738
  """
3481
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3739
+
3740
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instruments
3741
+
3482
3742
  retrieve information on the maximum leverage, for different trade sizes
3483
3743
  :param str[]|None symbols: a list of unified market symbols
3484
3744
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3517,56 +3777,14 @@ class digifinex(Exchange, ImplicitAPI):
3517
3777
  #
3518
3778
  data = self.safe_value(response, 'data', [])
3519
3779
  symbols = self.market_symbols(symbols)
3520
- return self.parse_leverage_tiers(data, symbols, 'symbol')
3521
-
3522
- def parse_leverage_tiers(self, response, symbols: Strings = None, marketIdKey=None):
3523
- #
3524
- # [
3525
- # {
3526
- # "instrument_id": "BTCUSDTPERP",
3527
- # "type": "REAL",
3528
- # "contract_type": "PERPETUAL",
3529
- # "base_currency": "BTC",
3530
- # "quote_currency": "USDT",
3531
- # "clear_currency": "USDT",
3532
- # "contract_value": "0.001",
3533
- # "contract_value_currency": "BTC",
3534
- # "is_inverse": False,
3535
- # "is_trading": True,
3536
- # "status": "ONLINE",
3537
- # "price_precision": 1,
3538
- # "tick_size": "0.1",
3539
- # "min_order_amount": 1,
3540
- # "open_max_limits": [
3541
- # {
3542
- # "leverage": "50",
3543
- # "max_limit": "1000000"
3544
- # }
3545
- # ]
3546
- # },
3547
- # ]
3548
- #
3549
- tiers = {}
3550
- result = {}
3551
- for i in range(0, len(response)):
3552
- entry = response[i]
3553
- marketId = self.safe_string(entry, 'instrument_id')
3554
- market = self.safe_market(marketId)
3555
- symbol = self.safe_symbol(marketId, market)
3556
- symbolsLength = 0
3557
- tiers[symbol] = self.parse_market_leverage_tiers(response[i], market)
3558
- if symbols is not None:
3559
- symbolsLength = len(symbols)
3560
- if self.in_array(symbol, symbols):
3561
- result[symbol] = self.parse_market_leverage_tiers(response[i], market)
3562
- if symbol is not None and (symbolsLength == 0 or self.in_array(symbols, symbol)):
3563
- result[symbol] = self.parse_market_leverage_tiers(response[i], market)
3564
- return result
3780
+ return self.parse_leverage_tiers(data, symbols, 'instrument_id')
3565
3781
 
3566
- async def fetch_market_leverage_tiers(self, symbol: str, params={}):
3782
+ async def fetch_market_leverage_tiers(self, symbol: str, params={}) -> List[LeverageTier]:
3567
3783
  """
3568
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3569
3784
  retrieve information on the maximum leverage, for different trade sizes for a single market
3785
+
3786
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#instrument
3787
+
3570
3788
  :param str symbol: unified market symbol
3571
3789
  :param dict [params]: extra parameters specific to the exchange API endpoint
3572
3790
  :returns dict: a `leverage tiers structure <https://docs.ccxt.com/#/?id=leverage-tiers-structure>`
@@ -3575,7 +3793,7 @@ class digifinex(Exchange, ImplicitAPI):
3575
3793
  market = self.market(symbol)
3576
3794
  if not market['swap']:
3577
3795
  raise BadRequest(self.id + ' fetchMarketLeverageTiers() supports swap markets only')
3578
- request = {
3796
+ request: dict = {
3579
3797
  'instrument_id': market['id'],
3580
3798
  }
3581
3799
  response = await self.publicSwapGetPublicInstrument(self.extend(request, params))
@@ -3609,7 +3827,7 @@ class digifinex(Exchange, ImplicitAPI):
3609
3827
  data = self.safe_value(response, 'data', {})
3610
3828
  return self.parse_market_leverage_tiers(data, market)
3611
3829
 
3612
- def parse_market_leverage_tiers(self, info, market: Market = None):
3830
+ def parse_market_leverage_tiers(self, info, market: Market = None) -> List[LeverageTier]:
3613
3831
  #
3614
3832
  # {
3615
3833
  # "instrument_id": "BTCUSDTPERP",
@@ -3639,9 +3857,10 @@ class digifinex(Exchange, ImplicitAPI):
3639
3857
  for i in range(0, len(brackets)):
3640
3858
  tier = brackets[i]
3641
3859
  marketId = self.safe_string(info, 'instrument_id')
3642
- market = self.safe_market(marketId)
3860
+ market = self.safe_market(marketId, market)
3643
3861
  tiers.append({
3644
3862
  'tier': self.sum(i, 1),
3863
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3645
3864
  'currency': market['settle'],
3646
3865
  'minNotional': None,
3647
3866
  'maxNotional': self.safe_number(tier, 'max_limit'),
@@ -3653,7 +3872,7 @@ class digifinex(Exchange, ImplicitAPI):
3653
3872
 
3654
3873
  def handle_margin_mode_and_params(self, methodName, params={}, defaultValue=None):
3655
3874
  """
3656
- * @ignore
3875
+ @ignore
3657
3876
  marginMode specified by params["marginMode"], self.options["marginMode"], self.options["defaultMarginMode"], params["margin"] = True or self.options["defaultType"] = 'margin'
3658
3877
  :param dict [params]: extra parameters specific to the exchange API endpoint
3659
3878
  :returns Array: the marginMode in lowercase
@@ -3673,7 +3892,9 @@ class digifinex(Exchange, ImplicitAPI):
3673
3892
  async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
3674
3893
  """
3675
3894
  fetch deposit and withdraw fees
3676
- :see: https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3895
+
3896
+ https://docs.digifinex.com/en-ww/spot/v3/rest.html#get-currency-deposit-and-withdrawal-information
3897
+
3677
3898
  :param str[]|None codes: not used by fetchDepositWithdrawFees()
3678
3899
  :param dict [params]: extra parameters specific to the exchange API endpoint
3679
3900
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -3709,7 +3930,7 @@ class digifinex(Exchange, ImplicitAPI):
3709
3930
  # "code": 200,
3710
3931
  # }
3711
3932
  #
3712
- data = self.safe_value(response, 'data')
3933
+ data = self.safe_list(response, 'data')
3713
3934
  return self.parse_deposit_withdraw_fees(data, codes)
3714
3935
 
3715
3936
  def parse_deposit_withdraw_fees(self, response, codes=None, currencyIdKey=None):
@@ -3739,7 +3960,7 @@ class digifinex(Exchange, ImplicitAPI):
3739
3960
  # },
3740
3961
  # ]
3741
3962
  #
3742
- depositWithdrawFees = {}
3963
+ depositWithdrawFees: dict = {}
3743
3964
  codes = self.market_codes(codes)
3744
3965
  for i in range(0, len(response)):
3745
3966
  entry = response[i]
@@ -3753,11 +3974,11 @@ class digifinex(Exchange, ImplicitAPI):
3753
3974
  depositWithdrawFees[code]['info'].append(entry)
3754
3975
  networkId = self.safe_string(entry, 'chain')
3755
3976
  withdrawFee = self.safe_value(entry, 'min_withdraw_fee')
3756
- withdrawResult = {
3977
+ withdrawResult: dict = {
3757
3978
  'fee': withdrawFee,
3758
3979
  'percentage': False if (withdrawFee is not None) else None,
3759
3980
  }
3760
- depositResult = {
3981
+ depositResult: dict = {
3761
3982
  'fee': None,
3762
3983
  'percentage': None,
3763
3984
  }
@@ -3777,10 +3998,12 @@ class digifinex(Exchange, ImplicitAPI):
3777
3998
  depositWithdrawFees[code] = self.assign_default_deposit_withdraw_fees(depositWithdrawFees[code], currency)
3778
3999
  return depositWithdrawFees
3779
4000
 
3780
- async def add_margin(self, symbol: str, amount, params={}):
4001
+ async def add_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3781
4002
  """
3782
4003
  add margin to a position
3783
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4004
+
4005
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4006
+
3784
4007
  :param str symbol: unified market symbol
3785
4008
  :param float amount: amount of margin to add
3786
4009
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3791,10 +4014,12 @@ class digifinex(Exchange, ImplicitAPI):
3791
4014
  self.check_required_argument('addMargin', side, 'side', ['long', 'short'])
3792
4015
  return await self.modify_margin_helper(symbol, amount, 1, params)
3793
4016
 
3794
- async def reduce_margin(self, symbol: str, amount, params={}):
4017
+ async def reduce_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
3795
4018
  """
3796
4019
  remove margin from a position
3797
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4020
+
4021
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmargin
4022
+
3798
4023
  :param str symbol: unified market symbol
3799
4024
  :param float amount: the amount of margin to remove
3800
4025
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3805,11 +4030,11 @@ class digifinex(Exchange, ImplicitAPI):
3805
4030
  self.check_required_argument('reduceMargin', side, 'side', ['long', 'short'])
3806
4031
  return await self.modify_margin_helper(symbol, amount, 2, params)
3807
4032
 
3808
- async def modify_margin_helper(self, symbol: str, amount, type, params={}):
4033
+ async def modify_margin_helper(self, symbol: str, amount, type, params={}) -> MarginModification:
3809
4034
  await self.load_markets()
3810
4035
  side = self.safe_string(params, 'side')
3811
4036
  market = self.market(symbol)
3812
- request = {
4037
+ request: dict = {
3813
4038
  'instrument_id': market['id'],
3814
4039
  'amount': self.number_to_string(amount),
3815
4040
  'type': type,
@@ -3834,7 +4059,7 @@ class digifinex(Exchange, ImplicitAPI):
3834
4059
  'status': status,
3835
4060
  })
3836
4061
 
3837
- def parse_margin_modification(self, data, market: Market = None):
4062
+ def parse_margin_modification(self, data: dict, market: Market = None) -> MarginModification:
3838
4063
  #
3839
4064
  # {
3840
4065
  # "instrument_id": "BTCUSDTPERP",
@@ -3847,18 +4072,23 @@ class digifinex(Exchange, ImplicitAPI):
3847
4072
  rawType = self.safe_integer(data, 'type')
3848
4073
  return {
3849
4074
  'info': data,
4075
+ 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3850
4076
  'type': 'add' if (rawType == 1) else 'reduce',
4077
+ 'marginMode': 'isolated',
3851
4078
  'amount': self.safe_number(data, 'amount'),
3852
4079
  'total': None,
3853
4080
  'code': market['settle'],
3854
- 'symbol': self.safe_symbol(marketId, market, None, 'swap'),
3855
4081
  'status': None,
4082
+ 'timestamp': None,
4083
+ 'datetime': None,
3856
4084
  }
3857
4085
 
3858
4086
  async def fetch_funding_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
3859
4087
  """
3860
4088
  fetch the history of funding payments paid and received on self account
3861
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#funding-fee
4089
+
4090
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#funding-fee
4091
+
3862
4092
  :param str [symbol]: unified market symbol
3863
4093
  :param int [since]: the earliest time in ms to fetch funding history for
3864
4094
  :param int [limit]: the maximum number of funding history structures to retrieve
@@ -3867,7 +4097,7 @@ class digifinex(Exchange, ImplicitAPI):
3867
4097
  :returns dict: a `funding history structure <https://docs.ccxt.com/#/?id=funding-history-structure>`
3868
4098
  """
3869
4099
  await self.load_markets()
3870
- request = {}
4100
+ request: dict = {}
3871
4101
  request, params = self.handle_until_option('end_timestamp', request, params)
3872
4102
  market = None
3873
4103
  if symbol is not None:
@@ -3891,7 +4121,7 @@ class digifinex(Exchange, ImplicitAPI):
3891
4121
  # ]
3892
4122
  # }
3893
4123
  #
3894
- data = self.safe_value(response, 'data', [])
4124
+ data = self.safe_list(response, 'data', [])
3895
4125
  return self.parse_incomes(data, market, since, limit)
3896
4126
 
3897
4127
  def parse_income(self, income, market: Market = None):
@@ -3919,7 +4149,9 @@ class digifinex(Exchange, ImplicitAPI):
3919
4149
  async def set_margin_mode(self, marginMode: str, symbol: Str = None, params={}):
3920
4150
  """
3921
4151
  set margin mode to 'cross' or 'isolated'
3922
- :see: https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4152
+
4153
+ https://docs.digifinex.com/en-ww/swap/v2/rest.html#positionmode
4154
+
3923
4155
  :param str marginMode: 'cross' or 'isolated'
3924
4156
  :param str symbol: unified market symbol
3925
4157
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -3932,7 +4164,7 @@ class digifinex(Exchange, ImplicitAPI):
3932
4164
  marginMode = marginMode.lower()
3933
4165
  if marginMode == 'cross':
3934
4166
  marginMode = 'crossed'
3935
- request = {
4167
+ request: dict = {
3936
4168
  'instrument_id': market['id'],
3937
4169
  'margin_mode': marginMode,
3938
4170
  }
@@ -3985,7 +4217,7 @@ class digifinex(Exchange, ImplicitAPI):
3985
4217
  url += '?' + urlencoded
3986
4218
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
3987
4219
 
3988
- def handle_errors(self, statusCode, statusText, url, method, responseHeaders, responseBody, response, requestHeaders, requestBody):
4220
+ def handle_errors(self, statusCode: int, statusText: str, url: str, method: str, responseHeaders: dict, responseBody, response, requestHeaders, requestBody):
3989
4221
  if not response:
3990
4222
  return None # fall back to default error handler
3991
4223
  code = self.safe_string(response, 'code')