ccxt 4.2.96__tar.gz → 4.2.97__tar.gz

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.

Potentially problematic release.


This version of ccxt might be problematic. Click here for more details.

Files changed (543) hide show
  1. {ccxt-4.2.96/ccxt.egg-info → ccxt-4.2.97}/PKG-INFO +4 -4
  2. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/__init__.py +1 -1
  3. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/__init__.py +1 -1
  4. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/exchange.py +1 -1
  5. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/binance.py +9 -9
  6. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinbase.py +10 -6
  7. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/deribit.py +7 -3
  8. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/okx.py +3 -2
  9. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/poloniexfutures.py +4 -1
  10. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/exchange.py +16 -4
  11. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/binance.py +9 -9
  12. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinbase.py +10 -6
  13. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/deribit.py +7 -3
  14. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/okx.py +3 -2
  15. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/poloniexfutures.py +4 -1
  16. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/__init__.py +1 -1
  17. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/binance.py +9 -5
  18. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/poloniexfutures.py +5 -2
  19. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_order_book.py +21 -15
  20. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/test_async.py +32 -6
  21. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/test_sync.py +32 -6
  22. {ccxt-4.2.96 → ccxt-4.2.97/ccxt.egg-info}/PKG-INFO +4 -4
  23. {ccxt-4.2.96 → ccxt-4.2.97}/package.json +1 -1
  24. {ccxt-4.2.96 → ccxt-4.2.97}/LICENSE.txt +0 -0
  25. {ccxt-4.2.96 → ccxt-4.2.97}/MANIFEST.in +0 -0
  26. {ccxt-4.2.96 → ccxt-4.2.97}/README.rst +0 -0
  27. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/__init__.py +0 -0
  28. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/ace.py +0 -0
  29. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/alpaca.py +0 -0
  30. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/ascendex.py +0 -0
  31. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bequant.py +0 -0
  32. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bigone.py +0 -0
  33. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/binance.py +0 -0
  34. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/binancecoinm.py +0 -0
  35. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/binanceus.py +0 -0
  36. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/binanceusdm.py +0 -0
  37. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bingx.py +0 -0
  38. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bit2c.py +0 -0
  39. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitbank.py +0 -0
  40. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitbay.py +0 -0
  41. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitbns.py +0 -0
  42. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitcoincom.py +0 -0
  43. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitfinex.py +0 -0
  44. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitfinex2.py +0 -0
  45. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitflyer.py +0 -0
  46. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitget.py +0 -0
  47. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bithumb.py +0 -0
  48. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitmart.py +0 -0
  49. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitmex.py +0 -0
  50. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitopro.py +0 -0
  51. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitpanda.py +0 -0
  52. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitrue.py +0 -0
  53. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitso.py +0 -0
  54. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitstamp.py +0 -0
  55. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitteam.py +0 -0
  56. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bitvavo.py +0 -0
  57. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bl3p.py +0 -0
  58. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/blockchaincom.py +0 -0
  59. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/blofin.py +0 -0
  60. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/btcalpha.py +0 -0
  61. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/btcbox.py +0 -0
  62. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/btcmarkets.py +0 -0
  63. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/btcturk.py +0 -0
  64. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/bybit.py +0 -0
  65. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/cex.py +0 -0
  66. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinbase.py +0 -0
  67. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinbaseinternational.py +0 -0
  68. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinbasepro.py +0 -0
  69. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coincheck.py +0 -0
  70. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinex.py +0 -0
  71. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinlist.py +0 -0
  72. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinmate.py +0 -0
  73. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinmetro.py +0 -0
  74. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinone.py +0 -0
  75. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinsph.py +0 -0
  76. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/coinspot.py +0 -0
  77. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/cryptocom.py +0 -0
  78. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/currencycom.py +0 -0
  79. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/delta.py +0 -0
  80. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/deribit.py +0 -0
  81. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/digifinex.py +0 -0
  82. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/exmo.py +0 -0
  83. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/fmfwio.py +0 -0
  84. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/gate.py +0 -0
  85. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/gateio.py +0 -0
  86. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/gemini.py +0 -0
  87. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/hitbtc.py +0 -0
  88. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/hitbtc3.py +0 -0
  89. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/hollaex.py +0 -0
  90. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/htx.py +0 -0
  91. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/huobi.py +0 -0
  92. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/huobijp.py +0 -0
  93. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/hyperliquid.py +0 -0
  94. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/idex.py +0 -0
  95. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/independentreserve.py +0 -0
  96. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/indodax.py +0 -0
  97. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/kraken.py +0 -0
  98. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/krakenfutures.py +0 -0
  99. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/kucoin.py +0 -0
  100. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/kucoinfutures.py +0 -0
  101. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/kuna.py +0 -0
  102. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/latoken.py +0 -0
  103. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/lbank.py +0 -0
  104. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/luno.py +0 -0
  105. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/lykke.py +0 -0
  106. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/mercado.py +0 -0
  107. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/mexc.py +0 -0
  108. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/ndax.py +0 -0
  109. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/novadax.py +0 -0
  110. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/oceanex.py +0 -0
  111. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/okcoin.py +0 -0
  112. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/okx.py +0 -0
  113. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/onetrading.py +0 -0
  114. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/p2b.py +0 -0
  115. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/paymium.py +0 -0
  116. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/phemex.py +0 -0
  117. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/poloniex.py +0 -0
  118. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/poloniexfutures.py +0 -0
  119. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/probit.py +0 -0
  120. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/timex.py +0 -0
  121. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/tokocrypto.py +0 -0
  122. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/tradeogre.py +0 -0
  123. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/upbit.py +0 -0
  124. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/wavesexchange.py +0 -0
  125. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/wazirx.py +0 -0
  126. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/whitebit.py +0 -0
  127. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/woo.py +0 -0
  128. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/yobit.py +0 -0
  129. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/zaif.py +0 -0
  130. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/abstract/zonda.py +0 -0
  131. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/ace.py +0 -0
  132. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/alpaca.py +0 -0
  133. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/ascendex.py +0 -0
  134. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/ace.py +0 -0
  135. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/alpaca.py +0 -0
  136. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/ascendex.py +0 -0
  137. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/__init__.py +0 -0
  138. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/throttler.py +0 -0
  139. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/__init__.py +0 -0
  140. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/aiohttp_client.py +0 -0
  141. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/cache.py +0 -0
  142. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/client.py +0 -0
  143. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/fast_client.py +0 -0
  144. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/functions.py +0 -0
  145. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/future.py +0 -0
  146. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/order_book.py +0 -0
  147. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/base/ws/order_book_side.py +0 -0
  148. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bequant.py +0 -0
  149. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bigone.py +0 -0
  150. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/binancecoinm.py +0 -0
  151. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/binanceus.py +0 -0
  152. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/binanceusdm.py +0 -0
  153. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bingx.py +0 -0
  154. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bit2c.py +0 -0
  155. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitbank.py +0 -0
  156. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitbay.py +0 -0
  157. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitbns.py +0 -0
  158. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitcoincom.py +0 -0
  159. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitfinex.py +0 -0
  160. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitfinex2.py +0 -0
  161. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitflyer.py +0 -0
  162. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitget.py +0 -0
  163. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bithumb.py +0 -0
  164. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitmart.py +0 -0
  165. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitmex.py +0 -0
  166. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitopro.py +0 -0
  167. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitpanda.py +0 -0
  168. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitrue.py +0 -0
  169. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitso.py +0 -0
  170. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitstamp.py +0 -0
  171. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitteam.py +0 -0
  172. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bitvavo.py +0 -0
  173. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bl3p.py +0 -0
  174. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/blockchaincom.py +0 -0
  175. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/blofin.py +0 -0
  176. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/btcalpha.py +0 -0
  177. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/btcbox.py +0 -0
  178. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/btcmarkets.py +0 -0
  179. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/btcturk.py +0 -0
  180. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/bybit.py +0 -0
  181. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/cex.py +0 -0
  182. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinbaseinternational.py +0 -0
  183. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinbasepro.py +0 -0
  184. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coincheck.py +0 -0
  185. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinex.py +0 -0
  186. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinlist.py +0 -0
  187. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinmate.py +0 -0
  188. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinmetro.py +0 -0
  189. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinone.py +0 -0
  190. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinsph.py +0 -0
  191. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/coinspot.py +0 -0
  192. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/cryptocom.py +0 -0
  193. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/currencycom.py +0 -0
  194. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/delta.py +0 -0
  195. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/digifinex.py +0 -0
  196. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/exmo.py +0 -0
  197. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/flowbtc.py +0 -0
  198. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/fmfwio.py +0 -0
  199. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/gate.py +0 -0
  200. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/gateio.py +0 -0
  201. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/gemini.py +0 -0
  202. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/hitbtc.py +0 -0
  203. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/hitbtc3.py +0 -0
  204. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/hollaex.py +0 -0
  205. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/htx.py +0 -0
  206. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/huobi.py +0 -0
  207. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/huobijp.py +0 -0
  208. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/hyperliquid.py +0 -0
  209. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/idex.py +0 -0
  210. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/independentreserve.py +0 -0
  211. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/indodax.py +0 -0
  212. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/kraken.py +0 -0
  213. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/krakenfutures.py +0 -0
  214. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/kucoin.py +0 -0
  215. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/kucoinfutures.py +0 -0
  216. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/kuna.py +0 -0
  217. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/latoken.py +0 -0
  218. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/lbank.py +0 -0
  219. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/luno.py +0 -0
  220. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/lykke.py +0 -0
  221. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/mercado.py +0 -0
  222. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/mexc.py +0 -0
  223. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/ndax.py +0 -0
  224. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/novadax.py +0 -0
  225. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/oceanex.py +0 -0
  226. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/okcoin.py +0 -0
  227. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/onetrading.py +0 -0
  228. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/p2b.py +0 -0
  229. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/paymium.py +0 -0
  230. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/phemex.py +0 -0
  231. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/poloniex.py +0 -0
  232. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/probit.py +0 -0
  233. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/timex.py +0 -0
  234. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/tokocrypto.py +0 -0
  235. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/tradeogre.py +0 -0
  236. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/upbit.py +0 -0
  237. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/wavesexchange.py +0 -0
  238. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/wazirx.py +0 -0
  239. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/whitebit.py +0 -0
  240. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/woo.py +0 -0
  241. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/yobit.py +0 -0
  242. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/zaif.py +0 -0
  243. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/async_support/zonda.py +0 -0
  244. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/__init__.py +0 -0
  245. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/decimal_to_precision.py +0 -0
  246. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/errors.py +0 -0
  247. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/precise.py +0 -0
  248. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/base/types.py +0 -0
  249. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bequant.py +0 -0
  250. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bigone.py +0 -0
  251. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/binancecoinm.py +0 -0
  252. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/binanceus.py +0 -0
  253. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/binanceusdm.py +0 -0
  254. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bingx.py +0 -0
  255. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bit2c.py +0 -0
  256. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitbank.py +0 -0
  257. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitbay.py +0 -0
  258. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitbns.py +0 -0
  259. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitcoincom.py +0 -0
  260. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitfinex.py +0 -0
  261. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitfinex2.py +0 -0
  262. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitflyer.py +0 -0
  263. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitget.py +0 -0
  264. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bithumb.py +0 -0
  265. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitmart.py +0 -0
  266. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitmex.py +0 -0
  267. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitopro.py +0 -0
  268. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitpanda.py +0 -0
  269. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitrue.py +0 -0
  270. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitso.py +0 -0
  271. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitstamp.py +0 -0
  272. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitteam.py +0 -0
  273. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bitvavo.py +0 -0
  274. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bl3p.py +0 -0
  275. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/blockchaincom.py +0 -0
  276. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/blofin.py +0 -0
  277. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/btcalpha.py +0 -0
  278. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/btcbox.py +0 -0
  279. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/btcmarkets.py +0 -0
  280. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/btcturk.py +0 -0
  281. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/bybit.py +0 -0
  282. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/cex.py +0 -0
  283. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinbaseinternational.py +0 -0
  284. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinbasepro.py +0 -0
  285. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coincheck.py +0 -0
  286. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinex.py +0 -0
  287. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinlist.py +0 -0
  288. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinmate.py +0 -0
  289. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinmetro.py +0 -0
  290. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinone.py +0 -0
  291. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinsph.py +0 -0
  292. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/coinspot.py +0 -0
  293. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/cryptocom.py +0 -0
  294. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/currencycom.py +0 -0
  295. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/delta.py +0 -0
  296. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/digifinex.py +0 -0
  297. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/exmo.py +0 -0
  298. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/flowbtc.py +0 -0
  299. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/fmfwio.py +0 -0
  300. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/gate.py +0 -0
  301. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/gateio.py +0 -0
  302. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/gemini.py +0 -0
  303. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/hitbtc.py +0 -0
  304. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/hitbtc3.py +0 -0
  305. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/hollaex.py +0 -0
  306. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/htx.py +0 -0
  307. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/huobi.py +0 -0
  308. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/huobijp.py +0 -0
  309. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/hyperliquid.py +0 -0
  310. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/idex.py +0 -0
  311. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/independentreserve.py +0 -0
  312. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/indodax.py +0 -0
  313. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/kraken.py +0 -0
  314. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/krakenfutures.py +0 -0
  315. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/kucoin.py +0 -0
  316. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/kucoinfutures.py +0 -0
  317. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/kuna.py +0 -0
  318. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/latoken.py +0 -0
  319. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/lbank.py +0 -0
  320. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/luno.py +0 -0
  321. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/lykke.py +0 -0
  322. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/mercado.py +0 -0
  323. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/mexc.py +0 -0
  324. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/ndax.py +0 -0
  325. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/novadax.py +0 -0
  326. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/oceanex.py +0 -0
  327. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/okcoin.py +0 -0
  328. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/onetrading.py +0 -0
  329. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/p2b.py +0 -0
  330. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/paymium.py +0 -0
  331. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/phemex.py +0 -0
  332. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/poloniex.py +0 -0
  333. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/alpaca.py +0 -0
  334. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/ascendex.py +0 -0
  335. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bequant.py +0 -0
  336. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/binancecoinm.py +0 -0
  337. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/binanceus.py +0 -0
  338. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/binanceusdm.py +0 -0
  339. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bingx.py +0 -0
  340. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitcoincom.py +0 -0
  341. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitfinex.py +0 -0
  342. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitfinex2.py +0 -0
  343. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitget.py +0 -0
  344. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bithumb.py +0 -0
  345. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitmart.py +0 -0
  346. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitmex.py +0 -0
  347. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitopro.py +0 -0
  348. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitpanda.py +0 -0
  349. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitrue.py +0 -0
  350. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitstamp.py +0 -0
  351. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bitvavo.py +0 -0
  352. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/blockchaincom.py +0 -0
  353. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/bybit.py +0 -0
  354. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/cex.py +0 -0
  355. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coinbase.py +0 -0
  356. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coinbaseinternational.py +0 -0
  357. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coinbasepro.py +0 -0
  358. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coincheck.py +0 -0
  359. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coinex.py +0 -0
  360. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/coinone.py +0 -0
  361. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/cryptocom.py +0 -0
  362. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/currencycom.py +0 -0
  363. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/deribit.py +0 -0
  364. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/exmo.py +0 -0
  365. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/gate.py +0 -0
  366. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/gateio.py +0 -0
  367. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/gemini.py +0 -0
  368. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/hitbtc.py +0 -0
  369. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/hollaex.py +0 -0
  370. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/htx.py +0 -0
  371. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/huobi.py +0 -0
  372. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/huobijp.py +0 -0
  373. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/hyperliquid.py +0 -0
  374. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/idex.py +0 -0
  375. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/independentreserve.py +0 -0
  376. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/kraken.py +0 -0
  377. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/krakenfutures.py +0 -0
  378. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/kucoin.py +0 -0
  379. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/kucoinfutures.py +0 -0
  380. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/lbank.py +0 -0
  381. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/luno.py +0 -0
  382. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/mexc.py +0 -0
  383. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/ndax.py +0 -0
  384. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/okcoin.py +0 -0
  385. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/okx.py +0 -0
  386. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/onetrading.py +0 -0
  387. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/p2b.py +0 -0
  388. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/phemex.py +0 -0
  389. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/poloniex.py +0 -0
  390. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/probit.py +0 -0
  391. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/upbit.py +0 -0
  392. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/wazirx.py +0 -0
  393. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/whitebit.py +0 -0
  394. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/pro/woo.py +0 -0
  395. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/probit.py +0 -0
  396. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/__init__.py +0 -0
  397. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/__init__.py +0 -0
  398. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/_version.py +0 -0
  399. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/curves.py +0 -0
  400. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/der.py +0 -0
  401. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -0
  402. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -0
  403. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/keys.py +0 -0
  404. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -0
  405. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -0
  406. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ecdsa/util.py +0 -0
  407. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/__init__.py +0 -0
  408. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -0
  409. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/abi.py +0 -0
  410. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/base.py +0 -0
  411. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/codec.py +0 -0
  412. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/constants.py +0 -0
  413. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -0
  414. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -0
  415. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -0
  416. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -0
  417. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/packed.py +0 -0
  418. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  419. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/registry.py +0 -0
  420. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -0
  421. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -0
  422. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  423. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -0
  424. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -0
  425. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -0
  426. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/__init__.py +0 -0
  427. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -0
  428. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -0
  429. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -0
  430. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/messages.py +0 -0
  431. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  432. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -0
  433. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -0
  434. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -0
  435. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  436. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -0
  437. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/abi.py +0 -0
  438. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/bls.py +0 -0
  439. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -0
  440. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -0
  441. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/enums.py +0 -0
  442. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -0
  443. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/evm.py +0 -0
  444. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/networks.py +0 -0
  445. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  446. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -0
  447. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/abi.py +0 -0
  448. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/address.py +0 -0
  449. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -0
  450. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -0
  451. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/currency.py +0 -0
  452. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -0
  453. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/debug.py +0 -0
  454. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -0
  455. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -0
  456. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -0
  457. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/functional.py +0 -0
  458. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -0
  459. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -0
  460. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/logging.py +0 -0
  461. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -0
  462. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -0
  463. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  464. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -0
  465. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/types.py +0 -0
  466. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -0
  467. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -0
  468. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/ethereum/utils/units.py +0 -0
  469. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/keccak/__init__.py +0 -0
  470. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/keccak/keccak.py +0 -0
  471. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/msgpack/__init__.py +0 -0
  472. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/msgpack/exceptions.py +0 -0
  473. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/msgpack/ext.py +0 -0
  474. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/msgpack/fallback.py +0 -0
  475. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/__init__.py +0 -0
  476. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/exceptions.py +0 -0
  477. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/expressions.py +0 -0
  478. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/grammar.py +0 -0
  479. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/nodes.py +0 -0
  480. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/parsimonious/utils.py +0 -0
  481. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/__init__.py +0 -0
  482. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/_signatures.py +0 -0
  483. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/_version.py +0 -0
  484. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/compatibility.py +0 -0
  485. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/curried/__init__.py +0 -0
  486. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -0
  487. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/curried/operator.py +0 -0
  488. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/dicttoolz.py +0 -0
  489. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/functoolz.py +0 -0
  490. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/itertoolz.py +0 -0
  491. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/recipes.py +0 -0
  492. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/static_dependencies/toolz/utils.py +0 -0
  493. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/__init__.py +0 -0
  494. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/__init__.py +0 -0
  495. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_account.py +0 -0
  496. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_balance.py +0 -0
  497. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_borrow_interest.py +0 -0
  498. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_borrow_rate.py +0 -0
  499. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_calculate_fee.py +0 -0
  500. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_crypto.py +0 -0
  501. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_currency.py +0 -0
  502. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_datetime.py +0 -0
  503. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_decimal_to_precision.py +0 -0
  504. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_deep_extend.py +0 -0
  505. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_deposit_withdrawal.py +0 -0
  506. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_exchange_datetime_functions.py +0 -0
  507. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_funding_rate_history.py +0 -0
  508. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_last_price.py +0 -0
  509. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_ledger_entry.py +0 -0
  510. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_ledger_item.py +0 -0
  511. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_leverage_tier.py +0 -0
  512. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_margin_mode.py +0 -0
  513. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_margin_modification.py +0 -0
  514. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_market.py +0 -0
  515. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_number.py +0 -0
  516. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_ohlcv.py +0 -0
  517. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_open_interest.py +0 -0
  518. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_order.py +0 -0
  519. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_position.py +0 -0
  520. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_shared_methods.py +0 -0
  521. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_status.py +0 -0
  522. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_throttle.py +0 -0
  523. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_ticker.py +0 -0
  524. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_trade.py +0 -0
  525. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_trading_fee.py +0 -0
  526. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/test/base/test_transaction.py +0 -0
  527. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/timex.py +0 -0
  528. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/tokocrypto.py +0 -0
  529. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/tradeogre.py +0 -0
  530. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/upbit.py +0 -0
  531. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/wavesexchange.py +0 -0
  532. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/wazirx.py +0 -0
  533. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/whitebit.py +0 -0
  534. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/woo.py +0 -0
  535. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/yobit.py +0 -0
  536. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/zaif.py +0 -0
  537. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt/zonda.py +0 -0
  538. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt.egg-info/SOURCES.txt +0 -0
  539. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt.egg-info/dependency_links.txt +0 -0
  540. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt.egg-info/requires.txt +0 -0
  541. {ccxt-4.2.96 → ccxt-4.2.97}/ccxt.egg-info/top_level.txt +0 -0
  542. {ccxt-4.2.96 → ccxt-4.2.97}/setup.cfg +0 -0
  543. {ccxt-4.2.96 → ccxt-4.2.97}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ccxt
3
- Version: 4.2.96
3
+ Version: 4.2.97
4
4
  Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
5
5
  Home-page: https://ccxt.com
6
6
  Author: Igor Kroitor
@@ -225,13 +225,13 @@ Description: # CCXT – CryptoCurrency eXchange Trading Library
225
225
 
226
226
  All-in-one browser bundle (dependencies included), served from a CDN of your choice:
227
227
 
228
- * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.96/dist/ccxt.browser.js
229
- * unpkg: https://unpkg.com/ccxt@4.2.96/dist/ccxt.browser.js
228
+ * jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.2.97/dist/ccxt.browser.js
229
+ * unpkg: https://unpkg.com/ccxt@4.2.97/dist/ccxt.browser.js
230
230
 
231
231
  CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
232
232
 
233
233
  ```HTML
234
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.96/dist/ccxt.browser.js"></script>
234
+ <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.2.97/dist/ccxt.browser.js"></script>
235
235
  ```
236
236
 
237
237
  Creates a global `ccxt` object:
@@ -22,7 +22,7 @@
22
22
 
23
23
  # ----------------------------------------------------------------------------
24
24
 
25
- __version__ = '4.2.96'
25
+ __version__ = '4.2.97'
26
26
 
27
27
  # ----------------------------------------------------------------------------
28
28
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.96'
7
+ __version__ = '4.2.97'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # -----------------------------------------------------------------------------
4
4
 
5
- __version__ = '4.2.96'
5
+ __version__ = '4.2.97'
6
6
 
7
7
  # -----------------------------------------------------------------------------
8
8
 
@@ -5549,7 +5549,7 @@ class binance(Exchange, ImplicitAPI):
5549
5549
  response = await self.papiPostCmOrder(request)
5550
5550
  else:
5551
5551
  response = await self.dapiPrivatePostOrder(request)
5552
- elif marketType == 'margin' or marginMode is not None:
5552
+ elif marketType == 'margin' or marginMode is not None or isPortfolioMargin:
5553
5553
  if isPortfolioMargin:
5554
5554
  response = await self.papiPostMarginOrder(request)
5555
5555
  else:
@@ -5631,12 +5631,6 @@ class binance(Exchange, ImplicitAPI):
5631
5631
  uppercaseType = 'TAKE_PROFIT_MARKET' if market['contract'] else 'TAKE_PROFIT'
5632
5632
  elif isLimitOrder:
5633
5633
  uppercaseType = 'TAKE_PROFIT' if market['contract'] else 'TAKE_PROFIT_LIMIT'
5634
- if (marketType == 'spot') or (marketType == 'margin'):
5635
- request['newOrderRespType'] = self.safe_string(self.options['newOrderRespType'], type, 'RESULT') # 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5636
- else:
5637
- # swap, futures and options
5638
- if not isPortfolioMargin:
5639
- request['newOrderRespType'] = 'RESULT' # "ACK", "RESULT", default "ACK"
5640
5634
  if market['option']:
5641
5635
  if type == 'market':
5642
5636
  raise InvalidOrder(self.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market')
@@ -5664,6 +5658,12 @@ class binance(Exchange, ImplicitAPI):
5664
5658
  uppercaseType = 'LIMIT_MAKER'
5665
5659
  if marginMode == 'isolated':
5666
5660
  request['isIsolated'] = True
5661
+ # handle newOrderRespType response type
5662
+ if ((marketType == 'spot') or (marketType == 'margin')) and not isPortfolioMargin:
5663
+ request['newOrderRespType'] = self.safe_string(self.options['newOrderRespType'], type, 'FULL') # 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5664
+ else:
5665
+ # swap, futures and options
5666
+ request['newOrderRespType'] = 'RESULT' # "ACK", "RESULT", default "ACK"
5667
5667
  typeRequest = 'strategyType' if isPortfolioMarginConditional else 'type'
5668
5668
  request[typeRequest] = uppercaseType
5669
5669
  # additional required fields depending on the order type
@@ -6217,7 +6217,7 @@ class binance(Exchange, ImplicitAPI):
6217
6217
  response = await self.papiGetCmOpenOrders(self.extend(request, params))
6218
6218
  else:
6219
6219
  response = await self.dapiPrivateGetOpenOrders(self.extend(request, params))
6220
- elif type == 'margin' or marginMode is not None:
6220
+ elif type == 'margin' or marginMode is not None or isPortfolioMargin:
6221
6221
  if isPortfolioMargin:
6222
6222
  response = await self.papiGetMarginOpenOrders(self.extend(request, params))
6223
6223
  else:
@@ -6646,7 +6646,7 @@ class binance(Exchange, ImplicitAPI):
6646
6646
  response = await self.papiDeleteCmAllOpenOrders(self.extend(request, params))
6647
6647
  else:
6648
6648
  response = await self.dapiPrivateDeleteAllOpenOrders(self.extend(request, params))
6649
- elif (type == 'margin') or (marginMode is not None):
6649
+ elif (type == 'margin') or (marginMode is not None) or isPortfolioMargin:
6650
6650
  if isPortfolioMargin:
6651
6651
  response = await self.papiDeleteMarginAllOpenOrders(self.extend(request, params))
6652
6652
  else:
@@ -1145,12 +1145,16 @@ class coinbase(Exchange, ImplicitAPI):
1145
1145
  self.v3PrivateGetBrokerageProducts(params),
1146
1146
  self.v3PrivateGetBrokerageTransactionSummary(params),
1147
1147
  ]
1148
- unresolvedContractPromises = [
1149
- self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE'})),
1150
- self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1151
- self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE'})),
1152
- self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1153
- ]
1148
+ unresolvedContractPromises = []
1149
+ try:
1150
+ unresolvedContractPromises = [
1151
+ self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE'})),
1152
+ self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1153
+ self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE'})),
1154
+ self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1155
+ ]
1156
+ except Exception as e:
1157
+ unresolvedContractPromises = [] # the sync version of ccxt won't have the promise.all line so the request is made here
1154
1158
  promises = await asyncio.gather(*spotUnresolvedPromises)
1155
1159
  contractPromises = None
1156
1160
  try:
@@ -1184,13 +1184,17 @@ class deribit(Exchange, ImplicitAPI):
1184
1184
  """
1185
1185
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1186
1186
  :see: https://docs.deribit.com/#public-get_book_summary_by_currency
1187
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1187
+ :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1188
1188
  :param dict [params]: extra parameters specific to the exchange API endpoint
1189
+ :param str [params.code]: *required* the currency code to fetch the tickers for, eg. 'BTC', 'ETH'
1189
1190
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1190
1191
  """
1191
1192
  await self.load_markets()
1192
1193
  symbols = self.market_symbols(symbols)
1193
- code = self.code_from_options('fetchTickers', params)
1194
+ code = self.safe_string_2(params, 'code', 'currency')
1195
+ params = self.omit(params, ['code'])
1196
+ if code is None:
1197
+ raise ArgumentsRequired(self.id + ' fetchTickers requires a currency/code(eg: BTC/ETH/USDT) parameter to fetch tickers for')
1194
1198
  currency = self.currency(code)
1195
1199
  request = {
1196
1200
  'currency': currency['id'],
@@ -1226,7 +1230,7 @@ class deribit(Exchange, ImplicitAPI):
1226
1230
  # "testnet": False
1227
1231
  # }
1228
1232
  #
1229
- result = self.safe_value(response, 'result', [])
1233
+ result = self.safe_list(response, 'result', [])
1230
1234
  tickers = {}
1231
1235
  for i in range(0, len(result)):
1232
1236
  ticker = self.parse_ticker(result[i])
@@ -9,6 +9,7 @@ import asyncio
9
9
  import hashlib
10
10
  from ccxt.base.types import Account, Balances, Conversion, Currencies, Currency, Greeks, Int, Leverage, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
11
11
  from typing import List
12
+ from typing import Any
12
13
  from ccxt.base.errors import ExchangeError
13
14
  from ccxt.base.errors import AuthenticationError
14
15
  from ccxt.base.errors import PermissionDenied
@@ -1130,13 +1131,13 @@ class okx(Exchange, ImplicitAPI):
1130
1131
  },
1131
1132
  })
1132
1133
 
1133
- def handle_market_type_and_params(self, methodName, market=None, params={}):
1134
+ def handle_market_type_and_params(self, methodName: str, market: Market = None, params={}, defaultValue=None) -> Any:
1134
1135
  instType = self.safe_string(params, 'instType')
1135
1136
  params = self.omit(params, 'instType')
1136
1137
  type = self.safe_string(params, 'type')
1137
1138
  if (type is None) and (instType is not None):
1138
1139
  params['type'] = instType
1139
- return super(okx, self).handle_market_type_and_params(methodName, market, params)
1140
+ return super(okx, self).handle_market_type_and_params(methodName, market, params, defaultValue)
1140
1141
 
1141
1142
  def convert_to_instrument_type(self, type):
1142
1143
  exchangeTypes = self.safe_dict(self.options, 'exchangeType', {})
@@ -382,7 +382,10 @@ class poloniexfutures(Exchange, ImplicitAPI):
382
382
  #
383
383
  marketId = self.safe_string(ticker, 'symbol')
384
384
  symbol = self.safe_symbol(marketId, market)
385
- timestamp = self.safe_integer_product(ticker, 'ts', 0.000001)
385
+ timestampString = self.safe_string(ticker, 'ts')
386
+ # check timestamp bcz bug: https://app.travis-ci.com/github/ccxt/ccxt/builds/269959181#L4011
387
+ multiplier = 0.00001 if (len(timestampString) == 18) else 0.000001
388
+ timestamp = self.safe_integer_product(ticker, 'ts', multiplier)
386
389
  last = self.safe_string_2(ticker, 'price', 'lastPrice')
387
390
  percentage = Precise.string_mul(self.safe_string(ticker, 'priceChgPct'), '100')
388
391
  return self.safe_ticker({
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.96'
7
+ __version__ = '4.2.97'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
@@ -3971,11 +3971,23 @@ class Exchange(object):
3971
3971
  result, empty = self.handle_option_and_params({}, methodName, optionName, defaultValue)
3972
3972
  return result
3973
3973
 
3974
- def handle_market_type_and_params(self, methodName: str, market: Market = None, params={}):
3974
+ def handle_market_type_and_params(self, methodName: str, market: Market = None, params={}, defaultValue=None):
3975
+ """
3976
+ * @ignore
3977
+ * @param methodName the method calling handleMarketTypeAndParams
3978
+ :param Market market:
3979
+ :param dict params:
3980
+ :param str [params.type]: type assigned by user
3981
+ :param str [params.defaultType]: same.type
3982
+ :param str [defaultValue]: assigned programatically in the method calling handleMarketTypeAndParams
3983
+ :returns [str, dict]: the market type and params with type and defaultType omitted
3984
+ """
3975
3985
  defaultType = self.safe_string_2(self.options, 'defaultType', 'type', 'spot')
3986
+ if defaultValue is None: # defaultValue takes precendence over exchange wide defaultType
3987
+ defaultValue = defaultType
3976
3988
  methodOptions = self.safe_dict(self.options, methodName)
3977
- methodType = defaultType
3978
- if methodOptions is not None:
3989
+ methodType = defaultValue
3990
+ if methodOptions is not None: # user defined methodType takes precedence over defaultValue
3979
3991
  if isinstance(methodOptions, str):
3980
3992
  methodType = methodOptions
3981
3993
  else:
@@ -5548,7 +5548,7 @@ class binance(Exchange, ImplicitAPI):
5548
5548
  response = self.papiPostCmOrder(request)
5549
5549
  else:
5550
5550
  response = self.dapiPrivatePostOrder(request)
5551
- elif marketType == 'margin' or marginMode is not None:
5551
+ elif marketType == 'margin' or marginMode is not None or isPortfolioMargin:
5552
5552
  if isPortfolioMargin:
5553
5553
  response = self.papiPostMarginOrder(request)
5554
5554
  else:
@@ -5630,12 +5630,6 @@ class binance(Exchange, ImplicitAPI):
5630
5630
  uppercaseType = 'TAKE_PROFIT_MARKET' if market['contract'] else 'TAKE_PROFIT'
5631
5631
  elif isLimitOrder:
5632
5632
  uppercaseType = 'TAKE_PROFIT' if market['contract'] else 'TAKE_PROFIT_LIMIT'
5633
- if (marketType == 'spot') or (marketType == 'margin'):
5634
- request['newOrderRespType'] = self.safe_string(self.options['newOrderRespType'], type, 'RESULT') # 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5635
- else:
5636
- # swap, futures and options
5637
- if not isPortfolioMargin:
5638
- request['newOrderRespType'] = 'RESULT' # "ACK", "RESULT", default "ACK"
5639
5633
  if market['option']:
5640
5634
  if type == 'market':
5641
5635
  raise InvalidOrder(self.id + ' ' + type + ' is not a valid order type for the ' + symbol + ' market')
@@ -5663,6 +5657,12 @@ class binance(Exchange, ImplicitAPI):
5663
5657
  uppercaseType = 'LIMIT_MAKER'
5664
5658
  if marginMode == 'isolated':
5665
5659
  request['isIsolated'] = True
5660
+ # handle newOrderRespType response type
5661
+ if ((marketType == 'spot') or (marketType == 'margin')) and not isPortfolioMargin:
5662
+ request['newOrderRespType'] = self.safe_string(self.options['newOrderRespType'], type, 'FULL') # 'ACK' for order id, 'RESULT' for full order or 'FULL' for order with fills
5663
+ else:
5664
+ # swap, futures and options
5665
+ request['newOrderRespType'] = 'RESULT' # "ACK", "RESULT", default "ACK"
5666
5666
  typeRequest = 'strategyType' if isPortfolioMarginConditional else 'type'
5667
5667
  request[typeRequest] = uppercaseType
5668
5668
  # additional required fields depending on the order type
@@ -6216,7 +6216,7 @@ class binance(Exchange, ImplicitAPI):
6216
6216
  response = self.papiGetCmOpenOrders(self.extend(request, params))
6217
6217
  else:
6218
6218
  response = self.dapiPrivateGetOpenOrders(self.extend(request, params))
6219
- elif type == 'margin' or marginMode is not None:
6219
+ elif type == 'margin' or marginMode is not None or isPortfolioMargin:
6220
6220
  if isPortfolioMargin:
6221
6221
  response = self.papiGetMarginOpenOrders(self.extend(request, params))
6222
6222
  else:
@@ -6645,7 +6645,7 @@ class binance(Exchange, ImplicitAPI):
6645
6645
  response = self.papiDeleteCmAllOpenOrders(self.extend(request, params))
6646
6646
  else:
6647
6647
  response = self.dapiPrivateDeleteAllOpenOrders(self.extend(request, params))
6648
- elif (type == 'margin') or (marginMode is not None):
6648
+ elif (type == 'margin') or (marginMode is not None) or isPortfolioMargin:
6649
6649
  if isPortfolioMargin:
6650
6650
  response = self.papiDeleteMarginAllOpenOrders(self.extend(request, params))
6651
6651
  else:
@@ -1144,12 +1144,16 @@ class coinbase(Exchange, ImplicitAPI):
1144
1144
  self.v3PrivateGetBrokerageProducts(params),
1145
1145
  self.v3PrivateGetBrokerageTransactionSummary(params),
1146
1146
  ]
1147
- unresolvedContractPromises = [
1148
- self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE'})),
1149
- self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1150
- self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE'})),
1151
- self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1152
- ]
1147
+ unresolvedContractPromises = []
1148
+ try:
1149
+ unresolvedContractPromises = [
1150
+ self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE'})),
1151
+ self.v3PrivateGetBrokerageProducts(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1152
+ self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE'})),
1153
+ self.v3PrivateGetBrokerageTransactionSummary(self.extend(params, {'product_type': 'FUTURE', 'contract_expiry_type': 'PERPETUAL'})),
1154
+ ]
1155
+ except Exception as e:
1156
+ unresolvedContractPromises = [] # the sync version of ccxt won't have the promise.all line so the request is made here
1153
1157
  promises = spotUnresolvedPromises
1154
1158
  contractPromises = None
1155
1159
  try:
@@ -1184,13 +1184,17 @@ class deribit(Exchange, ImplicitAPI):
1184
1184
  """
1185
1185
  fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
1186
1186
  :see: https://docs.deribit.com/#public-get_book_summary_by_currency
1187
- :param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1187
+ :param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
1188
1188
  :param dict [params]: extra parameters specific to the exchange API endpoint
1189
+ :param str [params.code]: *required* the currency code to fetch the tickers for, eg. 'BTC', 'ETH'
1189
1190
  :returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
1190
1191
  """
1191
1192
  self.load_markets()
1192
1193
  symbols = self.market_symbols(symbols)
1193
- code = self.code_from_options('fetchTickers', params)
1194
+ code = self.safe_string_2(params, 'code', 'currency')
1195
+ params = self.omit(params, ['code'])
1196
+ if code is None:
1197
+ raise ArgumentsRequired(self.id + ' fetchTickers requires a currency/code(eg: BTC/ETH/USDT) parameter to fetch tickers for')
1194
1198
  currency = self.currency(code)
1195
1199
  request = {
1196
1200
  'currency': currency['id'],
@@ -1226,7 +1230,7 @@ class deribit(Exchange, ImplicitAPI):
1226
1230
  # "testnet": False
1227
1231
  # }
1228
1232
  #
1229
- result = self.safe_value(response, 'result', [])
1233
+ result = self.safe_list(response, 'result', [])
1230
1234
  tickers = {}
1231
1235
  for i in range(0, len(result)):
1232
1236
  ticker = self.parse_ticker(result[i])
@@ -8,6 +8,7 @@ from ccxt.abstract.okx import ImplicitAPI
8
8
  import hashlib
9
9
  from ccxt.base.types import Account, Balances, Conversion, Currencies, Currency, Greeks, Int, Leverage, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
+ from typing import Any
11
12
  from ccxt.base.errors import ExchangeError
12
13
  from ccxt.base.errors import AuthenticationError
13
14
  from ccxt.base.errors import PermissionDenied
@@ -1129,13 +1130,13 @@ class okx(Exchange, ImplicitAPI):
1129
1130
  },
1130
1131
  })
1131
1132
 
1132
- def handle_market_type_and_params(self, methodName, market=None, params={}):
1133
+ def handle_market_type_and_params(self, methodName: str, market: Market = None, params={}, defaultValue=None) -> Any:
1133
1134
  instType = self.safe_string(params, 'instType')
1134
1135
  params = self.omit(params, 'instType')
1135
1136
  type = self.safe_string(params, 'type')
1136
1137
  if (type is None) and (instType is not None):
1137
1138
  params['type'] = instType
1138
- return super(okx, self).handle_market_type_and_params(methodName, market, params)
1139
+ return super(okx, self).handle_market_type_and_params(methodName, market, params, defaultValue)
1139
1140
 
1140
1141
  def convert_to_instrument_type(self, type):
1141
1142
  exchangeTypes = self.safe_dict(self.options, 'exchangeType', {})
@@ -382,7 +382,10 @@ class poloniexfutures(Exchange, ImplicitAPI):
382
382
  #
383
383
  marketId = self.safe_string(ticker, 'symbol')
384
384
  symbol = self.safe_symbol(marketId, market)
385
- timestamp = self.safe_integer_product(ticker, 'ts', 0.000001)
385
+ timestampString = self.safe_string(ticker, 'ts')
386
+ # check timestamp bcz bug: https://app.travis-ci.com/github/ccxt/ccxt/builds/269959181#L4011
387
+ multiplier = 0.00001 if (len(timestampString) == 18) else 0.000001
388
+ timestamp = self.safe_integer_product(ticker, 'ts', multiplier)
386
389
  last = self.safe_string_2(ticker, 'price', 'lastPrice')
387
390
  percentage = Precise.string_mul(self.safe_string(ticker, 'priceChgPct'), '100')
388
391
  return self.safe_ticker({
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.2.96'
7
+ __version__ = '4.2.97'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
@@ -9,10 +9,10 @@ import hashlib
9
9
  from ccxt.base.types import Balances, Int, Num, Order, OrderBook, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
- from ccxt.base.errors import ExchangeError
13
12
  from ccxt.base.errors import ArgumentsRequired
14
13
  from ccxt.base.errors import BadRequest
15
14
  from ccxt.base.errors import NotSupported
15
+ from ccxt.base.errors import InvalidNonce
16
16
  from ccxt.base.precise import Precise
17
17
 
18
18
 
@@ -400,8 +400,10 @@ class binance(ccxt.async_support.binance):
400
400
  if nonce < orderbook['nonce']:
401
401
  client.resolve(orderbook, messageHash)
402
402
  else:
403
- # todo: client.reject from handleOrderBookMessage properly
404
- raise ExchangeError(self.id + ' handleOrderBook received an out-of-order nonce')
403
+ checksum = self.safe_bool(self.options, 'checksum', True)
404
+ if checksum:
405
+ # todo: client.reject from handleOrderBookMessage properly
406
+ raise InvalidNonce(self.id + ' handleOrderBook received an out-of-order nonce')
405
407
  else:
406
408
  # future
407
409
  # 4. Drop any event where u is < lastUpdateId in the snapshot
@@ -413,8 +415,10 @@ class binance(ccxt.async_support.binance):
413
415
  if nonce <= orderbook['nonce']:
414
416
  client.resolve(orderbook, messageHash)
415
417
  else:
416
- # todo: client.reject from handleOrderBookMessage properly
417
- raise ExchangeError(self.id + ' handleOrderBook received an out-of-order nonce')
418
+ checksum = self.safe_bool(self.options, 'checksum', True)
419
+ if checksum:
420
+ # todo: client.reject from handleOrderBookMessage properly
421
+ raise InvalidNonce(self.id + ' handleOrderBook received an out-of-order nonce')
418
422
  except Exception as e:
419
423
  del self.orderbooks[symbol]
420
424
  del client.subscriptions[messageHash]
@@ -8,9 +8,9 @@ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
8
  from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
9
9
  from ccxt.async_support.base.ws.client import Client
10
10
  from typing import List
11
- from ccxt.base.errors import ExchangeError
12
11
  from ccxt.base.errors import AuthenticationError
13
12
  from ccxt.base.errors import BadRequest
13
+ from ccxt.base.errors import InvalidNonce
14
14
 
15
15
 
16
16
  class poloniexfutures(ccxt.async_support.poloniexfutures):
@@ -817,7 +817,10 @@ class poloniexfutures(ccxt.async_support.poloniexfutures):
817
817
  sequence = self.safe_integer(delta, 'sequence')
818
818
  nonce = self.safe_integer(orderbook, 'nonce')
819
819
  if nonce != sequence - 1:
820
- raise ExchangeError(self.id + ' watchOrderBook received an out-of-order nonce')
820
+ checksum = self.safe_bool(self.options, 'checksum', True)
821
+ if checksum:
822
+ # todo: client.reject from handleOrderBookMessage properly
823
+ raise InvalidNonce(self.id + ' watchOrderBook received an out-of-order nonce')
821
824
  change = self.safe_string(delta, 'change')
822
825
  splitChange = change.split(',')
823
826
  price = self.safe_number(splitChange, 0)
@@ -24,7 +24,9 @@ def test_order_book(exchange, skipped_properties, method, orderbook, symbol):
24
24
  'datetime': '2017-09-01T00:00:00',
25
25
  'nonce': 134234234,
26
26
  }
27
- empty_allowed_for = ['symbol', 'nonce', 'datetime', 'timestamp'] # todo: make timestamp required
27
+ empty_allowed_for = ['nonce']
28
+ # turn into copy: https://discord.com/channels/690203284119617602/921046068555313202/1220626834887282728
29
+ orderbook = exchange.deep_extend({}, orderbook)
28
30
  test_shared_methods.assert_structure(exchange, skipped_properties, method, orderbook, format, empty_allowed_for)
29
31
  test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, orderbook)
30
32
  test_shared_methods.assert_symbol(exchange, skipped_properties, method, orderbook, 'symbol', symbol)
@@ -37,24 +39,28 @@ def test_order_book(exchange, skipped_properties, method, orderbook, symbol):
37
39
  bids_length = len(bids)
38
40
  for i in range(0, bids_length):
39
41
  current_bid_string = exchange.safe_string(bids[i], 0)
40
- next_i = i + 1
41
- if bids_length > next_i:
42
- next_bid_string = exchange.safe_string(bids[next_i], 0)
43
- has_correct_order = Precise.string_gt(current_bid_string, next_bid_string)
44
- assert has_correct_order, 'current bid should be > than the next one: ' + current_bid_string + '>' + next_bid_string + log_text
45
- test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 0, '0')
46
- test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 1, '0')
42
+ if not ('compareToNextItem' in skipped_properties):
43
+ next_i = i + 1
44
+ if bids_length > next_i:
45
+ next_bid_string = exchange.safe_string(bids[next_i], 0)
46
+ assert Precise.string_gt(current_bid_string, next_bid_string), 'current bid should be > than the next one: ' + current_bid_string + '>' + next_bid_string + log_text
47
+ if not ('compareToZero' in skipped_properties):
48
+ # compare price & volume to zero
49
+ test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 0, '0')
50
+ test_shared_methods.assert_greater(exchange, skipped_properties, method, bids[i], 1, '0')
47
51
  asks = orderbook['asks']
48
52
  asks_length = len(asks)
49
53
  for i in range(0, asks_length):
50
54
  current_ask_string = exchange.safe_string(asks[i], 0)
51
- next_i = i + 1
52
- if asks_length > next_i:
53
- next_ask_string = exchange.safe_string(asks[next_i], 0)
54
- has_correct_order = Precise.string_lt(current_ask_string, next_ask_string)
55
- assert has_correct_order, 'current ask should be < than the next one: ' + current_ask_string + '<' + next_ask_string + log_text
56
- test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 0, '0')
57
- test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 1, '0')
55
+ if not ('compareToNextItem' in skipped_properties):
56
+ next_i = i + 1
57
+ if asks_length > next_i:
58
+ next_ask_string = exchange.safe_string(asks[next_i], 0)
59
+ assert Precise.string_lt(current_ask_string, next_ask_string), 'current ask should be < than the next one: ' + current_ask_string + '<' + next_ask_string + log_text
60
+ if not ('compareToZero' in skipped_properties):
61
+ # compare price & volume to zero
62
+ test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 0, '0')
63
+ test_shared_methods.assert_greater(exchange, skipped_properties, method, asks[i], 1, '0')
58
64
  if not ('spread' in skipped_properties):
59
65
  if bids_length and asks_length:
60
66
  first_bid = exchange.safe_string(bids[0], 0)
@@ -422,9 +422,13 @@ class testMainClass(baseMainTestClass):
422
422
  return result
423
423
 
424
424
  async def test_method(self, method_name, exchange, args, is_public):
425
+ # todo: temporary skip for c#
426
+ if 'OrderBook' in method_name and self.ext == 'cs':
427
+ exchange.options['checksum'] = False
425
428
  # todo: temporary skip for php
426
429
  if 'OrderBook' in method_name and self.ext == 'php':
427
430
  return
431
+ skipped_properties_for_method = self.get_skips(exchange, method_name)
428
432
  is_load_markets = (method_name == 'loadMarkets')
429
433
  is_fetch_currencies = (method_name == 'fetchCurrencies')
430
434
  is_proxy_test = (method_name == self.proxy_test_file_name)
@@ -437,7 +441,7 @@ class testMainClass(baseMainTestClass):
437
441
  skip_message = '[INFO] IGNORED_TEST'
438
442
  elif not is_load_markets and not supported_by_exchange and not is_proxy_test:
439
443
  skip_message = '[INFO] UNSUPPORTED_TEST' # keep it aligned with the longest message
440
- elif (method_name in self.skipped_methods) and (isinstance(self.skipped_methods[method_name], str)):
444
+ elif isinstance(skipped_properties_for_method, str):
441
445
  skip_message = '[INFO] SKIPPED_TEST'
442
446
  elif not (method_name in self.test_files):
443
447
  skip_message = '[INFO] UNIMPLEMENTED_TEST'
@@ -451,15 +455,24 @@ class testMainClass(baseMainTestClass):
451
455
  if self.info:
452
456
  args_stringified = '(' + ','.join(args) + ')'
453
457
  dump(self.add_padding('[INFO] TESTING', 25), self.exchange_hint(exchange), method_name, args_stringified)
454
- await call_method(self.test_files, method_name, exchange, self.get_skips(exchange, method_name), args)
458
+ await call_method(self.test_files, method_name, exchange, skipped_properties_for_method, args)
455
459
  # if it was passed successfully, add to the list of successfull tests
456
460
  if is_public:
457
461
  self.checked_public_tests[method_name] = True
458
462
  return
459
463
 
460
464
  def get_skips(self, exchange, method_name):
461
- # get "method-specific" skips
462
- skips_for_method = exchange.safe_value(self.skipped_methods, method_name, {})
465
+ final_skips = {}
466
+ # check the exact method (i.e. `fetchTrades`) and language-specific (i.e. `fetchTrades.php`)
467
+ method_names = [method_name, method_name + '.' + self.ext]
468
+ for i in range(0, len(method_names)):
469
+ m_name = method_names[i]
470
+ if m_name in self.skipped_methods:
471
+ # if whole method is skipped, by assigning a string to it, i.e. "fetchOrders":"blabla"
472
+ if isinstance(self.skipped_methods[m_name], str):
473
+ return self.skipped_methods[m_name]
474
+ else:
475
+ final_skips = exchange.deep_extend(final_skips, self.skipped_methods[m_name])
463
476
  # get "object-specific" skips
464
477
  object_skips = {
465
478
  'orderBook': ['fetchOrderBook', 'fetchOrderBooks', 'fetchL2OrderBook', 'watchOrderBook', 'watchOrderBookForSymbols'],
@@ -475,9 +488,19 @@ class testMainClass(baseMainTestClass):
475
488
  object_name = object_names[i]
476
489
  object_methods = object_skips[object_name]
477
490
  if exchange.in_array(method_name, object_methods):
491
+ # if whole object is skipped, by assigning a string to it, i.e. "orderBook":"blabla"
492
+ if (object_name in self.skipped_methods) and (isinstance(self.skipped_methods[object_name], str)):
493
+ return self.skipped_methods[object_name]
478
494
  extra_skips = exchange.safe_dict(self.skipped_methods, object_name, {})
479
- return exchange.deep_extend(skips_for_method, extra_skips)
480
- return skips_for_method
495
+ final_skips = exchange.deep_extend(final_skips, extra_skips)
496
+ # extend related skips
497
+ # - if 'timestamp' is skipped, we should do so for 'datetime' too
498
+ # - if 'bid' is skipped, skip 'ask' too
499
+ if ('timestamp' in final_skips) and not ('datetime' in final_skips):
500
+ final_skips['datetime'] = final_skips['timestamp']
501
+ if ('bid' in final_skips) and not ('ask' in final_skips):
502
+ final_skips['ask'] = final_skips['bid']
503
+ return final_skips
481
504
 
482
505
  async def test_safe(self, method_name, exchange, args=[], is_public=False):
483
506
  # `testSafe` method does not throw an exception, instead mutes it. The reason we
@@ -569,11 +592,14 @@ class testMainClass(baseMainTestClass):
569
592
  if self.ws_tests:
570
593
  tests = {
571
594
  'watchOHLCV': [symbol],
595
+ 'watchOHLCVForSymbols': [symbol],
572
596
  'watchTicker': [symbol],
573
597
  'watchTickers': [symbol],
574
598
  'watchBidsAsks': [symbol],
575
599
  'watchOrderBook': [symbol],
600
+ 'watchOrderBookForSymbols': [[symbol]],
576
601
  'watchTrades': [symbol],
602
+ 'watchTradesForSymbols': [[symbol]],
577
603
  }
578
604
  market = exchange.market(symbol)
579
605
  is_spot = market['spot']