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/btcmarkets.py CHANGED
@@ -14,7 +14,6 @@ from ccxt.base.errors import BadRequest
14
14
  from ccxt.base.errors import InsufficientFunds
15
15
  from ccxt.base.errors import InvalidOrder
16
16
  from ccxt.base.errors import OrderNotFound
17
- from ccxt.base.errors import DDoSProtection
18
17
  from ccxt.base.decimal_to_precision import TICK_SIZE
19
18
  from ccxt.base.precise import Precise
20
19
 
@@ -43,6 +42,7 @@ class btcmarkets(Exchange, ImplicitAPI):
43
42
  'createDepositAddress': False,
44
43
  'createOrder': True,
45
44
  'createReduceOnlyOrder': False,
45
+ 'createTriggerOrder': True,
46
46
  'fetchBalance': True,
47
47
  'fetchBorrowRateHistories': False,
48
48
  'fetchBorrowRateHistory': False,
@@ -73,8 +73,11 @@ class btcmarkets(Exchange, ImplicitAPI):
73
73
  'fetchOrderBook': True,
74
74
  'fetchOrders': True,
75
75
  'fetchPosition': False,
76
+ 'fetchPositionHistory': False,
76
77
  'fetchPositionMode': False,
77
78
  'fetchPositions': False,
79
+ 'fetchPositionsForSymbol': False,
80
+ 'fetchPositionsHistory': False,
78
81
  'fetchPositionsRisk': False,
79
82
  'fetchPremiumIndexOHLCV': False,
80
83
  'fetchTicker': True,
@@ -89,7 +92,7 @@ class btcmarkets(Exchange, ImplicitAPI):
89
92
  'withdraw': True,
90
93
  },
91
94
  'urls': {
92
- 'logo': 'https://user-images.githubusercontent.com/51840849/89731817-b3fb8480-da52-11ea-817f-783b08aaf32b.jpg',
95
+ 'logo': 'https://github.com/user-attachments/assets/8c8d6907-3873-4cc4-ad20-e22fba28247e',
93
96
  'api': {
94
97
  'public': 'https://api.btcmarkets.net',
95
98
  'private': 'https://api.btcmarkets.net',
@@ -156,18 +159,93 @@ class btcmarkets(Exchange, ImplicitAPI):
156
159
  '1h': '1h',
157
160
  '1d': '1d',
158
161
  },
162
+ 'features': {
163
+ 'spot': {
164
+ 'sandbox': False,
165
+ 'createOrder': {
166
+ 'marginMode': False,
167
+ 'triggerPrice': True, # todo: check
168
+ 'triggerPriceType': None,
169
+ 'triggerDirection': False,
170
+ 'stopLossPrice': False,
171
+ 'takeProfitPrice': False,
172
+ 'attachedStopLossTakeProfit': None,
173
+ 'timeInForce': {
174
+ 'IOC': True,
175
+ 'FOK': True,
176
+ 'PO': True,
177
+ 'GTD': False,
178
+ },
179
+ 'hedged': False,
180
+ 'leverage': False,
181
+ 'marketBuyRequiresPrice': False,
182
+ 'marketBuyByCost': False,
183
+ 'selfTradePrevention': True, # todo: check
184
+ 'trailing': False,
185
+ 'iceberg': False,
186
+ },
187
+ 'createOrders': None,
188
+ 'fetchMyTrades': {
189
+ 'marginMode': False,
190
+ 'limit': 100,
191
+ 'daysBack': 100000,
192
+ 'untilDays': 100000,
193
+ },
194
+ 'fetchOrder': {
195
+ 'marginMode': False,
196
+ 'trigger': False,
197
+ 'trailing': False,
198
+ },
199
+ 'fetchOpenOrders': {
200
+ 'marginMode': False,
201
+ 'limit': 100,
202
+ 'trigger': False,
203
+ 'trailing': False,
204
+ },
205
+ 'fetchOrders': {
206
+ 'marginMode': False,
207
+ 'limit': 100,
208
+ 'daysBack': 100000,
209
+ 'untilDays': 100000,
210
+ 'trigger': False,
211
+ 'trailing': False,
212
+ },
213
+ 'fetchClosedOrders': {
214
+ 'marginMode': False,
215
+ 'limit': 100,
216
+ 'daysBack': 100000,
217
+ 'daysBackCanceled': 1,
218
+ 'untilDays': 100000,
219
+ 'trigger': False,
220
+ 'trailing': False,
221
+ },
222
+ 'fetchOHLCV': {
223
+ 'limit': 1000,
224
+ },
225
+ },
226
+ 'swap': {
227
+ 'linear': None,
228
+ 'inverse': None,
229
+ },
230
+ 'future': {
231
+ 'linear': None,
232
+ 'inverse': None,
233
+ },
234
+ },
159
235
  'precisionMode': TICK_SIZE,
160
236
  'exceptions': {
161
- '3': InvalidOrder,
162
- '6': DDoSProtection,
163
- 'InsufficientFund': InsufficientFunds,
164
- 'InvalidPrice': InvalidOrder,
165
- 'InvalidAmount': InvalidOrder,
166
- 'MissingArgument': InvalidOrder,
167
- 'OrderAlreadyCancelled': InvalidOrder,
168
- 'OrderNotFound': OrderNotFound,
169
- 'OrderStatusIsFinal': InvalidOrder,
170
- 'InvalidPaginationParameter': BadRequest,
237
+ 'exact': {
238
+ 'InsufficientFund': InsufficientFunds,
239
+ 'InvalidPrice': InvalidOrder,
240
+ 'InvalidAmount': InvalidOrder,
241
+ 'MissingArgument': BadRequest,
242
+ 'OrderAlreadyCancelled': InvalidOrder,
243
+ 'OrderNotFound': OrderNotFound,
244
+ 'OrderStatusIsFinal': InvalidOrder,
245
+ 'InvalidPaginationParameter': BadRequest,
246
+ },
247
+ 'broad': {
248
+ },
171
249
  },
172
250
  'fees': {
173
251
  'percentage': True,
@@ -187,7 +265,7 @@ class btcmarkets(Exchange, ImplicitAPI):
187
265
 
188
266
  def fetch_transactions_with_method(self, method, code: Str = None, since: Int = None, limit: Int = None, params={}):
189
267
  self.load_markets()
190
- request = {}
268
+ request: dict = {}
191
269
  if limit is not None:
192
270
  request['limit'] = limit
193
271
  if since is not None:
@@ -201,7 +279,9 @@ class btcmarkets(Exchange, ImplicitAPI):
201
279
  def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
202
280
  """
203
281
  fetch history of deposits and withdrawals
204
- :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1transfers/get
282
+
283
+ https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1transfers/get
284
+
205
285
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
206
286
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
207
287
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -213,7 +293,9 @@ class btcmarkets(Exchange, ImplicitAPI):
213
293
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
214
294
  """
215
295
  fetch all deposits made to an account
216
- :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1deposits/get
296
+
297
+ https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1deposits/get
298
+
217
299
  :param str code: unified currency code
218
300
  :param int [since]: the earliest time in ms to fetch deposits for
219
301
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -225,7 +307,9 @@ class btcmarkets(Exchange, ImplicitAPI):
225
307
  def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
226
308
  """
227
309
  fetch all withdrawals made from an account
228
- :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/get
310
+
311
+ https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/get
312
+
229
313
  :param str code: unified currency code
230
314
  :param int [since]: the earliest time in ms to fetch withdrawals for
231
315
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -234,8 +318,8 @@ class btcmarkets(Exchange, ImplicitAPI):
234
318
  """
235
319
  return self.fetch_transactions_with_method('privateGetWithdrawals', code, since, limit, params)
236
320
 
237
- def parse_transaction_status(self, status):
238
- statuses = {
321
+ def parse_transaction_status(self, status: Str):
322
+ statuses: dict = {
239
323
  'Accepted': 'pending',
240
324
  'Pending Authorization': 'pending',
241
325
  'Complete': 'ok',
@@ -245,13 +329,13 @@ class btcmarkets(Exchange, ImplicitAPI):
245
329
  return self.safe_string(statuses, status, status)
246
330
 
247
331
  def parse_transaction_type(self, type):
248
- statuses = {
332
+ statuses: dict = {
249
333
  'Withdraw': 'withdrawal',
250
334
  'Deposit': 'deposit',
251
335
  }
252
336
  return self.safe_string(statuses, type, type)
253
337
 
254
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
338
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
255
339
  #
256
340
  # {
257
341
  # "id": "6500230339",
@@ -302,7 +386,7 @@ class btcmarkets(Exchange, ImplicitAPI):
302
386
  type = self.parse_transaction_type(self.safe_string_lower(transaction, 'type'))
303
387
  if type == 'withdraw':
304
388
  type = 'withdrawal'
305
- cryptoPaymentDetail = self.safe_value(transaction, 'paymentDetail', {})
389
+ cryptoPaymentDetail = self.safe_dict(transaction, 'paymentDetail', {})
306
390
  txid = self.safe_string(cryptoPaymentDetail, 'txId')
307
391
  address = self.safe_string(cryptoPaymentDetail, 'address')
308
392
  tag = None
@@ -350,10 +434,12 @@ class btcmarkets(Exchange, ImplicitAPI):
350
434
  'info': transaction,
351
435
  }
352
436
 
353
- def fetch_markets(self, params={}):
437
+ def fetch_markets(self, params={}) -> List[Market]:
354
438
  """
355
439
  retrieves data on all markets for btcmarkets
356
- :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets/get
440
+
441
+ https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets/get
442
+
357
443
  :param dict [params]: extra parameters specific to the exchange API endpoint
358
444
  :returns dict[]: an array of objects representing market data
359
445
  """
@@ -367,23 +453,25 @@ class btcmarkets(Exchange, ImplicitAPI):
367
453
  # "minOrderAmount":"0.00007",
368
454
  # "maxOrderAmount":"1000000",
369
455
  # "amountDecimals":"8",
370
- # "priceDecimals":"2"
456
+ # "priceDecimals":"2",
457
+ # "status": "Online"
371
458
  # }
372
459
  # ]
373
460
  #
374
461
  return self.parse_markets(response)
375
462
 
376
- def parse_market(self, market) -> Market:
463
+ def parse_market(self, market: dict) -> Market:
377
464
  baseId = self.safe_string(market, 'baseAssetName')
378
465
  quoteId = self.safe_string(market, 'quoteAssetName')
379
466
  id = self.safe_string(market, 'marketId')
380
467
  base = self.safe_currency_code(baseId)
381
468
  quote = self.safe_currency_code(quoteId)
382
469
  symbol = base + '/' + quote
383
- fees = self.safe_value(self.safe_value(self.options, 'fees', {}), quote, self.fees)
470
+ fees = self.safe_value(self.safe_dict(self.options, 'fees', {}), quote, self.fees)
384
471
  pricePrecision = self.parse_number(self.parse_precision(self.safe_string(market, 'priceDecimals')))
385
472
  minAmount = self.safe_number(market, 'minOrderAmount')
386
473
  maxAmount = self.safe_number(market, 'maxOrderAmount')
474
+ status = self.safe_string(market, 'status')
387
475
  minPrice = None
388
476
  if quote == 'AUD':
389
477
  minPrice = pricePrecision
@@ -402,7 +490,7 @@ class btcmarkets(Exchange, ImplicitAPI):
402
490
  'swap': False,
403
491
  'future': False,
404
492
  'option': False,
405
- 'active': None,
493
+ 'active': (status == 'Online'),
406
494
  'contract': False,
407
495
  'linear': None,
408
496
  'inverse': None,
@@ -442,7 +530,9 @@ class btcmarkets(Exchange, ImplicitAPI):
442
530
  def fetch_time(self, params={}):
443
531
  """
444
532
  fetches the current integer timestamp in milliseconds from the exchange server
445
- :see: https://docs.btcmarkets.net/v3/#tag/Misc-APIs/paths/~1v3~1time/get
533
+
534
+ https://docs.btcmarkets.net/v3/#tag/Misc-APIs/paths/~1v3~1time/get
535
+
446
536
  :param dict [params]: extra parameters specific to the exchange API endpoint
447
537
  :returns int: the current integer timestamp in milliseconds from the exchange server
448
538
  """
@@ -455,7 +545,7 @@ class btcmarkets(Exchange, ImplicitAPI):
455
545
  return self.parse8601(self.safe_string(response, 'timestamp'))
456
546
 
457
547
  def parse_balance(self, response) -> Balances:
458
- result = {'info': response}
548
+ result: dict = {'info': response}
459
549
  for i in range(0, len(response)):
460
550
  balance = response[i]
461
551
  currencyId = self.safe_string(balance, 'assetName')
@@ -469,7 +559,9 @@ class btcmarkets(Exchange, ImplicitAPI):
469
559
  def fetch_balance(self, params={}) -> Balances:
470
560
  """
471
561
  query for balance and get the amount of funds available for trading or funds locked in orders
472
- :see: https://docs.btcmarkets.net/v3/#tag/Account-APIs/paths/~1v3~1accounts~1me~1balances/get
562
+
563
+ https://docs.btcmarkets.net/v3/#tag/Account-APIs/paths/~1v3~1accounts~1me~1balances/get
564
+
473
565
  :param dict [params]: extra parameters specific to the exchange API endpoint
474
566
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
475
567
  """
@@ -500,7 +592,9 @@ class btcmarkets(Exchange, ImplicitAPI):
500
592
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
501
593
  """
502
594
  fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
503
- :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1candles/get
595
+
596
+ https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1candles/get
597
+
504
598
  :param str symbol: unified symbol of the market to fetch OHLCV data for
505
599
  :param str timeframe: the length of time each candle represents
506
600
  :param int [since]: timestamp in ms of the earliest candle to fetch
@@ -510,7 +604,7 @@ class btcmarkets(Exchange, ImplicitAPI):
510
604
  """
511
605
  self.load_markets()
512
606
  market = self.market(symbol)
513
- request = {
607
+ request: dict = {
514
608
  'marketId': market['id'],
515
609
  'timeWindow': self.safe_string(self.timeframes, timeframe, timeframe),
516
610
  # 'from': self.iso8601(since),
@@ -522,7 +616,7 @@ class btcmarkets(Exchange, ImplicitAPI):
522
616
  if since is not None:
523
617
  request['from'] = self.iso8601(since)
524
618
  if limit is not None:
525
- request['limit'] = limit # default is 10, max 200
619
+ request['limit'] = min(limit, 200) # default is 10, max 200
526
620
  response = self.publicGetMarketsMarketIdCandles(self.extend(request, params))
527
621
  #
528
622
  # [
@@ -536,7 +630,9 @@ class btcmarkets(Exchange, ImplicitAPI):
536
630
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
537
631
  """
538
632
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
539
- :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1orderbook/get
633
+
634
+ https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1orderbook/get
635
+
540
636
  :param str symbol: unified symbol of the market to fetch the order book for
541
637
  :param int [limit]: the maximum amount of order book entries to return
542
638
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -544,7 +640,7 @@ class btcmarkets(Exchange, ImplicitAPI):
544
640
  """
545
641
  self.load_markets()
546
642
  market = self.market(symbol)
547
- request = {
643
+ request: dict = {
548
644
  'marketId': market['id'],
549
645
  }
550
646
  response = self.publicGetMarketsMarketIdOrderbook(self.extend(request, params))
@@ -569,7 +665,7 @@ class btcmarkets(Exchange, ImplicitAPI):
569
665
  orderbook['nonce'] = self.safe_integer(response, 'snapshotId')
570
666
  return orderbook
571
667
 
572
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
668
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
573
669
  #
574
670
  # fetchTicker
575
671
  #
@@ -622,14 +718,16 @@ class btcmarkets(Exchange, ImplicitAPI):
622
718
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
623
719
  """
624
720
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
625
- :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1ticker/get
721
+
722
+ https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1ticker/get
723
+
626
724
  :param str symbol: unified symbol of the market to fetch the ticker for
627
725
  :param dict [params]: extra parameters specific to the exchange API endpoint
628
726
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
629
727
  """
630
728
  self.load_markets()
631
729
  market = self.market(symbol)
632
- request = {
730
+ request: dict = {
633
731
  'marketId': market['id'],
634
732
  }
635
733
  response = self.publicGetMarketsMarketIdTicker(self.extend(request, params))
@@ -653,13 +751,13 @@ class btcmarkets(Exchange, ImplicitAPI):
653
751
  def fetch_ticker_2(self, symbol: str, params={}):
654
752
  self.load_markets()
655
753
  market = self.market(symbol)
656
- request = {
754
+ request: dict = {
657
755
  'id': market['id'],
658
756
  }
659
757
  response = self.publicGetMarketsMarketIdTicker(self.extend(request, params))
660
758
  return self.parse_ticker(response, market)
661
759
 
662
- def parse_trade(self, trade, market: Market = None) -> Trade:
760
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
663
761
  #
664
762
  # public fetchTrades
665
763
  #
@@ -726,7 +824,9 @@ class btcmarkets(Exchange, ImplicitAPI):
726
824
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
727
825
  """
728
826
  get the list of most recent trades for a particular symbol
729
- :see: https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1trades/get
827
+
828
+ https://docs.btcmarkets.net/v3/#tag/Market-Data-APIs/paths/~1v3~1markets~1{marketId}~1trades/get
829
+
730
830
  :param str symbol: unified symbol of the market to fetch trades for
731
831
  :param int [since]: timestamp in ms of the earliest trade to fetch
732
832
  :param int [limit]: the maximum amount of trades to fetch
@@ -735,7 +835,7 @@ class btcmarkets(Exchange, ImplicitAPI):
735
835
  """
736
836
  self.load_markets()
737
837
  market = self.market(symbol)
738
- request = {
838
+ request: dict = {
739
839
  # 'since': 59868345231,
740
840
  'marketId': market['id'],
741
841
  }
@@ -752,18 +852,21 @@ class btcmarkets(Exchange, ImplicitAPI):
752
852
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
753
853
  """
754
854
  create a trade order
755
- :see: https://docs.btcmarkets.net/v3/#tag/Order-Placement-APIs/paths/~1v3~1orders/post
855
+
856
+ https://docs.btcmarkets.net/v3/#tag/Order-Placement-APIs/paths/~1v3~1orders/post
857
+
756
858
  :param str symbol: unified symbol of the market to create an order in
757
859
  :param str type: 'market' or 'limit'
758
860
  :param str side: 'buy' or 'sell'
759
861
  :param float amount: how much of currency you want to trade in units of base currency
760
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
862
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
761
863
  :param dict [params]: extra parameters specific to the exchange API endpoint
864
+ :param float [params.triggerPrice]: the price at which a trigger order is triggered at
762
865
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
763
866
  """
764
867
  self.load_markets()
765
868
  market = self.market(symbol)
766
- request = {
869
+ request: dict = {
767
870
  'marketId': market['id'],
768
871
  # 'price': self.price_to_precision(symbol, price),
769
872
  'amount': self.amount_to_precision(symbol, amount),
@@ -840,7 +943,9 @@ class btcmarkets(Exchange, ImplicitAPI):
840
943
  def cancel_orders(self, ids, symbol: Str = None, params={}):
841
944
  """
842
945
  cancel multiple orders
843
- :see: https://docs.btcmarkets.net/v3/#tag/Batch-Order-APIs/paths/~1v3~1batchorders~1{ids}/delete
946
+
947
+ https://docs.btcmarkets.net/v3/#tag/Batch-Order-APIs/paths/~1v3~1batchorders~1{ids}/delete
948
+
844
949
  :param str[] ids: order ids
845
950
  :param str symbol: not used by btcmarkets cancelOrders()
846
951
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -849,31 +954,64 @@ class btcmarkets(Exchange, ImplicitAPI):
849
954
  self.load_markets()
850
955
  for i in range(0, len(ids)):
851
956
  ids[i] = int(ids[i])
852
- request = {
957
+ request: dict = {
853
958
  'ids': ids,
854
959
  }
855
- return self.privateDeleteBatchordersIds(self.extend(request, params))
960
+ response = self.privateDeleteBatchordersIds(self.extend(request, params))
961
+ #
962
+ # {
963
+ # "cancelOrders": [
964
+ # {
965
+ # "orderId": "414186",
966
+ # "clientOrderId": "6"
967
+ # },
968
+ # ...
969
+ # ],
970
+ # "unprocessedRequests": [
971
+ # {
972
+ # "code": "OrderAlreadyCancelled",
973
+ # "message": "order is already cancelled.",
974
+ # "requestId": "1"
975
+ # }
976
+ # ]
977
+ # }
978
+ #
979
+ cancelOrders = self.safe_list(response, 'cancelOrders', [])
980
+ unprocessedRequests = self.safe_list(response, 'unprocessedRequests', [])
981
+ orders = self.array_concat(cancelOrders, unprocessedRequests)
982
+ return self.parse_orders(orders)
856
983
 
857
984
  def cancel_order(self, id: str, symbol: Str = None, params={}):
858
985
  """
859
986
  cancels an open order
860
- :see: https://docs.btcmarkets.net/v3/#operation/cancelOrder
987
+
988
+ https://docs.btcmarkets.net/v3/#operation/cancelOrder
989
+
861
990
  :param str id: order id
862
991
  :param str symbol: not used by btcmarket cancelOrder()
863
992
  :param dict [params]: extra parameters specific to the exchange API endpoint
864
993
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
865
994
  """
866
995
  self.load_markets()
867
- request = {
996
+ request: dict = {
868
997
  'id': id,
869
998
  }
870
- return self.privateDeleteOrdersId(self.extend(request, params))
999
+ response = self.privateDeleteOrdersId(self.extend(request, params))
1000
+ #
1001
+ # {
1002
+ # "orderId": "7524",
1003
+ # "clientOrderId": "123-456"
1004
+ # }
1005
+ #
1006
+ return self.parse_order(response)
871
1007
 
872
1008
  def calculate_fee(self, symbol, type, side, amount, price, takerOrMaker='taker', params={}):
873
1009
  """
874
1010
  calculates the presumptive fee that would be charged for an order
875
1011
  :param str symbol: unified market symbol
876
- :param str type: not used by btcmarkets.calculate_fee :param string side: not used by btcmarkets.calculate_fee :param float amount: how much you want to trade, in units of the base currency on most exchanges, or number of contracts
1012
+ :param str type: not used by btcmarkets.calculateFee
1013
+ :param str side: not used by btcmarkets.calculateFee
1014
+ :param float amount: how much you want to trade, in units of the base currency on most exchanges, or number of contracts
877
1015
  :param float price: the price for the order to be filled at, in units of the quote currency
878
1016
  :param str takerOrMaker: 'taker' or 'maker'
879
1017
  :param dict params:
@@ -900,8 +1038,8 @@ class btcmarkets(Exchange, ImplicitAPI):
900
1038
  'cost': float(self.fee_to_precision(symbol, rateCost)),
901
1039
  }
902
1040
 
903
- def parse_order_status(self, status):
904
- statuses = {
1041
+ def parse_order_status(self, status: Str):
1042
+ statuses: dict = {
905
1043
  'Accepted': 'open',
906
1044
  'Placed': 'open',
907
1045
  'Partially Matched': 'open',
@@ -912,7 +1050,7 @@ class btcmarkets(Exchange, ImplicitAPI):
912
1050
  }
913
1051
  return self.safe_string(statuses, status, status)
914
1052
 
915
- def parse_order(self, order, market: Market = None) -> Order:
1053
+ def parse_order(self, order: dict, market: Market = None) -> Order:
916
1054
  #
917
1055
  # createOrder
918
1056
  #
@@ -950,8 +1088,7 @@ class btcmarkets(Exchange, ImplicitAPI):
950
1088
  id = self.safe_string(order, 'orderId')
951
1089
  clientOrderId = self.safe_string(order, 'clientOrderId')
952
1090
  timeInForce = self.safe_string(order, 'timeInForce')
953
- stopPrice = self.safe_number(order, 'triggerPrice')
954
- postOnly = self.safe_value(order, 'postOnly')
1091
+ postOnly = self.safe_bool(order, 'postOnly')
955
1092
  return self.safe_order({
956
1093
  'info': order,
957
1094
  'id': id,
@@ -965,8 +1102,7 @@ class btcmarkets(Exchange, ImplicitAPI):
965
1102
  'postOnly': postOnly,
966
1103
  'side': side,
967
1104
  'price': price,
968
- 'stopPrice': stopPrice,
969
- 'triggerPrice': stopPrice,
1105
+ 'triggerPrice': self.safe_number(order, 'triggerPrice'),
970
1106
  'cost': None,
971
1107
  'amount': amount,
972
1108
  'filled': None,
@@ -980,13 +1116,16 @@ class btcmarkets(Exchange, ImplicitAPI):
980
1116
  def fetch_order(self, id: str, symbol: Str = None, params={}):
981
1117
  """
982
1118
  fetches information on an order made by the user
983
- :see: https://docs.btcmarkets.net/v3/#operation/getOrderById
1119
+
1120
+ https://docs.btcmarkets.net/v3/#operation/getOrderById
1121
+
1122
+ :param str id: the order id
984
1123
  :param str symbol: not used by btcmarkets fetchOrder
985
1124
  :param dict [params]: extra parameters specific to the exchange API endpoint
986
1125
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
987
1126
  """
988
1127
  self.load_markets()
989
- request = {
1128
+ request: dict = {
990
1129
  'id': id,
991
1130
  }
992
1131
  response = self.privateGetOrdersId(self.extend(request, params))
@@ -995,7 +1134,9 @@ class btcmarkets(Exchange, ImplicitAPI):
995
1134
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
996
1135
  """
997
1136
  fetches information on multiple orders made by the user
998
- :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1137
+
1138
+ https://docs.btcmarkets.net/v3/#operation/listOrders
1139
+
999
1140
  :param str symbol: unified market symbol of the market orders were made in
1000
1141
  :param int [since]: the earliest time in ms to fetch orders for
1001
1142
  :param int [limit]: the maximum number of order structures to retrieve
@@ -1003,7 +1144,7 @@ class btcmarkets(Exchange, ImplicitAPI):
1003
1144
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1004
1145
  """
1005
1146
  self.load_markets()
1006
- request = {
1147
+ request: dict = {
1007
1148
  'status': 'all',
1008
1149
  }
1009
1150
  market = None
@@ -1020,20 +1161,24 @@ class btcmarkets(Exchange, ImplicitAPI):
1020
1161
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1021
1162
  """
1022
1163
  fetch all unfilled currently open orders
1023
- :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1164
+
1165
+ https://docs.btcmarkets.net/v3/#operation/listOrders
1166
+
1024
1167
  :param str symbol: unified market symbol
1025
1168
  :param int [since]: the earliest time in ms to fetch open orders for
1026
1169
  :param int [limit]: the maximum number of open orders structures to retrieve
1027
1170
  :param dict [params]: extra parameters specific to the exchange API endpoint
1028
1171
  :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1029
1172
  """
1030
- request = {'status': 'open'}
1173
+ request: dict = {'status': 'open'}
1031
1174
  return self.fetch_orders(symbol, since, limit, self.extend(request, params))
1032
1175
 
1033
1176
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1034
1177
  """
1035
1178
  fetches information on multiple closed orders made by the user
1036
- :see: https://docs.btcmarkets.net/v3/#operation/listOrders
1179
+
1180
+ https://docs.btcmarkets.net/v3/#operation/listOrders
1181
+
1037
1182
  :param str symbol: unified market symbol of the market orders were made in
1038
1183
  :param int [since]: the earliest time in ms to fetch orders for
1039
1184
  :param int [limit]: the maximum number of order structures to retrieve
@@ -1046,7 +1191,9 @@ class btcmarkets(Exchange, ImplicitAPI):
1046
1191
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1047
1192
  """
1048
1193
  fetch all trades made by the user
1049
- :see: https://docs.btcmarkets.net/v3/#operation/getTrades
1194
+
1195
+ https://docs.btcmarkets.net/v3/#operation/getTrades
1196
+
1050
1197
  :param str symbol: unified market symbol
1051
1198
  :param int [since]: the earliest time in ms to fetch trades for
1052
1199
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1054,7 +1201,7 @@ class btcmarkets(Exchange, ImplicitAPI):
1054
1201
  :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1055
1202
  """
1056
1203
  self.load_markets()
1057
- request = {}
1204
+ request: dict = {}
1058
1205
  market = None
1059
1206
  if symbol is not None:
1060
1207
  market = self.market(symbol)
@@ -1093,10 +1240,12 @@ class btcmarkets(Exchange, ImplicitAPI):
1093
1240
  #
1094
1241
  return self.parse_trades(response, market, since, limit)
1095
1242
 
1096
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1243
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
1097
1244
  """
1098
1245
  make a withdrawal
1099
- :see: https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/post
1246
+
1247
+ https://docs.btcmarkets.net/v3/#tag/Fund-Management-APIs/paths/~1v3~1withdrawals/post
1248
+
1100
1249
  :param str code: unified currency code
1101
1250
  :param float amount: the amount to withdraw
1102
1251
  :param str address: the address to withdraw to
@@ -1107,7 +1256,7 @@ class btcmarkets(Exchange, ImplicitAPI):
1107
1256
  tag, params = self.handle_withdraw_tag_and_params(tag, params)
1108
1257
  self.load_markets()
1109
1258
  currency = self.currency(code)
1110
- request = {
1259
+ request: dict = {
1111
1260
  'currency_id': currency['id'],
1112
1261
  'amount': self.currency_to_precision(code, amount),
1113
1262
  }
@@ -1167,21 +1316,19 @@ class btcmarkets(Exchange, ImplicitAPI):
1167
1316
  url = self.urls['api'][api] + request
1168
1317
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1169
1318
 
1170
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
1319
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1171
1320
  if response is None:
1172
1321
  return None # fallback to default error handler
1173
- if 'success' in response:
1174
- if not response['success']:
1175
- error = self.safe_string(response, 'errorCode')
1176
- feedback = self.id + ' ' + body
1177
- self.throw_exactly_matched_exception(self.exceptions, error, feedback)
1178
- raise ExchangeError(feedback)
1179
- # v3 api errors
1180
- if code >= 400:
1181
- errorCode = self.safe_string(response, 'code')
1182
- message = self.safe_string(response, 'message')
1322
+ #
1323
+ # {"code":"UnAuthorized","message":"invalid access token"}
1324
+ # {"code":"MarketNotFound","message":"invalid marketId"}
1325
+ #
1326
+ errorCode = self.safe_string(response, 'code')
1327
+ message = self.safe_string(response, 'message')
1328
+ if errorCode is not None:
1183
1329
  feedback = self.id + ' ' + body
1184
- self.throw_exactly_matched_exception(self.exceptions, errorCode, feedback)
1185
- self.throw_exactly_matched_exception(self.exceptions, message, feedback)
1186
- raise ExchangeError(feedback)
1330
+ self.throw_exactly_matched_exception(self.exceptions['exact'], message, feedback)
1331
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
1332
+ self.throw_broadly_matched_exception(self.exceptions['broad'], message, feedback)
1333
+ raise ExchangeError(feedback) # unknown message
1187
1334
  return None