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/p2b.py
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
import ccxt.async_support
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheByTimestamp
|
8
|
-
from ccxt.base.types import Int, OrderBook, Ticker, Trade
|
8
|
+
from ccxt.base.types import Int, OrderBook, Strings, Ticker, Tickers, Trade
|
9
9
|
from ccxt.async_support.base.ws.client import Client
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
@@ -34,8 +34,9 @@ class p2b(ccxt.async_support.p2b):
|
|
34
34
|
'watchOrders': False,
|
35
35
|
# 'watchStatus': True,
|
36
36
|
'watchTicker': True,
|
37
|
-
'watchTickers':
|
37
|
+
'watchTickers': True,
|
38
38
|
'watchTrades': True,
|
39
|
+
'watchTradesForSymbols': True,
|
39
40
|
},
|
40
41
|
'urls': {
|
41
42
|
'api': {
|
@@ -57,6 +58,7 @@ class p2b(ccxt.async_support.p2b):
|
|
57
58
|
'watchTickers': {
|
58
59
|
'name': 'state', # or 'price'
|
59
60
|
},
|
61
|
+
'tickerSubs': self.create_safe_dictionary(),
|
60
62
|
},
|
61
63
|
'streaming': {
|
62
64
|
'ping': self.ping,
|
@@ -65,7 +67,7 @@ class p2b(ccxt.async_support.p2b):
|
|
65
67
|
|
66
68
|
async def subscribe(self, name: str, messageHash: str, request, params={}):
|
67
69
|
"""
|
68
|
-
|
70
|
+
@ignore
|
69
71
|
Connects to a websocket channel
|
70
72
|
:param str name: name of the channel
|
71
73
|
:param str messageHash: string to look up in handler
|
@@ -74,7 +76,7 @@ class p2b(ccxt.async_support.p2b):
|
|
74
76
|
:returns dict: data from the websocket stream
|
75
77
|
"""
|
76
78
|
url = self.urls['api']['ws']
|
77
|
-
subscribe = {
|
79
|
+
subscribe: dict = {
|
78
80
|
'method': name,
|
79
81
|
'params': request,
|
80
82
|
'id': self.milliseconds(),
|
@@ -85,7 +87,9 @@ class p2b(ccxt.async_support.p2b):
|
|
85
87
|
async def watch_ohlcv(self, symbol: str, timeframe='15m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
86
88
|
"""
|
87
89
|
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market. Can only subscribe to one timeframe at a time for each symbol
|
88
|
-
|
90
|
+
|
91
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#kline-candlestick
|
92
|
+
|
89
93
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
90
94
|
:param str timeframe: 15m, 30m, 1h or 1d
|
91
95
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -112,49 +116,112 @@ class p2b(ccxt.async_support.p2b):
|
|
112
116
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
113
117
|
"""
|
114
118
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
115
|
-
|
116
|
-
|
119
|
+
|
120
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#last-price
|
121
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#market-status
|
122
|
+
|
117
123
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
118
124
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
119
125
|
:param dict [params.method]: 'state'(default) or 'price'
|
120
126
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
121
127
|
"""
|
122
128
|
await self.load_markets()
|
123
|
-
watchTickerOptions = self.
|
129
|
+
watchTickerOptions = self.safe_dict(self.options, 'watchTicker')
|
124
130
|
name = self.safe_string(watchTickerOptions, 'name', 'state') # or price
|
125
131
|
name, params = self.handle_option_and_params(params, 'method', 'name', name)
|
126
132
|
market = self.market(symbol)
|
127
|
-
|
128
|
-
|
129
|
-
]
|
133
|
+
symbol = market['symbol']
|
134
|
+
self.options['tickerSubs'][market['id']] = True # we need to re-subscribe to all tickers upon watching a new ticker
|
135
|
+
tickerSubs = self.options['tickerSubs']
|
136
|
+
request = list(tickerSubs.keys())
|
130
137
|
messageHash = name + '::' + market['symbol']
|
131
138
|
return await self.subscribe(name + '.subscribe', messageHash, request, params)
|
132
139
|
|
140
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
141
|
+
"""
|
142
|
+
|
143
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#last-price
|
144
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#market-status
|
145
|
+
|
146
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
147
|
+
:param str[] [symbols]: unified symbol of the market to fetch the ticker for
|
148
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
149
|
+
:param dict [params.method]: 'state'(default) or 'price'
|
150
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
151
|
+
"""
|
152
|
+
await self.load_markets()
|
153
|
+
symbols = self.market_symbols(symbols, None, False)
|
154
|
+
watchTickerOptions = self.safe_dict(self.options, 'watchTicker')
|
155
|
+
name = self.safe_string(watchTickerOptions, 'name', 'state') # or price
|
156
|
+
name, params = self.handle_option_and_params(params, 'method', 'name', name)
|
157
|
+
messageHashes = []
|
158
|
+
args = []
|
159
|
+
for i in range(0, len(symbols)):
|
160
|
+
market = self.market(symbols[i])
|
161
|
+
messageHashes.append(name + '::' + market['symbol'])
|
162
|
+
args.append(market['id'])
|
163
|
+
url = self.urls['api']['ws']
|
164
|
+
request: dict = {
|
165
|
+
'method': name + '.subscribe',
|
166
|
+
'params': args,
|
167
|
+
'id': self.milliseconds(),
|
168
|
+
}
|
169
|
+
await self.watch_multiple(url, messageHashes, self.extend(request, params), messageHashes)
|
170
|
+
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
171
|
+
|
133
172
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
134
173
|
"""
|
135
174
|
get the list of most recent trades for a particular symbol
|
136
|
-
|
175
|
+
|
176
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#deals
|
177
|
+
|
137
178
|
:param str symbol: unified symbol of the market to fetch trades for
|
138
179
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
139
180
|
:param int [limit]: the maximum amount of trades to fetch
|
140
181
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
141
182
|
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
142
183
|
"""
|
184
|
+
return await self.watch_trades_for_symbols([symbol], since, limit, params)
|
185
|
+
|
186
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
187
|
+
"""
|
188
|
+
get the list of most recent trades for a list of symbols
|
189
|
+
|
190
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#deals
|
191
|
+
|
192
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
193
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
194
|
+
:param int [limit]: the maximum amount of trades to fetch
|
195
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
196
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
197
|
+
"""
|
143
198
|
await self.load_markets()
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
199
|
+
symbols = self.market_symbols(symbols, None, False, True, True)
|
200
|
+
messageHashes = []
|
201
|
+
if symbols is not None:
|
202
|
+
for i in range(0, len(symbols)):
|
203
|
+
messageHashes.append('deals::' + symbols[i])
|
204
|
+
marketIds = self.market_ids(symbols)
|
205
|
+
url = self.urls['api']['ws']
|
206
|
+
subscribe: dict = {
|
207
|
+
'method': 'deals.subscribe',
|
208
|
+
'params': marketIds,
|
209
|
+
'id': self.milliseconds(),
|
210
|
+
}
|
211
|
+
query = self.extend(subscribe, params)
|
212
|
+
trades = await self.watch_multiple(url, messageHashes, query, messageHashes)
|
150
213
|
if self.newUpdates:
|
151
|
-
|
214
|
+
first = self.safe_value(trades, 0)
|
215
|
+
tradeSymbol = self.safe_string(first, 'symbol')
|
216
|
+
limit = trades.getLimit(tradeSymbol, limit)
|
152
217
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
153
218
|
|
154
219
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
155
220
|
"""
|
156
221
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
157
|
-
|
222
|
+
|
223
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#depth-of-market
|
224
|
+
|
158
225
|
:param str symbol: unified symbol of the market to fetch the order book for
|
159
226
|
:param int [limit]: 1-100, default=100
|
160
227
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -307,6 +374,7 @@ class p2b(ccxt.async_support.p2b):
|
|
307
374
|
else:
|
308
375
|
ticker = self.parse_ticker(tickerData, market)
|
309
376
|
symbol = ticker['symbol']
|
377
|
+
self.tickers[symbol] = ticker
|
310
378
|
messageHash = messageHashStart + '::' + symbol
|
311
379
|
client.resolve(ticker, messageHash)
|
312
380
|
return message
|
@@ -369,7 +437,7 @@ class p2b(ccxt.async_support.p2b):
|
|
369
437
|
self.handle_pong(client, message)
|
370
438
|
return
|
371
439
|
method = self.safe_string(message, 'method')
|
372
|
-
methods = {
|
440
|
+
methods: dict = {
|
373
441
|
'depth.update': self.handle_order_book,
|
374
442
|
'price.update': self.handle_ticker,
|
375
443
|
'kline.update': self.handle_ohlcv,
|
@@ -386,10 +454,10 @@ class p2b(ccxt.async_support.p2b):
|
|
386
454
|
raise ExchangeError(self.id + ' error: ' + self.json(error))
|
387
455
|
return False
|
388
456
|
|
389
|
-
def ping(self, client):
|
457
|
+
def ping(self, client: Client):
|
390
458
|
"""
|
391
|
-
|
392
|
-
|
459
|
+
https://github.com/P2B-team/P2B-WSS-Public/blob/main/wss_documentation.md#ping
|
460
|
+
@param client
|
393
461
|
"""
|
394
462
|
return {
|
395
463
|
'method': 'server.ping',
|
@@ -407,3 +475,11 @@ class p2b(ccxt.async_support.p2b):
|
|
407
475
|
#
|
408
476
|
client.lastPong = self.safe_integer(message, 'id')
|
409
477
|
return message
|
478
|
+
|
479
|
+
def on_error(self, client: Client, error):
|
480
|
+
self.options['tickerSubs'] = self.create_safe_dictionary()
|
481
|
+
self.on_error(client, error)
|
482
|
+
|
483
|
+
def on_close(self, client: Client, error):
|
484
|
+
self.options['tickerSubs'] = self.create_safe_dictionary()
|
485
|
+
self.on_close(client, error)
|
ccxt/pro/paradex.py
ADDED
@@ -0,0 +1,352 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
4
|
+
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
5
|
+
|
6
|
+
import ccxt.async_support
|
7
|
+
from ccxt.async_support.base.ws.cache import ArrayCache
|
8
|
+
from ccxt.base.types import Int, OrderBook, Strings, Ticker, Tickers, Trade
|
9
|
+
from ccxt.async_support.base.ws.client import Client
|
10
|
+
from typing import List
|
11
|
+
|
12
|
+
|
13
|
+
class paradex(ccxt.async_support.paradex):
|
14
|
+
|
15
|
+
def describe(self):
|
16
|
+
return self.deep_extend(super(paradex, self).describe(), {
|
17
|
+
'has': {
|
18
|
+
'ws': True,
|
19
|
+
'watchTicker': True,
|
20
|
+
'watchTickers': True,
|
21
|
+
'watchOrderBook': True,
|
22
|
+
'watchOrders': False,
|
23
|
+
'watchTrades': True,
|
24
|
+
'watchTradesForSymbols': False,
|
25
|
+
'watchBalance': False,
|
26
|
+
'watchOHLCV': False,
|
27
|
+
},
|
28
|
+
'urls': {
|
29
|
+
'logo': 'https://x.com/tradeparadex/photo',
|
30
|
+
'api': {
|
31
|
+
'ws': 'wss://ws.api.prod.paradex.trade/v1',
|
32
|
+
},
|
33
|
+
'test': {
|
34
|
+
'ws': 'wss://ws.api.testnet.paradex.trade/v1',
|
35
|
+
},
|
36
|
+
'www': 'https://www.paradex.trade/',
|
37
|
+
'doc': 'https://docs.api.testnet.paradex.trade/',
|
38
|
+
'fees': 'https://docs.paradex.trade/getting-started/trading-fees',
|
39
|
+
'referral': '',
|
40
|
+
},
|
41
|
+
'options': {},
|
42
|
+
'streaming': {},
|
43
|
+
})
|
44
|
+
|
45
|
+
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
46
|
+
"""
|
47
|
+
get the list of most recent trades for a particular symbol
|
48
|
+
|
49
|
+
https://docs.api.testnet.paradex.trade/#sub-trades-market_symbol-operation
|
50
|
+
|
51
|
+
:param str symbol: unified symbol of the market to fetch trades for
|
52
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
53
|
+
:param int [limit]: the maximum amount of trades to fetch
|
54
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
55
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
56
|
+
"""
|
57
|
+
await self.load_markets()
|
58
|
+
messageHash = 'trades.'
|
59
|
+
if symbol is not None:
|
60
|
+
market = self.market(symbol)
|
61
|
+
messageHash += market['id']
|
62
|
+
else:
|
63
|
+
messageHash += 'ALL'
|
64
|
+
url = self.urls['api']['ws']
|
65
|
+
request: dict = {
|
66
|
+
'jsonrpc': '2.0',
|
67
|
+
'method': 'subscribe',
|
68
|
+
'params': {
|
69
|
+
'channel': messageHash,
|
70
|
+
},
|
71
|
+
}
|
72
|
+
trades = await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
|
73
|
+
if self.newUpdates:
|
74
|
+
limit = trades.getLimit(symbol, limit)
|
75
|
+
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
76
|
+
|
77
|
+
def handle_trade(self, client: Client, message):
|
78
|
+
#
|
79
|
+
# {
|
80
|
+
# "jsonrpc": "2.0",
|
81
|
+
# "method": "subscription",
|
82
|
+
# "params": {
|
83
|
+
# "channel": "trades.ALL",
|
84
|
+
# "data": {
|
85
|
+
# "id": "1718179273230201709233240002",
|
86
|
+
# "market": "kBONK-USD-PERP",
|
87
|
+
# "side": "BUY",
|
88
|
+
# "size": "34028",
|
89
|
+
# "price": "0.028776",
|
90
|
+
# "created_at": 1718179273230,
|
91
|
+
# "trade_type": "FILL"
|
92
|
+
# }
|
93
|
+
# }
|
94
|
+
# }
|
95
|
+
#
|
96
|
+
params = self.safe_dict(message, 'params', {})
|
97
|
+
data = self.safe_dict(params, 'data', {})
|
98
|
+
parsedTrade = self.parse_trade(data)
|
99
|
+
symbol = parsedTrade['symbol']
|
100
|
+
messageHash = self.safe_string(params, 'channel')
|
101
|
+
stored = self.safe_value(self.trades, symbol)
|
102
|
+
if stored is None:
|
103
|
+
stored = ArrayCache(self.safe_integer(self.options, 'tradesLimit', 1000))
|
104
|
+
self.trades[symbol] = stored
|
105
|
+
stored.append(parsedTrade)
|
106
|
+
client.resolve(stored, messageHash)
|
107
|
+
return message
|
108
|
+
|
109
|
+
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
110
|
+
"""
|
111
|
+
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
112
|
+
|
113
|
+
https://docs.api.testnet.paradex.trade/#sub-order_book-market_symbol-snapshot-15-refresh_rate-operation
|
114
|
+
|
115
|
+
:param str symbol: unified symbol of the market to fetch the order book for
|
116
|
+
:param int [limit]: the maximum amount of order book entries to return
|
117
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
118
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
119
|
+
"""
|
120
|
+
await self.load_markets()
|
121
|
+
market = self.market(symbol)
|
122
|
+
messageHash = 'order_book.' + market['id'] + '.snapshot@15@100ms'
|
123
|
+
url = self.urls['api']['ws']
|
124
|
+
request: dict = {
|
125
|
+
'jsonrpc': '2.0',
|
126
|
+
'method': 'subscribe',
|
127
|
+
'params': {
|
128
|
+
'channel': messageHash,
|
129
|
+
},
|
130
|
+
}
|
131
|
+
orderbook = await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
|
132
|
+
return orderbook.limit()
|
133
|
+
|
134
|
+
def handle_order_book(self, client: Client, message):
|
135
|
+
#
|
136
|
+
# {
|
137
|
+
# "jsonrpc": "2.0",
|
138
|
+
# "method": "subscription",
|
139
|
+
# "params": {
|
140
|
+
# "channel": "order_book.BTC-USD-PERP.snapshot@15@50ms",
|
141
|
+
# "data": {
|
142
|
+
# "seq_no": 14127815,
|
143
|
+
# "market": "BTC-USD-PERP",
|
144
|
+
# "last_updated_at": 1718267837265,
|
145
|
+
# "update_type": "s",
|
146
|
+
# "inserts": [
|
147
|
+
# {
|
148
|
+
# "side": "BUY",
|
149
|
+
# "price": "67629.7",
|
150
|
+
# "size": "0.992"
|
151
|
+
# },
|
152
|
+
# {
|
153
|
+
# "side": "SELL",
|
154
|
+
# "price": "69378.6",
|
155
|
+
# "size": "3.137"
|
156
|
+
# }
|
157
|
+
# ],
|
158
|
+
# "updates": [],
|
159
|
+
# "deletes": []
|
160
|
+
# }
|
161
|
+
# }
|
162
|
+
# }
|
163
|
+
#
|
164
|
+
params = self.safe_dict(message, 'params', {})
|
165
|
+
data = self.safe_dict(params, 'data', {})
|
166
|
+
marketId = self.safe_string(data, 'market')
|
167
|
+
market = self.safe_market(marketId)
|
168
|
+
timestamp = self.safe_integer(data, 'last_updated_at')
|
169
|
+
symbol = market['symbol']
|
170
|
+
if not (symbol in self.orderbooks):
|
171
|
+
self.orderbooks[symbol] = self.order_book()
|
172
|
+
orderbookData = {
|
173
|
+
'bids': [],
|
174
|
+
'asks': [],
|
175
|
+
}
|
176
|
+
inserts = self.safe_list(data, 'inserts')
|
177
|
+
for i in range(0, len(inserts)):
|
178
|
+
insert = self.safe_dict(inserts, i)
|
179
|
+
side = self.safe_string(insert, 'side')
|
180
|
+
price = self.safe_string(insert, 'price')
|
181
|
+
size = self.safe_string(insert, 'size')
|
182
|
+
if side == 'BUY':
|
183
|
+
orderbookData['bids'].append([price, size])
|
184
|
+
else:
|
185
|
+
orderbookData['asks'].append([price, size])
|
186
|
+
orderbook = self.orderbooks[symbol]
|
187
|
+
snapshot = self.parse_order_book(orderbookData, symbol, timestamp, 'bids', 'asks')
|
188
|
+
snapshot['nonce'] = self.safe_number(data, 'seq_no')
|
189
|
+
orderbook.reset(snapshot)
|
190
|
+
messageHash = self.safe_string(params, 'channel')
|
191
|
+
client.resolve(orderbook, messageHash)
|
192
|
+
|
193
|
+
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
194
|
+
"""
|
195
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
196
|
+
|
197
|
+
https://docs.api.testnet.paradex.trade/#sub-markets_summary-operation
|
198
|
+
|
199
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
200
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
201
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
202
|
+
"""
|
203
|
+
await self.load_markets()
|
204
|
+
symbol = self.symbol(symbol)
|
205
|
+
channel = 'markets_summary'
|
206
|
+
url = self.urls['api']['ws']
|
207
|
+
request: dict = {
|
208
|
+
'jsonrpc': '2.0',
|
209
|
+
'method': 'subscribe',
|
210
|
+
'params': {
|
211
|
+
'channel': channel,
|
212
|
+
},
|
213
|
+
}
|
214
|
+
messageHash = channel + '.' + symbol
|
215
|
+
return await self.watch(url, messageHash, self.deep_extend(request, params), messageHash)
|
216
|
+
|
217
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
218
|
+
"""
|
219
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
220
|
+
|
221
|
+
https://docs.api.testnet.paradex.trade/#sub-markets_summary-operation
|
222
|
+
|
223
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
224
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
225
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
226
|
+
"""
|
227
|
+
await self.load_markets()
|
228
|
+
symbols = self.market_symbols(symbols)
|
229
|
+
channel = 'markets_summary'
|
230
|
+
url = self.urls['api']['ws']
|
231
|
+
request: dict = {
|
232
|
+
'jsonrpc': '2.0',
|
233
|
+
'method': 'subscribe',
|
234
|
+
'params': {
|
235
|
+
'channel': channel,
|
236
|
+
},
|
237
|
+
}
|
238
|
+
messageHashes = []
|
239
|
+
if isinstance(symbols, list):
|
240
|
+
for i in range(0, len(symbols)):
|
241
|
+
messageHash = channel + '.' + symbols[i]
|
242
|
+
messageHashes.append(messageHash)
|
243
|
+
else:
|
244
|
+
messageHashes.append(channel)
|
245
|
+
newTickers = await self.watch_multiple(url, messageHashes, self.deep_extend(request, params), messageHashes)
|
246
|
+
if self.newUpdates:
|
247
|
+
result: dict = {}
|
248
|
+
result[newTickers['symbol']] = newTickers
|
249
|
+
return result
|
250
|
+
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
251
|
+
|
252
|
+
def handle_ticker(self, client: Client, message):
|
253
|
+
#
|
254
|
+
# {
|
255
|
+
# "jsonrpc": "2.0",
|
256
|
+
# "method": "subscription",
|
257
|
+
# "params": {
|
258
|
+
# "channel": "markets_summary",
|
259
|
+
# "data": {
|
260
|
+
# "symbol": "ORDI-USD-PERP",
|
261
|
+
# "oracle_price": "49.80885481",
|
262
|
+
# "mark_price": "49.80885481",
|
263
|
+
# "last_traded_price": "62.038",
|
264
|
+
# "bid": "49.822",
|
265
|
+
# "ask": "58.167",
|
266
|
+
# "volume_24h": "0",
|
267
|
+
# "total_volume": "54542628.66054200416",
|
268
|
+
# "created_at": 1718334307698,
|
269
|
+
# "underlying_price": "47.93",
|
270
|
+
# "open_interest": "6999.5",
|
271
|
+
# "funding_rate": "0.03919997509811",
|
272
|
+
# "price_change_rate_24h": ""
|
273
|
+
# }
|
274
|
+
# }
|
275
|
+
# }
|
276
|
+
#
|
277
|
+
params = self.safe_dict(message, 'params', {})
|
278
|
+
data = self.safe_dict(params, 'data', {})
|
279
|
+
marketId = self.safe_string(data, 'symbol')
|
280
|
+
market = self.safe_market(marketId)
|
281
|
+
symbol = market['symbol']
|
282
|
+
channel = self.safe_string(params, 'channel')
|
283
|
+
messageHash = channel + '.' + symbol
|
284
|
+
ticker = self.parse_ticker(data, market)
|
285
|
+
self.tickers[symbol] = ticker
|
286
|
+
client.resolve(ticker, channel)
|
287
|
+
client.resolve(ticker, messageHash)
|
288
|
+
return message
|
289
|
+
|
290
|
+
def handle_error_message(self, client: Client, message):
|
291
|
+
#
|
292
|
+
# {
|
293
|
+
# "jsonrpc": "2.0",
|
294
|
+
# "id": 0,
|
295
|
+
# "error": {
|
296
|
+
# "code": -32600,
|
297
|
+
# "message": "invalid subscribe request",
|
298
|
+
# "data": "invalid channel"
|
299
|
+
# },
|
300
|
+
# "usIn": 1718179125962419,
|
301
|
+
# "usDiff": 76,
|
302
|
+
# "usOut": 1718179125962495
|
303
|
+
# }
|
304
|
+
#
|
305
|
+
error = self.safe_dict(message, 'error')
|
306
|
+
if error is None:
|
307
|
+
return True
|
308
|
+
else:
|
309
|
+
errorCode = self.safe_string(error, 'code')
|
310
|
+
if errorCode is not None:
|
311
|
+
feedback = self.id + ' ' + self.json(error)
|
312
|
+
self.throw_exactly_matched_exception(self.exceptions['exact'], '-32600', feedback)
|
313
|
+
messageString = self.safe_value(error, 'message')
|
314
|
+
if messageString is not None:
|
315
|
+
self.throw_broadly_matched_exception(self.exceptions['broad'], messageString, feedback)
|
316
|
+
return False
|
317
|
+
|
318
|
+
def handle_message(self, client: Client, message):
|
319
|
+
if not self.handle_error_message(client, message):
|
320
|
+
return
|
321
|
+
#
|
322
|
+
# {
|
323
|
+
# "jsonrpc": "2.0",
|
324
|
+
# "method": "subscription",
|
325
|
+
# "params": {
|
326
|
+
# "channel": "trades.ALL",
|
327
|
+
# "data": {
|
328
|
+
# "id": "1718179273230201709233240002",
|
329
|
+
# "market": "kBONK-USD-PERP",
|
330
|
+
# "side": "BUY",
|
331
|
+
# "size": "34028",
|
332
|
+
# "price": "0.028776",
|
333
|
+
# "created_at": 1718179273230,
|
334
|
+
# "trade_type": "FILL"
|
335
|
+
# }
|
336
|
+
# }
|
337
|
+
# }
|
338
|
+
#
|
339
|
+
data = self.safe_dict(message, 'params')
|
340
|
+
if data is not None:
|
341
|
+
channel = self.safe_string(data, 'channel')
|
342
|
+
parts = channel.split('.')
|
343
|
+
name = self.safe_string(parts, 0)
|
344
|
+
methods: dict = {
|
345
|
+
'trades': self.handle_trade,
|
346
|
+
'order_book': self.handle_order_book,
|
347
|
+
'markets_summary': self.handle_ticker,
|
348
|
+
# ...
|
349
|
+
}
|
350
|
+
method = self.safe_value(methods, name)
|
351
|
+
if method is not None:
|
352
|
+
method(client, message)
|