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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +24 -0
  44. ccxt/abstract/kucoinfutures.py +34 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3030 -1087
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3205 -937
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +238 -49
  89. ccxt/async_support/bitget.py +1525 -573
  90. ccxt/async_support/bithumb.py +199 -65
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +392 -148
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2231 -1193
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1454 -287
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +223 -97
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +404 -109
  125. ccxt/async_support/deribit.py +639 -323
  126. ccxt/async_support/digifinex.py +465 -233
  127. ccxt/async_support/ellipx.py +1887 -0
  128. ccxt/async_support/exmo.py +317 -128
  129. ccxt/async_support/gate.py +1472 -463
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +433 -178
  133. ccxt/async_support/hollaex.py +207 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +178 -56
  136. ccxt/async_support/hyperliquid.py +1678 -292
  137. ccxt/async_support/idex.py +219 -95
  138. ccxt/async_support/independentreserve.py +300 -31
  139. ccxt/async_support/indodax.py +226 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +917 -357
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +198 -107
  145. ccxt/async_support/latoken.py +199 -79
  146. ccxt/async_support/lbank.py +360 -113
  147. ccxt/async_support/luno.py +185 -62
  148. ccxt/async_support/lykke.py +168 -55
  149. ccxt/async_support/mercado.py +101 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +53 -0
  152. ccxt/async_support/ndax.py +234 -82
  153. ccxt/async_support/novadax.py +195 -75
  154. ccxt/async_support/oceanex.py +244 -59
  155. ccxt/async_support/okcoin.py +301 -165
  156. ccxt/async_support/okx.py +1776 -454
  157. ccxt/async_support/onetrading.py +198 -414
  158. ccxt/async_support/oxfun.py +2898 -0
  159. ccxt/async_support/p2b.py +142 -52
  160. ccxt/async_support/paradex.py +2085 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1137 -296
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1722 -480
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3030 -1087
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3205 -937
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +238 -49
  197. ccxt/bitget.py +1525 -573
  198. ccxt/bithumb.py +198 -65
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +392 -148
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2231 -1193
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1454 -287
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +223 -97
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +404 -109
  233. ccxt/deribit.py +639 -323
  234. ccxt/digifinex.py +465 -233
  235. ccxt/ellipx.py +1887 -0
  236. ccxt/exmo.py +317 -128
  237. ccxt/gate.py +1472 -463
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +433 -178
  241. ccxt/hollaex.py +207 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +178 -56
  244. ccxt/hyperliquid.py +1677 -292
  245. ccxt/idex.py +219 -95
  246. ccxt/independentreserve.py +299 -31
  247. ccxt/indodax.py +226 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +917 -357
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +198 -107
  253. ccxt/latoken.py +199 -79
  254. ccxt/lbank.py +360 -113
  255. ccxt/luno.py +185 -62
  256. ccxt/lykke.py +168 -55
  257. ccxt/mercado.py +101 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +53 -0
  260. ccxt/ndax.py +234 -82
  261. ccxt/novadax.py +195 -75
  262. ccxt/oceanex.py +244 -59
  263. ccxt/okcoin.py +301 -165
  264. ccxt/okx.py +1776 -454
  265. ccxt/onetrading.py +198 -414
  266. ccxt/oxfun.py +2897 -0
  267. ccxt/p2b.py +142 -52
  268. ccxt/paradex.py +2085 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +62 -14
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +143 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +203 -81
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +965 -665
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +167 -31
  309. ccxt/pro/exmo.py +252 -20
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +92 -33
  336. ccxt/pro/poloniex.py +128 -49
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +92 -85
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +437 -65
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +456 -391
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +456 -393
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1137 -296
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.49.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.49.dist-info/METADATA +646 -0
  497. ccxt-4.4.49.dist-info/RECORD +669 -0
  498. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.77.dist-info/METADATA +0 -626
  545. ccxt-4.2.77.dist-info/RECORD +0 -534
  546. {ccxt-4.2.77.dist-info → ccxt-4.4.49.dist-info}/top_level.txt +0 -0
ccxt/cryptocom.py CHANGED
@@ -6,9 +6,10 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.cryptocom import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
9
+ from ccxt.base.types import Account, Balances, Currency, DepositAddress, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
12
13
  from ccxt.base.errors import PermissionDenied
13
14
  from ccxt.base.errors import AccountNotEnabled
14
15
  from ccxt.base.errors import ArgumentsRequired
@@ -16,11 +17,13 @@ from ccxt.base.errors import BadRequest
16
17
  from ccxt.base.errors import BadSymbol
17
18
  from ccxt.base.errors import InsufficientFunds
18
19
  from ccxt.base.errors import InvalidOrder
20
+ from ccxt.base.errors import OrderNotFound
19
21
  from ccxt.base.errors import NotSupported
20
22
  from ccxt.base.errors import DDoSProtection
23
+ from ccxt.base.errors import RateLimitExceeded
21
24
  from ccxt.base.errors import OnMaintenance
22
25
  from ccxt.base.errors import InvalidNonce
23
- from ccxt.base.errors import AuthenticationError
26
+ from ccxt.base.errors import RequestTimeout
24
27
  from ccxt.base.decimal_to_precision import TICK_SIZE
25
28
  from ccxt.base.precise import Precise
26
29
 
@@ -47,6 +50,7 @@ class cryptocom(Exchange, ImplicitAPI):
47
50
  'cancelAllOrders': True,
48
51
  'cancelOrder': True,
49
52
  'cancelOrders': True,
53
+ 'cancelOrdersForSymbols': True,
50
54
  'closeAllPositions': False,
51
55
  'closePosition': True,
52
56
  'createMarketBuyOrderWithCost': False,
@@ -54,6 +58,8 @@ class cryptocom(Exchange, ImplicitAPI):
54
58
  'createMarketSellOrderWithCost': False,
55
59
  'createOrder': True,
56
60
  'createOrders': True,
61
+ 'createStopOrder': True,
62
+ 'createTriggerOrder': True,
57
63
  'fetchAccounts': True,
58
64
  'fetchBalance': True,
59
65
  'fetchBidsAsks': False,
@@ -65,6 +71,7 @@ class cryptocom(Exchange, ImplicitAPI):
65
71
  'fetchCrossBorrowRates': False,
66
72
  'fetchCurrencies': False,
67
73
  'fetchDepositAddress': True,
74
+ 'fetchDepositAddresses': False,
68
75
  'fetchDepositAddressesByNetwork': True,
69
76
  'fetchDeposits': True,
70
77
  'fetchDepositsWithdrawals': False,
@@ -81,6 +88,7 @@ class cryptocom(Exchange, ImplicitAPI):
81
88
  'fetchLedger': True,
82
89
  'fetchLeverage': False,
83
90
  'fetchLeverageTiers': False,
91
+ 'fetchMarginAdjustmentHistory': False,
84
92
  'fetchMarginMode': False,
85
93
  'fetchMarketLeverageTiers': False,
86
94
  'fetchMarkets': True,
@@ -93,8 +101,10 @@ class cryptocom(Exchange, ImplicitAPI):
93
101
  'fetchOrderBook': True,
94
102
  'fetchOrders': True,
95
103
  'fetchPosition': True,
104
+ 'fetchPositionHistory': False,
96
105
  'fetchPositionMode': False,
97
106
  'fetchPositions': True,
107
+ 'fetchPositionsHistory': False,
98
108
  'fetchPremiumIndexOHLCV': False,
99
109
  'fetchSettlementHistory': True,
100
110
  'fetchStatus': False,
@@ -102,8 +112,8 @@ class cryptocom(Exchange, ImplicitAPI):
102
112
  'fetchTickers': True,
103
113
  'fetchTime': False,
104
114
  'fetchTrades': True,
105
- 'fetchTradingFee': False,
106
- 'fetchTradingFees': False,
115
+ 'fetchTradingFee': True,
116
+ 'fetchTradingFees': True,
107
117
  'fetchTransactionFees': False,
108
118
  'fetchTransactions': False,
109
119
  'fetchTransfers': False,
@@ -113,6 +123,7 @@ class cryptocom(Exchange, ImplicitAPI):
113
123
  'reduceMargin': False,
114
124
  'repayCrossMargin': False,
115
125
  'repayIsolatedMargin': False,
126
+ 'sandbox': True,
116
127
  'setLeverage': False,
117
128
  'setMarginMode': False,
118
129
  'setPositionMode': False,
@@ -148,7 +159,7 @@ class cryptocom(Exchange, ImplicitAPI):
148
159
  'www': 'https://crypto.com/',
149
160
  'referral': {
150
161
  'url': 'https://crypto.com/exch/kdacthrnxt',
151
- 'discount': 0.15,
162
+ 'discount': 0.75,
152
163
  },
153
164
  'doc': [
154
165
  'https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html',
@@ -170,6 +181,10 @@ class cryptocom(Exchange, ImplicitAPI):
170
181
  'public/get-valuations': 1,
171
182
  'public/get-expired-settlement-price': 10 / 3,
172
183
  'public/get-insurance': 1,
184
+ 'public/get-risk-parameters': 1,
185
+ },
186
+ 'post': {
187
+ 'public/staking/get-conversion-rate': 2,
173
188
  },
174
189
  },
175
190
  'private': {
@@ -200,6 +215,18 @@ class cryptocom(Exchange, ImplicitAPI):
200
215
  'private/get-accounts': 10 / 3,
201
216
  'private/get-withdrawal-history': 10 / 3,
202
217
  'private/get-deposit-history': 10 / 3,
218
+ 'private/get-fee-rate': 2,
219
+ 'private/get-instrument-fee-rate': 2,
220
+ 'private/staking/stake': 2,
221
+ 'private/staking/unstake': 2,
222
+ 'private/staking/get-staking-position': 2,
223
+ 'private/staking/get-staking-instruments': 2,
224
+ 'private/staking/get-open-stake': 2,
225
+ 'private/staking/get-stake-history': 2,
226
+ 'private/staking/get-reward-history': 2,
227
+ 'private/staking/convert': 2,
228
+ 'private/staking/get-open-convert': 2,
229
+ 'private/staking/get-convert-history': 2,
203
230
  },
204
231
  },
205
232
  },
@@ -339,6 +366,97 @@ class cryptocom(Exchange, ImplicitAPI):
339
366
  },
340
367
  'broker': 'CCXT',
341
368
  },
369
+ 'features': {
370
+ 'default': {
371
+ 'sandbox': True,
372
+ 'createOrder': {
373
+ 'marginMode': True,
374
+ 'triggerPrice': True,
375
+ # todo: implementation fix
376
+ 'triggerPriceType': {
377
+ 'last': True,
378
+ 'mark': True,
379
+ 'index': True,
380
+ },
381
+ 'triggerDirection': False,
382
+ 'stopLossPrice': True,
383
+ 'takeProfitPrice': True,
384
+ 'attachedStopLossTakeProfit': None,
385
+ 'timeInForce': {
386
+ 'IOC': True,
387
+ 'FOK': True,
388
+ 'PO': True,
389
+ 'GTD': False,
390
+ },
391
+ 'hedged': False,
392
+ 'selfTradePrevention': True, # todo: implement
393
+ 'trailing': False,
394
+ 'iceberg': False,
395
+ 'leverage': False,
396
+ 'marketBuyByCost': True,
397
+ 'marketBuyRequiresPrice': True,
398
+ },
399
+ 'createOrders': {
400
+ 'max': 10,
401
+ },
402
+ 'fetchMyTrades': {
403
+ 'marginMode': False,
404
+ 'limit': 100,
405
+ 'daysBack': None,
406
+ 'untilDays': 1,
407
+ },
408
+ 'fetchOrder': {
409
+ 'marginMode': False,
410
+ 'trigger': False,
411
+ 'trailing': False,
412
+ },
413
+ 'fetchOpenOrders': {
414
+ 'marginMode': True,
415
+ 'limit': 100,
416
+ 'trigger': False,
417
+ 'trailing': False,
418
+ },
419
+ 'fetchOrders': {
420
+ 'marginMode': False,
421
+ 'limit': 100,
422
+ 'daysBack': None,
423
+ 'untilDays': 1,
424
+ 'trigger': False,
425
+ 'trailing': False,
426
+ },
427
+ 'fetchClosedOrders': {
428
+ 'marginMode': False,
429
+ 'limit': 100,
430
+ 'daysBack': None,
431
+ 'daysBackCanceled': None,
432
+ 'untilDays': 1,
433
+ 'trigger': False,
434
+ 'trailing': False,
435
+ },
436
+ 'fetchOHLCV': {
437
+ 'limit': 300,
438
+ },
439
+ },
440
+ 'spot': {
441
+ 'extends': 'default',
442
+ },
443
+ 'swap': {
444
+ 'linear': {
445
+ 'extends': 'default',
446
+ },
447
+ 'inverse': {
448
+ 'extends': 'default',
449
+ },
450
+ },
451
+ 'future': {
452
+ 'linear': {
453
+ 'extends': 'default',
454
+ },
455
+ 'inverse': {
456
+ 'extends': 'default',
457
+ },
458
+ },
459
+ },
342
460
  # https://exchange-docs.crypto.com/spot/index.html#response-and-reason-codes
343
461
  'commonCurrencies': {
344
462
  'USD_STABLE_COIN': 'USDC',
@@ -383,16 +501,29 @@ class cryptocom(Exchange, ImplicitAPI):
383
501
  '40006': BadRequest,
384
502
  '40007': BadRequest,
385
503
  '40101': AuthenticationError,
386
- '50001': BadRequest,
504
+ '40102': InvalidNonce, # Nonce value differs by more than 60 seconds from server
505
+ '40103': AuthenticationError, # IP address not whitelisted
506
+ '40104': AuthenticationError, # Disallowed based on user tier
507
+ '40107': BadRequest, # Session subscription limit has been exceeded
508
+ '40401': OrderNotFound,
509
+ '40801': RequestTimeout,
510
+ '42901': RateLimitExceeded,
511
+ '43005': InvalidOrder, # Rejected POST_ONLY create-order request(normally happened when exec_inst contains POST_ONLY but time_in_force is NOT GOOD_TILL_CANCEL)
512
+ '43003': InvalidOrder, # FOK order has not been filled and cancelled
513
+ '43004': InvalidOrder, # IOC order has not been filled and cancelled
514
+ '43012': BadRequest, # Canceled due to Self Trade Prevention
515
+ '50001': ExchangeError,
387
516
  '9010001': OnMaintenance, # {"code":9010001,"message":"SYSTEM_MAINTENANCE","details":"Crypto.com Exchange is currently under maintenance. Please refer to https://status.crypto.com for more details."}
388
517
  },
389
518
  'broad': {},
390
519
  },
391
520
  })
392
521
 
393
- def fetch_markets(self, params={}):
522
+ def fetch_markets(self, params={}) -> List[Market]:
394
523
  """
395
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-instruments
524
+
525
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-instruments
526
+
396
527
  retrieves data on all markets for cryptocom
397
528
  :param dict [params]: extra parameters specific to the exchange API endpoint
398
529
  :returns dict[]: an array of objects representing market data
@@ -485,8 +616,8 @@ class cryptocom(Exchange, ImplicitAPI):
485
616
  # }
486
617
  # }
487
618
  #
488
- resultResponse = self.safe_value(response, 'result', {})
489
- data = self.safe_value(resultResponse, 'data', [])
619
+ resultResponse = self.safe_dict(response, 'result', {})
620
+ data = self.safe_list(resultResponse, 'data', [])
490
621
  result = []
491
622
  for i in range(0, len(data)):
492
623
  market = data[i]
@@ -503,9 +634,10 @@ class cryptocom(Exchange, ImplicitAPI):
503
634
  settle = None if spot else self.safe_currency_code(settleId)
504
635
  optionType = self.safe_string_lower(market, 'put_call')
505
636
  strike = self.safe_string(market, 'strike')
506
- marginBuyEnabled = self.safe_value(market, 'margin_buy_enabled')
507
- marginSellEnabled = self.safe_value(market, 'margin_sell_enabled')
508
- expiry = self.omit_zero(self.safe_integer(market, 'expiry_timestamp_ms'))
637
+ marginBuyEnabled = self.safe_bool(market, 'margin_buy_enabled')
638
+ marginSellEnabled = self.safe_bool(market, 'margin_sell_enabled')
639
+ expiryString = self.omit_zero(self.safe_string(market, 'expiry_timestamp_ms'))
640
+ expiry = int(expiryString) if (expiryString is not None) else None
509
641
  symbol = base + '/' + quote
510
642
  type = None
511
643
  contract = None
@@ -540,7 +672,7 @@ class cryptocom(Exchange, ImplicitAPI):
540
672
  'swap': swap,
541
673
  'future': future,
542
674
  'option': option,
543
- 'active': self.safe_value(market, 'tradable'),
675
+ 'active': self.safe_bool(market, 'tradable'),
544
676
  'contract': contract,
545
677
  'linear': True if (contract) else None,
546
678
  'inverse': False if (contract) else None,
@@ -579,15 +711,17 @@ class cryptocom(Exchange, ImplicitAPI):
579
711
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
580
712
  """
581
713
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
582
- :see: https://exchange-docs.crypto.com/spot/index.html#public-get-ticker
583
- :see: https://exchange-docs.crypto.com/derivatives/index.html#public-get-tickers
714
+
715
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-tickers
716
+ https://exchange-docs.crypto.com/derivatives/index.html#public-get-tickers
717
+
584
718
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
585
719
  :param dict [params]: extra parameters specific to the exchange API endpoint
586
720
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
587
721
  """
588
722
  self.load_markets()
589
723
  market = None
590
- request = {}
724
+ request: dict = {}
591
725
  if symbols is not None:
592
726
  symbol = None
593
727
  if isinstance(symbols, list):
@@ -624,13 +758,15 @@ class cryptocom(Exchange, ImplicitAPI):
624
758
  # }
625
759
  # }
626
760
  #
627
- result = self.safe_value(response, 'result', {})
628
- data = self.safe_value(result, 'data', [])
761
+ result = self.safe_dict(response, 'result', {})
762
+ data = self.safe_list(result, 'data', [])
629
763
  return self.parse_tickers(data, symbols)
630
764
 
631
765
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
632
766
  """
633
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-tickers
767
+
768
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-tickers
769
+
634
770
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
635
771
  :param str symbol: unified symbol of the market to fetch the ticker for
636
772
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -644,7 +780,9 @@ class cryptocom(Exchange, ImplicitAPI):
644
780
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
645
781
  """
646
782
  fetches information on multiple orders made by the user
647
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-history
783
+
784
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-history
785
+
648
786
  :param str symbol: unified market symbol of the market the orders were made in
649
787
  :param int [since]: the earliest time in ms to fetch orders for, max date range is one day
650
788
  :param int [limit]: the maximum number of order structures to retrieve, default 100 max 100
@@ -659,7 +797,7 @@ class cryptocom(Exchange, ImplicitAPI):
659
797
  if paginate:
660
798
  return self.fetch_paginated_call_dynamic('fetchOrders', symbol, since, limit, params)
661
799
  market = None
662
- request = {}
800
+ request: dict = {}
663
801
  if symbol is not None:
664
802
  market = self.market(symbol)
665
803
  request['instrument_name'] = market['id']
@@ -667,8 +805,8 @@ class cryptocom(Exchange, ImplicitAPI):
667
805
  request['start_time'] = since
668
806
  if limit is not None:
669
807
  request['limit'] = limit
670
- until = self.safe_integer_2(params, 'until', 'till')
671
- params = self.omit(params, ['until', 'till'])
808
+ until = self.safe_integer(params, 'until')
809
+ params = self.omit(params, ['until'])
672
810
  if until is not None:
673
811
  request['end_time'] = until
674
812
  response = self.v1PrivatePostPrivateGetOrderHistory(self.extend(request, params))
@@ -711,14 +849,16 @@ class cryptocom(Exchange, ImplicitAPI):
711
849
  # }
712
850
  # }
713
851
  #
714
- data = self.safe_value(response, 'result', {})
715
- orders = self.safe_value(data, 'data', [])
852
+ data = self.safe_dict(response, 'result', {})
853
+ orders = self.safe_list(data, 'data', [])
716
854
  return self.parse_orders(orders, market, since, limit)
717
855
 
718
856
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
719
857
  """
720
858
  get a list of the most recent trades for a particular symbol
721
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-trades
859
+
860
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-trades
861
+
722
862
  :param str symbol: unified symbol of the market to fetch trades for
723
863
  :param int [since]: timestamp in ms of the earliest trade to fetch, maximum date range is one day
724
864
  :param int [limit]: the maximum number of trades to fetch
@@ -733,15 +873,15 @@ class cryptocom(Exchange, ImplicitAPI):
733
873
  if paginate:
734
874
  return self.fetch_paginated_call_dynamic('fetchTrades', symbol, since, limit, params)
735
875
  market = self.market(symbol)
736
- request = {
876
+ request: dict = {
737
877
  'instrument_name': market['id'],
738
878
  }
739
879
  if since is not None:
740
880
  request['start_ts'] = since
741
881
  if limit is not None:
742
882
  request['count'] = limit
743
- until = self.safe_integer_2(params, 'until', 'till')
744
- params = self.omit(params, ['until', 'till'])
883
+ until = self.safe_integer(params, 'until')
884
+ params = self.omit(params, ['until'])
745
885
  if until is not None:
746
886
  request['end_ts'] = until
747
887
  response = self.v1PublicGetPublicGetTrades(self.extend(request, params))
@@ -765,14 +905,16 @@ class cryptocom(Exchange, ImplicitAPI):
765
905
  # }
766
906
  # }
767
907
  #
768
- result = self.safe_value(response, 'result', {})
769
- trades = self.safe_value(result, 'data', [])
908
+ result = self.safe_dict(response, 'result', {})
909
+ trades = self.safe_list(result, 'data', [])
770
910
  return self.parse_trades(trades, market, since, limit)
771
911
 
772
912
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
773
913
  """
774
914
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
775
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-candlestick
915
+
916
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-candlestick
917
+
776
918
  :param str symbol: unified symbol of the market to fetch OHLCV data for
777
919
  :param str timeframe: the length of time each candle represents
778
920
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -788,17 +930,25 @@ class cryptocom(Exchange, ImplicitAPI):
788
930
  if paginate:
789
931
  return self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, 300)
790
932
  market = self.market(symbol)
791
- request = {
933
+ request: dict = {
792
934
  'instrument_name': market['id'],
793
935
  'timeframe': self.safe_string(self.timeframes, timeframe, timeframe),
794
936
  }
795
- if since is not None:
796
- request['start_ts'] = since
797
937
  if limit is not None:
938
+ if limit > 300:
939
+ limit = 300
798
940
  request['count'] = limit
799
- until = self.safe_integer_2(params, 'until', 'till')
800
- params = self.omit(params, ['until', 'till'])
801
- if until is not None:
941
+ now = self.microseconds()
942
+ duration = self.parse_timeframe(timeframe)
943
+ until = self.safe_integer(params, 'until', now)
944
+ params = self.omit(params, ['until'])
945
+ if since is not None:
946
+ request['start_ts'] = since - duration * 1000
947
+ if limit is not None:
948
+ request['end_ts'] = self.sum(since, duration * limit * 1000)
949
+ else:
950
+ request['end_ts'] = until
951
+ else:
802
952
  request['end_ts'] = until
803
953
  response = self.v1PublicGetPublicGetCandlestick(self.extend(request, params))
804
954
  #
@@ -822,14 +972,16 @@ class cryptocom(Exchange, ImplicitAPI):
822
972
  # }
823
973
  # }
824
974
  #
825
- result = self.safe_value(response, 'result', {})
826
- data = self.safe_value(result, 'data', [])
975
+ result = self.safe_dict(response, 'result', {})
976
+ data = self.safe_list(result, 'data', [])
827
977
  return self.parse_ohlcvs(data, market, timeframe, since, limit)
828
978
 
829
979
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
830
980
  """
831
981
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
832
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-book
982
+
983
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-book
984
+
833
985
  :param str symbol: unified symbol of the market to fetch the order book for
834
986
  :param int [limit]: the number of order book entries to return, max 50
835
987
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -837,7 +989,7 @@ class cryptocom(Exchange, ImplicitAPI):
837
989
  """
838
990
  self.load_markets()
839
991
  market = self.market(symbol)
840
- request = {
992
+ request: dict = {
841
993
  'instrument_name': market['id'],
842
994
  }
843
995
  if limit:
@@ -861,17 +1013,17 @@ class cryptocom(Exchange, ImplicitAPI):
861
1013
  # }
862
1014
  # }
863
1015
  #
864
- result = self.safe_value(response, 'result', {})
865
- data = self.safe_value(result, 'data', [])
1016
+ result = self.safe_dict(response, 'result', {})
1017
+ data = self.safe_list(result, 'data', [])
866
1018
  orderBook = self.safe_value(data, 0)
867
1019
  timestamp = self.safe_integer(orderBook, 't')
868
1020
  return self.parse_order_book(orderBook, symbol, timestamp)
869
1021
 
870
1022
  def parse_balance(self, response) -> Balances:
871
- responseResult = self.safe_value(response, 'result', {})
872
- data = self.safe_value(responseResult, 'data', [])
1023
+ responseResult = self.safe_dict(response, 'result', {})
1024
+ data = self.safe_list(responseResult, 'data', [])
873
1025
  positionBalances = self.safe_value(data[0], 'position_balances', [])
874
- result = {'info': response}
1026
+ result: dict = {'info': response}
875
1027
  for i in range(0, len(positionBalances)):
876
1028
  balance = positionBalances[i]
877
1029
  currencyId = self.safe_string(balance, 'instrument_name')
@@ -885,7 +1037,9 @@ class cryptocom(Exchange, ImplicitAPI):
885
1037
  def fetch_balance(self, params={}) -> Balances:
886
1038
  """
887
1039
  query for balance and get the amount of funds available for trading or funds locked in orders
888
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-user-balance
1040
+
1041
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-user-balance
1042
+
889
1043
  :param dict [params]: extra parameters specific to the exchange API endpoint
890
1044
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
891
1045
  """
@@ -939,7 +1093,10 @@ class cryptocom(Exchange, ImplicitAPI):
939
1093
  def fetch_order(self, id: str, symbol: Str = None, params={}):
940
1094
  """
941
1095
  fetches information on an order made by the user
942
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-detail
1096
+
1097
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-order-detail
1098
+
1099
+ :param str id: order id
943
1100
  :param str symbol: unified symbol of the market the order was made in
944
1101
  :param dict [params]: extra parameters specific to the exchange API endpoint
945
1102
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -948,7 +1105,7 @@ class cryptocom(Exchange, ImplicitAPI):
948
1105
  market = None
949
1106
  if symbol is not None:
950
1107
  market = self.market(symbol)
951
- request = {
1108
+ request: dict = {
952
1109
  'order_id': id,
953
1110
  }
954
1111
  response = self.v1PrivatePostPrivateGetOrderDetail(self.extend(request, params))
@@ -985,13 +1142,13 @@ class cryptocom(Exchange, ImplicitAPI):
985
1142
  # }
986
1143
  # }
987
1144
  #
988
- order = self.safe_value(response, 'result', {})
1145
+ order = self.safe_dict(response, 'result', {})
989
1146
  return self.parse_order(order, market)
990
1147
 
991
1148
  def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
992
1149
  market = self.market(symbol)
993
1150
  uppercaseType = type.upper()
994
- request = {
1151
+ request: dict = {
995
1152
  'instrument_name': market['id'],
996
1153
  'side': side.upper(),
997
1154
  'quantity': self.amount_to_precision(symbol, amount),
@@ -1073,16 +1230,18 @@ class cryptocom(Exchange, ImplicitAPI):
1073
1230
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1074
1231
  """
1075
1232
  create a trade order
1076
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
1233
+
1234
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order
1235
+
1077
1236
  :param str symbol: unified symbol of the market to create an order in
1078
1237
  :param str type: 'market', 'limit', 'stop_loss', 'stop_limit', 'take_profit', 'take_profit_limit'
1079
1238
  :param str side: 'buy' or 'sell'
1080
1239
  :param float amount: how much you want to trade in units of base currency
1081
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1240
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1082
1241
  :param dict [params]: extra parameters specific to the exchange API endpoint
1083
1242
  :param str [params.timeInForce]: 'GTC', 'IOC', 'FOK' or 'PO'
1084
1243
  :param str [params.ref_price_type]: 'MARK_PRICE', 'INDEX_PRICE', 'LAST_PRICE' which trigger price type to use, default is MARK_PRICE
1085
- :param float [params.stopPrice]: price to trigger a stop order
1244
+ :param float [params.triggerPrice]: price to trigger a trigger order
1086
1245
  :param float [params.stopLossPrice]: price to trigger a stop-loss trigger order
1087
1246
  :param float [params.takeProfitPrice]: price to trigger a take-profit trigger order
1088
1247
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1102,15 +1261,18 @@ class cryptocom(Exchange, ImplicitAPI):
1102
1261
  # }
1103
1262
  # }
1104
1263
  #
1105
- result = self.safe_value(response, 'result', {})
1264
+ result = self.safe_dict(response, 'result', {})
1106
1265
  return self.parse_order(result, market)
1107
1266
 
1108
1267
  def create_orders(self, orders: List[OrderRequest], params={}):
1109
1268
  """
1110
1269
  create a list of trade orders
1111
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-list
1112
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-oco
1270
+
1271
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-list
1272
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-order-list-oco
1273
+
1113
1274
  :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
1275
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1114
1276
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1115
1277
  """
1116
1278
  self.load_markets()
@@ -1122,11 +1284,11 @@ class cryptocom(Exchange, ImplicitAPI):
1122
1284
  side = self.safe_string(rawOrder, 'side')
1123
1285
  amount = self.safe_value(rawOrder, 'amount')
1124
1286
  price = self.safe_value(rawOrder, 'price')
1125
- orderParams = self.safe_value(rawOrder, 'params', {})
1287
+ orderParams = self.safe_dict(rawOrder, 'params', {})
1126
1288
  orderRequest = self.create_advanced_order_request(marketId, type, side, amount, price, orderParams)
1127
1289
  ordersRequests.append(orderRequest)
1128
1290
  contigency = self.safe_string(params, 'contingency_type', 'LIST')
1129
- request = {
1291
+ request: dict = {
1130
1292
  'contingency_type': contigency, # or OCO
1131
1293
  'order_list': ordersRequests,
1132
1294
  }
@@ -1186,7 +1348,7 @@ class cryptocom(Exchange, ImplicitAPI):
1186
1348
  # and market-buy orders need to send notional instead of quantity
1187
1349
  market = self.market(symbol)
1188
1350
  uppercaseType = type.upper()
1189
- request = {
1351
+ request: dict = {
1190
1352
  'instrument_name': market['id'],
1191
1353
  'side': side.upper(),
1192
1354
  }
@@ -1278,14 +1440,16 @@ class cryptocom(Exchange, ImplicitAPI):
1278
1440
  def cancel_all_orders(self, symbol: Str = None, params={}):
1279
1441
  """
1280
1442
  cancel all open orders
1281
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
1443
+
1444
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-all-orders
1445
+
1282
1446
  :param str symbol: unified market symbol of the orders to cancel
1283
1447
  :param dict [params]: extra parameters specific to the exchange API endpoint
1284
1448
  :returns dict} Returns exchange raw message{@link https://docs.ccxt.com/#/?id=order-structure:
1285
1449
  """
1286
1450
  self.load_markets()
1287
1451
  market = None
1288
- request = {}
1452
+ request: dict = {}
1289
1453
  if symbol is not None:
1290
1454
  market = self.market(symbol)
1291
1455
  request['instrument_name'] = market['id']
@@ -1294,7 +1458,9 @@ class cryptocom(Exchange, ImplicitAPI):
1294
1458
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1295
1459
  """
1296
1460
  cancels an open order
1297
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
1461
+
1462
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order
1463
+
1298
1464
  :param str id: the order id of the order to cancel
1299
1465
  :param str [symbol]: unified symbol of the market the order was made in
1300
1466
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1304,7 +1470,7 @@ class cryptocom(Exchange, ImplicitAPI):
1304
1470
  market = None
1305
1471
  if symbol is not None:
1306
1472
  market = self.market(symbol)
1307
- request = {
1473
+ request: dict = {
1308
1474
  'order_id': id,
1309
1475
  }
1310
1476
  response = self.v1PrivatePostPrivateCancelOrder(self.extend(request, params))
@@ -1320,13 +1486,15 @@ class cryptocom(Exchange, ImplicitAPI):
1320
1486
  # }
1321
1487
  # }
1322
1488
  #
1323
- result = self.safe_value(response, 'result', {})
1489
+ result = self.safe_dict(response, 'result', {})
1324
1490
  return self.parse_order(result, market)
1325
1491
 
1326
1492
  def cancel_orders(self, ids, symbol: Str = None, params={}):
1327
1493
  """
1328
1494
  cancel multiple orders
1329
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
1495
+
1496
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
1497
+
1330
1498
  :param str[] ids: order ids
1331
1499
  :param str symbol: unified market symbol
1332
1500
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1339,23 +1507,55 @@ class cryptocom(Exchange, ImplicitAPI):
1339
1507
  orderRequests = []
1340
1508
  for i in range(0, len(ids)):
1341
1509
  id = ids[i]
1342
- order = {
1510
+ order: dict = {
1343
1511
  'instrument_name': market['id'],
1344
1512
  'order_id': str(id),
1345
1513
  }
1346
1514
  orderRequests.append(order)
1347
- request = {
1515
+ request: dict = {
1348
1516
  'contingency_type': 'LIST',
1349
1517
  'order_list': orderRequests,
1350
1518
  }
1351
1519
  response = self.v1PrivatePostPrivateCancelOrderList(self.extend(request, params))
1352
- result = self.safe_value(response, 'result', [])
1520
+ result = self.safe_list(response, 'result', [])
1353
1521
  return self.parse_orders(result, market, None, None, params)
1354
1522
 
1523
+ def cancel_orders_for_symbols(self, orders: List[CancellationRequest], params={}):
1524
+ """
1525
+ cancel multiple orders for multiple symbols
1526
+
1527
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
1528
+
1529
+ :param CancellationRequest[] orders: each order should contain the parameters required by cancelOrder namely id and symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
1530
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1531
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1532
+ """
1533
+ self.load_markets()
1534
+ orderRequests = []
1535
+ for i in range(0, len(orders)):
1536
+ order = orders[i]
1537
+ id = self.safe_string(order, 'id')
1538
+ symbol = self.safe_string(order, 'symbol')
1539
+ market = self.market(symbol)
1540
+ orderItem: dict = {
1541
+ 'instrument_name': market['id'],
1542
+ 'order_id': str(id),
1543
+ }
1544
+ orderRequests.append(orderItem)
1545
+ request: dict = {
1546
+ 'contingency_type': 'LIST',
1547
+ 'order_list': orderRequests,
1548
+ }
1549
+ response = self.v1PrivatePostPrivateCancelOrderList(self.extend(request, params))
1550
+ result = self.safe_list(response, 'result', [])
1551
+ return self.parse_orders(result, None, None, None, params)
1552
+
1355
1553
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1356
1554
  """
1357
1555
  fetch all unfilled currently open orders
1358
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-open-orders
1556
+
1557
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-open-orders
1558
+
1359
1559
  :param str symbol: unified market symbol
1360
1560
  :param int [since]: the earliest time in ms to fetch open orders for
1361
1561
  :param int [limit]: the maximum number of open order structures to retrieve
@@ -1364,7 +1564,7 @@ class cryptocom(Exchange, ImplicitAPI):
1364
1564
  """
1365
1565
  self.load_markets()
1366
1566
  market = None
1367
- request = {}
1567
+ request: dict = {}
1368
1568
  if symbol is not None:
1369
1569
  market = self.market(symbol)
1370
1570
  request['instrument_name'] = market['id']
@@ -1406,14 +1606,16 @@ class cryptocom(Exchange, ImplicitAPI):
1406
1606
  # }
1407
1607
  # }
1408
1608
  #
1409
- data = self.safe_value(response, 'result', {})
1410
- orders = self.safe_value(data, 'data', [])
1609
+ data = self.safe_dict(response, 'result', {})
1610
+ orders = self.safe_list(data, 'data', [])
1411
1611
  return self.parse_orders(orders, market, since, limit)
1412
1612
 
1413
1613
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1414
1614
  """
1415
1615
  fetch all trades made by the user
1416
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-trades
1616
+
1617
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-trades
1618
+
1417
1619
  :param str symbol: unified market symbol
1418
1620
  :param int [since]: the earliest time in ms to fetch trades for, maximum date range is one day
1419
1621
  :param int [limit]: the maximum number of trade structures to retrieve
@@ -1426,8 +1628,8 @@ class cryptocom(Exchange, ImplicitAPI):
1426
1628
  paginate = False
1427
1629
  paginate, params = self.handle_option_and_params(params, 'fetchMyTrades', 'paginate')
1428
1630
  if paginate:
1429
- return self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params)
1430
- request = {}
1631
+ return self.fetch_paginated_call_dynamic('fetchMyTrades', symbol, since, limit, params, 100)
1632
+ request: dict = {}
1431
1633
  market = None
1432
1634
  if symbol is not None:
1433
1635
  market = self.market(symbol)
@@ -1436,8 +1638,8 @@ class cryptocom(Exchange, ImplicitAPI):
1436
1638
  request['start_time'] = since
1437
1639
  if limit is not None:
1438
1640
  request['limit'] = limit
1439
- until = self.safe_integer_2(params, 'until', 'till')
1440
- params = self.omit(params, ['until', 'till'])
1641
+ until = self.safe_integer(params, 'until')
1642
+ params = self.omit(params, ['until'])
1441
1643
  if until is not None:
1442
1644
  request['end_time'] = until
1443
1645
  response = self.v1PrivatePostPrivateGetTrades(self.extend(request, params))
@@ -1470,8 +1672,8 @@ class cryptocom(Exchange, ImplicitAPI):
1470
1672
  # }
1471
1673
  # }
1472
1674
  #
1473
- result = self.safe_value(response, 'result', {})
1474
- trades = self.safe_value(result, 'data', [])
1675
+ result = self.safe_dict(response, 'result', {})
1676
+ trades = self.safe_list(result, 'data', [])
1475
1677
  return self.parse_trades(trades, market, since, limit)
1476
1678
 
1477
1679
  def parse_address(self, addressString):
@@ -1486,10 +1688,12 @@ class cryptocom(Exchange, ImplicitAPI):
1486
1688
  address = addressString
1487
1689
  return [address, tag]
1488
1690
 
1489
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1691
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
1490
1692
  """
1491
1693
  make a withdrawal
1492
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-withdrawal
1694
+
1695
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-create-withdrawal
1696
+
1493
1697
  :param str code: unified currency code
1494
1698
  :param float amount: the amount to withdraw
1495
1699
  :param str address: the address to withdraw to
@@ -1499,8 +1703,8 @@ class cryptocom(Exchange, ImplicitAPI):
1499
1703
  """
1500
1704
  tag, params = self.handle_withdraw_tag_and_params(tag, params)
1501
1705
  self.load_markets()
1502
- currency = self.currency(code)
1503
- request = {
1706
+ currency = self.safe_currency(code) # for instance, USDC is not inferred from markets but it's still available
1707
+ request: dict = {
1504
1708
  'currency': currency['id'],
1505
1709
  'amount': amount,
1506
1710
  'address': address,
@@ -1529,20 +1733,22 @@ class cryptocom(Exchange, ImplicitAPI):
1529
1733
  # }
1530
1734
  # }
1531
1735
  #
1532
- result = self.safe_value(response, 'result')
1736
+ result = self.safe_dict(response, 'result')
1533
1737
  return self.parse_transaction(result, currency)
1534
1738
 
1535
- def fetch_deposit_addresses_by_network(self, code: str, params={}):
1739
+ def fetch_deposit_addresses_by_network(self, code: str, params={}) -> List[DepositAddress]:
1536
1740
  """
1537
1741
  fetch a dictionary of addresses for a currency, indexed by network
1538
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-address
1742
+
1743
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-address
1744
+
1539
1745
  :param str code: unified currency code of the currency for the deposit address
1540
1746
  :param dict [params]: extra parameters specific to the exchange API endpoint
1541
1747
  :returns dict: a dictionary of `address structures <https://docs.ccxt.com/#/?id=address-structure>` indexed by the network
1542
1748
  """
1543
1749
  self.load_markets()
1544
- currency = self.currency(code)
1545
- request = {
1750
+ currency = self.safe_currency(code)
1751
+ request: dict = {
1546
1752
  'currency': currency['id'],
1547
1753
  }
1548
1754
  response = self.v1PrivatePostPrivateGetDepositAddress(self.extend(request, params))
@@ -1565,14 +1771,14 @@ class cryptocom(Exchange, ImplicitAPI):
1565
1771
  # }
1566
1772
  # }
1567
1773
  #
1568
- data = self.safe_value(response, 'result', {})
1569
- addresses = self.safe_value(data, 'deposit_address_list', [])
1774
+ data = self.safe_dict(response, 'result', {})
1775
+ addresses = self.safe_list(data, 'deposit_address_list', [])
1570
1776
  addressesLength = len(addresses)
1571
1777
  if addressesLength == 0:
1572
1778
  raise ExchangeError(self.id + ' fetchDepositAddressesByNetwork() generating address...')
1573
- result = {}
1779
+ result: dict = {}
1574
1780
  for i in range(0, addressesLength):
1575
- value = self.safe_value(addresses, i)
1781
+ value = self.safe_dict(addresses, i)
1576
1782
  addressString = self.safe_string(value, 'address')
1577
1783
  currencyId = self.safe_string(value, 'currency')
1578
1784
  responseCode = self.safe_currency_code(currencyId)
@@ -1583,15 +1789,18 @@ class cryptocom(Exchange, ImplicitAPI):
1583
1789
  result[network] = {
1584
1790
  'info': value,
1585
1791
  'currency': responseCode,
1792
+ 'network': network,
1586
1793
  'address': address,
1587
1794
  'tag': tag,
1588
- 'network': network,
1589
1795
  }
1590
1796
  return result
1591
1797
 
1592
- def fetch_deposit_address(self, code: str, params={}):
1798
+ def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
1593
1799
  """
1594
1800
  fetch the deposit address for a currency associated with self account
1801
+
1802
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-address
1803
+
1595
1804
  :param str code: unified currency code
1596
1805
  :param dict [params]: extra parameters specific to the exchange API endpoint
1597
1806
  :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
@@ -1605,22 +1814,12 @@ class cryptocom(Exchange, ImplicitAPI):
1605
1814
  keys = list(depositAddresses.keys())
1606
1815
  return depositAddresses[keys[0]]
1607
1816
 
1608
- def safe_network(self, networkId):
1609
- networksById = {
1610
- 'BTC': 'BTC',
1611
- 'ETH': 'ETH',
1612
- 'SOL': 'SOL',
1613
- 'BNB': 'BNB',
1614
- 'CRONOS': 'CRONOS',
1615
- 'MATIC': 'MATIC',
1616
- 'OP': 'OP',
1617
- }
1618
- return self.safe_string(networksById, networkId, networkId)
1619
-
1620
1817
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1621
1818
  """
1622
1819
  fetch all deposits made to an account
1623
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-history
1820
+
1821
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-deposit-history
1822
+
1624
1823
  :param str code: unified currency code
1625
1824
  :param int [since]: the earliest time in ms to fetch deposits for
1626
1825
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -1630,17 +1829,17 @@ class cryptocom(Exchange, ImplicitAPI):
1630
1829
  """
1631
1830
  self.load_markets()
1632
1831
  currency = None
1633
- request = {}
1832
+ request: dict = {}
1634
1833
  if code is not None:
1635
- currency = self.currency(code)
1834
+ currency = self.safe_currency(code)
1636
1835
  request['currency'] = currency['id']
1637
1836
  if since is not None:
1638
1837
  # 90 days date range
1639
1838
  request['start_ts'] = since
1640
1839
  if limit is not None:
1641
1840
  request['page_size'] = limit
1642
- until = self.safe_integer_2(params, 'until', 'till')
1643
- params = self.omit(params, ['until', 'till'])
1841
+ until = self.safe_integer(params, 'until')
1842
+ params = self.omit(params, ['until'])
1644
1843
  if until is not None:
1645
1844
  request['end_ts'] = until
1646
1845
  response = self.v1PrivatePostPrivateGetDepositHistory(self.extend(request, params))
@@ -1666,14 +1865,16 @@ class cryptocom(Exchange, ImplicitAPI):
1666
1865
  # }
1667
1866
  # }
1668
1867
  #
1669
- data = self.safe_value(response, 'result', {})
1670
- depositList = self.safe_value(data, 'deposit_list', [])
1868
+ data = self.safe_dict(response, 'result', {})
1869
+ depositList = self.safe_list(data, 'deposit_list', [])
1671
1870
  return self.parse_transactions(depositList, currency, since, limit)
1672
1871
 
1673
1872
  def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1674
1873
  """
1675
1874
  fetch all withdrawals made from an account
1676
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-withdrawal-history
1875
+
1876
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-withdrawal-history
1877
+
1677
1878
  :param str code: unified currency code
1678
1879
  :param int [since]: the earliest time in ms to fetch withdrawals for
1679
1880
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -1683,17 +1884,17 @@ class cryptocom(Exchange, ImplicitAPI):
1683
1884
  """
1684
1885
  self.load_markets()
1685
1886
  currency = None
1686
- request = {}
1887
+ request: dict = {}
1687
1888
  if code is not None:
1688
- currency = self.currency(code)
1889
+ currency = self.safe_currency(code)
1689
1890
  request['currency'] = currency['id']
1690
1891
  if since is not None:
1691
1892
  # 90 days date range
1692
1893
  request['start_ts'] = since
1693
1894
  if limit is not None:
1694
1895
  request['page_size'] = limit
1695
- until = self.safe_integer_2(params, 'until', 'till')
1696
- params = self.omit(params, ['until', 'till'])
1896
+ until = self.safe_integer(params, 'until')
1897
+ params = self.omit(params, ['until'])
1697
1898
  if until is not None:
1698
1899
  request['end_ts'] = until
1699
1900
  response = self.v1PrivatePostPrivateGetWithdrawalHistory(self.extend(request, params))
@@ -1721,11 +1922,11 @@ class cryptocom(Exchange, ImplicitAPI):
1721
1922
  # }
1722
1923
  # }
1723
1924
  #
1724
- data = self.safe_value(response, 'result', {})
1725
- withdrawalList = self.safe_value(data, 'withdrawal_list', [])
1925
+ data = self.safe_dict(response, 'result', {})
1926
+ withdrawalList = self.safe_list(data, 'withdrawal_list', [])
1726
1927
  return self.parse_transactions(withdrawalList, currency, since, limit)
1727
1928
 
1728
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
1929
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
1729
1930
  #
1730
1931
  # fetchTicker
1731
1932
  #
@@ -1786,7 +1987,7 @@ class cryptocom(Exchange, ImplicitAPI):
1786
1987
  'info': ticker,
1787
1988
  }, market)
1788
1989
 
1789
- def parse_trade(self, trade, market: Market = None) -> Trade:
1990
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
1790
1991
  #
1791
1992
  # fetchTrades
1792
1993
  #
@@ -1865,8 +2066,8 @@ class cryptocom(Exchange, ImplicitAPI):
1865
2066
  self.safe_number(ohlcv, 'v'),
1866
2067
  ]
1867
2068
 
1868
- def parse_order_status(self, status):
1869
- statuses = {
2069
+ def parse_order_status(self, status: Str):
2070
+ statuses: dict = {
1870
2071
  'ACTIVE': 'open',
1871
2072
  'CANCELED': 'canceled',
1872
2073
  'FILLED': 'closed',
@@ -1875,15 +2076,15 @@ class cryptocom(Exchange, ImplicitAPI):
1875
2076
  }
1876
2077
  return self.safe_string(statuses, status, status)
1877
2078
 
1878
- def parse_time_in_force(self, timeInForce):
1879
- timeInForces = {
2079
+ def parse_time_in_force(self, timeInForce: Str):
2080
+ timeInForces: dict = {
1880
2081
  'GOOD_TILL_CANCEL': 'GTC',
1881
2082
  'IMMEDIATE_OR_CANCEL': 'IOC',
1882
2083
  'FILL_OR_KILL': 'FOK',
1883
2084
  }
1884
2085
  return self.safe_string(timeInForces, timeInForce, timeInForce)
1885
2086
 
1886
- def parse_order(self, order, market: Market = None) -> Order:
2087
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1887
2088
  #
1888
2089
  # createOrder, cancelOrder
1889
2090
  #
@@ -1978,7 +2179,7 @@ class cryptocom(Exchange, ImplicitAPI):
1978
2179
  }, market)
1979
2180
 
1980
2181
  def parse_deposit_status(self, status):
1981
- statuses = {
2182
+ statuses: dict = {
1982
2183
  '0': 'pending',
1983
2184
  '1': 'ok',
1984
2185
  '2': 'failed',
@@ -1987,7 +2188,7 @@ class cryptocom(Exchange, ImplicitAPI):
1987
2188
  return self.safe_string(statuses, status, status)
1988
2189
 
1989
2190
  def parse_withdrawal_status(self, status):
1990
- statuses = {
2191
+ statuses: dict = {
1991
2192
  '0': 'pending',
1992
2193
  '1': 'pending',
1993
2194
  '2': 'failed',
@@ -1998,7 +2199,7 @@ class cryptocom(Exchange, ImplicitAPI):
1998
2199
  }
1999
2200
  return self.safe_string(statuses, status, status)
2000
2201
 
2001
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
2202
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
2002
2203
  #
2003
2204
  # fetchDeposits
2004
2205
  #
@@ -2085,7 +2286,7 @@ class cryptocom(Exchange, ImplicitAPI):
2085
2286
 
2086
2287
  def custom_handle_margin_mode_and_params(self, methodName, params={}):
2087
2288
  """
2088
- * @ignore
2289
+ @ignore
2089
2290
  marginMode specified by params["marginMode"], self.options["marginMode"], self.options["defaultMarginMode"], params["margin"] = True or self.options["defaultType"] = 'margin'
2090
2291
  :param dict [params]: extra parameters specific to the exchange API endpoint
2091
2292
  :returns Array: the marginMode in lowercase
@@ -2120,9 +2321,9 @@ class cryptocom(Exchange, ImplicitAPI):
2120
2321
  # ]
2121
2322
  # }
2122
2323
  #
2123
- networkList = self.safe_value(fee, 'network_list')
2324
+ networkList = self.safe_list(fee, 'network_list', [])
2124
2325
  networkListLength = len(networkList)
2125
- result = {
2326
+ result: dict = {
2126
2327
  'info': fee,
2127
2328
  'withdraw': {
2128
2329
  'fee': None,
@@ -2152,7 +2353,9 @@ class cryptocom(Exchange, ImplicitAPI):
2152
2353
  def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
2153
2354
  """
2154
2355
  fetch deposit and withdraw fees
2155
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-currency-networks
2356
+
2357
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-currency-networks
2358
+
2156
2359
  :param str[]|None codes: list of unified currency codes
2157
2360
  :param dict [params]: extra parameters specific to the exchange API endpoint
2158
2361
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -2160,31 +2363,33 @@ class cryptocom(Exchange, ImplicitAPI):
2160
2363
  self.load_markets()
2161
2364
  response = self.v1PrivatePostPrivateGetCurrencyNetworks(params)
2162
2365
  data = self.safe_value(response, 'result')
2163
- currencyMap = self.safe_value(data, 'currency_map')
2366
+ currencyMap = self.safe_list(data, 'currency_map')
2164
2367
  return self.parse_deposit_withdraw_fees(currencyMap, codes, 'full_name')
2165
2368
 
2166
- def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
2369
+ def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
2167
2370
  """
2168
2371
  fetch the history of changes, actions done by the user or operations that altered the balance of the user
2169
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-transactions
2170
- :param str code: unified currency code
2372
+
2373
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-transactions
2374
+
2375
+ :param str [code]: unified currency code
2171
2376
  :param int [since]: timestamp in ms of the earliest ledger entry
2172
2377
  :param int [limit]: max number of ledger entries to return
2173
2378
  :param dict [params]: extra parameters specific to the exchange API endpoint
2174
2379
  :param int [params.until]: timestamp in ms for the ending date filter, default is the current time
2175
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
2380
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
2176
2381
  """
2177
2382
  self.load_markets()
2178
- request = {}
2383
+ request: dict = {}
2179
2384
  currency = None
2180
2385
  if code is not None:
2181
- currency = self.currency(code)
2386
+ currency = self.safe_currency(code)
2182
2387
  if since is not None:
2183
2388
  request['start_time'] = since
2184
2389
  if limit is not None:
2185
2390
  request['limit'] = limit
2186
- until = self.safe_integer_2(params, 'until', 'till')
2187
- params = self.omit(params, ['until', 'till'])
2391
+ until = self.safe_integer(params, 'until')
2392
+ params = self.omit(params, ['until'])
2188
2393
  if until is not None:
2189
2394
  request['end_time'] = until
2190
2395
  response = self.v1PrivatePostPrivateGetTransactions(self.extend(request, params))
@@ -2217,11 +2422,11 @@ class cryptocom(Exchange, ImplicitAPI):
2217
2422
  # }
2218
2423
  # }
2219
2424
  #
2220
- result = self.safe_value(response, 'result', {})
2221
- ledger = self.safe_value(result, 'data', [])
2425
+ result = self.safe_dict(response, 'result', {})
2426
+ ledger = self.safe_list(result, 'data', [])
2222
2427
  return self.parse_ledger(ledger, currency, since, limit)
2223
2428
 
2224
- def parse_ledger_entry(self, item, currency: Currency = None):
2429
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
2225
2430
  #
2226
2431
  # {
2227
2432
  # "account_id": "ce075cef-1234-4321-bd6e-gf9007351e64",
@@ -2244,6 +2449,8 @@ class cryptocom(Exchange, ImplicitAPI):
2244
2449
  #
2245
2450
  timestamp = self.safe_integer(item, 'event_timestamp_ms')
2246
2451
  currencyId = self.safe_string(item, 'instrument_name')
2452
+ code = self.safe_currency_code(currencyId, currency)
2453
+ currency = self.safe_currency(currencyId, currency)
2247
2454
  amount = self.safe_string(item, 'transaction_qty')
2248
2455
  direction = None
2249
2456
  if Precise.string_lt(amount, '0'):
@@ -2251,14 +2458,15 @@ class cryptocom(Exchange, ImplicitAPI):
2251
2458
  amount = Precise.string_abs(amount)
2252
2459
  else:
2253
2460
  direction = 'in'
2254
- return {
2461
+ return self.safe_ledger_entry({
2462
+ 'info': item,
2255
2463
  'id': self.safe_string(item, 'order_id'),
2256
2464
  'direction': direction,
2257
2465
  'account': self.safe_string(item, 'account_id'),
2258
2466
  'referenceId': self.safe_string(item, 'trade_id'),
2259
2467
  'referenceAccount': self.safe_string(item, 'trade_match_id'),
2260
2468
  'type': self.parse_ledger_entry_type(self.safe_string(item, 'journal_type')),
2261
- 'currency': self.safe_currency_code(currencyId, currency),
2469
+ 'currency': code,
2262
2470
  'amount': self.parse_number(amount),
2263
2471
  'timestamp': timestamp,
2264
2472
  'datetime': self.iso8601(timestamp),
@@ -2269,11 +2477,10 @@ class cryptocom(Exchange, ImplicitAPI):
2269
2477
  'currency': None,
2270
2478
  'cost': None,
2271
2479
  },
2272
- 'info': item,
2273
- }
2480
+ }, currency)
2274
2481
 
2275
2482
  def parse_ledger_entry_type(self, type):
2276
- ledgerType = {
2483
+ ledgerType: dict = {
2277
2484
  'TRADING': 'trade',
2278
2485
  'TRADE_FEE': 'fee',
2279
2486
  'WITHDRAW_FEE': 'fee',
@@ -2301,7 +2508,9 @@ class cryptocom(Exchange, ImplicitAPI):
2301
2508
  def fetch_accounts(self, params={}) -> List[Account]:
2302
2509
  """
2303
2510
  fetch all the accounts associated with a profile
2304
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-accounts
2511
+
2512
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-accounts
2513
+
2305
2514
  :param dict [params]: extra parameters specific to the exchange API endpoint
2306
2515
  :returns dict: a dictionary of `account structures <https://docs.ccxt.com/#/?id=account-structure>` indexed by the account type
2307
2516
  """
@@ -2338,9 +2547,9 @@ class cryptocom(Exchange, ImplicitAPI):
2338
2547
  # }
2339
2548
  # }
2340
2549
  #
2341
- result = self.safe_value(response, 'result', {})
2342
- masterAccount = self.safe_value(result, 'master_account', {})
2343
- accounts = self.safe_value(result, 'sub_account_list', [])
2550
+ result = self.safe_dict(response, 'result', {})
2551
+ masterAccount = self.safe_dict(result, 'master_account', {})
2552
+ accounts = self.safe_list(result, 'sub_account_list', [])
2344
2553
  accounts.append(masterAccount)
2345
2554
  return self.parse_accounts(accounts, params)
2346
2555
 
@@ -2380,7 +2589,9 @@ class cryptocom(Exchange, ImplicitAPI):
2380
2589
  def fetch_settlement_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2381
2590
  """
2382
2591
  fetches historical settlement records
2383
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-expired-settlement-price
2592
+
2593
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-expired-settlement-price
2594
+
2384
2595
  :param str symbol: unified market symbol of the settlement history
2385
2596
  :param int [since]: timestamp in ms
2386
2597
  :param int [limit]: number of records
@@ -2397,7 +2608,7 @@ class cryptocom(Exchange, ImplicitAPI):
2397
2608
  self.check_required_argument('fetchSettlementHistory', type, 'type', ['future', 'option', 'WARRANT', 'FUTURE'])
2398
2609
  if type == 'option':
2399
2610
  type = 'WARRANT'
2400
- request = {
2611
+ request: dict = {
2401
2612
  'instrument_type': type.upper(),
2402
2613
  }
2403
2614
  response = self.v1PublicGetPublicGetExpiredSettlementPrice(self.extend(request, params))
@@ -2418,8 +2629,8 @@ class cryptocom(Exchange, ImplicitAPI):
2418
2629
  # }
2419
2630
  # }
2420
2631
  #
2421
- result = self.safe_value(response, 'result', {})
2422
- data = self.safe_value(result, 'data', [])
2632
+ result = self.safe_dict(response, 'result', {})
2633
+ data = self.safe_list(result, 'data', [])
2423
2634
  settlements = self.parse_settlements(data, market)
2424
2635
  sorted = self.sort_by(settlements, 'timestamp')
2425
2636
  return self.filter_by_symbol_since_limit(sorted, symbol, since, limit)
@@ -2462,7 +2673,9 @@ class cryptocom(Exchange, ImplicitAPI):
2462
2673
  def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
2463
2674
  """
2464
2675
  fetches historical funding rates
2465
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-valuations
2676
+
2677
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#public-get-valuations
2678
+
2466
2679
  :param str symbol: unified symbol of the market to fetch the funding rate history for
2467
2680
  :param int [since]: timestamp in ms of the earliest funding rate to fetch
2468
2681
  :param int [limit]: the maximum amount of [funding rate structures] to fetch
@@ -2481,7 +2694,7 @@ class cryptocom(Exchange, ImplicitAPI):
2481
2694
  market = self.market(symbol)
2482
2695
  if not market['swap']:
2483
2696
  raise BadSymbol(self.id + ' fetchFundingRateHistory() supports swap contracts only')
2484
- request = {
2697
+ request: dict = {
2485
2698
  'instrument_name': market['id'],
2486
2699
  'valuation_type': 'funding_hist',
2487
2700
  }
@@ -2489,8 +2702,8 @@ class cryptocom(Exchange, ImplicitAPI):
2489
2702
  request['start_ts'] = since
2490
2703
  if limit is not None:
2491
2704
  request['count'] = limit
2492
- until = self.safe_integer_2(params, 'until', 'till')
2493
- params = self.omit(params, ['until', 'till'])
2705
+ until = self.safe_integer(params, 'until')
2706
+ params = self.omit(params, ['until'])
2494
2707
  if until is not None:
2495
2708
  request['end_ts'] = until
2496
2709
  response = self.v1PublicGetPublicGetValuations(self.extend(request, params))
@@ -2510,8 +2723,8 @@ class cryptocom(Exchange, ImplicitAPI):
2510
2723
  # }
2511
2724
  # }
2512
2725
  #
2513
- result = self.safe_value(response, 'result', {})
2514
- data = self.safe_value(result, 'data', [])
2726
+ result = self.safe_dict(response, 'result', {})
2727
+ data = self.safe_list(result, 'data', [])
2515
2728
  marketId = self.safe_string(result, 'instrument_name')
2516
2729
  rates = []
2517
2730
  for i in range(0, len(data)):
@@ -2530,14 +2743,16 @@ class cryptocom(Exchange, ImplicitAPI):
2530
2743
  def fetch_position(self, symbol: str, params={}):
2531
2744
  """
2532
2745
  fetch data on a single open contract trade position
2533
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
2746
+
2747
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
2748
+
2534
2749
  :param str symbol: unified market symbol of the market the position is held in
2535
2750
  :param dict [params]: extra parameters specific to the exchange API endpoint
2536
2751
  :returns dict: a `position structure <https://docs.ccxt.com/#/?id=position-structure>`
2537
2752
  """
2538
2753
  self.load_markets()
2539
2754
  market = self.market(symbol)
2540
- request = {
2755
+ request: dict = {
2541
2756
  'instrument_name': market['id'],
2542
2757
  }
2543
2758
  response = self.v1PrivatePostPrivateGetPositions(self.extend(request, params))
@@ -2563,21 +2778,23 @@ class cryptocom(Exchange, ImplicitAPI):
2563
2778
  # }
2564
2779
  # }
2565
2780
  #
2566
- result = self.safe_value(response, 'result', {})
2567
- data = self.safe_value(result, 'data', [])
2568
- return self.parse_position(data[0], market)
2781
+ result = self.safe_dict(response, 'result', {})
2782
+ data = self.safe_list(result, 'data', [])
2783
+ return self.parse_position(self.safe_dict(data, 0), market)
2569
2784
 
2570
2785
  def fetch_positions(self, symbols: Strings = None, params={}):
2571
2786
  """
2572
2787
  fetch all open positions
2573
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
2788
+
2789
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-positions
2790
+
2574
2791
  :param str[]|None symbols: list of unified market symbols
2575
2792
  :param dict [params]: extra parameters specific to the exchange API endpoint
2576
2793
  :returns dict[]: a list of `position structure <https://docs.ccxt.com/#/?id=position-structure>`
2577
2794
  """
2578
2795
  self.load_markets()
2579
2796
  symbols = self.market_symbols(symbols)
2580
- request = {}
2797
+ request: dict = {}
2581
2798
  market = None
2582
2799
  if symbols is not None:
2583
2800
  symbol = None
@@ -2613,8 +2830,8 @@ class cryptocom(Exchange, ImplicitAPI):
2613
2830
  # }
2614
2831
  # }
2615
2832
  #
2616
- responseResult = self.safe_value(response, 'result', {})
2617
- positions = self.safe_value(responseResult, 'data', [])
2833
+ responseResult = self.safe_dict(response, 'result', {})
2834
+ positions = self.safe_list(responseResult, 'data', [])
2618
2835
  result = []
2619
2836
  for i in range(0, len(positions)):
2620
2837
  entry = positions[i]
@@ -2623,7 +2840,7 @@ class cryptocom(Exchange, ImplicitAPI):
2623
2840
  result.append(self.parse_position(entry, marketInner))
2624
2841
  return self.filter_by_array_positions(result, 'symbol', None, False)
2625
2842
 
2626
- def parse_position(self, position, market: Market = None):
2843
+ def parse_position(self, position: dict, market: Market = None):
2627
2844
  #
2628
2845
  # {
2629
2846
  # "account_id": "ce075bef-b600-4277-bd6e-ff9007251e63",
@@ -2702,20 +2919,21 @@ class cryptocom(Exchange, ImplicitAPI):
2702
2919
  def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
2703
2920
  """
2704
2921
  closes open positions for a market
2705
- :see: https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-close-position
2922
+
2923
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-close-position
2924
+
2706
2925
  :param str symbol: Unified CCXT market symbol
2707
- :param str [marginMode]: not used by cryptocom.closePositions
2708
2926
  :param str [side]: not used by cryptocom.closePositions
2709
2927
  :param dict [params]: extra parameters specific to the okx api endpoint
2710
- *
2711
- * EXCHANGE SPECIFIC PARAMETERS
2928
+
2929
+ EXCHANGE SPECIFIC PARAMETERS
2712
2930
  :param str [params.type]: LIMIT or MARKET
2713
2931
  :param number [params.price]: for limit orders only
2714
2932
  :returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
2715
2933
  """
2716
2934
  self.load_markets()
2717
2935
  market = self.market(symbol)
2718
- request = {
2936
+ request: dict = {
2719
2937
  'instrument_name': market['id'],
2720
2938
  'type': 'MARKET',
2721
2939
  }
@@ -2737,9 +2955,121 @@ class cryptocom(Exchange, ImplicitAPI):
2737
2955
  # }
2738
2956
  # }
2739
2957
  #
2740
- result = self.safe_value(response, 'result')
2958
+ result = self.safe_dict(response, 'result')
2741
2959
  return self.parse_order(result, market)
2742
2960
 
2961
+ def fetch_trading_fee(self, symbol: str, params={}) -> TradingFeeInterface:
2962
+ """
2963
+ fetch the trading fees for a market
2964
+
2965
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-instrument-fee-rate
2966
+
2967
+ :param str symbol: unified market symbol
2968
+ :param dict [params]: extra parameters specific to the exchange API endpoint
2969
+ :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
2970
+ """
2971
+ self.load_markets()
2972
+ market = self.market(symbol)
2973
+ request: dict = {
2974
+ 'instrument_name': market['id'],
2975
+ }
2976
+ response = self.v1PrivatePostPrivateGetInstrumentFeeRate(self.extend(request, params))
2977
+ #
2978
+ # {
2979
+ # "id": 1,
2980
+ # "code": 0,
2981
+ # "method": "private/staking/unstake",
2982
+ # "result": {
2983
+ # "staking_id": "1",
2984
+ # "instrument_name": "SOL.staked",
2985
+ # "status": "NEW",
2986
+ # "quantity": "1",
2987
+ # "underlying_inst_name": "SOL",
2988
+ # "reason": "NO_ERROR"
2989
+ # }
2990
+ # }
2991
+ #
2992
+ data = self.safe_dict(response, 'result', {})
2993
+ return self.parse_trading_fee(data, market)
2994
+
2995
+ def fetch_trading_fees(self, params={}) -> TradingFees:
2996
+ """
2997
+
2998
+ https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-get-fee-rate
2999
+
3000
+ fetch the trading fees for multiple markets
3001
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3002
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
3003
+ """
3004
+ self.load_markets()
3005
+ response = self.v1PrivatePostPrivateGetFeeRate(params)
3006
+ #
3007
+ # {
3008
+ # "id": 1,
3009
+ # "method": "/private/get-fee-rate",
3010
+ # "code": 0,
3011
+ # "result": {
3012
+ # "spot_tier": "3",
3013
+ # "deriv_tier": "3",
3014
+ # "effective_spot_maker_rate_bps": "6.5",
3015
+ # "effective_spot_taker_rate_bps": "6.9",
3016
+ # "effective_deriv_maker_rate_bps": "1.1",
3017
+ # "effective_deriv_taker_rate_bps": "3"
3018
+ # }
3019
+ # }
3020
+ #
3021
+ result = self.safe_dict(response, 'result', {})
3022
+ return self.parse_trading_fees(result)
3023
+
3024
+ def parse_trading_fees(self, response):
3025
+ #
3026
+ # {
3027
+ # "spot_tier": "3",
3028
+ # "deriv_tier": "3",
3029
+ # "effective_spot_maker_rate_bps": "6.5",
3030
+ # "effective_spot_taker_rate_bps": "6.9",
3031
+ # "effective_deriv_maker_rate_bps": "1.1",
3032
+ # "effective_deriv_taker_rate_bps": "3"
3033
+ # }
3034
+ #
3035
+ result: dict = {}
3036
+ result['info'] = response
3037
+ for i in range(0, len(self.symbols)):
3038
+ symbol = self.symbols[i]
3039
+ market = self.market(symbol)
3040
+ isSwap = market['swap']
3041
+ takerFeeKey = 'effective_deriv_taker_rate_bps' if isSwap else 'effective_spot_taker_rate_bps'
3042
+ makerFeeKey = 'effective_deriv_maker_rate_bps' if isSwap else 'effective_spot_maker_rate_bps'
3043
+ tradingFee = {
3044
+ 'info': response,
3045
+ 'symbol': symbol,
3046
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(response, makerFeeKey), '10000')),
3047
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(response, takerFeeKey), '10000')),
3048
+ 'percentage': None,
3049
+ 'tierBased': None,
3050
+ }
3051
+ result[symbol] = tradingFee
3052
+ return result
3053
+
3054
+ def parse_trading_fee(self, fee: dict, market: Market = None) -> TradingFeeInterface:
3055
+ #
3056
+ # {
3057
+ # "instrument_name": "BTC_USD",
3058
+ # "effective_maker_rate_bps": "6.5",
3059
+ # "effective_taker_rate_bps": "6.9"
3060
+ # }
3061
+ #
3062
+ marketId = self.safe_string(fee, 'instrument_name')
3063
+ symbol = self.safe_symbol(marketId, market)
3064
+ return {
3065
+ 'info': fee,
3066
+ 'symbol': symbol,
3067
+ 'maker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_maker_rate_bps'), '10000')),
3068
+ 'taker': self.parse_number(Precise.string_div(self.safe_string(fee, 'effective_taker_rate_bps'), '10000')),
3069
+ 'percentage': None,
3070
+ 'tierBased': None,
3071
+ }
3072
+
2743
3073
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
2744
3074
  type = self.safe_string(api, 0)
2745
3075
  access = self.safe_string(api, 1)
@@ -2779,7 +3109,7 @@ class cryptocom(Exchange, ImplicitAPI):
2779
3109
  }
2780
3110
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
2781
3111
 
2782
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
3112
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
2783
3113
  errorCode = self.safe_string(response, 'code')
2784
3114
  if errorCode != '0':
2785
3115
  feedback = self.id + ' ' + body