ccxt 4.2.76__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +25 -0
- ccxt/abstract/kucoinfutures.py +35 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3513 -1511
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3105 -881
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +239 -50
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +201 -67
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +403 -150
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2326 -1255
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1455 -288
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +467 -158
- ccxt/async_support/deribit.py +558 -324
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1473 -464
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1634 -269
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +1050 -355
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1777 -455
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1155 -295
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1729 -482
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3513 -1511
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3105 -881
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +239 -50
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +200 -67
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +403 -150
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2326 -1255
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1455 -288
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +467 -158
- ccxt/deribit.py +558 -324
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1473 -464
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1633 -269
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +1050 -355
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1777 -455
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +63 -15
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +204 -82
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -661
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +168 -32
- ccxt/pro/exmo.py +253 -21
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +93 -34
- ccxt/pro/poloniex.py +129 -50
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +93 -86
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +486 -70
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +465 -407
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +465 -409
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1155 -295
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.76.dist-info/METADATA +0 -626
- ccxt-4.2.76.dist-info/RECORD +0 -534
- {ccxt-4.2.76.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/kucoin.py
CHANGED
@@ -8,6 +8,7 @@ from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById,
|
|
8
8
|
from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
|
9
9
|
from ccxt.async_support.base.ws.client import Client
|
10
10
|
from typing import List
|
11
|
+
from typing import Any
|
11
12
|
from ccxt.base.errors import ExchangeError
|
12
13
|
from ccxt.base.errors import ArgumentsRequired
|
13
14
|
|
@@ -25,6 +26,7 @@ class kucoin(ccxt.async_support.kucoin):
|
|
25
26
|
'cancelOrderWs': False,
|
26
27
|
'cancelOrdersWs': False,
|
27
28
|
'cancelAllOrdersWs': False,
|
29
|
+
'watchBidsAsks': True,
|
28
30
|
'watchOrderBook': True,
|
29
31
|
'watchOrders': True,
|
30
32
|
'watchMyTrades': True,
|
@@ -46,6 +48,9 @@ class kucoin(ccxt.async_support.kucoin):
|
|
46
48
|
'snapshotMaxRetries': 3,
|
47
49
|
'method': '/market/level2', # '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50'
|
48
50
|
},
|
51
|
+
'watchMyTrades': {
|
52
|
+
'method': '/spotMarket/tradeOrders', # or '/spot/tradeFills'
|
53
|
+
},
|
49
54
|
},
|
50
55
|
'streaming': {
|
51
56
|
# kucoin does not support built-in ws protocol-level ping-pong
|
@@ -121,7 +126,7 @@ class kucoin(ccxt.async_support.kucoin):
|
|
121
126
|
|
122
127
|
async def subscribe(self, url, messageHash, subscriptionHash, params={}, subscription=None):
|
123
128
|
requestId = str(self.request_id())
|
124
|
-
request = {
|
129
|
+
request: dict = {
|
125
130
|
'id': requestId,
|
126
131
|
'type': 'subscribe',
|
127
132
|
'topic': subscriptionHash,
|
@@ -135,7 +140,7 @@ class kucoin(ccxt.async_support.kucoin):
|
|
135
140
|
|
136
141
|
async def subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription=None):
|
137
142
|
requestId = str(self.request_id())
|
138
|
-
request = {
|
143
|
+
request: dict = {
|
139
144
|
'id': requestId,
|
140
145
|
'type': 'subscribe',
|
141
146
|
'topic': topic,
|
@@ -149,9 +154,30 @@ class kucoin(ccxt.async_support.kucoin):
|
|
149
154
|
client.subscriptions[requestId] = subscriptionHash
|
150
155
|
return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
|
151
156
|
|
157
|
+
async def un_subscribe_multiple(self, url, messageHashes, topic, subscriptionHashes, params={}, subscription: dict = None):
|
158
|
+
requestId = str(self.request_id())
|
159
|
+
request: dict = {
|
160
|
+
'id': requestId,
|
161
|
+
'type': 'unsubscribe',
|
162
|
+
'topic': topic,
|
163
|
+
'response': True,
|
164
|
+
}
|
165
|
+
message = self.extend(request, params)
|
166
|
+
if subscription is not None:
|
167
|
+
subscription[requestId] = requestId
|
168
|
+
client = self.client(url)
|
169
|
+
for i in range(0, len(subscriptionHashes)):
|
170
|
+
subscriptionHash = subscriptionHashes[i]
|
171
|
+
if not (subscriptionHash in client.subscriptions):
|
172
|
+
client.subscriptions[requestId] = subscriptionHash
|
173
|
+
return await self.watch_multiple(url, messageHashes, message, subscriptionHashes, subscription)
|
174
|
+
|
152
175
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
153
176
|
"""
|
154
177
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
178
|
+
|
179
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/market-snapshot
|
180
|
+
|
155
181
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
156
182
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
157
183
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -167,21 +193,43 @@ class kucoin(ccxt.async_support.kucoin):
|
|
167
193
|
|
168
194
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
169
195
|
"""
|
196
|
+
|
197
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/ticker
|
198
|
+
|
170
199
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
171
200
|
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
172
201
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
202
|
+
:param str [params.method]: either '/market/snapshot' or '/market/ticker' default is '/market/ticker'
|
173
203
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
174
204
|
"""
|
175
205
|
await self.load_markets()
|
176
206
|
symbols = self.market_symbols(symbols)
|
177
207
|
messageHash = 'tickers'
|
208
|
+
method = None
|
209
|
+
method, params = self.handle_option_and_params(params, 'watchTickers', 'method', '/market/ticker')
|
210
|
+
messageHashes = []
|
211
|
+
topics = []
|
178
212
|
if symbols is not None:
|
179
|
-
|
213
|
+
for i in range(0, len(symbols)):
|
214
|
+
symbol = symbols[i]
|
215
|
+
messageHashes.append('ticker:' + symbol)
|
216
|
+
market = self.market(symbol)
|
217
|
+
topics.append(method + ':' + market['id'])
|
180
218
|
url = await self.negotiate(False)
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
219
|
+
tickers = None
|
220
|
+
if symbols is None:
|
221
|
+
allTopic = method + ':all'
|
222
|
+
tickers = await self.subscribe(url, messageHash, allTopic, params)
|
223
|
+
if self.newUpdates:
|
224
|
+
return tickers
|
225
|
+
else:
|
226
|
+
marketIds = self.market_ids(symbols)
|
227
|
+
symbolsTopic = method + ':' + ','.join(marketIds)
|
228
|
+
tickers = await self.subscribe_multiple(url, messageHashes, symbolsTopic, topics, params)
|
229
|
+
if self.newUpdates:
|
230
|
+
newDict: dict = {}
|
231
|
+
newDict[tickers['symbol']] = tickers
|
232
|
+
return newDict
|
185
233
|
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
186
234
|
|
187
235
|
def handle_ticker(self, client: Client, message):
|
@@ -258,24 +306,99 @@ class kucoin(ccxt.async_support.kucoin):
|
|
258
306
|
messageHash = 'ticker:' + symbol
|
259
307
|
client.resolve(ticker, messageHash)
|
260
308
|
# watchTickers
|
261
|
-
allTickers = {}
|
309
|
+
allTickers: dict = {}
|
262
310
|
allTickers[symbol] = ticker
|
263
311
|
client.resolve(allTickers, 'tickers')
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
312
|
+
|
313
|
+
async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
|
314
|
+
"""
|
315
|
+
|
316
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
|
317
|
+
|
318
|
+
watches best bid & ask for symbols
|
319
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
320
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
321
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
322
|
+
"""
|
323
|
+
ticker = await self.watch_multi_helper('watchBidsAsks', '/spotMarket/level1:', symbols, params)
|
324
|
+
if self.newUpdates:
|
325
|
+
tickers: dict = {}
|
326
|
+
tickers[ticker['symbol']] = ticker
|
327
|
+
return tickers
|
328
|
+
return self.filter_by_array(self.bidsasks, 'symbol', symbols)
|
329
|
+
|
330
|
+
async def watch_multi_helper(self, methodName, channelName: str, symbols: Strings = None, params={}):
|
331
|
+
await self.load_markets()
|
332
|
+
symbols = self.market_symbols(symbols, None, False, True, False)
|
333
|
+
length = len(symbols)
|
334
|
+
if length > 100:
|
335
|
+
raise ArgumentsRequired(self.id + ' ' + methodName + '() accepts a maximum of 100 symbols')
|
336
|
+
messageHashes = []
|
337
|
+
for i in range(0, len(symbols)):
|
338
|
+
symbol = symbols[i]
|
339
|
+
market = self.market(symbol)
|
340
|
+
messageHashes.append('bidask@' + market['symbol'])
|
341
|
+
url = await self.negotiate(False)
|
342
|
+
marketIds = self.market_ids(symbols)
|
343
|
+
joined = ','.join(marketIds)
|
344
|
+
requestId = str(self.request_id())
|
345
|
+
request: dict = {
|
346
|
+
'id': requestId,
|
347
|
+
'type': 'subscribe',
|
348
|
+
'topic': channelName + joined,
|
349
|
+
'response': True,
|
350
|
+
}
|
351
|
+
message = self.extend(request, params)
|
352
|
+
return await self.watch_multiple(url, messageHashes, message, messageHashes)
|
353
|
+
|
354
|
+
def handle_bid_ask(self, client: Client, message):
|
355
|
+
#
|
356
|
+
# arrives one symbol dict
|
357
|
+
#
|
358
|
+
# {
|
359
|
+
# topic: '/spotMarket/level1:ETH-USDT',
|
360
|
+
# type: 'message',
|
361
|
+
# data: {
|
362
|
+
# asks: ['3347.42', '2.0778387'],
|
363
|
+
# bids: ['3347.41', '6.0411697'],
|
364
|
+
# timestamp: 1712231142085
|
365
|
+
# },
|
366
|
+
# subject: 'level1'
|
367
|
+
# }
|
368
|
+
#
|
369
|
+
parsedTicker = self.parse_ws_bid_ask(message)
|
370
|
+
symbol = parsedTicker['symbol']
|
371
|
+
self.bidsasks[symbol] = parsedTicker
|
372
|
+
messageHash = 'bidask@' + symbol
|
373
|
+
client.resolve(parsedTicker, messageHash)
|
374
|
+
|
375
|
+
def parse_ws_bid_ask(self, ticker, market=None):
|
376
|
+
topic = self.safe_string(ticker, 'topic')
|
377
|
+
parts = topic.split(':')
|
378
|
+
marketId = parts[1]
|
379
|
+
market = self.safe_market(marketId, market)
|
380
|
+
symbol = self.safe_string(market, 'symbol')
|
381
|
+
data = self.safe_dict(ticker, 'data', {})
|
382
|
+
ask = self.safe_list(data, 'asks', [])
|
383
|
+
bid = self.safe_list(data, 'bids', [])
|
384
|
+
timestamp = self.safe_integer(data, 'timestamp')
|
385
|
+
return self.safe_ticker({
|
386
|
+
'symbol': symbol,
|
387
|
+
'timestamp': timestamp,
|
388
|
+
'datetime': self.iso8601(timestamp),
|
389
|
+
'ask': self.safe_number(ask, 0),
|
390
|
+
'askVolume': self.safe_number(ask, 1),
|
391
|
+
'bid': self.safe_number(bid, 0),
|
392
|
+
'bidVolume': self.safe_number(bid, 1),
|
393
|
+
'info': ticker,
|
394
|
+
}, market)
|
275
395
|
|
276
396
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
277
397
|
"""
|
278
398
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
399
|
+
|
400
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/klines
|
401
|
+
|
279
402
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
280
403
|
:param str timeframe: the length of time each candle represents
|
281
404
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -340,6 +463,9 @@ class kucoin(ccxt.async_support.kucoin):
|
|
340
463
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
341
464
|
"""
|
342
465
|
get the list of most recent trades for a particular symbol
|
466
|
+
|
467
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
|
468
|
+
|
343
469
|
:param str symbol: unified symbol of the market to fetch trades for
|
344
470
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
345
471
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -351,7 +477,10 @@ class kucoin(ccxt.async_support.kucoin):
|
|
351
477
|
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
352
478
|
"""
|
353
479
|
get the list of most recent trades for a particular symbol
|
354
|
-
|
480
|
+
|
481
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
|
482
|
+
|
483
|
+
:param str[] symbols:
|
355
484
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
356
485
|
:param int [limit]: the maximum amount of trades to fetch
|
357
486
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -379,6 +508,48 @@ class kucoin(ccxt.async_support.kucoin):
|
|
379
508
|
limit = trades.getLimit(tradeSymbol, limit)
|
380
509
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
381
510
|
|
511
|
+
async def un_watch_trades_for_symbols(self, symbols: List[str], params={}) -> Any:
|
512
|
+
"""
|
513
|
+
unWatches trades stream
|
514
|
+
|
515
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
|
516
|
+
|
517
|
+
:param str symbols:
|
518
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
519
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
520
|
+
"""
|
521
|
+
await self.load_markets()
|
522
|
+
symbols = self.market_symbols(symbols, None, False)
|
523
|
+
marketIds = self.market_ids(symbols)
|
524
|
+
url = await self.negotiate(False)
|
525
|
+
messageHashes = []
|
526
|
+
subscriptionHashes = []
|
527
|
+
topic = '/market/match:' + ','.join(marketIds)
|
528
|
+
for i in range(0, len(symbols)):
|
529
|
+
symbol = symbols[i]
|
530
|
+
messageHashes.append('unsubscribe:trades:' + symbol)
|
531
|
+
subscriptionHashes.append('trades:' + symbol)
|
532
|
+
subscription = {
|
533
|
+
'messageHashes': messageHashes,
|
534
|
+
'subMessageHashes': subscriptionHashes,
|
535
|
+
'topic': 'trades',
|
536
|
+
'unsubscribe': True,
|
537
|
+
'symbols': symbols,
|
538
|
+
}
|
539
|
+
return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
|
540
|
+
|
541
|
+
async def un_watch_trades(self, symbol: str, params={}) -> Any:
|
542
|
+
"""
|
543
|
+
unWatches trades stream
|
544
|
+
|
545
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/match-execution-data
|
546
|
+
|
547
|
+
:param str symbol: unified symbol of the market to fetch trades for
|
548
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
549
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
550
|
+
"""
|
551
|
+
return await self.un_watch_trades_for_symbols([symbol], params)
|
552
|
+
|
382
553
|
def handle_trade(self, client: Client, message):
|
383
554
|
#
|
384
555
|
# {
|
@@ -413,10 +584,12 @@ class kucoin(ccxt.async_support.kucoin):
|
|
413
584
|
|
414
585
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
415
586
|
"""
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
587
|
+
|
588
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
|
589
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
|
590
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
|
591
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
|
592
|
+
|
420
593
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
421
594
|
:param str symbol: unified symbol of the market to fetch the order book for
|
422
595
|
:param int [limit]: the maximum amount of order book entries to return
|
@@ -441,12 +614,30 @@ class kucoin(ccxt.async_support.kucoin):
|
|
441
614
|
#
|
442
615
|
return await self.watch_order_book_for_symbols([symbol], limit, params)
|
443
616
|
|
617
|
+
async def un_watch_order_book(self, symbol: str, params={}) -> Any:
|
618
|
+
"""
|
619
|
+
|
620
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
|
621
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
|
622
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
|
623
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
|
624
|
+
|
625
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
626
|
+
:param str symbol: unified symbol of the market to fetch the order book for
|
627
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
628
|
+
:param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
|
629
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
630
|
+
"""
|
631
|
+
return await self.un_watch_order_book_for_symbols([symbol], params)
|
632
|
+
|
444
633
|
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
445
634
|
"""
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
635
|
+
|
636
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
|
637
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
|
638
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
|
639
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
|
640
|
+
|
450
641
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
451
642
|
:param str[] symbols: unified array of symbols
|
452
643
|
:param int [limit]: the maximum amount of order book entries to return
|
@@ -486,6 +677,46 @@ class kucoin(ccxt.async_support.kucoin):
|
|
486
677
|
orderbook = await self.subscribe_multiple(url, messageHashes, topic, subscriptionHashes, params, subscription)
|
487
678
|
return orderbook.limit()
|
488
679
|
|
680
|
+
async def un_watch_order_book_for_symbols(self, symbols: List[str], params={}) -> Any:
|
681
|
+
"""
|
682
|
+
|
683
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level1-bbo-market-data
|
684
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-market-data
|
685
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-5-best-ask-bid-orders
|
686
|
+
https://www.kucoin.com/docs/websocket/spot-trading/public-channels/level2-50-best-ask-bid-orders
|
687
|
+
|
688
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
689
|
+
:param str[] symbols: unified array of symbols
|
690
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
691
|
+
:param str [params.method]: either '/market/level2' or '/spotMarket/level2Depth5' or '/spotMarket/level2Depth50' default is '/market/level2'
|
692
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
693
|
+
"""
|
694
|
+
limit = self.safe_integer(params, 'limit')
|
695
|
+
params = self.omit(params, 'limit')
|
696
|
+
await self.load_markets()
|
697
|
+
symbols = self.market_symbols(symbols, None, False)
|
698
|
+
marketIds = self.market_ids(symbols)
|
699
|
+
url = await self.negotiate(False)
|
700
|
+
method: Str = None
|
701
|
+
method, params = self.handle_option_and_params(params, 'watchOrderBook', 'method', '/market/level2')
|
702
|
+
if (limit == 5) or (limit == 50):
|
703
|
+
method = '/spotMarket/level2Depth' + str(limit)
|
704
|
+
topic = method + ':' + ','.join(marketIds)
|
705
|
+
messageHashes = []
|
706
|
+
subscriptionHashes = []
|
707
|
+
for i in range(0, len(symbols)):
|
708
|
+
symbol = symbols[i]
|
709
|
+
messageHashes.append('unsubscribe:orderbook:' + symbol)
|
710
|
+
subscriptionHashes.append('orderbook:' + symbol)
|
711
|
+
subscription = {
|
712
|
+
'messageHashes': messageHashes,
|
713
|
+
'symbols': symbols,
|
714
|
+
'unsubscribe': True,
|
715
|
+
'topic': 'orderbook',
|
716
|
+
'subMessageHashes': subscriptionHashes,
|
717
|
+
}
|
718
|
+
return await self.un_subscribe_multiple(url, messageHashes, topic, messageHashes, params, subscription)
|
719
|
+
|
489
720
|
def handle_order_book(self, client: Client, message):
|
490
721
|
#
|
491
722
|
# initial snapshot is fetched with ccxt's fetchOrderBook
|
@@ -536,14 +767,18 @@ class kucoin(ccxt.async_support.kucoin):
|
|
536
767
|
marketId = self.safe_string(data, 'symbol', topicSymbol)
|
537
768
|
symbol = self.safe_symbol(marketId, None, '-')
|
538
769
|
messageHash = 'orderbook:' + symbol
|
539
|
-
orderbook = self.safe_dict(self.orderbooks, symbol)
|
770
|
+
# orderbook = self.safe_dict(self.orderbooks, symbol)
|
540
771
|
if subject == 'level2':
|
541
|
-
if
|
542
|
-
|
772
|
+
if not (symbol in self.orderbooks):
|
773
|
+
self.orderbooks[symbol] = self.order_book()
|
543
774
|
else:
|
775
|
+
orderbook = self.orderbooks[symbol]
|
544
776
|
orderbook.reset()
|
545
|
-
|
777
|
+
self.orderbooks[symbol]['symbol'] = symbol
|
546
778
|
else:
|
779
|
+
if not (symbol in self.orderbooks):
|
780
|
+
self.orderbooks[symbol] = self.order_book()
|
781
|
+
orderbook = self.orderbooks[symbol]
|
547
782
|
nonce = self.safe_integer(orderbook, 'nonce')
|
548
783
|
deltaEnd = self.safe_integer_2(data, 'sequenceEnd', 'timestamp')
|
549
784
|
if nonce is None:
|
@@ -563,8 +798,8 @@ class kucoin(ccxt.async_support.kucoin):
|
|
563
798
|
return
|
564
799
|
elif nonce >= deltaEnd:
|
565
800
|
return
|
566
|
-
self.handle_delta(
|
567
|
-
client.resolve(
|
801
|
+
self.handle_delta(self.orderbooks[symbol], data)
|
802
|
+
client.resolve(self.orderbooks[symbol], messageHash)
|
568
803
|
|
569
804
|
def get_cache_index(self, orderbook, cache):
|
570
805
|
firstDelta = self.safe_value(cache, 0)
|
@@ -621,12 +856,23 @@ class kucoin(ccxt.async_support.kucoin):
|
|
621
856
|
# }
|
622
857
|
#
|
623
858
|
id = self.safe_string(message, 'id')
|
859
|
+
if not (id in client.subscriptions):
|
860
|
+
return
|
624
861
|
subscriptionHash = self.safe_string(client.subscriptions, id)
|
625
862
|
subscription = self.safe_value(client.subscriptions, subscriptionHash)
|
626
863
|
del client.subscriptions[id]
|
627
864
|
method = self.safe_value(subscription, 'method')
|
628
865
|
if method is not None:
|
629
866
|
method(client, message, subscription)
|
867
|
+
isUnSub = self.safe_bool(subscription, 'unsubscribe', False)
|
868
|
+
if isUnSub:
|
869
|
+
messageHashes = self.safe_list(subscription, 'messageHashes', [])
|
870
|
+
subMessageHashes = self.safe_list(subscription, 'subMessageHashes', [])
|
871
|
+
for i in range(0, len(messageHashes)):
|
872
|
+
messageHash = messageHashes[i]
|
873
|
+
subHash = subMessageHashes[i]
|
874
|
+
self.clean_unsubscription(client, subHash, messageHash)
|
875
|
+
self.clean_cache(subscription)
|
630
876
|
|
631
877
|
def handle_system_status(self, client: Client, message):
|
632
878
|
#
|
@@ -644,19 +890,23 @@ class kucoin(ccxt.async_support.kucoin):
|
|
644
890
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
645
891
|
"""
|
646
892
|
watches information on multiple orders made by the user
|
893
|
+
|
894
|
+
https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
|
895
|
+
https://www.kucoin.com/docs/websocket/spot-trading/private-channels/stop-order-event
|
896
|
+
|
647
897
|
:param str symbol: unified market symbol of the market orders were made in
|
648
898
|
:param int [since]: the earliest time in ms to fetch orders for
|
649
899
|
:param int [limit]: the maximum number of order structures to retrieve
|
650
900
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
651
|
-
:param boolean [params.
|
901
|
+
:param boolean [params.trigger]: trigger orders are watched if True
|
652
902
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
653
903
|
"""
|
654
904
|
await self.load_markets()
|
655
|
-
|
905
|
+
trigger = self.safe_value_2(params, 'stop', 'trigger')
|
656
906
|
params = self.omit(params, ['stop', 'trigger'])
|
657
907
|
url = await self.negotiate(True)
|
658
|
-
topic = '/spotMarket/advancedOrders' if
|
659
|
-
request = {
|
908
|
+
topic = '/spotMarket/advancedOrders' if trigger else '/spotMarket/tradeOrders'
|
909
|
+
request: dict = {
|
660
910
|
'privateChannel': True,
|
661
911
|
}
|
662
912
|
messageHash = 'orders'
|
@@ -670,7 +920,7 @@ class kucoin(ccxt.async_support.kucoin):
|
|
670
920
|
return self.filter_by_symbol_since_limit(orders, symbol, since, limit, True)
|
671
921
|
|
672
922
|
def parse_ws_order_status(self, status):
|
673
|
-
statuses = {
|
923
|
+
statuses: dict = {
|
674
924
|
'open': 'open',
|
675
925
|
'filled': 'closed',
|
676
926
|
'match': 'open',
|
@@ -777,6 +1027,9 @@ class kucoin(ccxt.async_support.kucoin):
|
|
777
1027
|
#
|
778
1028
|
messageHash = 'orders'
|
779
1029
|
data = self.safe_value(message, 'data')
|
1030
|
+
tradeId = self.safe_string(data, 'tradeId')
|
1031
|
+
if tradeId is not None:
|
1032
|
+
self.handle_my_trade(client, message)
|
780
1033
|
parsed = self.parse_ws_order(data)
|
781
1034
|
symbol = self.safe_string(parsed, 'symbol')
|
782
1035
|
orderId = self.safe_string(parsed, 'id')
|
@@ -801,16 +1054,21 @@ class kucoin(ccxt.async_support.kucoin):
|
|
801
1054
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
802
1055
|
"""
|
803
1056
|
watches information on multiple trades made by the user
|
1057
|
+
|
1058
|
+
https://www.kucoin.com/docs/websocket/spot-trading/private-channels/private-order-change
|
1059
|
+
|
804
1060
|
:param str symbol: unified market symbol of the market trades were made in
|
805
1061
|
:param int [since]: the earliest time in ms to fetch trades for
|
806
1062
|
:param int [limit]: the maximum number of trade structures to retrieve
|
807
1063
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
808
|
-
:
|
1064
|
+
:param str [params.method]: '/spotMarket/tradeOrders' or '/spot/tradeFills' default is '/spotMarket/tradeOrders'
|
1065
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
809
1066
|
"""
|
810
1067
|
await self.load_markets()
|
811
1068
|
url = await self.negotiate(True)
|
812
|
-
topic =
|
813
|
-
|
1069
|
+
topic: Str = None
|
1070
|
+
topic, params = self.handle_option_and_params(params, 'watchMyTrades', 'method', '/spotMarket/tradeOrders')
|
1071
|
+
request: dict = {
|
814
1072
|
'privateChannel': True,
|
815
1073
|
}
|
816
1074
|
messageHash = 'myTrades'
|
@@ -824,33 +1082,86 @@ class kucoin(ccxt.async_support.kucoin):
|
|
824
1082
|
return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
|
825
1083
|
|
826
1084
|
def handle_my_trade(self, client: Client, message):
|
827
|
-
|
828
|
-
|
1085
|
+
#
|
1086
|
+
# {
|
1087
|
+
# "type": "message",
|
1088
|
+
# "topic": "/spotMarket/tradeOrders",
|
1089
|
+
# "subject": "orderChange",
|
1090
|
+
# "channelType": "private",
|
1091
|
+
# "data": {
|
1092
|
+
# "symbol": "KCS-USDT",
|
1093
|
+
# "orderType": "limit",
|
1094
|
+
# "side": "sell",
|
1095
|
+
# "orderId": "5efab07953bdea00089965fa",
|
1096
|
+
# "liquidity": "taker",
|
1097
|
+
# "type": "match",
|
1098
|
+
# "feeType": "takerFee",
|
1099
|
+
# "orderTime": 1670329987026,
|
1100
|
+
# "size": "0.1",
|
1101
|
+
# "filledSize": "0.1",
|
1102
|
+
# "price": "0.938",
|
1103
|
+
# "matchPrice": "0.96738",
|
1104
|
+
# "matchSize": "0.1",
|
1105
|
+
# "tradeId": "5efab07a4ee4c7000a82d6d9",
|
1106
|
+
# "clientOid": "1593487481000313",
|
1107
|
+
# "remainSize": "0",
|
1108
|
+
# "status": "match",
|
1109
|
+
# "ts": 1670329987311000000
|
1110
|
+
# }
|
1111
|
+
# }
|
1112
|
+
#
|
1113
|
+
if self.myTrades is None:
|
829
1114
|
limit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
830
|
-
|
831
|
-
data = self.
|
1115
|
+
self.myTrades = ArrayCacheBySymbolById(limit)
|
1116
|
+
data = self.safe_dict(message, 'data')
|
832
1117
|
parsed = self.parse_ws_trade(data)
|
833
|
-
|
1118
|
+
myTrades = self.myTrades
|
1119
|
+
myTrades.append(parsed)
|
834
1120
|
messageHash = 'myTrades'
|
835
|
-
client.resolve(
|
1121
|
+
client.resolve(self.myTrades, messageHash)
|
836
1122
|
symbolSpecificMessageHash = messageHash + ':' + parsed['symbol']
|
837
|
-
client.resolve(
|
1123
|
+
client.resolve(self.myTrades, symbolSpecificMessageHash)
|
838
1124
|
|
839
1125
|
def parse_ws_trade(self, trade, market=None):
|
840
1126
|
#
|
841
|
-
#
|
842
|
-
#
|
843
|
-
#
|
844
|
-
#
|
845
|
-
#
|
846
|
-
#
|
847
|
-
#
|
848
|
-
#
|
849
|
-
#
|
850
|
-
#
|
851
|
-
#
|
852
|
-
#
|
853
|
-
#
|
1127
|
+
# /spotMarket/tradeOrders
|
1128
|
+
#
|
1129
|
+
# {
|
1130
|
+
# "symbol": "KCS-USDT",
|
1131
|
+
# "orderType": "limit",
|
1132
|
+
# "side": "sell",
|
1133
|
+
# "orderId": "5efab07953bdea00089965fa",
|
1134
|
+
# "liquidity": "taker",
|
1135
|
+
# "type": "match",
|
1136
|
+
# "feeType": "takerFee",
|
1137
|
+
# "orderTime": 1670329987026,
|
1138
|
+
# "size": "0.1",
|
1139
|
+
# "filledSize": "0.1",
|
1140
|
+
# "price": "0.938",
|
1141
|
+
# "matchPrice": "0.96738",
|
1142
|
+
# "matchSize": "0.1",
|
1143
|
+
# "tradeId": "5efab07a4ee4c7000a82d6d9",
|
1144
|
+
# "clientOid": "1593487481000313",
|
1145
|
+
# "remainSize": "0",
|
1146
|
+
# "status": "match",
|
1147
|
+
# "ts": 1670329987311000000
|
1148
|
+
# }
|
1149
|
+
#
|
1150
|
+
# /spot/tradeFills
|
1151
|
+
#
|
1152
|
+
# {
|
1153
|
+
# "fee": 0.00262148,
|
1154
|
+
# "feeCurrency": "USDT",
|
1155
|
+
# "feeRate": 0.001,
|
1156
|
+
# "orderId": "62417436b29df8000183df2f",
|
1157
|
+
# "orderType": "market",
|
1158
|
+
# "price": 131.074,
|
1159
|
+
# "side": "sell",
|
1160
|
+
# "size": 0.02,
|
1161
|
+
# "symbol": "LTC-USDT",
|
1162
|
+
# "time": "1648456758734571745",
|
1163
|
+
# "tradeId": "624174362e113d2f467b3043"
|
1164
|
+
# }
|
854
1165
|
#
|
855
1166
|
marketId = self.safe_string(trade, 'symbol')
|
856
1167
|
market = self.safe_market(marketId, market, '-')
|
@@ -858,18 +1169,17 @@ class kucoin(ccxt.async_support.kucoin):
|
|
858
1169
|
type = self.safe_string(trade, 'orderType')
|
859
1170
|
side = self.safe_string(trade, 'side')
|
860
1171
|
tradeId = self.safe_string(trade, 'tradeId')
|
861
|
-
price = self.safe_string(trade, '
|
862
|
-
amount = self.safe_string(trade, '
|
1172
|
+
price = self.safe_string(trade, 'matchPrice')
|
1173
|
+
amount = self.safe_string(trade, 'matchSize')
|
1174
|
+
if price is None:
|
1175
|
+
# /spot/tradeFills
|
1176
|
+
price = self.safe_string(trade, 'price')
|
1177
|
+
amount = self.safe_string(trade, 'size')
|
863
1178
|
order = self.safe_string(trade, 'orderId')
|
864
|
-
timestamp = self.
|
1179
|
+
timestamp = self.safe_integer_product_2(trade, 'ts', 'time', 0.000001)
|
865
1180
|
feeCurrency = market['quote']
|
866
1181
|
feeRate = self.safe_string(trade, 'feeRate')
|
867
1182
|
feeCost = self.safe_string(trade, 'fee')
|
868
|
-
fee = {
|
869
|
-
'cost': feeCost,
|
870
|
-
'rate': feeRate,
|
871
|
-
'currency': feeCurrency,
|
872
|
-
}
|
873
1183
|
return self.safe_trade({
|
874
1184
|
'info': trade,
|
875
1185
|
'timestamp': timestamp,
|
@@ -878,24 +1188,31 @@ class kucoin(ccxt.async_support.kucoin):
|
|
878
1188
|
'id': tradeId,
|
879
1189
|
'order': order,
|
880
1190
|
'type': type,
|
881
|
-
'takerOrMaker':
|
1191
|
+
'takerOrMaker': self.safe_string(trade, 'liquidity'),
|
882
1192
|
'side': side,
|
883
1193
|
'price': price,
|
884
1194
|
'amount': amount,
|
885
1195
|
'cost': None,
|
886
|
-
'fee':
|
1196
|
+
'fee': {
|
1197
|
+
'cost': feeCost,
|
1198
|
+
'rate': feeRate,
|
1199
|
+
'currency': feeCurrency,
|
1200
|
+
},
|
887
1201
|
}, market)
|
888
1202
|
|
889
1203
|
async def watch_balance(self, params={}) -> Balances:
|
890
1204
|
"""
|
891
1205
|
watch balance and get the amount of funds available for trading or funds locked in orders
|
1206
|
+
|
1207
|
+
https://www.kucoin.com/docs/websocket/spot-trading/private-channels/account-balance-change
|
1208
|
+
|
892
1209
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
893
1210
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
894
1211
|
"""
|
895
1212
|
await self.load_markets()
|
896
1213
|
url = await self.negotiate(True)
|
897
1214
|
topic = '/account/balance'
|
898
|
-
request = {
|
1215
|
+
request: dict = {
|
899
1216
|
'privateChannel': True,
|
900
1217
|
}
|
901
1218
|
messageHash = 'balance'
|
@@ -974,7 +1291,8 @@ class kucoin(ccxt.async_support.kucoin):
|
|
974
1291
|
self.handle_ticker(client, message)
|
975
1292
|
return
|
976
1293
|
subject = self.safe_string(message, 'subject')
|
977
|
-
methods = {
|
1294
|
+
methods: dict = {
|
1295
|
+
'level1': self.handle_bid_ask,
|
978
1296
|
'level2': self.handle_order_book,
|
979
1297
|
'trade.l2update': self.handle_order_book,
|
980
1298
|
'trade.ticker': self.handle_ticker,
|
@@ -982,15 +1300,15 @@ class kucoin(ccxt.async_support.kucoin):
|
|
982
1300
|
'trade.l3match': self.handle_trade,
|
983
1301
|
'trade.candles.update': self.handle_ohlcv,
|
984
1302
|
'account.balance': self.handle_balance,
|
985
|
-
'/spot/tradeFills': self.handle_my_trade,
|
986
1303
|
'orderChange': self.handle_order,
|
987
1304
|
'stopOrder': self.handle_order,
|
1305
|
+
'/spot/tradeFills': self.handle_my_trade,
|
988
1306
|
}
|
989
1307
|
method = self.safe_value(methods, subject)
|
990
1308
|
if method is not None:
|
991
1309
|
method(client, message)
|
992
1310
|
|
993
|
-
def ping(self, client):
|
1311
|
+
def ping(self, client: Client):
|
994
1312
|
# kucoin does not support built-in ws protocol-level ping-pong
|
995
1313
|
# instead it requires a custom json-based text ping-pong
|
996
1314
|
# https://docs.kucoin.com/#ping
|
@@ -1023,7 +1341,7 @@ class kucoin(ccxt.async_support.kucoin):
|
|
1023
1341
|
|
1024
1342
|
def handle_message(self, client: Client, message):
|
1025
1343
|
type = self.safe_string(message, 'type')
|
1026
|
-
methods = {
|
1344
|
+
methods: dict = {
|
1027
1345
|
# 'heartbeat': self.handleHeartbeat,
|
1028
1346
|
'welcome': self.handle_system_status,
|
1029
1347
|
'ack': self.handle_subscription_status,
|