dcex 0.26.0__tar.gz → 0.26.2__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.
Files changed (605) hide show
  1. {dcex-0.26.0 → dcex-0.26.2}/Cargo.lock +1 -1
  2. {dcex-0.26.0 → dcex-0.26.2}/PKG-INFO +1 -1
  3. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/CHANGELOG.md +18 -0
  4. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/Cargo.toml +1 -1
  5. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/wrappers.rs +3 -3
  6. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/client.rs +5 -6
  7. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/tests.rs +14 -1
  8. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/client.rs +22 -14
  9. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/tests.rs +20 -0
  10. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/wrappers.rs +2 -2
  11. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/wrappers.rs +4 -4
  12. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mod.rs +98 -1
  13. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/product_table.rs +103 -69
  14. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/aster.rs +43 -72
  15. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/backpack.rs +35 -52
  16. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/binance.rs +43 -72
  17. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/bingx.rs +35 -52
  18. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/bitget.rs +36 -56
  19. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/bitmart.rs +42 -68
  20. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/bitmex.rs +36 -56
  21. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/bybit.rs +36 -56
  22. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/gateio.rs +36 -56
  23. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/http.rs +35 -6
  24. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/hyperliquid.rs +35 -53
  25. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/kraken.rs +35 -52
  26. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/kucoin.rs +35 -52
  27. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/lighter.rs +67 -84
  28. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/mexc.rs +35 -59
  29. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/clients/okx.rs +36 -56
  30. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/lib.rs +142 -1
  31. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/product_table.rs +6 -18
  32. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/aster.rs +4 -13
  33. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/backpack.rs +6 -25
  34. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/binance.rs +4 -13
  35. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/bingx.rs +4 -13
  36. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/bitget.rs +6 -25
  37. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/bitmart.rs +6 -25
  38. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/bitmex.rs +6 -19
  39. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/bybit.rs +6 -19
  40. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/gateio.rs +6 -19
  41. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/hyperliquid.rs +6 -14
  42. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/kraken.rs +4 -13
  43. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/kucoin.rs +2 -12
  44. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/lighter.rs +4 -13
  45. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/mexc.rs +4 -13
  46. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/ws/okx.rs +6 -25
  47. {dcex-0.26.0 → dcex-0.26.2}/dcex/_native.pyi +43 -16
  48. dcex-0.26.2/dcex/_native_http.py +81 -0
  49. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/_http_manager.py +9 -23
  50. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/_market_http.py +8 -4
  51. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/_http_manager.py +12 -24
  52. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/_market_http.py +8 -4
  53. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/_http_manager.py +18 -24
  54. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/_account_http.py +7 -5
  55. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/_http_manager.py +3 -15
  56. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/_market_http.py +8 -4
  57. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/_trade_http.py +7 -5
  58. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/_http_manager.py +14 -19
  59. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/_market_http.py +8 -4
  60. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/_http_manager.py +9 -22
  61. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/_market_http.py +8 -4
  62. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/_http_manager.py +11 -24
  63. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/_market_http.py +8 -4
  64. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_http_manager.py +19 -24
  65. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_market_http.py +8 -4
  66. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_http_manager.py +9 -22
  67. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_market_http.py +8 -4
  68. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/_http_manager.py +14 -25
  69. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/_market_http.py +8 -4
  70. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/_http_manager.py +23 -30
  71. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/_http_manager.py +9 -22
  72. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/_market_http.py +8 -4
  73. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/_http_manager.py +11 -24
  74. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/_market_http.py +8 -4
  75. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/_http_manager.py +16 -25
  76. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/_http_manager.py +11 -24
  77. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/_market_http.py +8 -4
  78. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_http_manager.py +9 -21
  79. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_market_http.py +8 -4
  80. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_public_http.py +8 -4
  81. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/_http_manager.py +24 -24
  82. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/_account_http.py +8 -4
  83. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/_http_manager.py +3 -15
  84. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/_market_http.py +8 -4
  85. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/_trade_http.py +8 -4
  86. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/_http_manager.py +23 -20
  87. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/_market_http.py +8 -4
  88. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/_http_manager.py +12 -22
  89. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/_market_http.py +8 -4
  90. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/_http_manager.py +14 -24
  91. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/_market_http.py +8 -4
  92. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_http_manager.py +22 -24
  93. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_market_http.py +8 -4
  94. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_http_manager.py +12 -22
  95. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_market_http.py +8 -4
  96. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/_http_manager.py +18 -26
  97. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/_market_http.py +8 -4
  98. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/_http_manager.py +25 -30
  99. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/_http_manager.py +12 -22
  100. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/_market_http.py +8 -4
  101. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/_http_manager.py +14 -24
  102. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/_market_http.py +8 -4
  103. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/_http_manager.py +10 -24
  104. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/_http_manager.py +14 -24
  105. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/_market_http.py +8 -4
  106. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_http_manager.py +12 -21
  107. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_market_http.py +8 -4
  108. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_public_http.py +8 -4
  109. {dcex-0.26.0 → dcex-0.26.2}/pyproject.toml +1 -1
  110. dcex-0.26.0/dcex/_native_http.py +0 -38
  111. {dcex-0.26.0 → dcex-0.26.2}/Cargo.toml +0 -0
  112. {dcex-0.26.0 → dcex-0.26.2}/LICENSE +0 -0
  113. {dcex-0.26.0 → dcex-0.26.2}/LICENSES/Apache-2.0.txt +0 -0
  114. {dcex-0.26.0 → dcex-0.26.2}/README.md +0 -0
  115. {dcex-0.26.0 → dcex-0.26.2}/THIRD_PARTY_NOTICES.md +0 -0
  116. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/README.md +0 -0
  117. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/aster_public.rs +0 -0
  118. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/aster_ws_private_readonly.rs +0 -0
  119. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/aster_ws_public.rs +0 -0
  120. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/backpack_public.rs +0 -0
  121. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/backpack_ws_private_readonly.rs +0 -0
  122. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/backpack_ws_public.rs +0 -0
  123. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/binance_public.rs +0 -0
  124. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/binance_time.rs +0 -0
  125. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/binance_ws_private_readonly.rs +0 -0
  126. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/binance_ws_public.rs +0 -0
  127. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bingx_public.rs +0 -0
  128. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bingx_ws_private_readonly.rs +0 -0
  129. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bingx_ws_public.rs +0 -0
  130. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitget_public.rs +0 -0
  131. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitget_ws_private_readonly.rs +0 -0
  132. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitget_ws_public.rs +0 -0
  133. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmart_public.rs +0 -0
  134. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmart_ws_private_readonly.rs +0 -0
  135. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmart_ws_public.rs +0 -0
  136. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmex_public.rs +0 -0
  137. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmex_ws_private_readonly.rs +0 -0
  138. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bitmex_ws_public.rs +0 -0
  139. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bybit_public.rs +0 -0
  140. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bybit_ws_private_readonly.rs +0 -0
  141. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/bybit_ws_public.rs +0 -0
  142. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/core_local_benchmark.rs +0 -0
  143. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/gateio_public.rs +0 -0
  144. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/gateio_ws_private_readonly.rs +0 -0
  145. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/gateio_ws_public.rs +0 -0
  146. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/hyperliquid_public.rs +0 -0
  147. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/hyperliquid_ws_private_readonly.rs +0 -0
  148. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/hyperliquid_ws_public.rs +0 -0
  149. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kraken_public.rs +0 -0
  150. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kraken_ws_private_readonly.rs +0 -0
  151. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kraken_ws_public.rs +0 -0
  152. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kucoin_public.rs +0 -0
  153. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kucoin_ws_private_readonly.rs +0 -0
  154. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/kucoin_ws_public.rs +0 -0
  155. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/lighter_bench.rs +0 -0
  156. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/lighter_public.rs +0 -0
  157. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/lighter_ws_private_readonly.rs +0 -0
  158. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/lighter_ws_public.rs +0 -0
  159. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/mexc_public.rs +0 -0
  160. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/mexc_ws_private_readonly.rs +0 -0
  161. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/mexc_ws_public.rs +0 -0
  162. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/okx_public.rs +0 -0
  163. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/okx_ws_private_readonly.rs +0 -0
  164. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/okx_ws_public.rs +0 -0
  165. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/examples/public_http_benchmark.rs +0 -0
  166. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/common.rs +0 -0
  167. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/crypto.rs +0 -0
  168. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ethereum.rs +0 -0
  169. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchange.rs +0 -0
  170. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/account.rs +0 -0
  171. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/client.rs +0 -0
  172. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/endpoints.rs +0 -0
  173. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/market.rs +0 -0
  174. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/mod.rs +0 -0
  175. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/params.rs +0 -0
  176. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/signing.rs +0 -0
  177. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/tests.rs +0 -0
  178. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/trade.rs +0 -0
  179. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/websocket/mod.rs +0 -0
  180. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/websocket/private.rs +0 -0
  181. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/aster/websocket/public.rs +0 -0
  182. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/account.rs +0 -0
  183. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/client.rs +0 -0
  184. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/endpoints.rs +0 -0
  185. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/market.rs +0 -0
  186. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/mod.rs +0 -0
  187. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/params.rs +0 -0
  188. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/signing.rs +0 -0
  189. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/tests.rs +0 -0
  190. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/trade.rs +0 -0
  191. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/websocket/mod.rs +0 -0
  192. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/websocket/private.rs +0 -0
  193. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/websocket/public.rs +0 -0
  194. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/backpack/wrappers.rs +0 -0
  195. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/account.rs +0 -0
  196. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/client.rs +0 -0
  197. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/endpoints.rs +0 -0
  198. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/market.rs +0 -0
  199. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/mod.rs +0 -0
  200. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/params.rs +0 -0
  201. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/private.rs +0 -0
  202. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/signing.rs +0 -0
  203. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/stream.rs +0 -0
  204. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/tests.rs +0 -0
  205. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/trade.rs +0 -0
  206. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/websocket/mod.rs +0 -0
  207. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/websocket/private.rs +0 -0
  208. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/binance/websocket/public.rs +0 -0
  209. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/account.rs +0 -0
  210. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/endpoints.rs +0 -0
  211. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/market.rs +0 -0
  212. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/mod.rs +0 -0
  213. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/params.rs +0 -0
  214. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/private.rs +0 -0
  215. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/signing.rs +0 -0
  216. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/trade.rs +0 -0
  217. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/websocket/mod.rs +0 -0
  218. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/websocket/private.rs +0 -0
  219. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/websocket/public.rs +0 -0
  220. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bingx/wrappers.rs +0 -0
  221. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/account.rs +0 -0
  222. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/client.rs +0 -0
  223. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/endpoints.rs +0 -0
  224. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/market.rs +0 -0
  225. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/mod.rs +0 -0
  226. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/params.rs +0 -0
  227. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/private.rs +0 -0
  228. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/signing.rs +0 -0
  229. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/tests.rs +0 -0
  230. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/trade.rs +0 -0
  231. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/websocket/mod.rs +0 -0
  232. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/websocket/private.rs +0 -0
  233. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/websocket/public.rs +0 -0
  234. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitget/wrappers.rs +0 -0
  235. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/account.rs +0 -0
  236. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/client.rs +0 -0
  237. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/endpoints.rs +0 -0
  238. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/market.rs +0 -0
  239. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/mod.rs +0 -0
  240. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/params.rs +0 -0
  241. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/private.rs +0 -0
  242. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/signing.rs +0 -0
  243. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/tests.rs +0 -0
  244. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/trade.rs +0 -0
  245. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/websocket/mod.rs +0 -0
  246. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/websocket/private.rs +0 -0
  247. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/websocket/public.rs +0 -0
  248. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmart/wrappers.rs +0 -0
  249. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/account.rs +0 -0
  250. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/endpoints.rs +0 -0
  251. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/market.rs +0 -0
  252. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/mod.rs +0 -0
  253. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/params.rs +0 -0
  254. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/position.rs +0 -0
  255. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/private.rs +0 -0
  256. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/signing.rs +0 -0
  257. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/trade.rs +0 -0
  258. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/trading.rs +0 -0
  259. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/websocket/mod.rs +0 -0
  260. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/websocket/private.rs +0 -0
  261. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/websocket/public.rs +0 -0
  262. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bitmex/wrappers.rs +0 -0
  263. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/account.rs +0 -0
  264. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/asset.rs +0 -0
  265. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/client.rs +0 -0
  266. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/endpoints.rs +0 -0
  267. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/market.rs +0 -0
  268. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/mod.rs +0 -0
  269. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/params.rs +0 -0
  270. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/position.rs +0 -0
  271. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/private.rs +0 -0
  272. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/signing.rs +0 -0
  273. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/trade.rs +0 -0
  274. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/websocket/mod.rs +0 -0
  275. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/websocket/private.rs +0 -0
  276. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/websocket/public.rs +0 -0
  277. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/bybit/wrappers.rs +0 -0
  278. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/account.rs +0 -0
  279. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/client.rs +0 -0
  280. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/endpoints.rs +0 -0
  281. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/market.rs +0 -0
  282. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/mod.rs +0 -0
  283. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/params.rs +0 -0
  284. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/private.rs +0 -0
  285. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/signing.rs +0 -0
  286. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/tests.rs +0 -0
  287. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/trade.rs +0 -0
  288. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/websocket/mod.rs +0 -0
  289. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/websocket/private.rs +0 -0
  290. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/websocket/public.rs +0 -0
  291. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/gateio/wrappers.rs +0 -0
  292. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/account.rs +0 -0
  293. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/asset.rs +0 -0
  294. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/client.rs +0 -0
  295. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/endpoints.rs +0 -0
  296. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/market.rs +0 -0
  297. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/mod.rs +0 -0
  298. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/msgpack.rs +0 -0
  299. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/params.rs +0 -0
  300. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/signing.rs +0 -0
  301. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/tests.rs +0 -0
  302. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/trade.rs +0 -0
  303. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/websocket/mod.rs +0 -0
  304. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/websocket/private.rs +0 -0
  305. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/websocket/public.rs +0 -0
  306. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/hyperliquid/wrappers.rs +0 -0
  307. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/account.rs +0 -0
  308. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/client.rs +0 -0
  309. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/endpoints.rs +0 -0
  310. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/market.rs +0 -0
  311. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/mod.rs +0 -0
  312. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/params.rs +0 -0
  313. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/private.rs +0 -0
  314. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/signing.rs +0 -0
  315. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/tests.rs +0 -0
  316. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/trade.rs +0 -0
  317. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/websocket/mod.rs +0 -0
  318. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/websocket/private.rs +0 -0
  319. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/websocket/public.rs +0 -0
  320. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kraken/wrappers.rs +0 -0
  321. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/account.rs +0 -0
  322. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/client.rs +0 -0
  323. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/endpoints.rs +0 -0
  324. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/market.rs +0 -0
  325. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/mod.rs +0 -0
  326. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/params.rs +0 -0
  327. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/private.rs +0 -0
  328. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/signing.rs +0 -0
  329. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/tests.rs +0 -0
  330. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/trade.rs +0 -0
  331. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/websocket/mod.rs +0 -0
  332. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/websocket/private.rs +0 -0
  333. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/kucoin/websocket/public.rs +0 -0
  334. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/account.rs +0 -0
  335. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/client.rs +0 -0
  336. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/endpoints.rs +0 -0
  337. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/market.rs +0 -0
  338. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/mod.rs +0 -0
  339. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/params.rs +0 -0
  340. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/signing.rs +0 -0
  341. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/tests.rs +0 -0
  342. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/trade.rs +0 -0
  343. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/websocket/mod.rs +0 -0
  344. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/websocket/private.rs +0 -0
  345. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/websocket/public.rs +0 -0
  346. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/lighter/wrappers.rs +0 -0
  347. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/account.rs +0 -0
  348. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/client.rs +0 -0
  349. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/endpoints.rs +0 -0
  350. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/market.rs +0 -0
  351. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/mod.rs +0 -0
  352. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/params.rs +0 -0
  353. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/private.rs +0 -0
  354. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/signing.rs +0 -0
  355. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/tests.rs +0 -0
  356. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/trade.rs +0 -0
  357. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/websocket/mod.rs +0 -0
  358. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/websocket/private.rs +0 -0
  359. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/mexc/websocket/public.rs +0 -0
  360. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/account.rs +0 -0
  361. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/asset.rs +0 -0
  362. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/client.rs +0 -0
  363. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/endpoints.rs +0 -0
  364. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/market.rs +0 -0
  365. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/mod.rs +0 -0
  366. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/params.rs +0 -0
  367. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/private.rs +0 -0
  368. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/signing.rs +0 -0
  369. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/tests.rs +0 -0
  370. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/trade.rs +0 -0
  371. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/websocket/mod.rs +0 -0
  372. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/websocket/private.rs +0 -0
  373. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/websocket/public.rs +0 -0
  374. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/exchanges/okx/wrappers.rs +0 -0
  375. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/http.rs +0 -0
  376. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/lib.rs +0 -0
  377. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/lighter.rs +0 -0
  378. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/product_table_fetch/exchanges.rs +0 -0
  379. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/product_table_fetch/tests.rs +0 -0
  380. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/product_table_fetch.rs +0 -0
  381. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/aster.rs +0 -0
  382. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/backpack.rs +0 -0
  383. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/binance.rs +0 -0
  384. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/bingx.rs +0 -0
  385. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/bitget.rs +0 -0
  386. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/bitmart.rs +0 -0
  387. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/bitmex.rs +0 -0
  388. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/bybit.rs +0 -0
  389. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/connection.rs +0 -0
  390. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/gateio.rs +0 -0
  391. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/hyperliquid.rs +0 -0
  392. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/kraken.rs +0 -0
  393. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/kucoin.rs +0 -0
  394. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/lighter.rs +0 -0
  395. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/mexc.rs +0 -0
  396. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/mod.rs +0 -0
  397. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/src/ws/okx.rs +0 -0
  398. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/api_surface.rs +0 -0
  399. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/aster.rs +0 -0
  400. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/backpack.rs +0 -0
  401. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/binance.rs +0 -0
  402. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/bingx.rs +0 -0
  403. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/bitget.rs +0 -0
  404. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/bitmart.rs +0 -0
  405. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/bitmex.rs +0 -0
  406. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/bybit.rs +0 -0
  407. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/common.rs +0 -0
  408. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/gateio.rs +0 -0
  409. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/hyperliquid.rs +0 -0
  410. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/kraken.rs +0 -0
  411. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/kucoin.rs +0 -0
  412. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/lighter.rs +0 -0
  413. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/mexc.rs +0 -0
  414. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity/okx.rs +0 -0
  415. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_http_parity.rs +0 -0
  416. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/aster.rs +0 -0
  417. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/backpack.rs +0 -0
  418. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/binance.rs +0 -0
  419. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/bingx.rs +0 -0
  420. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/bitget.rs +0 -0
  421. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/bitmart.rs +0 -0
  422. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/bitmex.rs +0 -0
  423. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/bybit.rs +0 -0
  424. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/common.rs +0 -0
  425. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/gateio.rs +0 -0
  426. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/hyperliquid.rs +0 -0
  427. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/kraken.rs +0 -0
  428. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/kucoin.rs +0 -0
  429. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/lighter.rs +0 -0
  430. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/mexc.rs +0 -0
  431. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful/okx.rs +0 -0
  432. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex/tests/live_stateful.rs +0 -0
  433. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/Cargo.toml +0 -0
  434. {dcex-0.26.0 → dcex-0.26.2}/crates/dcex-python/src/functions.rs +0 -0
  435. {dcex-0.26.0 → dcex-0.26.2}/dcex/__init__.py +0 -0
  436. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/__init__.py +0 -0
  437. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/_account_http.py +0 -0
  438. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/_trade_http.py +0 -0
  439. {dcex-0.26.0 → dcex-0.26.2}/dcex/aster/client.py +0 -0
  440. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/__init__.py +0 -0
  441. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/__init__.py +0 -0
  442. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/_account_http.py +0 -0
  443. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/_trade_http.py +0 -0
  444. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/aster/client.py +0 -0
  445. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/__init__.py +0 -0
  446. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/_account_http.py +0 -0
  447. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/_market_http.py +0 -0
  448. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/_trade_http.py +0 -0
  449. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/backpack/client.py +0 -0
  450. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/__init__.py +0 -0
  451. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/client.py +0 -0
  452. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/binance/enums.py +0 -0
  453. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/__init__.py +0 -0
  454. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/_account_http.py +0 -0
  455. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/_trade_http.py +0 -0
  456. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bingx/client.py +0 -0
  457. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/__init__.py +0 -0
  458. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/_account_http.py +0 -0
  459. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/_trade_http.py +0 -0
  460. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitget/client.py +0 -0
  461. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/__init__.py +0 -0
  462. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/_account_http.py +0 -0
  463. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/_trade_http.py +0 -0
  464. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmart/client.py +0 -0
  465. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/__init__.py +0 -0
  466. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_account_http.py +0 -0
  467. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_position_http.py +0 -0
  468. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_trade_http.py +0 -0
  469. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/_trading_http.py +0 -0
  470. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bitmex/client.py +0 -0
  471. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/__init__.py +0 -0
  472. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_account_http.py +0 -0
  473. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_asset_http.py +0 -0
  474. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_position_http.py +0 -0
  475. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/_trade_http.py +0 -0
  476. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/bybit/client.py +0 -0
  477. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/__init__.py +0 -0
  478. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/_account_http.py +0 -0
  479. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/_trade_http.py +0 -0
  480. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/gateio/client.py +0 -0
  481. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/__init__.py +0 -0
  482. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/_account_http.py +0 -0
  483. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/_asset_http.py +0 -0
  484. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/_market_http.py +0 -0
  485. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/_trade_http.py +0 -0
  486. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/hyperliquid/client.py +0 -0
  487. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/__init__.py +0 -0
  488. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/_account_http.py +0 -0
  489. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/_trade_http.py +0 -0
  490. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kraken/client.py +0 -0
  491. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/__init__.py +0 -0
  492. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/_account_http.py +0 -0
  493. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/_trade_http.py +0 -0
  494. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/kucoin/client.py +0 -0
  495. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/__init__.py +0 -0
  496. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/_account_http.py +0 -0
  497. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/_market_http.py +0 -0
  498. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/_trade_http.py +0 -0
  499. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/lighter/client.py +0 -0
  500. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/__init__.py +0 -0
  501. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/_account_http.py +0 -0
  502. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/_trade_http.py +0 -0
  503. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/mexc/client.py +0 -0
  504. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/__init__.py +0 -0
  505. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_account_http.py +0 -0
  506. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_asset_http.py +0 -0
  507. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/_trade_http.py +0 -0
  508. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/okx/client.py +0 -0
  509. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/product_table/fetch.py +0 -0
  510. {dcex-0.26.0 → dcex-0.26.2}/dcex/async_support/product_table/manager.py +0 -0
  511. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/__init__.py +0 -0
  512. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/_account_http.py +0 -0
  513. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/_market_http.py +0 -0
  514. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/_trade_http.py +0 -0
  515. {dcex-0.26.0 → dcex-0.26.2}/dcex/backpack/client.py +0 -0
  516. {dcex-0.26.0 → dcex-0.26.2}/dcex/base/__init__.py +0 -0
  517. {dcex-0.26.0 → dcex-0.26.2}/dcex/base/http_manager.py +0 -0
  518. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/__init__.py +0 -0
  519. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/client.py +0 -0
  520. {dcex-0.26.0 → dcex-0.26.2}/dcex/binance/enums.py +0 -0
  521. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/__init__.py +0 -0
  522. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/_account_http.py +0 -0
  523. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/_trade_http.py +0 -0
  524. {dcex-0.26.0 → dcex-0.26.2}/dcex/bingx/client.py +0 -0
  525. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/__init__.py +0 -0
  526. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/_account_http.py +0 -0
  527. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/_trade_http.py +0 -0
  528. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitget/client.py +0 -0
  529. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/__init__.py +0 -0
  530. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/_account_http.py +0 -0
  531. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/_trade_http.py +0 -0
  532. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmart/client.py +0 -0
  533. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/__init__.py +0 -0
  534. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_account_http.py +0 -0
  535. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_position_http.py +0 -0
  536. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_trade_http.py +0 -0
  537. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/_trading_http.py +0 -0
  538. {dcex-0.26.0 → dcex-0.26.2}/dcex/bitmex/client.py +0 -0
  539. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/__init__.py +0 -0
  540. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_account_http.py +0 -0
  541. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_asset_http.py +0 -0
  542. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_position_http.py +0 -0
  543. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/_trade_http.py +0 -0
  544. {dcex-0.26.0 → dcex-0.26.2}/dcex/bybit/client.py +0 -0
  545. {dcex-0.26.0 → dcex-0.26.2}/dcex/enums.py +0 -0
  546. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/__init__.py +0 -0
  547. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/_account_http.py +0 -0
  548. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/_trade_http.py +0 -0
  549. {dcex-0.26.0 → dcex-0.26.2}/dcex/gateio/client.py +0 -0
  550. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/__init__.py +0 -0
  551. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/_account_http.py +0 -0
  552. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/_asset_http.py +0 -0
  553. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/_market_http.py +0 -0
  554. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/_trade_http.py +0 -0
  555. {dcex-0.26.0 → dcex-0.26.2}/dcex/hyperliquid/client.py +0 -0
  556. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/__init__.py +0 -0
  557. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/_account_http.py +0 -0
  558. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/_trade_http.py +0 -0
  559. {dcex-0.26.0 → dcex-0.26.2}/dcex/kraken/client.py +0 -0
  560. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/__init__.py +0 -0
  561. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/_account_http.py +0 -0
  562. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/_trade_http.py +0 -0
  563. {dcex-0.26.0 → dcex-0.26.2}/dcex/kucoin/client.py +0 -0
  564. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/__init__.py +0 -0
  565. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/_account_http.py +0 -0
  566. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/_market_http.py +0 -0
  567. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/_trade_http.py +0 -0
  568. {dcex-0.26.0 → dcex-0.26.2}/dcex/lighter/client.py +0 -0
  569. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/__init__.py +0 -0
  570. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/_account_http.py +0 -0
  571. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/_trade_http.py +0 -0
  572. {dcex-0.26.0 → dcex-0.26.2}/dcex/mexc/client.py +0 -0
  573. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/__init__.py +0 -0
  574. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_account_http.py +0 -0
  575. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_asset_http.py +0 -0
  576. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/_trade_http.py +0 -0
  577. {dcex-0.26.0 → dcex-0.26.2}/dcex/okx/client.py +0 -0
  578. {dcex-0.26.0 → dcex-0.26.2}/dcex/product_table/_query.py +0 -0
  579. {dcex-0.26.0 → dcex-0.26.2}/dcex/product_table/fetch.py +0 -0
  580. {dcex-0.26.0 → dcex-0.26.2}/dcex/product_table/manager.py +0 -0
  581. {dcex-0.26.0 → dcex-0.26.2}/dcex/registry.py +0 -0
  582. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/address_utils.py +0 -0
  583. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/common.py +0 -0
  584. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/decimal_utils.py +0 -0
  585. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/errors.py +0 -0
  586. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/helpers.py +0 -0
  587. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/jupyter_helper.py +0 -0
  588. {dcex-0.26.0 → dcex-0.26.2}/dcex/utils/timeframe_utils.py +0 -0
  589. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/__init__.py +0 -0
  590. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/_base.py +0 -0
  591. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/aster.py +0 -0
  592. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/backpack.py +0 -0
  593. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/binance.py +0 -0
  594. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/bingx.py +0 -0
  595. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/bitget.py +0 -0
  596. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/bitmart.py +0 -0
  597. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/bitmex.py +0 -0
  598. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/bybit.py +0 -0
  599. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/gateio.py +0 -0
  600. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/hyperliquid.py +0 -0
  601. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/kraken.py +0 -0
  602. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/kucoin.py +0 -0
  603. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/lighter.py +0 -0
  604. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/mexc.py +0 -0
  605. {dcex-0.26.0 → dcex-0.26.2}/dcex/ws/okx.py +0 -0
@@ -225,7 +225,7 @@ checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
225
225
 
226
226
  [[package]]
227
227
  name = "dcex"
228
- version = "0.4.1"
228
+ version = "0.4.3"
229
229
  dependencies = [
230
230
  "base64",
231
231
  "ed25519-dalek",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcex
3
- Version: 0.26.0
3
+ Version: 0.26.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Financial and Insurance Industry
@@ -1,3 +1,21 @@
1
+ ## 0.4.3 (2026-06-29)
2
+
3
+ ### Fix
4
+
5
+ - require API key for listen key requests
6
+ - require BitMEX credentials for signed requests
7
+
8
+ ## 0.4.2 (2026-06-29)
9
+
10
+ ### Fix
11
+
12
+ - satisfy product table lint checks
13
+ - align native params and timeout validation
14
+
15
+ ### Perf
16
+
17
+ - reduce product table lookup allocations
18
+
1
19
  ## 0.4.1 (2026-06-28)
2
20
 
3
21
  ### Fix
@@ -6,7 +6,7 @@ edition.workspace = true
6
6
  license.workspace = true
7
7
  readme = "README.md"
8
8
  repository.workspace = true
9
- version = "0.4.1"
9
+ version = "0.4.3"
10
10
  keywords = ["crypto", "trading", "exchange", "http"]
11
11
  categories = ["api-bindings", "web-programming::http-client"]
12
12
 
@@ -15,7 +15,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
15
15
  set_futures_multi_assets_mode(multi_assets_margin => "multiAssetsMargin"),
16
16
  get_futures_balance(),
17
17
  get_futures_account(),
18
- modify_futures_position_margin(product_symbol => "product_symbol", amount => "amount", type_ => "type_"),
18
+ modify_futures_position_margin(product_symbol => "product_symbol", amount => "amount", type_ => "type"),
19
19
  get_futures_position_margin_history(product_symbol => "product_symbol"),
20
20
  get_futures_position_risk(),
21
21
  get_futures_user_trades(product_symbol => "product_symbol"),
@@ -35,7 +35,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
35
35
  create_futures_listen_key(),
36
36
  keep_alive_futures_listen_key(),
37
37
  close_futures_listen_key(),
38
- place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type_"),
38
+ place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type"),
39
39
  cancel_spot_order(product_symbol => "product_symbol"),
40
40
  get_spot_order(product_symbol => "product_symbol"),
41
41
  get_spot_open_order(product_symbol => "product_symbol"),
@@ -43,7 +43,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
43
43
  cancel_all_spot_open_orders(product_symbol => "product_symbol"),
44
44
  get_spot_all_orders(product_symbol => "product_symbol"),
45
45
  get_spot_user_trades(),
46
- place_futures_order(product_symbol => "product_symbol", side => "side", type_ => "type_"),
46
+ place_futures_order(product_symbol => "product_symbol", side => "side", type_ => "type"),
47
47
  modify_futures_order(product_symbol => "product_symbol", quantity => "quantity", price => "price"),
48
48
  place_futures_chase_order(product_symbol => "product_symbol", side => "side", quantity_unit => "quantityUnit", quantity => "quantity", chase_offset => "chaseOffset", chase_offset_type => "chaseOffsetType"),
49
49
  place_futures_batch_orders(batch_orders => "batchOrders"),
@@ -6,7 +6,7 @@ use serde_json::Value;
6
6
  use crate::exchange::{ExchangeHttpClient, ValidatedResponse};
7
7
  use crate::http::{block_on, HttpMethod, HttpRequest, HttpResponse};
8
8
  use crate::product_table::ProductTable;
9
- use crate::Result;
9
+ use crate::{DcexError, Result};
10
10
 
11
11
  use super::endpoints::BASE_URL;
12
12
  use super::params::{exchange_symbol_fallback, is_canonical_product_symbol};
@@ -157,11 +157,10 @@ impl BingxClient {
157
157
  path: &str,
158
158
  params: Vec<(String, String)>,
159
159
  ) -> Result<ValidatedResponse> {
160
- let headers = self
161
- .api_key
162
- .as_ref()
163
- .map(|api_key| vec![("X-BX-APIKEY".to_string(), api_key.to_string())])
164
- .unwrap_or_default();
160
+ let api_key = self.api_key.as_deref().ok_or_else(|| {
161
+ DcexError::InvalidInput("BingX API key is required for this request.".to_string())
162
+ })?;
163
+ let headers = vec![("X-BX-APIKEY".to_string(), api_key.to_string())];
165
164
  self.request(HttpMethod::Post, path, params, false, headers, None)
166
165
  .await
167
166
  }
@@ -1,6 +1,8 @@
1
1
  use crate::exchange::RequestSigner;
2
- use crate::http::{HttpMethod, HttpRequest};
2
+ use crate::http::{block_on, HttpMethod, HttpRequest};
3
+ use std::time::Duration;
3
4
 
5
+ use super::client::BingxClient;
4
6
  use super::endpoints::BASE_URL;
5
7
  use super::signing::BingxSigner;
6
8
 
@@ -37,3 +39,14 @@ fn signer_uses_unescaped_sorted_payload() {
37
39
  Some("api-key")
38
40
  );
39
41
  }
42
+
43
+ #[test]
44
+ fn listen_key_requires_api_key() {
45
+ let client = BingxClient::public(Duration::from_secs(1)).expect("client");
46
+ let error = block_on(async move { client.private_request("get_listen_key", Vec::new()).await })
47
+ .expect_err("missing API key should fail before sending");
48
+ assert_eq!(
49
+ error.to_string(),
50
+ "BingX API key is required for this request."
51
+ );
52
+ }
@@ -157,24 +157,32 @@ impl BitmexClient {
157
157
  request.body = body.clone().map(RequestBody::Raw).unwrap_or_default();
158
158
  }
159
159
  if signed {
160
- if let (Some(api_key), Some(api_secret)) = (&self.api_key, &self.api_secret) {
161
- let body = String::from_utf8_lossy(body.as_deref().unwrap_or_default());
162
- let payload = format!("{}{full_path}{expires}{body}", http_method_name(method));
163
- let signature = hmac_sha256_hex(api_secret.as_bytes(), payload.as_bytes())?;
164
- request
165
- .headers
166
- .insert("api-key".to_string(), api_key.clone());
167
- request
168
- .headers
169
- .insert("api-signature".to_string(), signature);
170
- request
171
- .headers
172
- .insert("api-expires".to_string(), expires.to_string());
173
- }
160
+ let (api_key, api_secret) = self.credentials()?;
161
+ let body = String::from_utf8_lossy(body.as_deref().unwrap_or_default());
162
+ let payload = format!("{}{full_path}{expires}{body}", http_method_name(method));
163
+ let signature = hmac_sha256_hex(api_secret.as_bytes(), payload.as_bytes())?;
164
+ request
165
+ .headers
166
+ .insert("api-key".to_string(), api_key.to_string());
167
+ request
168
+ .headers
169
+ .insert("api-signature".to_string(), signature);
170
+ request
171
+ .headers
172
+ .insert("api-expires".to_string(), expires.to_string());
174
173
  }
175
174
  Ok(request)
176
175
  }
177
176
 
177
+ fn credentials(&self) -> Result<(&str, &str)> {
178
+ match (&self.api_key, &self.api_secret) {
179
+ (Some(api_key), Some(api_secret)) => Ok((api_key, api_secret)),
180
+ _ => Err(DcexError::InvalidInput(
181
+ "Signed BitMEX requests require api_key and api_secret.".to_string(),
182
+ )),
183
+ }
184
+ }
185
+
178
186
  pub(super) fn exchange_symbol(&self, product_symbol: &str) -> Result<String> {
179
187
  if is_canonical_product_symbol(product_symbol) {
180
188
  if let Some(table) = &self.product_table {
@@ -31,6 +31,26 @@ fn signature_includes_encoded_query_path() {
31
31
  );
32
32
  }
33
33
 
34
+ #[test]
35
+ fn signed_request_requires_credentials() {
36
+ let client = BitmexClient::public(Duration::from_secs(1)).expect("client");
37
+ let error = client
38
+ .build_request(
39
+ HttpMethod::Get,
40
+ "/api/v1/order",
41
+ Vec::new(),
42
+ None,
43
+ true,
44
+ 1_700_000_005,
45
+ )
46
+ .expect_err("missing credentials should fail before sending");
47
+
48
+ assert_eq!(
49
+ error.to_string(),
50
+ "Signed BitMEX requests require api_key and api_secret."
51
+ );
52
+ }
53
+
34
54
  #[test]
35
55
  fn limit_buy_shortcut_builds_order_body_without_side_param() {
36
56
  let client = BitmexClient::public(Duration::from_secs(1)).expect("client");
@@ -47,7 +47,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
47
47
  place_futures_market_buy_order(product_symbol => "product_symbol", size => "size"),
48
48
  place_futures_market_order(product_symbol => "product_symbol", side => "side", size => "size"),
49
49
  place_futures_market_sell_order(product_symbol => "product_symbol", size => "size"),
50
- place_futures_order(product_symbol => "product_symbol", side => "side", type_ => "type_", size => "size"),
50
+ place_futures_order(product_symbol => "product_symbol", side => "side", type_ => "type", size => "size"),
51
51
  place_futures_post_only_limit_buy_order(product_symbol => "product_symbol", size => "size", price => "price"),
52
52
  place_futures_post_only_limit_order(product_symbol => "product_symbol", side => "side", size => "size", price => "price"),
53
53
  place_futures_post_only_limit_sell_order(product_symbol => "product_symbol", size => "size", price => "price"),
@@ -60,7 +60,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
60
60
  place_spot_market_buy_order(product_symbol => "product_symbol"),
61
61
  place_spot_market_order(product_symbol => "product_symbol", side => "side"),
62
62
  place_spot_market_sell_order(product_symbol => "product_symbol"),
63
- place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type_"),
63
+ place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type"),
64
64
  place_spot_post_only_limit_buy_order(product_symbol => "product_symbol", size => "size", price => "price"),
65
65
  place_spot_post_only_limit_order(product_symbol => "product_symbol", side => "side", size => "size", price => "price"),
66
66
  place_spot_post_only_limit_sell_order(product_symbol => "product_symbol", size => "size", price => "price"),
@@ -39,7 +39,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
39
39
  cancel_spot_open_orders(product_symbol => "product_symbol"),
40
40
  cancel_spot_order(product_symbol => "product_symbol"),
41
41
  change_contract_leverage(leverage => "leverage"),
42
- change_contract_margin(position_id => "positionId", amount => "amount", type_ => "type_"),
42
+ change_contract_margin(position_id => "positionId", amount => "amount", type_ => "type"),
43
43
  change_contract_position_mode(position_mode => "positionMode"),
44
44
  get_contract_asset(currency => "currency"),
45
45
  get_contract_assets(),
@@ -82,7 +82,7 @@ crate::exchanges::impl_exchange_method_wrappers! {
82
82
  place_contract_market_buy_order(product_symbol => "product_symbol", vol => "vol"),
83
83
  place_contract_market_order(product_symbol => "product_symbol", side => "side", vol => "vol"),
84
84
  place_contract_market_sell_order(product_symbol => "product_symbol", vol => "vol"),
85
- place_contract_order(product_symbol => "product_symbol", side => "side", type_ => "type_", open_type => "openType", vol => "vol"),
85
+ place_contract_order(product_symbol => "product_symbol", side => "side", type_ => "type", open_type => "openType", vol => "vol"),
86
86
  place_contract_post_only_buy_order(product_symbol => "product_symbol", price => "price", vol => "vol"),
87
87
  place_contract_post_only_order(product_symbol => "product_symbol", side => "side", price => "price", vol => "vol"),
88
88
  place_contract_post_only_sell_order(product_symbol => "product_symbol", price => "price", vol => "vol"),
@@ -93,12 +93,12 @@ crate::exchanges::impl_exchange_method_wrappers! {
93
93
  place_spot_market_buy_order(product_symbol => "product_symbol", quote_order_qty => "quoteOrderQty"),
94
94
  place_spot_market_order(product_symbol => "product_symbol", side => "side"),
95
95
  place_spot_market_sell_order(product_symbol => "product_symbol", quantity => "quantity"),
96
- place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type_"),
96
+ place_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type"),
97
97
  place_spot_post_only_limit_buy_order(product_symbol => "product_symbol", quantity => "quantity", price => "price"),
98
98
  place_spot_post_only_limit_order(product_symbol => "product_symbol", side => "side", quantity => "quantity", price => "price"),
99
99
  place_spot_post_only_limit_sell_order(product_symbol => "product_symbol", quantity => "quantity", price => "price"),
100
100
  set_spot_mx_deduct(mx_deduct_enable => "mxDeductEnable"),
101
- test_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type_"),
101
+ test_spot_order(product_symbol => "product_symbol", side => "side", type_ => "type"),
102
102
  user_universal_transfer(from_account_type => "fromAccountType", to_account_type => "toAccountType", asset => "asset", amount => "amount"),
103
103
  ];
104
104
  }
@@ -546,7 +546,7 @@ impl<'a, C: ExchangeMethodRequestClient> ExchangeMethodRequest<'a, C> {
546
546
  }
547
547
 
548
548
  pub fn from_(self, value: impl ToString) -> Self {
549
- self.param("from_", value)
549
+ self.param("from", value)
550
550
  }
551
551
 
552
552
  pub fn from_account(self, value: impl ToString) -> Self {
@@ -1646,16 +1646,113 @@ mod tests {
1646
1646
  let client = DummyClient;
1647
1647
  let request = ExchangeMethodRequest::private(&client, "wallet_transfer", Vec::new())
1648
1648
  .currency_pair("BTC_USDT")
1649
+ .from_("spot")
1649
1650
  .settle("usdt");
1650
1651
 
1651
1652
  assert_eq!(
1652
1653
  request.params,
1653
1654
  vec![
1654
1655
  ("currency_pair".to_string(), "BTC_USDT".to_string()),
1656
+ ("from".to_string(), "spot".to_string()),
1655
1657
  ("settle".to_string(), "usdt".to_string())
1656
1658
  ]
1657
1659
  );
1658
1660
  }
1661
+
1662
+ #[test]
1663
+ fn type_keyword_builders_use_native_type_parameter_name() {
1664
+ let client =
1665
+ crate::exchanges::aster::AsterClient::public(std::time::Duration::from_secs(1))
1666
+ .expect("client");
1667
+
1668
+ let spot = client.place_spot_order("ASTER-USDT-SPOT", "buy", "MARKET");
1669
+ assert_eq!(
1670
+ spot.params,
1671
+ vec![
1672
+ ("product_symbol".to_string(), "ASTER-USDT-SPOT".to_string()),
1673
+ ("side".to_string(), "buy".to_string()),
1674
+ ("type".to_string(), "MARKET".to_string())
1675
+ ]
1676
+ );
1677
+
1678
+ let futures = client.place_futures_order("ASTER-USDT-SWAP", "sell", "LIMIT");
1679
+ assert_eq!(
1680
+ futures.params,
1681
+ vec![
1682
+ ("product_symbol".to_string(), "ASTER-USDT-SWAP".to_string()),
1683
+ ("side".to_string(), "sell".to_string()),
1684
+ ("type".to_string(), "LIMIT".to_string())
1685
+ ]
1686
+ );
1687
+
1688
+ let margin = client.modify_futures_position_margin("ASTER-USDT-SWAP", "10", "ADD");
1689
+ assert_eq!(
1690
+ margin.params,
1691
+ vec![
1692
+ ("product_symbol".to_string(), "ASTER-USDT-SWAP".to_string()),
1693
+ ("amount".to_string(), "10".to_string()),
1694
+ ("type".to_string(), "ADD".to_string())
1695
+ ]
1696
+ );
1697
+
1698
+ let client =
1699
+ crate::exchanges::kucoin::KucoinClient::public(std::time::Duration::from_secs(1))
1700
+ .expect("client");
1701
+ let spot = client.place_spot_order("BTC-USDT-SPOT", "buy", "market");
1702
+ assert_eq!(
1703
+ spot.params,
1704
+ vec![
1705
+ ("product_symbol".to_string(), "BTC-USDT-SPOT".to_string()),
1706
+ ("side".to_string(), "buy".to_string()),
1707
+ ("type".to_string(), "market".to_string())
1708
+ ]
1709
+ );
1710
+
1711
+ let futures = client.place_futures_order("BTC-USDT-SWAP", "sell", "limit", "1");
1712
+ assert_eq!(
1713
+ futures.params,
1714
+ vec![
1715
+ ("product_symbol".to_string(), "BTC-USDT-SWAP".to_string()),
1716
+ ("side".to_string(), "sell".to_string()),
1717
+ ("type".to_string(), "limit".to_string()),
1718
+ ("size".to_string(), "1".to_string())
1719
+ ]
1720
+ );
1721
+
1722
+ let client = crate::exchanges::mexc::MexcClient::public(std::time::Duration::from_secs(1))
1723
+ .expect("client");
1724
+ let spot = client.place_spot_order("MX-USDT-SPOT", "BUY", "MARKET");
1725
+ assert_eq!(
1726
+ spot.params,
1727
+ vec![
1728
+ ("product_symbol".to_string(), "MX-USDT-SPOT".to_string()),
1729
+ ("side".to_string(), "BUY".to_string()),
1730
+ ("type".to_string(), "MARKET".to_string())
1731
+ ]
1732
+ );
1733
+
1734
+ let contract = client.place_contract_order("BTC-USDT-SWAP", "1", "5", "1", "10");
1735
+ assert_eq!(
1736
+ contract.params,
1737
+ vec![
1738
+ ("product_symbol".to_string(), "BTC-USDT-SWAP".to_string()),
1739
+ ("side".to_string(), "1".to_string()),
1740
+ ("type".to_string(), "5".to_string()),
1741
+ ("openType".to_string(), "1".to_string()),
1742
+ ("vol".to_string(), "10".to_string())
1743
+ ]
1744
+ );
1745
+
1746
+ let margin = client.change_contract_margin("123", "10", "ADD");
1747
+ assert_eq!(
1748
+ margin.params,
1749
+ vec![
1750
+ ("positionId".to_string(), "123".to_string()),
1751
+ ("amount".to_string(), "10".to_string()),
1752
+ ("type".to_string(), "ADD".to_string())
1753
+ ]
1754
+ );
1755
+ }
1659
1756
  }
1660
1757
 
1661
1758
  pub mod aster;
@@ -7,6 +7,10 @@ use crate::{DcexError, Result};
7
7
  #[path = "product_table_fetch.rs"]
8
8
  mod fetch;
9
9
 
10
+ type UniqueIndex = HashMap<String, HashMap<String, Option<usize>>>;
11
+ type MultiIndex = HashMap<String, HashMap<String, Vec<usize>>>;
12
+ type TypedUniqueIndex = HashMap<String, HashMap<String, HashMap<String, Option<usize>>>>;
13
+
10
14
  #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
11
15
  pub struct MarketInfo {
12
16
  pub exchange: String,
@@ -44,10 +48,10 @@ pub struct ProductFilter<'a> {
44
48
  #[derive(Clone, Debug, Default)]
45
49
  pub struct ProductTable {
46
50
  rows: Vec<MarketInfo>,
47
- by_exchange_product: HashMap<(String, String), Option<usize>>,
48
- by_exchange_exchange_symbol: HashMap<(String, String), Vec<usize>>,
49
- by_exchange_exchange_symbol_product_type: HashMap<(String, String, String), Option<usize>>,
50
- by_exchange_exchange_symbol_exchange_type: HashMap<(String, String, String), Option<usize>>,
51
+ by_exchange_product: UniqueIndex,
52
+ by_exchange_exchange_symbol: MultiIndex,
53
+ by_exchange_exchange_symbol_product_type: TypedUniqueIndex,
54
+ by_exchange_exchange_symbol_exchange_type: TypedUniqueIndex,
51
55
  }
52
56
 
53
57
  impl ProductTable {
@@ -107,11 +111,8 @@ impl ProductTable {
107
111
  }
108
112
 
109
113
  pub fn get_exchange_symbol(&self, exchange: &str, product_symbol: &str) -> Result<String> {
110
- match self
111
- .by_exchange_product
112
- .get(&(exchange.to_string(), product_symbol.to_string()))
113
- {
114
- Some(Some(index)) => Ok(self.rows[*index].exchange_symbol.clone()),
114
+ match lookup_unique_index(&self.by_exchange_product, exchange, product_symbol) {
115
+ Some(Some(index)) => Ok(self.rows[index].exchange_symbol.clone()),
115
116
  _ => self.get(
116
117
  "exchange_symbol",
117
118
  ProductFilter {
@@ -221,29 +222,28 @@ impl ProductTable {
221
222
  for (index, row) in self.rows.iter().enumerate() {
222
223
  insert_unique_index(
223
224
  &mut self.by_exchange_product,
224
- (row.exchange.clone(), row.product_symbol.clone()),
225
+ &row.exchange,
226
+ &row.product_symbol,
225
227
  index,
226
228
  );
227
- self.by_exchange_exchange_symbol
228
- .entry((row.exchange.clone(), row.exchange_symbol.clone()))
229
- .or_default()
230
- .push(index);
231
- insert_unique_index(
229
+ insert_multi_index(
230
+ &mut self.by_exchange_exchange_symbol,
231
+ &row.exchange,
232
+ &row.exchange_symbol,
233
+ index,
234
+ );
235
+ insert_typed_unique_index(
232
236
  &mut self.by_exchange_exchange_symbol_product_type,
233
- (
234
- row.exchange.clone(),
235
- row.exchange_symbol.clone(),
236
- row.product_type.clone(),
237
- ),
237
+ &row.exchange,
238
+ &row.exchange_symbol,
239
+ &row.product_type,
238
240
  index,
239
241
  );
240
- insert_unique_index(
242
+ insert_typed_unique_index(
241
243
  &mut self.by_exchange_exchange_symbol_exchange_type,
242
- (
243
- row.exchange.clone(),
244
- row.exchange_symbol.clone(),
245
- row.exchange_type.clone(),
246
- ),
244
+ &row.exchange,
245
+ &row.exchange_symbol,
246
+ &row.exchange_type,
247
247
  index,
248
248
  );
249
249
  }
@@ -256,38 +256,31 @@ impl ProductTable {
256
256
  product_type: Option<&str>,
257
257
  exchange_type: Option<&str>,
258
258
  ) -> Option<usize> {
259
- let index = match (product_type, exchange_type) {
260
- (Some(product_type), None) => self
261
- .by_exchange_exchange_symbol_product_type
262
- .get(&(
263
- exchange.to_string(),
264
- exchange_symbol.to_string(),
265
- product_type.to_string(),
266
- ))
267
- .copied()
268
- .flatten(),
269
- (None, Some(exchange_type)) => self
270
- .by_exchange_exchange_symbol_exchange_type
271
- .get(&(
272
- exchange.to_string(),
273
- exchange_symbol.to_string(),
274
- exchange_type.to_string(),
275
- ))
276
- .copied()
277
- .flatten(),
278
- (Some(product_type), Some(exchange_type)) => self
279
- .by_exchange_exchange_symbol_product_type
280
- .get(&(
281
- exchange.to_string(),
282
- exchange_symbol.to_string(),
283
- product_type.to_string(),
284
- ))
285
- .copied()
286
- .flatten()
287
- .filter(|index| self.rows[*index].exchange_type == exchange_type),
259
+ match (product_type, exchange_type) {
260
+ (Some(product_type), None) => lookup_typed_unique_index(
261
+ &self.by_exchange_exchange_symbol_product_type,
262
+ exchange,
263
+ exchange_symbol,
264
+ product_type,
265
+ )
266
+ .flatten(),
267
+ (None, Some(exchange_type)) => lookup_typed_unique_index(
268
+ &self.by_exchange_exchange_symbol_exchange_type,
269
+ exchange,
270
+ exchange_symbol,
271
+ exchange_type,
272
+ )
273
+ .flatten(),
274
+ (Some(product_type), Some(exchange_type)) => lookup_typed_unique_index(
275
+ &self.by_exchange_exchange_symbol_product_type,
276
+ exchange,
277
+ exchange_symbol,
278
+ product_type,
279
+ )
280
+ .flatten()
281
+ .filter(|index| self.rows[*index].exchange_type == exchange_type),
288
282
  (None, None) => None,
289
- };
290
- index
283
+ }
291
284
  }
292
285
 
293
286
  fn get_product_field(
@@ -301,9 +294,8 @@ impl ProductTable {
301
294
  return self.get_product_value(key, exchange, product_symbol);
302
295
  }
303
296
  if let Some(exchange_symbol) = exchange_symbol {
304
- if let Some(indexes) = self
305
- .by_exchange_exchange_symbol
306
- .get(&(exchange.to_string(), exchange_symbol.to_string()))
297
+ if let Some(indexes) =
298
+ lookup_multi_index(&self.by_exchange_exchange_symbol, exchange, exchange_symbol)
307
299
  {
308
300
  if indexes.len() == 1 {
309
301
  return row_value(&self.rows[indexes[0]], key)
@@ -333,11 +325,8 @@ impl ProductTable {
333
325
  }
334
326
 
335
327
  fn unique_product(&self, exchange: &str, product_symbol: &str) -> Result<&MarketInfo> {
336
- match self
337
- .by_exchange_product
338
- .get(&(exchange.to_string(), product_symbol.to_string()))
339
- {
340
- Some(Some(index)) => Ok(&self.rows[*index]),
328
+ match lookup_unique_index(&self.by_exchange_product, exchange, product_symbol) {
329
+ Some(Some(index)) => Ok(&self.rows[index]),
341
330
  _ => {
342
331
  let matches = self
343
332
  .rows
@@ -378,17 +367,62 @@ impl ProductTable {
378
367
  }
379
368
  }
380
369
 
381
- fn insert_unique_index<K: std::hash::Hash + Eq>(
382
- index: &mut HashMap<K, Option<usize>>,
383
- key: K,
370
+ fn insert_unique_index(index: &mut UniqueIndex, exchange: &str, symbol: &str, row_index: usize) {
371
+ index
372
+ .entry(exchange.to_string())
373
+ .or_default()
374
+ .entry(symbol.to_string())
375
+ .and_modify(|value| *value = None)
376
+ .or_insert(Some(row_index));
377
+ }
378
+
379
+ fn lookup_unique_index(index: &UniqueIndex, exchange: &str, symbol: &str) -> Option<Option<usize>> {
380
+ index.get(exchange)?.get(symbol).copied()
381
+ }
382
+
383
+ fn insert_multi_index(index: &mut MultiIndex, exchange: &str, symbol: &str, row_index: usize) {
384
+ index
385
+ .entry(exchange.to_string())
386
+ .or_default()
387
+ .entry(symbol.to_string())
388
+ .or_default()
389
+ .push(row_index);
390
+ }
391
+
392
+ fn lookup_multi_index<'a>(
393
+ index: &'a MultiIndex,
394
+ exchange: &str,
395
+ symbol: &str,
396
+ ) -> Option<&'a [usize]> {
397
+ index.get(exchange)?.get(symbol).map(Vec::as_slice)
398
+ }
399
+
400
+ fn insert_typed_unique_index(
401
+ index: &mut TypedUniqueIndex,
402
+ exchange: &str,
403
+ symbol: &str,
404
+ kind: &str,
384
405
  row_index: usize,
385
406
  ) {
386
407
  index
387
- .entry(key)
408
+ .entry(exchange.to_string())
409
+ .or_default()
410
+ .entry(symbol.to_string())
411
+ .or_default()
412
+ .entry(kind.to_string())
388
413
  .and_modify(|value| *value = None)
389
414
  .or_insert(Some(row_index));
390
415
  }
391
416
 
417
+ fn lookup_typed_unique_index(
418
+ index: &TypedUniqueIndex,
419
+ exchange: &str,
420
+ symbol: &str,
421
+ kind: &str,
422
+ ) -> Option<Option<usize>> {
423
+ index.get(exchange)?.get(symbol)?.get(kind).copied()
424
+ }
425
+
392
426
  fn row_matches(row: &MarketInfo, filter: ProductFilter<'_>) -> bool {
393
427
  filter
394
428
  .product_symbol