ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. ccxt/__init__.py +39 -35
  2. ccxt/abantether.py +9 -9
  3. ccxt/abstract/alpaca.py +4 -0
  4. ccxt/abstract/apex.py +31 -0
  5. ccxt/abstract/bigone.py +1 -1
  6. ccxt/abstract/binance.py +106 -48
  7. ccxt/abstract/binancecoinm.py +106 -48
  8. ccxt/abstract/binanceus.py +141 -83
  9. ccxt/abstract/binanceusdm.py +106 -48
  10. ccxt/abstract/bingx.py +50 -1
  11. ccxt/abstract/bitbank.py +5 -0
  12. ccxt/abstract/bitfinex.py +136 -65
  13. ccxt/abstract/bitflyer.py +1 -0
  14. ccxt/abstract/bitget.py +67 -0
  15. ccxt/abstract/bitmart.py +19 -1
  16. ccxt/abstract/bitopro.py +1 -0
  17. ccxt/abstract/bitrue.py +68 -68
  18. ccxt/abstract/bitstamp.py +1 -0
  19. ccxt/abstract/blofin.py +30 -0
  20. ccxt/abstract/btcbox.py +2 -0
  21. ccxt/abstract/bybit.py +28 -13
  22. ccxt/abstract/cex.py +28 -29
  23. ccxt/abstract/coinbaseexchange.py +1 -0
  24. ccxt/abstract/coinbaseinternational.py +1 -1
  25. ccxt/abstract/cryptocom.py +16 -0
  26. ccxt/abstract/cryptomus.py +20 -0
  27. ccxt/abstract/defx.py +69 -0
  28. ccxt/abstract/deribit.py +1 -0
  29. ccxt/abstract/derive.py +117 -0
  30. ccxt/abstract/digifinex.py +1 -0
  31. ccxt/abstract/ellipx.py +25 -0
  32. ccxt/abstract/foxbit.py +26 -0
  33. ccxt/abstract/gate.py +19 -0
  34. ccxt/abstract/gateio.py +19 -0
  35. ccxt/abstract/gemini.py +1 -0
  36. ccxt/abstract/hibachi.py +26 -0
  37. ccxt/abstract/hyperliquid.py +1 -1
  38. ccxt/abstract/independentreserve.py +6 -0
  39. ccxt/abstract/kraken.py +1 -0
  40. ccxt/abstract/krakenfutures.py +4 -0
  41. ccxt/abstract/kucoin.py +10 -0
  42. ccxt/abstract/kucoinfutures.py +18 -0
  43. ccxt/abstract/lbank.py +2 -1
  44. ccxt/abstract/luno.py +1 -0
  45. ccxt/abstract/mexc.py +2 -0
  46. ccxt/abstract/modetrade.py +119 -0
  47. ccxt/abstract/myokx.py +349 -0
  48. ccxt/abstract/oceanex.py +5 -0
  49. ccxt/abstract/okx.py +25 -0
  50. ccxt/abstract/okxus.py +349 -0
  51. ccxt/abstract/onetrading.py +0 -12
  52. ccxt/abstract/paradex.py +23 -0
  53. ccxt/abstract/phemex.py +2 -0
  54. ccxt/abstract/poloniex.py +36 -0
  55. ccxt/abstract/tradeogre.py +3 -1
  56. ccxt/abstract/upbit.py +51 -34
  57. ccxt/abstract/whitebit.py +16 -0
  58. ccxt/abstract/woo.py +64 -6
  59. ccxt/abstract/xt.py +10 -5
  60. ccxt/afratether.py +7 -7
  61. ccxt/alpaca.py +828 -51
  62. ccxt/apex.py +1875 -0
  63. ccxt/arzinja.py +7 -7
  64. ccxt/arzplus.py +9 -9
  65. ccxt/ascendex.py +501 -306
  66. ccxt/async_support/__init__.py +39 -35
  67. ccxt/async_support/abantether.py +10 -10
  68. ccxt/async_support/afratether.py +9 -9
  69. ccxt/async_support/alpaca.py +828 -51
  70. ccxt/async_support/apex.py +1875 -0
  71. ccxt/async_support/arzinja.py +10 -10
  72. ccxt/async_support/arzplus.py +12 -12
  73. ccxt/async_support/ascendex.py +502 -306
  74. ccxt/async_support/base/exchange.py +303 -89
  75. ccxt/async_support/base/ws/cache.py +9 -3
  76. ccxt/async_support/base/ws/client.py +173 -38
  77. ccxt/async_support/base/ws/future.py +25 -37
  78. ccxt/async_support/bequant.py +5 -3
  79. ccxt/async_support/bigone.py +279 -144
  80. ccxt/async_support/binance.py +2347 -1158
  81. ccxt/async_support/binancecoinm.py +9 -3
  82. ccxt/async_support/binanceus.py +17 -3
  83. ccxt/async_support/binanceusdm.py +9 -4
  84. ccxt/async_support/bingx.py +2962 -920
  85. ccxt/async_support/bit2c.py +147 -27
  86. ccxt/async_support/bitbank.py +151 -23
  87. ccxt/async_support/bitbns.py +104 -30
  88. ccxt/async_support/bitfinex.py +3291 -1113
  89. ccxt/async_support/bitflyer.py +202 -27
  90. ccxt/async_support/bitget.py +3683 -1538
  91. ccxt/async_support/bithumb.py +195 -38
  92. ccxt/async_support/bitimen.py +12 -12
  93. ccxt/async_support/bitir.py +38 -38
  94. ccxt/async_support/bitmart.py +1288 -350
  95. ccxt/async_support/bitmex.py +260 -75
  96. ccxt/async_support/bitopro.py +262 -62
  97. ccxt/async_support/bitpin.py +17 -16
  98. ccxt/async_support/bitrue.py +459 -290
  99. ccxt/async_support/bitso.py +199 -54
  100. ccxt/async_support/bitstamp.py +230 -96
  101. ccxt/async_support/bitteam.py +167 -25
  102. ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
  103. ccxt/async_support/bitvavo.py +213 -49
  104. ccxt/async_support/blockchaincom.py +160 -46
  105. ccxt/async_support/blofin.py +502 -120
  106. ccxt/async_support/btcalpha.py +169 -31
  107. ccxt/async_support/btcbox.py +292 -23
  108. ccxt/async_support/btcmarkets.py +211 -58
  109. ccxt/async_support/btcturk.py +161 -38
  110. ccxt/async_support/bybit.py +1775 -1030
  111. ccxt/async_support/cex.py +1440 -1303
  112. ccxt/async_support/coinbase.py +724 -212
  113. ccxt/async_support/coinbaseadvanced.py +2 -1
  114. ccxt/async_support/coinbaseexchange.py +388 -89
  115. ccxt/async_support/coinbaseinternational.py +412 -57
  116. ccxt/async_support/coincatch.py +177 -78
  117. ccxt/async_support/coincheck.py +135 -19
  118. ccxt/async_support/coinex.py +606 -232
  119. ccxt/async_support/coinmate.py +189 -63
  120. ccxt/async_support/coinmetro.py +195 -54
  121. ccxt/async_support/coinone.py +158 -51
  122. ccxt/async_support/coinsph.py +336 -61
  123. ccxt/async_support/coinspot.py +151 -52
  124. ccxt/async_support/cryptocom.py +661 -111
  125. ccxt/async_support/cryptomus.py +1137 -0
  126. ccxt/async_support/defx.py +2071 -0
  127. ccxt/async_support/delta.py +299 -99
  128. ccxt/async_support/deribit.py +348 -126
  129. ccxt/async_support/derive.py +2572 -0
  130. ccxt/async_support/digifinex.py +430 -214
  131. ccxt/async_support/ellipx.py +2029 -0
  132. ccxt/async_support/eterex.py +10 -10
  133. ccxt/async_support/excoino.py +31 -31
  134. ccxt/async_support/exir.py +14 -14
  135. ccxt/async_support/exmo.py +344 -131
  136. ccxt/async_support/exnovin.py +10 -10
  137. ccxt/async_support/farhadexchange.py +12 -12
  138. ccxt/async_support/fmfwio.py +2 -1
  139. ccxt/async_support/foxbit.py +1935 -0
  140. ccxt/async_support/gate.py +1351 -529
  141. ccxt/async_support/gateio.py +2 -1
  142. ccxt/async_support/gemini.py +144 -39
  143. ccxt/async_support/hashkey.py +152 -109
  144. ccxt/async_support/hibachi.py +2080 -0
  145. ccxt/async_support/hitbtc.py +395 -167
  146. ccxt/async_support/hitobit.py +12 -12
  147. ccxt/async_support/hollaex.py +307 -119
  148. ccxt/async_support/htx.py +851 -383
  149. ccxt/async_support/huobi.py +2 -1
  150. ccxt/async_support/hyperliquid.py +1848 -536
  151. ccxt/async_support/independentreserve.py +288 -15
  152. ccxt/async_support/indodax.py +190 -33
  153. ccxt/async_support/jibitex.py +12 -12
  154. ccxt/async_support/kraken.py +795 -351
  155. ccxt/async_support/krakenfutures.py +214 -62
  156. ccxt/async_support/kucoin.py +715 -396
  157. ccxt/async_support/kucoinfutures.py +652 -89
  158. ccxt/async_support/latoken.py +217 -113
  159. ccxt/async_support/lbank.py +425 -97
  160. ccxt/async_support/luno.py +382 -35
  161. ccxt/async_support/mercado.py +113 -6
  162. ccxt/async_support/mexc.py +874 -437
  163. ccxt/async_support/modetrade.py +2818 -0
  164. ccxt/async_support/myokx.py +54 -0
  165. ccxt/async_support/ndax.py +221 -64
  166. ccxt/async_support/nobitex.py +31 -37
  167. ccxt/async_support/novadax.py +190 -34
  168. ccxt/async_support/oceanex.py +217 -28
  169. ccxt/async_support/okcoin.py +253 -145
  170. ccxt/async_support/okexchange.py +11 -11
  171. ccxt/async_support/okx.py +1088 -351
  172. ccxt/async_support/okxus.py +54 -0
  173. ccxt/async_support/ompfinex.py +25 -24
  174. ccxt/async_support/onetrading.py +213 -392
  175. ccxt/async_support/oxfun.py +245 -166
  176. ccxt/async_support/p2b.py +151 -29
  177. ccxt/async_support/paradex.py +562 -49
  178. ccxt/async_support/paymium.py +82 -19
  179. ccxt/async_support/phemex.py +713 -172
  180. ccxt/async_support/poloniex.py +1602 -283
  181. ccxt/async_support/probit.py +224 -95
  182. ccxt/async_support/ramzinex.py +30 -27
  183. ccxt/async_support/sarmayex.py +9 -9
  184. ccxt/async_support/sarrafex.py +13 -13
  185. ccxt/async_support/tabdeal.py +14 -13
  186. ccxt/async_support/tetherland.py +9 -9
  187. ccxt/async_support/timex.py +210 -51
  188. ccxt/async_support/tokocrypto.py +167 -47
  189. ccxt/async_support/tradeogre.py +266 -31
  190. ccxt/async_support/twox.py +9 -9
  191. ccxt/async_support/ubitex.py +12 -12
  192. ccxt/async_support/upbit.py +568 -165
  193. ccxt/async_support/vertex.py +160 -32
  194. ccxt/async_support/wallex.py +12 -12
  195. ccxt/async_support/wavesexchange.py +165 -30
  196. ccxt/async_support/whitebit.py +975 -127
  197. ccxt/async_support/woo.py +1918 -1016
  198. ccxt/async_support/woofipro.py +433 -141
  199. ccxt/async_support/xt.py +649 -193
  200. ccxt/async_support/yobit.py +195 -70
  201. ccxt/async_support/zaif.py +91 -15
  202. ccxt/async_support/zonda.py +151 -36
  203. ccxt/base/decimal_to_precision.py +14 -10
  204. ccxt/base/errors.py +49 -18
  205. ccxt/base/exchange.py +1556 -450
  206. ccxt/base/precise.py +10 -0
  207. ccxt/base/types.py +114 -6
  208. ccxt/bequant.py +5 -3
  209. ccxt/bigone.py +279 -144
  210. ccxt/binance.py +2347 -1158
  211. ccxt/binancecoinm.py +9 -3
  212. ccxt/binanceus.py +17 -3
  213. ccxt/binanceusdm.py +9 -4
  214. ccxt/bingx.py +2962 -920
  215. ccxt/bit2c.py +147 -27
  216. ccxt/bitbank.py +151 -23
  217. ccxt/bitbns.py +104 -30
  218. ccxt/bitfinex.py +3290 -1113
  219. ccxt/bitflyer.py +202 -27
  220. ccxt/bitget.py +3683 -1538
  221. ccxt/bithumb.py +194 -38
  222. ccxt/bitimen.py +9 -9
  223. ccxt/bitir.py +35 -35
  224. ccxt/bitmart.py +1288 -350
  225. ccxt/bitmex.py +260 -75
  226. ccxt/bitopro.py +262 -62
  227. ccxt/bitpin.py +15 -14
  228. ccxt/bitrue.py +459 -290
  229. ccxt/bitso.py +199 -54
  230. ccxt/bitstamp.py +230 -96
  231. ccxt/bitteam.py +167 -25
  232. ccxt/{huobijp.py → bittrade.py} +158 -30
  233. ccxt/bitvavo.py +213 -49
  234. ccxt/blockchaincom.py +160 -46
  235. ccxt/blofin.py +502 -120
  236. ccxt/btcalpha.py +169 -31
  237. ccxt/btcbox.py +291 -23
  238. ccxt/btcmarkets.py +211 -58
  239. ccxt/btcturk.py +161 -38
  240. ccxt/bybit.py +1775 -1030
  241. ccxt/cex.py +1439 -1303
  242. ccxt/coinbase.py +724 -212
  243. ccxt/coinbaseadvanced.py +2 -1
  244. ccxt/coinbaseexchange.py +388 -89
  245. ccxt/coinbaseinternational.py +412 -57
  246. ccxt/coincatch.py +177 -78
  247. ccxt/coincheck.py +135 -19
  248. ccxt/coinex.py +606 -232
  249. ccxt/coinmate.py +189 -63
  250. ccxt/coinmetro.py +194 -54
  251. ccxt/coinone.py +158 -51
  252. ccxt/coinsph.py +336 -61
  253. ccxt/coinspot.py +151 -52
  254. ccxt/cryptocom.py +661 -111
  255. ccxt/cryptomus.py +1137 -0
  256. ccxt/defx.py +2070 -0
  257. ccxt/delta.py +299 -99
  258. ccxt/deribit.py +348 -126
  259. ccxt/derive.py +2571 -0
  260. ccxt/digifinex.py +430 -214
  261. ccxt/ellipx.py +2029 -0
  262. ccxt/eterex.py +7 -7
  263. ccxt/excoino.py +29 -29
  264. ccxt/exir.py +11 -11
  265. ccxt/exmo.py +343 -131
  266. ccxt/exnovin.py +8 -8
  267. ccxt/farhadexchange.py +10 -10
  268. ccxt/fmfwio.py +2 -1
  269. ccxt/foxbit.py +1935 -0
  270. ccxt/gate.py +1351 -529
  271. ccxt/gateio.py +2 -1
  272. ccxt/gemini.py +144 -39
  273. ccxt/hashkey.py +152 -109
  274. ccxt/hibachi.py +2079 -0
  275. ccxt/hitbtc.py +395 -167
  276. ccxt/hitobit.py +9 -9
  277. ccxt/hollaex.py +307 -119
  278. ccxt/htx.py +851 -383
  279. ccxt/huobi.py +2 -1
  280. ccxt/hyperliquid.py +1848 -536
  281. ccxt/independentreserve.py +287 -15
  282. ccxt/indodax.py +190 -33
  283. ccxt/jibitex.py +9 -9
  284. ccxt/kraken.py +794 -351
  285. ccxt/krakenfutures.py +214 -62
  286. ccxt/kucoin.py +715 -396
  287. ccxt/kucoinfutures.py +652 -89
  288. ccxt/latoken.py +217 -113
  289. ccxt/lbank.py +425 -97
  290. ccxt/luno.py +382 -35
  291. ccxt/mercado.py +113 -6
  292. ccxt/mexc.py +873 -437
  293. ccxt/modetrade.py +2818 -0
  294. ccxt/myokx.py +54 -0
  295. ccxt/ndax.py +221 -64
  296. ccxt/nobitex.py +29 -35
  297. ccxt/novadax.py +190 -34
  298. ccxt/oceanex.py +217 -28
  299. ccxt/okcoin.py +253 -145
  300. ccxt/okexchange.py +9 -9
  301. ccxt/okx.py +1088 -351
  302. ccxt/okxus.py +54 -0
  303. ccxt/ompfinex.py +22 -21
  304. ccxt/onetrading.py +213 -392
  305. ccxt/oxfun.py +245 -166
  306. ccxt/p2b.py +151 -29
  307. ccxt/paradex.py +562 -49
  308. ccxt/paymium.py +82 -19
  309. ccxt/phemex.py +712 -172
  310. ccxt/poloniex.py +1601 -283
  311. ccxt/pro/__init__.py +76 -17
  312. ccxt/pro/alpaca.py +21 -6
  313. ccxt/pro/apex.py +984 -0
  314. ccxt/pro/ascendex.py +58 -10
  315. ccxt/pro/bequant.py +6 -1
  316. ccxt/pro/binance.py +728 -156
  317. ccxt/pro/binancecoinm.py +6 -2
  318. ccxt/pro/binanceus.py +8 -4
  319. ccxt/pro/binanceusdm.py +7 -2
  320. ccxt/pro/bingx.py +333 -142
  321. ccxt/pro/bitfinex.py +727 -262
  322. ccxt/pro/bitget.py +570 -79
  323. ccxt/pro/bithumb.py +20 -6
  324. ccxt/pro/bitmart.py +216 -87
  325. ccxt/pro/bitmex.py +47 -9
  326. ccxt/pro/bitopro.py +26 -14
  327. ccxt/pro/bitrue.py +22 -22
  328. ccxt/pro/bitstamp.py +54 -21
  329. ccxt/pro/{huobijp.py → bittrade.py} +7 -6
  330. ccxt/pro/bitvavo.py +191 -67
  331. ccxt/pro/blockchaincom.py +21 -8
  332. ccxt/pro/blofin.py +9 -1
  333. ccxt/pro/bybit.py +632 -245
  334. ccxt/pro/cex.py +59 -24
  335. ccxt/pro/coinbase.py +102 -73
  336. ccxt/pro/coinbaseadvanced.py +2 -1
  337. ccxt/pro/coinbaseexchange.py +8 -8
  338. ccxt/pro/coinbaseinternational.py +181 -25
  339. ccxt/pro/coincatch.py +6 -7
  340. ccxt/pro/coincheck.py +11 -6
  341. ccxt/pro/coinex.py +967 -665
  342. ccxt/pro/coinone.py +16 -9
  343. ccxt/pro/cryptocom.py +448 -45
  344. ccxt/pro/defx.py +831 -0
  345. ccxt/pro/deribit.py +150 -14
  346. ccxt/pro/derive.py +704 -0
  347. ccxt/pro/exmo.py +239 -6
  348. ccxt/pro/gate.py +623 -65
  349. ccxt/pro/gateio.py +2 -1
  350. ccxt/pro/gemini.py +27 -11
  351. ccxt/pro/hashkey.py +2 -2
  352. ccxt/pro/hitbtc.py +196 -91
  353. ccxt/pro/hollaex.py +23 -7
  354. ccxt/pro/htx.py +51 -14
  355. ccxt/pro/huobi.py +2 -1
  356. ccxt/pro/hyperliquid.py +591 -27
  357. ccxt/pro/independentreserve.py +9 -6
  358. ccxt/pro/kraken.py +640 -320
  359. ccxt/pro/krakenfutures.py +62 -35
  360. ccxt/pro/kucoin.py +267 -46
  361. ccxt/pro/kucoinfutures.py +165 -21
  362. ccxt/pro/lbank.py +102 -21
  363. ccxt/pro/luno.py +12 -8
  364. ccxt/pro/mexc.py +877 -111
  365. ccxt/pro/modetrade.py +1271 -0
  366. ccxt/pro/myokx.py +38 -0
  367. ccxt/pro/ndax.py +15 -2
  368. ccxt/pro/okcoin.py +23 -4
  369. ccxt/pro/okx.py +573 -98
  370. ccxt/pro/okxus.py +38 -0
  371. ccxt/pro/onetrading.py +30 -13
  372. ccxt/pro/oxfun.py +131 -27
  373. ccxt/pro/p2b.py +88 -22
  374. ccxt/pro/paradex.py +3 -3
  375. ccxt/pro/phemex.py +75 -21
  376. ccxt/pro/poloniex.py +124 -41
  377. ccxt/pro/probit.py +87 -80
  378. ccxt/pro/tradeogre.py +272 -0
  379. ccxt/pro/upbit.py +152 -12
  380. ccxt/pro/vertex.py +8 -3
  381. ccxt/pro/whitebit.py +58 -5
  382. ccxt/pro/woo.py +228 -37
  383. ccxt/pro/woofipro.py +106 -18
  384. ccxt/pro/xt.py +111 -5
  385. ccxt/probit.py +224 -95
  386. ccxt/protobuf/__init__.py +0 -0
  387. ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
  388. ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
  389. ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
  390. ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
  391. ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
  392. ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
  393. ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
  394. ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
  395. ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
  396. ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
  397. ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
  398. ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
  399. ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
  400. ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
  401. ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
  402. ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
  403. ccxt/protobuf/mexc/__init__.py +0 -0
  404. ccxt/ramzinex.py +28 -25
  405. ccxt/sarmayex.py +7 -7
  406. ccxt/sarrafex.py +10 -10
  407. ccxt/static_dependencies/__init__.py +1 -1
  408. ccxt/static_dependencies/lark/py.typed +0 -0
  409. ccxt/static_dependencies/marshmallow/py.typed +0 -0
  410. ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  411. ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  412. ccxt/tabdeal.py +12 -11
  413. ccxt/test/tests_async.py +261 -57
  414. ccxt/test/tests_helpers.py +1 -3
  415. ccxt/test/tests_init.py +4 -3
  416. ccxt/test/tests_sync.py +261 -57
  417. ccxt/tetherland.py +7 -7
  418. ccxt/timex.py +210 -51
  419. ccxt/tokocrypto.py +167 -47
  420. ccxt/tradeogre.py +266 -31
  421. ccxt/twox.py +7 -7
  422. ccxt/ubitex.py +9 -9
  423. ccxt/upbit.py +568 -165
  424. ccxt/vertex.py +160 -32
  425. ccxt/wallex.py +9 -9
  426. ccxt/wavesexchange.py +165 -30
  427. ccxt/whitebit.py +975 -127
  428. ccxt/woo.py +1917 -1016
  429. ccxt/woofipro.py +432 -141
  430. ccxt/xt.py +649 -193
  431. ccxt/yobit.py +194 -70
  432. ccxt/zaif.py +91 -15
  433. ccxt/zonda.py +151 -36
  434. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
  435. ccxt_ir-4.5.0.dist-info/RECORD +743 -0
  436. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
  437. ccxt/abstract/ace.py +0 -15
  438. ccxt/abstract/bitbay.py +0 -53
  439. ccxt/abstract/bitcoincom.py +0 -115
  440. ccxt/abstract/bitfinex2.py +0 -139
  441. ccxt/abstract/bitpanda.py +0 -35
  442. ccxt/abstract/bl3p.py +0 -19
  443. ccxt/abstract/coinlist.py +0 -54
  444. ccxt/abstract/currencycom.py +0 -68
  445. ccxt/abstract/hitbtc3.py +0 -115
  446. ccxt/abstract/idex.py +0 -26
  447. ccxt/abstract/kuna.py +0 -182
  448. ccxt/abstract/lykke.py +0 -29
  449. ccxt/abstract/poloniexfutures.py +0 -48
  450. ccxt/abstract/wazirx.py +0 -30
  451. ccxt/ace.py +0 -1012
  452. ccxt/async_support/ace.py +0 -1012
  453. ccxt/async_support/base/ws/aiohttp_client.py +0 -125
  454. ccxt/async_support/base/ws/fast_client.py +0 -96
  455. ccxt/async_support/bitbay.py +0 -17
  456. ccxt/async_support/bitcoincom.py +0 -17
  457. ccxt/async_support/bitfinex2.py +0 -3552
  458. ccxt/async_support/bitpanda.py +0 -16
  459. ccxt/async_support/bl3p.py +0 -485
  460. ccxt/async_support/coinlist.py +0 -2243
  461. ccxt/async_support/currencycom.py +0 -1950
  462. ccxt/async_support/hitbtc3.py +0 -16
  463. ccxt/async_support/idex.py +0 -1766
  464. ccxt/async_support/kuna.py +0 -1841
  465. ccxt/async_support/lykke.py +0 -1270
  466. ccxt/async_support/poloniexfutures.py +0 -1717
  467. ccxt/async_support/wazirx.py +0 -1224
  468. ccxt/bitbay.py +0 -17
  469. ccxt/bitcoincom.py +0 -17
  470. ccxt/bitfinex2.py +0 -3552
  471. ccxt/bitpanda.py +0 -16
  472. ccxt/bl3p.py +0 -485
  473. ccxt/coinlist.py +0 -2243
  474. ccxt/currencycom.py +0 -1950
  475. ccxt/hitbtc3.py +0 -16
  476. ccxt/idex.py +0 -1766
  477. ccxt/kuna.py +0 -1841
  478. ccxt/lykke.py +0 -1270
  479. ccxt/poloniexfutures.py +0 -1717
  480. ccxt/pro/bitcoincom.py +0 -34
  481. ccxt/pro/bitfinex2.py +0 -1083
  482. ccxt/pro/bitpanda.py +0 -15
  483. ccxt/pro/currencycom.py +0 -536
  484. ccxt/pro/idex.py +0 -672
  485. ccxt/pro/poloniexfutures.py +0 -990
  486. ccxt/pro/wazirx.py +0 -749
  487. ccxt/test/base/__init__.py +0 -29
  488. ccxt/test/base/test_account.py +0 -26
  489. ccxt/test/base/test_balance.py +0 -56
  490. ccxt/test/base/test_borrow_interest.py +0 -35
  491. ccxt/test/base/test_borrow_rate.py +0 -32
  492. ccxt/test/base/test_calculate_fee.py +0 -51
  493. ccxt/test/base/test_crypto.py +0 -127
  494. ccxt/test/base/test_currency.py +0 -76
  495. ccxt/test/base/test_datetime.py +0 -109
  496. ccxt/test/base/test_decimal_to_precision.py +0 -392
  497. ccxt/test/base/test_deep_extend.py +0 -68
  498. ccxt/test/base/test_deposit_withdrawal.py +0 -50
  499. ccxt/test/base/test_exchange_datetime_functions.py +0 -76
  500. ccxt/test/base/test_funding_rate_history.py +0 -29
  501. ccxt/test/base/test_last_price.py +0 -31
  502. ccxt/test/base/test_ledger_entry.py +0 -45
  503. ccxt/test/base/test_ledger_item.py +0 -48
  504. ccxt/test/base/test_leverage_tier.py +0 -33
  505. ccxt/test/base/test_liquidation.py +0 -50
  506. ccxt/test/base/test_margin_mode.py +0 -24
  507. ccxt/test/base/test_margin_modification.py +0 -35
  508. ccxt/test/base/test_market.py +0 -193
  509. ccxt/test/base/test_number.py +0 -411
  510. ccxt/test/base/test_ohlcv.py +0 -33
  511. ccxt/test/base/test_open_interest.py +0 -32
  512. ccxt/test/base/test_order.py +0 -64
  513. ccxt/test/base/test_order_book.py +0 -69
  514. ccxt/test/base/test_position.py +0 -60
  515. ccxt/test/base/test_shared_methods.py +0 -353
  516. ccxt/test/base/test_status.py +0 -24
  517. ccxt/test/base/test_throttle.py +0 -126
  518. ccxt/test/base/test_ticker.py +0 -92
  519. ccxt/test/base/test_trade.py +0 -47
  520. ccxt/test/base/test_trading_fee.py +0 -26
  521. ccxt/test/base/test_transaction.py +0 -39
  522. ccxt/test/test_async.py +0 -1649
  523. ccxt/test/test_sync.py +0 -1648
  524. ccxt/wazirx.py +0 -1224
  525. ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
  526. /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
  527. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
  528. {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/defx.py ADDED
@@ -0,0 +1,831 @@
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
+ import ccxt.async_support
7
+ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
+ from ccxt.base.types import Any, Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.async_support.base.ws.client import Client
10
+ from typing import List
11
+ from ccxt.base.errors import ExchangeError
12
+ from ccxt.base.errors import ArgumentsRequired
13
+
14
+
15
+ class defx(ccxt.async_support.defx):
16
+
17
+ def describe(self) -> Any:
18
+ return self.deep_extend(super(defx, self).describe(), {
19
+ 'has': {
20
+ 'ws': True,
21
+ 'watchBalance': True,
22
+ 'watchTicker': True,
23
+ 'watchTickers': True,
24
+ 'watchBidsAsks': True,
25
+ 'watchTrades': True,
26
+ 'watchTradesForSymbols': True,
27
+ 'watchMyTrades': False,
28
+ 'watchOrders': True,
29
+ 'watchOrderBook': True,
30
+ 'watchOrderBookForSymbols': True,
31
+ 'watchOHLCV': True,
32
+ 'watchOHLCVForSymbols': True,
33
+ },
34
+ 'urls': {
35
+ 'test': {
36
+ 'ws': {
37
+ 'public': 'wss://stream.testnet.defx.com/pricefeed',
38
+ 'private': 'wss://ws.testnet.defx.com/user',
39
+ },
40
+ },
41
+ 'api': {
42
+ 'ws': {
43
+ 'public': 'wss://marketfeed.api.defx.com/pricefeed',
44
+ 'private': 'wss://userfeed.api.defx.com/user',
45
+ },
46
+ },
47
+ },
48
+ 'options': {
49
+ 'listenKeyRefreshRate': 3540000, # 1 hour(59 mins so we have 1min to renew the token)
50
+ 'ws': {
51
+ 'timeframes': {
52
+ '1m': '1m',
53
+ '3m': '3m',
54
+ '5m': '5m',
55
+ '15m': '15m',
56
+ '30m': '30m',
57
+ '1h': '1h',
58
+ '2h': '2h',
59
+ '4h': '4h',
60
+ '12h': '12h',
61
+ '1d': '1d',
62
+ '1w': '1w',
63
+ '1M': '1M',
64
+ },
65
+ },
66
+ },
67
+ 'streaming': {
68
+ },
69
+ 'exceptions': {
70
+ },
71
+ })
72
+
73
+ async def watch_public(self, topics, messageHashes, params={}):
74
+ await self.load_markets()
75
+ url = self.urls['api']['ws']['public']
76
+ request: dict = {
77
+ 'method': 'SUBSCRIBE',
78
+ 'topics': topics,
79
+ }
80
+ message = self.extend(request, params)
81
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
82
+
83
+ async def un_watch_public(self, topics, messageHashes, params={}):
84
+ await self.load_markets()
85
+ url = self.urls['api']['ws']['public']
86
+ request: dict = {
87
+ 'method': 'UNSUBSCRIBE',
88
+ 'topics': topics,
89
+ }
90
+ message = self.extend(request, params)
91
+ return await self.watch_multiple(url, messageHashes, message, messageHashes)
92
+
93
+ async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
94
+ """
95
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
96
+
97
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
98
+
99
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
100
+ :param str timeframe: the length of time each candle represents
101
+ :param int [since]: timestamp in ms of the earliest candle to fetch
102
+ :param int [limit]: the maximum amount of candles to fetch
103
+ :param dict [params]: extra parameters specific to the exchange API endpoint
104
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
105
+ """
106
+ result = await self.watch_ohlcv_for_symbols([[symbol, timeframe]], since, limit, params)
107
+ return result[symbol][timeframe]
108
+
109
+ async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
110
+ """
111
+ watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
112
+
113
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
114
+
115
+ :param str symbol: unified symbol of the market to fetch OHLCV data for
116
+ :param str timeframe: the length of time each candle represents
117
+ :param dict [params]: extra parameters specific to the exchange API endpoint
118
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
119
+ """
120
+ return await self.un_watch_ohlcv_for_symbols([[symbol, timeframe]], params)
121
+
122
+ async def watch_ohlcv_for_symbols(self, symbolsAndTimeframes: List[List[str]], since: Int = None, limit: Int = None, params={}):
123
+ """
124
+ watches historical candlestick data containing the open, high, low, close price, and the volume of a market
125
+
126
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
127
+
128
+ :param str[][] symbolsAndTimeframes: array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
129
+ :param int [since]: timestamp in ms of the earliest candle to fetch
130
+ :param int [limit]: the maximum amount of candles to fetch
131
+ :param dict [params]: extra parameters specific to the exchange API endpoint
132
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
133
+ """
134
+ symbolsLength = len(symbolsAndTimeframes)
135
+ if symbolsLength == 0 or not isinstance(symbolsAndTimeframes[0], list):
136
+ raise ArgumentsRequired(self.id + " watchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]")
137
+ await self.load_markets()
138
+ topics = []
139
+ messageHashes = []
140
+ for i in range(0, len(symbolsAndTimeframes)):
141
+ symbolAndTimeframe = symbolsAndTimeframes[i]
142
+ marketId = self.safe_string(symbolAndTimeframe, 0)
143
+ market = self.market(marketId)
144
+ tf = self.safe_string(symbolAndTimeframe, 1)
145
+ interval = self.safe_string(self.timeframes, tf, tf)
146
+ topics.append('symbol:' + market['id'] + ':ohlc:' + interval)
147
+ messageHashes.append('candles:' + interval + ':' + market['symbol'])
148
+ symbol, timeframe, candles = await self.watch_public(topics, messageHashes, params)
149
+ if self.newUpdates:
150
+ limit = candles.getLimit(symbol, limit)
151
+ filtered = self.filter_by_since_limit(candles, since, limit, 0, True)
152
+ return self.create_ohlcv_object(symbol, timeframe, filtered)
153
+
154
+ async def un_watch_ohlcv_for_symbols(self, symbolsAndTimeframes: List[List[str]], params={}) -> Any:
155
+ """
156
+ unWatches historical candlestick data containing the open, high, low, and close price, and the volume of a market
157
+
158
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
159
+
160
+ :param str[][] symbolsAndTimeframes: array of arrays containing unified symbols and timeframes to fetch OHLCV data for, example [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]
161
+ :param dict [params]: extra parameters specific to the exchange API endpoint
162
+ :returns int[][]: A list of candles ordered, open, high, low, close, volume
163
+ """
164
+ symbolsLength = len(symbolsAndTimeframes)
165
+ if symbolsLength == 0 or not isinstance(symbolsAndTimeframes[0], list):
166
+ raise ArgumentsRequired(self.id + " unWatchOHLCVForSymbols() requires a an array of symbols and timeframes, like [['BTC/USDT', '1m'], ['LTC/USDT', '5m']]")
167
+ await self.load_markets()
168
+ topics = []
169
+ messageHashes = []
170
+ for i in range(0, len(symbolsAndTimeframes)):
171
+ symbolAndTimeframe = symbolsAndTimeframes[i]
172
+ marketId = self.safe_string(symbolAndTimeframe, 0)
173
+ market = self.market(marketId)
174
+ tf = self.safe_string(symbolAndTimeframe, 1)
175
+ interval = self.safe_string(self.timeframes, tf, tf)
176
+ topics.append('symbol:' + market['id'] + ':ohlc:' + interval)
177
+ messageHashes.append('candles:' + interval + ':' + market['symbol'])
178
+ return await self.un_watch_public(topics, messageHashes, params)
179
+
180
+ def handle_ohlcv(self, client: Client, message):
181
+ #
182
+ # {
183
+ # "topic": "symbol:BTC_USDC:ohlc:3m",
184
+ # "event": "ohlc",
185
+ # "timestamp": 1730794277104,
186
+ # "data": {
187
+ # "symbol": "BTC_USDC",
188
+ # "window": "3m",
189
+ # "open": "57486.90000000",
190
+ # "high": "57486.90000000",
191
+ # "low": "57486.90000000",
192
+ # "close": "57486.90000000",
193
+ # "volume": "0.000",
194
+ # "quoteAssetVolume": "0.00000000",
195
+ # "takerBuyAssetVolume": "0.000",
196
+ # "takerBuyQuoteAssetVolume": "0.00000000",
197
+ # "numberOfTrades": 0,
198
+ # "start": 1730794140000,
199
+ # "end": 1730794320000,
200
+ # "isClosed": False
201
+ # }
202
+ # }
203
+ #
204
+ data = self.safe_dict(message, 'data', {})
205
+ marketId = self.safe_string(data, 'symbol')
206
+ market = self.market(marketId)
207
+ symbol = market['symbol']
208
+ timeframe = self.safe_string(data, 'window')
209
+ if not (symbol in self.ohlcvs):
210
+ self.ohlcvs[symbol] = {}
211
+ if not (timeframe in self.ohlcvs[symbol]):
212
+ limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
213
+ stored = ArrayCacheByTimestamp(limit)
214
+ self.ohlcvs[symbol][timeframe] = stored
215
+ ohlcv = self.ohlcvs[symbol][timeframe]
216
+ parsed = self.parse_ohlcv(data)
217
+ ohlcv.append(parsed)
218
+ messageHash = 'candles:' + timeframe + ':' + symbol
219
+ client.resolve([symbol, timeframe, ohlcv], messageHash)
220
+
221
+ async def watch_ticker(self, symbol: str, params={}) -> Ticker:
222
+ """
223
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
224
+
225
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
226
+
227
+ :param str symbol: unified symbol of the market to fetch the ticker for
228
+ :param dict [params]: extra parameters specific to the exchange API endpoint
229
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
230
+ """
231
+ await self.load_markets()
232
+ market = self.market(symbol)
233
+ symbol = market['symbol']
234
+ topic = 'symbol:' + market['id'] + ':24hrTicker'
235
+ messageHash = 'ticker:' + symbol
236
+ return await self.watch_public([topic], [messageHash], params)
237
+
238
+ async def un_watch_ticker(self, symbol: str, params={}) -> Any:
239
+ """
240
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
241
+
242
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
243
+
244
+ :param str symbol: unified symbol of the market to fetch the ticker for
245
+ :param dict [params]: extra parameters specific to the exchange API endpoint
246
+ :param str [params.channel]: the channel to subscribe to, tickers by default. Can be tickers, sprd-tickers, index-tickers, block-tickers
247
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
248
+ """
249
+ return await self.un_watch_tickers([symbol], params)
250
+
251
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
252
+ """
253
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
254
+
255
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
256
+
257
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
258
+ :param dict [params]: extra parameters specific to the exchange API endpoint
259
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
260
+ """
261
+ await self.load_markets()
262
+ symbols = self.market_symbols(symbols, None, False)
263
+ topics = []
264
+ messageHashes = []
265
+ for i in range(0, len(symbols)):
266
+ symbol = symbols[i]
267
+ marketId = self.market_id(symbol)
268
+ topics.append('symbol:' + marketId + ':24hrTicker')
269
+ messageHashes.append('ticker:' + symbol)
270
+ await self.watch_public(topics, messageHashes, params)
271
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
272
+
273
+ async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
274
+ """
275
+ unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
276
+
277
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
278
+
279
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
280
+ :param dict [params]: extra parameters specific to the exchange API endpoint
281
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
282
+ """
283
+ await self.load_markets()
284
+ symbols = self.market_symbols(symbols, None, False)
285
+ topics = []
286
+ messageHashes = []
287
+ for i in range(0, len(symbols)):
288
+ symbol = symbols[i]
289
+ marketId = self.market_id(symbol)
290
+ topics.append('symbol:' + marketId + ':24hrTicker')
291
+ messageHashes.append('ticker:' + symbol)
292
+ return await self.un_watch_public(topics, messageHashes, params)
293
+
294
+ def handle_ticker(self, client: Client, message):
295
+ #
296
+ # {
297
+ # "topic": "symbol:BTC_USDC:24hrTicker",
298
+ # "event": "24hrTicker",
299
+ # "timestamp": 1730862543095,
300
+ # "data": {
301
+ # "symbol": "BTC_USDC",
302
+ # "priceChange": "17114.70000000",
303
+ # "priceChangePercent": "29.77",
304
+ # "weightedAvgPrice": "6853147668",
305
+ # "lastPrice": "74378.90000000",
306
+ # "lastQty": "0.107",
307
+ # "bestBidPrice": "61987.60000000",
308
+ # "bestBidQty": "0.005",
309
+ # "bestAskPrice": "84221.60000000",
310
+ # "bestAskQty": "0.015",
311
+ # "openPrice": "57486.90000000",
312
+ # "highPrice": "88942.60000000",
313
+ # "lowPrice": "47364.20000000",
314
+ # "volume": "28.980",
315
+ # "quoteVolume": "1986042.19424035",
316
+ # "openTime": 1730776080000,
317
+ # "closeTime": 1730862540000,
318
+ # "openInterestBase": "67.130",
319
+ # "openInterestQuote": "5008005.40800000"
320
+ # }
321
+ # }
322
+ #
323
+ self.handle_bid_ask(client, message)
324
+ data = self.safe_dict(message, 'data', {})
325
+ parsedTicker = self.parse_ticker(data)
326
+ symbol = parsedTicker['symbol']
327
+ timestamp = self.safe_integer(message, 'timestamp')
328
+ parsedTicker['timestamp'] = timestamp
329
+ parsedTicker['datetime'] = self.iso8601(timestamp)
330
+ self.tickers[symbol] = parsedTicker
331
+ messageHash = 'ticker:' + symbol
332
+ client.resolve(parsedTicker, messageHash)
333
+
334
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
335
+ """
336
+ watches best bid & ask for symbols
337
+
338
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
339
+
340
+ :param str[] symbols: unified symbol of the market to fetch the ticker for
341
+ :param dict [params]: extra parameters specific to the exchange API endpoint
342
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
343
+ """
344
+ await self.load_markets()
345
+ symbols = self.market_symbols(symbols, None, False)
346
+ topics = []
347
+ messageHashes = []
348
+ for i in range(0, len(symbols)):
349
+ symbol = symbols[i]
350
+ marketId = self.market_id(symbol)
351
+ topics.append('symbol:' + marketId + ':24hrTicker')
352
+ messageHashes.append('bidask:' + symbol)
353
+ await self.watch_public(topics, messageHashes, params)
354
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
355
+
356
+ def handle_bid_ask(self, client: Client, message):
357
+ data = self.safe_dict(message, 'data', {})
358
+ parsedTicker = self.parse_ws_bid_ask(data)
359
+ symbol = parsedTicker['symbol']
360
+ timestamp = self.safe_integer(message, 'timestamp')
361
+ parsedTicker['timestamp'] = timestamp
362
+ parsedTicker['datetime'] = self.iso8601(timestamp)
363
+ self.bidsasks[symbol] = parsedTicker
364
+ messageHash = 'bidask:' + symbol
365
+ client.resolve(parsedTicker, messageHash)
366
+
367
+ def parse_ws_bid_ask(self, ticker, market=None):
368
+ marketId = self.safe_string(ticker, 'symbol')
369
+ market = self.safe_market(marketId, market)
370
+ symbol = self.safe_string(market, 'symbol')
371
+ return self.safe_ticker({
372
+ 'symbol': symbol,
373
+ 'timestamp': None,
374
+ 'datetime': None,
375
+ 'ask': self.safe_string(ticker, 'bestAskPrice'),
376
+ 'askVolume': self.safe_string(ticker, 'bestAskQty'),
377
+ 'bid': self.safe_string(ticker, 'bestBidPrice'),
378
+ 'bidVolume': self.safe_string(ticker, 'bestBidQty'),
379
+ 'info': ticker,
380
+ }, market)
381
+
382
+ async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
383
+ """
384
+ watches information on multiple trades made in a market
385
+
386
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
387
+
388
+ :param str symbol: unified symbol of the market to fetch the ticker for
389
+ :param int [since]: the earliest time in ms to fetch trades for
390
+ :param int [limit]: the maximum number of trade structures to retrieve
391
+ :param dict [params]: extra parameters specific to the exchange API endpoint
392
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
393
+ """
394
+ return await self.watch_trades_for_symbols([symbol], since, limit, params)
395
+
396
+ async def un_watch_trades(self, symbol: str, params={}) -> Any:
397
+ """
398
+ unWatches from the stream channel
399
+
400
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
401
+
402
+ :param str symbol: unified symbol of the market to fetch trades for
403
+ :param dict [params]: extra parameters specific to the exchange API endpoint
404
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
405
+ """
406
+ return await self.un_watch_trades_for_symbols([symbol], params)
407
+
408
+ async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
409
+ """
410
+ watches information on multiple trades made in a market
411
+
412
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
413
+
414
+ :param str[] symbols: unified symbol of the market to fetch trades for
415
+ :param int [since]: the earliest time in ms to fetch trades for
416
+ :param int [limit]: the maximum number of trade structures to retrieve
417
+ :param dict [params]: extra parameters specific to the exchange API endpoint
418
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
419
+ """
420
+ await self.load_markets()
421
+ symbols = self.market_symbols(symbols)
422
+ symbolsLength = len(symbols)
423
+ if symbolsLength == 0:
424
+ raise ArgumentsRequired(self.id + ' watchTradesForSymbols() requires a non-empty array of symbols')
425
+ topics = []
426
+ messageHashes = []
427
+ for i in range(0, len(symbols)):
428
+ symbol = symbols[i]
429
+ marketId = self.market_id(symbol)
430
+ topics.append('symbol:' + marketId + ':trades')
431
+ messageHashes.append('trade:' + symbol)
432
+ trades = await self.watch_public(topics, messageHashes, params)
433
+ if self.newUpdates:
434
+ first = self.safe_value(trades, 0)
435
+ tradeSymbol = self.safe_string(first, 'symbol')
436
+ limit = trades.getLimit(tradeSymbol, limit)
437
+ return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
438
+
439
+ async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
440
+ """
441
+ unWatches from the stream channel
442
+
443
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
444
+
445
+ :param str[] symbols: unified symbol of the market to fetch trades for
446
+ :param dict [params]: extra parameters specific to the exchange API endpoint
447
+ :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
448
+ """
449
+ await self.load_markets()
450
+ symbols = self.market_symbols(symbols)
451
+ symbolsLength = len(symbols)
452
+ if symbolsLength == 0:
453
+ raise ArgumentsRequired(self.id + ' unWatchTradesForSymbols() requires a non-empty array of symbols')
454
+ topics = []
455
+ messageHashes = []
456
+ for i in range(0, len(symbols)):
457
+ symbol = symbols[i]
458
+ marketId = self.market_id(symbol)
459
+ topics.append('symbol:' + marketId + ':trades')
460
+ messageHashes.append('trade:' + symbol)
461
+ return await self.un_watch_public(topics, messageHashes, params)
462
+
463
+ def handle_trades(self, client: Client, message):
464
+ #
465
+ # {
466
+ # "topic": "symbol:SOL_USDC:trades",
467
+ # "event": "trades",
468
+ # "timestamp": 1730967426331,
469
+ # "data": {
470
+ # "buyerMaker": True,
471
+ # "price": "188.38700000",
472
+ # "qty": "1.00",
473
+ # "symbol": "SOL_USDC",
474
+ # "timestamp": 1730967426328
475
+ # }
476
+ # }
477
+ #
478
+ data = self.safe_dict(message, 'data', {})
479
+ parsedTrade = self.parse_trade(data)
480
+ symbol = parsedTrade['symbol']
481
+ if not (symbol in self.trades):
482
+ limit = self.safe_integer(self.options, 'tradesLimit', 1000)
483
+ stored = ArrayCache(limit)
484
+ self.trades[symbol] = stored
485
+ trades = self.trades[symbol]
486
+ trades.append(parsedTrade)
487
+ messageHash = 'trade:' + symbol
488
+ client.resolve(trades, messageHash)
489
+
490
+ async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
491
+ """
492
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
493
+
494
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
495
+
496
+ :param str symbol: unified symbol of the market to fetch the order book for
497
+ :param int [limit]: the maximum amount of order book entries to return
498
+ :param dict [params]: extra parameters specific to the exchange API endpoint
499
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
500
+ """
501
+ return await self.watch_order_book_for_symbols([symbol], limit, params)
502
+
503
+ async def un_watch_order_book(self, symbol: str, params={}) -> Any:
504
+ """
505
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
506
+
507
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
508
+
509
+ :param str symbol: unified array of symbols
510
+ :param dict [params]: extra parameters specific to the exchange API endpoint
511
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
512
+ """
513
+ return await self.un_watch_order_book_for_symbols([symbol], params)
514
+
515
+ async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
516
+ """
517
+ watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
518
+
519
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
520
+
521
+ :param str[] symbols: unified array of symbols
522
+ :param int [limit]: the maximum amount of order book entries to return
523
+ :param dict [params]: extra parameters specific to the exchange API endpoint
524
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
525
+ """
526
+ await self.load_markets()
527
+ symbolsLength = len(symbols)
528
+ if symbolsLength == 0:
529
+ raise ArgumentsRequired(self.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols')
530
+ symbols = self.market_symbols(symbols)
531
+ topics = []
532
+ messageHashes = []
533
+ for i in range(0, len(symbols)):
534
+ symbol = symbols[i]
535
+ marketId = self.market_id(symbol)
536
+ topics.append('symbol:' + marketId + ':depth:20:0.001')
537
+ messageHashes.append('orderbook:' + symbol)
538
+ orderbook = await self.watch_public(topics, messageHashes, params)
539
+ return orderbook.limit()
540
+
541
+ async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
542
+ """
543
+ unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
544
+
545
+ https://www.postman.com/defxcode/defx-public-apis/collection/667939a1b5d8069c13d614e9
546
+
547
+ :param str[] symbols: unified array of symbols
548
+ :param dict [params]: extra parameters specific to the exchange API endpoint
549
+ :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
550
+ """
551
+ await self.load_markets()
552
+ symbolsLength = len(symbols)
553
+ if symbolsLength == 0:
554
+ raise ArgumentsRequired(self.id + ' unWatchOrderBookForSymbols() requires a non-empty array of symbols')
555
+ symbols = self.market_symbols(symbols)
556
+ topics = []
557
+ messageHashes = []
558
+ for i in range(0, len(symbols)):
559
+ symbol = symbols[i]
560
+ marketId = self.market_id(symbol)
561
+ topics.append('symbol:' + marketId + ':depth:20:0.001')
562
+ messageHashes.append('orderbook:' + symbol)
563
+ return await self.un_watch_public(topics, messageHashes, params)
564
+
565
+ def handle_order_book(self, client: Client, message):
566
+ #
567
+ # {
568
+ # "topic": "symbol:SOL_USDC:depth:20:0.01",
569
+ # "event": "depth",
570
+ # "timestamp": 1731030695319,
571
+ # "data": {
572
+ # "symbol": "SOL_USDC",
573
+ # "timestamp": 1731030695319,
574
+ # "lastTradeTimestamp": 1731030275258,
575
+ # "level": "20",
576
+ # "slab": "0.01",
577
+ # "bids": [
578
+ # {
579
+ # "price": "198.27000000",
580
+ # "qty": "1.52"
581
+ # }
582
+ # ],
583
+ # "asks": [
584
+ # {
585
+ # "price": "198.44000000",
586
+ # "qty": "6.61"
587
+ # }
588
+ # ]
589
+ # }
590
+ # }
591
+ #
592
+ data = self.safe_dict(message, 'data', {})
593
+ marketId = self.safe_string(data, 'symbol')
594
+ market = self.market(marketId)
595
+ symbol = market['symbol']
596
+ timestamp = self.safe_integer(data, 'timestamp')
597
+ snapshot = self.parse_order_book(data, symbol, timestamp, 'bids', 'asks', 'price', 'qty')
598
+ if not (symbol in self.orderbooks):
599
+ ob = self.order_book(snapshot)
600
+ self.orderbooks[symbol] = ob
601
+ orderbook = self.orderbooks[symbol]
602
+ orderbook.reset(snapshot)
603
+ messageHash = 'orderbook:' + symbol
604
+ client.resolve(orderbook, messageHash)
605
+
606
+ async def keep_alive_listen_key(self, params={}):
607
+ listenKey = self.safe_string(self.options, 'listenKey')
608
+ if listenKey is None:
609
+ # A network error happened: we can't renew a listen key that does not exist.
610
+ return
611
+ try:
612
+ await self.v1PrivatePutApiUsersSocketListenKeysListenKey({'listenKey': listenKey}) # self.extend the expiry
613
+ except Exception as error:
614
+ url = self.urls['api']['ws']['private'] + '?listenKey=' + listenKey
615
+ client = self.client(url)
616
+ messageHashes = list(client.futures.keys())
617
+ for j in range(0, len(messageHashes)):
618
+ messageHash = messageHashes[j]
619
+ client.reject(error, messageHash)
620
+ self.options['listenKey'] = None
621
+ self.options['lastAuthenticatedTime'] = 0
622
+ return
623
+ # whether or not to schedule another listenKey keepAlive request
624
+ listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 3540000)
625
+ self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, params)
626
+
627
+ async def authenticate(self, params={}):
628
+ time = self.milliseconds()
629
+ lastAuthenticatedTime = self.safe_integer(self.options, 'lastAuthenticatedTime', 0)
630
+ listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 3540000) # 1 hour
631
+ if time - lastAuthenticatedTime > listenKeyRefreshRate:
632
+ response = await self.v1PrivatePostApiUsersSocketListenKeys()
633
+ self.options['listenKey'] = self.safe_string(response, 'listenKey')
634
+ self.options['lastAuthenticatedTime'] = time
635
+ self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, params)
636
+
637
+ async def watch_balance(self, params={}) -> Balances:
638
+ """
639
+ query for balance and get the amount of funds available for trading or funds locked in orders
640
+
641
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
642
+
643
+ :param dict [params]: extra parameters specific to the exchange API endpoint
644
+ :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
645
+ """
646
+ await self.load_markets()
647
+ await self.authenticate()
648
+ baseUrl = self.urls['api']['ws']['private']
649
+ messageHash = 'WALLET_BALANCE_UPDATE'
650
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
651
+ return await self.watch(url, messageHash, None, messageHash)
652
+
653
+ def handle_balance(self, client: Client, message):
654
+ #
655
+ # {
656
+ # "event": "WALLET_BALANCE_UPDATE",
657
+ # "timestamp": 1711015961397,
658
+ # "data": {
659
+ # "asset": "USDC", "balance": "27.64712963"
660
+ # }
661
+ # }
662
+ #
663
+ messageHash = self.safe_string(message, 'event')
664
+ data = self.safe_dict(message, 'data', [])
665
+ timestamp = self.safe_integer(message, 'timestamp')
666
+ if self.balance is None:
667
+ self.balance = {}
668
+ self.balance['info'] = data
669
+ self.balance['timestamp'] = timestamp
670
+ self.balance['datetime'] = self.iso8601(timestamp)
671
+ currencyId = self.safe_string(data, 'asset')
672
+ code = self.safe_currency_code(currencyId)
673
+ account = self.balance[code] if (code in self.balance) else self.account()
674
+ account['free'] = self.safe_string(data, 'balance')
675
+ self.balance[code] = account
676
+ self.balance = self.safe_balance(self.balance)
677
+ client.resolve(self.balance, messageHash)
678
+
679
+ async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
680
+ """
681
+ watches information on multiple orders made by the user
682
+
683
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
684
+
685
+ :param str [symbol]: unified market symbol of the market the orders were made in
686
+ :param int [since]: the earliest time in ms to fetch orders for
687
+ :param int [limit]: the maximum number of order structures to retrieve
688
+ :param dict [params]: extra parameters specific to the exchange API endpoint
689
+ :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
690
+ """
691
+ await self.load_markets()
692
+ await self.authenticate()
693
+ baseUrl = self.urls['api']['ws']['private']
694
+ messageHash = 'orders'
695
+ if symbol is not None:
696
+ market = self.market(symbol)
697
+ messageHash += ':' + market['symbol']
698
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
699
+ orders = await self.watch(url, messageHash, None, messageHash)
700
+ if self.newUpdates:
701
+ limit = orders.getLimit(symbol, limit)
702
+ return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
703
+
704
+ def handle_order(self, client: Client, message):
705
+ #
706
+ # {
707
+ # "event": "ORDER_UPDATE",
708
+ # "timestamp": 1731417961446,
709
+ # "data": {
710
+ # "orderId": "766738557656630928",
711
+ # "symbol": "SOL_USDC",
712
+ # "side": "SELL",
713
+ # "type": "MARKET",
714
+ # "status": "FILLED",
715
+ # "clientOrderId": "0193208d-717b-7811-a80e-c036e220ad9b",
716
+ # "reduceOnly": False,
717
+ # "postOnly": False,
718
+ # "timeInForce": "GTC",
719
+ # "isTriggered": False,
720
+ # "createdAt": "2024-11-12T13:26:00.829Z",
721
+ # "updatedAt": "2024-11-12T13:26:01.436Z",
722
+ # "avgPrice": "209.60000000",
723
+ # "cumulativeQuote": "104.80000000",
724
+ # "totalFee": "0.05764000",
725
+ # "executedQty": "0.50",
726
+ # "origQty": "0.50",
727
+ # "role": "TAKER",
728
+ # "pnl": "0.00000000",
729
+ # "lastFillPnL": "0.00000000",
730
+ # "lastFillPrice": "209.60000000",
731
+ # "lastFillQty": "0.50",
732
+ # "linkedOrderParentType": null,
733
+ # "workingType": null
734
+ # }
735
+ # }
736
+ #
737
+ channel = 'orders'
738
+ data = self.safe_dict(message, 'data', {})
739
+ if self.orders is None:
740
+ limit = self.safe_integer(self.options, 'ordersLimit', 1000)
741
+ self.orders = ArrayCacheBySymbolById(limit)
742
+ orders = self.orders
743
+ parsedOrder = self.parse_order(data)
744
+ orders.append(parsedOrder)
745
+ messageHash = channel + ':' + parsedOrder['symbol']
746
+ client.resolve(orders, channel)
747
+ client.resolve(orders, messageHash)
748
+
749
+ async def watch_positions(self, symbols: Strings = None, since: Int = None, limit: Int = None, params={}) -> List[Position]:
750
+ """
751
+ watch all open positions
752
+
753
+ https://www.postman.com/defxcode/defx-public-apis/ws-raw-request/667939b2f00f79161bb47809
754
+
755
+ :param str[]|None symbols: list of unified market symbols
756
+ :param number [since]: since timestamp
757
+ :param number [limit]: limit
758
+ :param dict params: extra parameters specific to the exchange API endpoint
759
+ :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
760
+ """
761
+ await self.load_markets()
762
+ await self.authenticate()
763
+ symbols = self.market_symbols(symbols)
764
+ baseUrl = self.urls['api']['ws']['private']
765
+ channel = 'positions'
766
+ url = baseUrl + '?listenKey=' + self.options['listenKey']
767
+ newPosition = None
768
+ if symbols is not None:
769
+ messageHashes = []
770
+ for i in range(0, len(symbols)):
771
+ symbol = symbols[i]
772
+ messageHashes.append(channel + ':' + symbol)
773
+ newPosition = await self.watch_multiple(url, messageHashes, None, messageHashes)
774
+ else:
775
+ newPosition = await self.watch(url, channel, None, channel)
776
+ if self.newUpdates:
777
+ return newPosition
778
+ return self.filter_by_symbols_since_limit(self.positions, symbols, since, limit, True)
779
+
780
+ def handle_positions(self, client, message):
781
+ #
782
+ # {
783
+ # "event": "POSITION_UPDATE",
784
+ # "timestamp": 1731417961456,
785
+ # "data": {
786
+ # "positionId": "0193208d-735d-7fe9-90bd-8bc6d6bc1eda",
787
+ # "createdAt": 1289847904328,
788
+ # "symbol": "SOL_USDC",
789
+ # "positionSide": "SHORT",
790
+ # "entryPrice": "209.60000000",
791
+ # "quantity": "0.50",
792
+ # "status": "ACTIVE",
793
+ # "marginAsset": "USDC",
794
+ # "marginAmount": "15.17475649",
795
+ # "realizedPnL": "0.00000000"
796
+ # }
797
+ # }
798
+ #
799
+ channel = 'positions'
800
+ data = self.safe_dict(message, 'data', {})
801
+ if self.positions is None:
802
+ self.positions = ArrayCacheBySymbolById()
803
+ cache = self.positions
804
+ parsedPosition = self.parse_position(data)
805
+ timestamp = self.safe_integer(message, 'timestamp')
806
+ parsedPosition['timestamp'] = timestamp
807
+ parsedPosition['datetime'] = self.iso8601(timestamp)
808
+ cache.append(parsedPosition)
809
+ messageHash = channel + ':' + parsedPosition['symbol']
810
+ client.resolve([parsedPosition], channel)
811
+ client.resolve([parsedPosition], messageHash)
812
+
813
+ def handle_message(self, client: Client, message):
814
+ error = self.safe_string(message, 'code')
815
+ if error is not None:
816
+ errorMsg = self.safe_string(message, 'msg')
817
+ raise ExchangeError(self.id + ' ' + errorMsg)
818
+ event = self.safe_string(message, 'event')
819
+ if event is not None:
820
+ methods: dict = {
821
+ 'ohlc': self.handle_ohlcv,
822
+ '24hrTicker': self.handle_ticker,
823
+ 'trades': self.handle_trades,
824
+ 'depth': self.handle_order_book,
825
+ 'WALLET_BALANCE_UPDATE': self.handle_balance,
826
+ 'ORDER_UPDATE': self.handle_order,
827
+ 'POSITION_UPDATE': self.handle_positions,
828
+ }
829
+ exacMethod = self.safe_value(methods, event)
830
+ if exacMethod is not None:
831
+ exacMethod(client, message)