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/blockchaincom.py ADDED
@@ -0,0 +1,1104 @@
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.blockchaincom import ImplicitAPI
8
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction
9
+ from typing import List
10
+ from ccxt.base.errors import ExchangeError
11
+ from ccxt.base.errors import AuthenticationError
12
+ from ccxt.base.errors import ArgumentsRequired
13
+ from ccxt.base.errors import InsufficientFunds
14
+ from ccxt.base.errors import OrderNotFound
15
+ from ccxt.base.decimal_to_precision import TICK_SIZE
16
+ from ccxt.base.precise import Precise
17
+
18
+
19
+ class blockchaincom(Exchange, ImplicitAPI):
20
+
21
+ def describe(self):
22
+ return self.deep_extend(super(blockchaincom, self).describe(), {
23
+ 'id': 'blockchaincom',
24
+ 'secret': None,
25
+ 'name': 'Blockchain.com',
26
+ 'countries': ['LX'],
27
+ 'rateLimit': 500, # prev 1000
28
+ 'version': 'v3',
29
+ 'pro': True,
30
+ 'has': {
31
+ 'CORS': False,
32
+ 'spot': True,
33
+ 'margin': None, # on exchange but not implemented in CCXT
34
+ 'swap': False,
35
+ 'future': False,
36
+ 'option': False,
37
+ 'cancelAllOrders': True,
38
+ 'cancelOrder': True,
39
+ 'createOrder': True,
40
+ 'createStopLimitOrder': True,
41
+ 'createStopMarketOrder': True,
42
+ 'createStopOrder': True,
43
+ 'fetchBalance': True,
44
+ 'fetchCanceledOrders': True,
45
+ 'fetchClosedOrders': True,
46
+ 'fetchDeposit': True,
47
+ 'fetchDepositAddress': True,
48
+ 'fetchDeposits': True,
49
+ 'fetchFundingHistory': False,
50
+ 'fetchFundingRate': False,
51
+ 'fetchFundingRateHistory': False,
52
+ 'fetchFundingRates': False,
53
+ 'fetchIndexOHLCV': False,
54
+ 'fetchL2OrderBook': True,
55
+ 'fetchL3OrderBook': True,
56
+ 'fetchLedger': False,
57
+ 'fetchMarginMode': False,
58
+ 'fetchMarkets': True,
59
+ 'fetchMarkOHLCV': False,
60
+ 'fetchMyTrades': True,
61
+ 'fetchOHLCV': False,
62
+ 'fetchOpenInterestHistory': False,
63
+ 'fetchOpenOrders': True,
64
+ 'fetchOrder': True,
65
+ 'fetchOrderBook': True,
66
+ 'fetchPositionMode': False,
67
+ 'fetchPremiumIndexOHLCV': False,
68
+ 'fetchTicker': True,
69
+ 'fetchTickers': True,
70
+ 'fetchTrades': False,
71
+ 'fetchTradingFee': False,
72
+ 'fetchTradingFees': True,
73
+ 'fetchTransfer': False,
74
+ 'fetchTransfers': False,
75
+ 'fetchWithdrawal': True,
76
+ 'fetchWithdrawals': True,
77
+ 'fetchWithdrawalWhitelist': True, # fetches exchange specific benficiary-ids needed for withdrawals
78
+ 'transfer': False,
79
+ 'withdraw': True,
80
+ },
81
+ 'timeframes': None,
82
+ 'urls': {
83
+ 'logo': 'https://user-images.githubusercontent.com/1294454/147515585-1296e91b-7398-45e5-9d32-f6121538533f.jpeg',
84
+ 'test': {
85
+ 'public': 'https://testnet-api.delta.exchange',
86
+ 'private': 'https://testnet-api.delta.exchange',
87
+ },
88
+ 'api': {
89
+ 'public': 'https://api.blockchain.com/v3/exchange',
90
+ 'private': 'https://api.blockchain.com/v3/exchange',
91
+ },
92
+ 'www': 'https://blockchain.com',
93
+ 'doc': [
94
+ 'https://api.blockchain.com/v3',
95
+ ],
96
+ 'fees': 'https://exchange.blockchain.com/fees',
97
+ },
98
+ 'api': {
99
+ 'public': {
100
+ 'get': {
101
+ 'tickers': 1, # fetchTickers
102
+ 'tickers/{symbol}': 1, # fetchTicker
103
+ 'symbols': 1, # fetchMarkets
104
+ 'symbols/{symbol}': 1, # fetchMarket
105
+ 'l2/{symbol}': 1, # fetchL2OrderBook
106
+ 'l3/{symbol}': 1, # fetchL3OrderBook
107
+ },
108
+ },
109
+ 'private': {
110
+ 'get': {
111
+ 'fees': 1, # fetchFees
112
+ 'orders': 1, # fetchOpenOrders, fetchClosedOrders
113
+ 'orders/{orderId}': 1, # fetchOrder(id)
114
+ 'trades': 1,
115
+ 'fills': 1, # fetchMyTrades
116
+ 'deposits': 1, # fetchDeposits
117
+ 'deposits/{depositId}': 1, # fetchDeposit
118
+ 'accounts': 1, # fetchBalance
119
+ 'accounts/{account}/{currency}': 1,
120
+ 'whitelist': 1, # fetchWithdrawalWhitelist
121
+ 'whitelist/{currency}': 1, # fetchWithdrawalWhitelistByCurrency
122
+ 'withdrawals': 1, # fetchWithdrawalWhitelist
123
+ 'withdrawals/{withdrawalId}': 1, # fetchWithdrawalById
124
+ },
125
+ 'post': {
126
+ 'orders': 1, # createOrder
127
+ 'deposits/{currency}': 1, # fetchDepositAddress by currency(only crypto supported)
128
+ 'withdrawals': 1, # withdraw
129
+ },
130
+ 'delete': {
131
+ 'orders': 1, # cancelOrders
132
+ 'orders/{orderId}': 1, # cancelOrder
133
+ },
134
+ },
135
+ },
136
+ 'fees': {
137
+ 'trading': {
138
+ 'feeSide': 'get',
139
+ 'tierBased': True,
140
+ 'percentage': True,
141
+ 'tiers': {
142
+ 'taker': [
143
+ [self.parse_number('0'), self.parse_number('0.004')],
144
+ [self.parse_number('10000'), self.parse_number('0.0022')],
145
+ [self.parse_number('50000'), self.parse_number('0.002')],
146
+ [self.parse_number('100000'), self.parse_number('0.0018')],
147
+ [self.parse_number('500000'), self.parse_number('0.0018')],
148
+ [self.parse_number('1000000'), self.parse_number('0.0018')],
149
+ [self.parse_number('2500000'), self.parse_number('0.0018')],
150
+ [self.parse_number('5000000'), self.parse_number('0.0016')],
151
+ [self.parse_number('25000000'), self.parse_number('0.0014')],
152
+ [self.parse_number('100000000'), self.parse_number('0.0011')],
153
+ [self.parse_number('500000000'), self.parse_number('0.0008')],
154
+ [self.parse_number('1000000000'), self.parse_number('0.0006')],
155
+ ],
156
+ 'maker': [
157
+ [self.parse_number('0'), self.parse_number('0.002')],
158
+ [self.parse_number('10000'), self.parse_number('0.0012')],
159
+ [self.parse_number('50000'), self.parse_number('0.001')],
160
+ [self.parse_number('100000'), self.parse_number('0.0008')],
161
+ [self.parse_number('500000'), self.parse_number('0.0007000000000000001')],
162
+ [self.parse_number('1000000'), self.parse_number('0.0006')],
163
+ [self.parse_number('2500000'), self.parse_number('0.0005')],
164
+ [self.parse_number('5000000'), self.parse_number('0.0004')],
165
+ [self.parse_number('25000000'), self.parse_number('0.0003')],
166
+ [self.parse_number('100000000'), self.parse_number('0.0002')],
167
+ [self.parse_number('500000000'), self.parse_number('0.0001')],
168
+ [self.parse_number('1000000000'), self.parse_number('0')],
169
+ ],
170
+ },
171
+ },
172
+ },
173
+ 'requiredCredentials': {
174
+ 'apiKey': False,
175
+ 'secret': True,
176
+ },
177
+ 'options': {
178
+ 'networks': {
179
+ 'ERC20': 'ETH',
180
+ 'TRC20': 'TRX',
181
+ 'ALGO': 'ALGO',
182
+ 'ADA': 'ADA',
183
+ 'AR': 'AR',
184
+ 'ATOM': 'ATOM',
185
+ 'AVAXC': 'AVAX',
186
+ 'BCH': 'BCH',
187
+ 'BSV': 'BSV',
188
+ 'BTC': 'BTC',
189
+ # 'BEP20': 'BNB', # todo
190
+ 'DCR': 'DCR',
191
+ 'DESO': 'DESO',
192
+ 'DASH': 'DASH',
193
+ 'CELO': 'CELO',
194
+ 'CHZ': 'CHZ',
195
+ 'MATIC': 'MATIC',
196
+ 'SOL': 'SOL',
197
+ 'DOGE': 'DOGE',
198
+ 'DOT': 'DOT',
199
+ 'EOS': 'EOS',
200
+ 'ETC': 'ETC',
201
+ 'FIL': 'FIL',
202
+ 'KAVA': 'KAVA',
203
+ 'LTC': 'LTC',
204
+ 'IOTA': 'MIOTA',
205
+ 'NEAR': 'NEAR',
206
+ 'STX': 'STX',
207
+ 'XLM': 'XLM',
208
+ 'XMR': 'XMR',
209
+ 'XRP': 'XRP',
210
+ 'XTZ': 'XTZ',
211
+ 'ZEC': 'ZEC',
212
+ 'ZIL': 'ZIL',
213
+ # 'THETA': 'THETA', # todo: possible TFUEL THETA FUEL is also same, but API might have a mistake
214
+ # todo: uncomment below after consensus
215
+ # 'MOBILECOIN': 'MOB',
216
+ # 'KIN': 'KIN',
217
+ # 'DIGITALGOLD': 'DGLD',
218
+ },
219
+ },
220
+ 'precisionMode': TICK_SIZE,
221
+ 'exceptions': {
222
+ 'exact': {
223
+ '401': AuthenticationError,
224
+ '404': OrderNotFound,
225
+ },
226
+ 'broad': {},
227
+ },
228
+ })
229
+
230
+ def fetch_markets(self, params={}) -> List[Market]:
231
+ """
232
+ retrieves data on all markets for blockchaincom
233
+ :see: https://api.blockchain.com/v3/#/unauthenticated/getSymbols
234
+ :param dict [params]: extra parameters specific to the exchange API endpoint
235
+ :returns dict[]: an array of objects representing market data
236
+ """
237
+ #
238
+ # "USDC-GBP": {
239
+ # "base_currency": "USDC",
240
+ # "base_currency_scale": 6,
241
+ # "counter_currency": "GBP",
242
+ # "counter_currency_scale": 2,
243
+ # "min_price_increment": 10000,
244
+ # "min_price_increment_scale": 8,
245
+ # "min_order_size": 500000000,
246
+ # "min_order_size_scale": 8,
247
+ # "max_order_size": 0,
248
+ # "max_order_size_scale": 8,
249
+ # "lot_size": 10000,
250
+ # "lot_size_scale": 8,
251
+ # "status": "open",
252
+ # "id": 68,
253
+ # "auction_price": 0,
254
+ # "auction_size": 0,
255
+ # "auction_time": "",
256
+ # "imbalance": 0
257
+ # }
258
+ #
259
+ markets = self.publicGetSymbols(params)
260
+ marketIds = list(markets.keys())
261
+ result = []
262
+ for i in range(0, len(marketIds)):
263
+ marketId = marketIds[i]
264
+ market = self.safe_value(markets, marketId)
265
+ baseId = self.safe_string(market, 'base_currency')
266
+ quoteId = self.safe_string(market, 'counter_currency')
267
+ base = self.safe_currency_code(baseId)
268
+ quote = self.safe_currency_code(quoteId)
269
+ numericId = self.safe_number(market, 'id')
270
+ active = None
271
+ marketState = self.safe_string(market, 'status')
272
+ if marketState == 'open':
273
+ active = True
274
+ else:
275
+ active = False
276
+ # price precision
277
+ minPriceIncrementString = self.safe_string(market, 'min_price_increment')
278
+ minPriceIncrementScaleString = self.safe_string(market, 'min_price_increment_scale')
279
+ minPriceScalePrecisionString = self.parse_precision(minPriceIncrementScaleString)
280
+ pricePrecisionString = Precise.string_mul(minPriceIncrementString, minPriceScalePrecisionString)
281
+ # amount precision
282
+ lotSizeString = self.safe_string(market, 'lot_size')
283
+ lotSizeScaleString = self.safe_string(market, 'lot_size_scale')
284
+ lotSizeScalePrecisionString = self.parse_precision(lotSizeScaleString)
285
+ amountPrecisionString = Precise.string_mul(lotSizeString, lotSizeScalePrecisionString)
286
+ # minimum order size
287
+ minOrderSizeString = self.safe_string(market, 'min_order_size')
288
+ minOrderSizeScaleString = self.safe_string(market, 'min_order_size_scale')
289
+ minOrderSizeScalePrecisionString = self.parse_precision(minOrderSizeScaleString)
290
+ minOrderSizePreciseString = Precise.string_mul(minOrderSizeString, minOrderSizeScalePrecisionString)
291
+ minOrderSize = self.parse_number(minOrderSizePreciseString)
292
+ # maximum order size
293
+ maxOrderSize = None
294
+ maxOrderSize = self.safe_string(market, 'max_order_size')
295
+ if maxOrderSize != '0':
296
+ maxOrderSizeScaleString = self.safe_string(market, 'max_order_size_scale')
297
+ maxOrderSizeScalePrecisionString = self.parse_precision(maxOrderSizeScaleString)
298
+ maxOrderSizeString = Precise.string_mul(maxOrderSize, maxOrderSizeScalePrecisionString)
299
+ maxOrderSize = self.parse_number(maxOrderSizeString)
300
+ else:
301
+ maxOrderSize = None
302
+ result.append({
303
+ 'info': market,
304
+ 'id': marketId,
305
+ 'numericId': numericId,
306
+ 'symbol': base + '/' + quote,
307
+ 'base': base,
308
+ 'quote': quote,
309
+ 'settle': None,
310
+ 'baseId': baseId,
311
+ 'quoteId': quoteId,
312
+ 'settleId': None,
313
+ 'type': 'spot',
314
+ 'spot': True,
315
+ 'margin': False,
316
+ 'swap': False,
317
+ 'future': False,
318
+ 'option': False,
319
+ 'active': active,
320
+ 'contract': False,
321
+ 'linear': None,
322
+ 'inverse': None,
323
+ 'contractSize': None,
324
+ 'expiry': None,
325
+ 'expiryDatetime': None,
326
+ 'strike': None,
327
+ 'optionType': None,
328
+ 'precision': {
329
+ 'amount': self.parse_number(amountPrecisionString),
330
+ 'price': self.parse_number(pricePrecisionString),
331
+ },
332
+ 'limits': {
333
+ 'leverage': {
334
+ 'min': None,
335
+ 'max': None,
336
+ },
337
+ 'amount': {
338
+ 'min': minOrderSize,
339
+ 'max': maxOrderSize,
340
+ },
341
+ 'price': {
342
+ 'min': None,
343
+ 'max': None,
344
+ },
345
+ 'cost': {
346
+ 'min': None,
347
+ 'max': None,
348
+ },
349
+ },
350
+ 'created': None,
351
+ })
352
+ return result
353
+
354
+ def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
355
+ """
356
+ fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
357
+ :see: https://api.blockchain.com/v3/#/unauthenticated/getL3OrderBook
358
+ :param str symbol: unified symbol of the market to fetch the order book for
359
+ :param int [limit]: the maximum amount of order book entries to return
360
+ :param dict [params]: extra parameters specific to the exchange API endpoint
361
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
362
+ """
363
+ return self.fetch_l3_order_book(symbol, limit, params)
364
+
365
+ def fetch_l3_order_book(self, symbol: str, limit: Int = None, params={}):
366
+ """
367
+ fetches level 3 information on open orders with bid(buy) and ask(sell) prices, volumes and other data
368
+ :see: https://api.blockchain.com/v3/#/unauthenticated/getL3OrderBook
369
+ :param str symbol: unified market symbol
370
+ :param int [limit]: max number of orders to return, default is None
371
+ :param dict [params]: extra parameters specific to the exchange API endpoint
372
+ :returns dict: an `order book structure <https://docs.ccxt.com/#/?id=order-book-structure>`
373
+ """
374
+ self.load_markets()
375
+ market = self.market(symbol)
376
+ request: dict = {
377
+ 'symbol': market['id'],
378
+ }
379
+ if limit is not None:
380
+ request['depth'] = limit
381
+ response = self.publicGetL3Symbol(self.extend(request, params))
382
+ return self.parse_order_book(response, market['symbol'], None, 'bids', 'asks', 'px', 'qty')
383
+
384
+ def fetch_l2_order_book(self, symbol: str, limit: Int = None, params={}):
385
+ self.load_markets()
386
+ market = self.market(symbol)
387
+ request: dict = {
388
+ 'symbol': market['id'],
389
+ }
390
+ if limit is not None:
391
+ request['depth'] = limit
392
+ response = self.publicGetL2Symbol(self.extend(request, params))
393
+ return self.parse_order_book(response, market['symbol'], None, 'bids', 'asks', 'px', 'qty')
394
+
395
+ def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
396
+ #
397
+ # {
398
+ # "symbol": "BTC-USD",
399
+ # "price_24h": 47791.86,
400
+ # "volume_24h": 362.88635738,
401
+ # "last_trade_price": 47587.75
402
+ # }
403
+ #
404
+ marketId = self.safe_string(ticker, 'symbol')
405
+ symbol = self.safe_symbol(marketId, market, '-')
406
+ last = self.safe_string(ticker, 'last_trade_price')
407
+ baseVolume = self.safe_string(ticker, 'volume_24h')
408
+ open = self.safe_string(ticker, 'price_24h')
409
+ return self.safe_ticker({
410
+ 'symbol': symbol,
411
+ 'timestamp': None,
412
+ 'datetime': None,
413
+ 'high': None,
414
+ 'low': None,
415
+ 'bid': None,
416
+ 'bidVolume': None,
417
+ 'ask': None,
418
+ 'askVolume': None,
419
+ 'vwap': None,
420
+ 'open': open,
421
+ 'close': None,
422
+ 'last': last,
423
+ 'previousClose': None,
424
+ 'change': None,
425
+ 'percentage': None,
426
+ 'average': None,
427
+ 'baseVolume': baseVolume,
428
+ 'quoteVolume': None,
429
+ 'info': ticker,
430
+ }, market)
431
+
432
+ def fetch_ticker(self, symbol: str, params={}) -> Ticker:
433
+ """
434
+ fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
435
+ :see: https://api.blockchain.com/v3/#/unauthenticated/getTickerBySymbol
436
+ :param str symbol: unified symbol of the market to fetch the ticker for
437
+ :param dict [params]: extra parameters specific to the exchange API endpoint
438
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
439
+ """
440
+ self.load_markets()
441
+ market = self.market(symbol)
442
+ request: dict = {
443
+ 'symbol': market['id'],
444
+ }
445
+ response = self.publicGetTickersSymbol(self.extend(request, params))
446
+ return self.parse_ticker(response, market)
447
+
448
+ def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
449
+ """
450
+ fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
451
+ :see: https://api.blockchain.com/v3/#/unauthenticated/getTickers
452
+ :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
453
+ :param dict [params]: extra parameters specific to the exchange API endpoint
454
+ :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
455
+ """
456
+ self.load_markets()
457
+ tickers = self.publicGetTickers(params)
458
+ return self.parse_tickers(tickers, symbols)
459
+
460
+ def parse_order_state(self, state):
461
+ states: dict = {
462
+ 'OPEN': 'open',
463
+ 'REJECTED': 'rejected',
464
+ 'FILLED': 'closed',
465
+ 'CANCELED': 'canceled',
466
+ 'PART_FILLED': 'open',
467
+ 'EXPIRED': 'expired',
468
+ }
469
+ return self.safe_string(states, state, state)
470
+
471
+ def parse_order(self, order: dict, market: Market = None) -> Order:
472
+ #
473
+ # {
474
+ # "clOrdId": "00001",
475
+ # "ordType": "MARKET",
476
+ # "ordStatus": "FILLED",
477
+ # "side": "BUY",
478
+ # "symbol": "USDC-USDT",
479
+ # "exOrdId": "281775861306290",
480
+ # "price": null,
481
+ # "text": "Fill",
482
+ # "lastShares": "30.0",
483
+ # "lastPx": "0.9999",
484
+ # "leavesQty": "0.0",
485
+ # "cumQty": "30.0",
486
+ # "avgPx": "0.9999",
487
+ # "timestamp": "1633940339619"
488
+ # }
489
+ #
490
+ clientOrderId = self.safe_string(order, 'clOrdId')
491
+ type = self.safe_string_lower(order, 'ordType')
492
+ statusId = self.safe_string(order, 'ordStatus')
493
+ state = self.parse_order_state(statusId)
494
+ side = self.safe_string_lower(order, 'side')
495
+ marketId = self.safe_string(order, 'symbol')
496
+ symbol = self.safe_symbol(marketId, market, '-')
497
+ exchangeOrderId = self.safe_string(order, 'exOrdId')
498
+ price = self.safe_string(order, 'price') if (type != 'market') else None
499
+ average = self.safe_number(order, 'avgPx')
500
+ timestamp = self.safe_integer(order, 'timestamp')
501
+ datetime = self.iso8601(timestamp)
502
+ filled = self.safe_string(order, 'cumQty')
503
+ remaining = self.safe_string(order, 'leavesQty')
504
+ result = self.safe_order({
505
+ 'id': exchangeOrderId,
506
+ 'clientOrderId': clientOrderId,
507
+ 'datetime': datetime,
508
+ 'timestamp': timestamp,
509
+ 'lastTradeTimestamp': None,
510
+ 'status': state,
511
+ 'symbol': symbol,
512
+ 'type': type,
513
+ 'timeInForce': None,
514
+ 'side': side,
515
+ 'price': price,
516
+ 'average': average,
517
+ 'amount': None,
518
+ 'filled': filled,
519
+ 'remaining': remaining,
520
+ 'cost': None,
521
+ 'trades': [],
522
+ 'fees': [],
523
+ 'info': order,
524
+ })
525
+ return result
526
+
527
+ def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
528
+ """
529
+ create a trade order
530
+ :see: https://api.blockchain.com/v3/#/trading/createOrder
531
+ :param str symbol: unified symbol of the market to create an order in
532
+ :param str type: 'market' or 'limit'
533
+ :param str side: 'buy' or 'sell'
534
+ :param float amount: how much of currency you want to trade in units of base currency
535
+ :param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
536
+ :param dict [params]: extra parameters specific to the exchange API endpoint
537
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
538
+ """
539
+ self.load_markets()
540
+ market = self.market(symbol)
541
+ orderType = self.safe_string(params, 'ordType', type)
542
+ uppercaseOrderType = orderType.upper()
543
+ clientOrderId = self.safe_string_2(params, 'clientOrderId', 'clOrdId', self.uuid16())
544
+ params = self.omit(params, ['ordType', 'clientOrderId', 'clOrdId'])
545
+ request: dict = {
546
+ # 'stopPx' : limit price
547
+ # 'timeInForce' : "GTC" for Good Till Cancel, "IOC" for Immediate or Cancel, "FOK" for Fill or Kill, "GTD" Good Till Date
548
+ # 'expireDate' : expiry date in the format YYYYMMDD
549
+ # 'minQty' : The minimum quantity required for an IOC fill
550
+ 'ordType': uppercaseOrderType,
551
+ 'symbol': market['id'],
552
+ 'side': side.upper(),
553
+ 'orderQty': self.amount_to_precision(symbol, amount),
554
+ 'clOrdId': clientOrderId,
555
+ }
556
+ stopPrice = self.safe_value_2(params, 'stopPx', 'stopPrice')
557
+ params = self.omit(params, ['stopPx', 'stopPrice'])
558
+ if uppercaseOrderType == 'STOP' or uppercaseOrderType == 'STOPLIMIT':
559
+ if stopPrice is None:
560
+ raise ArgumentsRequired(self.id + ' createOrder() requires a stopPx or stopPrice param for a ' + uppercaseOrderType + ' order')
561
+ if stopPrice is not None:
562
+ if uppercaseOrderType == 'MARKET':
563
+ request['ordType'] = 'STOP'
564
+ elif uppercaseOrderType == 'LIMIT':
565
+ request['ordType'] = 'STOPLIMIT'
566
+ priceRequired = False
567
+ stopPriceRequired = False
568
+ if request['ordType'] == 'LIMIT' or request['ordType'] == 'STOPLIMIT':
569
+ priceRequired = True
570
+ if request['ordType'] == 'STOP' or request['ordType'] == 'STOPLIMIT':
571
+ stopPriceRequired = True
572
+ if priceRequired:
573
+ request['price'] = self.price_to_precision(symbol, price)
574
+ if stopPriceRequired:
575
+ request['stopPx'] = self.price_to_precision(symbol, stopPrice)
576
+ response = self.privatePostOrders(self.extend(request, params))
577
+ return self.parse_order(response, market)
578
+
579
+ def cancel_order(self, id: str, symbol: Str = None, params={}):
580
+ """
581
+ cancels an open order
582
+ :see: https://api.blockchain.com/v3/#/trading/deleteOrder
583
+ :param str id: order id
584
+ :param str symbol: unified symbol of the market the order was made in
585
+ :param dict [params]: extra parameters specific to the exchange API endpoint
586
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
587
+ """
588
+ request: dict = {
589
+ 'orderId': id,
590
+ }
591
+ response = self.privateDeleteOrdersOrderId(self.extend(request, params))
592
+ return self.safe_order({
593
+ 'id': id,
594
+ 'info': response,
595
+ })
596
+
597
+ def cancel_all_orders(self, symbol: Str = None, params={}):
598
+ """
599
+ cancel all open orders
600
+ :see: https://api.blockchain.com/v3/#deleteallorders
601
+ :param str symbol: unified market symbol of the market to cancel orders in, all markets are used if None, default is None
602
+ :param dict [params]: extra parameters specific to the exchange API endpoint
603
+ :returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
604
+ """
605
+ # cancels all open orders if no symbol specified
606
+ # cancels all open orders of specified symbol, if symbol is specified
607
+ self.load_markets()
608
+ request: dict = {
609
+ # 'symbol': marketId,
610
+ }
611
+ if symbol is not None:
612
+ marketId = self.market_id(symbol)
613
+ request['symbol'] = marketId
614
+ response = self.privateDeleteOrders(self.extend(request, params))
615
+ #
616
+ # {}
617
+ #
618
+ return [
619
+ self.safe_order({
620
+ 'info': response,
621
+ }),
622
+ ]
623
+
624
+ def fetch_trading_fees(self, params={}) -> TradingFees:
625
+ """
626
+ fetch the trading fees for multiple markets
627
+ :see: https://api.blockchain.com/v3/#/trading/getFees
628
+ :param dict [params]: extra parameters specific to the exchange API endpoint
629
+ :returns dict: a dictionary of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>` indexed by market symbols
630
+ """
631
+ self.load_markets()
632
+ response = self.privateGetFees(params)
633
+ #
634
+ # {
635
+ # "makerRate": "0.002",
636
+ # "takerRate": "0.004",
637
+ # "volumeInUSD": "0.0"
638
+ # }
639
+ #
640
+ makerFee = self.safe_number(response, 'makerRate')
641
+ takerFee = self.safe_number(response, 'takerRate')
642
+ result: dict = {}
643
+ for i in range(0, len(self.symbols)):
644
+ symbol = self.symbols[i]
645
+ result[symbol] = {
646
+ 'info': response,
647
+ 'symbol': symbol,
648
+ 'maker': makerFee,
649
+ 'taker': takerFee,
650
+ }
651
+ return result
652
+
653
+ def fetch_canceled_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
654
+ """
655
+ fetches information on multiple canceled orders made by the user
656
+ :see: https://api.blockchain.com/v3/#/trading/getOrders
657
+ :param str symbol: unified market symbol of the market orders were made in
658
+ :param int [since]: timestamp in ms of the earliest order, default is None
659
+ :param int [limit]: max number of orders to return, default is None
660
+ :param dict [params]: extra parameters specific to the exchange API endpoint
661
+ :returns dict: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
662
+ """
663
+ state = 'CANCELED'
664
+ return self.fetch_orders_by_state(state, symbol, since, limit, params)
665
+
666
+ def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
667
+ """
668
+ fetches information on multiple closed orders made by the user
669
+ :see: https://api.blockchain.com/v3/#/trading/getOrders
670
+ :param str symbol: unified market symbol of the market orders were made in
671
+ :param int [since]: the earliest time in ms to fetch orders for
672
+ :param int [limit]: the maximum number of order structures to retrieve
673
+ :param dict [params]: extra parameters specific to the exchange API endpoint
674
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
675
+ """
676
+ state = 'FILLED'
677
+ return self.fetch_orders_by_state(state, symbol, since, limit, params)
678
+
679
+ def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
680
+ """
681
+ fetch all unfilled currently open orders
682
+ :see: https://api.blockchain.com/v3/#/trading/getOrders
683
+ :param str symbol: unified market symbol
684
+ :param int [since]: the earliest time in ms to fetch open orders for
685
+ :param int [limit]: the maximum number of open orders structures to retrieve
686
+ :param dict [params]: extra parameters specific to the exchange API endpoint
687
+ :returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
688
+ """
689
+ state = 'OPEN'
690
+ return self.fetch_orders_by_state(state, symbol, since, limit, params)
691
+
692
+ def fetch_orders_by_state(self, state, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
693
+ self.load_markets()
694
+ request: dict = {
695
+ # 'to': unix epoch ms
696
+ # 'from': unix epoch ms
697
+ 'status': state,
698
+ 'limit': 100,
699
+ }
700
+ market = None
701
+ if symbol is not None:
702
+ market = self.market(symbol)
703
+ request['symbol'] = market['id']
704
+ response = self.privateGetOrders(self.extend(request, params))
705
+ return self.parse_orders(response, market, since, limit)
706
+
707
+ def parse_trade(self, trade: dict, market: Market = None) -> Trade:
708
+ #
709
+ # {
710
+ # "exOrdId":281685751028507,
711
+ # "tradeId":281685434947633,
712
+ # "execId":8847494003,
713
+ # "side":"BUY",
714
+ # "symbol":"AAVE-USDT",
715
+ # "price":405.34,
716
+ # "qty":0.1,
717
+ # "fee":0.162136,
718
+ # "timestamp":1634559249687
719
+ # }
720
+ #
721
+ orderId = self.safe_string(trade, 'exOrdId')
722
+ tradeId = self.safe_string(trade, 'tradeId')
723
+ side = self.safe_string(trade, 'side').lower()
724
+ marketId = self.safe_string(trade, 'symbol')
725
+ priceString = self.safe_string(trade, 'price')
726
+ amountString = self.safe_string(trade, 'qty')
727
+ timestamp = self.safe_integer(trade, 'timestamp')
728
+ datetime = self.iso8601(timestamp)
729
+ market = self.safe_market(marketId, market, '-')
730
+ symbol = market['symbol']
731
+ fee = None
732
+ feeCostString = self.safe_string(trade, 'fee')
733
+ if feeCostString is not None:
734
+ feeCurrency = market['quote']
735
+ fee = {'cost': feeCostString, 'currency': feeCurrency}
736
+ return self.safe_trade({
737
+ 'id': tradeId,
738
+ 'timestamp': timestamp,
739
+ 'datetime': datetime,
740
+ 'symbol': symbol,
741
+ 'order': orderId,
742
+ 'type': None,
743
+ 'side': side,
744
+ 'takerOrMaker': None,
745
+ 'price': priceString,
746
+ 'amount': amountString,
747
+ 'cost': None,
748
+ 'fee': fee,
749
+ 'info': trade,
750
+ }, market)
751
+
752
+ def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
753
+ """
754
+ fetch all trades made by the user
755
+ :see: https://api.blockchain.com/v3/#/trading/getFills
756
+ :param str symbol: unified market symbol
757
+ :param int [since]: the earliest time in ms to fetch trades for
758
+ :param int [limit]: the maximum number of trades structures to retrieve
759
+ :param dict [params]: extra parameters specific to the exchange API endpoint
760
+ :returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
761
+ """
762
+ self.load_markets()
763
+ request: dict = {}
764
+ if limit is not None:
765
+ request['limit'] = limit
766
+ market = None
767
+ if symbol is not None:
768
+ request['symbol'] = self.market_id(symbol)
769
+ market = self.market(symbol)
770
+ trades = self.privateGetFills(self.extend(request, params))
771
+ return self.parse_trades(trades, market, since, limit, params) # need to define
772
+
773
+ def fetch_deposit_address(self, code: str, params={}):
774
+ """
775
+ fetch the deposit address for a currency associated with self account
776
+ :see: https://api.blockchain.com/v3/#/payments/getDepositAddress
777
+ :param str code: unified currency code
778
+ :param dict [params]: extra parameters specific to the exchange API endpoint
779
+ :returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
780
+ """
781
+ self.load_markets()
782
+ currency = self.currency(code)
783
+ request: dict = {
784
+ 'currency': currency['id'],
785
+ }
786
+ response = self.privatePostDepositsCurrency(self.extend(request, params))
787
+ rawAddress = self.safe_string(response, 'address')
788
+ tag = None
789
+ address = None
790
+ if rawAddress is not None:
791
+ addressParts = rawAddress.split(';')
792
+ # if a tag or memo is used it is separated by a colon in the 'address' value
793
+ tag = self.safe_string(addressParts, 0)
794
+ address = self.safe_string(addressParts, 1)
795
+ result: dict = {'info': response}
796
+ result['currency'] = currency['code']
797
+ result['address'] = address
798
+ if tag is not None:
799
+ result['tag'] = tag
800
+ return result
801
+
802
+ def parse_transaction_state(self, state):
803
+ states: dict = {
804
+ 'COMPLETED': 'ok', #
805
+ 'REJECTED': 'failed',
806
+ 'PENDING': 'pending',
807
+ 'FAILED': 'failed',
808
+ 'REFUNDED': 'refunded',
809
+ }
810
+ return self.safe_string(states, state, state)
811
+
812
+ def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
813
+ #
814
+ # deposit
815
+ #
816
+ # {
817
+ # "depositId":"748e9180-be0d-4a80-e175-0156150efc95",
818
+ # "amount":0.009,
819
+ # "currency":"ETH",
820
+ # "address":"0xEC6B5929D454C8D9546d4221ace969E1810Fa92c",
821
+ # "state":"COMPLETED",
822
+ # "txHash":"582114562140e51a80b481c2dfebaf62b4ab9769b8ff54820bb67e34d4a3ab0c",
823
+ # "timestamp":1633697196241
824
+ # }
825
+ #
826
+ # withdrawal
827
+ #
828
+ # {
829
+ # "amount":30.0,
830
+ # "currency":"USDT",
831
+ # "beneficiary":"cab00d11-6e7f-46b7-b453-2e8ef6f101fa", # blockchain specific id
832
+ # "withdrawalId":"99df5ef7-eab6-4033-be49-312930fbd1ea",
833
+ # "fee":34.005078,
834
+ # "state":"COMPLETED",
835
+ # "timestamp":1634218452549
836
+ # }
837
+ #
838
+ type = None
839
+ id = None
840
+ amount = self.safe_number(transaction, 'amount')
841
+ timestamp = self.safe_integer(transaction, 'timestamp')
842
+ currencyId = self.safe_string(transaction, 'currency')
843
+ code = self.safe_currency_code(currencyId, currency)
844
+ state = self.safe_string(transaction, 'state')
845
+ if 'depositId' in transaction:
846
+ type = 'deposit'
847
+ id = self.safe_string(transaction, 'depositId')
848
+ elif 'withdrawalId' in transaction:
849
+ type = 'withdrawal'
850
+ id = self.safe_string(transaction, 'withdrawalId')
851
+ feeCost = self.safe_number(transaction, 'fee') if (type == 'withdrawal') else None
852
+ fee = None
853
+ if feeCost is not None:
854
+ fee = {'currency': code, 'cost': feeCost}
855
+ address = self.safe_string(transaction, 'address')
856
+ txid = self.safe_string(transaction, 'txhash')
857
+ return {
858
+ 'info': transaction,
859
+ 'id': id,
860
+ 'txid': txid,
861
+ 'timestamp': timestamp,
862
+ 'datetime': self.iso8601(timestamp),
863
+ 'network': None,
864
+ 'addressFrom': None,
865
+ 'address': address,
866
+ 'addressTo': address,
867
+ 'tagFrom': None,
868
+ 'tag': None,
869
+ 'tagTo': None,
870
+ 'type': type,
871
+ 'amount': amount,
872
+ 'currency': code,
873
+ 'status': self.parse_transaction_state(state), # 'status': 'pending', # 'ok', 'failed', 'canceled', string
874
+ 'updated': None,
875
+ 'comment': None,
876
+ 'internal': None,
877
+ 'fee': fee,
878
+ }
879
+
880
+ def withdraw(self, code: str, amount: float, address: str, tag=None, params={}):
881
+ """
882
+ make a withdrawal
883
+ :see: https://api.blockchain.com/v3/#/payments/createWithdrawal
884
+ :param str code: unified currency code
885
+ :param float amount: the amount to withdraw
886
+ :param str address: the address to withdraw to
887
+ :param str tag:
888
+ :param dict [params]: extra parameters specific to the exchange API endpoint
889
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
890
+ """
891
+ self.load_markets()
892
+ currency = self.currency(code)
893
+ request: dict = {
894
+ 'amount': amount,
895
+ 'currency': currency['id'],
896
+ 'beneficiary': address,
897
+ 'sendMax': False,
898
+ }
899
+ response = self.privatePostWithdrawals(self.extend(request, params))
900
+ #
901
+ # {
902
+ # "amount": "30.0",
903
+ # "currency": "USDT",
904
+ # "beneficiary": "adcd43fb-9ba6-41f7-8c0d-7013482cb88f",
905
+ # "withdrawalId": "99df5ef7-eab6-4033-be49-312930fbd1ea",
906
+ # "fee": "34.005078",
907
+ # "state": "PENDING",
908
+ # "timestamp": "1634218452595"
909
+ # },
910
+ #
911
+ return self.parse_transaction(response, currency)
912
+
913
+ def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
914
+ """
915
+ fetch all withdrawals made from an account
916
+ :see: https://api.blockchain.com/v3/#/payments/getWithdrawals
917
+ :param str code: unified currency code
918
+ :param int [since]: the earliest time in ms to fetch withdrawals for
919
+ :param int [limit]: the maximum number of withdrawals structures to retrieve
920
+ :param dict [params]: extra parameters specific to the exchange API endpoint
921
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
922
+ """
923
+ self.load_markets()
924
+ request: dict = {
925
+ # 'from' : integer timestamp in ms
926
+ # 'to' : integer timestamp in ms
927
+ }
928
+ if since is not None:
929
+ request['from'] = since
930
+ currency = None
931
+ if code is not None:
932
+ currency = self.currency(code)
933
+ response = self.privateGetWithdrawals(self.extend(request, params))
934
+ return self.parse_transactions(response, currency, since, limit)
935
+
936
+ def fetch_withdrawal(self, id: str, code: Str = None, params={}):
937
+ """
938
+ fetch data on a currency withdrawal via the withdrawal id
939
+ :see: https://api.blockchain.com/v3/#/payments/getWithdrawalById
940
+ :param str id: withdrawal id
941
+ :param str code: not used by blockchaincom.fetchWithdrawal
942
+ :param dict [params]: extra parameters specific to the exchange API endpoint
943
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
944
+ """
945
+ self.load_markets()
946
+ request: dict = {
947
+ 'withdrawalId': id,
948
+ }
949
+ response = self.privateGetWithdrawalsWithdrawalId(self.extend(request, params))
950
+ return self.parse_transaction(response)
951
+
952
+ def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
953
+ """
954
+ fetch all deposits made to an account
955
+ :see: https://api.blockchain.com/v3/#/payments/getDeposits
956
+ :param str code: unified currency code
957
+ :param int [since]: the earliest time in ms to fetch deposits for
958
+ :param int [limit]: the maximum number of deposits structures to retrieve
959
+ :param dict [params]: extra parameters specific to the exchange API endpoint
960
+ :returns dict[]: a list of `transaction structures <https://docs.ccxt.com/#/?id=transaction-structure>`
961
+ """
962
+ self.load_markets()
963
+ request: dict = {
964
+ # 'from' : integer timestamp in ms
965
+ # 'to' : integer timestap in ms
966
+ }
967
+ if since is not None:
968
+ request['from'] = since
969
+ currency = None
970
+ if code is not None:
971
+ currency = self.currency(code)
972
+ response = self.privateGetDeposits(self.extend(request, params))
973
+ return self.parse_transactions(response, currency, since, limit)
974
+
975
+ def fetch_deposit(self, id: str, code: Str = None, params={}):
976
+ """
977
+ fetch information on a deposit
978
+ :see: https://api.blockchain.com/v3/#/payments/getDepositById
979
+ :param str id: deposit id
980
+ :param str code: not used by blockchaincom fetchDeposit()
981
+ :param dict [params]: extra parameters specific to the exchange API endpoint
982
+ :returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
983
+ """
984
+ self.load_markets()
985
+ depositId = self.safe_string(params, 'depositId', id)
986
+ request: dict = {
987
+ 'depositId': depositId,
988
+ }
989
+ deposit = self.privateGetDepositsDepositId(self.extend(request, params))
990
+ return self.parse_transaction(deposit)
991
+
992
+ def fetch_balance(self, params={}) -> Balances:
993
+ """
994
+ query for balance and get the amount of funds available for trading or funds locked in orders
995
+ :see: https://api.blockchain.com/v3/#/payments/getAccounts
996
+ :param dict [params]: extra parameters specific to the exchange API endpoint
997
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
998
+ """
999
+ self.load_markets()
1000
+ accountName = self.safe_string(params, 'account', 'primary')
1001
+ params = self.omit(params, 'account')
1002
+ request: dict = {
1003
+ 'account': accountName,
1004
+ }
1005
+ response = self.privateGetAccounts(self.extend(request, params))
1006
+ #
1007
+ # {
1008
+ # "primary": [
1009
+ # {
1010
+ # "currency":"ETH",
1011
+ # "balance":0.009,
1012
+ # "available":0.009,
1013
+ # "balance_local":30.82869,
1014
+ # "available_local":30.82869,
1015
+ # "rate":3425.41
1016
+ # },
1017
+ # ...
1018
+ # ]
1019
+ # }
1020
+ #
1021
+ balances = self.safe_value(response, accountName)
1022
+ if balances is None:
1023
+ raise ExchangeError(self.id + ' fetchBalance() could not find the "' + accountName + '" account')
1024
+ result: dict = {'info': response}
1025
+ for i in range(0, len(balances)):
1026
+ entry = balances[i]
1027
+ currencyId = self.safe_string(entry, 'currency')
1028
+ code = self.safe_currency_code(currencyId)
1029
+ account = self.account()
1030
+ account['free'] = self.safe_string(entry, 'available')
1031
+ account['total'] = self.safe_string(entry, 'balance')
1032
+ result[code] = account
1033
+ return self.safe_balance(result)
1034
+
1035
+ def fetch_order(self, id: str, symbol: Str = None, params={}):
1036
+ """
1037
+ fetches information on an order made by the user
1038
+ :see: https://api.blockchain.com/v3/#/trading/getOrderById
1039
+ :param str symbol: not used by blockchaincom fetchOrder
1040
+ :param dict [params]: extra parameters specific to the exchange API endpoint
1041
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
1042
+ """
1043
+ # note: only works with exchange-order-id
1044
+ # does not work with clientOrderId
1045
+ self.load_markets()
1046
+ request: dict = {
1047
+ 'orderId': id,
1048
+ }
1049
+ response = self.privateGetOrdersOrderId(self.extend(request, params))
1050
+ #
1051
+ # {
1052
+ # "exOrdId": 11111111,
1053
+ # "clOrdId": "ABC",
1054
+ # "ordType": "MARKET",
1055
+ # "ordStatus": "FILLED",
1056
+ # "side": "BUY",
1057
+ # "price": 0.12345,
1058
+ # "text": "string",
1059
+ # "symbol": "BTC-USD",
1060
+ # "lastShares": 0.5678,
1061
+ # "lastPx": 3500.12,
1062
+ # "leavesQty": 10,
1063
+ # "cumQty": 0.123345,
1064
+ # "avgPx": 345.33,
1065
+ # "timestamp": 1592830770594
1066
+ # }
1067
+ #
1068
+ return self.parse_order(response)
1069
+
1070
+ def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
1071
+ requestPath = '/' + self.implode_params(path, params)
1072
+ url = self.urls['api'][api] + requestPath
1073
+ query = self.omit(params, self.extract_params(path))
1074
+ if api == 'public':
1075
+ if query:
1076
+ url += '?' + self.urlencode(query)
1077
+ elif api == 'private':
1078
+ self.check_required_credentials()
1079
+ headers = {
1080
+ 'X-API-Token': self.secret,
1081
+ }
1082
+ if (method == 'GET'):
1083
+ if query:
1084
+ url += '?' + self.urlencode(query)
1085
+ else:
1086
+ body = self.json(query)
1087
+ headers['Content-Type'] = 'application/json'
1088
+ return {'url': url, 'method': method, 'body': body, 'headers': headers}
1089
+
1090
+ def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
1091
+ # {"timestamp":"2021-10-21T15:13:58.837+00:00","status":404,"error":"Not Found","message":"","path":"/orders/505050"
1092
+ if response is None:
1093
+ return None
1094
+ text = self.safe_string(response, 'text')
1095
+ if text is not None: # if trade currency account is empty returns 200 with rejected order
1096
+ if text == 'Insufficient Balance':
1097
+ raise InsufficientFunds(self.id + ' ' + body)
1098
+ errorCode = self.safe_string(response, 'status')
1099
+ errorMessage = self.safe_string(response, 'error')
1100
+ if code is not None:
1101
+ feedback = self.id + ' ' + self.json(response)
1102
+ self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
1103
+ self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
1104
+ return None