ccxt-ir 4.3.46.0.1__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 (772) hide show
  1. ccxt/__init__.py +358 -0
  2. ccxt/abantether.py +316 -0
  3. ccxt/abstract/__init__.py +0 -0
  4. ccxt/abstract/abantether.py +5 -0
  5. ccxt/abstract/ace.py +15 -0
  6. ccxt/abstract/afratether.py +6 -0
  7. ccxt/abstract/alpaca.py +70 -0
  8. ccxt/abstract/arzinja.py +5 -0
  9. ccxt/abstract/arzplus.py +7 -0
  10. ccxt/abstract/ascendex.py +77 -0
  11. ccxt/abstract/bequant.py +115 -0
  12. ccxt/abstract/bigone.py +45 -0
  13. ccxt/abstract/binance.py +712 -0
  14. ccxt/abstract/binancecoinm.py +712 -0
  15. ccxt/abstract/binanceus.py +764 -0
  16. ccxt/abstract/binanceusdm.py +712 -0
  17. ccxt/abstract/bingx.py +113 -0
  18. ccxt/abstract/bit2c.py +27 -0
  19. ccxt/abstract/bitbank.py +27 -0
  20. ccxt/abstract/bitbay.py +53 -0
  21. ccxt/abstract/bitbns.py +40 -0
  22. ccxt/abstract/bitcoincom.py +115 -0
  23. ccxt/abstract/bitfinex.py +69 -0
  24. ccxt/abstract/bitfinex2.py +139 -0
  25. ccxt/abstract/bitflyer.py +38 -0
  26. ccxt/abstract/bitget.py +508 -0
  27. ccxt/abstract/bithumb.py +32 -0
  28. ccxt/abstract/bitimen.py +7 -0
  29. ccxt/abstract/bitir.py +7 -0
  30. ccxt/abstract/bitmart.py +99 -0
  31. ccxt/abstract/bitmex.py +97 -0
  32. ccxt/abstract/bitopro.py +29 -0
  33. ccxt/abstract/bitpanda.py +35 -0
  34. ccxt/abstract/bitpin.py +7 -0
  35. ccxt/abstract/bitrue.py +72 -0
  36. ccxt/abstract/bitso.py +43 -0
  37. ccxt/abstract/bitstamp.py +258 -0
  38. ccxt/abstract/bitteam.py +29 -0
  39. ccxt/abstract/bitvavo.py +27 -0
  40. ccxt/abstract/bl3p.py +19 -0
  41. ccxt/abstract/blockchaincom.py +28 -0
  42. ccxt/abstract/blofin.py +37 -0
  43. ccxt/abstract/btcalpha.py +18 -0
  44. ccxt/abstract/btcbox.py +13 -0
  45. ccxt/abstract/btcmarkets.py +39 -0
  46. ccxt/abstract/btcturk.py +20 -0
  47. ccxt/abstract/bybit.py +298 -0
  48. ccxt/abstract/cex.py +33 -0
  49. ccxt/abstract/coinbase.py +94 -0
  50. ccxt/abstract/coinbaseadvanced.py +94 -0
  51. ccxt/abstract/coinbaseexchange.py +67 -0
  52. ccxt/abstract/coinbaseinternational.py +39 -0
  53. ccxt/abstract/coincatch.py +94 -0
  54. ccxt/abstract/coincheck.py +33 -0
  55. ccxt/abstract/coinex.py +237 -0
  56. ccxt/abstract/coinlist.py +54 -0
  57. ccxt/abstract/coinmate.py +62 -0
  58. ccxt/abstract/coinmetro.py +34 -0
  59. ccxt/abstract/coinone.py +67 -0
  60. ccxt/abstract/coinsph.py +54 -0
  61. ccxt/abstract/coinspot.py +28 -0
  62. ccxt/abstract/cryptocom.py +107 -0
  63. ccxt/abstract/currencycom.py +68 -0
  64. ccxt/abstract/delta.py +50 -0
  65. ccxt/abstract/deribit.py +125 -0
  66. ccxt/abstract/digifinex.py +91 -0
  67. ccxt/abstract/eterex.py +5 -0
  68. ccxt/abstract/excoino.py +7 -0
  69. ccxt/abstract/exir.py +8 -0
  70. ccxt/abstract/exmo.py +55 -0
  71. ccxt/abstract/exnovin.py +6 -0
  72. ccxt/abstract/farhadexchange.py +5 -0
  73. ccxt/abstract/fmfwio.py +115 -0
  74. ccxt/abstract/gate.py +265 -0
  75. ccxt/abstract/gateio.py +265 -0
  76. ccxt/abstract/gemini.py +58 -0
  77. ccxt/abstract/hashkey.py +67 -0
  78. ccxt/abstract/hitbtc.py +115 -0
  79. ccxt/abstract/hitbtc3.py +115 -0
  80. ccxt/abstract/hitobit.py +8 -0
  81. ccxt/abstract/hollaex.py +33 -0
  82. ccxt/abstract/htx.py +548 -0
  83. ccxt/abstract/huobi.py +548 -0
  84. ccxt/abstract/huobijp.py +114 -0
  85. ccxt/abstract/hyperliquid.py +6 -0
  86. ccxt/abstract/idex.py +26 -0
  87. ccxt/abstract/independentreserve.py +37 -0
  88. ccxt/abstract/indodax.py +26 -0
  89. ccxt/abstract/jibitex.py +7 -0
  90. ccxt/abstract/kraken.py +57 -0
  91. ccxt/abstract/krakenfutures.py +38 -0
  92. ccxt/abstract/kucoin.py +214 -0
  93. ccxt/abstract/kucoinfutures.py +233 -0
  94. ccxt/abstract/kuna.py +182 -0
  95. ccxt/abstract/latoken.py +56 -0
  96. ccxt/abstract/lbank.py +61 -0
  97. ccxt/abstract/luno.py +37 -0
  98. ccxt/abstract/lykke.py +29 -0
  99. ccxt/abstract/mercado.py +25 -0
  100. ccxt/abstract/mexc.py +178 -0
  101. ccxt/abstract/ndax.py +97 -0
  102. ccxt/abstract/nobitex.py +7 -0
  103. ccxt/abstract/novadax.py +29 -0
  104. ccxt/abstract/oceanex.py +22 -0
  105. ccxt/abstract/okcoin.py +74 -0
  106. ccxt/abstract/okexchange.py +8 -0
  107. ccxt/abstract/okx.py +324 -0
  108. ccxt/abstract/ompfinex.py +7 -0
  109. ccxt/abstract/onetrading.py +35 -0
  110. ccxt/abstract/oxfun.py +34 -0
  111. ccxt/abstract/p2b.py +22 -0
  112. ccxt/abstract/paradex.py +40 -0
  113. ccxt/abstract/paymium.py +28 -0
  114. ccxt/abstract/phemex.py +115 -0
  115. ccxt/abstract/poloniex.py +69 -0
  116. ccxt/abstract/poloniexfutures.py +48 -0
  117. ccxt/abstract/probit.py +23 -0
  118. ccxt/abstract/ramzinex.py +7 -0
  119. ccxt/abstract/sarmayex.py +5 -0
  120. ccxt/abstract/sarrafex.py +7 -0
  121. ccxt/abstract/tabdeal.py +7 -0
  122. ccxt/abstract/tetherland.py +5 -0
  123. ccxt/abstract/timex.py +62 -0
  124. ccxt/abstract/tokocrypto.py +37 -0
  125. ccxt/abstract/tradeogre.py +16 -0
  126. ccxt/abstract/twox.py +5 -0
  127. ccxt/abstract/ubitex.py +7 -0
  128. ccxt/abstract/upbit.py +38 -0
  129. ccxt/abstract/vertex.py +19 -0
  130. ccxt/abstract/wallex.py +8 -0
  131. ccxt/abstract/wavesexchange.py +154 -0
  132. ccxt/abstract/wazirx.py +30 -0
  133. ccxt/abstract/whitebit.py +98 -0
  134. ccxt/abstract/woo.py +83 -0
  135. ccxt/abstract/woofipro.py +119 -0
  136. ccxt/abstract/xt.py +152 -0
  137. ccxt/abstract/yobit.py +16 -0
  138. ccxt/abstract/zaif.py +38 -0
  139. ccxt/abstract/zonda.py +53 -0
  140. ccxt/ace.py +1012 -0
  141. ccxt/afratether.py +293 -0
  142. ccxt/alpaca.py +1083 -0
  143. ccxt/arzinja.py +285 -0
  144. ccxt/arzplus.py +412 -0
  145. ccxt/ascendex.py +3330 -0
  146. ccxt/async_support/__init__.py +337 -0
  147. ccxt/async_support/abantether.py +316 -0
  148. ccxt/async_support/ace.py +1012 -0
  149. ccxt/async_support/afratether.py +293 -0
  150. ccxt/async_support/alpaca.py +1083 -0
  151. ccxt/async_support/arzinja.py +285 -0
  152. ccxt/async_support/arzplus.py +412 -0
  153. ccxt/async_support/ascendex.py +3330 -0
  154. ccxt/async_support/base/__init__.py +1 -0
  155. ccxt/async_support/base/exchange.py +1966 -0
  156. ccxt/async_support/base/throttler.py +50 -0
  157. ccxt/async_support/base/ws/__init__.py +38 -0
  158. ccxt/async_support/base/ws/aiohttp_client.py +125 -0
  159. ccxt/async_support/base/ws/cache.py +212 -0
  160. ccxt/async_support/base/ws/client.py +193 -0
  161. ccxt/async_support/base/ws/fast_client.py +96 -0
  162. ccxt/async_support/base/ws/functions.py +59 -0
  163. ccxt/async_support/base/ws/future.py +58 -0
  164. ccxt/async_support/base/ws/order_book.py +78 -0
  165. ccxt/async_support/base/ws/order_book_side.py +174 -0
  166. ccxt/async_support/bequant.py +33 -0
  167. ccxt/async_support/bigone.py +2113 -0
  168. ccxt/async_support/binance.py +12234 -0
  169. ccxt/async_support/binancecoinm.py +45 -0
  170. ccxt/async_support/binanceus.py +211 -0
  171. ccxt/async_support/binanceusdm.py +58 -0
  172. ccxt/async_support/bingx.py +4325 -0
  173. ccxt/async_support/bit2c.py +866 -0
  174. ccxt/async_support/bitbank.py +1001 -0
  175. ccxt/async_support/bitbay.py +17 -0
  176. ccxt/async_support/bitbns.py +1154 -0
  177. ccxt/async_support/bitcoincom.py +17 -0
  178. ccxt/async_support/bitfinex.py +1617 -0
  179. ccxt/async_support/bitfinex2.py +3552 -0
  180. ccxt/async_support/bitflyer.py +995 -0
  181. ccxt/async_support/bitget.py +8273 -0
  182. ccxt/async_support/bithumb.py +1061 -0
  183. ccxt/async_support/bitimen.py +401 -0
  184. ccxt/async_support/bitir.py +490 -0
  185. ccxt/async_support/bitmart.py +4415 -0
  186. ccxt/async_support/bitmex.py +2756 -0
  187. ccxt/async_support/bitopro.py +1630 -0
  188. ccxt/async_support/bitpanda.py +16 -0
  189. ccxt/async_support/bitpin.py +454 -0
  190. ccxt/async_support/bitrue.py +3027 -0
  191. ccxt/async_support/bitso.py +1670 -0
  192. ccxt/async_support/bitstamp.py +2203 -0
  193. ccxt/async_support/bitteam.py +2239 -0
  194. ccxt/async_support/bitvavo.py +1968 -0
  195. ccxt/async_support/bl3p.py +485 -0
  196. ccxt/async_support/blockchaincom.py +1104 -0
  197. ccxt/async_support/blofin.py +2066 -0
  198. ccxt/async_support/btcalpha.py +891 -0
  199. ccxt/async_support/btcbox.py +544 -0
  200. ccxt/async_support/btcmarkets.py +1221 -0
  201. ccxt/async_support/btcturk.py +911 -0
  202. ccxt/async_support/bybit.py +8159 -0
  203. ccxt/async_support/cex.py +1605 -0
  204. ccxt/async_support/coinbase.py +4475 -0
  205. ccxt/async_support/coinbaseadvanced.py +17 -0
  206. ccxt/async_support/coinbaseexchange.py +1734 -0
  207. ccxt/async_support/coinbaseinternational.py +1899 -0
  208. ccxt/async_support/coincatch.py +5069 -0
  209. ccxt/async_support/coincheck.py +815 -0
  210. ccxt/async_support/coinex.py +5526 -0
  211. ccxt/async_support/coinlist.py +2243 -0
  212. ccxt/async_support/coinmate.py +1067 -0
  213. ccxt/async_support/coinmetro.py +1797 -0
  214. ccxt/async_support/coinone.py +1127 -0
  215. ccxt/async_support/coinsph.py +1850 -0
  216. ccxt/async_support/coinspot.py +534 -0
  217. ccxt/async_support/cryptocom.py +2822 -0
  218. ccxt/async_support/currencycom.py +1950 -0
  219. ccxt/async_support/delta.py +3376 -0
  220. ccxt/async_support/deribit.py +3437 -0
  221. ccxt/async_support/digifinex.py +3960 -0
  222. ccxt/async_support/eterex.py +286 -0
  223. ccxt/async_support/excoino.py +399 -0
  224. ccxt/async_support/exir.py +375 -0
  225. ccxt/async_support/exmo.py +2462 -0
  226. ccxt/async_support/exnovin.py +360 -0
  227. ccxt/async_support/farhadexchange.py +266 -0
  228. ccxt/async_support/fmfwio.py +34 -0
  229. ccxt/async_support/gate.py +6976 -0
  230. ccxt/async_support/gateio.py +16 -0
  231. ccxt/async_support/gemini.py +1825 -0
  232. ccxt/async_support/hashkey.py +4150 -0
  233. ccxt/async_support/hitbtc.py +3423 -0
  234. ccxt/async_support/hitbtc3.py +16 -0
  235. ccxt/async_support/hitobit.py +391 -0
  236. ccxt/async_support/hollaex.py +1813 -0
  237. ccxt/async_support/htx.py +8506 -0
  238. ccxt/async_support/huobi.py +16 -0
  239. ccxt/async_support/huobijp.py +1801 -0
  240. ccxt/async_support/hyperliquid.py +2431 -0
  241. ccxt/async_support/idex.py +1766 -0
  242. ccxt/async_support/independentreserve.py +784 -0
  243. ccxt/async_support/indodax.py +1247 -0
  244. ccxt/async_support/jibitex.py +395 -0
  245. ccxt/async_support/kraken.py +2894 -0
  246. ccxt/async_support/krakenfutures.py +2601 -0
  247. ccxt/async_support/kucoin.py +4602 -0
  248. ccxt/async_support/kucoinfutures.py +2698 -0
  249. ccxt/async_support/kuna.py +1841 -0
  250. ccxt/async_support/latoken.py +1664 -0
  251. ccxt/async_support/lbank.py +2683 -0
  252. ccxt/async_support/luno.py +1067 -0
  253. ccxt/async_support/lykke.py +1270 -0
  254. ccxt/async_support/mercado.py +842 -0
  255. ccxt/async_support/mexc.py +5369 -0
  256. ccxt/async_support/ndax.py +2354 -0
  257. ccxt/async_support/nobitex.py +419 -0
  258. ccxt/async_support/novadax.py +1484 -0
  259. ccxt/async_support/oceanex.py +903 -0
  260. ccxt/async_support/okcoin.py +2936 -0
  261. ccxt/async_support/okexchange.py +349 -0
  262. ccxt/async_support/okx.py +7827 -0
  263. ccxt/async_support/ompfinex.py +472 -0
  264. ccxt/async_support/onetrading.py +1911 -0
  265. ccxt/async_support/oxfun.py +2773 -0
  266. ccxt/async_support/p2b.py +1194 -0
  267. ccxt/async_support/paradex.py +2015 -0
  268. ccxt/async_support/paymium.py +564 -0
  269. ccxt/async_support/phemex.py +4473 -0
  270. ccxt/async_support/poloniex.py +2232 -0
  271. ccxt/async_support/poloniexfutures.py +1717 -0
  272. ccxt/async_support/probit.py +1734 -0
  273. ccxt/async_support/ramzinex.py +476 -0
  274. ccxt/async_support/sarmayex.py +357 -0
  275. ccxt/async_support/sarrafex.py +478 -0
  276. ccxt/async_support/tabdeal.py +364 -0
  277. ccxt/async_support/tetherland.py +349 -0
  278. ccxt/async_support/timex.py +1593 -0
  279. ccxt/async_support/tokocrypto.py +2405 -0
  280. ccxt/async_support/tradeogre.py +608 -0
  281. ccxt/async_support/twox.py +326 -0
  282. ccxt/async_support/ubitex.py +409 -0
  283. ccxt/async_support/upbit.py +1833 -0
  284. ccxt/async_support/vertex.py +2922 -0
  285. ccxt/async_support/wallex.py +445 -0
  286. ccxt/async_support/wavesexchange.py +2473 -0
  287. ccxt/async_support/wazirx.py +1224 -0
  288. ccxt/async_support/whitebit.py +2469 -0
  289. ccxt/async_support/woo.py +3114 -0
  290. ccxt/async_support/woofipro.py +2533 -0
  291. ccxt/async_support/xt.py +4454 -0
  292. ccxt/async_support/yobit.py +1283 -0
  293. ccxt/async_support/zaif.py +725 -0
  294. ccxt/async_support/zonda.py +1828 -0
  295. ccxt/base/__init__.py +27 -0
  296. ccxt/base/decimal_to_precision.py +174 -0
  297. ccxt/base/errors.py +242 -0
  298. ccxt/base/exchange.py +5941 -0
  299. ccxt/base/precise.py +287 -0
  300. ccxt/base/types.py +502 -0
  301. ccxt/bequant.py +33 -0
  302. ccxt/bigone.py +2112 -0
  303. ccxt/binance.py +12233 -0
  304. ccxt/binancecoinm.py +45 -0
  305. ccxt/binanceus.py +211 -0
  306. ccxt/binanceusdm.py +58 -0
  307. ccxt/bingx.py +4324 -0
  308. ccxt/bit2c.py +866 -0
  309. ccxt/bitbank.py +1001 -0
  310. ccxt/bitbay.py +17 -0
  311. ccxt/bitbns.py +1154 -0
  312. ccxt/bitcoincom.py +17 -0
  313. ccxt/bitfinex.py +1617 -0
  314. ccxt/bitfinex2.py +3552 -0
  315. ccxt/bitflyer.py +995 -0
  316. ccxt/bitget.py +8272 -0
  317. ccxt/bithumb.py +1061 -0
  318. ccxt/bitimen.py +401 -0
  319. ccxt/bitir.py +490 -0
  320. ccxt/bitmart.py +4415 -0
  321. ccxt/bitmex.py +2756 -0
  322. ccxt/bitopro.py +1630 -0
  323. ccxt/bitpanda.py +16 -0
  324. ccxt/bitpin.py +454 -0
  325. ccxt/bitrue.py +3026 -0
  326. ccxt/bitso.py +1670 -0
  327. ccxt/bitstamp.py +2203 -0
  328. ccxt/bitteam.py +2239 -0
  329. ccxt/bitvavo.py +1968 -0
  330. ccxt/bl3p.py +485 -0
  331. ccxt/blockchaincom.py +1104 -0
  332. ccxt/blofin.py +2066 -0
  333. ccxt/btcalpha.py +891 -0
  334. ccxt/btcbox.py +544 -0
  335. ccxt/btcmarkets.py +1221 -0
  336. ccxt/btcturk.py +911 -0
  337. ccxt/bybit.py +8158 -0
  338. ccxt/cex.py +1605 -0
  339. ccxt/coinbase.py +4474 -0
  340. ccxt/coinbaseadvanced.py +17 -0
  341. ccxt/coinbaseexchange.py +1734 -0
  342. ccxt/coinbaseinternational.py +1899 -0
  343. ccxt/coincatch.py +5069 -0
  344. ccxt/coincheck.py +815 -0
  345. ccxt/coinex.py +5525 -0
  346. ccxt/coinlist.py +2243 -0
  347. ccxt/coinmate.py +1067 -0
  348. ccxt/coinmetro.py +1797 -0
  349. ccxt/coinone.py +1127 -0
  350. ccxt/coinsph.py +1850 -0
  351. ccxt/coinspot.py +534 -0
  352. ccxt/cryptocom.py +2822 -0
  353. ccxt/currencycom.py +1950 -0
  354. ccxt/delta.py +3376 -0
  355. ccxt/deribit.py +3437 -0
  356. ccxt/digifinex.py +3959 -0
  357. ccxt/eterex.py +286 -0
  358. ccxt/excoino.py +399 -0
  359. ccxt/exir.py +375 -0
  360. ccxt/exmo.py +2462 -0
  361. ccxt/exnovin.py +360 -0
  362. ccxt/farhadexchange.py +266 -0
  363. ccxt/fmfwio.py +34 -0
  364. ccxt/gate.py +6975 -0
  365. ccxt/gateio.py +16 -0
  366. ccxt/gemini.py +1824 -0
  367. ccxt/hashkey.py +4150 -0
  368. ccxt/hitbtc.py +3423 -0
  369. ccxt/hitbtc3.py +16 -0
  370. ccxt/hitobit.py +391 -0
  371. ccxt/hollaex.py +1813 -0
  372. ccxt/htx.py +8505 -0
  373. ccxt/huobi.py +16 -0
  374. ccxt/huobijp.py +1801 -0
  375. ccxt/hyperliquid.py +2430 -0
  376. ccxt/idex.py +1766 -0
  377. ccxt/independentreserve.py +784 -0
  378. ccxt/indodax.py +1247 -0
  379. ccxt/jibitex.py +395 -0
  380. ccxt/kraken.py +2894 -0
  381. ccxt/krakenfutures.py +2601 -0
  382. ccxt/kucoin.py +4601 -0
  383. ccxt/kucoinfutures.py +2698 -0
  384. ccxt/kuna.py +1841 -0
  385. ccxt/latoken.py +1664 -0
  386. ccxt/lbank.py +2682 -0
  387. ccxt/luno.py +1067 -0
  388. ccxt/lykke.py +1270 -0
  389. ccxt/mercado.py +842 -0
  390. ccxt/mexc.py +5369 -0
  391. ccxt/ndax.py +2354 -0
  392. ccxt/nobitex.py +419 -0
  393. ccxt/novadax.py +1484 -0
  394. ccxt/oceanex.py +903 -0
  395. ccxt/okcoin.py +2936 -0
  396. ccxt/okexchange.py +349 -0
  397. ccxt/okx.py +7826 -0
  398. ccxt/ompfinex.py +472 -0
  399. ccxt/onetrading.py +1911 -0
  400. ccxt/oxfun.py +2772 -0
  401. ccxt/p2b.py +1194 -0
  402. ccxt/paradex.py +2015 -0
  403. ccxt/paymium.py +564 -0
  404. ccxt/phemex.py +4473 -0
  405. ccxt/poloniex.py +2232 -0
  406. ccxt/poloniexfutures.py +1717 -0
  407. ccxt/pro/__init__.py +149 -0
  408. ccxt/pro/alpaca.py +685 -0
  409. ccxt/pro/ascendex.py +916 -0
  410. ccxt/pro/bequant.py +38 -0
  411. ccxt/pro/binance.py +3488 -0
  412. ccxt/pro/binancecoinm.py +28 -0
  413. ccxt/pro/binanceus.py +48 -0
  414. ccxt/pro/binanceusdm.py +31 -0
  415. ccxt/pro/bingx.py +1264 -0
  416. ccxt/pro/bitcoincom.py +34 -0
  417. ccxt/pro/bitfinex.py +621 -0
  418. ccxt/pro/bitfinex2.py +1083 -0
  419. ccxt/pro/bitget.py +1692 -0
  420. ccxt/pro/bithumb.py +368 -0
  421. ccxt/pro/bitmart.py +1449 -0
  422. ccxt/pro/bitmex.py +1656 -0
  423. ccxt/pro/bitopro.py +445 -0
  424. ccxt/pro/bitpanda.py +15 -0
  425. ccxt/pro/bitrue.py +447 -0
  426. ccxt/pro/bitstamp.py +522 -0
  427. ccxt/pro/bitvavo.py +1270 -0
  428. ccxt/pro/blockchaincom.py +738 -0
  429. ccxt/pro/blofin.py +692 -0
  430. ccxt/pro/bybit.py +2000 -0
  431. ccxt/pro/cex.py +1440 -0
  432. ccxt/pro/coinbase.py +678 -0
  433. ccxt/pro/coinbaseadvanced.py +16 -0
  434. ccxt/pro/coinbaseexchange.py +895 -0
  435. ccxt/pro/coinbaseinternational.py +620 -0
  436. ccxt/pro/coincatch.py +1464 -0
  437. ccxt/pro/coincheck.py +199 -0
  438. ccxt/pro/coinex.py +1061 -0
  439. ccxt/pro/coinone.py +395 -0
  440. ccxt/pro/cryptocom.py +947 -0
  441. ccxt/pro/currencycom.py +536 -0
  442. ccxt/pro/deribit.py +892 -0
  443. ccxt/pro/exmo.py +629 -0
  444. ccxt/pro/gate.py +1416 -0
  445. ccxt/pro/gateio.py +15 -0
  446. ccxt/pro/gemini.py +865 -0
  447. ccxt/pro/hashkey.py +802 -0
  448. ccxt/pro/hitbtc.py +1216 -0
  449. ccxt/pro/hollaex.py +563 -0
  450. ccxt/pro/htx.py +2215 -0
  451. ccxt/pro/huobi.py +15 -0
  452. ccxt/pro/huobijp.py +570 -0
  453. ccxt/pro/hyperliquid.py +525 -0
  454. ccxt/pro/idex.py +672 -0
  455. ccxt/pro/independentreserve.py +270 -0
  456. ccxt/pro/kraken.py +1356 -0
  457. ccxt/pro/krakenfutures.py +1492 -0
  458. ccxt/pro/kucoin.py +1133 -0
  459. ccxt/pro/kucoinfutures.py +1081 -0
  460. ccxt/pro/lbank.py +843 -0
  461. ccxt/pro/luno.py +303 -0
  462. ccxt/pro/mexc.py +1122 -0
  463. ccxt/pro/ndax.py +506 -0
  464. ccxt/pro/okcoin.py +698 -0
  465. ccxt/pro/okx.py +1851 -0
  466. ccxt/pro/onetrading.py +1275 -0
  467. ccxt/pro/oxfun.py +950 -0
  468. ccxt/pro/p2b.py +419 -0
  469. ccxt/pro/paradex.py +352 -0
  470. ccxt/pro/phemex.py +1441 -0
  471. ccxt/pro/poloniex.py +1166 -0
  472. ccxt/pro/poloniexfutures.py +990 -0
  473. ccxt/pro/probit.py +551 -0
  474. ccxt/pro/upbit.py +520 -0
  475. ccxt/pro/vertex.py +943 -0
  476. ccxt/pro/wazirx.py +749 -0
  477. ccxt/pro/whitebit.py +864 -0
  478. ccxt/pro/woo.py +1078 -0
  479. ccxt/pro/woofipro.py +1183 -0
  480. ccxt/pro/xt.py +1067 -0
  481. ccxt/probit.py +1734 -0
  482. ccxt/ramzinex.py +476 -0
  483. ccxt/sarmayex.py +357 -0
  484. ccxt/sarrafex.py +478 -0
  485. ccxt/static_dependencies/__init__.py +1 -0
  486. ccxt/static_dependencies/ecdsa/__init__.py +14 -0
  487. ccxt/static_dependencies/ecdsa/_version.py +520 -0
  488. ccxt/static_dependencies/ecdsa/curves.py +56 -0
  489. ccxt/static_dependencies/ecdsa/der.py +221 -0
  490. ccxt/static_dependencies/ecdsa/ecdsa.py +310 -0
  491. ccxt/static_dependencies/ecdsa/ellipticcurve.py +197 -0
  492. ccxt/static_dependencies/ecdsa/keys.py +332 -0
  493. ccxt/static_dependencies/ecdsa/numbertheory.py +531 -0
  494. ccxt/static_dependencies/ecdsa/rfc6979.py +100 -0
  495. ccxt/static_dependencies/ecdsa/util.py +266 -0
  496. ccxt/static_dependencies/ethereum/__init__.py +7 -0
  497. ccxt/static_dependencies/ethereum/abi/__init__.py +16 -0
  498. ccxt/static_dependencies/ethereum/abi/abi.py +19 -0
  499. ccxt/static_dependencies/ethereum/abi/base.py +152 -0
  500. ccxt/static_dependencies/ethereum/abi/codec.py +217 -0
  501. ccxt/static_dependencies/ethereum/abi/constants.py +3 -0
  502. ccxt/static_dependencies/ethereum/abi/decoding.py +565 -0
  503. ccxt/static_dependencies/ethereum/abi/encoding.py +720 -0
  504. ccxt/static_dependencies/ethereum/abi/exceptions.py +139 -0
  505. ccxt/static_dependencies/ethereum/abi/grammar.py +443 -0
  506. ccxt/static_dependencies/ethereum/abi/packed.py +13 -0
  507. ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  508. ccxt/static_dependencies/ethereum/abi/registry.py +643 -0
  509. ccxt/static_dependencies/ethereum/abi/tools/__init__.py +3 -0
  510. ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +230 -0
  511. ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  512. ccxt/static_dependencies/ethereum/abi/utils/numeric.py +83 -0
  513. ccxt/static_dependencies/ethereum/abi/utils/padding.py +27 -0
  514. ccxt/static_dependencies/ethereum/abi/utils/string.py +19 -0
  515. ccxt/static_dependencies/ethereum/account/__init__.py +3 -0
  516. ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +4 -0
  517. ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +239 -0
  518. ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +40 -0
  519. ccxt/static_dependencies/ethereum/account/messages.py +263 -0
  520. ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  521. ccxt/static_dependencies/ethereum/hexbytes/__init__.py +5 -0
  522. ccxt/static_dependencies/ethereum/hexbytes/_utils.py +54 -0
  523. ccxt/static_dependencies/ethereum/hexbytes/main.py +65 -0
  524. ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  525. ccxt/static_dependencies/ethereum/typing/__init__.py +63 -0
  526. ccxt/static_dependencies/ethereum/typing/abi.py +6 -0
  527. ccxt/static_dependencies/ethereum/typing/bls.py +7 -0
  528. ccxt/static_dependencies/ethereum/typing/discovery.py +5 -0
  529. ccxt/static_dependencies/ethereum/typing/encoding.py +7 -0
  530. ccxt/static_dependencies/ethereum/typing/enums.py +17 -0
  531. ccxt/static_dependencies/ethereum/typing/ethpm.py +9 -0
  532. ccxt/static_dependencies/ethereum/typing/evm.py +20 -0
  533. ccxt/static_dependencies/ethereum/typing/networks.py +1122 -0
  534. ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  535. ccxt/static_dependencies/ethereum/utils/__init__.py +115 -0
  536. ccxt/static_dependencies/ethereum/utils/abi.py +72 -0
  537. ccxt/static_dependencies/ethereum/utils/address.py +171 -0
  538. ccxt/static_dependencies/ethereum/utils/applicators.py +151 -0
  539. ccxt/static_dependencies/ethereum/utils/conversions.py +190 -0
  540. ccxt/static_dependencies/ethereum/utils/currency.py +107 -0
  541. ccxt/static_dependencies/ethereum/utils/curried/__init__.py +269 -0
  542. ccxt/static_dependencies/ethereum/utils/debug.py +20 -0
  543. ccxt/static_dependencies/ethereum/utils/decorators.py +132 -0
  544. ccxt/static_dependencies/ethereum/utils/encoding.py +6 -0
  545. ccxt/static_dependencies/ethereum/utils/exceptions.py +4 -0
  546. ccxt/static_dependencies/ethereum/utils/functional.py +75 -0
  547. ccxt/static_dependencies/ethereum/utils/hexadecimal.py +74 -0
  548. ccxt/static_dependencies/ethereum/utils/humanize.py +188 -0
  549. ccxt/static_dependencies/ethereum/utils/logging.py +159 -0
  550. ccxt/static_dependencies/ethereum/utils/module_loading.py +31 -0
  551. ccxt/static_dependencies/ethereum/utils/numeric.py +43 -0
  552. ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  553. ccxt/static_dependencies/ethereum/utils/toolz.py +76 -0
  554. ccxt/static_dependencies/ethereum/utils/types.py +54 -0
  555. ccxt/static_dependencies/ethereum/utils/typing/__init__.py +18 -0
  556. ccxt/static_dependencies/ethereum/utils/typing/misc.py +14 -0
  557. ccxt/static_dependencies/ethereum/utils/units.py +31 -0
  558. ccxt/static_dependencies/keccak/__init__.py +3 -0
  559. ccxt/static_dependencies/keccak/keccak.py +197 -0
  560. ccxt/static_dependencies/lark/__init__.py +38 -0
  561. ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
  562. ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
  563. ccxt/static_dependencies/lark/ast_utils.py +59 -0
  564. ccxt/static_dependencies/lark/common.py +86 -0
  565. ccxt/static_dependencies/lark/exceptions.py +292 -0
  566. ccxt/static_dependencies/lark/grammar.py +130 -0
  567. ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  568. ccxt/static_dependencies/lark/indenter.py +143 -0
  569. ccxt/static_dependencies/lark/lark.py +658 -0
  570. ccxt/static_dependencies/lark/lexer.py +678 -0
  571. ccxt/static_dependencies/lark/load_grammar.py +1428 -0
  572. ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
  573. ccxt/static_dependencies/lark/parser_frontends.py +257 -0
  574. ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  575. ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
  576. ccxt/static_dependencies/lark/parsers/earley.py +314 -0
  577. ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
  578. ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
  579. ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
  580. ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
  581. ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
  582. ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
  583. ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
  584. ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
  585. ccxt/static_dependencies/lark/reconstruct.py +107 -0
  586. ccxt/static_dependencies/lark/tools/__init__.py +70 -0
  587. ccxt/static_dependencies/lark/tools/nearley.py +202 -0
  588. ccxt/static_dependencies/lark/tools/serialize.py +32 -0
  589. ccxt/static_dependencies/lark/tools/standalone.py +196 -0
  590. ccxt/static_dependencies/lark/tree.py +267 -0
  591. ccxt/static_dependencies/lark/tree_matcher.py +186 -0
  592. ccxt/static_dependencies/lark/tree_templates.py +180 -0
  593. ccxt/static_dependencies/lark/utils.py +343 -0
  594. ccxt/static_dependencies/lark/visitors.py +596 -0
  595. ccxt/static_dependencies/marshmallow/__init__.py +81 -0
  596. ccxt/static_dependencies/marshmallow/base.py +65 -0
  597. ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
  598. ccxt/static_dependencies/marshmallow/decorators.py +231 -0
  599. ccxt/static_dependencies/marshmallow/error_store.py +60 -0
  600. ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
  601. ccxt/static_dependencies/marshmallow/fields.py +2114 -0
  602. ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
  603. ccxt/static_dependencies/marshmallow/schema.py +1228 -0
  604. ccxt/static_dependencies/marshmallow/types.py +12 -0
  605. ccxt/static_dependencies/marshmallow/utils.py +378 -0
  606. ccxt/static_dependencies/marshmallow/validate.py +678 -0
  607. ccxt/static_dependencies/marshmallow/warnings.py +2 -0
  608. ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
  609. ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
  610. ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
  611. ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
  612. ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
  613. ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
  614. ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
  615. ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
  616. ccxt/static_dependencies/msgpack/__init__.py +55 -0
  617. ccxt/static_dependencies/msgpack/exceptions.py +48 -0
  618. ccxt/static_dependencies/msgpack/ext.py +168 -0
  619. ccxt/static_dependencies/msgpack/fallback.py +951 -0
  620. ccxt/static_dependencies/parsimonious/__init__.py +10 -0
  621. ccxt/static_dependencies/parsimonious/exceptions.py +105 -0
  622. ccxt/static_dependencies/parsimonious/expressions.py +479 -0
  623. ccxt/static_dependencies/parsimonious/grammar.py +487 -0
  624. ccxt/static_dependencies/parsimonious/nodes.py +325 -0
  625. ccxt/static_dependencies/parsimonious/utils.py +40 -0
  626. ccxt/static_dependencies/starknet/__init__.py +0 -0
  627. ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  628. ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
  629. ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  630. ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
  631. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
  632. ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
  633. ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
  634. ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
  635. ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  636. ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
  637. ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  638. ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
  639. ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
  640. ccxt/static_dependencies/starknet/common.py +15 -0
  641. ccxt/static_dependencies/starknet/constants.py +39 -0
  642. ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  643. ccxt/static_dependencies/starknet/hash/address.py +79 -0
  644. ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
  645. ccxt/static_dependencies/starknet/hash/selector.py +16 -0
  646. ccxt/static_dependencies/starknet/hash/storage.py +12 -0
  647. ccxt/static_dependencies/starknet/hash/utils.py +78 -0
  648. ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  649. ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
  650. ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
  651. ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
  652. ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
  653. ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
  654. ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
  655. ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
  656. ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
  657. ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
  658. ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
  659. ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
  660. ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
  661. ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
  662. ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
  663. ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
  664. ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
  665. ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
  666. ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
  667. ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
  668. ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
  669. ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
  670. ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
  671. ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
  672. ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
  673. ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
  674. ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  675. ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
  676. ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
  677. ccxt/static_dependencies/starknet/utils/schema.py +13 -0
  678. ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
  679. ccxt/static_dependencies/starkware/__init__.py +0 -0
  680. ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  681. ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
  682. ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
  683. ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
  684. ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
  685. ccxt/static_dependencies/sympy/__init__.py +0 -0
  686. ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  687. ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
  688. ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  689. ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
  690. ccxt/static_dependencies/sympy/external/importtools.py +187 -0
  691. ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
  692. ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
  693. ccxt/static_dependencies/toolz/__init__.py +26 -0
  694. ccxt/static_dependencies/toolz/_signatures.py +784 -0
  695. ccxt/static_dependencies/toolz/_version.py +520 -0
  696. ccxt/static_dependencies/toolz/compatibility.py +30 -0
  697. ccxt/static_dependencies/toolz/curried/__init__.py +101 -0
  698. ccxt/static_dependencies/toolz/curried/exceptions.py +22 -0
  699. ccxt/static_dependencies/toolz/curried/operator.py +22 -0
  700. ccxt/static_dependencies/toolz/dicttoolz.py +339 -0
  701. ccxt/static_dependencies/toolz/functoolz.py +1049 -0
  702. ccxt/static_dependencies/toolz/itertoolz.py +1057 -0
  703. ccxt/static_dependencies/toolz/recipes.py +46 -0
  704. ccxt/static_dependencies/toolz/utils.py +9 -0
  705. ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  706. ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
  707. ccxt/tabdeal.py +364 -0
  708. ccxt/test/__init__.py +3 -0
  709. ccxt/test/base/__init__.py +29 -0
  710. ccxt/test/base/test_account.py +26 -0
  711. ccxt/test/base/test_balance.py +56 -0
  712. ccxt/test/base/test_borrow_interest.py +35 -0
  713. ccxt/test/base/test_borrow_rate.py +32 -0
  714. ccxt/test/base/test_calculate_fee.py +51 -0
  715. ccxt/test/base/test_crypto.py +127 -0
  716. ccxt/test/base/test_currency.py +76 -0
  717. ccxt/test/base/test_datetime.py +109 -0
  718. ccxt/test/base/test_decimal_to_precision.py +392 -0
  719. ccxt/test/base/test_deep_extend.py +68 -0
  720. ccxt/test/base/test_deposit_withdrawal.py +50 -0
  721. ccxt/test/base/test_exchange_datetime_functions.py +76 -0
  722. ccxt/test/base/test_funding_rate_history.py +29 -0
  723. ccxt/test/base/test_last_price.py +31 -0
  724. ccxt/test/base/test_ledger_entry.py +45 -0
  725. ccxt/test/base/test_ledger_item.py +48 -0
  726. ccxt/test/base/test_leverage_tier.py +33 -0
  727. ccxt/test/base/test_liquidation.py +50 -0
  728. ccxt/test/base/test_margin_mode.py +24 -0
  729. ccxt/test/base/test_margin_modification.py +35 -0
  730. ccxt/test/base/test_market.py +193 -0
  731. ccxt/test/base/test_number.py +411 -0
  732. ccxt/test/base/test_ohlcv.py +33 -0
  733. ccxt/test/base/test_open_interest.py +32 -0
  734. ccxt/test/base/test_order.py +64 -0
  735. ccxt/test/base/test_order_book.py +69 -0
  736. ccxt/test/base/test_position.py +60 -0
  737. ccxt/test/base/test_shared_methods.py +353 -0
  738. ccxt/test/base/test_status.py +24 -0
  739. ccxt/test/base/test_throttle.py +126 -0
  740. ccxt/test/base/test_ticker.py +92 -0
  741. ccxt/test/base/test_trade.py +47 -0
  742. ccxt/test/base/test_trading_fee.py +26 -0
  743. ccxt/test/base/test_transaction.py +39 -0
  744. ccxt/test/test_async.py +1649 -0
  745. ccxt/test/test_sync.py +1648 -0
  746. ccxt/test/tests_async.py +1558 -0
  747. ccxt/test/tests_helpers.py +287 -0
  748. ccxt/test/tests_init.py +39 -0
  749. ccxt/test/tests_sync.py +1555 -0
  750. ccxt/tetherland.py +349 -0
  751. ccxt/timex.py +1593 -0
  752. ccxt/tokocrypto.py +2405 -0
  753. ccxt/tradeogre.py +608 -0
  754. ccxt/twox.py +326 -0
  755. ccxt/ubitex.py +409 -0
  756. ccxt/upbit.py +1833 -0
  757. ccxt/vertex.py +2922 -0
  758. ccxt/wallex.py +445 -0
  759. ccxt/wavesexchange.py +2472 -0
  760. ccxt/wazirx.py +1224 -0
  761. ccxt/whitebit.py +2469 -0
  762. ccxt/woo.py +3114 -0
  763. ccxt/woofipro.py +2533 -0
  764. ccxt/xt.py +4453 -0
  765. ccxt/yobit.py +1283 -0
  766. ccxt/zaif.py +725 -0
  767. ccxt/zonda.py +1828 -0
  768. ccxt_ir-4.3.46.0.1.dist-info/LICENSE.txt +21 -0
  769. ccxt_ir-4.3.46.0.1.dist-info/METADATA +655 -0
  770. ccxt_ir-4.3.46.0.1.dist-info/RECORD +772 -0
  771. ccxt_ir-4.3.46.0.1.dist-info/WHEEL +6 -0
  772. ccxt_ir-4.3.46.0.1.dist-info/top_level.txt +1 -0
ccxt/bitso.py ADDED
@@ -0,0 +1,1670 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
+ # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
+
6
+ from ccxt.base.exchange import Exchange
7
+ from ccxt.abstract.bitso import ImplicitAPI
8
+ import hashlib
9
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Trade, TradingFees, Transaction
10
+ from typing import List
11
+ from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import AuthenticationError
13
+ from ccxt.base.errors import ArgumentsRequired
14
+ from ccxt.base.errors import BadRequest
15
+ from ccxt.base.errors import OrderNotFound
16
+ from ccxt.base.errors import NotSupported
17
+ from ccxt.base.errors import InvalidNonce
18
+ from ccxt.base.decimal_to_precision import TICK_SIZE
19
+ from ccxt.base.precise import Precise
20
+
21
+
22
+ class bitso(Exchange, ImplicitAPI):
23
+
24
+ def describe(self):
25
+ return self.deep_extend(super(bitso, self).describe(), {
26
+ 'id': 'bitso',
27
+ 'name': 'Bitso',
28
+ 'countries': ['MX'], # Mexico
29
+ 'rateLimit': 2000, # 30 requests per minute
30
+ 'version': 'v3',
31
+ 'has': {
32
+ 'CORS': None,
33
+ 'spot': True,
34
+ 'margin': False,
35
+ 'swap': False,
36
+ 'future': False,
37
+ 'option': False,
38
+ 'addMargin': False,
39
+ 'cancelAllOrders': True,
40
+ 'cancelOrder': True,
41
+ 'cancelOrders': True,
42
+ 'closeAllPositions': False,
43
+ 'closePosition': False,
44
+ 'createDepositAddress': False,
45
+ 'createOrder': True,
46
+ 'createReduceOnlyOrder': False,
47
+ 'fetchAccounts': False,
48
+ 'fetchBalance': True,
49
+ 'fetchBorrowRateHistories': False,
50
+ 'fetchBorrowRateHistory': False,
51
+ 'fetchCrossBorrowRate': False,
52
+ 'fetchCrossBorrowRates': False,
53
+ 'fetchDeposit': True,
54
+ 'fetchDepositAddress': True,
55
+ 'fetchDepositAddresses': False,
56
+ 'fetchDeposits': True,
57
+ 'fetchDepositsWithdrawals': False,
58
+ 'fetchDepositWithdrawFee': 'emulated',
59
+ 'fetchDepositWithdrawFees': True,
60
+ 'fetchFundingHistory': False,
61
+ 'fetchFundingRate': False,
62
+ 'fetchFundingRateHistory': False,
63
+ 'fetchFundingRates': False,
64
+ 'fetchIndexOHLCV': False,
65
+ 'fetchIsolatedBorrowRate': False,
66
+ 'fetchIsolatedBorrowRates': False,
67
+ 'fetchLedger': True,
68
+ 'fetchLeverage': False,
69
+ 'fetchMarginMode': False,
70
+ 'fetchMarkets': True,
71
+ 'fetchMarkOHLCV': False,
72
+ 'fetchMyTrades': True,
73
+ 'fetchOHLCV': True,
74
+ 'fetchOpenInterestHistory': False,
75
+ 'fetchOpenOrders': True,
76
+ 'fetchOrder': True,
77
+ 'fetchOrderBook': True,
78
+ 'fetchOrderTrades': True,
79
+ 'fetchPosition': False,
80
+ 'fetchPositionHistory': False,
81
+ 'fetchPositionMode': False,
82
+ 'fetchPositions': False,
83
+ 'fetchPositionsForSymbol': False,
84
+ 'fetchPositionsHistory': False,
85
+ 'fetchPositionsRisk': False,
86
+ 'fetchPremiumIndexOHLCV': False,
87
+ 'fetchTicker': True,
88
+ 'fetchTickers': False,
89
+ 'fetchTime': False,
90
+ 'fetchTrades': True,
91
+ 'fetchTradingFee': False,
92
+ 'fetchTradingFees': True,
93
+ 'fetchTransactionFee': False,
94
+ 'fetchTransactionFees': True,
95
+ 'fetchTransactions': False,
96
+ 'fetchTransfer': False,
97
+ 'fetchTransfers': False,
98
+ 'reduceMargin': False,
99
+ 'setLeverage': False,
100
+ 'setMarginMode': False,
101
+ 'setPositionMode': False,
102
+ 'transfer': False,
103
+ 'withdraw': True,
104
+ },
105
+ 'urls': {
106
+ 'logo': 'https://user-images.githubusercontent.com/51840849/87295554-11f98280-c50e-11ea-80d6-15b3bafa8cbf.jpg',
107
+ 'api': {
108
+ 'rest': 'https://api.bitso.com',
109
+ },
110
+ 'www': 'https://bitso.com',
111
+ 'doc': 'https://bitso.com/api_info',
112
+ 'fees': 'https://bitso.com/fees',
113
+ 'referral': 'https://bitso.com/?ref=itej',
114
+ },
115
+ 'precisionMode': TICK_SIZE,
116
+ 'options': {
117
+ 'precision': {
118
+ 'XRP': 0.000001,
119
+ 'MXN': 0.01,
120
+ 'TUSD': 0.01,
121
+ },
122
+ 'defaultPrecision': 0.00000001,
123
+ },
124
+ 'timeframes': {
125
+ '1m': '60',
126
+ '5m': '300',
127
+ '15m': '900',
128
+ '30m': '1800',
129
+ '1h': '3600',
130
+ '4h': '14400',
131
+ '12h': '43200',
132
+ '1d': '86400',
133
+ '1w': '604800',
134
+ },
135
+ 'api': {
136
+ 'public': {
137
+ 'get': [
138
+ 'available_books',
139
+ 'ticker',
140
+ 'order_book',
141
+ 'trades',
142
+ 'ohlc',
143
+ ],
144
+ },
145
+ 'private': {
146
+ 'get': [
147
+ 'account_status',
148
+ 'balance',
149
+ 'fees',
150
+ 'fundings',
151
+ 'fundings/{fid}',
152
+ 'funding_destination',
153
+ 'kyc_documents',
154
+ 'ledger',
155
+ 'ledger/trades',
156
+ 'ledger/fees',
157
+ 'ledger/fundings',
158
+ 'ledger/withdrawals',
159
+ 'mx_bank_codes',
160
+ 'open_orders',
161
+ 'order_trades/{oid}',
162
+ 'orders/{oid}',
163
+ 'user_trades',
164
+ 'user_trades/{tid}',
165
+ 'withdrawals/',
166
+ 'withdrawals/{wid}',
167
+ ],
168
+ 'post': [
169
+ 'bitcoin_withdrawal',
170
+ 'debit_card_withdrawal',
171
+ 'ether_withdrawal',
172
+ 'orders',
173
+ 'phone_number',
174
+ 'phone_verification',
175
+ 'phone_withdrawal',
176
+ 'spei_withdrawal',
177
+ 'ripple_withdrawal',
178
+ 'bcash_withdrawal',
179
+ 'litecoin_withdrawal',
180
+ ],
181
+ 'delete': [
182
+ 'orders',
183
+ 'orders/{oid}',
184
+ 'orders/all',
185
+ ],
186
+ },
187
+ },
188
+ 'exceptions': {
189
+ '0201': AuthenticationError, # Invalid Nonce or Invalid Credentials
190
+ '104': InvalidNonce, # Cannot perform request - nonce must be higher than 1520307203724237
191
+ '0304': BadRequest, # {"success":false,"error":{"code":"0304","message":"The field time_bucket() is either invalid or missing"}}
192
+ },
193
+ })
194
+
195
+ def fetch_ledger(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
196
+ """
197
+ fetch the history of changes, actions done by the user or operations that altered balance of the user
198
+ :param str code: unified currency code, default is None
199
+ :param int [since]: timestamp in ms of the earliest ledger entry, default is None
200
+ :param int [limit]: max number of ledger entrys to return, default is None
201
+ :param dict [params]: extra parameters specific to the exchange API endpoint
202
+ :returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger-structure>`
203
+ """
204
+ request: dict = {}
205
+ if limit is not None:
206
+ request['limit'] = limit
207
+ response = self.privateGetLedger(self.extend(request, params))
208
+ #
209
+ # {
210
+ # "success": True,
211
+ # "payload": [{
212
+ # "eid": "2510b3e2bc1c87f584500a18084f35ed",
213
+ # "created_at": "2022-06-08T12:21:42+0000",
214
+ # "balance_updates": [{
215
+ # "amount": "0.00080000",
216
+ # "currency": "btc"
217
+ # }],
218
+ # "operation": "funding",
219
+ # "details": {
220
+ # "network": "btc",
221
+ # "method": "btc",
222
+ # "method_name": "Bitcoin",
223
+ # "asset": "btc",
224
+ # "protocol": "btc",
225
+ # "integration": "bitgo-v2",
226
+ # "fid": "6112c6369100d6ecceb7f54f17cf0511"
227
+ # }
228
+ # }]
229
+ # }
230
+ #
231
+ payload = self.safe_value(response, 'payload', [])
232
+ currency = self.safe_currency(code)
233
+ return self.parse_ledger(payload, currency, since, limit)
234
+
235
+ def parse_ledger_entry_type(self, type):
236
+ types: dict = {
237
+ 'funding': 'transaction',
238
+ 'withdrawal': 'transaction',
239
+ 'trade': 'trade',
240
+ 'fee': 'fee',
241
+ }
242
+ return self.safe_string(types, type, type)
243
+
244
+ def parse_ledger_entry(self, item: dict, currency: Currency = None):
245
+ #
246
+ # {
247
+ # "eid": "2510b3e2bc1c87f584500a18084f35ed",
248
+ # "created_at": "2022-06-08T12:21:42+0000",
249
+ # "balance_updates": [{
250
+ # "amount": "0.00080000",
251
+ # "currency": "btc"
252
+ # }],
253
+ # "operation": "funding",
254
+ # "details": {
255
+ # "network": "btc",
256
+ # "method": "btc",
257
+ # "method_name": "Bitcoin",
258
+ # "asset": "btc",
259
+ # "protocol": "btc",
260
+ # "integration": "bitgo-v2",
261
+ # "fid": "6112c6369100d6ecceb7f54f17cf0511"
262
+ # }
263
+ # }
264
+ #
265
+ # trade
266
+ # {
267
+ # "eid": "8976c6053f078f704f037d82a813678a",
268
+ # "created_at": "2022-06-08T17:01:48+0000",
269
+ # "balance_updates": [{
270
+ # "amount": "59.21320500",
271
+ # "currency": "mxn"
272
+ # },
273
+ # {
274
+ # "amount": "-0.00010000",
275
+ # "currency": "btc"
276
+ # }
277
+ # ],
278
+ # "operation": "trade",
279
+ # "details": {
280
+ # "tid": "72145428",
281
+ # "oid": "JO5TZmMZjzjlZDyT"
282
+ # }
283
+ # }
284
+ #
285
+ # fee
286
+ # {
287
+ # "eid": "cbbb3c8d4e41723d25d2850dcb7c3c74",
288
+ # "created_at": "2022-06-08T17:01:48+0000",
289
+ # "balance_updates": [{
290
+ # "amount": "-0.38488583",
291
+ # "currency": "mxn"
292
+ # }],
293
+ # "operation": "fee",
294
+ # "details": {
295
+ # "tid": "72145428",
296
+ # "oid": "JO5TZmMZjzjlZDyT"
297
+ # }
298
+ # }
299
+ operation = self.safe_string(item, 'operation')
300
+ type = self.parse_ledger_entry_type(operation)
301
+ balanceUpdates = self.safe_value(item, 'balance_updates', [])
302
+ firstBalance = self.safe_value(balanceUpdates, 0, {})
303
+ direction = None
304
+ fee = None
305
+ amount = self.safe_string(firstBalance, 'amount')
306
+ currencyId = self.safe_string(firstBalance, 'currency')
307
+ code = self.safe_currency_code(currencyId, currency)
308
+ details = self.safe_value(item, 'details', {})
309
+ referenceId = self.safe_string_2(details, 'fid', 'wid')
310
+ if referenceId is None:
311
+ referenceId = self.safe_string(details, 'tid')
312
+ if operation == 'funding':
313
+ direction = 'in'
314
+ elif operation == 'withdrawal':
315
+ direction = 'out'
316
+ elif operation == 'trade':
317
+ direction = None
318
+ elif operation == 'fee':
319
+ direction = 'out'
320
+ cost = Precise.string_abs(amount)
321
+ fee = {
322
+ 'cost': cost,
323
+ 'currency': currency,
324
+ }
325
+ timestamp = self.parse8601(self.safe_string(item, 'created_at'))
326
+ return self.safe_ledger_entry({
327
+ 'id': self.safe_string(item, 'eid'),
328
+ 'direction': direction,
329
+ 'account': None,
330
+ 'referenceId': referenceId,
331
+ 'referenceAccount': None,
332
+ 'type': type,
333
+ 'currency': code,
334
+ 'amount': amount,
335
+ 'timestamp': timestamp,
336
+ 'datetime': self.iso8601(timestamp),
337
+ 'before': None,
338
+ 'after': None,
339
+ 'status': 'ok',
340
+ 'fee': fee,
341
+ 'info': item,
342
+ }, currency)
343
+
344
+ def fetch_markets(self, params={}) -> List[Market]:
345
+ """
346
+ retrieves data on all markets for bitso
347
+ :see: https://docs.bitso.com/bitso-api/docs/list-available-books
348
+ :param dict [params]: extra parameters specific to the exchange API endpoint
349
+ :returns dict[]: an array of objects representing market data
350
+ """
351
+ response = self.publicGetAvailableBooks(params)
352
+ #
353
+ # {
354
+ # "success":true,
355
+ # "payload":[
356
+ # {
357
+ # "book":"btc_mxn",
358
+ # "minimum_price":"500",
359
+ # "maximum_price":"10000000",
360
+ # "minimum_amount":"0.00005",
361
+ # "maximum_amount":"500",
362
+ # "minimum_value":"5",
363
+ # "maximum_value":"10000000",
364
+ # "tick_size":"0.01",
365
+ # "fees":{
366
+ # "flat_rate":{"maker":"0.500","taker":"0.650"},
367
+ # "structure":[
368
+ # {"volume":"1500000","maker":"0.00500","taker":"0.00650"},
369
+ # {"volume":"2000000","maker":"0.00490","taker":"0.00637"},
370
+ # {"volume":"5000000","maker":"0.00480","taker":"0.00624"},
371
+ # {"volume":"7000000","maker":"0.00440","taker":"0.00572"},
372
+ # {"volume":"10000000","maker":"0.00420","taker":"0.00546"},
373
+ # {"volume":"15000000","maker":"0.00400","taker":"0.00520"},
374
+ # {"volume":"35000000","maker":"0.00370","taker":"0.00481"},
375
+ # {"volume":"50000000","maker":"0.00300","taker":"0.00390"},
376
+ # {"volume":"150000000","maker":"0.00200","taker":"0.00260"},
377
+ # {"volume":"250000000","maker":"0.00100","taker":"0.00130"},
378
+ # {"volume":"9999999999","maker":"0.00000","taker":"0.00130"},
379
+ # ]
380
+ # }
381
+ # },
382
+ # ]
383
+ # }
384
+ markets = self.safe_value(response, 'payload', [])
385
+ result = []
386
+ for i in range(0, len(markets)):
387
+ market = markets[i]
388
+ id = self.safe_string(market, 'book')
389
+ baseId, quoteId = id.split('_')
390
+ base = baseId.upper()
391
+ quote = quoteId.upper()
392
+ base = self.safe_currency_code(base)
393
+ quote = self.safe_currency_code(quote)
394
+ fees = self.safe_value(market, 'fees', {})
395
+ flatRate = self.safe_value(fees, 'flat_rate', {})
396
+ takerString = self.safe_string(flatRate, 'taker')
397
+ makerString = self.safe_string(flatRate, 'maker')
398
+ taker = self.parse_number(Precise.string_div(takerString, '100'))
399
+ maker = self.parse_number(Precise.string_div(makerString, '100'))
400
+ feeTiers = self.safe_value(fees, 'structure', [])
401
+ fee = {
402
+ 'taker': taker,
403
+ 'maker': maker,
404
+ 'percentage': True,
405
+ 'tierBased': True,
406
+ }
407
+ takerFees = []
408
+ makerFees = []
409
+ for j in range(0, len(feeTiers)):
410
+ tier = feeTiers[j]
411
+ volume = self.safe_number(tier, 'volume')
412
+ takerFee = self.safe_number(tier, 'taker')
413
+ makerFee = self.safe_number(tier, 'maker')
414
+ takerFees.append([volume, takerFee])
415
+ makerFees.append([volume, makerFee])
416
+ if j == 0:
417
+ fee['taker'] = takerFee
418
+ fee['maker'] = makerFee
419
+ tiers: dict = {
420
+ 'taker': takerFees,
421
+ 'maker': makerFees,
422
+ }
423
+ fee['tiers'] = tiers
424
+ # TODO: precisions can be also set from https://bitso.com/api/v3/catalogues ->available_currency_conversions->currencies(or ->currencies->metadata) or https://bitso.com/api/v3/get_exchange_rates/mxn
425
+ defaultPricePrecision = self.safe_number(self.options['precision'], quote, self.options['defaultPrecision'])
426
+ result.append(self.extend({
427
+ 'id': id,
428
+ 'symbol': base + '/' + quote,
429
+ 'base': base,
430
+ 'quote': quote,
431
+ 'settle': None,
432
+ 'baseId': baseId,
433
+ 'quoteId': quoteId,
434
+ 'settleId': None,
435
+ 'type': 'spot',
436
+ 'spot': True,
437
+ 'margin': False,
438
+ 'swap': False,
439
+ 'future': False,
440
+ 'option': False,
441
+ 'active': None,
442
+ 'contract': False,
443
+ 'linear': None,
444
+ 'inverse': None,
445
+ 'taker': taker,
446
+ 'maker': maker,
447
+ 'contractSize': None,
448
+ 'expiry': None,
449
+ 'expiryDatetime': None,
450
+ 'strike': None,
451
+ 'optionType': None,
452
+ 'precision': {
453
+ 'amount': self.safe_number(self.options['precision'], base, self.options['defaultPrecision']),
454
+ 'price': self.safe_number(market, 'tick_size', defaultPricePrecision),
455
+ },
456
+ 'limits': {
457
+ 'leverage': {
458
+ 'min': None,
459
+ 'max': None,
460
+ },
461
+ 'amount': {
462
+ 'min': self.safe_number(market, 'minimum_amount'),
463
+ 'max': self.safe_number(market, 'maximum_amount'),
464
+ },
465
+ 'price': {
466
+ 'min': self.safe_number(market, 'minimum_price'),
467
+ 'max': self.safe_number(market, 'maximum_price'),
468
+ },
469
+ 'cost': {
470
+ 'min': self.safe_number(market, 'minimum_value'),
471
+ 'max': self.safe_number(market, 'maximum_value'),
472
+ },
473
+ },
474
+ 'created': None,
475
+ 'info': market,
476
+ }, fee))
477
+ return result
478
+
479
+ def parse_balance(self, response) -> Balances:
480
+ payload = self.safe_value(response, 'payload', {})
481
+ balances = self.safe_value(payload, 'balances', [])
482
+ result: dict = {
483
+ 'info': response,
484
+ 'timestamp': None,
485
+ 'datetime': None,
486
+ }
487
+ for i in range(0, len(balances)):
488
+ balance = balances[i]
489
+ currencyId = self.safe_string(balance, 'currency')
490
+ code = self.safe_currency_code(currencyId)
491
+ account = self.account()
492
+ account['free'] = self.safe_string(balance, 'available')
493
+ account['used'] = self.safe_string(balance, 'locked')
494
+ account['total'] = self.safe_string(balance, 'total')
495
+ result[code] = account
496
+ return self.safe_balance(result)
497
+
498
+ def fetch_balance(self, params={}) -> Balances:
499
+ """
500
+ query for balance and get the amount of funds available for trading or funds locked in orders
501
+ :see: https://docs.bitso.com/bitso-api/docs/get-account-balance
502
+ :param dict [params]: extra parameters specific to the exchange API endpoint
503
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
504
+ """
505
+ self.load_markets()
506
+ response = self.privateGetBalance(params)
507
+ #
508
+ # {
509
+ # "success": True,
510
+ # "payload": {
511
+ # "balances": [
512
+ # {
513
+ # "currency": "bat",
514
+ # "available": "0.00000000",
515
+ # "locked": "0.00000000",
516
+ # "total": "0.00000000",
517
+ # "pending_deposit": "0.00000000",
518
+ # "pending_withdrawal": "0.00000000"
519
+ # },
520
+ # {
521
+ # "currency": "bch",
522
+ # "available": "0.00000000",
523
+ # "locked": "0.00000000",
524
+ # "total": "0.00000000",
525
+ # "pending_deposit": "0.00000000",
526
+ # "pending_withdrawal": "0.00000000"
527
+ # },
528
+ # ],
529
+ # },
530
+ # }
531
+ #
532
+ return self.parse_balance(response)
533
+
534
+ def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
535
+ """
536
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
537
+ :see: https://docs.bitso.com/bitso-api/docs/list-order-book
538
+ :param str symbol: unified symbol of the market to fetch the order book for
539
+ :param int [limit]: the maximum amount of order book entries to return
540
+ :param dict [params]: extra parameters specific to the exchange API endpoint
541
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
542
+ """
543
+ self.load_markets()
544
+ market = self.market(symbol)
545
+ request: dict = {
546
+ 'book': market['id'],
547
+ }
548
+ response = self.publicGetOrderBook(self.extend(request, params))
549
+ orderbook = self.safe_value(response, 'payload')
550
+ timestamp = self.parse8601(self.safe_string(orderbook, 'updated_at'))
551
+ return self.parse_order_book(orderbook, market['symbol'], timestamp, 'bids', 'asks', 'price', 'amount')
552
+
553
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
554
+ #
555
+ # {
556
+ # "high":"37446.85",
557
+ # "last":"36599.54",
558
+ # "created_at":"2022-01-28T12:06:11+00:00",
559
+ # "book":"btc_usdt",
560
+ # "volume":"7.29075419",
561
+ # "vwap":"36579.1564400307",
562
+ # "low":"35578.52",
563
+ # "ask":"36574.76",
564
+ # "bid":"36538.22",
565
+ # "change_24":"-105.64"
566
+ # }
567
+ #
568
+ symbol = self.safe_symbol(None, market)
569
+ timestamp = self.parse8601(self.safe_string(ticker, 'created_at'))
570
+ vwap = self.safe_string(ticker, 'vwap')
571
+ baseVolume = self.safe_string(ticker, 'volume')
572
+ quoteVolume = Precise.string_mul(baseVolume, vwap)
573
+ last = self.safe_string(ticker, 'last')
574
+ return self.safe_ticker({
575
+ 'symbol': symbol,
576
+ 'timestamp': timestamp,
577
+ 'datetime': self.iso8601(timestamp),
578
+ 'high': self.safe_string(ticker, 'high'),
579
+ 'low': self.safe_string(ticker, 'low'),
580
+ 'bid': self.safe_string(ticker, 'bid'),
581
+ 'bidVolume': None,
582
+ 'ask': self.safe_string(ticker, 'ask'),
583
+ 'askVolume': None,
584
+ 'vwap': vwap,
585
+ 'open': None,
586
+ 'close': last,
587
+ 'last': last,
588
+ 'previousClose': None,
589
+ 'change': None,
590
+ 'percentage': None,
591
+ 'average': None,
592
+ 'baseVolume': baseVolume,
593
+ 'quoteVolume': quoteVolume,
594
+ 'info': ticker,
595
+ }, market)
596
+
597
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
598
+ """
599
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
600
+ :see: https://docs.bitso.com/bitso-api/docs/ticker
601
+ :param str symbol: unified symbol of the market to fetch the ticker for
602
+ :param dict [params]: extra parameters specific to the exchange API endpoint
603
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
604
+ """
605
+ self.load_markets()
606
+ market = self.market(symbol)
607
+ request: dict = {
608
+ 'book': market['id'],
609
+ }
610
+ response = self.publicGetTicker(self.extend(request, params))
611
+ ticker = self.safe_value(response, 'payload')
612
+ #
613
+ # {
614
+ # "success":true,
615
+ # "payload":{
616
+ # "high":"37446.85",
617
+ # "last":"37051.96",
618
+ # "created_at":"2022-01-28T17:03:29+00:00",
619
+ # "book":"btc_usdt",
620
+ # "volume":"6.16176186",
621
+ # "vwap":"36582.6293169472",
622
+ # "low":"35578.52",
623
+ # "ask":"37083.62",
624
+ # "bid":"37039.66",
625
+ # "change_24":"478.45"
626
+ # }
627
+ # }
628
+ #
629
+ return self.parse_ticker(ticker, market)
630
+
631
+ def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
632
+ """
633
+ fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
634
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
635
+ :param str timeframe: the length of time each candle represents
636
+ :param int [since]: timestamp in ms of the earliest candle to fetch
637
+ :param int [limit]: the maximum amount of candles to fetch
638
+ :param dict [params]: extra parameters specific to the exchange API endpoint
639
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
640
+ """
641
+ self.load_markets()
642
+ market = self.market(symbol)
643
+ request: dict = {
644
+ 'book': market['id'],
645
+ 'time_bucket': self.safe_string(self.timeframes, timeframe, timeframe),
646
+ }
647
+ if since is not None:
648
+ request['start'] = since
649
+ if limit is not None:
650
+ duration = self.parse_timeframe(timeframe)
651
+ request['end'] = self.sum(since, duration * limit * 1000)
652
+ elif limit is not None:
653
+ now = self.milliseconds()
654
+ request['end'] = now
655
+ request['start'] = now - self.parse_timeframe(timeframe) * 1000 * limit
656
+ response = self.publicGetOhlc(self.extend(request, params))
657
+ #
658
+ # {
659
+ # "success":true,
660
+ # "payload": [
661
+ # {
662
+ # "bucket_start_time":1648219140000,
663
+ # "first_trade_time":1648219154990,
664
+ # "last_trade_time":1648219189441,
665
+ # "first_rate":"44958.60",
666
+ # "last_rate":"44979.88",
667
+ # "min_rate":"44957.33",
668
+ # "max_rate":"44979.88",
669
+ # "trade_count":8,
670
+ # "volume":"0.00082814",
671
+ # "vwap":"44965.02"
672
+ # },
673
+ # ]
674
+ # }
675
+ #
676
+ payload = self.safe_list(response, 'payload', [])
677
+ return self.parse_ohlcvs(payload, market, timeframe, since, limit)
678
+
679
+ def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
680
+ #
681
+ # {
682
+ # "bucket_start_time":1648219140000,
683
+ # "first_trade_time":1648219154990,
684
+ # "last_trade_time":1648219189441,
685
+ # "first_rate":"44958.60",
686
+ # "last_rate":"44979.88",
687
+ # "min_rate":"44957.33",
688
+ # "max_rate":"44979.88",
689
+ # "trade_count":8,
690
+ # "volume":"0.00082814",
691
+ # "vwap":"44965.02"
692
+ # },
693
+ #
694
+ return [
695
+ self.safe_integer(ohlcv, 'bucket_start_time'),
696
+ self.safe_number(ohlcv, 'first_rate'),
697
+ self.safe_number(ohlcv, 'max_rate'),
698
+ self.safe_number(ohlcv, 'min_rate'),
699
+ self.safe_number(ohlcv, 'last_rate'),
700
+ self.safe_number(ohlcv, 'volume'),
701
+ ]
702
+
703
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
704
+ #
705
+ # fetchTrades(public)
706
+ #
707
+ # {
708
+ # "book": "btc_usdt",
709
+ # "created_at": "2021-11-24T12:14:53+0000",
710
+ # "amount": "0.00026562",
711
+ # "maker_side": "sell",
712
+ # "price": "56471.55",
713
+ # "tid": "52557338"
714
+ # }
715
+ #
716
+ # fetchMyTrades(private)
717
+ #
718
+ # {
719
+ # "book": "btc_usdt",
720
+ # "created_at": "2021-11-24T12:31:03+0000",
721
+ # "minor": "11.30356000",
722
+ # "major": "-0.00020000",
723
+ # "fees_amount": "0.01119052",
724
+ # "fees_currency": "usdt",
725
+ # "minor_currency": "usdt",
726
+ # "major_currency": "btc",
727
+ # "oid": "djTzMIWx2Vi3iMjl",
728
+ # "tid": "52559051",
729
+ # "price": "56517.80",
730
+ # "side": "sell",
731
+ # "maker_side": "buy"
732
+ # }
733
+ #
734
+ # fetchOrderTrades(private)
735
+ #
736
+ # {
737
+ # "book": "btc_usdt",
738
+ # "created_at": "2021-11-24T12:30:52+0000",
739
+ # "minor": "-11.33047916",
740
+ # "major": "0.00020020",
741
+ # "fees_amount": "0.00000020",
742
+ # "fees_currency": "btc",
743
+ # "minor_currency": "usdt",
744
+ # "major_currency": "btc",
745
+ # "oid": "O0D2zcljjjQF5xlG",
746
+ # "tid": "52559030",
747
+ # "price": "56595.80",
748
+ # "side": "buy",
749
+ # "maker_side": "sell"
750
+ # }
751
+ #
752
+ timestamp = self.parse8601(self.safe_string(trade, 'created_at'))
753
+ marketId = self.safe_string(trade, 'book')
754
+ symbol = self.safe_symbol(marketId, market, '_')
755
+ side = self.safe_string(trade, 'side')
756
+ makerSide = self.safe_string(trade, 'maker_side')
757
+ takerOrMaker = None
758
+ if side is not None:
759
+ if side == makerSide:
760
+ takerOrMaker = 'maker'
761
+ else:
762
+ takerOrMaker = 'taker'
763
+ else:
764
+ if makerSide == 'buy':
765
+ side = 'sell'
766
+ else:
767
+ side = 'buy'
768
+ amount = self.safe_string_2(trade, 'amount', 'major')
769
+ if amount is not None:
770
+ amount = Precise.string_abs(amount)
771
+ fee = None
772
+ feeCost = self.safe_string(trade, 'fees_amount')
773
+ if feeCost is not None:
774
+ feeCurrencyId = self.safe_string(trade, 'fees_currency')
775
+ feeCurrency = self.safe_currency_code(feeCurrencyId)
776
+ fee = {
777
+ 'cost': feeCost,
778
+ 'currency': feeCurrency,
779
+ }
780
+ cost = self.safe_string(trade, 'minor')
781
+ if cost is not None:
782
+ cost = Precise.string_abs(cost)
783
+ price = self.safe_string(trade, 'price')
784
+ orderId = self.safe_string(trade, 'oid')
785
+ id = self.safe_string(trade, 'tid')
786
+ return self.safe_trade({
787
+ 'id': id,
788
+ 'info': trade,
789
+ 'timestamp': timestamp,
790
+ 'datetime': self.iso8601(timestamp),
791
+ 'symbol': symbol,
792
+ 'order': orderId,
793
+ 'type': None,
794
+ 'side': side,
795
+ 'takerOrMaker': takerOrMaker,
796
+ 'price': price,
797
+ 'amount': amount,
798
+ 'cost': cost,
799
+ 'fee': fee,
800
+ }, market)
801
+
802
+ def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
803
+ """
804
+ get the list of most recent trades for a particular symbol
805
+ :see: https://docs.bitso.com/bitso-api/docs/list-trades
806
+ :param str symbol: unified symbol of the market to fetch trades for
807
+ :param int [since]: timestamp in ms of the earliest trade to fetch
808
+ :param int [limit]: the maximum amount of trades to fetch
809
+ :param dict [params]: extra parameters specific to the exchange API endpoint
810
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
811
+ """
812
+ self.load_markets()
813
+ market = self.market(symbol)
814
+ request: dict = {
815
+ 'book': market['id'],
816
+ }
817
+ response = self.publicGetTrades(self.extend(request, params))
818
+ return self.parse_trades(response['payload'], market, since, limit)
819
+
820
+ def fetch_trading_fees(self, params={}) -> TradingFees:
821
+ """
822
+ fetch the trading fees for multiple markets
823
+ :see: https://docs.bitso.com/bitso-api/docs/list-fees
824
+ :param dict [params]: extra parameters specific to the exchange API endpoint
825
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
826
+ """
827
+ self.load_markets()
828
+ response = self.privateGetFees(params)
829
+ #
830
+ # {
831
+ # "success": True,
832
+ # "payload": {
833
+ # "fees": [
834
+ # {
835
+ # "book": "btc_mxn",
836
+ # "fee_percent": "0.6500",
837
+ # "fee_decimal": "0.00650000",
838
+ # "taker_fee_percent": "0.6500",
839
+ # "taker_fee_decimal": "0.00650000",
840
+ # "maker_fee_percent": "0.5000",
841
+ # "maker_fee_decimal": "0.00500000",
842
+ # "volume_currency": "mxn",
843
+ # "current_volume": "0.00",
844
+ # "next_volume": "1500000.00",
845
+ # "next_maker_fee_percent": "0.490",
846
+ # "next_taker_fee_percent": "0.637",
847
+ # "nextVolume": "1500000.00",
848
+ # "nextFee": "0.490",
849
+ # "nextTakerFee": "0.637"
850
+ # },
851
+ # ...
852
+ # ],
853
+ # "deposit_fees": [
854
+ # {
855
+ # "currency": "btc",
856
+ # "method": "rewards",
857
+ # "fee": "0.00",
858
+ # "is_fixed": False
859
+ # },
860
+ # ...
861
+ # ],
862
+ # "withdrawal_fees": {
863
+ # "ada": "0.20958100",
864
+ # "bch": "0.00009437",
865
+ # "ars": "0",
866
+ # "btc": "0.00001209",
867
+ # ...
868
+ # }
869
+ # }
870
+ # }
871
+ #
872
+ payload = self.safe_value(response, 'payload', {})
873
+ fees = self.safe_value(payload, 'fees', [])
874
+ result: dict = {}
875
+ for i in range(0, len(fees)):
876
+ fee = fees[i]
877
+ marketId = self.safe_string(fee, 'book')
878
+ symbol = self.safe_symbol(marketId, None, '_')
879
+ result[symbol] = {
880
+ 'info': fee,
881
+ 'symbol': symbol,
882
+ 'maker': self.safe_number(fee, 'maker_fee_decimal'),
883
+ 'taker': self.safe_number(fee, 'taker_fee_decimal'),
884
+ 'percentage': True,
885
+ 'tierBased': True,
886
+ }
887
+ return result
888
+
889
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = 25, params={}):
890
+ """
891
+ fetch all trades made by the user
892
+ :see: https://docs.bitso.com/bitso-api/docs/user-trades
893
+ :param str symbol: unified market symbol
894
+ :param int [since]: the earliest time in ms to fetch trades for
895
+ :param int [limit]: the maximum number of trades structures to retrieve
896
+ :param dict [params]: extra parameters specific to the exchange API endpoint
897
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
898
+ """
899
+ self.load_markets()
900
+ market = self.market(symbol)
901
+ # the don't support fetching trades starting from a date yet
902
+ # use the `marker` extra param for that
903
+ # self is not a typo, the variable name is 'marker'(don't confuse with 'market')
904
+ markerInParams = ('marker' in params)
905
+ # warn the user with an exception if the user wants to filter
906
+ # starting from since timestamp, but does not set the trade id with an extra 'marker' param
907
+ if (since is not None) and not markerInParams:
908
+ raise ExchangeError(self.id + ' fetchMyTrades() does not support fetching trades starting from a timestamp with the `since` argument, use the `marker` extra param to filter starting from an integer trade id')
909
+ # convert it to an integer unconditionally
910
+ if markerInParams:
911
+ params = self.extend(params, {
912
+ 'marker': int(params['marker']),
913
+ })
914
+ request: dict = {
915
+ 'book': market['id'],
916
+ 'limit': limit, # default = 25, max = 100
917
+ # 'sort': 'desc', # default = desc
918
+ # 'marker': id, # integer id to start from
919
+ }
920
+ response = self.privateGetUserTrades(self.extend(request, params))
921
+ return self.parse_trades(response['payload'], market, since, limit)
922
+
923
+ def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
924
+ """
925
+ create a trade order
926
+ :see: https://docs.bitso.com/bitso-api/docs/place-an-order
927
+ :param str symbol: unified symbol of the market to create an order in
928
+ :param str type: 'market' or 'limit'
929
+ :param str side: 'buy' or 'sell'
930
+ :param float amount: how much of currency you want to trade in units of base currency
931
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
932
+ :param dict [params]: extra parameters specific to the exchange API endpoint
933
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
934
+ """
935
+ self.load_markets()
936
+ market = self.market(symbol)
937
+ request: dict = {
938
+ 'book': market['id'],
939
+ 'side': side,
940
+ 'type': type,
941
+ 'major': self.amount_to_precision(market['symbol'], amount),
942
+ }
943
+ if type == 'limit':
944
+ request['price'] = self.price_to_precision(market['symbol'], price)
945
+ response = self.privatePostOrders(self.extend(request, params))
946
+ id = self.safe_string(response['payload'], 'oid')
947
+ return self.safe_order({
948
+ 'info': response,
949
+ 'id': id,
950
+ }, market)
951
+
952
+ def cancel_order(self, id: str, symbol: Str = None, params={}):
953
+ """
954
+ cancels an open order
955
+ :see: https://docs.bitso.com/bitso-api/docs/cancel-an-order
956
+ :param str id: order id
957
+ :param str symbol: not used by bitso cancelOrder()
958
+ :param dict [params]: extra parameters specific to the exchange API endpoint
959
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
960
+ """
961
+ self.load_markets()
962
+ request: dict = {
963
+ 'oid': id,
964
+ }
965
+ return self.privateDeleteOrdersOid(self.extend(request, params))
966
+
967
+ def cancel_orders(self, ids, symbol: Str = None, params={}):
968
+ """
969
+ cancel multiple orders
970
+ :see: https://docs.bitso.com/bitso-api/docs/cancel-an-order
971
+ :param str[] ids: order ids
972
+ :param str symbol: unified market symbol
973
+ :param dict [params]: extra parameters specific to the exchange API endpoint
974
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
975
+ """
976
+ if not isinstance(ids, list):
977
+ raise ArgumentsRequired(self.id + ' cancelOrders() ids argument should be an array')
978
+ market = None
979
+ if symbol is not None:
980
+ market = self.market(symbol)
981
+ oids = ','.join(ids)
982
+ request: dict = {
983
+ 'oids': oids,
984
+ }
985
+ response = self.privateDeleteOrders(self.extend(request, params))
986
+ #
987
+ # {
988
+ # "success": True,
989
+ # "payload": ["yWTQGxDMZ0VimZgZ"]
990
+ # }
991
+ #
992
+ payload = self.safe_value(response, 'payload', [])
993
+ orders = []
994
+ for i in range(0, len(payload)):
995
+ id = payload[i]
996
+ orders.append(self.parse_order(id, market))
997
+ return orders
998
+
999
+ def cancel_all_orders(self, symbol: Str = None, params={}):
1000
+ """
1001
+ cancel all open orders
1002
+ :see: https://docs.bitso.com/bitso-api/docs/cancel-an-order
1003
+ :param None symbol: bitso does not support canceling orders for only a specific market
1004
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1005
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1006
+ """
1007
+ if symbol is not None:
1008
+ raise NotSupported(self.id + ' cancelAllOrders() deletes all orders for user, it does not support filtering by symbol.')
1009
+ response = self.privateDeleteOrdersAll(params)
1010
+ #
1011
+ # {
1012
+ # "success": True,
1013
+ # "payload": ["NWUZUYNT12ljwzDT", "kZUkZmQ2TTjkkYTY"]
1014
+ # }
1015
+ #
1016
+ payload = self.safe_value(response, 'payload', [])
1017
+ canceledOrders = []
1018
+ for i in range(0, len(payload)):
1019
+ order = self.parse_order(payload[i])
1020
+ canceledOrders.append(order)
1021
+ return canceledOrders
1022
+
1023
+ def parse_order_status(self, status: Str):
1024
+ statuses: dict = {
1025
+ 'partial-fill': 'open', # self is a common substitution in ccxt
1026
+ 'partially filled': 'open',
1027
+ 'queued': 'open',
1028
+ 'completed': 'closed',
1029
+ }
1030
+ return self.safe_string(statuses, status, status)
1031
+
1032
+ def parse_order(self, order: dict, market: Market = None) -> Order:
1033
+ #
1034
+ #
1035
+ # canceledOrder
1036
+ # yWTQGxDMZ0VimZgZ
1037
+ #
1038
+ id = None
1039
+ if isinstance(order, str):
1040
+ id = order
1041
+ else:
1042
+ id = self.safe_string(order, 'oid')
1043
+ side = self.safe_string(order, 'side')
1044
+ status = self.parse_order_status(self.safe_string(order, 'status'))
1045
+ marketId = self.safe_string(order, 'book')
1046
+ symbol = self.safe_symbol(marketId, market, '_')
1047
+ orderType = self.safe_string(order, 'type')
1048
+ timestamp = self.parse8601(self.safe_string(order, 'created_at'))
1049
+ price = self.safe_string(order, 'price')
1050
+ amount = self.safe_string(order, 'original_amount')
1051
+ remaining = self.safe_string(order, 'unfilled_amount')
1052
+ clientOrderId = self.safe_string(order, 'client_id')
1053
+ return self.safe_order({
1054
+ 'info': order,
1055
+ 'id': id,
1056
+ 'clientOrderId': clientOrderId,
1057
+ 'timestamp': timestamp,
1058
+ 'datetime': self.iso8601(timestamp),
1059
+ 'lastTradeTimestamp': None,
1060
+ 'symbol': symbol,
1061
+ 'type': orderType,
1062
+ 'timeInForce': None,
1063
+ 'postOnly': None,
1064
+ 'side': side,
1065
+ 'price': price,
1066
+ 'stopPrice': None,
1067
+ 'triggerPrice': None,
1068
+ 'amount': amount,
1069
+ 'cost': None,
1070
+ 'remaining': remaining,
1071
+ 'filled': None,
1072
+ 'status': status,
1073
+ 'fee': None,
1074
+ 'average': None,
1075
+ 'trades': None,
1076
+ }, market)
1077
+
1078
+ def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = 25, params={}) -> List[Order]:
1079
+ """
1080
+ fetch all unfilled currently open orders
1081
+ :see: https://docs.bitso.com/bitso-api/docs/list-open-orders
1082
+ :param str symbol: unified market symbol
1083
+ :param int [since]: the earliest time in ms to fetch open orders for
1084
+ :param int [limit]: the maximum number of open orders structures to retrieve
1085
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1086
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1087
+ """
1088
+ self.load_markets()
1089
+ market = self.market(symbol)
1090
+ # the don't support fetching trades starting from a date yet
1091
+ # use the `marker` extra param for that
1092
+ # self is not a typo, the variable name is 'marker'(don't confuse with 'market')
1093
+ markerInParams = ('marker' in params)
1094
+ # warn the user with an exception if the user wants to filter
1095
+ # starting from since timestamp, but does not set the trade id with an extra 'marker' param
1096
+ if (since is not None) and not markerInParams:
1097
+ raise ExchangeError(self.id + ' fetchOpenOrders() does not support fetching orders starting from a timestamp with the `since` argument, use the `marker` extra param to filter starting from an integer trade id')
1098
+ # convert it to an integer unconditionally
1099
+ if markerInParams:
1100
+ params = self.extend(params, {
1101
+ 'marker': int(params['marker']),
1102
+ })
1103
+ request: dict = {
1104
+ 'book': market['id'],
1105
+ 'limit': limit, # default = 25, max = 100
1106
+ # 'sort': 'desc', # default = desc
1107
+ # 'marker': id, # integer id to start from
1108
+ }
1109
+ response = self.privateGetOpenOrders(self.extend(request, params))
1110
+ orders = self.parse_orders(response['payload'], market, since, limit)
1111
+ return orders
1112
+
1113
+ def fetch_order(self, id: str, symbol: Str = None, params={}):
1114
+ """
1115
+ fetches information on an order made by the user
1116
+ :see: https://docs.bitso.com/bitso-api/docs/look-up-orders
1117
+ :param str symbol: not used by bitso fetchOrder
1118
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1119
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1120
+ """
1121
+ self.load_markets()
1122
+ response = self.privateGetOrdersOid({
1123
+ 'oid': id,
1124
+ })
1125
+ payload = self.safe_value(response, 'payload')
1126
+ if isinstance(payload, list):
1127
+ numOrders = len(response['payload'])
1128
+ if numOrders == 1:
1129
+ return self.parse_order(payload[0])
1130
+ raise OrderNotFound(self.id + ': The order ' + id + ' not found.')
1131
+
1132
+ def fetch_order_trades(self, id: str, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1133
+ """
1134
+ fetch all the trades made from a single order
1135
+ :see: https://docs.bitso.com/bitso-api/docs/list-user-trades
1136
+ :param str id: order id
1137
+ :param str symbol: unified market symbol
1138
+ :param int [since]: the earliest time in ms to fetch trades for
1139
+ :param int [limit]: the maximum number of trades to retrieve
1140
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1141
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
1142
+ """
1143
+ self.load_markets()
1144
+ market = self.market(symbol)
1145
+ request: dict = {
1146
+ 'oid': id,
1147
+ }
1148
+ response = self.privateGetOrderTradesOid(self.extend(request, params))
1149
+ return self.parse_trades(response['payload'], market)
1150
+
1151
+ def fetch_deposit(self, id: str, code: Str = None, params={}):
1152
+ """
1153
+ fetch information on a deposit
1154
+ :see: https://docs.bitso.com/bitso-payouts-funding/docs/fundings
1155
+ :param str id: deposit id
1156
+ :param str code: bitso does not support filtering by currency code and will ignore self argument
1157
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1158
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1159
+ """
1160
+ self.load_markets()
1161
+ request: dict = {
1162
+ 'fid': id,
1163
+ }
1164
+ response = self.privateGetFundingsFid(self.extend(request, params))
1165
+ #
1166
+ # {
1167
+ # "success": True,
1168
+ # "payload": [{
1169
+ # "fid": "6112c6369100d6ecceb7f54f17cf0511",
1170
+ # "status": "complete",
1171
+ # "created_at": "2022-06-08T12:02:49+0000",
1172
+ # "currency": "btc",
1173
+ # "method": "btc",
1174
+ # "method_name": "Bitcoin",
1175
+ # "amount": "0.00080000",
1176
+ # "asset": "btc",
1177
+ # "network": "btc",
1178
+ # "protocol": "btc",
1179
+ # "integration": "bitgo-v2",
1180
+ # "details": {
1181
+ # "receiving_address": "3N2vbcYKhogs6RoTb4eYCUJ3beRSqLgSif",
1182
+ # "tx_hash": "327f3838531f211485ec59f9d0a119fea1595591e274d942b2c10b9b8262eb1d",
1183
+ # "confirmations": "4"
1184
+ # }
1185
+ # }]
1186
+ # }
1187
+ #
1188
+ transactions = self.safe_value(response, 'payload', [])
1189
+ first = self.safe_dict(transactions, 0, {})
1190
+ return self.parse_transaction(first)
1191
+
1192
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
1193
+ """
1194
+ fetch all deposits made to an account
1195
+ :see: https://docs.bitso.com/bitso-payouts-funding/docs/fundings
1196
+ :param str code: unified currency code
1197
+ :param int [since]: the earliest time in ms to fetch deposits for
1198
+ :param int [limit]: the maximum number of deposits structures to retrieve
1199
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1200
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
1201
+ """
1202
+ self.load_markets()
1203
+ currency = None
1204
+ if code is not None:
1205
+ currency = self.currency(code)
1206
+ response = self.privateGetFundings(params)
1207
+ #
1208
+ # {
1209
+ # "success": True,
1210
+ # "payload": [{
1211
+ # "fid": "6112c6369100d6ecceb7f54f17cf0511",
1212
+ # "status": "complete",
1213
+ # "created_at": "2022-06-08T12:02:49+0000",
1214
+ # "currency": "btc",
1215
+ # "method": "btc",
1216
+ # "method_name": "Bitcoin",
1217
+ # "amount": "0.00080000",
1218
+ # "asset": "btc",
1219
+ # "network": "btc",
1220
+ # "protocol": "btc",
1221
+ # "integration": "bitgo-v2",
1222
+ # "details": {
1223
+ # "receiving_address": "3N2vbcYKhogs6RoTb4eYCUJ3beRSqLgSif",
1224
+ # "tx_hash": "327f3838531f211485ec59f9d0a119fea1595591e274d942b2c10b9b8262eb1d",
1225
+ # "confirmations": "4"
1226
+ # }
1227
+ # }]
1228
+ # }
1229
+ #
1230
+ transactions = self.safe_list(response, 'payload', [])
1231
+ return self.parse_transactions(transactions, currency, since, limit, params)
1232
+
1233
+ def fetch_deposit_address(self, code: str, params={}):
1234
+ """
1235
+ fetch the deposit address for a currency associated with self account
1236
+ :param str code: unified currency code
1237
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1238
+ :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
1239
+ """
1240
+ self.load_markets()
1241
+ currency = self.currency(code)
1242
+ request: dict = {
1243
+ 'fund_currency': currency['id'],
1244
+ }
1245
+ response = self.privateGetFundingDestination(self.extend(request, params))
1246
+ address = self.safe_string(response['payload'], 'account_identifier')
1247
+ tag = None
1248
+ if address.find('?dt=') >= 0:
1249
+ parts = address.split('?dt=')
1250
+ address = self.safe_string(parts, 0)
1251
+ tag = self.safe_string(parts, 1)
1252
+ self.check_address(address)
1253
+ return {
1254
+ 'currency': code,
1255
+ 'address': address,
1256
+ 'tag': tag,
1257
+ 'network': None,
1258
+ 'info': response,
1259
+ }
1260
+
1261
+ def fetch_transaction_fees(self, codes: Strings = None, params={}):
1262
+ """
1263
+ * @deprecated
1264
+ please use fetchDepositWithdrawFees instead
1265
+ :see: https://docs.bitso.com/bitso-api/docs/list-fees
1266
+ :param str[]|None codes: list of unified currency codes
1267
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1268
+ :returns dict[]: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
1269
+ """
1270
+ self.load_markets()
1271
+ response = self.privateGetFees(params)
1272
+ #
1273
+ # {
1274
+ # "success": True,
1275
+ # "payload": {
1276
+ # "fees": [
1277
+ # {
1278
+ # "book": "btc_mxn",
1279
+ # "fee_percent": "0.6500",
1280
+ # "fee_decimal": "0.00650000",
1281
+ # "taker_fee_percent": "0.6500",
1282
+ # "taker_fee_decimal": "0.00650000",
1283
+ # "maker_fee_percent": "0.5000",
1284
+ # "maker_fee_decimal": "0.00500000",
1285
+ # "volume_currency": "mxn",
1286
+ # "current_volume": "0.00",
1287
+ # "next_volume": "1500000.00",
1288
+ # "next_maker_fee_percent": "0.490",
1289
+ # "next_taker_fee_percent": "0.637",
1290
+ # "nextVolume": "1500000.00",
1291
+ # "nextFee": "0.490",
1292
+ # "nextTakerFee": "0.637"
1293
+ # },
1294
+ # ...
1295
+ # ],
1296
+ # "deposit_fees": [
1297
+ # {
1298
+ # "currency": "btc",
1299
+ # "method": "rewards",
1300
+ # "fee": "0.00",
1301
+ # "is_fixed": False
1302
+ # },
1303
+ # ...
1304
+ # ],
1305
+ # "withdrawal_fees": {
1306
+ # "ada": "0.20958100",
1307
+ # "bch": "0.00009437",
1308
+ # "ars": "0",
1309
+ # "btc": "0.00001209",
1310
+ # ...
1311
+ # }
1312
+ # }
1313
+ # }
1314
+ #
1315
+ result: dict = {}
1316
+ payload = self.safe_value(response, 'payload', {})
1317
+ depositFees = self.safe_value(payload, 'deposit_fees', [])
1318
+ for i in range(0, len(depositFees)):
1319
+ depositFee = depositFees[i]
1320
+ currencyId = self.safe_string(depositFee, 'currency')
1321
+ code = self.safe_currency_code(currencyId)
1322
+ if (codes is not None) and not self.in_array(code, codes):
1323
+ continue
1324
+ result[code] = {
1325
+ 'deposit': self.safe_number(depositFee, 'fee'),
1326
+ 'withdraw': None,
1327
+ 'info': {
1328
+ 'deposit': depositFee,
1329
+ 'withdraw': None,
1330
+ },
1331
+ }
1332
+ withdrawalFees = self.safe_value(payload, 'withdrawal_fees', [])
1333
+ currencyIds = list(withdrawalFees.keys())
1334
+ for i in range(0, len(currencyIds)):
1335
+ currencyId = currencyIds[i]
1336
+ code = self.safe_currency_code(currencyId)
1337
+ if (codes is not None) and not self.in_array(code, codes):
1338
+ continue
1339
+ result[code] = {
1340
+ 'deposit': self.safe_value(result[code], 'deposit'),
1341
+ 'withdraw': self.safe_number(withdrawalFees, currencyId),
1342
+ 'info': {
1343
+ 'deposit': self.safe_value(result[code]['info'], 'deposit'),
1344
+ 'withdraw': self.safe_number(withdrawalFees, currencyId),
1345
+ },
1346
+ }
1347
+ return result
1348
+
1349
+ def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
1350
+ """
1351
+ fetch deposit and withdraw fees
1352
+ :see: https://docs.bitso.com/bitso-api/docs/list-fees
1353
+ :param str[]|None codes: list of unified currency codes
1354
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1355
+ :returns dict[]: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
1356
+ """
1357
+ self.load_markets()
1358
+ response = self.privateGetFees(params)
1359
+ #
1360
+ # {
1361
+ # "success": True,
1362
+ # "payload": {
1363
+ # "fees": [
1364
+ # {
1365
+ # "book": "btc_mxn",
1366
+ # "fee_percent": "0.6500",
1367
+ # "fee_decimal": "0.00650000",
1368
+ # "taker_fee_percent": "0.6500",
1369
+ # "taker_fee_decimal": "0.00650000",
1370
+ # "maker_fee_percent": "0.5000",
1371
+ # "maker_fee_decimal": "0.00500000",
1372
+ # "volume_currency": "mxn",
1373
+ # "current_volume": "0.00",
1374
+ # "next_volume": "1500000.00",
1375
+ # "next_maker_fee_percent": "0.490",
1376
+ # "next_taker_fee_percent": "0.637",
1377
+ # "nextVolume": "1500000.00",
1378
+ # "nextFee": "0.490",
1379
+ # "nextTakerFee": "0.637"
1380
+ # },
1381
+ # ...
1382
+ # ],
1383
+ # "deposit_fees": [
1384
+ # {
1385
+ # "currency": "btc",
1386
+ # "method": "rewards",
1387
+ # "fee": "0.00",
1388
+ # "is_fixed": False
1389
+ # },
1390
+ # ...
1391
+ # ],
1392
+ # "withdrawal_fees": {
1393
+ # "ada": "0.20958100",
1394
+ # "bch": "0.00009437",
1395
+ # "ars": "0",
1396
+ # "btc": "0.00001209",
1397
+ # ...
1398
+ # }
1399
+ # }
1400
+ # }
1401
+ #
1402
+ payload = self.safe_list(response, 'payload', [])
1403
+ return self.parse_deposit_withdraw_fees(payload, codes)
1404
+
1405
+ def parse_deposit_withdraw_fees(self, response, codes=None, currencyIdKey=None):
1406
+ #
1407
+ # {
1408
+ # "fees": [
1409
+ # {
1410
+ # "book": "btc_mxn",
1411
+ # "fee_percent": "0.6500",
1412
+ # "fee_decimal": "0.00650000",
1413
+ # "taker_fee_percent": "0.6500",
1414
+ # "taker_fee_decimal": "0.00650000",
1415
+ # "maker_fee_percent": "0.5000",
1416
+ # "maker_fee_decimal": "0.00500000",
1417
+ # "volume_currency": "mxn",
1418
+ # "current_volume": "0.00",
1419
+ # "next_volume": "1500000.00",
1420
+ # "next_maker_fee_percent": "0.490",
1421
+ # "next_taker_fee_percent": "0.637",
1422
+ # "nextVolume": "1500000.00",
1423
+ # "nextFee": "0.490",
1424
+ # "nextTakerFee": "0.637"
1425
+ # },
1426
+ # ...
1427
+ # ],
1428
+ # "deposit_fees": [
1429
+ # {
1430
+ # "currency": "btc",
1431
+ # "method": "rewards",
1432
+ # "fee": "0.00",
1433
+ # "is_fixed": False
1434
+ # },
1435
+ # ...
1436
+ # ],
1437
+ # "withdrawal_fees": {
1438
+ # "ada": "0.20958100",
1439
+ # "bch": "0.00009437",
1440
+ # "ars": "0",
1441
+ # "btc": "0.00001209",
1442
+ # ...
1443
+ # }
1444
+ # }
1445
+ #
1446
+ result: dict = {}
1447
+ depositResponse = self.safe_value(response, 'deposit_fees', [])
1448
+ withdrawalResponse = self.safe_value(response, 'withdrawal_fees', [])
1449
+ for i in range(0, len(depositResponse)):
1450
+ entry = depositResponse[i]
1451
+ currencyId = self.safe_string(entry, 'currency')
1452
+ code = self.safe_currency_code(currencyId)
1453
+ if (codes is None) or (code in codes):
1454
+ result[code] = {
1455
+ 'deposit': {
1456
+ 'fee': self.safe_number(entry, 'fee'),
1457
+ 'percentage': not self.safe_value(entry, 'is_fixed'),
1458
+ },
1459
+ 'withdraw': {
1460
+ 'fee': None,
1461
+ 'percentage': None,
1462
+ },
1463
+ 'networks': {},
1464
+ 'info': entry,
1465
+ }
1466
+ withdrawalKeys = list(withdrawalResponse.keys())
1467
+ for i in range(0, len(withdrawalKeys)):
1468
+ currencyId = withdrawalKeys[i]
1469
+ code = self.safe_currency_code(currencyId)
1470
+ if (codes is None) or (code in codes):
1471
+ withdrawFee = self.parse_number(withdrawalResponse[currencyId])
1472
+ resultValue = self.safe_value(result, code)
1473
+ if resultValue is None:
1474
+ result[code] = self.deposit_withdraw_fee({})
1475
+ result[code]['withdraw']['fee'] = withdrawFee
1476
+ result[code]['info'][code] = withdrawFee
1477
+ return result
1478
+
1479
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
1480
+ """
1481
+ make a withdrawal
1482
+ :param str code: unified currency code
1483
+ :param float amount: the amount to withdraw
1484
+ :param str address: the address to withdraw to
1485
+ :param str tag:
1486
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1487
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
1488
+ """
1489
+ tag, params = self.handle_withdraw_tag_and_params(tag, params)
1490
+ self.check_address(address)
1491
+ self.load_markets()
1492
+ methods: dict = {
1493
+ 'BTC': 'Bitcoin',
1494
+ 'ETH': 'Ether',
1495
+ 'XRP': 'Ripple',
1496
+ 'BCH': 'Bcash',
1497
+ 'LTC': 'Litecoin',
1498
+ }
1499
+ currency = self.currency(code)
1500
+ method = methods[code] if (code in methods) else None
1501
+ if method is None:
1502
+ raise ExchangeError(self.id + ' not valid withdraw coin: ' + code)
1503
+ request: dict = {
1504
+ 'amount': amount,
1505
+ 'address': address,
1506
+ 'destination_tag': tag,
1507
+ }
1508
+ classMethod = 'privatePost' + method + 'Withdrawal'
1509
+ response = getattr(self, classMethod)(self.extend(request, params))
1510
+ #
1511
+ # {
1512
+ # "success": True,
1513
+ # "payload": [
1514
+ # {
1515
+ # "wid": "c5b8d7f0768ee91d3b33bee648318688",
1516
+ # "status": "pending",
1517
+ # "created_at": "2016-04-08T17:52:31.000+00:00",
1518
+ # "currency": "btc",
1519
+ # "method": "Bitcoin",
1520
+ # "amount": "0.48650929",
1521
+ # "details": {
1522
+ # "withdrawal_address": "18MsnATiNiKLqUHDTRKjurwMg7inCrdNEp",
1523
+ # "tx_hash": "d4f28394693e9fb5fffcaf730c11f32d1922e5837f76ca82189d3bfe30ded433"
1524
+ # }
1525
+ # },
1526
+ # ]
1527
+ # }
1528
+ #
1529
+ payload = self.safe_value(response, 'payload', [])
1530
+ first = self.safe_dict(payload, 0)
1531
+ return self.parse_transaction(first, currency)
1532
+
1533
+ def safe_network(self, networkId):
1534
+ if networkId is None:
1535
+ return None
1536
+ networkId = networkId.upper()
1537
+ networksById: dict = {
1538
+ 'trx': 'TRC20',
1539
+ 'erc20': 'ERC20',
1540
+ 'bsc': 'BEP20',
1541
+ 'bep2': 'BEP2',
1542
+ }
1543
+ return self.safe_string(networksById, networkId, networkId)
1544
+
1545
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
1546
+ #
1547
+ # deposit
1548
+ # {
1549
+ # "fid": "6112c6369100d6ecceb7f54f17cf0511",
1550
+ # "status": "complete",
1551
+ # "created_at": "2022-06-08T12:02:49+0000",
1552
+ # "currency": "btc",
1553
+ # "method": "btc",
1554
+ # "method_name": "Bitcoin",
1555
+ # "amount": "0.00080000",
1556
+ # "asset": "btc",
1557
+ # "network": "btc",
1558
+ # "protocol": "btc",
1559
+ # "integration": "bitgo-v2",
1560
+ # "details": {
1561
+ # "receiving_address": "3NmvbcYKhogs6RoTb4eYCUJ3beRSqLgSif",
1562
+ # "tx_hash": "327f3838531f611485ec59f9d0a119fea1595591e274d942b2c10b9b8262eb1d",
1563
+ # "confirmations": "4"
1564
+ # }
1565
+ # }
1566
+ #
1567
+ # withdraw
1568
+ #
1569
+ # {
1570
+ # "wid": "c5b8d7f0768ee91d3b33bee648318688",
1571
+ # "status": "pending",
1572
+ # "created_at": "2016-04-08T17:52:31.000+00:00",
1573
+ # "currency": "btc",
1574
+ # "method": "Bitcoin",
1575
+ # "amount": "0.48650929",
1576
+ # "details": {
1577
+ # "withdrawal_address": "18MsnATiNiKLqUHDTRKjurwMg7inCrdNEp",
1578
+ # "tx_hash": "d4f28394693e9fb5fffcaf730c11f32d1922e5837f76ca82189d3bfe30ded433"
1579
+ # }
1580
+ # }
1581
+ #
1582
+ currencyId = self.safe_string_2(transaction, 'currency', 'asset')
1583
+ currency = self.safe_currency(currencyId, currency)
1584
+ details = self.safe_value(transaction, 'details', {})
1585
+ datetime = self.safe_string(transaction, 'created_at')
1586
+ withdrawalAddress = self.safe_string(details, 'withdrawal_address')
1587
+ receivingAddress = self.safe_string(details, 'receiving_address')
1588
+ networkId = self.safe_string_2(transaction, 'network', 'method')
1589
+ status = self.safe_string(transaction, 'status')
1590
+ withdrawId = self.safe_string(transaction, 'wid')
1591
+ return {
1592
+ 'id': self.safe_string_2(transaction, 'wid', 'fid'),
1593
+ 'txid': self.safe_string(details, 'tx_hash'),
1594
+ 'timestamp': self.parse8601(datetime),
1595
+ 'datetime': datetime,
1596
+ 'network': self.safe_network(networkId),
1597
+ 'addressFrom': receivingAddress,
1598
+ 'address': withdrawalAddress if (withdrawalAddress is not None) else receivingAddress,
1599
+ 'addressTo': withdrawalAddress,
1600
+ 'amount': self.safe_number(transaction, 'amount'),
1601
+ 'type': 'deposit' if (withdrawId is None) else 'withdrawal',
1602
+ 'currency': self.safe_currency_code(currencyId, currency),
1603
+ 'status': self.parse_transaction_status(status),
1604
+ 'updated': None,
1605
+ 'tagFrom': None,
1606
+ 'tag': None,
1607
+ 'tagTo': None,
1608
+ 'comment': None,
1609
+ 'internal': None,
1610
+ 'fee': None,
1611
+ 'info': transaction,
1612
+ }
1613
+
1614
+ def parse_transaction_status(self, status: Str):
1615
+ statuses: dict = {
1616
+ 'pending': 'pending',
1617
+ 'in_progress': 'pending',
1618
+ 'complete': 'ok',
1619
+ 'failed': 'failed',
1620
+ }
1621
+ return self.safe_string(statuses, status, status)
1622
+
1623
+ def nonce(self):
1624
+ return self.milliseconds()
1625
+
1626
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1627
+ endpoint = '/' + self.version + '/' + self.implode_params(path, params)
1628
+ query = self.omit(params, self.extract_params(path))
1629
+ if method == 'GET' or method == 'DELETE':
1630
+ if query:
1631
+ endpoint += '?' + self.urlencode(query)
1632
+ url = self.urls['api']['rest'] + endpoint
1633
+ if api == 'private':
1634
+ self.check_required_credentials()
1635
+ nonce = str(self.nonce())
1636
+ request = ''.join([nonce, method, endpoint])
1637
+ if method != 'GET' and method != 'DELETE':
1638
+ if query:
1639
+ body = self.json(query)
1640
+ request += body
1641
+ signature = self.hmac(self.encode(request), self.encode(self.secret), hashlib.sha256)
1642
+ auth = self.apiKey + ':' + nonce + ':' + signature
1643
+ headers = {
1644
+ 'Authorization': 'Bitso ' + auth,
1645
+ 'Content-Type': 'application/json',
1646
+ }
1647
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1648
+
1649
+ def handle_errors(self, httpCode: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1650
+ if response is None:
1651
+ return None # fallback to default error handler
1652
+ if 'success' in response:
1653
+ #
1654
+ # {"success":false,"error":{"code":104,"message":"Cannot perform request - nonce must be higher than 1520307203724237"}}
1655
+ #
1656
+ success = self.safe_bool(response, 'success', False)
1657
+ if isinstance(success, str):
1658
+ if (success == 'true') or (success == '1'):
1659
+ success = True
1660
+ else:
1661
+ success = False
1662
+ if not success:
1663
+ feedback = self.id + ' ' + self.json(response)
1664
+ error = self.safe_value(response, 'error')
1665
+ if error is None:
1666
+ raise ExchangeError(feedback)
1667
+ code = self.safe_string(error, 'code')
1668
+ self.throw_exactly_matched_exception(self.exceptions, code, feedback)
1669
+ raise ExchangeError(feedback)
1670
+ return None