ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. ccxt/__init__.py +36 -14
  2. ccxt/abstract/alpaca.py +4 -0
  3. ccxt/abstract/bigone.py +1 -1
  4. ccxt/abstract/binance.py +112 -48
  5. ccxt/abstract/binancecoinm.py +112 -48
  6. ccxt/abstract/binanceus.py +147 -83
  7. ccxt/abstract/binanceusdm.py +112 -48
  8. ccxt/abstract/bingx.py +133 -78
  9. ccxt/abstract/bitbank.py +5 -0
  10. ccxt/abstract/bitfinex.py +136 -65
  11. ccxt/abstract/bitfinex1.py +69 -0
  12. ccxt/abstract/bitflyer.py +1 -0
  13. ccxt/abstract/bitget.py +8 -1
  14. ccxt/abstract/bitmart.py +13 -1
  15. ccxt/abstract/bitopro.py +1 -0
  16. ccxt/abstract/bitpanda.py +0 -12
  17. ccxt/abstract/bitrue.py +3 -3
  18. ccxt/abstract/bitstamp.py +26 -3
  19. ccxt/abstract/blofin.py +24 -0
  20. ccxt/abstract/btcbox.py +1 -0
  21. ccxt/abstract/bybit.py +29 -14
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbase.py +6 -0
  24. ccxt/abstract/coinbaseadvanced.py +94 -0
  25. ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
  26. ccxt/abstract/coinbaseinternational.py +1 -1
  27. ccxt/abstract/coincatch.py +94 -0
  28. ccxt/abstract/coinex.py +233 -123
  29. ccxt/abstract/coinmetro.py +1 -0
  30. ccxt/abstract/cryptocom.py +14 -0
  31. ccxt/abstract/defx.py +69 -0
  32. ccxt/abstract/deribit.py +1 -0
  33. ccxt/abstract/digifinex.py +1 -0
  34. ccxt/abstract/ellipx.py +25 -0
  35. ccxt/abstract/gate.py +20 -0
  36. ccxt/abstract/gateio.py +20 -0
  37. ccxt/abstract/gemini.py +1 -0
  38. ccxt/abstract/hashkey.py +67 -0
  39. ccxt/abstract/hyperliquid.py +1 -1
  40. ccxt/abstract/independentreserve.py +6 -0
  41. ccxt/abstract/kraken.py +4 -3
  42. ccxt/abstract/krakenfutures.py +4 -0
  43. ccxt/abstract/kucoin.py +25 -0
  44. ccxt/abstract/kucoinfutures.py +35 -0
  45. ccxt/abstract/luno.py +2 -0
  46. ccxt/abstract/mexc.py +4 -0
  47. ccxt/abstract/myokx.py +340 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +30 -0
  50. ccxt/abstract/onetrading.py +0 -12
  51. ccxt/abstract/oxfun.py +34 -0
  52. ccxt/abstract/paradex.py +40 -0
  53. ccxt/abstract/phemex.py +1 -0
  54. ccxt/abstract/upbit.py +4 -0
  55. ccxt/abstract/vertex.py +19 -0
  56. ccxt/abstract/whitebit.py +31 -1
  57. ccxt/abstract/woo.py +6 -2
  58. ccxt/abstract/woofipro.py +119 -0
  59. ccxt/abstract/xt.py +153 -0
  60. ccxt/abstract/zonda.py +6 -0
  61. ccxt/ace.py +164 -60
  62. ccxt/alpaca.py +727 -63
  63. ccxt/ascendex.py +395 -249
  64. ccxt/async_support/__init__.py +36 -14
  65. ccxt/async_support/ace.py +164 -60
  66. ccxt/async_support/alpaca.py +727 -63
  67. ccxt/async_support/ascendex.py +396 -249
  68. ccxt/async_support/base/exchange.py +531 -155
  69. ccxt/async_support/base/ws/aiohttp_client.py +28 -5
  70. ccxt/async_support/base/ws/cache.py +3 -2
  71. ccxt/async_support/base/ws/client.py +26 -5
  72. ccxt/async_support/base/ws/fast_client.py +4 -3
  73. ccxt/async_support/base/ws/functions.py +1 -1
  74. ccxt/async_support/base/ws/future.py +40 -31
  75. ccxt/async_support/base/ws/order_book_side.py +3 -0
  76. ccxt/async_support/bequant.py +1 -1
  77. ccxt/async_support/bigone.py +329 -202
  78. ccxt/async_support/binance.py +3513 -1511
  79. ccxt/async_support/binancecoinm.py +2 -1
  80. ccxt/async_support/binanceus.py +12 -1
  81. ccxt/async_support/binanceusdm.py +3 -1
  82. ccxt/async_support/bingx.py +3105 -881
  83. ccxt/async_support/bit2c.py +119 -38
  84. ccxt/async_support/bitbank.py +215 -76
  85. ccxt/async_support/bitbns.py +124 -53
  86. ccxt/async_support/bitfinex.py +3236 -1078
  87. ccxt/async_support/bitfinex1.py +1711 -0
  88. ccxt/async_support/bitflyer.py +239 -50
  89. ccxt/async_support/bitget.py +1513 -563
  90. ccxt/async_support/bithumb.py +201 -67
  91. ccxt/async_support/bitmart.py +1320 -435
  92. ccxt/async_support/bitmex.py +308 -111
  93. ccxt/async_support/bitopro.py +256 -96
  94. ccxt/async_support/bitrue.py +365 -233
  95. ccxt/async_support/bitso.py +201 -89
  96. ccxt/async_support/bitstamp.py +438 -269
  97. ccxt/async_support/bitteam.py +179 -73
  98. ccxt/async_support/bitvavo.py +180 -70
  99. ccxt/async_support/bl3p.py +92 -25
  100. ccxt/async_support/blockchaincom.py +193 -79
  101. ccxt/async_support/blofin.py +403 -150
  102. ccxt/async_support/btcalpha.py +161 -55
  103. ccxt/async_support/btcbox.py +250 -34
  104. ccxt/async_support/btcmarkets.py +232 -85
  105. ccxt/async_support/btcturk.py +159 -60
  106. ccxt/async_support/bybit.py +2326 -1255
  107. ccxt/async_support/cex.py +1409 -1329
  108. ccxt/async_support/coinbase.py +1455 -288
  109. ccxt/async_support/coinbaseadvanced.py +17 -0
  110. ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
  111. ccxt/async_support/coinbaseinternational.py +428 -88
  112. ccxt/async_support/coincatch.py +5152 -0
  113. ccxt/async_support/coincheck.py +121 -38
  114. ccxt/async_support/coinex.py +4020 -3339
  115. ccxt/async_support/coinlist.py +273 -116
  116. ccxt/async_support/coinmate.py +204 -97
  117. ccxt/async_support/coinmetro.py +203 -110
  118. ccxt/async_support/coinone.py +142 -68
  119. ccxt/async_support/coinsph.py +206 -89
  120. ccxt/async_support/coinspot.py +137 -62
  121. ccxt/async_support/cryptocom.py +515 -185
  122. ccxt/async_support/currencycom.py +203 -85
  123. ccxt/async_support/defx.py +2066 -0
  124. ccxt/async_support/delta.py +467 -158
  125. ccxt/async_support/deribit.py +558 -324
  126. ccxt/async_support/digifinex.py +340 -223
  127. ccxt/async_support/ellipx.py +1826 -0
  128. ccxt/async_support/exmo.py +259 -128
  129. ccxt/async_support/gate.py +1473 -464
  130. ccxt/async_support/gemini.py +206 -84
  131. ccxt/async_support/hashkey.py +4164 -0
  132. ccxt/async_support/hitbtc.py +334 -178
  133. ccxt/async_support/hollaex.py +134 -83
  134. ccxt/async_support/htx.py +1095 -563
  135. ccxt/async_support/huobijp.py +105 -56
  136. ccxt/async_support/hyperliquid.py +1634 -269
  137. ccxt/async_support/idex.py +148 -95
  138. ccxt/async_support/independentreserve.py +236 -31
  139. ccxt/async_support/indodax.py +165 -62
  140. ccxt/async_support/kraken.py +871 -354
  141. ccxt/async_support/krakenfutures.py +324 -100
  142. ccxt/async_support/kucoin.py +1050 -355
  143. ccxt/async_support/kucoinfutures.py +1004 -149
  144. ccxt/async_support/kuna.py +138 -106
  145. ccxt/async_support/latoken.py +135 -79
  146. ccxt/async_support/lbank.py +290 -113
  147. ccxt/async_support/luno.py +112 -62
  148. ccxt/async_support/lykke.py +104 -55
  149. ccxt/async_support/mercado.py +36 -29
  150. ccxt/async_support/mexc.py +995 -429
  151. ccxt/async_support/myokx.py +43 -0
  152. ccxt/async_support/ndax.py +163 -82
  153. ccxt/async_support/novadax.py +121 -75
  154. ccxt/async_support/oceanex.py +175 -59
  155. ccxt/async_support/okcoin.py +222 -163
  156. ccxt/async_support/okx.py +1777 -455
  157. ccxt/async_support/onetrading.py +132 -414
  158. ccxt/async_support/oxfun.py +2832 -0
  159. ccxt/async_support/p2b.py +79 -51
  160. ccxt/async_support/paradex.py +2017 -0
  161. ccxt/async_support/paymium.py +56 -32
  162. ccxt/async_support/phemex.py +572 -196
  163. ccxt/async_support/poloniex.py +218 -95
  164. ccxt/async_support/poloniexfutures.py +260 -92
  165. ccxt/async_support/probit.py +143 -110
  166. ccxt/async_support/timex.py +123 -70
  167. ccxt/async_support/tokocrypto.py +129 -93
  168. ccxt/async_support/tradeogre.py +39 -25
  169. ccxt/async_support/upbit.py +322 -113
  170. ccxt/async_support/vertex.py +2983 -0
  171. ccxt/async_support/wavesexchange.py +227 -173
  172. ccxt/async_support/wazirx.py +145 -65
  173. ccxt/async_support/whitebit.py +533 -138
  174. ccxt/async_support/woo.py +1155 -295
  175. ccxt/async_support/woofipro.py +2716 -0
  176. ccxt/async_support/xt.py +4628 -0
  177. ccxt/async_support/yobit.py +160 -92
  178. ccxt/async_support/zaif.py +80 -33
  179. ccxt/async_support/zonda.py +140 -69
  180. ccxt/base/errors.py +51 -20
  181. ccxt/base/exchange.py +1729 -482
  182. ccxt/base/precise.py +10 -0
  183. ccxt/base/types.py +223 -4
  184. ccxt/bequant.py +1 -1
  185. ccxt/bigone.py +329 -202
  186. ccxt/binance.py +3513 -1511
  187. ccxt/binancecoinm.py +2 -1
  188. ccxt/binanceus.py +12 -1
  189. ccxt/binanceusdm.py +3 -1
  190. ccxt/bingx.py +3105 -881
  191. ccxt/bit2c.py +119 -38
  192. ccxt/bitbank.py +215 -76
  193. ccxt/bitbns.py +124 -53
  194. ccxt/bitfinex.py +3235 -1078
  195. ccxt/bitfinex1.py +1710 -0
  196. ccxt/bitflyer.py +239 -50
  197. ccxt/bitget.py +1513 -563
  198. ccxt/bithumb.py +200 -67
  199. ccxt/bitmart.py +1320 -435
  200. ccxt/bitmex.py +308 -111
  201. ccxt/bitopro.py +256 -96
  202. ccxt/bitrue.py +365 -233
  203. ccxt/bitso.py +201 -89
  204. ccxt/bitstamp.py +438 -269
  205. ccxt/bitteam.py +179 -73
  206. ccxt/bitvavo.py +180 -70
  207. ccxt/bl3p.py +92 -25
  208. ccxt/blockchaincom.py +193 -79
  209. ccxt/blofin.py +403 -150
  210. ccxt/btcalpha.py +161 -55
  211. ccxt/btcbox.py +250 -34
  212. ccxt/btcmarkets.py +232 -85
  213. ccxt/btcturk.py +159 -60
  214. ccxt/bybit.py +2326 -1255
  215. ccxt/cex.py +1408 -1329
  216. ccxt/coinbase.py +1455 -288
  217. ccxt/coinbaseadvanced.py +17 -0
  218. ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
  219. ccxt/coinbaseinternational.py +428 -88
  220. ccxt/coincatch.py +5152 -0
  221. ccxt/coincheck.py +121 -38
  222. ccxt/coinex.py +4020 -3339
  223. ccxt/coinlist.py +273 -116
  224. ccxt/coinmate.py +204 -97
  225. ccxt/coinmetro.py +203 -110
  226. ccxt/coinone.py +142 -68
  227. ccxt/coinsph.py +206 -89
  228. ccxt/coinspot.py +137 -62
  229. ccxt/cryptocom.py +515 -185
  230. ccxt/currencycom.py +203 -85
  231. ccxt/defx.py +2065 -0
  232. ccxt/delta.py +467 -158
  233. ccxt/deribit.py +558 -324
  234. ccxt/digifinex.py +340 -223
  235. ccxt/ellipx.py +1826 -0
  236. ccxt/exmo.py +259 -128
  237. ccxt/gate.py +1473 -464
  238. ccxt/gemini.py +206 -84
  239. ccxt/hashkey.py +4164 -0
  240. ccxt/hitbtc.py +334 -178
  241. ccxt/hollaex.py +134 -83
  242. ccxt/htx.py +1095 -563
  243. ccxt/huobijp.py +105 -56
  244. ccxt/hyperliquid.py +1633 -269
  245. ccxt/idex.py +148 -95
  246. ccxt/independentreserve.py +235 -31
  247. ccxt/indodax.py +165 -62
  248. ccxt/kraken.py +871 -354
  249. ccxt/krakenfutures.py +324 -100
  250. ccxt/kucoin.py +1050 -355
  251. ccxt/kucoinfutures.py +1004 -149
  252. ccxt/kuna.py +138 -106
  253. ccxt/latoken.py +135 -79
  254. ccxt/lbank.py +290 -113
  255. ccxt/luno.py +112 -62
  256. ccxt/lykke.py +104 -55
  257. ccxt/mercado.py +36 -29
  258. ccxt/mexc.py +994 -429
  259. ccxt/myokx.py +43 -0
  260. ccxt/ndax.py +163 -82
  261. ccxt/novadax.py +121 -75
  262. ccxt/oceanex.py +175 -59
  263. ccxt/okcoin.py +222 -163
  264. ccxt/okx.py +1777 -455
  265. ccxt/onetrading.py +132 -414
  266. ccxt/oxfun.py +2831 -0
  267. ccxt/p2b.py +79 -51
  268. ccxt/paradex.py +2017 -0
  269. ccxt/paymium.py +56 -32
  270. ccxt/phemex.py +572 -196
  271. ccxt/poloniex.py +218 -95
  272. ccxt/poloniexfutures.py +260 -92
  273. ccxt/pro/__init__.py +29 -5
  274. ccxt/pro/alpaca.py +32 -17
  275. ccxt/pro/ascendex.py +63 -15
  276. ccxt/pro/bequant.py +4 -0
  277. ccxt/pro/binance.py +1596 -329
  278. ccxt/pro/binancecoinm.py +1 -0
  279. ccxt/pro/binanceus.py +2 -9
  280. ccxt/pro/binanceusdm.py +2 -0
  281. ccxt/pro/bingx.py +527 -134
  282. ccxt/pro/bitcoincom.py +4 -1
  283. ccxt/pro/bitfinex.py +731 -266
  284. ccxt/pro/bitfinex1.py +635 -0
  285. ccxt/pro/bitget.py +726 -357
  286. ccxt/pro/bithumb.py +380 -0
  287. ccxt/pro/bitmart.py +138 -39
  288. ccxt/pro/bitmex.py +199 -40
  289. ccxt/pro/bitopro.py +25 -13
  290. ccxt/pro/bitrue.py +31 -32
  291. ccxt/pro/bitstamp.py +7 -6
  292. ccxt/pro/bitvavo.py +204 -82
  293. ccxt/pro/blockchaincom.py +30 -17
  294. ccxt/pro/blofin.py +692 -0
  295. ccxt/pro/bybit.py +791 -82
  296. ccxt/pro/cex.py +99 -51
  297. ccxt/pro/coinbase.py +220 -30
  298. ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
  299. ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
  300. ccxt/pro/coinbaseinternational.py +193 -30
  301. ccxt/pro/coincatch.py +1464 -0
  302. ccxt/pro/coincheck.py +11 -6
  303. ccxt/pro/coinex.py +967 -661
  304. ccxt/pro/coinone.py +17 -10
  305. ccxt/pro/cryptocom.py +446 -66
  306. ccxt/pro/currencycom.py +11 -10
  307. ccxt/pro/defx.py +832 -0
  308. ccxt/pro/deribit.py +168 -32
  309. ccxt/pro/exmo.py +253 -21
  310. ccxt/pro/gate.py +729 -64
  311. ccxt/pro/gemini.py +44 -26
  312. ccxt/pro/hashkey.py +802 -0
  313. ccxt/pro/hitbtc.py +208 -103
  314. ccxt/pro/hollaex.py +25 -9
  315. ccxt/pro/htx.py +83 -39
  316. ccxt/pro/huobijp.py +17 -16
  317. ccxt/pro/hyperliquid.py +502 -31
  318. ccxt/pro/idex.py +28 -13
  319. ccxt/pro/independentreserve.py +21 -16
  320. ccxt/pro/kraken.py +298 -51
  321. ccxt/pro/krakenfutures.py +166 -75
  322. ccxt/pro/kucoin.py +395 -77
  323. ccxt/pro/kucoinfutures.py +400 -99
  324. ccxt/pro/lbank.py +52 -31
  325. ccxt/pro/luno.py +12 -10
  326. ccxt/pro/mexc.py +400 -50
  327. ccxt/pro/myokx.py +28 -0
  328. ccxt/pro/ndax.py +25 -12
  329. ccxt/pro/okcoin.py +28 -9
  330. ccxt/pro/okx.py +935 -124
  331. ccxt/pro/onetrading.py +41 -24
  332. ccxt/pro/oxfun.py +1054 -0
  333. ccxt/pro/p2b.py +100 -24
  334. ccxt/pro/paradex.py +352 -0
  335. ccxt/pro/phemex.py +93 -34
  336. ccxt/pro/poloniex.py +129 -50
  337. ccxt/pro/poloniexfutures.py +53 -32
  338. ccxt/pro/probit.py +93 -86
  339. ccxt/pro/upbit.py +401 -8
  340. ccxt/pro/vertex.py +943 -0
  341. ccxt/pro/wazirx.py +46 -28
  342. ccxt/pro/whitebit.py +65 -12
  343. ccxt/pro/woo.py +486 -70
  344. ccxt/pro/woofipro.py +1271 -0
  345. ccxt/pro/xt.py +1067 -0
  346. ccxt/probit.py +143 -110
  347. ccxt/static_dependencies/__init__.py +1 -1
  348. ccxt/static_dependencies/lark/__init__.py +38 -0
  349. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  350. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  351. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  352. ccxt/static_dependencies/lark/common.py +86 -0
  353. ccxt/static_dependencies/lark/exceptions.py +292 -0
  354. ccxt/static_dependencies/lark/grammar.py +130 -0
  355. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  356. ccxt/static_dependencies/lark/indenter.py +143 -0
  357. ccxt/static_dependencies/lark/lark.py +658 -0
  358. ccxt/static_dependencies/lark/lexer.py +678 -0
  359. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  360. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  361. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  362. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  363. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  364. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  365. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  366. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  367. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  368. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  369. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  370. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  371. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  372. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  373. ccxt/static_dependencies/lark/py.typed +0 -0
  374. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  375. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  376. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  377. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  378. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  379. ccxt/static_dependencies/lark/tree.py +267 -0
  380. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  381. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  382. ccxt/static_dependencies/lark/utils.py +343 -0
  383. ccxt/static_dependencies/lark/visitors.py +596 -0
  384. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  385. ccxt/static_dependencies/marshmallow/base.py +65 -0
  386. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  387. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  388. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  389. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  390. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  391. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  392. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  393. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  394. ccxt/static_dependencies/marshmallow/types.py +12 -0
  395. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  396. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  397. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  398. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  399. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  400. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  401. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  402. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  403. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  404. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  405. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  406. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  407. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  408. ccxt/static_dependencies/starknet/__init__.py +0 -0
  409. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  410. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  411. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  412. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  413. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  414. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  415. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  416. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  417. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  418. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  419. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  420. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  421. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  422. ccxt/static_dependencies/starknet/common.py +15 -0
  423. ccxt/static_dependencies/starknet/constants.py +39 -0
  424. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  425. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  426. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  427. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  428. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  429. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  430. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  431. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  432. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  433. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  434. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  435. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  436. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  437. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  438. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  439. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  440. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  441. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  442. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  443. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  444. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  445. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  446. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  447. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  448. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  449. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  450. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  451. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  452. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  453. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  454. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  455. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  456. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  457. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  458. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  459. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  460. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  461. ccxt/static_dependencies/starkware/__init__.py +0 -0
  462. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  463. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  464. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  465. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  466. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  467. ccxt/static_dependencies/sympy/__init__.py +0 -0
  468. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  469. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  470. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  471. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  472. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  473. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  474. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  475. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  476. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  477. ccxt/test/{test_async.py → tests_async.py} +465 -407
  478. ccxt/test/tests_helpers.py +285 -0
  479. ccxt/test/tests_init.py +39 -0
  480. ccxt/test/{test_sync.py → tests_sync.py} +465 -409
  481. ccxt/timex.py +123 -70
  482. ccxt/tokocrypto.py +129 -93
  483. ccxt/tradeogre.py +39 -25
  484. ccxt/upbit.py +322 -113
  485. ccxt/vertex.py +2983 -0
  486. ccxt/wavesexchange.py +227 -173
  487. ccxt/wazirx.py +145 -65
  488. ccxt/whitebit.py +533 -138
  489. ccxt/woo.py +1155 -295
  490. ccxt/woofipro.py +2716 -0
  491. ccxt/xt.py +4627 -0
  492. ccxt/yobit.py +159 -92
  493. ccxt/zaif.py +80 -33
  494. ccxt/zonda.py +140 -69
  495. ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
  496. ccxt-4.4.48.dist-info/METADATA +646 -0
  497. ccxt-4.4.48.dist-info/RECORD +669 -0
  498. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
  499. ccxt/abstract/bitbay.py +0 -47
  500. ccxt/abstract/bitfinex2.py +0 -139
  501. ccxt/abstract/hitbtc3.py +0 -115
  502. ccxt/async_support/bitbay.py +0 -17
  503. ccxt/async_support/bitfinex2.py +0 -3496
  504. ccxt/async_support/flowbtc.py +0 -34
  505. ccxt/bitbay.py +0 -17
  506. ccxt/bitfinex2.py +0 -3496
  507. ccxt/flowbtc.py +0 -34
  508. ccxt/hitbtc3.py +0 -16
  509. ccxt/pro/bitfinex2.py +0 -1081
  510. ccxt/test/base/__init__.py +0 -28
  511. ccxt/test/base/test_account.py +0 -26
  512. ccxt/test/base/test_balance.py +0 -56
  513. ccxt/test/base/test_borrow_interest.py +0 -35
  514. ccxt/test/base/test_borrow_rate.py +0 -32
  515. ccxt/test/base/test_calculate_fee.py +0 -51
  516. ccxt/test/base/test_crypto.py +0 -127
  517. ccxt/test/base/test_currency.py +0 -76
  518. ccxt/test/base/test_datetime.py +0 -103
  519. ccxt/test/base/test_decimal_to_precision.py +0 -392
  520. ccxt/test/base/test_deep_extend.py +0 -68
  521. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  522. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  523. ccxt/test/base/test_funding_rate_history.py +0 -29
  524. ccxt/test/base/test_last_price.py +0 -32
  525. ccxt/test/base/test_ledger_entry.py +0 -45
  526. ccxt/test/base/test_ledger_item.py +0 -48
  527. ccxt/test/base/test_leverage_tier.py +0 -33
  528. ccxt/test/base/test_margin_mode.py +0 -24
  529. ccxt/test/base/test_margin_modification.py +0 -35
  530. ccxt/test/base/test_market.py +0 -190
  531. ccxt/test/base/test_number.py +0 -411
  532. ccxt/test/base/test_ohlcv.py +0 -32
  533. ccxt/test/base/test_open_interest.py +0 -32
  534. ccxt/test/base/test_order.py +0 -64
  535. ccxt/test/base/test_order_book.py +0 -63
  536. ccxt/test/base/test_position.py +0 -60
  537. ccxt/test/base/test_shared_methods.py +0 -345
  538. ccxt/test/base/test_status.py +0 -24
  539. ccxt/test/base/test_throttle.py +0 -126
  540. ccxt/test/base/test_ticker.py +0 -86
  541. ccxt/test/base/test_trade.py +0 -47
  542. ccxt/test/base/test_trading_fee.py +0 -26
  543. ccxt/test/base/test_transaction.py +0 -39
  544. ccxt-4.2.76.dist-info/METADATA +0 -626
  545. ccxt-4.2.76.dist-info/RECORD +0 -534
  546. {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/coinmetro.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.coinmetro import ImplicitAPI
8
- from ccxt.base.types import Balances, Currency, IndexType, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
8
+ from ccxt.base.types import Balances, Currencies, Currency, IndexType, Int, LedgerEntry, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import PermissionDenied
@@ -16,7 +16,7 @@ from ccxt.base.errors import InsufficientFunds
16
16
  from ccxt.base.errors import InvalidOrder
17
17
  from ccxt.base.errors import OrderNotFound
18
18
  from ccxt.base.errors import RateLimitExceeded
19
- from ccxt.base.decimal_to_precision import DECIMAL_PLACES
19
+ from ccxt.base.decimal_to_precision import TICK_SIZE
20
20
  from ccxt.base.precise import Precise
21
21
 
22
22
 
@@ -122,6 +122,7 @@ class coinmetro(Exchange, ImplicitAPI):
122
122
  'reduceMargin': False,
123
123
  'repayCrossMargin': False,
124
124
  'repayIsolatedMargin': False,
125
+ 'sandbox': True,
125
126
  'setLeverage': False,
126
127
  'setMargin': False,
127
128
  'setMarginMode': False,
@@ -171,6 +172,7 @@ class coinmetro(Exchange, ImplicitAPI):
171
172
  'private': {
172
173
  'get': {
173
174
  'users/balances': 1,
175
+ 'users/wallets': 1,
174
176
  'users/wallets/history/{since}': 1.67,
175
177
  'exchange/orders/status/{orderID}': 1,
176
178
  'exchange/orders/active': 1,
@@ -213,12 +215,80 @@ class coinmetro(Exchange, ImplicitAPI):
213
215
  'maker': self.parse_number('0'),
214
216
  },
215
217
  },
216
- 'precisionMode': DECIMAL_PLACES,
218
+ 'precisionMode': TICK_SIZE,
217
219
  # exchange-specific options
218
220
  'options': {
219
221
  'currenciesByIdForParseMarket': None,
220
222
  'currencyIdsListForParseMarket': None,
221
223
  },
224
+ 'features': {
225
+ 'spot': {
226
+ 'sandbox': True,
227
+ 'createOrder': {
228
+ 'marginMode': True, # todo implement
229
+ 'triggerPrice': True,
230
+ 'triggerPriceType': None,
231
+ 'triggerDirection': False,
232
+ 'stopLossPrice': False, # todo
233
+ 'takeProfitPrice': False, # todo
234
+ 'attachedStopLossTakeProfit': {
235
+ 'triggerPriceType': None,
236
+ 'price': False,
237
+ },
238
+ 'timeInForce': {
239
+ 'IOC': True,
240
+ 'FOK': True,
241
+ 'PO': False,
242
+ 'GTD': True,
243
+ },
244
+ 'hedged': False,
245
+ 'trailing': False,
246
+ 'leverage': False,
247
+ 'marketBuyByCost': True,
248
+ 'marketBuyRequiresPrice': False,
249
+ 'selfTradePrevention': False,
250
+ 'iceberg': True,
251
+ },
252
+ 'createOrders': None,
253
+ 'fetchMyTrades': {
254
+ 'marginMode': False,
255
+ 'limit': None,
256
+ 'daysBack': 100000,
257
+ 'untilDays': None,
258
+ },
259
+ 'fetchOrder': {
260
+ 'marginMode': False,
261
+ 'trigger': False,
262
+ 'trailing': False,
263
+ },
264
+ 'fetchOpenOrders': {
265
+ 'marginMode': False,
266
+ 'limit': None,
267
+ 'trigger': False,
268
+ 'trailing': False,
269
+ },
270
+ 'fetchOrders': {
271
+ 'marginMode': False,
272
+ 'limit': None,
273
+ 'daysBack': 100000,
274
+ 'untilDays': None,
275
+ 'trigger': False,
276
+ 'trailing': False,
277
+ },
278
+ 'fetchClosedOrders': None,
279
+ 'fetchOHLCV': {
280
+ 'limit': 1000,
281
+ },
282
+ },
283
+ 'swap': {
284
+ 'linear': None,
285
+ 'inverse': None,
286
+ },
287
+ 'future': {
288
+ 'linear': None,
289
+ 'inverse': None,
290
+ },
291
+ },
222
292
  'exceptions': {
223
293
  # https://trade-docs.coinmetro.co/?javascript--nodejs#message-codes
224
294
  'exact': {
@@ -256,10 +326,12 @@ class coinmetro(Exchange, ImplicitAPI):
256
326
  },
257
327
  })
258
328
 
259
- def fetch_currencies(self, params={}):
329
+ def fetch_currencies(self, params={}) -> Currencies:
260
330
  """
261
331
  fetches all available currencies on an exchange
262
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#d5876d43-a3fe-4479-8c58-24d0f044edfb
332
+
333
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#d5876d43-a3fe-4479-8c58-24d0f044edfb
334
+
263
335
  :param dict [params]: extra parameters specific to the exchange API endpoint
264
336
  :returns dict: an associative dictionary of currencies
265
337
  """
@@ -306,7 +378,7 @@ class coinmetro(Exchange, ImplicitAPI):
306
378
  # ...
307
379
  # ]
308
380
  #
309
- result = {}
381
+ result: dict = {}
310
382
  for i in range(0, len(response)):
311
383
  currency = response[i]
312
384
  id = self.safe_string(currency, 'symbol')
@@ -315,7 +387,6 @@ class coinmetro(Exchange, ImplicitAPI):
315
387
  deposit = self.safe_value(currency, 'canDeposit')
316
388
  canTrade = self.safe_value(currency, 'canTrade')
317
389
  active = withdraw if canTrade else True
318
- precision = self.safe_integer(currency, 'digits')
319
390
  minAmount = self.safe_number(currency, 'minQty')
320
391
  result[code] = self.safe_currency_structure({
321
392
  'id': id,
@@ -326,7 +397,7 @@ class coinmetro(Exchange, ImplicitAPI):
326
397
  'deposit': deposit,
327
398
  'withdraw': withdraw,
328
399
  'fee': None,
329
- 'precision': precision,
400
+ 'precision': self.parse_number(self.parse_precision(self.safe_string(currency, 'digits'))),
330
401
  'limits': {
331
402
  'amount': {'min': minAmount, 'max': None},
332
403
  'withdraw': {'min': None, 'max': None},
@@ -339,10 +410,12 @@ class coinmetro(Exchange, ImplicitAPI):
339
410
  self.options['currencyIdsListForParseMarket'] = list(currenciesById.keys())
340
411
  return result
341
412
 
342
- def fetch_markets(self, params={}):
413
+ def fetch_markets(self, params={}) -> List[Market]:
343
414
  """
344
415
  retrieves data on all markets for coinmetro
345
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#9fd18008-338e-4863-b07d-722878a46832
416
+
417
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#9fd18008-338e-4863-b07d-722878a46832
418
+
346
419
  :param dict [params]: extra parameters specific to the exchange API endpoint
347
420
  :returns dict[]: an array of objects representing market data
348
421
  """
@@ -352,26 +425,21 @@ class coinmetro(Exchange, ImplicitAPI):
352
425
  #
353
426
  # [
354
427
  # {
355
- # "pair": "PERPEUR",
356
- # "precision": 5,
357
- # "margin": False
358
- # },
359
- # {
360
- # "pair": "PERPUSD",
428
+ # "pair": "YFIEUR",
361
429
  # "precision": 5,
362
430
  # "margin": False
363
431
  # },
364
432
  # {
365
- # "pair": "YFIEUR",
366
- # "precision": 5,
367
- # "margin": False
433
+ # "pair": "BTCEUR",
434
+ # "precision": 2,
435
+ # "margin": True
368
436
  # },
369
437
  # ...
370
438
  # ]
371
439
  #
372
440
  return self.parse_markets(response)
373
441
 
374
- def parse_market(self, market) -> Market:
442
+ def parse_market(self, market: dict) -> Market:
375
443
  id = self.safe_string(market, 'pair')
376
444
  parsedMarketId = self.parse_market_id(id)
377
445
  baseId = self.safe_string(parsedMarketId, 'baseId')
@@ -410,9 +478,7 @@ class coinmetro(Exchange, ImplicitAPI):
410
478
  'optionType': None,
411
479
  'precision': {
412
480
  'amount': basePrecisionAndLimits['precision'],
413
- 'price': quotePrecisionAndLimits['precision'],
414
- 'base': basePrecisionAndLimits['precision'],
415
- 'quote': quotePrecisionAndLimits['precision'],
481
+ 'price': self.parse_number(self.parse_precision(self.safe_string(market, 'precision'))),
416
482
  },
417
483
  'limits': {
418
484
  'leverage': {
@@ -453,7 +519,7 @@ class coinmetro(Exchange, ImplicitAPI):
453
519
  baseId = restId
454
520
  quoteId = currencyId
455
521
  break
456
- result = {
522
+ result: dict = {
457
523
  'baseId': baseId,
458
524
  'quoteId': quoteId,
459
525
  }
@@ -462,12 +528,11 @@ class coinmetro(Exchange, ImplicitAPI):
462
528
  def parse_market_precision_and_limits(self, currencyId):
463
529
  currencies = self.safe_value(self.options, 'currenciesByIdForParseMarket', {})
464
530
  currency = self.safe_value(currencies, currencyId, {})
465
- precision = self.safe_integer(currency, 'precision')
466
531
  limits = self.safe_value(currency, 'limits', {})
467
532
  amountLimits = self.safe_value(limits, 'amount', {})
468
533
  minLimit = self.safe_number(amountLimits, 'min')
469
- result = {
470
- 'precision': precision,
534
+ result: dict = {
535
+ 'precision': self.safe_number(currency, 'precision'),
471
536
  'minLimit': minLimit,
472
537
  }
473
538
  return result
@@ -475,7 +540,9 @@ class coinmetro(Exchange, ImplicitAPI):
475
540
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
476
541
  """
477
542
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
478
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#13cfb5bc-7bfb-4847-85e1-e0f35dfb3573
543
+
544
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#13cfb5bc-7bfb-4847-85e1-e0f35dfb3573
545
+
479
546
  :param str symbol: unified symbol of the market to fetch OHLCV data for
480
547
  :param str timeframe: the length of time each candle represents
481
548
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -486,7 +553,7 @@ class coinmetro(Exchange, ImplicitAPI):
486
553
  """
487
554
  self.load_markets()
488
555
  market = self.market(symbol)
489
- request = {
556
+ request: dict = {
490
557
  'pair': market['id'],
491
558
  'timeframe': self.safe_string(self.timeframes, timeframe, timeframe),
492
559
  }
@@ -498,9 +565,9 @@ class coinmetro(Exchange, ImplicitAPI):
498
565
  until = self.sum(since, duration * (limit))
499
566
  else:
500
567
  request['from'] = ':from' # self endpoint doesn't accept empty from and to params(setting them into the value described in the documentation)
501
- until = self.safe_integer_2(params, 'till', 'until', until)
568
+ until = self.safe_integer(params, 'until', until)
502
569
  if until is not None:
503
- params = self.omit(params, ['till', 'until'])
570
+ params = self.omit(params, ['until'])
504
571
  request['to'] = until
505
572
  else:
506
573
  request['to'] = ':to'
@@ -532,7 +599,7 @@ class coinmetro(Exchange, ImplicitAPI):
532
599
  # ]
533
600
  # }
534
601
  #
535
- candleHistory = self.safe_value(response, 'candleHistory', [])
602
+ candleHistory = self.safe_list(response, 'candleHistory', [])
536
603
  return self.parse_ohlcvs(candleHistory, market, timeframe, since, limit)
537
604
 
538
605
  def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
@@ -548,7 +615,9 @@ class coinmetro(Exchange, ImplicitAPI):
548
615
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
549
616
  """
550
617
  get the list of most recent trades for a particular symbol
551
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ee5d698-06da-4570-8c84-914185e05065
618
+
619
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ee5d698-06da-4570-8c84-914185e05065
620
+
552
621
  :param str symbol: unified symbol of the market to fetch trades for
553
622
  :param int [since]: timestamp in ms of the earliest trade to fetch
554
623
  :param int [limit]: the maximum amount of trades to fetch(default 200, max 500)
@@ -557,7 +626,7 @@ class coinmetro(Exchange, ImplicitAPI):
557
626
  """
558
627
  self.load_markets()
559
628
  market = self.market(symbol)
560
- request = {
629
+ request: dict = {
561
630
  'pair': market['id'],
562
631
  }
563
632
  if since is not None:
@@ -594,13 +663,15 @@ class coinmetro(Exchange, ImplicitAPI):
594
663
  # ]
595
664
  # }
596
665
  #
597
- tickHistory = self.safe_value(response, 'tickHistory', [])
666
+ tickHistory = self.safe_list(response, 'tickHistory', [])
598
667
  return self.parse_trades(tickHistory, market, since, limit)
599
668
 
600
669
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
601
670
  """
602
671
  fetch all trades made by the user
603
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#4d48ae69-8ee2-44d1-a268-71f84e557b7b
672
+
673
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#4d48ae69-8ee2-44d1-a268-71f84e557b7b
674
+
604
675
  :param str symbol: unified market symbol
605
676
  :param int [since]: the earliest time in ms to fetch trades for
606
677
  :param int [limit]: the maximum number of trades structures to retrieve(default 500, max 1000)
@@ -611,7 +682,7 @@ class coinmetro(Exchange, ImplicitAPI):
611
682
  market = None
612
683
  if symbol is not None:
613
684
  market = self.market(symbol)
614
- request = {}
685
+ request: dict = {}
615
686
  if since is not None:
616
687
  request['since'] = since
617
688
  else:
@@ -634,7 +705,7 @@ class coinmetro(Exchange, ImplicitAPI):
634
705
  #
635
706
  return self.parse_trades(response, market, since, limit)
636
707
 
637
- def parse_trade(self, trade, market: Market = None) -> Trade:
708
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
638
709
  #
639
710
  # fetchTrades
640
711
  # {
@@ -705,7 +776,9 @@ class coinmetro(Exchange, ImplicitAPI):
705
776
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
706
777
  """
707
778
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
708
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#26ad80d7-8c46-41b5-9208-386f439a8b87
779
+
780
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#26ad80d7-8c46-41b5-9208-386f439a8b87
781
+
709
782
  :param str symbol: unified symbol of the market to fetch the order book for
710
783
  :param int [limit]: the maximum amount of order book entries to return(default 100, max 200)
711
784
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -713,7 +786,7 @@ class coinmetro(Exchange, ImplicitAPI):
713
786
  """
714
787
  self.load_markets()
715
788
  market = self.market(symbol)
716
- request = {
789
+ request: dict = {
717
790
  'pair': market['id'],
718
791
  }
719
792
  response = self.publicGetExchangeBookPair(self.extend(request, params))
@@ -747,7 +820,7 @@ class coinmetro(Exchange, ImplicitAPI):
747
820
  book = self.safe_value(response, 'book', {})
748
821
  rawBids = self.safe_value(book, 'bid', {})
749
822
  rawAsks = self.safe_value(book, 'ask', {})
750
- rawOrderbook = {
823
+ rawOrderbook: dict = {
751
824
  'bids': rawBids,
752
825
  'asks': rawAsks,
753
826
  }
@@ -768,7 +841,9 @@ class coinmetro(Exchange, ImplicitAPI):
768
841
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
769
842
  """
770
843
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
771
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ecd1cd1-f162-45a3-8b3b-de690332a485
844
+
845
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ecd1cd1-f162-45a3-8b3b-de690332a485
846
+
772
847
  :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
773
848
  :param dict [params]: extra parameters specific to the exchange API endpoint
774
849
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -825,7 +900,7 @@ class coinmetro(Exchange, ImplicitAPI):
825
900
  #
826
901
  latestPrices = self.safe_value(response, 'latestPrices', [])
827
902
  twentyFourHInfos = self.safe_value(response, '24hInfo', [])
828
- tickersObject = {}
903
+ tickersObject: dict = {}
829
904
  # merging info from two lists into one
830
905
  for i in range(0, len(latestPrices)):
831
906
  latestPrice = latestPrices[i]
@@ -844,17 +919,19 @@ class coinmetro(Exchange, ImplicitAPI):
844
919
  def fetch_bids_asks(self, symbols: Strings = None, params={}):
845
920
  """
846
921
  fetches the bid and ask price and volume for multiple markets
847
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ecd1cd1-f162-45a3-8b3b-de690332a485
922
+
923
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#6ecd1cd1-f162-45a3-8b3b-de690332a485
924
+
848
925
  :param str[] [symbols]: unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
849
926
  :param dict [params]: extra parameters specific to the exchange API endpoint
850
927
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
851
928
  """
852
929
  self.load_markets()
853
930
  response = self.publicGetExchangePrices(params)
854
- latestPrices = self.safe_value(response, 'latestPrices', [])
931
+ latestPrices = self.safe_list(response, 'latestPrices', [])
855
932
  return self.parse_tickers(latestPrices, symbols)
856
933
 
857
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
934
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
858
935
  #
859
936
  # {
860
937
  # "pair": "PERPUSD",
@@ -910,65 +987,68 @@ class coinmetro(Exchange, ImplicitAPI):
910
987
  def fetch_balance(self, params={}) -> Balances:
911
988
  """
912
989
  query for balance and get the amount of funds available for trading or funds locked in orders
913
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#698ae067-43dd-4e19-a0ac-d9ba91381816
990
+
991
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#741a1dcc-7307-40d0-acca-28d003d1506a
992
+
914
993
  :param dict [params]: extra parameters specific to the exchange API endpoint
915
994
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
916
995
  """
917
996
  self.load_markets()
918
- response = self.privateGetUsersBalances(params)
919
- return self.parse_balance(response)
997
+ response = self.privateGetUsersWallets(params)
998
+ list = self.safe_list(response, 'list', [])
999
+ return self.parse_balance(list)
920
1000
 
921
- def parse_balance(self, response) -> Balances:
1001
+ def parse_balance(self, balances) -> Balances:
922
1002
  #
923
- # {
924
- # "USDC": {
925
- # "USDC": 99,
926
- # "EUR": 91.16,
927
- # "BTC": 0.002334
928
- # },
929
- # "XCM": {
930
- # "XCM": 0,
931
- # "EUR": 0,
932
- # "BTC": 0
933
- # },
934
- # "TOTAL": {
935
- # "EUR": 91.16,
936
- # "BTC": 0.002334
1003
+ # [
1004
+ # {
1005
+ # "xcmLocks": [],
1006
+ # "xcmLockAmounts": [],
1007
+ # "refList": [],
1008
+ # "balanceHistory": [],
1009
+ # "_id": "5fecd3c998e75c2e4d63f7c3",
1010
+ # "currency": "BTC",
1011
+ # "label": "BTC",
1012
+ # "userId": "5fecd3c97fbfed1521db23bd",
1013
+ # "__v": 0,
1014
+ # "balance": 0.5,
1015
+ # "createdAt": "2020-12-30T19:23:53.646Z",
1016
+ # "disabled": False,
1017
+ # "updatedAt": "2020-12-30T19:23:53.653Z",
1018
+ # "reserved": 0,
1019
+ # "id": "5fecd3c998e75c2e4d63f7c3"
937
1020
  # },
938
- # "REF": {
939
- # "XCM": 0,
940
- # "EUR": 0,
941
- # "BTC": 0
942
- # }
943
- # }
1021
+ # ...
1022
+ # ]
944
1023
  #
945
- result = {
946
- 'info': response,
1024
+ result: dict = {
1025
+ 'info': balances,
947
1026
  }
948
- balances = self.omit(response, ['TOTAL', 'REF'])
949
- currencyIds = list(balances.keys())
950
- for i in range(0, len(currencyIds)):
951
- currencyId = currencyIds[i]
1027
+ for i in range(0, len(balances)):
1028
+ balanceEntry = self.safe_dict(balances, i, {})
1029
+ currencyId = self.safe_string(balanceEntry, 'currency')
952
1030
  code = self.safe_currency_code(currencyId)
953
1031
  account = self.account()
954
- currency = self.safe_value(balances, currencyId, {})
955
- account['total'] = self.safe_string(currency, currencyId)
1032
+ account['total'] = self.safe_string(balanceEntry, 'balance')
1033
+ account['used'] = self.safe_string(balanceEntry, 'reserved')
956
1034
  result[code] = account
957
1035
  return self.safe_balance(result)
958
1036
 
959
- def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
1037
+ def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[LedgerEntry]:
960
1038
  """
961
- fetch the history of changes, actions done by the user or operations that altered balance of the user
962
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#4e7831f7-a0e7-4c3e-9336-1d0e5dcb15cf
963
- :param str code: unified currency code, default is None
1039
+ fetch the history of changes, actions done by the user or operations that altered the balance of the user
1040
+
1041
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#4e7831f7-a0e7-4c3e-9336-1d0e5dcb15cf
1042
+
1043
+ :param str [code]: unified currency code, default is None
964
1044
  :param int [since]: timestamp in ms of the earliest ledger entry, default is None
965
- :param int [limit]: max number of ledger entrys to return(default 200, max 500)
1045
+ :param int [limit]: max number of ledger entries to return(default 200, max 500)
966
1046
  :param dict [params]: extra parameters specific to the exchange API endpoint
967
1047
  :param int [params.until]: the latest time in ms to fetch entries for
968
- :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
1048
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
969
1049
  """
970
1050
  self.load_markets()
971
- request = {}
1051
+ request: dict = {}
972
1052
  if since is not None:
973
1053
  request['since'] = since
974
1054
  else:
@@ -1078,7 +1158,7 @@ class coinmetro(Exchange, ImplicitAPI):
1078
1158
  ledger.append(rawLedgerEntry)
1079
1159
  return self.parse_ledger(ledger, currency, since, limit)
1080
1160
 
1081
- def parse_ledger_entry(self, item, currency: Currency = None):
1161
+ def parse_ledger_entry(self, item: dict, currency: Currency = None) -> LedgerEntry:
1082
1162
  datetime = self.safe_string(item, 'timestamp')
1083
1163
  currencyId = self.safe_string(item, 'currencyId')
1084
1164
  item = self.omit(item, 'currencyId')
@@ -1133,7 +1213,7 @@ class coinmetro(Exchange, ImplicitAPI):
1133
1213
  return [type, referenceId]
1134
1214
 
1135
1215
  def parse_ledger_entry_type(self, type):
1136
- types = {
1216
+ types: dict = {
1137
1217
  'Deposit': 'transaction',
1138
1218
  'Withdraw': 'transaction',
1139
1219
  'Order': 'trade',
@@ -1143,12 +1223,14 @@ class coinmetro(Exchange, ImplicitAPI):
1143
1223
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1144
1224
  """
1145
1225
  create a trade order
1146
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#a4895a1d-3f50-40ae-8231-6962ef06c771
1226
+
1227
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#a4895a1d-3f50-40ae-8231-6962ef06c771
1228
+
1147
1229
  :param str symbol: unified symbol of the market to create an order in
1148
1230
  :param str type: 'market' or 'limit'
1149
1231
  :param str side: 'buy' or 'sell'
1150
1232
  :param float amount: how much of currency you want to trade in units of base currency
1151
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1233
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1152
1234
  :param dict [params]: extra parameters specific to the exchange API endpoint
1153
1235
  :param float [params.cost]: the quote quantity that can be used alternative for the amount in market orders
1154
1236
  :param str [params.timeInForce]: "GTC", "IOC", "FOK", "GTD"
@@ -1163,7 +1245,7 @@ class coinmetro(Exchange, ImplicitAPI):
1163
1245
  """
1164
1246
  self.load_markets()
1165
1247
  market = self.market(symbol)
1166
- request = {
1248
+ request: dict = {
1167
1249
  }
1168
1250
  request['orderType'] = type
1169
1251
  precisedAmount = None
@@ -1188,10 +1270,10 @@ class coinmetro(Exchange, ImplicitAPI):
1188
1270
  if timeInForce is not None:
1189
1271
  params = self.omit(params, 'timeInForce')
1190
1272
  request['timeInForce'] = self.encode_order_time_in_force(timeInForce)
1191
- stopPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1192
- if stopPrice is not None:
1273
+ triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
1274
+ if triggerPrice is not None:
1193
1275
  params = self.omit(params, ['triggerPrice'])
1194
- request['stopPrice'] = self.price_to_precision(symbol, stopPrice)
1276
+ request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
1195
1277
  userData = self.safe_value(params, 'userData', {})
1196
1278
  comment = self.safe_string_2(params, 'clientOrderId', 'comment')
1197
1279
  if comment is not None:
@@ -1248,7 +1330,7 @@ class coinmetro(Exchange, ImplicitAPI):
1248
1330
  return request
1249
1331
 
1250
1332
  def encode_order_time_in_force(self, timeInForce):
1251
- timeInForceTypes = {
1333
+ timeInForceTypes: dict = {
1252
1334
  'GTC': 1,
1253
1335
  'IOC': 2,
1254
1336
  'GTD': 3,
@@ -1259,8 +1341,10 @@ class coinmetro(Exchange, ImplicitAPI):
1259
1341
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1260
1342
  """
1261
1343
  cancels an open order
1262
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#eaea86da-16ca-4c56-9f00-5b1cb2ad89f8
1263
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#47f913fb-8cab-49f4-bc78-d980e6ced316
1344
+
1345
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#eaea86da-16ca-4c56-9f00-5b1cb2ad89f8
1346
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#47f913fb-8cab-49f4-bc78-d980e6ced316
1347
+
1264
1348
  :param str id: order id
1265
1349
  :param str symbol: not used by coinmetro cancelOrder()
1266
1350
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1268,7 +1352,7 @@ class coinmetro(Exchange, ImplicitAPI):
1268
1352
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1269
1353
  """
1270
1354
  self.load_markets()
1271
- request = {
1355
+ request: dict = {
1272
1356
  'orderID': id,
1273
1357
  }
1274
1358
  marginMode = None
@@ -1304,7 +1388,9 @@ class coinmetro(Exchange, ImplicitAPI):
1304
1388
  def close_position(self, symbol: str, side: OrderSide = None, params={}):
1305
1389
  """
1306
1390
  closes an open position
1307
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#47f913fb-8cab-49f4-bc78-d980e6ced316
1391
+
1392
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#47f913fb-8cab-49f4-bc78-d980e6ced316
1393
+
1308
1394
  :param str symbol: not used by coinmetro closePosition()
1309
1395
  :param str [side]: not used by coinmetro closePosition()
1310
1396
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1316,7 +1402,7 @@ class coinmetro(Exchange, ImplicitAPI):
1316
1402
  orderId = self.safe_string(params, 'orderId')
1317
1403
  if orderId is None:
1318
1404
  raise ArgumentsRequired(self.id + ' closePosition() requires a orderId parameter')
1319
- request = {
1405
+ request: dict = {
1320
1406
  'orderID': orderId,
1321
1407
  }
1322
1408
  response = self.privatePostExchangeOrdersCloseOrderID(self.extend(request, params))
@@ -1354,7 +1440,9 @@ class coinmetro(Exchange, ImplicitAPI):
1354
1440
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1355
1441
  """
1356
1442
  fetch all unfilled currently open orders
1357
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#518afd7a-4338-439c-a651-d4fdaa964138
1443
+
1444
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#518afd7a-4338-439c-a651-d4fdaa964138
1445
+
1358
1446
  :param str symbol: unified market symbol
1359
1447
  :param int [since]: the earliest time in ms to fetch open orders for
1360
1448
  :param int [limit]: the maximum number of open order structures to retrieve
@@ -1375,7 +1463,9 @@ class coinmetro(Exchange, ImplicitAPI):
1375
1463
  def fetch_canceled_and_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1376
1464
  """
1377
1465
  fetches information on multiple canceled and closed orders made by the user
1378
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#4d48ae69-8ee2-44d1-a268-71f84e557b7b
1466
+
1467
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#4d48ae69-8ee2-44d1-a268-71f84e557b7b
1468
+
1379
1469
  :param str symbol: unified market symbol of the market orders were made in
1380
1470
  :param int [since]: the earliest time in ms to fetch orders for
1381
1471
  :param int [limit]: the maximum number of order structures to retrieve
@@ -1386,7 +1476,7 @@ class coinmetro(Exchange, ImplicitAPI):
1386
1476
  market = None
1387
1477
  if symbol is not None:
1388
1478
  market = self.market(symbol)
1389
- request = {}
1479
+ request: dict = {}
1390
1480
  if since is not None:
1391
1481
  request['since'] = since
1392
1482
  response = self.privateGetExchangeOrdersHistorySince(self.extend(request, params))
@@ -1395,14 +1485,16 @@ class coinmetro(Exchange, ImplicitAPI):
1395
1485
  def fetch_order(self, id: str, symbol: Str = None, params={}):
1396
1486
  """
1397
1487
  fetches information on an order made by the user
1398
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#95bbed87-db1c-47a7-a03e-aa247e91d5a6
1488
+
1489
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#95bbed87-db1c-47a7-a03e-aa247e91d5a6
1490
+
1399
1491
  :param int|str id: order id
1400
1492
  :param str symbol: not used by coinmetro fetchOrder()
1401
1493
  :param dict [params]: extra parameters specific to the exchange API endpoint
1402
1494
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1403
1495
  """
1404
1496
  self.load_markets()
1405
- request = {
1497
+ request: dict = {
1406
1498
  'orderID': id,
1407
1499
  }
1408
1500
  response = self.privateGetExchangeOrdersStatusOrderID(self.extend(request, params))
@@ -1443,7 +1535,7 @@ class coinmetro(Exchange, ImplicitAPI):
1443
1535
  #
1444
1536
  return self.parse_order(response)
1445
1537
 
1446
- def parse_order(self, order, market: Market = None) -> Order:
1538
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1447
1539
  #
1448
1540
  # createOrder market
1449
1541
  # {
@@ -1682,7 +1774,6 @@ class coinmetro(Exchange, ImplicitAPI):
1682
1774
  }
1683
1775
  trades = self.safe_value(order, 'fills', [])
1684
1776
  userData = self.safe_value(order, 'userData', {})
1685
- triggerPrice = self.safe_string(order, 'stopPrice')
1686
1777
  clientOrderId = self.safe_string(userData, 'comment')
1687
1778
  takeProfitPrice = self.safe_string(userData, 'takeProfit')
1688
1779
  stopLossPrice = self.safe_string(userData, 'stopLoss')
@@ -1698,7 +1789,7 @@ class coinmetro(Exchange, ImplicitAPI):
1698
1789
  'timeInForce': self.parse_order_time_in_force(self.safe_integer(order, 'timeInForce')),
1699
1790
  'side': side,
1700
1791
  'price': price,
1701
- 'triggerPrice': triggerPrice,
1792
+ 'triggerPrice': self.safe_string(order, 'stopPrice'),
1702
1793
  'takeProfitPrice': takeProfitPrice,
1703
1794
  'stopLossPrice': stopLossPrice,
1704
1795
  'average': None,
@@ -1725,7 +1816,9 @@ class coinmetro(Exchange, ImplicitAPI):
1725
1816
  def borrow_cross_margin(self, code: str, amount: float, params={}):
1726
1817
  """
1727
1818
  create a loan to borrow margin
1728
- :see: https://documenter.getpostman.com/view/3653795/SVfWN6KS#5b90b3b9-e5db-4d07-ac9d-d680a06fd110
1819
+
1820
+ https://documenter.getpostman.com/view/3653795/SVfWN6KS#5b90b3b9-e5db-4d07-ac9d-d680a06fd110
1821
+
1729
1822
  :param str code: unified currency code of the currency to borrow
1730
1823
  :param float amount: the amount to borrow
1731
1824
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1734,7 +1827,7 @@ class coinmetro(Exchange, ImplicitAPI):
1734
1827
  self.load_markets()
1735
1828
  currency = self.currency(code)
1736
1829
  currencyId = currency['id']
1737
- request = {}
1830
+ request: dict = {}
1738
1831
  request[currencyId] = self.currency_to_precision(code, amount)
1739
1832
  response = self.privatePutUsersMarginCollateral(self.extend(request, params))
1740
1833
  #
@@ -1793,7 +1886,7 @@ class coinmetro(Exchange, ImplicitAPI):
1793
1886
  url = url[0:len(url) - 1]
1794
1887
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1795
1888
 
1796
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
1889
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1797
1890
  if response is None:
1798
1891
  return None
1799
1892
  if (code != 200) and (code != 201) and (code != 202):