mexc-exchange-api 0.0.8__py3-none-any.whl → 0.0.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mexc-exchange-api might be problematic. Click here for more details.

Files changed (290) hide show
  1. mexc_exchange_api-0.0.10.dist-info/METADATA +81 -0
  2. mexc_exchange_api-0.0.10.dist-info/RECORD +3 -0
  3. mexc_exchange_api/__init__.py +0 -7
  4. mexc_exchange_api/ccxt/__init__.py +0 -101
  5. mexc_exchange_api/ccxt/abstract/mexc.py +0 -180
  6. mexc_exchange_api/ccxt/async_support/__init__.py +0 -80
  7. mexc_exchange_api/ccxt/async_support/base/__init__.py +0 -1
  8. mexc_exchange_api/ccxt/async_support/base/exchange.py +0 -2100
  9. mexc_exchange_api/ccxt/async_support/base/throttler.py +0 -50
  10. mexc_exchange_api/ccxt/async_support/base/ws/__init__.py +0 -38
  11. mexc_exchange_api/ccxt/async_support/base/ws/aiohttp_client.py +0 -147
  12. mexc_exchange_api/ccxt/async_support/base/ws/cache.py +0 -213
  13. mexc_exchange_api/ccxt/async_support/base/ws/client.py +0 -214
  14. mexc_exchange_api/ccxt/async_support/base/ws/fast_client.py +0 -97
  15. mexc_exchange_api/ccxt/async_support/base/ws/functions.py +0 -59
  16. mexc_exchange_api/ccxt/async_support/base/ws/future.py +0 -69
  17. mexc_exchange_api/ccxt/async_support/base/ws/order_book.py +0 -78
  18. mexc_exchange_api/ccxt/async_support/base/ws/order_book_side.py +0 -174
  19. mexc_exchange_api/ccxt/async_support/mexc.py +0 -5796
  20. mexc_exchange_api/ccxt/base/__init__.py +0 -27
  21. mexc_exchange_api/ccxt/base/decimal_to_precision.py +0 -174
  22. mexc_exchange_api/ccxt/base/errors.py +0 -267
  23. mexc_exchange_api/ccxt/base/exchange.py +0 -6770
  24. mexc_exchange_api/ccxt/base/precise.py +0 -297
  25. mexc_exchange_api/ccxt/base/types.py +0 -577
  26. mexc_exchange_api/ccxt/mexc.py +0 -5795
  27. mexc_exchange_api/ccxt/pro/__init__.py +0 -21
  28. mexc_exchange_api/ccxt/pro/mexc.py +0 -1457
  29. mexc_exchange_api/ccxt/static_dependencies/README.md +0 -1
  30. mexc_exchange_api/ccxt/static_dependencies/__init__.py +0 -1
  31. mexc_exchange_api/ccxt/static_dependencies/ecdsa/__init__.py +0 -14
  32. mexc_exchange_api/ccxt/static_dependencies/ecdsa/_version.py +0 -520
  33. mexc_exchange_api/ccxt/static_dependencies/ecdsa/curves.py +0 -56
  34. mexc_exchange_api/ccxt/static_dependencies/ecdsa/der.py +0 -221
  35. mexc_exchange_api/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -310
  36. mexc_exchange_api/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -197
  37. mexc_exchange_api/ccxt/static_dependencies/ecdsa/keys.py +0 -332
  38. mexc_exchange_api/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -531
  39. mexc_exchange_api/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -100
  40. mexc_exchange_api/ccxt/static_dependencies/ecdsa/util.py +0 -266
  41. mexc_exchange_api/ccxt/static_dependencies/ethereum/__init__.py +0 -7
  42. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -16
  43. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/abi.py +0 -19
  44. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/base.py +0 -152
  45. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/codec.py +0 -217
  46. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/constants.py +0 -3
  47. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -565
  48. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -720
  49. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -139
  50. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -443
  51. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/packed.py +0 -13
  52. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
  53. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/registry.py +0 -643
  54. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -3
  55. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -230
  56. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
  57. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -83
  58. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -27
  59. mexc_exchange_api/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -19
  60. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/__init__.py +0 -3
  61. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -4
  62. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -239
  63. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -40
  64. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/messages.py +0 -263
  65. mexc_exchange_api/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
  66. mexc_exchange_api/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -5
  67. mexc_exchange_api/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -54
  68. mexc_exchange_api/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -65
  69. mexc_exchange_api/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
  70. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -63
  71. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/abi.py +0 -6
  72. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/bls.py +0 -7
  73. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -5
  74. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -7
  75. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/enums.py +0 -17
  76. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -9
  77. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/evm.py +0 -20
  78. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/networks.py +0 -1122
  79. mexc_exchange_api/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
  80. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -115
  81. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/abi.py +0 -72
  82. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/address.py +0 -171
  83. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -151
  84. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -190
  85. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/currency.py +0 -107
  86. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -269
  87. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/debug.py +0 -20
  88. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -132
  89. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -6
  90. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -4
  91. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/functional.py +0 -75
  92. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -74
  93. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -188
  94. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/logging.py +0 -159
  95. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -31
  96. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -43
  97. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
  98. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -76
  99. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/types.py +0 -54
  100. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -18
  101. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -14
  102. mexc_exchange_api/ccxt/static_dependencies/ethereum/utils/units.py +0 -31
  103. mexc_exchange_api/ccxt/static_dependencies/keccak/__init__.py +0 -3
  104. mexc_exchange_api/ccxt/static_dependencies/keccak/keccak.py +0 -197
  105. mexc_exchange_api/ccxt/static_dependencies/lark/__init__.py +0 -38
  106. mexc_exchange_api/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +0 -6
  107. mexc_exchange_api/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +0 -14
  108. mexc_exchange_api/ccxt/static_dependencies/lark/ast_utils.py +0 -59
  109. mexc_exchange_api/ccxt/static_dependencies/lark/common.py +0 -86
  110. mexc_exchange_api/ccxt/static_dependencies/lark/exceptions.py +0 -292
  111. mexc_exchange_api/ccxt/static_dependencies/lark/grammar.py +0 -130
  112. mexc_exchange_api/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
  113. mexc_exchange_api/ccxt/static_dependencies/lark/grammars/common.lark +0 -59
  114. mexc_exchange_api/ccxt/static_dependencies/lark/grammars/lark.lark +0 -62
  115. mexc_exchange_api/ccxt/static_dependencies/lark/grammars/python.lark +0 -302
  116. mexc_exchange_api/ccxt/static_dependencies/lark/grammars/unicode.lark +0 -7
  117. mexc_exchange_api/ccxt/static_dependencies/lark/indenter.py +0 -143
  118. mexc_exchange_api/ccxt/static_dependencies/lark/lark.py +0 -658
  119. mexc_exchange_api/ccxt/static_dependencies/lark/lexer.py +0 -678
  120. mexc_exchange_api/ccxt/static_dependencies/lark/load_grammar.py +0 -1428
  121. mexc_exchange_api/ccxt/static_dependencies/lark/parse_tree_builder.py +0 -391
  122. mexc_exchange_api/ccxt/static_dependencies/lark/parser_frontends.py +0 -257
  123. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
  124. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/cyk.py +0 -340
  125. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/earley.py +0 -314
  126. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/earley_common.py +0 -42
  127. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/earley_forest.py +0 -801
  128. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +0 -203
  129. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +0 -332
  130. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +0 -158
  131. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/lalr_parser.py +0 -122
  132. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +0 -110
  133. mexc_exchange_api/ccxt/static_dependencies/lark/parsers/xearley.py +0 -165
  134. mexc_exchange_api/ccxt/static_dependencies/lark/py.typed +0 -0
  135. mexc_exchange_api/ccxt/static_dependencies/lark/reconstruct.py +0 -107
  136. mexc_exchange_api/ccxt/static_dependencies/lark/tools/__init__.py +0 -70
  137. mexc_exchange_api/ccxt/static_dependencies/lark/tools/nearley.py +0 -202
  138. mexc_exchange_api/ccxt/static_dependencies/lark/tools/serialize.py +0 -32
  139. mexc_exchange_api/ccxt/static_dependencies/lark/tools/standalone.py +0 -196
  140. mexc_exchange_api/ccxt/static_dependencies/lark/tree.py +0 -267
  141. mexc_exchange_api/ccxt/static_dependencies/lark/tree_matcher.py +0 -186
  142. mexc_exchange_api/ccxt/static_dependencies/lark/tree_templates.py +0 -180
  143. mexc_exchange_api/ccxt/static_dependencies/lark/utils.py +0 -343
  144. mexc_exchange_api/ccxt/static_dependencies/lark/visitors.py +0 -596
  145. mexc_exchange_api/ccxt/static_dependencies/marshmallow/__init__.py +0 -81
  146. mexc_exchange_api/ccxt/static_dependencies/marshmallow/base.py +0 -65
  147. mexc_exchange_api/ccxt/static_dependencies/marshmallow/class_registry.py +0 -94
  148. mexc_exchange_api/ccxt/static_dependencies/marshmallow/decorators.py +0 -231
  149. mexc_exchange_api/ccxt/static_dependencies/marshmallow/error_store.py +0 -60
  150. mexc_exchange_api/ccxt/static_dependencies/marshmallow/exceptions.py +0 -71
  151. mexc_exchange_api/ccxt/static_dependencies/marshmallow/fields.py +0 -2114
  152. mexc_exchange_api/ccxt/static_dependencies/marshmallow/orderedset.py +0 -89
  153. mexc_exchange_api/ccxt/static_dependencies/marshmallow/py.typed +0 -0
  154. mexc_exchange_api/ccxt/static_dependencies/marshmallow/schema.py +0 -1228
  155. mexc_exchange_api/ccxt/static_dependencies/marshmallow/types.py +0 -12
  156. mexc_exchange_api/ccxt/static_dependencies/marshmallow/utils.py +0 -378
  157. mexc_exchange_api/ccxt/static_dependencies/marshmallow/validate.py +0 -678
  158. mexc_exchange_api/ccxt/static_dependencies/marshmallow/warnings.py +0 -2
  159. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +0 -1047
  160. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +0 -51
  161. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +0 -45
  162. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +0 -71
  163. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
  164. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/typing.py +0 -14
  165. mexc_exchange_api/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +0 -82
  166. mexc_exchange_api/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +0 -1
  167. mexc_exchange_api/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +0 -193
  168. mexc_exchange_api/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
  169. mexc_exchange_api/ccxt/static_dependencies/msgpack/__init__.py +0 -55
  170. mexc_exchange_api/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +0 -11
  171. mexc_exchange_api/ccxt/static_dependencies/msgpack/_packer.pyx +0 -374
  172. mexc_exchange_api/ccxt/static_dependencies/msgpack/_unpacker.pyx +0 -547
  173. mexc_exchange_api/ccxt/static_dependencies/msgpack/buff_converter.h +0 -8
  174. mexc_exchange_api/ccxt/static_dependencies/msgpack/exceptions.py +0 -48
  175. mexc_exchange_api/ccxt/static_dependencies/msgpack/ext.py +0 -168
  176. mexc_exchange_api/ccxt/static_dependencies/msgpack/fallback.py +0 -951
  177. mexc_exchange_api/ccxt/static_dependencies/msgpack/pack.h +0 -89
  178. mexc_exchange_api/ccxt/static_dependencies/msgpack/pack_template.h +0 -820
  179. mexc_exchange_api/ccxt/static_dependencies/msgpack/sysdep.h +0 -194
  180. mexc_exchange_api/ccxt/static_dependencies/msgpack/unpack.h +0 -391
  181. mexc_exchange_api/ccxt/static_dependencies/msgpack/unpack_define.h +0 -95
  182. mexc_exchange_api/ccxt/static_dependencies/msgpack/unpack_template.h +0 -464
  183. mexc_exchange_api/ccxt/static_dependencies/parsimonious/__init__.py +0 -10
  184. mexc_exchange_api/ccxt/static_dependencies/parsimonious/exceptions.py +0 -105
  185. mexc_exchange_api/ccxt/static_dependencies/parsimonious/expressions.py +0 -479
  186. mexc_exchange_api/ccxt/static_dependencies/parsimonious/grammar.py +0 -487
  187. mexc_exchange_api/ccxt/static_dependencies/parsimonious/nodes.py +0 -325
  188. mexc_exchange_api/ccxt/static_dependencies/parsimonious/utils.py +0 -40
  189. mexc_exchange_api/ccxt/static_dependencies/starknet/__init__.py +0 -0
  190. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v0/__init__.py +0 -2
  191. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v0/model.py +0 -44
  192. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v0/parser.py +0 -216
  193. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v0/schemas.py +0 -72
  194. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v0/shape.py +0 -63
  195. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/__init__.py +0 -2
  196. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +0 -14
  197. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/model.py +0 -39
  198. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/parser.py +0 -220
  199. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +0 -179
  200. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/schemas.py +0 -66
  201. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v1/shape.py +0 -47
  202. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/__init__.py +0 -2
  203. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/model.py +0 -89
  204. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/parser.py +0 -293
  205. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +0 -192
  206. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/schemas.py +0 -132
  207. mexc_exchange_api/ccxt/static_dependencies/starknet/abi/v2/shape.py +0 -107
  208. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
  209. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/data_types.py +0 -123
  210. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
  211. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +0 -77
  212. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +0 -46
  213. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +0 -138
  214. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/felt.py +0 -64
  215. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/type_parser.py +0 -121
  216. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
  217. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +0 -59
  218. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
  219. mexc_exchange_api/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +0 -77
  220. mexc_exchange_api/ccxt/static_dependencies/starknet/ccxt_utils.py +0 -7
  221. mexc_exchange_api/ccxt/static_dependencies/starknet/common.py +0 -15
  222. mexc_exchange_api/ccxt/static_dependencies/starknet/constants.py +0 -39
  223. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
  224. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/address.py +0 -79
  225. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +0 -111
  226. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/selector.py +0 -16
  227. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/storage.py +0 -12
  228. mexc_exchange_api/ccxt/static_dependencies/starknet/hash/utils.py +0 -78
  229. mexc_exchange_api/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
  230. mexc_exchange_api/ccxt/static_dependencies/starknet/models/typed_data.py +0 -45
  231. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/__init__.py +0 -24
  232. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +0 -40
  233. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/_context.py +0 -142
  234. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +0 -10
  235. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +0 -82
  236. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +0 -43
  237. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +0 -37
  238. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +0 -66
  239. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +0 -71
  240. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +0 -71
  241. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +0 -50
  242. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +0 -58
  243. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +0 -43
  244. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +0 -40
  245. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +0 -72
  246. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +0 -36
  247. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +0 -36
  248. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +0 -76
  249. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +0 -100
  250. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +0 -32
  251. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/errors.py +0 -10
  252. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/factory.py +0 -229
  253. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +0 -110
  254. mexc_exchange_api/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +0 -59
  255. mexc_exchange_api/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
  256. mexc_exchange_api/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +0 -86
  257. mexc_exchange_api/ccxt/static_dependencies/starknet/utils/iterable.py +0 -13
  258. mexc_exchange_api/ccxt/static_dependencies/starknet/utils/schema.py +0 -13
  259. mexc_exchange_api/ccxt/static_dependencies/starknet/utils/typed_data.py +0 -182
  260. mexc_exchange_api/ccxt/static_dependencies/starkware/__init__.py +0 -0
  261. mexc_exchange_api/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
  262. mexc_exchange_api/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +0 -50
  263. mexc_exchange_api/ccxt/static_dependencies/starkware/crypto/math_utils.py +0 -78
  264. mexc_exchange_api/ccxt/static_dependencies/starkware/crypto/signature.py +0 -2344
  265. mexc_exchange_api/ccxt/static_dependencies/starkware/crypto/utils.py +0 -63
  266. mexc_exchange_api/ccxt/static_dependencies/sympy/__init__.py +0 -0
  267. mexc_exchange_api/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
  268. mexc_exchange_api/ccxt/static_dependencies/sympy/core/intfunc.py +0 -35
  269. mexc_exchange_api/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
  270. mexc_exchange_api/ccxt/static_dependencies/sympy/external/gmpy.py +0 -345
  271. mexc_exchange_api/ccxt/static_dependencies/sympy/external/importtools.py +0 -187
  272. mexc_exchange_api/ccxt/static_dependencies/sympy/external/ntheory.py +0 -637
  273. mexc_exchange_api/ccxt/static_dependencies/sympy/external/pythonmpq.py +0 -341
  274. mexc_exchange_api/ccxt/static_dependencies/toolz/__init__.py +0 -26
  275. mexc_exchange_api/ccxt/static_dependencies/toolz/_signatures.py +0 -784
  276. mexc_exchange_api/ccxt/static_dependencies/toolz/_version.py +0 -520
  277. mexc_exchange_api/ccxt/static_dependencies/toolz/compatibility.py +0 -30
  278. mexc_exchange_api/ccxt/static_dependencies/toolz/curried/__init__.py +0 -101
  279. mexc_exchange_api/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -22
  280. mexc_exchange_api/ccxt/static_dependencies/toolz/curried/operator.py +0 -22
  281. mexc_exchange_api/ccxt/static_dependencies/toolz/dicttoolz.py +0 -339
  282. mexc_exchange_api/ccxt/static_dependencies/toolz/functoolz.py +0 -1049
  283. mexc_exchange_api/ccxt/static_dependencies/toolz/itertoolz.py +0 -1057
  284. mexc_exchange_api/ccxt/static_dependencies/toolz/recipes.py +0 -46
  285. mexc_exchange_api/ccxt/static_dependencies/toolz/utils.py +0 -9
  286. mexc_exchange_api/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
  287. mexc_exchange_api/ccxt/static_dependencies/typing_inspect/typing_inspect.py +0 -851
  288. mexc_exchange_api-0.0.8.dist-info/METADATA +0 -62
  289. mexc_exchange_api-0.0.8.dist-info/RECORD +0 -288
  290. {mexc_exchange_api-0.0.8.dist-info → mexc_exchange_api-0.0.10.dist-info}/WHEEL +0 -0
@@ -1,1457 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- # PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
4
- # https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
5
-
6
- import ccxt.async_support
7
- from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
- import hashlib
9
- from ccxt.base.types import Any, Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
- from ccxt.async_support.base.ws.client import Client
11
- from typing import List
12
- from ccxt.base.errors import AuthenticationError
13
- from ccxt.base.errors import ArgumentsRequired
14
- from ccxt.base.errors import NotSupported
15
-
16
-
17
- from ccxt.async_support import mexc as mexcAsync
18
-
19
-
20
- class mexc(mexcAsync):
21
-
22
- def describe(self) -> Any:
23
- return self.deep_extend(super(mexc, self).describe(), {
24
- 'has': {
25
- 'ws': True,
26
- 'cancelAllOrdersWs': False,
27
- 'cancelOrdersWs': False,
28
- 'cancelOrderWs': False,
29
- 'createOrderWs': False,
30
- 'editOrderWs': False,
31
- 'fetchBalanceWs': False,
32
- 'fetchOpenOrdersWs': False,
33
- 'fetchOrderWs': False,
34
- 'fetchTradesWs': False,
35
- 'watchBalance': True,
36
- 'watchMyTrades': True,
37
- 'watchOHLCV': True,
38
- 'watchOrderBook': True,
39
- 'watchOrders': True,
40
- 'watchTicker': True,
41
- 'watchTickers': True,
42
- 'watchBidsAsks': True,
43
- 'watchTrades': True,
44
- 'watchTradesForSymbols': False,
45
- },
46
- 'urls': {
47
- 'api': {
48
- 'ws': {
49
- 'spot': 'wss://wbs.mexc.com/ws',
50
- 'swap': 'wss://contract.mexc.com/edge',
51
- },
52
- },
53
- },
54
- 'options': {
55
- 'listenKeyRefreshRate': 1200000,
56
- # TODO add reset connection after #16754 is merged
57
- 'timeframes': {
58
- '1m': 'Min1',
59
- '5m': 'Min5',
60
- '15m': 'Min15',
61
- '30m': 'Min30',
62
- '1h': 'Min60',
63
- '4h': 'Hour4',
64
- '8h': 'Hour8',
65
- '1d': 'Day1',
66
- '1w': 'Week1',
67
- '1M': 'Month1',
68
- },
69
- 'watchOrderBook': {
70
- 'snapshotDelay': 25,
71
- 'snapshotMaxRetries': 3,
72
- },
73
- 'listenKey': None,
74
- },
75
- 'streaming': {
76
- 'ping': self.ping,
77
- 'keepAlive': 8000,
78
- },
79
- 'exceptions': {
80
- },
81
- })
82
-
83
- async def watch_ticker(self, symbol: str, params={}) -> Ticker:
84
- """
85
- watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
86
-
87
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
88
- https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
89
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#miniticker
90
-
91
- :param str symbol: unified symbol of the market to fetch the ticker for
92
- :param dict [params]: extra parameters specific to the exchange API endpoint
93
- :param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
94
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
95
- """
96
- await self.load_markets()
97
- market = self.market(symbol)
98
- messageHash = 'ticker:' + market['symbol']
99
- if market['spot']:
100
- miniTicker = False
101
- miniTicker, params = self.handle_option_and_params(params, 'watchTicker', 'miniTicker')
102
- channel = None
103
- if miniTicker:
104
- channel = 'spot@public.miniTicker.v3.api@' + market['id'] + '@UTC+8'
105
- else:
106
- channel = 'spot@public.bookTicker.v3.api@' + market['id']
107
- return await self.watch_spot_public(channel, messageHash, params)
108
- else:
109
- channel = 'sub.ticker'
110
- requestParams: dict = {
111
- 'symbol': market['id'],
112
- }
113
- return await self.watch_swap_public(channel, messageHash, requestParams, params)
114
-
115
- def handle_ticker(self, client: Client, message):
116
- #
117
- # swap
118
- #
119
- # {
120
- # "symbol": "BTC_USDT",
121
- # "data": {
122
- # "symbol": "BTC_USDT",
123
- # "lastPrice": 76376.2,
124
- # "riseFallRate": -0.0006,
125
- # "fairPrice": 76374.4,
126
- # "indexPrice": 76385.8,
127
- # "volume24": 962062810,
128
- # "amount24": 7344207079.96768,
129
- # "maxBidPrice": 84024.3,
130
- # "minAskPrice": 68747.2,
131
- # "lower24Price": 75620.2,
132
- # "high24Price": 77210,
133
- # "timestamp": 1731137509138,
134
- # "bid1": 76376.2,
135
- # "ask1": 76376.3,
136
- # "holdVol": 95479623,
137
- # "riseFallValue": -46.5,
138
- # "fundingRate": 0.0001,
139
- # "zone": "UTC+8",
140
- # "riseFallRates": [-0.0006, 0.1008, 0.2262, 0.2628, 0.2439, 1.0564],
141
- # "riseFallRatesOfTimezone": [0.0065, -0.0013, -0.0006]
142
- # },
143
- # "channel": "push.ticker",
144
- # "ts": 1731137509138
145
- # }
146
- #
147
- # spot
148
- #
149
- # {
150
- # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
151
- # "d": {
152
- # "A": "4.70432",
153
- # "B": "6.714863",
154
- # "a": "20744.54",
155
- # "b": "20744.17"
156
- # },
157
- # "s": "BTCUSDT",
158
- # "t": 1678643605721
159
- # }
160
- #
161
- # spot miniTicker
162
- #
163
- # {
164
- # "d": {
165
- # "s": "BTCUSDT",
166
- # "p": "76522",
167
- # "r": "0.0012",
168
- # "tr": "0.0012",
169
- # "h": "77196.3",
170
- # "l": "75630.77",
171
- # "v": "584664223.92",
172
- # "q": "7666.720258",
173
- # "lastRT": "-1",
174
- # "MT": "0",
175
- # "NV": "--",
176
- # "t": "1731135533126"
177
- # },
178
- # "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
179
- # "t": 1731135533126,
180
- # "s": "BTCUSDT"
181
- # }
182
- #
183
- self.handle_bid_ask(client, message)
184
- rawTicker = self.safe_dict_2(message, 'd', 'data')
185
- marketId = self.safe_string_2(message, 's', 'symbol')
186
- timestamp = self.safe_integer(message, 't')
187
- market = self.safe_market(marketId)
188
- symbol = market['symbol']
189
- ticker = None
190
- if market['spot']:
191
- ticker = self.parse_ws_ticker(rawTicker, market)
192
- ticker['timestamp'] = timestamp
193
- ticker['datetime'] = self.iso8601(timestamp)
194
- else:
195
- ticker = self.parse_ticker(rawTicker, market)
196
- self.tickers[symbol] = ticker
197
- messageHash = 'ticker:' + symbol
198
- client.resolve(ticker, messageHash)
199
-
200
- async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
201
- """
202
- watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
203
-
204
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
205
- https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
206
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#minitickers
207
-
208
- :param str[] symbols: unified symbol of the market to fetch the ticker for
209
- :param dict [params]: extra parameters specific to the exchange API endpoint
210
- :param boolean [params.miniTicker]: set to True for using the miniTicker endpoint
211
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
212
- """
213
- await self.load_markets()
214
- symbols = self.market_symbols(symbols, None)
215
- messageHashes = []
216
- firstSymbol = self.safe_string(symbols, 0)
217
- market = None
218
- if firstSymbol is not None:
219
- market = self.market(firstSymbol)
220
- type = None
221
- type, params = self.handle_market_type_and_params('watchTickers', market, params)
222
- isSpot = (type == 'spot')
223
- url = self.urls['api']['ws']['spot'] if (isSpot) else self.urls['api']['ws']['swap']
224
- request: dict = {}
225
- if isSpot:
226
- miniTicker = False
227
- miniTicker, params = self.handle_option_and_params(params, 'watchTickers', 'miniTicker')
228
- topics = []
229
- if not miniTicker:
230
- if symbols is None:
231
- raise ArgumentsRequired(self.id + ' watchTickers required symbols argument for the bookTicker channel')
232
- marketIds = self.market_ids(symbols)
233
- for i in range(0, len(marketIds)):
234
- marketId = marketIds[i]
235
- messageHashes.append('ticker:' + symbols[i])
236
- channel = 'spot@public.bookTicker.v3.api@' + marketId
237
- topics.append(channel)
238
- else:
239
- topics.append('spot@public.miniTickers.v3.api@UTC+8')
240
- if symbols is None:
241
- messageHashes.append('spot:ticker')
242
- else:
243
- for i in range(0, len(symbols)):
244
- messageHashes.append('ticker:' + symbols[i])
245
- request['method'] = 'SUBSCRIPTION'
246
- request['params'] = topics
247
- else:
248
- request['method'] = 'sub.tickers'
249
- request['params'] = {}
250
- messageHashes.append('ticker')
251
- ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
252
- if isSpot and self.newUpdates:
253
- result: dict = {}
254
- result[ticker['symbol']] = ticker
255
- return result
256
- return self.filter_by_array(self.tickers, 'symbol', symbols)
257
-
258
- def handle_tickers(self, client: Client, message):
259
- #
260
- # swap
261
- #
262
- # {
263
- # "channel": "push.tickers",
264
- # "data": [
265
- # {
266
- # "symbol": "ETH_USDT",
267
- # "lastPrice": 2324.5,
268
- # "riseFallRate": 0.0356,
269
- # "fairPrice": 2324.32,
270
- # "indexPrice": 2325.44,
271
- # "volume24": 25868309,
272
- # "amount24": 591752573.9792,
273
- # "maxBidPrice": 2557.98,
274
- # "minAskPrice": 2092.89,
275
- # "lower24Price": 2239.39,
276
- # "high24Price": 2332.59,
277
- # "timestamp": 1725872514111
278
- # }
279
- # ],
280
- # "ts": 1725872514111
281
- # }
282
- #
283
- # spot
284
- #
285
- # {
286
- # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
287
- # "d": {
288
- # "A": "4.70432",
289
- # "B": "6.714863",
290
- # "a": "20744.54",
291
- # "b": "20744.17"
292
- # },
293
- # "s": "BTCUSDT",
294
- # "t": 1678643605721
295
- # }
296
- #
297
- # spot miniTicker
298
- #
299
- # {
300
- # "d": {
301
- # "s": "BTCUSDT",
302
- # "p": "76522",
303
- # "r": "0.0012",
304
- # "tr": "0.0012",
305
- # "h": "77196.3",
306
- # "l": "75630.77",
307
- # "v": "584664223.92",
308
- # "q": "7666.720258",
309
- # "lastRT": "-1",
310
- # "MT": "0",
311
- # "NV": "--",
312
- # "t": "1731135533126"
313
- # },
314
- # "c": "spot@public.miniTicker.v3.api@BTCUSDT@UTC+8",
315
- # "t": 1731135533126,
316
- # "s": "BTCUSDT"
317
- # }
318
- #
319
- data = self.safe_list_2(message, 'data', 'd')
320
- channel = self.safe_string(message, 'c', '')
321
- marketId = self.safe_string(message, 's')
322
- market = self.safe_market(marketId)
323
- channelStartsWithSpot = channel.startswith('spot')
324
- marketIdIsUndefined = marketId is None
325
- isSpot = channelStartsWithSpot if marketIdIsUndefined else market['spot']
326
- spotPrefix = 'spot:'
327
- messageHashPrefix = spotPrefix if isSpot else ''
328
- topic = messageHashPrefix + 'ticker'
329
- result = []
330
- for i in range(0, len(data)):
331
- entry = data[i]
332
- ticker = None
333
- if isSpot:
334
- ticker = self.parse_ws_ticker(entry, market)
335
- else:
336
- ticker = self.parse_ticker(entry)
337
- symbol = ticker['symbol']
338
- self.tickers[symbol] = ticker
339
- result.append(ticker)
340
- messageHash = 'ticker:' + symbol
341
- client.resolve(ticker, messageHash)
342
- client.resolve(result, topic)
343
-
344
- def parse_ws_ticker(self, ticker, market=None):
345
- #
346
- # spot
347
- #
348
- # {
349
- # "A": "4.70432",
350
- # "B": "6.714863",
351
- # "a": "20744.54",
352
- # "b": "20744.17"
353
- # }
354
- #
355
- # spot miniTicker
356
- #
357
- # {
358
- # "s": "BTCUSDT",
359
- # "p": "76522",
360
- # "r": "0.0012",
361
- # "tr": "0.0012",
362
- # "h": "77196.3",
363
- # "l": "75630.77",
364
- # "v": "584664223.92",
365
- # "q": "7666.720258",
366
- # "lastRT": "-1",
367
- # "MT": "0",
368
- # "NV": "--",
369
- # "t": "1731135533126"
370
- # }
371
- #
372
- marketId = self.safe_string(ticker, 's')
373
- timestamp = self.safe_integer(ticker, 't')
374
- price = self.safe_string(ticker, 'p')
375
- return self.safe_ticker({
376
- 'info': ticker,
377
- 'symbol': self.safe_symbol(marketId, market),
378
- 'timestamp': timestamp,
379
- 'datetime': self.iso8601(timestamp),
380
- 'open': None,
381
- 'high': self.safe_number(ticker, 'h'),
382
- 'low': self.safe_number(ticker, 'l'),
383
- 'close': price,
384
- 'last': price,
385
- 'bid': self.safe_number(ticker, 'b'),
386
- 'bidVolume': self.safe_number(ticker, 'B'),
387
- 'ask': self.safe_number(ticker, 'a'),
388
- 'askVolume': self.safe_number(ticker, 'A'),
389
- 'vwap': None,
390
- 'previousClose': None,
391
- 'change': None,
392
- 'percentage': self.safe_number(ticker, 'tr'),
393
- 'average': None,
394
- 'baseVolume': self.safe_number(ticker, 'v'),
395
- 'quoteVolume': self.safe_number(ticker, 'q'),
396
- }, market)
397
-
398
- async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
399
- """
400
-
401
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
402
-
403
- watches best bid & ask for symbols
404
- :param str[] symbols: unified symbol of the market to fetch the ticker for
405
- :param dict [params]: extra parameters specific to the exchange API endpoint
406
- :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
407
- """
408
- await self.load_markets()
409
- symbols = self.market_symbols(symbols, None, True, False, True)
410
- marketType = None
411
- if symbols is None:
412
- raise ArgumentsRequired(self.id + ' watchBidsAsks required symbols argument')
413
- markets = self.markets_for_symbols(symbols)
414
- marketType, params = self.handle_market_type_and_params('watchBidsAsks', markets[0], params)
415
- isSpot = marketType == 'spot'
416
- if not isSpot:
417
- raise NotSupported(self.id + ' watchBidsAsks only support spot market')
418
- messageHashes = []
419
- topics = []
420
- for i in range(0, len(symbols)):
421
- if isSpot:
422
- market = self.market(symbols[i])
423
- topics.append('spot@public.bookTicker.v3.api@' + market['id'])
424
- messageHashes.append('bidask:' + symbols[i])
425
- url = self.urls['api']['ws']['spot']
426
- request: dict = {
427
- 'method': 'SUBSCRIPTION',
428
- 'params': topics,
429
- }
430
- ticker = await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
431
- if self.newUpdates:
432
- tickers: dict = {}
433
- tickers[ticker['symbol']] = ticker
434
- return tickers
435
- return self.filter_by_array(self.bidsasks, 'symbol', symbols)
436
-
437
- def handle_bid_ask(self, client: Client, message):
438
- #
439
- # {
440
- # "c": "spot@public.bookTicker.v3.api@BTCUSDT",
441
- # "d": {
442
- # "A": "4.70432",
443
- # "B": "6.714863",
444
- # "a": "20744.54",
445
- # "b": "20744.17"
446
- # },
447
- # "s": "BTCUSDT",
448
- # "t": 1678643605721
449
- # }
450
- #
451
- parsedTicker = self.parse_ws_bid_ask(message)
452
- symbol = self.safe_string(parsedTicker, 'symbol')
453
- if symbol is None:
454
- return
455
- self.bidsasks[symbol] = parsedTicker
456
- messageHash = 'bidask:' + symbol
457
- client.resolve(parsedTicker, messageHash)
458
-
459
- def parse_ws_bid_ask(self, ticker, market=None):
460
- data = self.safe_dict(ticker, 'd')
461
- marketId = self.safe_string(ticker, 's')
462
- market = self.safe_market(marketId, market)
463
- symbol = self.safe_string(market, 'symbol')
464
- timestamp = self.safe_integer(ticker, 't')
465
- return self.safe_ticker({
466
- 'symbol': symbol,
467
- 'timestamp': timestamp,
468
- 'datetime': self.iso8601(timestamp),
469
- 'ask': self.safe_number(data, 'a'),
470
- 'askVolume': self.safe_number(data, 'A'),
471
- 'bid': self.safe_number(data, 'b'),
472
- 'bidVolume': self.safe_number(data, 'B'),
473
- 'info': ticker,
474
- }, market)
475
-
476
- async def watch_spot_public(self, channel, messageHash, params={}):
477
- url = self.urls['api']['ws']['spot']
478
- request: dict = {
479
- 'method': 'SUBSCRIPTION',
480
- 'params': [channel],
481
- }
482
- return await self.watch(url, messageHash, self.extend(request, params), channel)
483
-
484
- async def watch_spot_private(self, channel, messageHash, params={}):
485
- self.check_required_credentials()
486
- listenKey = await self.authenticate(channel)
487
- url = self.urls['api']['ws']['spot'] + '?listenKey=' + listenKey
488
- request: dict = {
489
- 'method': 'SUBSCRIPTION',
490
- 'params': [channel],
491
- }
492
- return await self.watch(url, messageHash, self.extend(request, params), channel)
493
-
494
- async def watch_swap_public(self, channel, messageHash, requestParams, params={}):
495
- url = self.urls['api']['ws']['swap']
496
- request: dict = {
497
- 'method': channel,
498
- 'param': requestParams,
499
- }
500
- message = self.extend(request, params)
501
- return await self.watch(url, messageHash, message, messageHash)
502
-
503
- async def watch_swap_private(self, messageHash, params={}):
504
- self.check_required_credentials()
505
- channel = 'login'
506
- url = self.urls['api']['ws']['swap']
507
- timestamp = str(self.milliseconds())
508
- payload = self.apiKey + timestamp
509
- signature = self.hmac(self.encode(payload), self.encode(self.secret), hashlib.sha256)
510
- request: dict = {
511
- 'method': channel,
512
- 'param': {
513
- 'apiKey': self.apiKey,
514
- 'signature': signature,
515
- 'reqTime': timestamp,
516
- },
517
- }
518
- message = self.extend(request, params)
519
- return await self.watch(url, messageHash, message, channel)
520
-
521
- async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
522
- """
523
-
524
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#kline-streams
525
-
526
- watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
527
- :param str symbol: unified symbol of the market to fetch OHLCV data for
528
- :param str timeframe: the length of time each candle represents
529
- :param int [since]: timestamp in ms of the earliest candle to fetch
530
- :param int [limit]: the maximum amount of candles to fetch
531
- :param dict [params]: extra parameters specific to the exchange API endpoint
532
- :returns int[][]: A list of candles ordered, open, high, low, close, volume
533
- """
534
- await self.load_markets()
535
- market = self.market(symbol)
536
- symbol = market['symbol']
537
- timeframes = self.safe_value(self.options, 'timeframes', {})
538
- timeframeId = self.safe_string(timeframes, timeframe)
539
- messageHash = 'candles:' + symbol + ':' + timeframe
540
- ohlcv = None
541
- if market['spot']:
542
- channel = 'spot@public.kline.v3.api@' + market['id'] + '@' + timeframeId
543
- ohlcv = await self.watch_spot_public(channel, messageHash, params)
544
- else:
545
- channel = 'sub.kline'
546
- requestParams: dict = {
547
- 'symbol': market['id'],
548
- 'interval': timeframeId,
549
- }
550
- ohlcv = await self.watch_swap_public(channel, messageHash, requestParams, params)
551
- if self.newUpdates:
552
- limit = ohlcv.getLimit(symbol, limit)
553
- return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
554
-
555
- def handle_ohlcv(self, client: Client, message):
556
- #
557
- # spot
558
- #
559
- # {
560
- # "d": {
561
- # "e": "spot@public.kline.v3.api",
562
- # "k": {
563
- # "t": 1678642261,
564
- # "o": 20626.94,
565
- # "c": 20599.69,
566
- # "h": 20626.94,
567
- # "l": 20597.06,
568
- # "v": 27.678686,
569
- # "a": 570332.77,
570
- # "T": 1678642320,
571
- # "i": "Min1"
572
- # }
573
- # },
574
- # "c": "spot@public.kline.v3.api@BTCUSDT@Min1",
575
- # "t": 1678642276459,
576
- # "s": "BTCUSDT"
577
- # }
578
- #
579
- # swap
580
- #
581
- # {
582
- # "channel": "push.kline",
583
- # "data": {
584
- # "a": 325653.3287,
585
- # "c": 38839,
586
- # "h": 38909.5,
587
- # "interval": "Min1",
588
- # "l": 38833,
589
- # "o": 38901.5,
590
- # "q": 83808,
591
- # "rc": 38839,
592
- # "rh": 38909.5,
593
- # "rl": 38833,
594
- # "ro": 38909.5,
595
- # "symbol": "BTC_USDT",
596
- # "t": 1651230660
597
- # },
598
- # "symbol": "BTC_USDT",
599
- # "ts": 1651230713067
600
- # }
601
- #
602
- d = self.safe_value_2(message, 'd', 'data', {})
603
- rawOhlcv = self.safe_value(d, 'k', d)
604
- timeframeId = self.safe_string_2(rawOhlcv, 'i', 'interval')
605
- timeframes = self.safe_value(self.options, 'timeframes', {})
606
- timeframe = self.find_timeframe(timeframeId, timeframes)
607
- marketId = self.safe_string_2(message, 's', 'symbol')
608
- market = self.safe_market(marketId)
609
- symbol = market['symbol']
610
- messageHash = 'candles:' + symbol + ':' + timeframe
611
- parsed = self.parse_ws_ohlcv(rawOhlcv, market)
612
- self.ohlcvs[symbol] = self.safe_value(self.ohlcvs, symbol, {})
613
- stored = self.safe_value(self.ohlcvs[symbol], timeframe)
614
- if stored is None:
615
- limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
616
- stored = ArrayCacheByTimestamp(limit)
617
- self.ohlcvs[symbol][timeframe] = stored
618
- stored.append(parsed)
619
- client.resolve(stored, messageHash)
620
-
621
- def parse_ws_ohlcv(self, ohlcv, market=None) -> list:
622
- #
623
- # spot
624
- #
625
- # {
626
- # "t": 1678642260,
627
- # "o": 20626.94,
628
- # "c": 20599.69,
629
- # "h": 20626.94,
630
- # "l": 20597.06,
631
- # "v": 27.678686,
632
- # "a": 570332.77,
633
- # "T": 1678642320,
634
- # "i": "Min1"
635
- # }
636
- #
637
- # swap
638
- # {
639
- # "symbol": "BTC_USDT",
640
- # "interval": "Min1",
641
- # "t": 1680055080,
642
- # "o": 27301.9,
643
- # "c": 27301.8,
644
- # "h": 27301.9,
645
- # "l": 27301.8,
646
- # "a": 8.19054,
647
- # "q": 3,
648
- # "ro": 27301.8,
649
- # "rc": 27301.8,
650
- # "rh": 27301.8,
651
- # "rl": 27301.8
652
- # }
653
- #
654
- return [
655
- self.safe_timestamp(ohlcv, 't'),
656
- self.safe_number(ohlcv, 'o'),
657
- self.safe_number(ohlcv, 'h'),
658
- self.safe_number(ohlcv, 'l'),
659
- self.safe_number(ohlcv, 'c'),
660
- self.safe_number_2(ohlcv, 'v', 'q'),
661
- ]
662
-
663
- async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
664
- """
665
-
666
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#diff-depth-stream
667
- https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
668
-
669
- watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
670
- :param str symbol: unified symbol of the market to fetch the order book for
671
- :param int [limit]: the maximum amount of order book entries to return
672
- :param dict [params]: extra parameters specific to the exchange API endpoint
673
- :returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
674
- """
675
- await self.load_markets()
676
- market = self.market(symbol)
677
- symbol = market['symbol']
678
- messageHash = 'orderbook:' + symbol
679
- orderbook = None
680
- if market['spot']:
681
- channel = 'spot@public.increase.depth.v3.api@' + market['id']
682
- orderbook = await self.watch_spot_public(channel, messageHash, params)
683
- else:
684
- channel = 'sub.depth'
685
- requestParams: dict = {
686
- 'symbol': market['id'],
687
- }
688
- orderbook = await self.watch_swap_public(channel, messageHash, requestParams, params)
689
- return orderbook.limit()
690
-
691
- def handle_order_book_subscription(self, client: Client, message):
692
- # spot
693
- # {id: 0, code: 0, msg: "spot@public.increase.depth.v3.api@BTCUSDT"}
694
- #
695
- msg = self.safe_string(message, 'msg')
696
- parts = msg.split('@')
697
- marketId = self.safe_string(parts, 2)
698
- symbol = self.safe_symbol(marketId)
699
- self.orderbooks[symbol] = self.order_book({})
700
-
701
- def get_cache_index(self, orderbook, cache):
702
- # return the first index of the cache that can be applied to the orderbook or -1 if not possible
703
- nonce = self.safe_integer(orderbook, 'nonce')
704
- firstDelta = self.safe_value(cache, 0)
705
- firstDeltaNonce = self.safe_integer_2(firstDelta, 'r', 'version')
706
- if nonce < firstDeltaNonce - 1:
707
- return -1
708
- for i in range(0, len(cache)):
709
- delta = cache[i]
710
- deltaNonce = self.safe_integer_2(delta, 'r', 'version')
711
- if deltaNonce >= nonce:
712
- return i
713
- return len(cache)
714
-
715
- def handle_order_book(self, client: Client, message):
716
- #
717
- # spot
718
- # {
719
- # "c": "spot@public.increase.depth.v3.api@BTCUSDT",
720
- # "d": {
721
- # "asks": [{
722
- # "p": "20290.89",
723
- # "v": "0.000000"
724
- # }],
725
- # "e": "spot@public.increase.depth.v3.api",
726
- # "r": "3407459756"
727
- # },
728
- # "s": "BTCUSDT",
729
- # "t": 1661932660144
730
- # }
731
- #
732
- #
733
- #
734
- # swap
735
- # {
736
- # "channel":"push.depth",
737
- # "data":{
738
- # "asks":[
739
- # [
740
- # 39146.5,
741
- # 11264,
742
- # 1
743
- # ]
744
- # ],
745
- # "bids":[
746
- # [
747
- # 39144,
748
- # 35460,
749
- # 1
750
- # ]
751
- # ],
752
- # "end":4895965272,
753
- # "begin":4895965271
754
- # },
755
- # "symbol":"BTC_USDT",
756
- # "ts":1651239652372
757
- # }
758
- #
759
- data = self.safe_value_2(message, 'd', 'data')
760
- marketId = self.safe_string_2(message, 's', 'symbol')
761
- symbol = self.safe_symbol(marketId)
762
- messageHash = 'orderbook:' + symbol
763
- subscription = self.safe_value(client.subscriptions, messageHash)
764
- limit = self.safe_integer(subscription, 'limit')
765
- if subscription is True:
766
- # we set client.subscriptions[messageHash] to 1
767
- # once we have received the first delta and initialized the orderbook
768
- client.subscriptions[messageHash] = 1
769
- self.orderbooks[symbol] = self.counted_order_book({})
770
- storedOrderBook = self.orderbooks[symbol]
771
- nonce = self.safe_integer(storedOrderBook, 'nonce')
772
- if nonce is None:
773
- cacheLength = len(storedOrderBook.cache)
774
- snapshotDelay = self.handle_option('watchOrderBook', 'snapshotDelay', 25)
775
- if cacheLength == snapshotDelay:
776
- self.spawn(self.load_order_book, client, messageHash, symbol, limit, {})
777
- storedOrderBook.cache.append(data)
778
- return
779
- try:
780
- self.handle_delta(storedOrderBook, data)
781
- timestamp = self.safe_integer_2(message, 't', 'ts')
782
- storedOrderBook['timestamp'] = timestamp
783
- storedOrderBook['datetime'] = self.iso8601(timestamp)
784
- except Exception as e:
785
- del client.subscriptions[messageHash]
786
- client.reject(e, messageHash)
787
- client.resolve(storedOrderBook, messageHash)
788
-
789
- def handle_bookside_delta(self, bookside, bidasks):
790
- #
791
- # [{
792
- # "p": "20290.89",
793
- # "v": "0.000000"
794
- # }]
795
- #
796
- for i in range(0, len(bidasks)):
797
- bidask = bidasks[i]
798
- if isinstance(bidask, list):
799
- bookside.storeArray(bidask)
800
- else:
801
- price = self.safe_float(bidask, 'p')
802
- amount = self.safe_float(bidask, 'v')
803
- bookside.store(price, amount)
804
-
805
- def handle_delta(self, orderbook, delta):
806
- existingNonce = self.safe_integer(orderbook, 'nonce')
807
- deltaNonce = self.safe_integer_2(delta, 'r', 'version')
808
- if deltaNonce < existingNonce:
809
- # even when doing < comparison, self happens: https://app.travis-ci.com/github/ccxt/ccxt/builds/269234741#L1809
810
- # so, we just skip old updates
811
- return
812
- orderbook['nonce'] = deltaNonce
813
- asks = self.safe_list(delta, 'asks', [])
814
- bids = self.safe_list(delta, 'bids', [])
815
- asksOrderSide = orderbook['asks']
816
- bidsOrderSide = orderbook['bids']
817
- self.handle_bookside_delta(asksOrderSide, asks)
818
- self.handle_bookside_delta(bidsOrderSide, bids)
819
-
820
- async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
821
- """
822
-
823
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#trade-streams
824
- https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
825
-
826
- get the list of most recent trades for a particular symbol
827
- :param str symbol: unified symbol of the market to fetch trades for
828
- :param int [since]: timestamp in ms of the earliest trade to fetch
829
- :param int [limit]: the maximum amount of trades to fetch
830
- :param dict [params]: extra parameters specific to the exchange API endpoint
831
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
832
- """
833
- await self.load_markets()
834
- market = self.market(symbol)
835
- symbol = market['symbol']
836
- messageHash = 'trades:' + symbol
837
- trades = None
838
- if market['spot']:
839
- channel = 'spot@public.deals.v3.api@' + market['id']
840
- trades = await self.watch_spot_public(channel, messageHash, params)
841
- else:
842
- channel = 'sub.deal'
843
- requestParams: dict = {
844
- 'symbol': market['id'],
845
- }
846
- trades = await self.watch_swap_public(channel, messageHash, requestParams, params)
847
- if self.newUpdates:
848
- limit = trades.getLimit(symbol, limit)
849
- return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
850
-
851
- def handle_trades(self, client: Client, message):
852
- #
853
- # {
854
- # "c": "spot@public.deals.v3.api@BTCUSDT",
855
- # "d": {
856
- # "deals": [{
857
- # "p": "20382.70",
858
- # "v": "0.043800",
859
- # "S": 1,
860
- # "t": 1678593222456,
861
- # },],
862
- # "e": "spot@public.deals.v3.api",
863
- # },
864
- # "s": "BTCUSDT",
865
- # "t": 1678593222460,
866
- # }
867
- #
868
- # swap
869
- # {
870
- # "symbol": "BTC_USDT",
871
- # "data": {
872
- # "p": 27307.3,
873
- # "v": 5,
874
- # "T": 2,
875
- # "O": 3,
876
- # "M": 1,
877
- # "t": 1680055941870
878
- # },
879
- # "channel": "push.deal",
880
- # "ts": 1680055941870
881
- # }
882
- #
883
- marketId = self.safe_string_2(message, 's', 'symbol')
884
- market = self.safe_market(marketId)
885
- symbol = market['symbol']
886
- messageHash = 'trades:' + symbol
887
- stored = self.safe_value(self.trades, symbol)
888
- if stored is None:
889
- limit = self.safe_integer(self.options, 'tradesLimit', 1000)
890
- stored = ArrayCache(limit)
891
- self.trades[symbol] = stored
892
- d = self.safe_value_2(message, 'd', 'data')
893
- trades = self.safe_value(d, 'deals', [d])
894
- for j in range(0, len(trades)):
895
- parsedTrade = None
896
- if market['spot']:
897
- parsedTrade = self.parse_ws_trade(trades[j], market)
898
- else:
899
- parsedTrade = self.parse_trade(trades[j], market)
900
- stored.append(parsedTrade)
901
- client.resolve(stored, messageHash)
902
-
903
- async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
904
- """
905
-
906
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-deals
907
- https://mexcdevelop.github.io/apidocs/contract_v1_en/#private-channels
908
-
909
- watches information on multiple trades made by the user
910
- :param str symbol: unified market symbol of the market trades were made in
911
- :param int [since]: the earliest time in ms to fetch trades for
912
- :param int [limit]: the maximum number of trade structures to retrieve
913
- :param dict [params]: extra parameters specific to the exchange API endpoint
914
- :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
915
- """
916
- await self.load_markets()
917
- messageHash = 'myTrades'
918
- market = None
919
- if symbol is not None:
920
- market = self.market(symbol)
921
- symbol = market['symbol']
922
- messageHash = messageHash + ':' + symbol
923
- type = None
924
- type, params = self.handle_market_type_and_params('watchMyTrades', market, params)
925
- trades = None
926
- if type == 'spot':
927
- channel = 'spot@private.deals.v3.api'
928
- trades = await self.watch_spot_private(channel, messageHash, params)
929
- else:
930
- trades = await self.watch_swap_private(messageHash, params)
931
- if self.newUpdates:
932
- limit = trades.getLimit(symbol, limit)
933
- return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
934
-
935
- def handle_my_trade(self, client: Client, message, subscription=None):
936
- #
937
- # {
938
- # "c": "spot@private.deals.v3.api",
939
- # "d": {
940
- # "p": "22339.99",
941
- # "v": "0.000235",
942
- # "S": 1,
943
- # "T": 1678670940695,
944
- # "t": "9f6a47fb926442e496c5c4c104076ae3",
945
- # "c": '',
946
- # "i": "e2b9835d1b6745f8a10ab74a81a16d50",
947
- # "m": 0,
948
- # "st": 0
949
- # },
950
- # "s": "BTCUSDT",
951
- # "t": 1678670940700
952
- # }
953
- #
954
- messageHash = 'myTrades'
955
- data = self.safe_value_2(message, 'd', 'data')
956
- futuresMarketId = self.safe_string(data, 'symbol')
957
- marketId = self.safe_string(message, 's', futuresMarketId)
958
- market = self.safe_market(marketId)
959
- symbol = market['symbol']
960
- trade = None
961
- if market['spot']:
962
- trade = self.parse_ws_trade(data, market)
963
- else:
964
- trade = self.parse_trade(data, market)
965
- trades = self.myTrades
966
- if trades is None:
967
- limit = self.safe_integer(self.options, 'tradesLimit', 1000)
968
- trades = ArrayCacheBySymbolById(limit)
969
- self.myTrades = trades
970
- trades.append(trade)
971
- client.resolve(trades, messageHash)
972
- symbolSpecificMessageHash = messageHash + ':' + symbol
973
- client.resolve(trades, symbolSpecificMessageHash)
974
-
975
- def parse_ws_trade(self, trade, market=None):
976
- #
977
- # public trade
978
- # {
979
- # "p": "20382.70",
980
- # "v": "0.043800",
981
- # "S": 1,
982
- # "t": 1678593222456,
983
- # }
984
- # private trade
985
- # {
986
- # "S": 1,
987
- # "T": 1661938980268,
988
- # "c": "",
989
- # "i": "c079b0fcb80a46e8b128b281ce4e4f38",
990
- # "m": 1,
991
- # "p": "1.008",
992
- # "st": 0,
993
- # "t": "4079b1522a0b40e7919f609e1ea38d44",
994
- # "v": "5"
995
- # }
996
- #
997
- #
998
- # d: {
999
- # p: '1.0005',
1000
- # v: '5.71',
1001
- # a: '5.712855',
1002
- # S: 1,
1003
- # T: 1714325698237,
1004
- # t: 'edafcd9fdc2f426e82443d114691f724',
1005
- # c: '',
1006
- # i: 'C02__413321238354677760043',
1007
- # m: 0,
1008
- # st: 0,
1009
- # n: '0.005712855',
1010
- # N: 'USDT'
1011
- # }
1012
- timestamp = self.safe_integer(trade, 'T')
1013
- tradeId = self.safe_string(trade, 't')
1014
- if timestamp is None:
1015
- timestamp = self.safe_integer(trade, 't')
1016
- tradeId = None
1017
- priceString = self.safe_string(trade, 'p')
1018
- amountString = self.safe_string(trade, 'v')
1019
- rawSide = self.safe_string(trade, 'S')
1020
- side = 'buy' if (rawSide == '1') else 'sell'
1021
- isMaker = self.safe_integer(trade, 'm')
1022
- feeAmount = self.safe_number(trade, 'n')
1023
- feeCurrencyId = self.safe_string(trade, 'N')
1024
- return self.safe_trade({
1025
- 'info': trade,
1026
- 'id': tradeId,
1027
- 'order': self.safe_string(trade, 'i'),
1028
- 'timestamp': timestamp,
1029
- 'datetime': self.iso8601(timestamp),
1030
- 'symbol': self.safe_symbol(None, market),
1031
- 'type': None,
1032
- 'side': side,
1033
- 'takerOrMaker': 'maker' if (isMaker) else 'taker',
1034
- 'price': priceString,
1035
- 'amount': amountString,
1036
- 'cost': None,
1037
- 'fee': {
1038
- 'cost': feeAmount,
1039
- 'currency': self.safe_currency_code(feeCurrencyId),
1040
- },
1041
- }, market)
1042
-
1043
- async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
1044
- """
1045
-
1046
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-orders
1047
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#margin-account-orders
1048
-
1049
- watches information on multiple orders made by the user
1050
- :param str symbol: unified market symbol of the market orders were made in
1051
- :param int [since]: the earliest time in ms to fetch orders for
1052
- :param int [limit]: the maximum number of order structures to retrieve
1053
- :param dict [params]: extra parameters specific to the exchange API endpoint
1054
- :param str|None params['type']: the type of orders to retrieve, can be 'spot' or 'margin'
1055
- :returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
1056
- """
1057
- await self.load_markets()
1058
- params = self.omit(params, 'type')
1059
- messageHash = 'orders'
1060
- market = None
1061
- if symbol is not None:
1062
- market = self.market(symbol)
1063
- symbol = market['symbol']
1064
- messageHash = messageHash + ':' + symbol
1065
- type = None
1066
- type, params = self.handle_market_type_and_params('watchOrders', market, params)
1067
- orders = None
1068
- if type == 'spot':
1069
- channel = type + '@private.orders.v3.api'
1070
- orders = await self.watch_spot_private(channel, messageHash, params)
1071
- else:
1072
- orders = await self.watch_swap_private(messageHash, params)
1073
- if self.newUpdates:
1074
- limit = orders.getLimit(symbol, limit)
1075
- return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
1076
-
1077
- def handle_order(self, client: Client, message):
1078
- #
1079
- # spot
1080
- # {
1081
- # "c": "spot@private.orders.v3.api",
1082
- # "d": {
1083
- # "A":8.0,
1084
- # "O":1661938138000,
1085
- # "S":1,
1086
- # "V":10,
1087
- # "a":8,
1088
- # "c":"",
1089
- # "i":"e03a5c7441e44ed899466a7140b71391",
1090
- # "m":0,
1091
- # "o":1,
1092
- # "p":0.8,
1093
- # "s":1,
1094
- # "v":10,
1095
- # "ap":0,
1096
- # "cv":0,
1097
- # "ca":0
1098
- # },
1099
- # "s": "MXUSDT",
1100
- # "t": 1661938138193
1101
- # }
1102
- # spot - stop
1103
- # {
1104
- # "c": "spot@private.orders.v3.api",
1105
- # "d": {
1106
- # "N":"USDT",
1107
- # "O":1661938853715,
1108
- # "P":0.9,
1109
- # "S":1,
1110
- # "T":"LE",
1111
- # "i":"f6d82e5f41d745f59fe9d3cafffd80b5",
1112
- # "o":100,
1113
- # "p":1.01,
1114
- # "s":"NEW",
1115
- # "v":6
1116
- # },
1117
- # "s": "MXUSDT",
1118
- # "t": 1661938853727
1119
- # }
1120
- # margin
1121
- # {
1122
- # "c": "margin@private.orders.v3.api",
1123
- # "d":{
1124
- # "O":1661938138000,
1125
- # "p":"0.8",
1126
- # "a":"8",
1127
- # "v":"10",
1128
- # "da":"0",
1129
- # "dv":"0",
1130
- # "A":"8.0",
1131
- # "V":"10",
1132
- # "n": "0",
1133
- # "N": "USDT",
1134
- # "S":1,
1135
- # "o":1,
1136
- # "s":1,
1137
- # "i":"e03a5c7441e44ed899466a7140b71391",
1138
- # },
1139
- # "s": "MXUSDT",
1140
- # "t":1661938138193
1141
- # }
1142
- #
1143
- messageHash = 'orders'
1144
- data = self.safe_value_2(message, 'd', 'data')
1145
- futuresMarketId = self.safe_string(data, 'symbol')
1146
- marketId = self.safe_string(message, 's', futuresMarketId)
1147
- market = self.safe_market(marketId)
1148
- symbol = market['symbol']
1149
- parsed = None
1150
- if market['spot']:
1151
- parsed = self.parse_ws_order(data, market)
1152
- else:
1153
- parsed = self.parse_order(data, market)
1154
- orders = self.orders
1155
- if orders is None:
1156
- limit = self.safe_integer(self.options, 'ordersLimit', 1000)
1157
- orders = ArrayCacheBySymbolById(limit)
1158
- self.orders = orders
1159
- orders.append(parsed)
1160
- client.resolve(orders, messageHash)
1161
- symbolSpecificMessageHash = messageHash + ':' + symbol
1162
- client.resolve(orders, symbolSpecificMessageHash)
1163
-
1164
- def parse_ws_order(self, order, market=None):
1165
- #
1166
- # spot
1167
- # {
1168
- # "A":8.0,
1169
- # "O":1661938138000,
1170
- # "S":1,
1171
- # "V":10,
1172
- # "a":8,
1173
- # "c":"",
1174
- # "i":"e03a5c7441e44ed899466a7140b71391",
1175
- # "m":0,
1176
- # "o":1,
1177
- # "p":0.8,
1178
- # "s":1,
1179
- # "v":10,
1180
- # "ap":0,
1181
- # "cv":0,
1182
- # "ca":0
1183
- # }
1184
- # spot - stop
1185
- # {
1186
- # "N":"USDT",
1187
- # "O":1661938853715,
1188
- # "P":0.9,
1189
- # "S":1,
1190
- # "T":"LE",
1191
- # "i":"f6d82e5f41d745f59fe9d3cafffd80b5",
1192
- # "o":100,
1193
- # "p":1.01,
1194
- # "s":"NEW",
1195
- # "v":6
1196
- # }
1197
- # margin
1198
- # {
1199
- # "O":1661938138000,
1200
- # "p":"0.8",
1201
- # "a":"8",
1202
- # "v":"10",
1203
- # "da":"0",
1204
- # "dv":"0",
1205
- # "A":"8.0",
1206
- # "V":"10",
1207
- # "n": "0",
1208
- # "N": "USDT",
1209
- # "S":1,
1210
- # "o":1,
1211
- # "s":1,
1212
- # "i":"e03a5c7441e44ed899466a7140b71391",
1213
- # }
1214
- #
1215
- timestamp = self.safe_integer(order, 'O')
1216
- side = self.safe_string(order, 'S')
1217
- status = self.safe_string(order, 's')
1218
- type = self.safe_string(order, 'o')
1219
- fee = None
1220
- feeCurrency = self.safe_string(order, 'N')
1221
- if feeCurrency is not None:
1222
- fee = {
1223
- 'currency': feeCurrency,
1224
- 'cost': None,
1225
- }
1226
- return self.safe_order({
1227
- 'id': self.safe_string(order, 'i'),
1228
- 'clientOrderId': self.safe_string(order, 'c'),
1229
- 'timestamp': timestamp,
1230
- 'datetime': self.iso8601(timestamp),
1231
- 'lastTradeTimestamp': None,
1232
- 'status': self.parse_ws_order_status(status, market),
1233
- 'symbol': self.safe_symbol(None, market),
1234
- 'type': self.parse_ws_order_type(type),
1235
- 'timeInForce': self.parse_ws_time_in_force(type),
1236
- 'side': 'buy' if (side == '1') else 'sell',
1237
- 'price': self.safe_string(order, 'p'),
1238
- 'stopPrice': None,
1239
- 'triggerPrice': self.safe_number(order, 'P'),
1240
- 'average': self.safe_string(order, 'ap'),
1241
- 'amount': self.safe_string(order, 'v'),
1242
- 'cost': self.safe_string(order, 'a'),
1243
- 'filled': self.safe_string(order, 'cv'),
1244
- 'remaining': self.safe_string(order, 'V'),
1245
- 'fee': fee,
1246
- 'trades': None,
1247
- 'info': order,
1248
- }, market)
1249
-
1250
- def parse_ws_order_status(self, status, market=None):
1251
- statuses: dict = {
1252
- '1': 'open', # new order
1253
- '2': 'closed', # filled
1254
- '3': 'open', # partially filled
1255
- '4': 'canceled', # canceled
1256
- '5': 'closed', # partially filled then canceled
1257
- 'NEW': 'open',
1258
- 'CANCELED': 'canceled',
1259
- 'EXECUTED': 'closed',
1260
- 'FAILED': 'rejected',
1261
- }
1262
- return self.safe_string(statuses, status, status)
1263
-
1264
- def parse_ws_order_type(self, type):
1265
- types: dict = {
1266
- '1': 'limit', # LIMIT_ORDER
1267
- '2': None, # POST_ONLY
1268
- '3': None, # IMMEDIATE_OR_CANCEL
1269
- '4': None, # FILL_OR_KILL
1270
- '5': 'market', # MARKET_ORDER
1271
- '100': 'limit', # STOP_LIMIT
1272
- }
1273
- return self.safe_string(types, type)
1274
-
1275
- def parse_ws_time_in_force(self, timeInForce):
1276
- timeInForceIds: dict = {
1277
- '1': 'GTC', # LIMIT_ORDER
1278
- '2': 'PO', # POST_ONLY
1279
- '3': 'IOC', # IMMEDIATE_OR_CANCEL
1280
- '4': 'FOK', # FILL_OR_KILL
1281
- '5': 'GTC', # MARKET_ORDER
1282
- '100': 'GTC', # STOP_LIMIT
1283
- }
1284
- return self.safe_string(timeInForceIds, timeInForce)
1285
-
1286
- async def watch_balance(self, params={}) -> Balances:
1287
- """
1288
-
1289
- https://mexcdevelop.github.io/apidocs/spot_v3_en/#spot-account-upadte
1290
-
1291
- watch balance and get the amount of funds available for trading or funds locked in orders
1292
- :param dict [params]: extra parameters specific to the exchange API endpoint
1293
- :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
1294
- """
1295
- await self.load_markets()
1296
- type = None
1297
- type, params = self.handle_market_type_and_params('watchBalance', None, params)
1298
- messageHash = 'balance:' + type
1299
- if type == 'spot':
1300
- channel = 'spot@private.account.v3.api'
1301
- return await self.watch_spot_private(channel, messageHash, params)
1302
- else:
1303
- return await self.watch_swap_private(messageHash, params)
1304
-
1305
- def handle_balance(self, client: Client, message):
1306
- #
1307
- # spot
1308
- # {
1309
- # "c": "spot@private.account.v3.api",
1310
- # "d": {
1311
- # "a": "USDT",
1312
- # "c": 1678185928428,
1313
- # "f": "302.185113007893322435",
1314
- # "fd": "-4.990689704",
1315
- # "l": "4.990689704",
1316
- # "ld": "4.990689704",
1317
- # "o": "ENTRUST_PLACE"
1318
- # },
1319
- # "t": 1678185928435
1320
- # }
1321
- #
1322
- #
1323
- # swap balance
1324
- #
1325
- # {
1326
- # "channel": "push.personal.asset",
1327
- # "data": {
1328
- # "availableBalance": 67.2426683348,
1329
- # "bonus": 0,
1330
- # "currency": "USDT",
1331
- # "frozenBalance": 0,
1332
- # "positionMargin": 1.36945756
1333
- # },
1334
- # "ts": 1680059188190
1335
- # }
1336
- #
1337
- c = self.safe_string(message, 'c')
1338
- type = 'swap' if (c is None) else 'spot'
1339
- messageHash = 'balance:' + type
1340
- data = self.safe_value_2(message, 'd', 'data')
1341
- futuresTimestamp = self.safe_integer(message, 'ts')
1342
- timestamp = self.safe_integer(data, 'c', futuresTimestamp)
1343
- if not (type in self.balance):
1344
- self.balance[type] = {}
1345
- self.balance[type]['info'] = data
1346
- self.balance[type]['timestamp'] = timestamp
1347
- self.balance[type]['datetime'] = self.iso8601(timestamp)
1348
- currencyId = self.safe_string_2(data, 'a', 'currency')
1349
- code = self.safe_currency_code(currencyId)
1350
- account = self.account()
1351
- account['free'] = self.safe_string_2(data, 'f', 'availableBalance')
1352
- account['used'] = self.safe_string_2(data, 'l', 'frozenBalance')
1353
- self.balance[type][code] = account
1354
- self.balance[type] = self.safe_balance(self.balance[type])
1355
- client.resolve(self.balance[type], messageHash)
1356
-
1357
- async def authenticate(self, subscriptionHash, params={}):
1358
- # we only need one listenKey since ccxt shares connections
1359
- listenKey = self.safe_string(self.options, 'listenKey')
1360
- if listenKey is not None:
1361
- return listenKey
1362
- response = await self.spotPrivatePostUserDataStream(params)
1363
- #
1364
- # {
1365
- # "listenKey": "pqia91ma19a5s61cv6a81va65sdf19v8a65a1a5s61cv6a81va65sdf19v8a65a1"
1366
- # }
1367
- #
1368
- listenKey = self.safe_string(response, 'listenKey')
1369
- self.options['listenKey'] = listenKey
1370
- listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 1200000)
1371
- self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, listenKey, params)
1372
- return listenKey
1373
-
1374
- async def keep_alive_listen_key(self, listenKey, params={}):
1375
- if listenKey is None:
1376
- return
1377
- request: dict = {
1378
- 'listenKey': listenKey,
1379
- }
1380
- try:
1381
- await self.spotPrivatePutUserDataStream(self.extend(request, params))
1382
- listenKeyRefreshRate = self.safe_integer(self.options, 'listenKeyRefreshRate', 1200000)
1383
- self.delay(listenKeyRefreshRate, self.keep_alive_listen_key, listenKey, params)
1384
- except Exception as error:
1385
- url = self.urls['api']['ws']['spot'] + '?listenKey=' + listenKey
1386
- client = self.client(url)
1387
- self.options['listenKey'] = None
1388
- client.reject(error)
1389
- del self.clients[url]
1390
-
1391
- def handle_pong(self, client: Client, message):
1392
- client.lastPong = self.milliseconds()
1393
- return message
1394
-
1395
- def handle_subscription_status(self, client: Client, message):
1396
- #
1397
- # {
1398
- # "id": 0,
1399
- # "code": 0,
1400
- # "msg": "spot@public.increase.depth.v3.api@BTCUSDT"
1401
- # }
1402
- # Set the default to an empty string if the message is empty during the test.
1403
- msg = self.safe_string(message, 'msg', '')
1404
- if msg == 'PONG':
1405
- self.handle_pong(client, message)
1406
- elif msg.find('@') > -1:
1407
- parts = msg.split('@')
1408
- channel = self.safe_string(parts, 1)
1409
- methods: dict = {
1410
- 'public.increase.depth.v3.api': self.handle_order_book_subscription,
1411
- }
1412
- method = self.safe_value(methods, channel)
1413
- if method is not None:
1414
- method(client, message)
1415
-
1416
- def handle_message(self, client: Client, message):
1417
- if isinstance(message, str):
1418
- if message == 'Invalid listen key':
1419
- error = AuthenticationError(self.id + ' invalid listen key')
1420
- client.reject(error)
1421
- return
1422
- if 'msg' in message:
1423
- self.handle_subscription_status(client, message)
1424
- return
1425
- c = self.safe_string(message, 'c')
1426
- channel = None
1427
- if c is None:
1428
- channel = self.safe_string(message, 'channel')
1429
- else:
1430
- parts = c.split('@')
1431
- channel = self.safe_string(parts, 1)
1432
- methods: dict = {
1433
- 'public.deals.v3.api': self.handle_trades,
1434
- 'push.deal': self.handle_trades,
1435
- 'public.kline.v3.api': self.handle_ohlcv,
1436
- 'push.kline': self.handle_ohlcv,
1437
- 'public.bookTicker.v3.api': self.handle_ticker,
1438
- 'public.miniTicker.v3.api': self.handle_ticker,
1439
- 'public.miniTickers.v3.api': self.handle_tickers,
1440
- 'push.ticker': self.handle_ticker,
1441
- 'push.tickers': self.handle_tickers,
1442
- 'public.increase.depth.v3.api': self.handle_order_book,
1443
- 'push.depth': self.handle_order_book,
1444
- 'private.orders.v3.api': self.handle_order,
1445
- 'push.personal.order': self.handle_order,
1446
- 'private.account.v3.api': self.handle_balance,
1447
- 'push.personal.asset': self.handle_balance,
1448
- 'private.deals.v3.api': self.handle_my_trade,
1449
- 'push.personal.order.deal': self.handle_my_trade,
1450
- 'pong': self.handle_pong,
1451
- }
1452
- if channel in methods:
1453
- method = methods[channel]
1454
- method(client, message)
1455
-
1456
- def ping(self, client: Client):
1457
- return {'method': 'ping'}