coinex-api 0.0.67__tar.gz → 0.0.70__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.
- {coinex_api-0.0.67 → coinex_api-0.0.70}/PKG-INFO +1 -1
- {coinex_api-0.0.67 → coinex_api-0.0.70}/pyproject.toml +1 -1
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/__init__.py +1 -1
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/__init__.py +1 -1
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/exchange.py +6 -3
- coinex_api-0.0.70/src/coinex/ccxt/async_support/base/ws/client.py +323 -0
- coinex_api-0.0.70/src/coinex/ccxt/async_support/base/ws/future.py +42 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/exchange.py +20 -8
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/pro/__init__.py +1 -127
- coinex_api-0.0.67/src/coinex/ccxt/async_support/base/ws/aiohttp_client.py +0 -147
- coinex_api-0.0.67/src/coinex/ccxt/async_support/base/ws/client.py +0 -214
- coinex_api-0.0.67/src/coinex/ccxt/async_support/base/ws/future.py +0 -69
- {coinex_api-0.0.67 → coinex_api-0.0.70}/.gitignore +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/README.md +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/abstract/coinex.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/throttler.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/ws/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/ws/cache.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/ws/functions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/ws/order_book.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/base/ws/order_book_side.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/async_support/coinex.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/decimal_to_precision.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/errors.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/precise.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/base/types.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/coinex.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/pro/coinex.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/README.md +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/_version.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/curves.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/der.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/ecdsa.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/ellipticcurve.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/keys.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/numbertheory.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/rfc6979.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ecdsa/util.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/abi.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/base.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/codec.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/constants.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/decoding.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/encoding.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/grammar.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/packed.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/registry.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/tools/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/tools/_strategies.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/utils/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/utils/numeric.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/utils/padding.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/abi/utils/string.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/encoding_and_hashing.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/encode_typed_data/helpers.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/messages.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/account/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/hexbytes/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/hexbytes/_utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/hexbytes/main.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/hexbytes/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/abi.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/bls.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/discovery.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/encoding.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/enums.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/ethpm.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/evm.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/networks.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/typing/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/abi.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/address.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/applicators.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/conversions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/currency.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/curried/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/debug.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/decorators.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/encoding.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/functional.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/hexadecimal.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/humanize.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/logging.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/module_loading.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/numeric.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/toolz.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/types.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/typing/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/typing/misc.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/ethereum/utils/units.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/keccak/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/keccak/keccak.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/__pyinstaller/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/ast_utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/common.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammar.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammars/common.lark +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammars/lark.lark +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammars/python.lark +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/grammars/unicode.lark +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/indenter.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/lark.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/lexer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/load_grammar.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parse_tree_builder.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parser_frontends.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/cyk.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/earley.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/earley_common.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/earley_forest.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/grammar_analysis.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/lalr_analysis.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/lalr_parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/parsers/xearley.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/reconstruct.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tools/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tools/nearley.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tools/serialize.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tools/standalone.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tree.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tree_matcher.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/tree_templates.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/lark/visitors.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/base.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/class_registry.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/decorators.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/error_store.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/fields.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/orderedset.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/schema.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/types.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/validate.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow/warnings.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/mypy.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/typing.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_dataclass/union_field.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/_cmsgpack.pyx +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/_packer.pyx +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/_unpacker.pyx +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/buff_converter.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/ext.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/fallback.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/pack.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/pack_template.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/sysdep.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/unpack.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/unpack_define.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/msgpack/unpack_template.h +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/expressions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/grammar.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/nodes.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/parsimonious/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v0/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v0/model.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v0/parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v0/schemas.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v0/shape.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/core_structures.json +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/model.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/parser_transformer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/schemas.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v1/shape.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/model.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/parser_transformer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/schemas.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/abi/v2/shape.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/data_types.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/felt.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/type_parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/ccxt_utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/common.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/constants.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/address.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/selector.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/storage.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/hash/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/models/typed_data.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/_context.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/errors.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/factory.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/utils/iterable.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/utils/schema.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starknet/utils/typed_data.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/crypto/math_utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/crypto/signature.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/starkware/crypto/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/core/intfunc.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/external/gmpy.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/external/importtools.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/external/ntheory.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/sympy/external/pythonmpq.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/_signatures.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/_version.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/compatibility.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/curried/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/curried/exceptions.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/curried/operator.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/dicttoolz.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/functoolz.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/itertoolz.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/recipes.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/toolz/utils.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- {coinex_api-0.0.67 → coinex_api-0.0.70}/src/coinex/ccxt/static_dependencies/typing_inspect/typing_inspect.py +0 -0
@@ -26,7 +26,7 @@ sys.modules['ccxt'] = ccxt_module
|
|
26
26
|
|
27
27
|
# ----------------------------------------------------------------------------
|
28
28
|
|
29
|
-
__version__ = '4.4.
|
29
|
+
__version__ = '4.4.91'
|
30
30
|
|
31
31
|
# ----------------------------------------------------------------------------
|
32
32
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# -----------------------------------------------------------------------------
|
4
4
|
|
5
|
-
__version__ = '4.4.
|
5
|
+
__version__ = '4.4.91'
|
6
6
|
|
7
7
|
# -----------------------------------------------------------------------------
|
8
8
|
|
@@ -34,7 +34,7 @@ from ccxt.base.exchange import Exchange as BaseExchange, ArgumentsRequired
|
|
34
34
|
# -----------------------------------------------------------------------------
|
35
35
|
|
36
36
|
from ccxt.async_support.base.ws.functions import inflate, inflate64, gunzip
|
37
|
-
from ccxt.async_support.base.ws.
|
37
|
+
from ccxt.async_support.base.ws.client import Client
|
38
38
|
from ccxt.async_support.base.ws.future import Future
|
39
39
|
from ccxt.async_support.base.ws.order_book import OrderBook, IndexedOrderBook, CountedOrderBook
|
40
40
|
|
@@ -419,7 +419,7 @@ class Exchange(BaseExchange):
|
|
419
419
|
}, ws_options)
|
420
420
|
# we use aiohttp instead of fastClient now because of this
|
421
421
|
# https://github.com/ccxt/ccxt/pull/25995
|
422
|
-
self.clients[url] =
|
422
|
+
self.clients[url] = Client(url, on_message, on_error, on_close, on_connected, options)
|
423
423
|
# set http/s proxy (socks proxy should be set in other place)
|
424
424
|
httpProxy, httpsProxy, socksProxy = self.check_ws_proxy_settings()
|
425
425
|
if (httpProxy or httpsProxy):
|
@@ -638,6 +638,9 @@ class Exchange(BaseExchange):
|
|
638
638
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}):
|
639
639
|
raise NotSupported(self.id + ' watchTrades() is not supported yet')
|
640
640
|
|
641
|
+
async def un_watch_orders(self, symbol: Str = None, params={}):
|
642
|
+
raise NotSupported(self.id + ' unWatchOrders() is not supported yet')
|
643
|
+
|
641
644
|
async def un_watch_trades(self, symbol: str, params={}):
|
642
645
|
raise NotSupported(self.id + ' unWatchTrades() is not supported yet')
|
643
646
|
|
@@ -0,0 +1,323 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
orjson = None
|
4
|
+
try:
|
5
|
+
import orjson as orjson
|
6
|
+
except ImportError:
|
7
|
+
pass
|
8
|
+
|
9
|
+
import json
|
10
|
+
|
11
|
+
from asyncio import sleep, ensure_future, wait_for, TimeoutError, BaseEventLoop, Future as asyncioFuture
|
12
|
+
from .functions import milliseconds, iso8601, deep_extend, is_json_encoded_object
|
13
|
+
from ccxt import NetworkError, RequestTimeout
|
14
|
+
from ccxt.async_support.base.ws.future import Future
|
15
|
+
from ccxt.async_support.base.ws.functions import gunzip, inflate
|
16
|
+
from typing import Dict
|
17
|
+
|
18
|
+
from aiohttp import WSMsgType
|
19
|
+
|
20
|
+
|
21
|
+
class Client(object):
|
22
|
+
|
23
|
+
url = None
|
24
|
+
ws = None
|
25
|
+
futures: Dict[str, Future] = {}
|
26
|
+
options = {} # ws-specific options
|
27
|
+
subscriptions = {}
|
28
|
+
rejections = {}
|
29
|
+
on_message_callback = None
|
30
|
+
on_error_callback = None
|
31
|
+
on_close_callback = None
|
32
|
+
on_connected_callback = None
|
33
|
+
connectionStarted = None
|
34
|
+
connectionEstablished = None
|
35
|
+
isConnected = False
|
36
|
+
connectionTimeout = 10000 # ms, false to disable
|
37
|
+
connection = None
|
38
|
+
error = None # low-level networking exception, if any
|
39
|
+
connected = None # connection-related Future
|
40
|
+
keepAlive = 5000
|
41
|
+
heartbeat = True
|
42
|
+
maxPingPongMisses = 2.0 # how many missed pongs to raise a timeout
|
43
|
+
lastPong = None
|
44
|
+
ping = None # ping-function if defined
|
45
|
+
proxy = None
|
46
|
+
verbose = False # verbose output
|
47
|
+
gunzip = False
|
48
|
+
inflate = False
|
49
|
+
throttle = None
|
50
|
+
connecting = False
|
51
|
+
asyncio_loop: BaseEventLoop = None
|
52
|
+
ping_looper = None
|
53
|
+
|
54
|
+
def __init__(self, url, on_message_callback, on_error_callback, on_close_callback, on_connected_callback, config={}):
|
55
|
+
defaults = {
|
56
|
+
'url': url,
|
57
|
+
'futures': {},
|
58
|
+
'subscriptions': {},
|
59
|
+
'rejections': {},
|
60
|
+
'on_message_callback': on_message_callback,
|
61
|
+
'on_error_callback': on_error_callback,
|
62
|
+
'on_close_callback': on_close_callback,
|
63
|
+
'on_connected_callback': on_connected_callback,
|
64
|
+
}
|
65
|
+
settings = {}
|
66
|
+
settings.update(defaults)
|
67
|
+
settings.update(config)
|
68
|
+
for key in settings:
|
69
|
+
if hasattr(self, key) and isinstance(getattr(self, key), dict):
|
70
|
+
setattr(self, key, deep_extend(getattr(self, key), settings[key]))
|
71
|
+
else:
|
72
|
+
setattr(self, key, settings[key])
|
73
|
+
# connection-related Future
|
74
|
+
self.connected = Future()
|
75
|
+
|
76
|
+
def future(self, message_hash):
|
77
|
+
if message_hash not in self.futures or self.futures[message_hash].cancelled():
|
78
|
+
self.futures[message_hash] = Future()
|
79
|
+
future = self.futures[message_hash]
|
80
|
+
if message_hash in self.rejections:
|
81
|
+
future.reject(self.rejections[message_hash])
|
82
|
+
del self.rejections[message_hash]
|
83
|
+
return future
|
84
|
+
|
85
|
+
def resolve(self, result, message_hash):
|
86
|
+
if self.verbose and message_hash is None:
|
87
|
+
self.log(iso8601(milliseconds()), 'resolve received None messageHash')
|
88
|
+
if message_hash in self.futures:
|
89
|
+
future = self.futures[message_hash]
|
90
|
+
future.resolve(result)
|
91
|
+
del self.futures[message_hash]
|
92
|
+
return result
|
93
|
+
|
94
|
+
def reject(self, result, message_hash=None):
|
95
|
+
if message_hash is not None:
|
96
|
+
if message_hash in self.futures:
|
97
|
+
future = self.futures[message_hash]
|
98
|
+
future.reject(result)
|
99
|
+
del self.futures[message_hash]
|
100
|
+
else:
|
101
|
+
self.rejections[message_hash] = result
|
102
|
+
else:
|
103
|
+
message_hashes = list(self.futures.keys())
|
104
|
+
for message_hash in message_hashes:
|
105
|
+
self.reject(result, message_hash)
|
106
|
+
return result
|
107
|
+
|
108
|
+
def receive_loop(self):
|
109
|
+
if self.verbose:
|
110
|
+
self.log(iso8601(milliseconds()), 'receive loop')
|
111
|
+
if not self.closed():
|
112
|
+
# let's drain the aiohttp buffer to avoid latency
|
113
|
+
if len(self.buffer) > 1:
|
114
|
+
size_delta = 0
|
115
|
+
while len(self.buffer) > 1:
|
116
|
+
message, size = self.buffer.popleft()
|
117
|
+
size_delta += size
|
118
|
+
self.handle_message(message)
|
119
|
+
# we must update the size of the last message inside WebSocketDataQueue
|
120
|
+
# self.receive() calls WebSocketDataQueue.read() that calls WebSocketDataQueue._read_from_buffer()
|
121
|
+
# which updates the size of the buffer, the _size will overflow and pause the transport
|
122
|
+
# make sure to set the enviroment variable AIOHTTP_NO_EXTENSIONS=Y to check
|
123
|
+
# print(self.connection._conn.protocol._payload._size)
|
124
|
+
self.buffer[0] = (self.buffer[0][0], self.buffer[0][1] + size_delta)
|
125
|
+
|
126
|
+
task = self.asyncio_loop.create_task(self.receive())
|
127
|
+
|
128
|
+
def after_interrupt(resolved: asyncioFuture):
|
129
|
+
exception = resolved.exception()
|
130
|
+
if exception is None:
|
131
|
+
self.handle_message(resolved.result())
|
132
|
+
self.asyncio_loop.call_soon(self.receive_loop)
|
133
|
+
else:
|
134
|
+
error = NetworkError(str(exception))
|
135
|
+
if self.verbose:
|
136
|
+
self.log(iso8601(milliseconds()), 'receive_loop', 'Exception', error)
|
137
|
+
self.reset(error)
|
138
|
+
|
139
|
+
task.add_done_callback(after_interrupt)
|
140
|
+
|
141
|
+
async def open(self, session, backoff_delay=0):
|
142
|
+
# exponential backoff for consequent connections if necessary
|
143
|
+
if backoff_delay:
|
144
|
+
await sleep(backoff_delay)
|
145
|
+
if self.verbose:
|
146
|
+
self.log(iso8601(milliseconds()), 'connecting to', self.url, 'with timeout', self.connectionTimeout, 'ms')
|
147
|
+
self.connectionStarted = milliseconds()
|
148
|
+
try:
|
149
|
+
coroutine = self.create_connection(session)
|
150
|
+
self.connection = await wait_for(coroutine, timeout=int(self.connectionTimeout / 1000))
|
151
|
+
self.connecting = False
|
152
|
+
self.connectionEstablished = milliseconds()
|
153
|
+
self.isConnected = True
|
154
|
+
if self.verbose:
|
155
|
+
self.log(iso8601(milliseconds()), 'connected')
|
156
|
+
self.connected.resolve(self.url)
|
157
|
+
self.on_connected_callback(self)
|
158
|
+
# run both loops forever
|
159
|
+
self.ping_looper = ensure_future(self.ping_loop(), loop=self.asyncio_loop)
|
160
|
+
self.asyncio_loop.call_soon(self.receive_loop)
|
161
|
+
except TimeoutError:
|
162
|
+
# connection timeout
|
163
|
+
error = RequestTimeout('Connection timeout')
|
164
|
+
if self.verbose:
|
165
|
+
self.log(iso8601(milliseconds()), 'RequestTimeout', error)
|
166
|
+
self.on_error(error)
|
167
|
+
except Exception as e:
|
168
|
+
# connection failed or rejected (ConnectionRefusedError, ClientConnectorError)
|
169
|
+
error = NetworkError(e)
|
170
|
+
if self.verbose:
|
171
|
+
self.log(iso8601(milliseconds()), 'NetworkError', error)
|
172
|
+
self.on_error(error)
|
173
|
+
|
174
|
+
@property
|
175
|
+
def buffer(self):
|
176
|
+
# looks like they exposed it in C
|
177
|
+
# this means we can bypass it
|
178
|
+
# https://github.com/aio-libs/aiohttp/blob/master/aiohttp/_websocket/reader_c.pxd#L53C24-L53C31
|
179
|
+
return self.connection._conn.protocol._payload._buffer
|
180
|
+
|
181
|
+
def connect(self, session, backoff_delay=0):
|
182
|
+
if not self.connection and not self.connecting:
|
183
|
+
self.connecting = True
|
184
|
+
ensure_future(self.open(session, backoff_delay), loop=self.asyncio_loop)
|
185
|
+
return self.connected
|
186
|
+
|
187
|
+
def on_error(self, error):
|
188
|
+
if self.verbose:
|
189
|
+
self.log(iso8601(milliseconds()), 'on_error', error)
|
190
|
+
self.error = error
|
191
|
+
self.reject(error)
|
192
|
+
self.on_error_callback(self, error)
|
193
|
+
if not self.closed():
|
194
|
+
ensure_future(self.close(1006), loop=self.asyncio_loop)
|
195
|
+
|
196
|
+
def on_close(self, code):
|
197
|
+
if self.verbose:
|
198
|
+
self.log(iso8601(milliseconds()), 'on_close', code)
|
199
|
+
if not self.error:
|
200
|
+
self.reject(NetworkError('Connection closed by remote server, closing code ' + str(code)))
|
201
|
+
self.on_close_callback(self, code)
|
202
|
+
ensure_future(self.aiohttp_close(), loop=self.asyncio_loop)
|
203
|
+
|
204
|
+
def log(self, *args):
|
205
|
+
print(*args)
|
206
|
+
|
207
|
+
def closed(self):
|
208
|
+
return (self.connection is None) or self.connection.closed
|
209
|
+
|
210
|
+
def receive(self):
|
211
|
+
return self.connection.receive()
|
212
|
+
|
213
|
+
# helper method for binary and text messages
|
214
|
+
def handle_text_or_binary_message(self, data):
|
215
|
+
if self.verbose:
|
216
|
+
self.log(iso8601(milliseconds()), 'message', data)
|
217
|
+
if isinstance(data, bytes):
|
218
|
+
data = data.decode()
|
219
|
+
# decoded = json.loads(data) if is_json_encoded_object(data) else data
|
220
|
+
decode = None
|
221
|
+
if is_json_encoded_object(data):
|
222
|
+
if orjson is None:
|
223
|
+
decode = json.loads(data)
|
224
|
+
else:
|
225
|
+
decode = orjson.loads(data)
|
226
|
+
else:
|
227
|
+
decode = data
|
228
|
+
self.on_message_callback(self, decode)
|
229
|
+
|
230
|
+
def handle_message(self, message):
|
231
|
+
# self.log(iso8601(milliseconds()), message)
|
232
|
+
if message.type == WSMsgType.TEXT:
|
233
|
+
self.handle_text_or_binary_message(message.data)
|
234
|
+
elif message.type == WSMsgType.BINARY:
|
235
|
+
data = message.data
|
236
|
+
if self.gunzip:
|
237
|
+
data = gunzip(data)
|
238
|
+
elif self.inflate:
|
239
|
+
data = inflate(data)
|
240
|
+
self.handle_text_or_binary_message(data)
|
241
|
+
# autoping is responsible for automatically replying with pong
|
242
|
+
# to a ping incoming from a server, we have to disable autoping
|
243
|
+
# with aiohttp's websockets and respond with pong manually
|
244
|
+
# otherwise aiohttp's websockets client won't trigger WSMsgType.PONG
|
245
|
+
elif message.type == WSMsgType.PING:
|
246
|
+
if self.verbose:
|
247
|
+
self.log(iso8601(milliseconds()), 'ping', message)
|
248
|
+
ensure_future(self.connection.pong(message.data), loop=self.asyncio_loop)
|
249
|
+
elif message.type == WSMsgType.PONG:
|
250
|
+
self.lastPong = milliseconds()
|
251
|
+
if self.verbose:
|
252
|
+
self.log(iso8601(milliseconds()), 'pong', message)
|
253
|
+
pass
|
254
|
+
elif message.type == WSMsgType.CLOSE:
|
255
|
+
if self.verbose:
|
256
|
+
self.log(iso8601(milliseconds()), 'close', self.closed(), message)
|
257
|
+
self.on_close(message.data)
|
258
|
+
elif message.type == WSMsgType.ERROR:
|
259
|
+
if self.verbose:
|
260
|
+
self.log(iso8601(milliseconds()), 'error', message)
|
261
|
+
error = NetworkError(str(message))
|
262
|
+
self.on_error(error)
|
263
|
+
|
264
|
+
def create_connection(self, session):
|
265
|
+
# autoping is responsible for automatically replying with pong
|
266
|
+
# to a ping incoming from a server, we have to disable autoping
|
267
|
+
# with aiohttp's websockets and respond with pong manually
|
268
|
+
# otherwise aiohttp's websockets client won't trigger WSMsgType.PONG
|
269
|
+
# call aenter here to simulate async with otherwise we get the error "await not called with future"
|
270
|
+
# if connecting to a non-existent endpoint
|
271
|
+
if (self.proxy):
|
272
|
+
return session.ws_connect(self.url, autoping=False, autoclose=False, headers=self.options.get('headers'), proxy=self.proxy, max_msg_size=10485760).__aenter__()
|
273
|
+
return session.ws_connect(self.url, autoping=False, autoclose=False, headers=self.options.get('headers'), max_msg_size=10485760).__aenter__()
|
274
|
+
|
275
|
+
async def send(self, message):
|
276
|
+
if self.verbose:
|
277
|
+
self.log(iso8601(milliseconds()), 'sending', message)
|
278
|
+
send_msg = None
|
279
|
+
if isinstance(message, str):
|
280
|
+
send_msg = message
|
281
|
+
else:
|
282
|
+
if orjson is None:
|
283
|
+
send_msg = json.dumps(message, separators=(',', ':'))
|
284
|
+
else:
|
285
|
+
send_msg = orjson.dumps(message).decode('utf-8')
|
286
|
+
return await self.connection.send_str(send_msg)
|
287
|
+
|
288
|
+
async def close(self, code=1000):
|
289
|
+
if self.verbose:
|
290
|
+
self.log(iso8601(milliseconds()), 'closing', code)
|
291
|
+
for future in self.futures.values():
|
292
|
+
future.cancel()
|
293
|
+
await self.aiohttp_close()
|
294
|
+
|
295
|
+
async def aiohttp_close(self):
|
296
|
+
if not self.closed():
|
297
|
+
await self.connection.close()
|
298
|
+
# these will end automatically once self.closed() = True
|
299
|
+
# so we don't need to cancel them
|
300
|
+
if self.ping_looper:
|
301
|
+
self.ping_looper.cancel()
|
302
|
+
|
303
|
+
async def ping_loop(self):
|
304
|
+
if self.verbose:
|
305
|
+
self.log(iso8601(milliseconds()), 'ping loop')
|
306
|
+
while self.keepAlive and not self.closed():
|
307
|
+
now = milliseconds()
|
308
|
+
self.lastPong = now if self.lastPong is None else self.lastPong
|
309
|
+
if (self.lastPong + self.keepAlive * self.maxPingPongMisses) < now:
|
310
|
+
self.on_error(RequestTimeout('Connection to ' + self.url + ' timed out due to a ping-pong keepalive missing on time'))
|
311
|
+
# the following ping-clause is not necessary with aiohttp's built-in ws
|
312
|
+
# since it has a heartbeat option (see create_connection above)
|
313
|
+
# however some exchanges require a text-type ping message
|
314
|
+
# therefore we need this clause anyway
|
315
|
+
else:
|
316
|
+
if self.ping:
|
317
|
+
try:
|
318
|
+
await self.send(self.ping(self))
|
319
|
+
except Exception as e:
|
320
|
+
self.on_error(e)
|
321
|
+
else:
|
322
|
+
await self.connection.ping()
|
323
|
+
await sleep(self.keepAlive / 1000)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import asyncio
|
2
|
+
|
3
|
+
|
4
|
+
class Future(asyncio.Future):
|
5
|
+
|
6
|
+
def resolve(self, result=None):
|
7
|
+
if not self.done():
|
8
|
+
self.set_result(result)
|
9
|
+
|
10
|
+
def reject(self, error=None):
|
11
|
+
if not self.done():
|
12
|
+
self.set_exception(error)
|
13
|
+
|
14
|
+
@classmethod
|
15
|
+
def race(cls, futures):
|
16
|
+
future = Future()
|
17
|
+
coro = asyncio.wait(futures, return_when=asyncio.FIRST_COMPLETED)
|
18
|
+
task = asyncio.create_task(coro)
|
19
|
+
|
20
|
+
def callback(done):
|
21
|
+
complete, _ = done.result()
|
22
|
+
# check for exceptions
|
23
|
+
exceptions = []
|
24
|
+
cancelled = False
|
25
|
+
for f in complete:
|
26
|
+
if f.cancelled():
|
27
|
+
cancelled = True
|
28
|
+
else:
|
29
|
+
err = f.exception()
|
30
|
+
if err:
|
31
|
+
exceptions.append(err)
|
32
|
+
# if any exceptions return with first exception
|
33
|
+
if len(exceptions) > 0:
|
34
|
+
future.set_exception(exceptions[0])
|
35
|
+
# else return first result
|
36
|
+
elif cancelled:
|
37
|
+
future.cancel()
|
38
|
+
else:
|
39
|
+
first_result = list(complete)[0].result()
|
40
|
+
future.set_result(first_result)
|
41
|
+
task.add_done_callback(callback)
|
42
|
+
return future
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
|
7
|
-
__version__ = '4.4.
|
7
|
+
__version__ = '4.4.91'
|
8
8
|
|
9
9
|
# -----------------------------------------------------------------------------
|
10
10
|
|
@@ -906,6 +906,10 @@ class Exchange(object):
|
|
906
906
|
def keysort(dictionary):
|
907
907
|
return collections.OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))
|
908
908
|
|
909
|
+
@staticmethod
|
910
|
+
def sort(array):
|
911
|
+
return sorted(array)
|
912
|
+
|
909
913
|
@staticmethod
|
910
914
|
def extend(*args):
|
911
915
|
if args is not None:
|
@@ -956,6 +960,11 @@ class Exchange(object):
|
|
956
960
|
def groupBy(array, key):
|
957
961
|
return Exchange.group_by(array, key)
|
958
962
|
|
963
|
+
|
964
|
+
@staticmethod
|
965
|
+
def index_by_safe(array, key):
|
966
|
+
return Exchange.index_by(array, key) # wrapper for go
|
967
|
+
|
959
968
|
@staticmethod
|
960
969
|
def index_by(array, key):
|
961
970
|
result = {}
|
@@ -1037,7 +1046,7 @@ class Exchange(object):
|
|
1037
1046
|
return _urlencode.urlencode(result, quote_via=_urlencode.quote)
|
1038
1047
|
|
1039
1048
|
@staticmethod
|
1040
|
-
def rawencode(params={}):
|
1049
|
+
def rawencode(params={}, sort=False):
|
1041
1050
|
return _urlencode.unquote(Exchange.urlencode(params))
|
1042
1051
|
|
1043
1052
|
@staticmethod
|
@@ -2571,6 +2580,9 @@ class Exchange(object):
|
|
2571
2580
|
def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}):
|
2572
2581
|
raise NotSupported(self.id + ' watchTrades() is not supported yet')
|
2573
2582
|
|
2583
|
+
def un_watch_orders(self, symbol: Str = None, params={}):
|
2584
|
+
raise NotSupported(self.id + ' unWatchOrders() is not supported yet')
|
2585
|
+
|
2574
2586
|
def un_watch_trades(self, symbol: str, params={}):
|
2575
2587
|
raise NotSupported(self.id + ' unWatchTrades() is not supported yet')
|
2576
2588
|
|
@@ -3187,7 +3199,7 @@ class Exchange(object):
|
|
3187
3199
|
|
3188
3200
|
def set_markets(self, markets, currencies=None):
|
3189
3201
|
values = []
|
3190
|
-
self.markets_by_id =
|
3202
|
+
self.markets_by_id = self.create_safe_dictionary()
|
3191
3203
|
# handle marketId conflicts
|
3192
3204
|
# we insert spot markets first
|
3193
3205
|
marketValues = self.sort_by(self.to_array(markets), 'spot', True, True)
|
@@ -3262,7 +3274,7 @@ class Exchange(object):
|
|
3262
3274
|
resultingCurrencies.append(highestPrecisionCurrency)
|
3263
3275
|
sortedCurrencies = self.sort_by(resultingCurrencies, 'code')
|
3264
3276
|
self.currencies = self.deep_extend(self.currencies, self.index_by(sortedCurrencies, 'code'))
|
3265
|
-
self.currencies_by_id = self.
|
3277
|
+
self.currencies_by_id = self.index_by_safe(self.currencies, 'id')
|
3266
3278
|
currenciesSortedByCode = self.keysort(self.currencies)
|
3267
3279
|
self.codes = list(currenciesSortedByCode.keys())
|
3268
3280
|
return self.markets
|
@@ -6885,7 +6897,7 @@ class Exchange(object):
|
|
6885
6897
|
symbolAndTimeFrame = symbolsAndTimeFrames[i]
|
6886
6898
|
symbol = self.safe_string(symbolAndTimeFrame, 0)
|
6887
6899
|
timeframe = self.safe_string(symbolAndTimeFrame, 1)
|
6888
|
-
if symbol in self.ohlcvs:
|
6900
|
+
if (self.ohlcvs is not None) and (symbol in self.ohlcvs):
|
6889
6901
|
if timeframe in self.ohlcvs[symbol]:
|
6890
6902
|
del self.ohlcvs[symbol][timeframe]
|
6891
6903
|
elif symbolsLength > 0:
|
@@ -6901,7 +6913,7 @@ class Exchange(object):
|
|
6901
6913
|
if symbol in self.tickers:
|
6902
6914
|
del self.tickers[symbol]
|
6903
6915
|
else:
|
6904
|
-
if topic == 'myTrades':
|
6916
|
+
if topic == 'myTrades' and (self.myTrades is not None):
|
6905
6917
|
# don't reset self.myTrades directly here
|
6906
6918
|
# because in c# we need to use a different object(thread-safe dict)
|
6907
6919
|
keys = list(self.myTrades.keys())
|
@@ -6909,13 +6921,13 @@ class Exchange(object):
|
|
6909
6921
|
key = keys[i]
|
6910
6922
|
if key in self.myTrades:
|
6911
6923
|
del self.myTrades[key]
|
6912
|
-
elif topic == 'orders':
|
6924
|
+
elif topic == 'orders' and (self.orders is not None):
|
6913
6925
|
orderSymbols = list(self.orders.keys())
|
6914
6926
|
for i in range(0, len(orderSymbols)):
|
6915
6927
|
orderSymbol = orderSymbols[i]
|
6916
6928
|
if orderSymbol in self.orders:
|
6917
6929
|
del self.orders[orderSymbol]
|
6918
|
-
elif topic == 'ticker':
|
6930
|
+
elif topic == 'ticker' and (self.tickers is not None):
|
6919
6931
|
tickerSymbols = list(self.tickers.keys())
|
6920
6932
|
for i in range(0, len(tickerSymbols)):
|
6921
6933
|
tickerSymbol = tickerSymbols[i]
|
@@ -8,7 +8,7 @@ sys.modules['ccxt'] = ccxt_module
|
|
8
8
|
|
9
9
|
# ----------------------------------------------------------------------------
|
10
10
|
|
11
|
-
__version__ = '4.4.
|
11
|
+
__version__ = '4.4.91'
|
12
12
|
|
13
13
|
# ----------------------------------------------------------------------------
|
14
14
|
|
@@ -60,132 +60,6 @@ from ccxt.base.errors import UnsubscribeError # noqa: F4
|
|
60
60
|
from ccxt.base.errors import error_hierarchy # noqa: F401
|
61
61
|
# DO_NOT_REMOVE__ERROR_IMPORTS_END
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
63
|
from ccxt.pro.coinex import coinex # noqa: F401
|
190
64
|
|
191
65
|
exchanges = [ 'coinex',]
|