ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/hollaex.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.hollaex import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
9
+ from ccxt.base.types import Any, Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, OrderBooks, Trade, TradingFees, Transaction
10
10
  from typing import List
11
11
  from ccxt.base.errors import AuthenticationError
12
12
  from ccxt.base.errors import ArgumentsRequired
@@ -15,13 +15,14 @@ from ccxt.base.errors import InsufficientFunds
15
15
  from ccxt.base.errors import OrderNotFound
16
16
  from ccxt.base.errors import OrderImmediatelyFillable
17
17
  from ccxt.base.errors import NetworkError
18
+ from ccxt.base.errors import InvalidNonce
18
19
  from ccxt.base.decimal_to_precision import TICK_SIZE
19
20
  from ccxt.base.precise import Precise
20
21
 
21
22
 
22
23
  class hollaex(Exchange, ImplicitAPI):
23
24
 
24
- def describe(self):
25
+ def describe(self) -> Any:
25
26
  return self.deep_extend(super(hollaex, self).describe(), {
26
27
  'id': 'hollaex',
27
28
  'name': 'HollaEx',
@@ -59,6 +60,7 @@ class hollaex(Exchange, ImplicitAPI):
59
60
  'fetchCurrencies': True,
60
61
  'fetchDepositAddress': 'emulated',
61
62
  'fetchDepositAddresses': True,
63
+ 'fetchDepositAddressesByNetwork': False,
62
64
  'fetchDeposits': True,
63
65
  'fetchFundingHistory': False,
64
66
  'fetchFundingRate': False,
@@ -173,6 +175,84 @@ class hollaex(Exchange, ImplicitAPI):
173
175
  },
174
176
  },
175
177
  },
178
+ 'features': {
179
+ 'spot': {
180
+ 'sandbox': True,
181
+ 'createOrder': {
182
+ 'marginMode': False,
183
+ 'triggerPrice': True,
184
+ 'triggerPriceType': None,
185
+ 'triggerDirection': False,
186
+ 'stopLossPrice': False, # todo
187
+ 'takeProfitPrice': False, # todo
188
+ 'attachedStopLossTakeProfit': None,
189
+ 'timeInForce': {
190
+ 'IOC': False,
191
+ 'FOK': False,
192
+ 'PO': True,
193
+ 'GTD': False,
194
+ },
195
+ 'hedged': False,
196
+ 'selfTradePrevention': False,
197
+ 'trailing': False,
198
+ 'leverage': False,
199
+ 'marketBuyByCost': False,
200
+ 'marketBuyRequiresPrice': False,
201
+ 'iceberg': False,
202
+ },
203
+ 'createOrders': None,
204
+ 'fetchMyTrades': {
205
+ 'marginMode': False,
206
+ 'limit': 100,
207
+ 'daysBack': 100000,
208
+ 'untilDays': 100000, # todo implement
209
+ 'symbolRequired': False,
210
+ },
211
+ 'fetchOrder': {
212
+ 'marginMode': False,
213
+ 'trigger': False,
214
+ 'trailing': False,
215
+ 'symbolRequired': False,
216
+ },
217
+ 'fetchOpenOrders': {
218
+ 'marginMode': False,
219
+ 'limit': 100,
220
+ 'trigger': False,
221
+ 'trailing': False,
222
+ 'symbolRequired': False,
223
+ },
224
+ 'fetchOrders': {
225
+ 'marginMode': False,
226
+ 'limit': 100,
227
+ 'daysBack': 100000, # todo
228
+ 'untilDays': 100000, # todo
229
+ 'trigger': False,
230
+ 'trailing': False,
231
+ 'symbolRequired': False,
232
+ },
233
+ 'fetchClosedOrders': {
234
+ 'marginMode': False,
235
+ 'limit': 100,
236
+ 'daysBack': 100000, # todo
237
+ 'daysBackCanceled': 1, # todo
238
+ 'untilDays': 100000, # todo
239
+ 'trigger': False,
240
+ 'trailing': False,
241
+ 'symbolRequired': False,
242
+ },
243
+ 'fetchOHLCV': {
244
+ 'limit': 1000, # todo: no limit in request
245
+ },
246
+ },
247
+ 'swap': {
248
+ 'linear': None,
249
+ 'inverse': None,
250
+ },
251
+ 'future': {
252
+ 'linear': None,
253
+ 'inverse': None,
254
+ },
255
+ },
176
256
  'fees': {
177
257
  'trading': {
178
258
  'tierBased': True,
@@ -183,6 +263,7 @@ class hollaex(Exchange, ImplicitAPI):
183
263
  },
184
264
  'exceptions': {
185
265
  'broad': {
266
+ 'API request is expired': InvalidNonce,
186
267
  'Invalid token': AuthenticationError,
187
268
  'Order not found': OrderNotFound,
188
269
  'Insufficient balance': InsufficientFunds,
@@ -213,13 +294,23 @@ class hollaex(Exchange, ImplicitAPI):
213
294
  'BNB': 'bnb',
214
295
  'MATIC': 'matic',
215
296
  },
297
+ 'networksById': {
298
+ 'eth': 'ERC20',
299
+ 'ETH': 'ERC20',
300
+ 'ERC20': 'ERC20',
301
+ 'trx': 'TRC20',
302
+ 'TRX': 'TRC20',
303
+ 'TRC20': 'TRC20',
304
+ },
216
305
  },
217
306
  })
218
307
 
219
308
  def fetch_markets(self, params={}) -> List[Market]:
220
309
  """
221
310
  retrieves data on all markets for hollaex
222
- :see: https://apidocs.hollaex.com/#constants
311
+
312
+ https://apidocs.hollaex.com/#constants
313
+
223
314
  :param dict [params]: extra parameters specific to the exchange API endpoint
224
315
  :returns dict[]: an array of objects representing market data
225
316
  """
@@ -332,72 +423,123 @@ class hollaex(Exchange, ImplicitAPI):
332
423
  def fetch_currencies(self, params={}) -> Currencies:
333
424
  """
334
425
  fetches all available currencies on an exchange
335
- :see: https://apidocs.hollaex.com/#constants
426
+
427
+ https://apidocs.hollaex.com/#constants
428
+
336
429
  :param dict [params]: extra parameters specific to the exchange API endpoint
337
430
  :returns dict: an associative dictionary of currencies
338
431
  """
339
432
  response = self.publicGetConstants(params)
340
433
  #
341
- # {
342
- # "coins":{
343
- # "bch":{
344
- # "id":4,
345
- # "fullname":"Bitcoin Cash",
346
- # "symbol":"bch",
347
- # "active":true,
348
- # "verified":true,
349
- # "allow_deposit":true,
350
- # "allow_withdrawal":true,
351
- # "withdrawal_fee":0.0001,
352
- # "min":0.001,
353
- # "max":100000,
354
- # "increment_unit":0.001,
355
- # "logo":"https://bitholla.s3.ap-northeast-2.amazonaws.com/icon/BCH-hollaex-asset-01.svg",
356
- # "code":"bch",
357
- # "is_public":true,
358
- # "meta":{},
359
- # "estimated_price":null,
360
- # "description":null,
361
- # "type":"blockchain",
362
- # "network":null,
363
- # "standard":null,
364
- # "issuer":"HollaEx",
365
- # "withdrawal_fees":null,
366
- # "created_at":"2019-08-09T10:45:43.367Z",
367
- # "updated_at":"2021-12-13T03:08:32.372Z",
368
- # "created_by":1,
369
- # "owner_id":1
370
- # },
434
+ # {
435
+ # "coins": {
436
+ # "usdt": {
437
+ # "id": "6",
438
+ # "fullname": "USD Tether",
439
+ # "symbol": "usdt",
440
+ # "active": True,
441
+ # "verified": True,
442
+ # "allow_deposit": True,
443
+ # "allow_withdrawal": True,
444
+ # "withdrawal_fee": "20",
445
+ # "min": "1",
446
+ # "max": "10000000",
447
+ # "increment_unit": "0.0001",
448
+ # "logo": "https://hollaex-resources.s3.ap-southeast-1.amazonaws.com/icons/usdt.svg",
449
+ # "code": "usdt",
450
+ # "is_public": True,
451
+ # "meta": {
452
+ # "color": "#27a17a",
453
+ # "website": "https://tether.to",
454
+ # "explorer": "https://blockchair.com/tether",
455
+ # "decimal_points": "6"
456
+ # },
457
+ # "estimated_price": "1",
458
+ # "description": "<p>Tether(USDT) is a stablecoin pegged 1:1 to the US dollar. It is a digital currency that aims to maintain its value while allowing for fast and secure transfer of funds. It was the first stablecoin, and is the most widely used due stablecoin due to its stability and low volatility compared to other cryptocurrencies. It was launched in 2014 by Tether Limited.</p>",
459
+ # "type": "blockchain",
460
+ # "network": "eth,trx,bnb,matic",
461
+ # "standard": "",
462
+ # "issuer": "HollaEx",
463
+ # "withdrawal_fees": {
464
+ # "bnb": {
465
+ # "value": "0.8",
466
+ # "active": True,
467
+ # "symbol": "usdt"
468
+ # },
469
+ # "eth": {
470
+ # "value": "1.5",
471
+ # "active": True,
472
+ # "symbol": "usdt"
473
+ # },
474
+ # "trx": {
475
+ # "value": "4",
476
+ # "active": True,
477
+ # "symbol": "usdt"
478
+ # },
479
+ # "matic": {
480
+ # "value": "0.3",
481
+ # "active": True,
482
+ # "symbol": "usdt"
483
+ # }
484
+ # },
485
+ # "display_name": null,
486
+ # "deposit_fees": null,
487
+ # "is_risky": False,
488
+ # "market_cap": "144568098696.29",
489
+ # "category": "stable",
490
+ # "created_at": "2019-08-09T10:45:43.367Z",
491
+ # "updated_at": "2025-03-25T17:12:37.970Z",
492
+ # "created_by": "168",
493
+ # "owner_id": "1"
494
+ # },
371
495
  # },
372
496
  # "network":"https://api.hollaex.network"
373
497
  # }
374
498
  #
375
- coins = self.safe_value(response, 'coins', {})
499
+ coins = self.safe_dict(response, 'coins', {})
376
500
  keys = list(coins.keys())
377
501
  result: dict = {}
378
502
  for i in range(0, len(keys)):
379
503
  key = keys[i]
380
504
  currency = coins[key]
381
505
  id = self.safe_string(currency, 'symbol')
382
- numericId = self.safe_integer(currency, 'id')
383
506
  code = self.safe_currency_code(id)
384
- name = self.safe_string(currency, 'fullname')
385
- depositEnabled = self.safe_value(currency, 'allow_deposit')
386
- withdrawEnabled = self.safe_value(currency, 'allow_withdrawal')
387
- isActive = self.safe_value(currency, 'active')
388
- active = isActive and depositEnabled and withdrawEnabled
389
- fee = self.safe_number(currency, 'withdrawal_fee')
390
- withdrawalLimits = self.safe_value(currency, 'withdrawal_limits', [])
391
- result[code] = {
507
+ withdrawalLimits = self.safe_list(currency, 'withdrawal_limits', [])
508
+ rawType = self.safe_string(currency, 'type')
509
+ type = 'crypto' if (rawType == 'blockchain') else 'other'
510
+ rawNetworks = self.safe_dict(currency, 'withdrawal_fees', {})
511
+ networks = {}
512
+ networkIds = list(rawNetworks.keys())
513
+ for j in range(0, len(networkIds)):
514
+ networkId = networkIds[j]
515
+ networkEntry = self.safe_dict(rawNetworks, networkId)
516
+ networkCode = self.network_id_to_code(networkId)
517
+ networks[networkCode] = {
518
+ 'id': networkId,
519
+ 'network': networkCode,
520
+ 'active': self.safe_bool(networkEntry, 'active'),
521
+ 'deposit': None,
522
+ 'withdraw': None,
523
+ 'fee': self.safe_number(networkEntry, 'value'),
524
+ 'precision': None,
525
+ 'limits': {
526
+ 'withdraw': {
527
+ 'min': None,
528
+ 'max': None,
529
+ },
530
+ },
531
+ 'info': networkEntry,
532
+ }
533
+ result[code] = self.safe_currency_structure({
392
534
  'id': id,
393
- 'numericId': numericId,
535
+ 'numericId': self.safe_integer(currency, 'id'),
394
536
  'code': code,
395
537
  'info': currency,
396
- 'name': name,
397
- 'active': active,
398
- 'deposit': depositEnabled,
399
- 'withdraw': withdrawEnabled,
400
- 'fee': fee,
538
+ 'name': self.safe_string(currency, 'fullname'),
539
+ 'active': self.safe_bool(currency, 'active'),
540
+ 'deposit': self.safe_bool(currency, 'allow_deposit'),
541
+ 'withdraw': self.safe_bool(currency, 'allow_withdrawal'),
542
+ 'fee': self.safe_number(currency, 'withdrawal_fee'),
401
543
  'precision': self.safe_number(currency, 'increment_unit'),
402
544
  'limits': {
403
545
  'amount': {
@@ -409,14 +551,17 @@ class hollaex(Exchange, ImplicitAPI):
409
551
  'max': self.safe_value(withdrawalLimits, 0),
410
552
  },
411
553
  },
412
- 'networks': {},
413
- }
554
+ 'networks': networks,
555
+ 'type': type,
556
+ })
414
557
  return result
415
558
 
416
- def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}):
559
+ def fetch_order_books(self, symbols: Strings = None, limit: Int = None, params={}) -> OrderBooks:
417
560
  """
418
561
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data for multiple markets
419
- :see: https://apidocs.hollaex.com/#orderbooks
562
+
563
+ https://apidocs.hollaex.com/#orderbooks
564
+
420
565
  :param str[]|None symbols: not used by hollaex fetchOrderBooks()
421
566
  :param int [limit]: not used by hollaex fetchOrderBooks()
422
567
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -437,7 +582,9 @@ class hollaex(Exchange, ImplicitAPI):
437
582
  def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
438
583
  """
439
584
  fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
440
- :see: https://apidocs.hollaex.com/#orderbook
585
+
586
+ https://apidocs.hollaex.com/#orderbook
587
+
441
588
  :param str symbol: unified symbol of the market to fetch the order book for
442
589
  :param int [limit]: the maximum amount of order book entries to return
443
590
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -475,7 +622,9 @@ class hollaex(Exchange, ImplicitAPI):
475
622
  def fetch_ticker(self, symbol: str, params={}) -> Ticker:
476
623
  """
477
624
  fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
478
- :see: https://apidocs.hollaex.com/#ticker
625
+
626
+ https://apidocs.hollaex.com/#ticker
627
+
479
628
  :param str symbol: unified symbol of the market to fetch the ticker for
480
629
  :param dict [params]: extra parameters specific to the exchange API endpoint
481
630
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -502,7 +651,9 @@ class hollaex(Exchange, ImplicitAPI):
502
651
  def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
503
652
  """
504
653
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
505
- :see: https://apidocs.hollaex.com/#tickers
654
+
655
+ https://apidocs.hollaex.com/#tickers
656
+
506
657
  :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
507
658
  :param dict [params]: extra parameters specific to the exchange API endpoint
508
659
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -597,7 +748,9 @@ class hollaex(Exchange, ImplicitAPI):
597
748
  def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
598
749
  """
599
750
  get the list of most recent trades for a particular symbol
600
- :see: https://apidocs.hollaex.com/#trades
751
+
752
+ https://apidocs.hollaex.com/#trades
753
+
601
754
  :param str symbol: unified symbol of the market to fetch trades for
602
755
  :param int [since]: timestamp in ms of the earliest trade to fetch
603
756
  :param int [limit]: the maximum amount of trades to fetch
@@ -645,7 +798,8 @@ class hollaex(Exchange, ImplicitAPI):
645
798
  # "price":0.147411,
646
799
  # "timestamp":"2022-01-26T17:53:34.650Z",
647
800
  # "order_id":"cba78ecb-4187-4da2-9d2f-c259aa693b5a",
648
- # "fee":0.01031877,"fee_coin":"usdt"
801
+ # "fee":0.01031877,
802
+ # "fee_coin":"usdt"
649
803
  # }
650
804
  #
651
805
  marketId = self.safe_string(trade, 'symbol')
@@ -658,11 +812,12 @@ class hollaex(Exchange, ImplicitAPI):
658
812
  priceString = self.safe_string(trade, 'price')
659
813
  amountString = self.safe_string(trade, 'size')
660
814
  feeCostString = self.safe_string(trade, 'fee')
815
+ feeCoin = self.safe_string(trade, 'fee_coin')
661
816
  fee = None
662
817
  if feeCostString is not None:
663
818
  fee = {
664
819
  'cost': feeCostString,
665
- 'currency': market['quote'],
820
+ 'currency': self.safe_currency_code(feeCoin),
666
821
  }
667
822
  return self.safe_trade({
668
823
  'info': trade,
@@ -683,7 +838,9 @@ class hollaex(Exchange, ImplicitAPI):
683
838
  def fetch_trading_fees(self, params={}) -> TradingFees:
684
839
  """
685
840
  fetch the trading fees for multiple markets
686
- :see: https://apidocs.hollaex.com/#tiers
841
+
842
+ https://apidocs.hollaex.com/#tiers
843
+
687
844
  :param dict [params]: extra parameters specific to the exchange API endpoint
688
845
  :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
689
846
  """
@@ -739,13 +896,16 @@ class hollaex(Exchange, ImplicitAPI):
739
896
 
740
897
  def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
741
898
  """
742
- fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
743
- :see: https://apidocs.hollaex.com/#chart
899
+ hollaex has large gaps between candles, so it's recommended to specify since
900
+
901
+ https://apidocs.hollaex.com/#chart
902
+
744
903
  :param str symbol: unified symbol of the market to fetch OHLCV data for
745
904
  :param str timeframe: the length of time each candle represents
746
905
  :param int [since]: timestamp in ms of the earliest candle to fetch
747
- :param int [limit]: the maximum amount of candles to fetch
906
+ :param int [limit]: the maximum amount of candles to fetch(max 500)
748
907
  :param dict [params]: extra parameters specific to the exchange API endpoint
908
+ :param int [params.until]: timestamp in ms of the latest candle to fetch
749
909
  :returns int[][]: A list of candles ordered, open, high, low, close, volume
750
910
  """
751
911
  self.load_markets()
@@ -754,22 +914,25 @@ class hollaex(Exchange, ImplicitAPI):
754
914
  'symbol': market['id'],
755
915
  'resolution': self.safe_string(self.timeframes, timeframe, timeframe),
756
916
  }
757
- duration = self.parse_timeframe(timeframe)
758
- if since is None:
759
- if limit is None:
760
- limit = 1000 # they have no defaults and can actually provide tens of thousands of bars in one request, but we should cap "default" at generous amount
761
- end = self.seconds()
762
- start = end - duration * limit
763
- request['to'] = end
764
- request['from'] = start
765
- else:
766
- if limit is None:
767
- request['from'] = self.parse_to_int(since / 1000)
768
- request['to'] = self.seconds()
769
- else:
770
- start = self.parse_to_int(since / 1000)
771
- request['from'] = start
772
- request['to'] = self.sum(start, duration * limit)
917
+ paginate = False
918
+ maxLimit = 500
919
+ paginate, params = self.handle_option_and_params(params, 'fetchOHLCV', 'paginate', paginate)
920
+ if paginate:
921
+ return self.fetch_paginated_call_deterministic('fetchOHLCV', symbol, since, limit, timeframe, params, maxLimit)
922
+ until = self.safe_integer(params, 'until')
923
+ timeDelta = self.parse_timeframe(timeframe) * maxLimit * 1000
924
+ start = since
925
+ now = self.milliseconds()
926
+ if until is None and start is None:
927
+ until = now
928
+ start = until - timeDelta
929
+ elif until is None:
930
+ until = now # the exchange has not a lot of trades, so if we count until by limit and limit is small, it may return empty result
931
+ elif start is None:
932
+ start = until - timeDelta
933
+ request['from'] = self.parse_to_int(start / 1000) # convert to seconds
934
+ request['to'] = self.parse_to_int(until / 1000) # convert to seconds
935
+ params = self.omit(params, 'until')
773
936
  response = self.publicGetChart(self.extend(request, params))
774
937
  #
775
938
  # [
@@ -827,7 +990,9 @@ class hollaex(Exchange, ImplicitAPI):
827
990
  def fetch_balance(self, params={}) -> Balances:
828
991
  """
829
992
  query for balance and get the amount of funds available for trading or funds locked in orders
830
- :see: https://apidocs.hollaex.com/#get-balance
993
+
994
+ https://apidocs.hollaex.com/#get-balance
995
+
831
996
  :param dict [params]: extra parameters specific to the exchange API endpoint
832
997
  :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
833
998
  """
@@ -850,7 +1015,9 @@ class hollaex(Exchange, ImplicitAPI):
850
1015
  def fetch_open_order(self, id: str, symbol: Str = None, params={}):
851
1016
  """
852
1017
  fetch an open order by it's id
853
- :see: https://apidocs.hollaex.com/#get-order
1018
+
1019
+ https://apidocs.hollaex.com/#get-order
1020
+
854
1021
  :param str id: order id
855
1022
  :param str symbol: not used by hollaex fetchOpenOrder()
856
1023
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -890,7 +1057,9 @@ class hollaex(Exchange, ImplicitAPI):
890
1057
  def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
891
1058
  """
892
1059
  fetch all unfilled currently open orders
893
- :see: https://apidocs.hollaex.com/#get-all-orders
1060
+
1061
+ https://apidocs.hollaex.com/#get-all-orders
1062
+
894
1063
  :param str symbol: unified market symbol
895
1064
  :param int [since]: the earliest time in ms to fetch open orders for
896
1065
  :param int [limit]: the maximum number of open orders structures to retrieve
@@ -905,7 +1074,9 @@ class hollaex(Exchange, ImplicitAPI):
905
1074
  def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
906
1075
  """
907
1076
  fetches information on multiple closed orders made by the user
908
- :see: https://apidocs.hollaex.com/#get-all-orders
1077
+
1078
+ https://apidocs.hollaex.com/#get-all-orders
1079
+
909
1080
  :param str symbol: unified market symbol of the market orders were made in
910
1081
  :param int [since]: the earliest time in ms to fetch orders for
911
1082
  :param int [limit]: the maximum number of order structures to retrieve
@@ -920,7 +1091,10 @@ class hollaex(Exchange, ImplicitAPI):
920
1091
  def fetch_order(self, id: str, symbol: Str = None, params={}):
921
1092
  """
922
1093
  fetches information on an order made by the user
923
- :see: https://apidocs.hollaex.com/#get-order
1094
+
1095
+ https://apidocs.hollaex.com/#get-order
1096
+
1097
+ :param str id:
924
1098
  :param str symbol: unified symbol of the market the order was made in
925
1099
  :param dict [params]: extra parameters specific to the exchange API endpoint
926
1100
  :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
@@ -960,7 +1134,9 @@ class hollaex(Exchange, ImplicitAPI):
960
1134
  def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
961
1135
  """
962
1136
  fetches information on multiple orders made by the user
963
- :see: https://apidocs.hollaex.com/#get-all-orders
1137
+
1138
+ https://apidocs.hollaex.com/#get-all-orders
1139
+
964
1140
  :param str symbol: unified market symbol of the market orders were made in
965
1141
  :param int [since]: the earliest time in ms to fetch orders for
966
1142
  :param int [limit]: the maximum number of order structures to retrieve
@@ -1066,7 +1242,6 @@ class hollaex(Exchange, ImplicitAPI):
1066
1242
  type = self.safe_string(order, 'type')
1067
1243
  side = self.safe_string(order, 'side')
1068
1244
  price = self.safe_string(order, 'price')
1069
- stopPrice = self.safe_string(order, 'stop')
1070
1245
  amount = self.safe_string(order, 'size')
1071
1246
  filled = self.safe_string(order, 'filled')
1072
1247
  status = self.parse_order_status(self.safe_string(order, 'status'))
@@ -1085,8 +1260,7 @@ class hollaex(Exchange, ImplicitAPI):
1085
1260
  'postOnly': postOnly,
1086
1261
  'side': side,
1087
1262
  'price': price,
1088
- 'stopPrice': stopPrice,
1089
- 'triggerPrice': stopPrice,
1263
+ 'triggerPrice': self.safe_string(order, 'stop'),
1090
1264
  'amount': amount,
1091
1265
  'filled': filled,
1092
1266
  'remaining': None,
@@ -1100,12 +1274,14 @@ class hollaex(Exchange, ImplicitAPI):
1100
1274
  def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
1101
1275
  """
1102
1276
  create a trade order
1103
- :see: https://apidocs.hollaex.com/#create-order
1277
+
1278
+ https://apidocs.hollaex.com/#create-order
1279
+
1104
1280
  :param str symbol: unified symbol of the market to create an order in
1105
1281
  :param str type: 'market' or 'limit'
1106
1282
  :param str side: 'buy' or 'sell'
1107
1283
  :param float amount: how much of currency you want to trade in units of base currency
1108
- :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
1284
+ :param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
1109
1285
  :param dict [params]: extra parameters specific to the exchange API endpoint
1110
1286
  :param float [params.triggerPrice]: the price at which a trigger order is triggered at
1111
1287
  :param bool [params.postOnly]: if True, the order will only be posted to the order book and not executed immediately
@@ -1113,25 +1289,23 @@ class hollaex(Exchange, ImplicitAPI):
1113
1289
  """
1114
1290
  self.load_markets()
1115
1291
  market = self.market(symbol)
1116
- convertedAmount = float(self.amount_to_precision(symbol, amount))
1117
1292
  request: dict = {
1118
1293
  'symbol': market['id'],
1119
1294
  'side': side,
1120
- 'size': self.normalize_number_if_needed(convertedAmount),
1295
+ 'size': self.amount_to_precision(symbol, amount),
1121
1296
  'type': type,
1122
1297
  # 'stop': float(self.price_to_precision(symbol, stopPrice)),
1123
1298
  # 'meta': {}, # other options such
1124
1299
  }
1125
- stopPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop'])
1300
+ triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop'])
1126
1301
  meta = self.safe_value(params, 'meta', {})
1127
1302
  exchangeSpecificParam = self.safe_bool(meta, 'post_only', False)
1128
1303
  isMarketOrder = type == 'market'
1129
1304
  postOnly = self.is_post_only(isMarketOrder, exchangeSpecificParam, params)
1130
1305
  if not isMarketOrder:
1131
- convertedPrice = float(self.price_to_precision(symbol, price))
1132
- request['price'] = self.normalize_number_if_needed(convertedPrice)
1133
- if stopPrice is not None:
1134
- request['stop'] = self.normalize_number_if_needed(float(self.price_to_precision(symbol, stopPrice)))
1306
+ request['price'] = self.price_to_precision(symbol, price)
1307
+ if triggerPrice is not None:
1308
+ request['stop'] = self.price_to_precision(symbol, triggerPrice)
1135
1309
  if postOnly:
1136
1310
  request['meta'] = {'post_only': True}
1137
1311
  params = self.omit(params, ['postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stop'])
@@ -1164,7 +1338,9 @@ class hollaex(Exchange, ImplicitAPI):
1164
1338
  def cancel_order(self, id: str, symbol: Str = None, params={}):
1165
1339
  """
1166
1340
  cancels an open order
1167
- :see: https://apidocs.hollaex.com/#cancel-order
1341
+
1342
+ https://apidocs.hollaex.com/#cancel-order
1343
+
1168
1344
  :param str id: order id
1169
1345
  :param str symbol: unified symbol of the market the order was made in
1170
1346
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1193,7 +1369,9 @@ class hollaex(Exchange, ImplicitAPI):
1193
1369
  def cancel_all_orders(self, symbol: Str = None, params={}):
1194
1370
  """
1195
1371
  cancel all open orders in a market
1196
- :see: https://apidocs.hollaex.com/#cancel-all-orders
1372
+
1373
+ https://apidocs.hollaex.com/#cancel-all-orders
1374
+
1197
1375
  :param str symbol: unified market symbol of the market to cancel orders in
1198
1376
  :param dict [params]: extra parameters specific to the exchange API endpoint
1199
1377
  :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
@@ -1226,7 +1404,9 @@ class hollaex(Exchange, ImplicitAPI):
1226
1404
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1227
1405
  """
1228
1406
  fetch all trades made by the user
1229
- :see: https://apidocs.hollaex.com/#get-trades
1407
+
1408
+ https://apidocs.hollaex.com/#get-trades
1409
+
1230
1410
  :param str symbol: unified market symbol
1231
1411
  :param int [since]: the earliest time in ms to fetch trades for
1232
1412
  :param int [limit]: the maximum number of trades structures to retrieve
@@ -1270,7 +1450,7 @@ class hollaex(Exchange, ImplicitAPI):
1270
1450
  data = self.safe_list(response, 'data', [])
1271
1451
  return self.parse_trades(data, market, since, limit)
1272
1452
 
1273
- def parse_deposit_address(self, depositAddress, currency: Currency = None):
1453
+ def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
1274
1454
  #
1275
1455
  # {
1276
1456
  # "currency":"usdt",
@@ -1292,17 +1472,19 @@ class hollaex(Exchange, ImplicitAPI):
1292
1472
  currency = self.safe_currency(currencyId, currency)
1293
1473
  network = self.safe_string(depositAddress, 'network')
1294
1474
  return {
1475
+ 'info': depositAddress,
1295
1476
  'currency': currency['code'],
1477
+ 'network': network,
1296
1478
  'address': address,
1297
1479
  'tag': tag,
1298
- 'network': network,
1299
- 'info': depositAddress,
1300
1480
  }
1301
1481
 
1302
- def fetch_deposit_addresses(self, codes: Strings = None, params={}):
1482
+ def fetch_deposit_addresses(self, codes: Strings = None, params={}) -> List[DepositAddress]:
1303
1483
  """
1304
1484
  fetch deposit addresses for multiple currencies and chain types
1305
- :see: https://apidocs.hollaex.com/#get-user
1485
+
1486
+ https://apidocs.hollaex.com/#get-user
1487
+
1306
1488
  :param str[]|None codes: list of unified currency codes, default is None
1307
1489
  :param dict [params]: extra parameters specific to the exchange API endpoint
1308
1490
  :returns dict: a list of `address structures <https://docs.ccxt.com/#/?id=address-structure>`
@@ -1363,7 +1545,9 @@ class hollaex(Exchange, ImplicitAPI):
1363
1545
  def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1364
1546
  """
1365
1547
  fetch all deposits made to an account
1366
- :see: https://apidocs.hollaex.com/#get-deposits
1548
+
1549
+ https://apidocs.hollaex.com/#get-deposits
1550
+
1367
1551
  :param str code: unified currency code
1368
1552
  :param int [since]: the earliest time in ms to fetch deposits for
1369
1553
  :param int [limit]: the maximum number of deposits structures to retrieve
@@ -1418,7 +1602,9 @@ class hollaex(Exchange, ImplicitAPI):
1418
1602
  def fetch_withdrawal(self, id: str, code: Str = None, params={}):
1419
1603
  """
1420
1604
  fetch data on a currency withdrawal via the withdrawal id
1421
- :see: https://apidocs.hollaex.com/#get-withdrawals
1605
+
1606
+ https://apidocs.hollaex.com/#get-withdrawals
1607
+
1422
1608
  :param str id: withdrawal id
1423
1609
  :param str code: unified currency code of the currency withdrawn, default is None
1424
1610
  :param dict [params]: extra parameters specific to the exchange API endpoint
@@ -1463,7 +1649,9 @@ class hollaex(Exchange, ImplicitAPI):
1463
1649
  def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1464
1650
  """
1465
1651
  fetch all withdrawals made from an account
1466
- :see: https://apidocs.hollaex.com/#get-withdrawals
1652
+
1653
+ https://apidocs.hollaex.com/#get-withdrawals
1654
+
1467
1655
  :param str code: unified currency code
1468
1656
  :param int [since]: the earliest time in ms to fetch withdrawals for
1469
1657
  :param int [limit]: the maximum number of withdrawals structures to retrieve
@@ -1610,10 +1798,12 @@ class hollaex(Exchange, ImplicitAPI):
1610
1798
  'fee': fee,
1611
1799
  }
1612
1800
 
1613
- def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1801
+ def withdraw(self, code: str, amount: float, address: str, tag: Str = None, params={}) -> Transaction:
1614
1802
  """
1615
1803
  make a withdrawal
1616
- :see: https://apidocs.hollaex.com/#withdrawal
1804
+
1805
+ https://apidocs.hollaex.com/#withdrawal
1806
+
1617
1807
  :param str code: unified currency code
1618
1808
  :param float amount: the amount to withdraw
1619
1809
  :param str address: the address to withdraw to
@@ -1717,7 +1907,9 @@ class hollaex(Exchange, ImplicitAPI):
1717
1907
  def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
1718
1908
  """
1719
1909
  fetch deposit and withdraw fees
1720
- :see: https://apidocs.hollaex.com/#constants
1910
+
1911
+ https://apidocs.hollaex.com/#constants
1912
+
1721
1913
  :param str[]|None codes: list of unified currency codes
1722
1914
  :param dict [params]: extra parameters specific to the exchange API endpoint
1723
1915
  :returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
@@ -1758,14 +1950,9 @@ class hollaex(Exchange, ImplicitAPI):
1758
1950
  # "network":"https://api.hollaex.network"
1759
1951
  # }
1760
1952
  #
1761
- coins = self.safe_list(response, 'coins')
1953
+ coins = self.safe_dict(response, 'coins', {})
1762
1954
  return self.parse_deposit_withdraw_fees(coins, codes, 'symbol')
1763
1955
 
1764
- def normalize_number_if_needed(self, number):
1765
- if self.is_round_number(number):
1766
- number = int(number)
1767
- return number
1768
-
1769
1956
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1770
1957
  query = self.omit(params, self.extract_params(path))
1771
1958
  path = '/' + self.version + '/' + self.implode_params(path, params)
@@ -1793,13 +1980,14 @@ class hollaex(Exchange, ImplicitAPI):
1793
1980
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
1794
1981
 
1795
1982
  def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1983
+ # {"message": "Invalid token"}
1796
1984
  if response is None:
1797
1985
  return None
1798
1986
  if (code >= 400) and (code <= 503):
1799
1987
  #
1800
1988
  # {"message": "Invalid token"}
1801
1989
  #
1802
- # different errors return the same code eg:
1990
+ # different errors return the same code eg
1803
1991
  #
1804
1992
  # {"message":"Error 1001 - Order rejected. Order could not be submitted order was set to a post only order."}
1805
1993
  #