ccxt 4.2.77__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 +24 -0
- ccxt/abstract/kucoinfutures.py +34 -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 +3030 -1087
- 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 +3104 -880
- 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 +238 -49
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +199 -65
- 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 +392 -148
- 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 +2231 -1193
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1454 -287
- 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 +404 -109
- ccxt/async_support/deribit.py +557 -323
- 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 +1472 -463
- 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 +1633 -268
- 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 +917 -357
- 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 +1776 -454
- 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 +1137 -296
- 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 +1722 -480
- 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 +3030 -1087
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3104 -880
- 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 +238 -49
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +198 -65
- 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 +392 -148
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2231 -1193
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1454 -287
- 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 +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- 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 +1632 -268
- 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 +917 -357
- 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 +1776 -454
- 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 +62 -14
- 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 +203 -81
- 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 +965 -665
- 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 +167 -31
- ccxt/pro/exmo.py +252 -20
- 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 +92 -33
- ccxt/pro/poloniex.py +128 -49
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +92 -85
- 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 +437 -65
- 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} +456 -391
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +456 -393
- 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 +1137 -296
- 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.77.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.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/pro/hyperliquid.py
CHANGED
@@ -5,9 +5,10 @@
|
|
5
5
|
|
6
6
|
import ccxt.async_support
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
|
8
|
-
from ccxt.base.types import Int, Market, Order, OrderBook, Str, Trade
|
8
|
+
from ccxt.base.types import Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, 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
|
|
13
14
|
|
@@ -17,14 +18,18 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
17
18
|
return self.deep_extend(super(hyperliquid, self).describe(), {
|
18
19
|
'has': {
|
19
20
|
'ws': True,
|
21
|
+
'createOrderWs': True,
|
22
|
+
'createOrdersWs': True,
|
23
|
+
'editOrderWs': True,
|
20
24
|
'watchBalance': False,
|
21
25
|
'watchMyTrades': True,
|
22
26
|
'watchOHLCV': True,
|
23
27
|
'watchOrderBook': True,
|
24
28
|
'watchOrders': True,
|
25
|
-
'watchTicker':
|
26
|
-
'watchTickers':
|
29
|
+
'watchTicker': True,
|
30
|
+
'watchTickers': True,
|
27
31
|
'watchTrades': True,
|
32
|
+
'watchTradesForSymbols': False,
|
28
33
|
'watchPosition': False,
|
29
34
|
},
|
30
35
|
'urls': {
|
@@ -53,9 +58,97 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
53
58
|
},
|
54
59
|
})
|
55
60
|
|
61
|
+
async def create_orders_ws(self, orders: List[OrderRequest], params={}):
|
62
|
+
"""
|
63
|
+
create a list of trade orders using WebSocket post request
|
64
|
+
|
65
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
|
66
|
+
|
67
|
+
:param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
68
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
69
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
70
|
+
"""
|
71
|
+
await self.load_markets()
|
72
|
+
url = self.urls['api']['ws']['public']
|
73
|
+
ordersRequest = self.createOrdersRequest(orders, params)
|
74
|
+
wrapped = self.wrap_as_post_action(ordersRequest)
|
75
|
+
request = self.safe_dict(wrapped, 'request', {})
|
76
|
+
requestId = self.safe_string(wrapped, 'requestId')
|
77
|
+
response = await self.watch(url, requestId, request, requestId)
|
78
|
+
responseOjb = self.safe_dict(response, 'response', {})
|
79
|
+
data = self.safe_dict(responseOjb, 'data', {})
|
80
|
+
statuses = self.safe_list(data, 'statuses', [])
|
81
|
+
return self.parse_orders(statuses, None)
|
82
|
+
|
83
|
+
async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
84
|
+
"""
|
85
|
+
create a trade order using WebSocket post request
|
86
|
+
|
87
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
|
88
|
+
|
89
|
+
:param str symbol: unified symbol of the market to create an order in
|
90
|
+
:param str type: 'market' or 'limit'
|
91
|
+
:param str side: 'buy' or 'sell'
|
92
|
+
:param float amount: how much of currency you want to trade in units of base currency
|
93
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
94
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
95
|
+
:param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
|
96
|
+
:param bool [params.postOnly]: True or False whether the order is post-only
|
97
|
+
:param bool [params.reduceOnly]: True or False whether the order is reduce-only
|
98
|
+
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
99
|
+
:param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
|
100
|
+
:param str [params.slippage]: the slippage for market order
|
101
|
+
:param str [params.vaultAddress]: the vault address for order
|
102
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
103
|
+
"""
|
104
|
+
await self.load_markets()
|
105
|
+
order, globalParams = self.parseCreateOrderArgs(symbol, type, side, amount, price, params)
|
106
|
+
orders = await self.create_orders_ws([order], globalParams)
|
107
|
+
return orders[0]
|
108
|
+
|
109
|
+
async def edit_order_ws(self, id: str, symbol: str, type: str, side: str, amount: Num = None, price: Num = None, params={}):
|
110
|
+
"""
|
111
|
+
edit a trade order
|
112
|
+
|
113
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-an-order
|
114
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders
|
115
|
+
|
116
|
+
:param str id: cancel order id
|
117
|
+
:param str symbol: unified symbol of the market to create an order in
|
118
|
+
:param str type: 'market' or 'limit'
|
119
|
+
:param str side: 'buy' or 'sell'
|
120
|
+
:param float amount: how much of currency you want to trade in units of base currency
|
121
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
122
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
123
|
+
:param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
|
124
|
+
:param bool [params.postOnly]: True or False whether the order is post-only
|
125
|
+
:param bool [params.reduceOnly]: True or False whether the order is reduce-only
|
126
|
+
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
127
|
+
:param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
|
128
|
+
:param str [params.vaultAddress]: the vault address for order
|
129
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
130
|
+
"""
|
131
|
+
await self.load_markets()
|
132
|
+
market = self.market(symbol)
|
133
|
+
url = self.urls['api']['ws']['public']
|
134
|
+
postRequest = self.edit_order_request(id, symbol, type, side, amount, price, params)
|
135
|
+
wrapped = self.wrap_as_post_action(postRequest)
|
136
|
+
request = self.safe_dict(wrapped, 'request', {})
|
137
|
+
requestId = self.safe_string(wrapped, 'requestId')
|
138
|
+
response = await self.watch(url, requestId, request, requestId)
|
139
|
+
# response is the same self.edit_order
|
140
|
+
responseObject = self.safe_dict(response, 'response', {})
|
141
|
+
dataObject = self.safe_dict(responseObject, 'data', {})
|
142
|
+
statuses = self.safe_list(dataObject, 'statuses', [])
|
143
|
+
first = self.safe_dict(statuses, 0, {})
|
144
|
+
return self.parse_order(first, market)
|
145
|
+
|
56
146
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
57
147
|
"""
|
58
148
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
149
|
+
|
150
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
151
|
+
|
59
152
|
:param str symbol: unified symbol of the market to fetch the order book for
|
60
153
|
:param int [limit]: the maximum amount of order book entries to return
|
61
154
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -66,17 +159,45 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
66
159
|
symbol = market['symbol']
|
67
160
|
messageHash = 'orderbook:' + symbol
|
68
161
|
url = self.urls['api']['ws']['public']
|
69
|
-
request = {
|
162
|
+
request: dict = {
|
70
163
|
'method': 'subscribe',
|
71
164
|
'subscription': {
|
72
165
|
'type': 'l2Book',
|
73
|
-
'coin': market['base'],
|
166
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
74
167
|
},
|
75
168
|
}
|
76
169
|
message = self.extend(request, params)
|
77
170
|
orderbook = await self.watch(url, messageHash, message, messageHash)
|
78
171
|
return orderbook.limit()
|
79
172
|
|
173
|
+
async def un_watch_order_book(self, symbol: str, params={}) -> Any:
|
174
|
+
"""
|
175
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
176
|
+
|
177
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
178
|
+
|
179
|
+
:param str symbol: unified symbol of the market to fetch the order book for
|
180
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
181
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
182
|
+
"""
|
183
|
+
await self.load_markets()
|
184
|
+
market = self.market(symbol)
|
185
|
+
symbol = market['symbol']
|
186
|
+
subMessageHash = 'orderbook:' + symbol
|
187
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
188
|
+
url = self.urls['api']['ws']['public']
|
189
|
+
id = str(self.nonce())
|
190
|
+
request: dict = {
|
191
|
+
'id': id,
|
192
|
+
'method': 'unsubscribe',
|
193
|
+
'subscription': {
|
194
|
+
'type': 'l2Book',
|
195
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
196
|
+
},
|
197
|
+
}
|
198
|
+
message = self.extend(request, params)
|
199
|
+
return await self.watch(url, messageHash, message, messageHash)
|
200
|
+
|
80
201
|
def handle_order_book(self, client, message):
|
81
202
|
#
|
82
203
|
# {
|
@@ -105,11 +226,11 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
105
226
|
#
|
106
227
|
entry = self.safe_dict(message, 'data', {})
|
107
228
|
coin = self.safe_string(entry, 'coin')
|
108
|
-
marketId = coin
|
229
|
+
marketId = self.coinToMarketId(coin)
|
109
230
|
market = self.market(marketId)
|
110
231
|
symbol = market['symbol']
|
111
232
|
rawData = self.safe_list(entry, 'levels', [])
|
112
|
-
data = {
|
233
|
+
data: dict = {
|
113
234
|
'bids': self.safe_list(rawData, 0, []),
|
114
235
|
'asks': self.safe_list(rawData, 1, []),
|
115
236
|
}
|
@@ -123,15 +244,83 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
123
244
|
messageHash = 'orderbook:' + symbol
|
124
245
|
client.resolve(orderbook, messageHash)
|
125
246
|
|
247
|
+
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
248
|
+
"""
|
249
|
+
|
250
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
251
|
+
|
252
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
253
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
254
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
255
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
256
|
+
"""
|
257
|
+
market = self.market(symbol)
|
258
|
+
symbol = market['symbol']
|
259
|
+
tickers = await self.watch_tickers([symbol], params)
|
260
|
+
return tickers[symbol]
|
261
|
+
|
262
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
263
|
+
"""
|
264
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
265
|
+
|
266
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
267
|
+
|
268
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
269
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
270
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
271
|
+
"""
|
272
|
+
await self.load_markets()
|
273
|
+
symbols = self.market_symbols(symbols, None, True)
|
274
|
+
messageHash = 'tickers'
|
275
|
+
url = self.urls['api']['ws']['public']
|
276
|
+
request: dict = {
|
277
|
+
'method': 'subscribe',
|
278
|
+
'subscription': {
|
279
|
+
'type': 'webData2', # allMids
|
280
|
+
'user': '0x0000000000000000000000000000000000000000',
|
281
|
+
},
|
282
|
+
}
|
283
|
+
tickers = await self.watch(url, messageHash, self.extend(request, params), messageHash)
|
284
|
+
if self.newUpdates:
|
285
|
+
return self.filter_by_array_tickers(tickers, 'symbol', symbols)
|
286
|
+
return self.tickers
|
287
|
+
|
288
|
+
async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
|
289
|
+
"""
|
290
|
+
unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
291
|
+
|
292
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
293
|
+
|
294
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
295
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
296
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
297
|
+
"""
|
298
|
+
await self.load_markets()
|
299
|
+
symbols = self.market_symbols(symbols, None, True)
|
300
|
+
subMessageHash = 'tickers'
|
301
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
302
|
+
url = self.urls['api']['ws']['public']
|
303
|
+
request: dict = {
|
304
|
+
'method': 'unsubscribe',
|
305
|
+
'subscription': {
|
306
|
+
'type': 'webData2', # allMids
|
307
|
+
'user': '0x0000000000000000000000000000000000000000',
|
308
|
+
},
|
309
|
+
}
|
310
|
+
return await self.watch(url, messageHash, self.extend(request, params), messageHash)
|
311
|
+
|
126
312
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
127
313
|
"""
|
128
314
|
watches information on multiple trades made by the user
|
315
|
+
|
316
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
317
|
+
|
129
318
|
:param str symbol: unified market symbol of the market orders were made in
|
130
319
|
:param int [since]: the earliest time in ms to fetch orders for
|
131
320
|
:param int [limit]: the maximum number of order structures to retrieve
|
132
321
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
133
322
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
134
|
-
:returns dict[]: a list of
|
323
|
+
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
135
324
|
"""
|
136
325
|
userAddress = None
|
137
326
|
userAddress, params = self.handlePublicAddress('watchMyTrades', params)
|
@@ -141,7 +330,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
141
330
|
symbol = self.symbol(symbol)
|
142
331
|
messageHash += ':' + symbol
|
143
332
|
url = self.urls['api']['ws']['public']
|
144
|
-
request = {
|
333
|
+
request: dict = {
|
145
334
|
'method': 'subscribe',
|
146
335
|
'subscription': {
|
147
336
|
'type': 'userFills',
|
@@ -154,6 +343,82 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
154
343
|
limit = trades.getLimit(symbol, limit)
|
155
344
|
return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
|
156
345
|
|
346
|
+
def handle_ws_tickers(self, client: Client, message):
|
347
|
+
#
|
348
|
+
# {
|
349
|
+
# "channel": "webData2",
|
350
|
+
# "data": {
|
351
|
+
# "meta": {
|
352
|
+
# "universe": [
|
353
|
+
# {
|
354
|
+
# "szDecimals": 5,
|
355
|
+
# "name": "BTC",
|
356
|
+
# "maxLeverage": 50,
|
357
|
+
# "onlyIsolated": False
|
358
|
+
# },
|
359
|
+
# ...
|
360
|
+
# ],
|
361
|
+
# },
|
362
|
+
# "assetCtxs": [
|
363
|
+
# {
|
364
|
+
# "funding": "0.00003005",
|
365
|
+
# "openInterest": "2311.50778",
|
366
|
+
# "prevDayPx": "63475.0",
|
367
|
+
# "dayNtlVlm": "468043329.64289033",
|
368
|
+
# "premium": "0.00094264",
|
369
|
+
# "oraclePx": "64712.0",
|
370
|
+
# "markPx": "64774.0",
|
371
|
+
# "midPx": "64773.5",
|
372
|
+
# "impactPxs": [
|
373
|
+
# "64773.0",
|
374
|
+
# "64774.0"
|
375
|
+
# ]
|
376
|
+
# },
|
377
|
+
# ...
|
378
|
+
# ],
|
379
|
+
# "spotAssetCtxs": [
|
380
|
+
# {
|
381
|
+
# "prevDayPx": "0.20937",
|
382
|
+
# "dayNtlVlm": "11188888.61984999",
|
383
|
+
# "markPx": "0.19722",
|
384
|
+
# "midPx": "0.197145",
|
385
|
+
# "circulatingSupply": "598760557.12072003",
|
386
|
+
# "coin": "PURR/USDC"
|
387
|
+
# },
|
388
|
+
# ...
|
389
|
+
# ],
|
390
|
+
# }
|
391
|
+
# }
|
392
|
+
#
|
393
|
+
# spot
|
394
|
+
rawData = self.safe_dict(message, 'data', {})
|
395
|
+
spotAssets = self.safe_list(rawData, 'spotAssetCtxs', [])
|
396
|
+
parsedTickers = []
|
397
|
+
for i in range(0, len(spotAssets)):
|
398
|
+
assetObject = spotAssets[i]
|
399
|
+
marketId = self.safe_string(assetObject, 'coin')
|
400
|
+
market = self.safe_market(marketId, None, None, 'spot')
|
401
|
+
ticker = self.parse_ws_ticker(assetObject, market)
|
402
|
+
parsedTickers.append(ticker)
|
403
|
+
# perpetuals
|
404
|
+
meta = self.safe_dict(rawData, 'meta', {})
|
405
|
+
universe = self.safe_list(meta, 'universe', [])
|
406
|
+
assetCtxs = self.safe_list(rawData, 'assetCtxs', [])
|
407
|
+
for i in range(0, len(universe)):
|
408
|
+
data = self.extend(
|
409
|
+
self.safe_dict(universe, i, {}),
|
410
|
+
self.safe_dict(assetCtxs, i, {})
|
411
|
+
)
|
412
|
+
id = data['name'] + '/USDC:USDC'
|
413
|
+
market = self.safe_market(id, None, None, 'swap')
|
414
|
+
ticker = self.parse_ws_ticker(data, market)
|
415
|
+
parsedTickers.append(ticker)
|
416
|
+
tickers = self.index_by(parsedTickers, 'symbol')
|
417
|
+
client.resolve(tickers, 'tickers')
|
418
|
+
|
419
|
+
def parse_ws_ticker(self, rawTicker, market: Market = None) -> Ticker:
|
420
|
+
return self.parse_ticker(rawTicker, market)
|
421
|
+
|
157
422
|
def handle_my_trades(self, client: Client, message):
|
158
423
|
#
|
159
424
|
# {
|
@@ -188,7 +453,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
188
453
|
limit = self.safe_integer(self.options, 'tradesLimit', 1000)
|
189
454
|
self.myTrades = ArrayCacheBySymbolById(limit)
|
190
455
|
trades = self.myTrades
|
191
|
-
symbols = {}
|
456
|
+
symbols: dict = {}
|
192
457
|
data = self.safe_list(entry, 'fills', [])
|
193
458
|
dataLength = len(data)
|
194
459
|
if dataLength == 0:
|
@@ -208,24 +473,27 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
208
473
|
client.resolve(trades, messageHash)
|
209
474
|
|
210
475
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
476
|
+
# s
|
477
|
+
# @method
|
478
|
+
# @name hyperliquid#watchTrades
|
479
|
+
# @description watches information on multiple trades made in a market
|
480
|
+
# @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
481
|
+
# @param {string} symbol unified market symbol of the market trades were made in
|
482
|
+
# @param {int} [since] the earliest time in ms to fetch trades for
|
483
|
+
# @param {int} [limit] the maximum number of trade structures to retrieve
|
484
|
+
# @param {object} [params] extra parameters specific to the exchange API endpoint
|
485
|
+
# @returns {object[]} a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
486
|
+
#
|
219
487
|
await self.load_markets()
|
220
488
|
market = self.market(symbol)
|
221
489
|
symbol = market['symbol']
|
222
490
|
messageHash = 'trade:' + symbol
|
223
491
|
url = self.urls['api']['ws']['public']
|
224
|
-
request = {
|
492
|
+
request: dict = {
|
225
493
|
'method': 'subscribe',
|
226
494
|
'subscription': {
|
227
495
|
'type': 'trades',
|
228
|
-
'coin': market['base'],
|
496
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
229
497
|
},
|
230
498
|
}
|
231
499
|
message = self.extend(request, params)
|
@@ -234,6 +502,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
234
502
|
limit = trades.getLimit(symbol, limit)
|
235
503
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
236
504
|
|
505
|
+
async def un_watch_trades(self, symbol: str, params={}) -> Any:
|
506
|
+
"""
|
507
|
+
unWatches information on multiple trades made in a market
|
508
|
+
|
509
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
510
|
+
|
511
|
+
:param str symbol: unified market symbol of the market trades were made in
|
512
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
513
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
514
|
+
"""
|
515
|
+
await self.load_markets()
|
516
|
+
market = self.market(symbol)
|
517
|
+
symbol = market['symbol']
|
518
|
+
subMessageHash = 'trade:' + symbol
|
519
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
520
|
+
url = self.urls['api']['ws']['public']
|
521
|
+
request: dict = {
|
522
|
+
'method': 'unsubscribe',
|
523
|
+
'subscription': {
|
524
|
+
'type': 'trades',
|
525
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
526
|
+
},
|
527
|
+
}
|
528
|
+
message = self.extend(request, params)
|
529
|
+
return await self.watch(url, messageHash, message, messageHash)
|
530
|
+
|
237
531
|
def handle_trades(self, client: Client, message):
|
238
532
|
#
|
239
533
|
# {
|
@@ -254,7 +548,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
254
548
|
entry = self.safe_list(message, 'data', [])
|
255
549
|
first = self.safe_dict(entry, 0, {})
|
256
550
|
coin = self.safe_string(first, 'coin')
|
257
|
-
marketId = coin
|
551
|
+
marketId = self.coinToMarketId(coin)
|
258
552
|
market = self.market(marketId)
|
259
553
|
symbol = market['symbol']
|
260
554
|
if not (symbol in self.trades):
|
@@ -269,7 +563,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
269
563
|
messageHash = 'trade:' + symbol
|
270
564
|
client.resolve(trades, messageHash)
|
271
565
|
|
272
|
-
def parse_ws_trade(self, trade, market: Market = None) -> Trade:
|
566
|
+
def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
|
273
567
|
#
|
274
568
|
# fetchMyTrades
|
275
569
|
#
|
@@ -307,7 +601,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
307
601
|
price = self.safe_string(trade, 'px')
|
308
602
|
amount = self.safe_string(trade, 'sz')
|
309
603
|
coin = self.safe_string(trade, 'coin')
|
310
|
-
marketId = coin
|
604
|
+
marketId = self.coinToMarketId(coin)
|
311
605
|
market = self.safe_market(marketId, None)
|
312
606
|
symbol = market['symbol']
|
313
607
|
id = self.safe_string(trade, 'tid')
|
@@ -334,6 +628,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
334
628
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
335
629
|
"""
|
336
630
|
watches historical candlestick data containing the open, high, low, close price, and the volume of a market
|
631
|
+
|
632
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
633
|
+
|
337
634
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
338
635
|
:param str timeframe: the length of time each candle represents
|
339
636
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -345,11 +642,11 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
345
642
|
market = self.market(symbol)
|
346
643
|
symbol = market['symbol']
|
347
644
|
url = self.urls['api']['ws']['public']
|
348
|
-
request = {
|
645
|
+
request: dict = {
|
349
646
|
'method': 'subscribe',
|
350
647
|
'subscription': {
|
351
648
|
'type': 'candle',
|
352
|
-
'coin': market['base'],
|
649
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
353
650
|
'interval': timeframe,
|
354
651
|
},
|
355
652
|
}
|
@@ -360,6 +657,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
360
657
|
limit = ohlcv.getLimit(symbol, limit)
|
361
658
|
return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
|
362
659
|
|
660
|
+
async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
|
661
|
+
"""
|
662
|
+
watches historical candlestick data containing the open, high, low, close price, and the volume of a market
|
663
|
+
|
664
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
665
|
+
|
666
|
+
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
667
|
+
:param str timeframe: the length of time each candle represents
|
668
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
669
|
+
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
670
|
+
"""
|
671
|
+
await self.load_markets()
|
672
|
+
market = self.market(symbol)
|
673
|
+
symbol = market['symbol']
|
674
|
+
url = self.urls['api']['ws']['public']
|
675
|
+
request: dict = {
|
676
|
+
'method': 'unsubscribe',
|
677
|
+
'subscription': {
|
678
|
+
'type': 'candle',
|
679
|
+
'coin': market['base'] if market['swap'] else market['id'],
|
680
|
+
'interval': timeframe,
|
681
|
+
},
|
682
|
+
}
|
683
|
+
subMessageHash = 'candles:' + timeframe + ':' + symbol
|
684
|
+
messagehash = 'unsubscribe:' + subMessageHash
|
685
|
+
message = self.extend(request, params)
|
686
|
+
return await self.watch(url, messagehash, message, messagehash)
|
687
|
+
|
363
688
|
def handle_ohlcv(self, client: Client, message):
|
364
689
|
#
|
365
690
|
# {
|
@@ -380,7 +705,8 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
380
705
|
#
|
381
706
|
data = self.safe_dict(message, 'data', {})
|
382
707
|
base = self.safe_string(data, 's')
|
383
|
-
|
708
|
+
marketId = self.coinToMarketId(base)
|
709
|
+
symbol = self.safe_symbol(marketId)
|
384
710
|
timeframe = self.safe_string(data, 'i')
|
385
711
|
if not (symbol in self.ohlcvs):
|
386
712
|
self.ohlcvs[symbol] = {}
|
@@ -394,15 +720,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
394
720
|
messageHash = 'candles:' + timeframe + ':' + symbol
|
395
721
|
client.resolve(ohlcv, messageHash)
|
396
722
|
|
723
|
+
def handle_ws_post(self, client: Client, message: dict):
|
724
|
+
# {
|
725
|
+
# channel: "post",
|
726
|
+
# data: {
|
727
|
+
# id: <number>,
|
728
|
+
# response: {
|
729
|
+
# type: "info" | "action" | "error",
|
730
|
+
# payload: {...}
|
731
|
+
# }
|
732
|
+
# }
|
733
|
+
data = self.safe_dict(message, 'data')
|
734
|
+
id = self.safe_string(data, 'id')
|
735
|
+
response = self.safe_dict(data, 'response')
|
736
|
+
payload = self.safe_dict(response, 'payload')
|
737
|
+
client.resolve(payload, id)
|
738
|
+
|
397
739
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
398
740
|
"""
|
399
741
|
watches information on multiple orders made by the user
|
742
|
+
|
743
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
744
|
+
|
400
745
|
:param str symbol: unified market symbol of the market orders were made in
|
401
746
|
:param int [since]: the earliest time in ms to fetch orders for
|
402
747
|
:param int [limit]: the maximum number of order structures to retrieve
|
403
748
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
404
749
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
405
|
-
:returns dict[]: a list of
|
750
|
+
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
406
751
|
"""
|
407
752
|
await self.load_markets()
|
408
753
|
userAddress = None
|
@@ -414,7 +759,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
414
759
|
symbol = market['symbol']
|
415
760
|
messageHash = messageHash + ':' + symbol
|
416
761
|
url = self.urls['api']['ws']['public']
|
417
|
-
request = {
|
762
|
+
request: dict = {
|
418
763
|
'method': 'subscribe',
|
419
764
|
'subscription': {
|
420
765
|
'type': 'orderUpdates',
|
@@ -457,7 +802,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
457
802
|
return
|
458
803
|
stored = self.orders
|
459
804
|
messageHash = 'order'
|
460
|
-
marketSymbols = {}
|
805
|
+
marketSymbols: dict = {}
|
461
806
|
for i in range(0, len(data)):
|
462
807
|
rawOrder = data[i]
|
463
808
|
order = self.parse_order(rawOrder)
|
@@ -485,17 +830,124 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
485
830
|
else:
|
486
831
|
return False
|
487
832
|
|
833
|
+
def handle_order_book_unsubscription(self, client: Client, subscription: dict):
|
834
|
+
#
|
835
|
+
# "subscription":{
|
836
|
+
# "type":"l2Book",
|
837
|
+
# "coin":"BTC",
|
838
|
+
# "nSigFigs":5,
|
839
|
+
# "mantissa":null
|
840
|
+
# }
|
841
|
+
#
|
842
|
+
coin = self.safe_string(subscription, 'coin')
|
843
|
+
marketId = self.coinToMarketId(coin)
|
844
|
+
symbol = self.safe_symbol(marketId)
|
845
|
+
subMessageHash = 'orderbook:' + symbol
|
846
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
847
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
848
|
+
if symbol in self.orderbooks:
|
849
|
+
del self.orderbooks[symbol]
|
850
|
+
|
851
|
+
def handle_trades_unsubscription(self, client: Client, subscription: dict):
|
852
|
+
#
|
853
|
+
coin = self.safe_string(subscription, 'coin')
|
854
|
+
marketId = self.coinToMarketId(coin)
|
855
|
+
symbol = self.safe_symbol(marketId)
|
856
|
+
subMessageHash = 'trade:' + symbol
|
857
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
858
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
859
|
+
if symbol in self.trades:
|
860
|
+
del self.trades[symbol]
|
861
|
+
|
862
|
+
def handle_tickers_unsubscription(self, client: Client, subscription: dict):
|
863
|
+
#
|
864
|
+
subMessageHash = 'tickers'
|
865
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
866
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
867
|
+
symbols = list(self.tickers.keys())
|
868
|
+
for i in range(0, len(symbols)):
|
869
|
+
del self.tickers[symbols[i]]
|
870
|
+
|
871
|
+
def handle_ohlcv_unsubscription(self, client: Client, subscription: dict):
|
872
|
+
coin = self.safe_string(subscription, 'coin')
|
873
|
+
marketId = self.coinToMarketId(coin)
|
874
|
+
symbol = self.safe_symbol(marketId)
|
875
|
+
interval = self.safe_string(subscription, 'interval')
|
876
|
+
timeframe = self.find_timeframe(interval)
|
877
|
+
subMessageHash = 'candles:' + timeframe + ':' + symbol
|
878
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
879
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
880
|
+
if symbol in self.ohlcvs:
|
881
|
+
if timeframe in self.ohlcvs[symbol]:
|
882
|
+
del self.ohlcvs[symbol][timeframe]
|
883
|
+
|
884
|
+
def handle_subscription_response(self, client: Client, message):
|
885
|
+
# {
|
886
|
+
# "channel":"subscriptionResponse",
|
887
|
+
# "data":{
|
888
|
+
# "method":"unsubscribe",
|
889
|
+
# "subscription":{
|
890
|
+
# "type":"l2Book",
|
891
|
+
# "coin":"BTC",
|
892
|
+
# "nSigFigs":5,
|
893
|
+
# "mantissa":null
|
894
|
+
# }
|
895
|
+
# }
|
896
|
+
# }
|
897
|
+
#
|
898
|
+
# {
|
899
|
+
# "channel":"subscriptionResponse",
|
900
|
+
# "data":{
|
901
|
+
# "method":"unsubscribe",
|
902
|
+
# "subscription":{
|
903
|
+
# "type":"trades",
|
904
|
+
# "coin":"PURR/USDC"
|
905
|
+
# }
|
906
|
+
# }
|
907
|
+
# }
|
908
|
+
#
|
909
|
+
data = self.safe_dict(message, 'data', {})
|
910
|
+
method = self.safe_string(data, 'method')
|
911
|
+
if method == 'unsubscribe':
|
912
|
+
subscription = self.safe_dict(data, 'subscription', {})
|
913
|
+
type = self.safe_string(subscription, 'type')
|
914
|
+
if type == 'l2Book':
|
915
|
+
self.handle_order_book_unsubscription(client, subscription)
|
916
|
+
elif type == 'trades':
|
917
|
+
self.handle_trades_unsubscription(client, subscription)
|
918
|
+
elif type == 'webData2':
|
919
|
+
self.handle_tickers_unsubscription(client, subscription)
|
920
|
+
elif type == 'candle':
|
921
|
+
self.handle_ohlcv_unsubscription(client, subscription)
|
922
|
+
|
488
923
|
def handle_message(self, client: Client, message):
|
924
|
+
#
|
925
|
+
# {
|
926
|
+
# "channel":"subscriptionResponse",
|
927
|
+
# "data":{
|
928
|
+
# "method":"unsubscribe",
|
929
|
+
# "subscription":{
|
930
|
+
# "type":"l2Book",
|
931
|
+
# "coin":"BTC",
|
932
|
+
# "nSigFigs":5,
|
933
|
+
# "mantissa":null
|
934
|
+
# }
|
935
|
+
# }
|
936
|
+
# }
|
937
|
+
#
|
489
938
|
if self.handle_error_message(client, message):
|
490
939
|
return
|
491
940
|
topic = self.safe_string(message, 'channel', '')
|
492
|
-
methods = {
|
941
|
+
methods: dict = {
|
493
942
|
'pong': self.handle_pong,
|
494
943
|
'trades': self.handle_trades,
|
495
944
|
'l2Book': self.handle_order_book,
|
496
945
|
'candle': self.handle_ohlcv,
|
497
946
|
'orderUpdates': self.handle_order,
|
498
947
|
'userFills': self.handle_my_trades,
|
948
|
+
'webData2': self.handle_ws_tickers,
|
949
|
+
'post': self.handle_ws_post,
|
950
|
+
'subscriptionResponse': self.handle_subscription_response,
|
499
951
|
}
|
500
952
|
exacMethod = self.safe_value(methods, topic)
|
501
953
|
if exacMethod is not None:
|
@@ -509,7 +961,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
509
961
|
method(client, message)
|
510
962
|
return
|
511
963
|
|
512
|
-
def ping(self, client):
|
964
|
+
def ping(self, client: Client):
|
513
965
|
return {
|
514
966
|
'method': 'ping',
|
515
967
|
}
|
@@ -522,3 +974,22 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
522
974
|
#
|
523
975
|
client.lastPong = self.safe_integer(message, 'pong')
|
524
976
|
return message
|
977
|
+
|
978
|
+
def request_id(self) -> float:
|
979
|
+
requestId = self.sum(self.safe_integer(self.options, 'requestId', 0), 1)
|
980
|
+
self.options['requestId'] = requestId
|
981
|
+
return requestId
|
982
|
+
|
983
|
+
def wrap_as_post_action(self, request: dict) -> dict:
|
984
|
+
requestId = self.request_id()
|
985
|
+
return {
|
986
|
+
'requestId': requestId,
|
987
|
+
'request': {
|
988
|
+
'method': 'post',
|
989
|
+
'id': requestId,
|
990
|
+
'request': {
|
991
|
+
'type': 'action',
|
992
|
+
'payload': request,
|
993
|
+
},
|
994
|
+
},
|
995
|
+
}
|