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/indodax.py CHANGED
@@ -7,16 +7,17 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.indodax import ImplicitAPI
8
8
  import hashlib
9
9
  import math
10
- from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
10
+ from ccxt.base.types import Balances, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
+ from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import ArgumentsRequired
14
15
  from ccxt.base.errors import BadSymbol
15
16
  from ccxt.base.errors import InsufficientFunds
16
17
  from ccxt.base.errors import InvalidOrder
17
18
  from ccxt.base.errors import OrderNotFound
18
- from ccxt.base.errors import AuthenticationError
19
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
20
+ from ccxt.base.precise import Precise
20
21
 
21
22
 
22
23
  class indodax(Exchange, ImplicitAPI):
@@ -28,7 +29,7 @@ class indodax(Exchange, ImplicitAPI):
28
29
  'countries': ['ID'], # Indonesia
29
30
  # 10 requests per second for making trades => 1000ms / 10 = 100ms
30
31
  # 180 requests per minute(public endpoints) = 2 requests per second => cost = (1000ms / rateLimit) / 2 = 5
31
- 'rateLimit': 100,
32
+ 'rateLimit': 50,
32
33
  'has': {
33
34
  'CORS': None,
34
35
  'spot': True,
@@ -78,8 +79,11 @@ class indodax(Exchange, ImplicitAPI):
78
79
  'fetchOrderBook': True,
79
80
  'fetchOrders': False,
80
81
  'fetchPosition': False,
82
+ 'fetchPositionHistory': False,
81
83
  'fetchPositionMode': False,
82
84
  'fetchPositions': False,
85
+ 'fetchPositionsForSymbol': False,
86
+ 'fetchPositionsHistory': False,
83
87
  'fetchPositionsRisk': False,
84
88
  'fetchPremiumIndexOHLCV': False,
85
89
  'fetchTicker': True,
@@ -200,6 +204,67 @@ class indodax(Exchange, ImplicitAPI):
200
204
  '1w': '1W',
201
205
  },
202
206
  },
207
+ 'features': {
208
+ 'spot': {
209
+ 'sandbox': False,
210
+ 'createOrder': {
211
+ 'marginMode': False,
212
+ 'triggerPrice': False,
213
+ 'triggerPriceType': None,
214
+ 'triggerDirection': False,
215
+ 'stopLossPrice': False,
216
+ 'takeProfitPrice': False,
217
+ 'attachedStopLossTakeProfit': None,
218
+ 'timeInForce': {
219
+ 'IOC': True, # todo implementation
220
+ 'FOK': False,
221
+ 'PO': False,
222
+ 'GTD': False,
223
+ },
224
+ 'hedged': False,
225
+ 'selfTradePrevention': False,
226
+ 'trailing': False,
227
+ 'leverage': False,
228
+ 'marketBuyByCost': False,
229
+ 'marketBuyRequiresPrice': False,
230
+ 'iceberg': False,
231
+ },
232
+ 'createOrders': None,
233
+ 'fetchMyTrades': None, # todo implement
234
+ 'fetchOrder': {
235
+ 'marginMode': False,
236
+ 'trigger': False,
237
+ 'trailing': False,
238
+ },
239
+ 'fetchOpenOrders': {
240
+ 'marginMode': False,
241
+ 'limit': None,
242
+ 'trigger': False,
243
+ 'trailing': False,
244
+ },
245
+ 'fetchOrders': None,
246
+ 'fetchClosedOrders': {
247
+ 'marginMode': False,
248
+ 'limit': 1000,
249
+ 'daysBack': 100000, # todo
250
+ 'daysBackCanceled': 1,
251
+ 'untilDays': None,
252
+ 'trigger': False,
253
+ 'trailing': False,
254
+ },
255
+ 'fetchOHLCV': {
256
+ 'limit': 2000, # todo: not in request
257
+ },
258
+ },
259
+ 'swap': {
260
+ 'linear': None,
261
+ 'inverse': None,
262
+ },
263
+ 'future': {
264
+ 'linear': None,
265
+ 'inverse': None,
266
+ },
267
+ },
203
268
  'commonCurrencies': {
204
269
  'STR': 'XLM',
205
270
  'BCHABC': 'BCH',
@@ -216,7 +281,9 @@ class indodax(Exchange, ImplicitAPI):
216
281
  def fetch_time(self, params={}):
217
282
  """
218
283
  fetches the current integer timestamp in milliseconds from the exchange server
219
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#server-time
284
+
285
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#server-time
286
+
220
287
  :param dict [params]: extra parameters specific to the exchange API endpoint
221
288
  :returns int: the current integer timestamp in milliseconds from the exchange server
222
289
  """
@@ -229,10 +296,12 @@ class indodax(Exchange, ImplicitAPI):
229
296
  #
230
297
  return self.safe_integer(response, 'server_time')
231
298
 
232
- def fetch_markets(self, params={}):
299
+ def fetch_markets(self, params={}) -> List[Market]:
233
300
  """
234
301
  retrieves data on all markets for indodax
235
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#pairs
302
+
303
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#pairs
304
+
236
305
  :param dict [params]: extra parameters specific to the exchange API endpoint
237
306
  :returns dict[]: an array of objects representing market data
238
307
  """
@@ -331,7 +400,7 @@ class indodax(Exchange, ImplicitAPI):
331
400
  free = self.safe_value(balances, 'balance', {})
332
401
  used = self.safe_value(balances, 'balance_hold', {})
333
402
  timestamp = self.safe_timestamp(balances, 'server_time')
334
- result = {
403
+ result: dict = {
335
404
  'info': response,
336
405
  'timestamp': timestamp,
337
406
  'datetime': self.iso8601(timestamp),
@@ -349,7 +418,9 @@ class indodax(Exchange, ImplicitAPI):
349
418
  def fetch_balance(self, params={}) -> Balances:
350
419
  """
351
420
  query for balance and get the amount of funds available for trading or funds locked in orders
352
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-info-endpoint
421
+
422
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-info-endpoint
423
+
353
424
  :param dict [params]: extra parameters specific to the exchange API endpoint
354
425
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
355
426
  """
@@ -390,7 +461,9 @@ class indodax(Exchange, ImplicitAPI):
390
461
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
391
462
  """
392
463
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
393
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#depth
464
+
465
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#depth
466
+
394
467
  :param str symbol: unified symbol of the market to fetch the order book for
395
468
  :param int [limit]: the maximum amount of order book entries to return
396
469
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -398,13 +471,13 @@ class indodax(Exchange, ImplicitAPI):
398
471
  """
399
472
  self.load_markets()
400
473
  market = self.market(symbol)
401
- request = {
474
+ request: dict = {
402
475
  'pair': market['base'] + market['quote'],
403
476
  }
404
477
  orderbook = self.publicGetApiDepthPair(self.extend(request, params))
405
478
  return self.parse_order_book(orderbook, market['symbol'], None, 'buy', 'sell')
406
479
 
407
- def parse_ticker(self, ticker, market: Market = None) -> Ticker:
480
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
408
481
  #
409
482
  # {
410
483
  # "high":"0.01951",
@@ -448,14 +521,16 @@ class indodax(Exchange, ImplicitAPI):
448
521
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
449
522
  """
450
523
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
451
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker
524
+
525
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker
526
+
452
527
  :param str symbol: unified symbol of the market to fetch the ticker for
453
528
  :param dict [params]: extra parameters specific to the exchange API endpoint
454
529
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
455
530
  """
456
531
  self.load_markets()
457
532
  market = self.market(symbol)
458
- request = {
533
+ request: dict = {
459
534
  'pair': market['base'] + market['quote'],
460
535
  }
461
536
  response = self.publicGetApiTickerPair(self.extend(request, params))
@@ -473,13 +548,15 @@ class indodax(Exchange, ImplicitAPI):
473
548
  # }
474
549
  # }
475
550
  #
476
- ticker = self.safe_value(response, 'ticker', {})
551
+ ticker = self.safe_dict(response, 'ticker', {})
477
552
  return self.parse_ticker(ticker, market)
478
553
 
479
554
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
480
555
  """
481
556
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
482
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker-all
557
+
558
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#ticker-all
559
+
483
560
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
484
561
  :param dict [params]: extra parameters specific to the exchange API endpoint
485
562
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -502,10 +579,10 @@ class indodax(Exchange, ImplicitAPI):
502
579
  # }
503
580
  #
504
581
  response = self.publicGetApiTickerAll(params)
505
- tickers = self.safe_value(response, 'tickers')
582
+ tickers = self.safe_dict(response, 'tickers', {})
506
583
  return self.parse_tickers(tickers, symbols)
507
584
 
508
- def parse_trade(self, trade, market: Market = None) -> Trade:
585
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
509
586
  timestamp = self.safe_timestamp(trade, 'date')
510
587
  return self.safe_trade({
511
588
  'id': self.safe_string(trade, 'tid'),
@@ -526,7 +603,9 @@ class indodax(Exchange, ImplicitAPI):
526
603
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
527
604
  """
528
605
  get the list of most recent trades for a particular symbol
529
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#trades
606
+
607
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Public-RestAPI.md#trades
608
+
530
609
  :param str symbol: unified symbol of the market to fetch trades for
531
610
  :param int [since]: timestamp in ms of the earliest trade to fetch
532
611
  :param int [limit]: the maximum amount of trades to fetch
@@ -535,7 +614,7 @@ class indodax(Exchange, ImplicitAPI):
535
614
  """
536
615
  self.load_markets()
537
616
  market = self.market(symbol)
538
- request = {
617
+ request: dict = {
539
618
  'pair': market['base'] + market['quote'],
540
619
  }
541
620
  response = self.publicGetApiTradesPair(self.extend(request, params))
@@ -577,9 +656,9 @@ class indodax(Exchange, ImplicitAPI):
577
656
  timeframes = self.options['timeframes']
578
657
  selectedTimeframe = self.safe_string(timeframes, timeframe, timeframe)
579
658
  now = self.seconds()
580
- until = self.safe_integer_2(params, 'until', 'till', now)
581
- params = self.omit(params, ['until', 'till'])
582
- request = {
659
+ until = self.safe_integer(params, 'until', now)
660
+ params = self.omit(params, ['until'])
661
+ request: dict = {
583
662
  'to': until,
584
663
  'tf': selectedTimeframe,
585
664
  'symbol': market['base'] + market['quote'],
@@ -606,15 +685,15 @@ class indodax(Exchange, ImplicitAPI):
606
685
  #
607
686
  return self.parse_ohlcvs(response, market, timeframe, since, limit)
608
687
 
609
- def parse_order_status(self, status):
610
- statuses = {
688
+ def parse_order_status(self, status: Str):
689
+ statuses: dict = {
611
690
  'open': 'open',
612
691
  'filled': 'closed',
613
692
  'cancelled': 'canceled',
614
693
  }
615
694
  return self.safe_string(statuses, status, status)
616
695
 
617
- def parse_order(self, order, market: Market = None) -> Order:
696
+ def parse_order(self, order: dict, market: Market = None) -> Order:
618
697
  #
619
698
  # {
620
699
  # "order_id": "12345",
@@ -638,6 +717,24 @@ class indodax(Exchange, ImplicitAPI):
638
717
  # "order_xrp": "30.45000000",
639
718
  # "remain_xrp": "0.00000000"
640
719
  # }
720
+ #
721
+ # cancelOrder
722
+ #
723
+ # {
724
+ # "order_id": 666883,
725
+ # "client_order_id": "clientx-sj82ks82j",
726
+ # "type": "sell",
727
+ # "pair": "btc_idr",
728
+ # "balance": {
729
+ # "idr": "33605800",
730
+ # "btc": "0.00000000",
731
+ # ...
732
+ # "frozen_idr": "0",
733
+ # "frozen_btc": "0.00000000",
734
+ # ...
735
+ # }
736
+ # }
737
+ #
641
738
  side = None
642
739
  if 'type' in order:
643
740
  side = order['type']
@@ -647,6 +744,8 @@ class indodax(Exchange, ImplicitAPI):
647
744
  price = self.safe_string(order, 'price')
648
745
  amount = None
649
746
  remaining = None
747
+ marketId = self.safe_string(order, 'pair')
748
+ market = self.safe_market(marketId, market)
650
749
  if market is not None:
651
750
  symbol = market['symbol']
652
751
  quoteId = market['quoteId']
@@ -665,7 +764,7 @@ class indodax(Exchange, ImplicitAPI):
665
764
  return self.safe_order({
666
765
  'info': order,
667
766
  'id': id,
668
- 'clientOrderId': None,
767
+ 'clientOrderId': self.safe_string(order, 'client_order_id'),
669
768
  'timestamp': timestamp,
670
769
  'datetime': self.iso8601(timestamp),
671
770
  'lastTradeTimestamp': None,
@@ -675,7 +774,6 @@ class indodax(Exchange, ImplicitAPI):
675
774
  'postOnly': None,
676
775
  'side': side,
677
776
  'price': price,
678
- 'stopPrice': None,
679
777
  'triggerPrice': None,
680
778
  'cost': cost,
681
779
  'average': None,
@@ -690,7 +788,10 @@ class indodax(Exchange, ImplicitAPI):
690
788
  def fetch_order(self, id: str, symbol: Str = None, params={}):
691
789
  """
692
790
  fetches information on an order made by the user
693
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-order-endpoints
791
+
792
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#get-order-endpoints
793
+
794
+ :param str id: order id
694
795
  :param str symbol: unified symbol of the market the order was made in
695
796
  :param dict [params]: extra parameters specific to the exchange API endpoint
696
797
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -699,7 +800,7 @@ class indodax(Exchange, ImplicitAPI):
699
800
  raise ArgumentsRequired(self.id + ' fetchOrder() requires a symbol argument')
700
801
  self.load_markets()
701
802
  market = self.market(symbol)
702
- request = {
803
+ request: dict = {
703
804
  'pair': market['id'],
704
805
  'order_id': id,
705
806
  }
@@ -712,7 +813,9 @@ class indodax(Exchange, ImplicitAPI):
712
813
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
713
814
  """
714
815
  fetch all unfilled currently open orders
715
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#open-orders-endpoints
816
+
817
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#open-orders-endpoints
818
+
716
819
  :param str symbol: unified market symbol
717
820
  :param int [since]: the earliest time in ms to fetch open orders for
718
821
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -721,7 +824,7 @@ class indodax(Exchange, ImplicitAPI):
721
824
  """
722
825
  self.load_markets()
723
826
  market = None
724
- request = {}
827
+ request: dict = {}
725
828
  if symbol is not None:
726
829
  market = self.market(symbol)
727
830
  request['pair'] = market['id']
@@ -747,7 +850,9 @@ class indodax(Exchange, ImplicitAPI):
747
850
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
748
851
  """
749
852
  fetches information on multiple closed orders made by the user
750
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#order-history
853
+
854
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#order-history
855
+
751
856
  :param str symbol: unified market symbol of the market orders were made in
752
857
  :param int [since]: the earliest time in ms to fetch orders for
753
858
  :param int [limit]: the maximum number of order structures to retrieve
@@ -758,7 +863,7 @@ class indodax(Exchange, ImplicitAPI):
758
863
  raise ArgumentsRequired(self.id + ' fetchClosedOrders() requires a symbol argument')
759
864
  self.load_markets()
760
865
  market = self.market(symbol)
761
- request = {
866
+ request: dict = {
762
867
  'pair': market['id'],
763
868
  }
764
869
  response = self.privatePostOrderHistory(self.extend(request, params))
@@ -769,30 +874,54 @@ class indodax(Exchange, ImplicitAPI):
769
874
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
770
875
  """
771
876
  create a trade order
772
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#trade-endpoints
877
+
878
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#trade-endpoints
879
+
773
880
  :param str symbol: unified symbol of the market to create an order in
774
881
  :param str type: 'market' or 'limit'
775
882
  :param str side: 'buy' or 'sell'
776
883
  :param float amount: how much of currency you want to trade in units of base currency
777
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
884
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
778
885
  :param dict [params]: extra parameters specific to the exchange API endpoint
779
886
  :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
780
887
  """
781
- if type != 'limit':
782
- raise ExchangeError(self.id + ' createOrder() allows limit orders only')
783
888
  self.load_markets()
784
889
  market = self.market(symbol)
785
- request = {
890
+ request: dict = {
786
891
  'pair': market['id'],
787
892
  'type': side,
788
893
  'price': price,
789
894
  }
790
- currency = market['baseId']
791
- if side == 'buy':
792
- request[market['quoteId']] = amount * price
793
- else:
794
- request[market['baseId']] = amount
795
- request[currency] = amount
895
+ priceIsRequired = False
896
+ quantityIsRequired = False
897
+ if type == 'market':
898
+ if side == 'buy':
899
+ quoteAmount = None
900
+ cost = self.safe_number(params, 'cost')
901
+ params = self.omit(params, 'cost')
902
+ if cost is not None:
903
+ quoteAmount = self.cost_to_precision(symbol, cost)
904
+ else:
905
+ if price is None:
906
+ raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price).')
907
+ amountString = self.number_to_string(amount)
908
+ priceString = self.number_to_string(price)
909
+ costRequest = Precise.string_mul(amountString, priceString)
910
+ quoteAmount = self.cost_to_precision(symbol, costRequest)
911
+ request[market['quoteId']] = quoteAmount
912
+ else:
913
+ quantityIsRequired = True
914
+ elif type == 'limit':
915
+ priceIsRequired = True
916
+ quantityIsRequired = True
917
+ if side == 'buy':
918
+ request[market['quoteId']] = self.parse_to_numeric(Precise.string_mul(self.number_to_string(amount), self.number_to_string(price)))
919
+ if priceIsRequired:
920
+ if price is None:
921
+ raise InvalidOrder(self.id + ' createOrder() requires a price argument for a ' + type + ' order')
922
+ request['price'] = price
923
+ if quantityIsRequired:
924
+ request[market['baseId']] = self.amount_to_precision(symbol, amount)
796
925
  result = self.privatePostTrade(self.extend(request, params))
797
926
  data = self.safe_value(result, 'return', {})
798
927
  id = self.safe_string(data, 'order_id')
@@ -804,7 +933,9 @@ class indodax(Exchange, ImplicitAPI):
804
933
  def cancel_order(self, id: str, symbol: Str = None, params={}):
805
934
  """
806
935
  cancels an open order
807
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#cancel-order-endpoints
936
+
937
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#cancel-order-endpoints
938
+
808
939
  :param str id: order id
809
940
  :param str symbol: unified symbol of the market the order was made in
810
941
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -817,24 +948,47 @@ class indodax(Exchange, ImplicitAPI):
817
948
  raise ArgumentsRequired(self.id + ' cancelOrder() requires an extra "side" param')
818
949
  self.load_markets()
819
950
  market = self.market(symbol)
820
- request = {
951
+ request: dict = {
821
952
  'order_id': id,
822
953
  'pair': market['id'],
823
954
  'type': side,
824
955
  }
825
- return self.privatePostCancelOrder(self.extend(request, params))
956
+ response = self.privatePostCancelOrder(self.extend(request, params))
957
+ #
958
+ # {
959
+ # "success": 1,
960
+ # "return": {
961
+ # "order_id": 666883,
962
+ # "client_order_id": "clientx-sj82ks82j",
963
+ # "type": "sell",
964
+ # "pair": "btc_idr",
965
+ # "balance": {
966
+ # "idr": "33605800",
967
+ # "btc": "0.00000000",
968
+ # ...
969
+ # "frozen_idr": "0",
970
+ # "frozen_btc": "0.00000000",
971
+ # ...
972
+ # }
973
+ # }
974
+ # }
975
+ #
976
+ data = self.safe_dict(response, 'return')
977
+ return self.parse_order(data)
826
978
 
827
979
  def fetch_transaction_fee(self, code: str, params={}):
828
980
  """
829
981
  fetch the fee for a transaction
830
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-fee-endpoints
982
+
983
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-fee-endpoints
984
+
831
985
  :param str code: unified currency code
832
986
  :param dict [params]: extra parameters specific to the exchange API endpoint
833
987
  :returns dict: a `fee structure <https://docs.ccxt.com/#/?id=fee-structure>`
834
988
  """
835
989
  self.load_markets()
836
990
  currency = self.currency(code)
837
- request = {
991
+ request: dict = {
838
992
  'currency': currency['id'],
839
993
  }
840
994
  response = self.privatePostWithdrawFee(self.extend(request, params))
@@ -859,7 +1013,9 @@ class indodax(Exchange, ImplicitAPI):
859
1013
  def fetch_deposits_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
860
1014
  """
861
1015
  fetch history of deposits and withdrawals
862
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#transaction-history-endpoints
1016
+
1017
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#transaction-history-endpoints
1018
+
863
1019
  :param str [code]: unified currency code for the currency of the deposit/withdrawals, default is None
864
1020
  :param int [since]: timestamp in ms of the earliest deposit/withdrawal, default is None
865
1021
  :param int [limit]: max number of deposit/withdrawals to return, default is None
@@ -867,7 +1023,7 @@ class indodax(Exchange, ImplicitAPI):
867
1023
  :returns dict: a list of `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
868
1024
  """
869
1025
  self.load_markets()
870
- request = {}
1026
+ request: dict = {}
871
1027
  if since is not None:
872
1028
  startTime = self.iso8601(since)[0:10]
873
1029
  request['start'] = startTime
@@ -951,10 +1107,12 @@ class indodax(Exchange, ImplicitAPI):
951
1107
  transactions = self.array_concat(withdraws, deposits)
952
1108
  return self.parse_transactions(transactions, currency, since, limit)
953
1109
 
954
- def withdraw(self, code: str, amount: float, address, tag=None, params={}):
1110
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
955
1111
  """
956
1112
  make a withdrawal
957
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-coin-endpoints
1113
+
1114
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#withdraw-coin-endpoints
1115
+
958
1116
  :param str code: unified currency code
959
1117
  :param float amount: the amount to withdraw
960
1118
  :param str address: the address to withdraw to
@@ -973,7 +1131,7 @@ class indodax(Exchange, ImplicitAPI):
973
1131
  requestId = self.milliseconds()
974
1132
  # Alternatively:
975
1133
  # requestId = self.uuid()
976
- request = {
1134
+ request: dict = {
977
1135
  'currency': currency['id'],
978
1136
  'withdraw_amount': amount,
979
1137
  'withdraw_address': address,
@@ -999,7 +1157,7 @@ class indodax(Exchange, ImplicitAPI):
999
1157
  #
1000
1158
  return self.parse_transaction(response, currency)
1001
1159
 
1002
- def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
1160
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1003
1161
  #
1004
1162
  # withdraw
1005
1163
  #
@@ -1075,16 +1233,18 @@ class indodax(Exchange, ImplicitAPI):
1075
1233
  'info': transaction,
1076
1234
  }
1077
1235
 
1078
- def parse_transaction_status(self, status):
1079
- statuses = {
1236
+ def parse_transaction_status(self, status: Str):
1237
+ statuses: dict = {
1080
1238
  'success': 'ok',
1081
1239
  }
1082
1240
  return self.safe_string(statuses, status, status)
1083
1241
 
1084
- def fetch_deposit_addresses(self, codes: List[str] = None, params={}):
1242
+ def fetch_deposit_addresses(self, codes: Strings = None, params={}) -> List[DepositAddress]:
1085
1243
  """
1086
1244
  fetch deposit addresses for multiple currencies and chain types
1087
- :see: https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#general-information-on-endpoints
1245
+
1246
+ https://github.com/btcid/indodax-official-api-docs/blob/master/Private-RestAPI.md#general-information-on-endpoints
1247
+
1088
1248
  :param str[] [codes]: list of unified currency codes, default is None
1089
1249
  :param dict [params]: extra parameters specific to the exchange API endpoint
1090
1250
  :returns dict: a list of `address structures <https://docs.ccxt.com/#/?id=address-structure>`
@@ -1130,7 +1290,7 @@ class indodax(Exchange, ImplicitAPI):
1130
1290
  addresses = self.safe_dict(data, 'address', {})
1131
1291
  networks = self.safe_dict(data, 'network', {})
1132
1292
  addressKeys = list(addresses.keys())
1133
- result = {
1293
+ result: dict = {
1134
1294
  'info': data,
1135
1295
  }
1136
1296
  for i in range(0, len(addressKeys)):
@@ -1152,8 +1312,8 @@ class indodax(Exchange, ImplicitAPI):
1152
1312
  result[code] = {
1153
1313
  'info': {},
1154
1314
  'currency': code,
1155
- 'address': address,
1156
1315
  'network': network,
1316
+ 'address': address,
1157
1317
  'tag': None,
1158
1318
  }
1159
1319
  return result
@@ -1180,17 +1340,21 @@ class indodax(Exchange, ImplicitAPI):
1180
1340
  }
1181
1341
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1182
1342
 
1183
- def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
1343
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1184
1344
  if response is None:
1185
1345
  return None
1186
1346
  # {success: 0, error: "invalid order."}
1187
1347
  # or
1188
1348
  # [{data, ...}, {...}, ...]
1349
+ # {"success":"1","status":"approved","withdraw_currency":"strm","withdraw_address":"0x2b9A8cd5535D99b419aEfFBF1ae8D90a7eBdb24E","withdraw_amount":"2165.05767839","fee":"21.11000000","amount_after_fee":"2143.94767839","submit_time":"1730759489","withdraw_id":"strm-3423","txid":""}
1189
1350
  if isinstance(response, list):
1190
1351
  return None # public endpoints may return []-arrays
1191
1352
  error = self.safe_value(response, 'error', '')
1192
1353
  if not ('success' in response) and error == '':
1193
1354
  return None # no 'success' property on public responses
1355
+ status = self.safe_string(response, 'success')
1356
+ if status == 'approved':
1357
+ return None
1194
1358
  if self.safe_integer(response, 'success', 0) == 1:
1195
1359
  # {success: 1, return: {orders: []}}
1196
1360
  if not ('return' in response):