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/coinbase.py
CHANGED
@@ -9,6 +9,7 @@ import hashlib
|
|
9
9
|
from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
12
|
+
from ccxt.base.errors import ArgumentsRequired
|
12
13
|
|
13
14
|
|
14
15
|
class coinbase(ccxt.async_support.coinbase):
|
@@ -30,10 +31,12 @@ class coinbase(ccxt.async_support.coinbase):
|
|
30
31
|
'watchMyTrades': False,
|
31
32
|
'watchOHLCV': False,
|
32
33
|
'watchOrderBook': True,
|
34
|
+
'watchOrderBookForSymbols': True,
|
33
35
|
'watchOrders': True,
|
34
36
|
'watchTicker': True,
|
35
37
|
'watchTickers': True,
|
36
38
|
'watchTrades': True,
|
39
|
+
'watchTradesForSymbols': True,
|
37
40
|
},
|
38
41
|
'urls': {
|
39
42
|
'api': {
|
@@ -51,18 +54,20 @@ class coinbase(ccxt.async_support.coinbase):
|
|
51
54
|
},
|
52
55
|
})
|
53
56
|
|
54
|
-
async def subscribe(self, name, symbol=None, params={}):
|
57
|
+
async def subscribe(self, name: str, isPrivate: bool, symbol=None, params={}):
|
55
58
|
"""
|
56
|
-
|
59
|
+
@ignore
|
57
60
|
subscribes to a websocket channel
|
58
|
-
|
61
|
+
|
62
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
|
63
|
+
|
59
64
|
:param str name: the name of the channel
|
60
|
-
:param
|
65
|
+
:param boolean isPrivate: whether the channel is private or not
|
66
|
+
:param str [symbol]: unified market symbol
|
61
67
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
62
68
|
:returns dict: subscription to a websocket channel
|
63
69
|
"""
|
64
70
|
await self.load_markets()
|
65
|
-
self.check_required_credentials()
|
66
71
|
market = None
|
67
72
|
messageHash = name
|
68
73
|
productIds = []
|
@@ -76,33 +81,94 @@ class coinbase(ccxt.async_support.coinbase):
|
|
76
81
|
messageHash = name + '::' + market['id']
|
77
82
|
productIds = [market['id']]
|
78
83
|
url = self.urls['api']['ws']
|
79
|
-
timestamp = self.number_to_string(self.seconds())
|
80
|
-
auth = timestamp + name + ','.join(productIds)
|
81
84
|
subscribe = {
|
82
85
|
'type': 'subscribe',
|
83
86
|
'product_ids': productIds,
|
84
87
|
'channel': name,
|
85
|
-
'api_key': self.apiKey,
|
86
|
-
'timestamp': timestamp,
|
87
|
-
'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
|
88
|
+
# 'api_key': self.apiKey,
|
89
|
+
# 'timestamp': timestamp,
|
90
|
+
# 'signature': self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256),
|
88
91
|
}
|
92
|
+
if isPrivate:
|
93
|
+
subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
|
89
94
|
return await self.watch(url, messageHash, subscribe, messageHash)
|
90
95
|
|
96
|
+
async def subscribe_multiple(self, name: str, isPrivate: bool, symbols: Strings = None, params={}):
|
97
|
+
"""
|
98
|
+
@ignore
|
99
|
+
subscribes to a websocket channel
|
100
|
+
|
101
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-overview#subscribe
|
102
|
+
|
103
|
+
:param str name: the name of the channel
|
104
|
+
:param boolean isPrivate: whether the channel is private or not
|
105
|
+
:param str[] [symbols]: unified market symbol
|
106
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
107
|
+
:returns dict: subscription to a websocket channel
|
108
|
+
"""
|
109
|
+
await self.load_markets()
|
110
|
+
productIds = []
|
111
|
+
messageHashes = []
|
112
|
+
symbols = self.market_symbols(symbols, None, False)
|
113
|
+
for i in range(0, len(symbols)):
|
114
|
+
symbol = symbols[i]
|
115
|
+
market = self.market(symbol)
|
116
|
+
marketId = market['id']
|
117
|
+
productIds.append(marketId)
|
118
|
+
messageHashes.append(name + '::' + marketId)
|
119
|
+
url = self.urls['api']['ws']
|
120
|
+
subscribe = {
|
121
|
+
'type': 'subscribe',
|
122
|
+
'product_ids': productIds,
|
123
|
+
'channel': name,
|
124
|
+
}
|
125
|
+
if isPrivate:
|
126
|
+
subscribe = self.extend(subscribe, self.create_ws_auth(name, productIds))
|
127
|
+
return await self.watch_multiple(url, messageHashes, subscribe, messageHashes)
|
128
|
+
|
129
|
+
def create_ws_auth(self, name: str, productIds: List[str]):
|
130
|
+
subscribe: dict = {}
|
131
|
+
timestamp = self.number_to_string(self.seconds())
|
132
|
+
self.check_required_credentials()
|
133
|
+
isCloudAPiKey = (self.apiKey.find('organizations/') >= 0) or (self.secret.startswith('-----BEGIN'))
|
134
|
+
auth = timestamp + name + ','.join(productIds)
|
135
|
+
if not isCloudAPiKey:
|
136
|
+
subscribe['api_key'] = self.apiKey
|
137
|
+
subscribe['timestamp'] = timestamp
|
138
|
+
subscribe['signature'] = self.hmac(self.encode(auth), self.encode(self.secret), hashlib.sha256)
|
139
|
+
else:
|
140
|
+
if self.apiKey.startswith('-----BEGIN'):
|
141
|
+
raise ArgumentsRequired(self.id + ' apiKey should contain the name(eg: organizations/3b910e93....) and not the public key')
|
142
|
+
currentToken = self.safe_string(self.options, 'wsToken')
|
143
|
+
tokenTimestamp = self.safe_integer(self.options, 'wsTokenTimestamp', 0)
|
144
|
+
seconds = self.seconds()
|
145
|
+
if currentToken is None or tokenTimestamp + 120 < seconds:
|
146
|
+
# we should generate new token
|
147
|
+
token = self.create_auth_token(seconds)
|
148
|
+
self.options['wsToken'] = token
|
149
|
+
self.options['wsTokenTimestamp'] = seconds
|
150
|
+
subscribe['jwt'] = self.safe_string(self.options, 'wsToken')
|
151
|
+
return subscribe
|
152
|
+
|
91
153
|
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
92
154
|
"""
|
93
155
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
94
|
-
|
156
|
+
|
157
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-channel
|
158
|
+
|
95
159
|
:param str [symbol]: unified symbol of the market to fetch the ticker for
|
96
160
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
97
161
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
98
162
|
"""
|
99
163
|
name = 'ticker'
|
100
|
-
return await self.subscribe(name, symbol, params)
|
164
|
+
return await self.subscribe(name, False, symbol, params)
|
101
165
|
|
102
166
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
103
167
|
"""
|
104
168
|
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
105
|
-
|
169
|
+
|
170
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#ticker-batch-channel
|
171
|
+
|
106
172
|
:param str[] [symbols]: unified symbol of the market to fetch the ticker for
|
107
173
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
108
174
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -110,7 +176,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
110
176
|
if symbols is None:
|
111
177
|
symbols = self.symbols
|
112
178
|
name = 'ticker_batch'
|
113
|
-
tickers = await self.subscribe(name, symbols, params)
|
179
|
+
tickers = await self.subscribe(name, False, symbols, params)
|
114
180
|
if self.newUpdates:
|
115
181
|
return tickers
|
116
182
|
return self.tickers
|
@@ -136,6 +202,11 @@ class coinbase(ccxt.async_support.coinbase):
|
|
136
202
|
# "low_52_w": "15460",
|
137
203
|
# "high_52_w": "48240",
|
138
204
|
# "price_percent_chg_24_h": "-4.15775596190603"
|
205
|
+
# new 2024-04-12
|
206
|
+
# "best_bid":"21835.29",
|
207
|
+
# "best_bid_quantity": "0.02000000",
|
208
|
+
# "best_ask":"23011.18",
|
209
|
+
# "best_ask_quantity": "0.01500000"
|
139
210
|
# }
|
140
211
|
# ]
|
141
212
|
# }
|
@@ -161,27 +232,68 @@ class coinbase(ccxt.async_support.coinbase):
|
|
161
232
|
# "low_52_w": "0.04908",
|
162
233
|
# "high_52_w": "0.1801",
|
163
234
|
# "price_percent_chg_24_h": "0.50177456859626"
|
235
|
+
# new 2024-04-12
|
236
|
+
# "best_bid":"0.07989",
|
237
|
+
# "best_bid_quantity": "500.0",
|
238
|
+
# "best_ask":"0.08308",
|
239
|
+
# "best_ask_quantity": "300.0"
|
240
|
+
# }
|
241
|
+
# ]
|
242
|
+
# }
|
243
|
+
# ]
|
244
|
+
# }
|
245
|
+
#
|
246
|
+
# note! seems coinbase might also send empty data like:
|
247
|
+
#
|
248
|
+
# {
|
249
|
+
# "channel": "ticker_batch",
|
250
|
+
# "client_id": "",
|
251
|
+
# "timestamp": "2024-05-24T18:22:24.546809523Z",
|
252
|
+
# "sequence_num": 1,
|
253
|
+
# "events": [
|
254
|
+
# {
|
255
|
+
# "type": "snapshot",
|
256
|
+
# "tickers": [
|
257
|
+
# {
|
258
|
+
# "type": "ticker",
|
259
|
+
# "product_id": "",
|
260
|
+
# "price": "",
|
261
|
+
# "volume_24_h": "",
|
262
|
+
# "low_24_h": "",
|
263
|
+
# "high_24_h": "",
|
264
|
+
# "low_52_w": "",
|
265
|
+
# "high_52_w": "",
|
266
|
+
# "price_percent_chg_24_h": ""
|
164
267
|
# }
|
165
268
|
# ]
|
166
269
|
# }
|
167
270
|
# ]
|
168
271
|
# }
|
169
272
|
#
|
273
|
+
#
|
170
274
|
channel = self.safe_string(message, 'channel')
|
171
275
|
events = self.safe_value(message, 'events', [])
|
276
|
+
datetime = self.safe_string(message, 'timestamp')
|
277
|
+
timestamp = self.parse8601(datetime)
|
172
278
|
newTickers = []
|
173
279
|
for i in range(0, len(events)):
|
174
280
|
tickersObj = events[i]
|
175
|
-
tickers = self.
|
281
|
+
tickers = self.safe_list(tickersObj, 'tickers', [])
|
176
282
|
for j in range(0, len(tickers)):
|
177
283
|
ticker = tickers[j]
|
178
284
|
result = self.parse_ws_ticker(ticker)
|
285
|
+
result['timestamp'] = timestamp
|
286
|
+
result['datetime'] = datetime
|
179
287
|
symbol = result['symbol']
|
180
288
|
self.tickers[symbol] = result
|
181
289
|
wsMarketId = self.safe_string(ticker, 'product_id')
|
290
|
+
if wsMarketId is None:
|
291
|
+
continue
|
182
292
|
messageHash = channel + '::' + wsMarketId
|
183
293
|
newTickers.append(result)
|
184
294
|
client.resolve(result, messageHash)
|
295
|
+
if messageHash.endswith('USD'):
|
296
|
+
client.resolve(result, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
185
297
|
messageHashes = self.find_message_hashes(client, 'ticker_batch::')
|
186
298
|
for i in range(0, len(messageHashes)):
|
187
299
|
messageHash = messageHashes[i]
|
@@ -191,6 +303,8 @@ class coinbase(ccxt.async_support.coinbase):
|
|
191
303
|
tickers = self.filter_by_array(newTickers, 'symbol', symbols)
|
192
304
|
if not self.is_empty(tickers):
|
193
305
|
client.resolve(tickers, messageHash)
|
306
|
+
if messageHash.endswith('USD'):
|
307
|
+
client.resolve(tickers, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
194
308
|
return message
|
195
309
|
|
196
310
|
def parse_ws_ticker(self, ticker, market=None):
|
@@ -205,6 +319,11 @@ class coinbase(ccxt.async_support.coinbase):
|
|
205
319
|
# "low_52_w": "0.04908",
|
206
320
|
# "high_52_w": "0.1801",
|
207
321
|
# "price_percent_chg_24_h": "0.50177456859626"
|
322
|
+
# new 2024-04-12
|
323
|
+
# "best_bid":"0.07989",
|
324
|
+
# "best_bid_quantity": "500.0",
|
325
|
+
# "best_ask":"0.08308",
|
326
|
+
# "best_ask_quantity": "300.0"
|
208
327
|
# }
|
209
328
|
#
|
210
329
|
marketId = self.safe_string(ticker, 'product_id')
|
@@ -217,10 +336,10 @@ class coinbase(ccxt.async_support.coinbase):
|
|
217
336
|
'datetime': self.iso8601(timestamp),
|
218
337
|
'high': self.safe_string(ticker, 'high_24_h'),
|
219
338
|
'low': self.safe_string(ticker, 'low_24_h'),
|
220
|
-
'bid':
|
221
|
-
'bidVolume':
|
222
|
-
'ask':
|
223
|
-
'askVolume':
|
339
|
+
'bid': self.safe_string(ticker, 'best_bid'),
|
340
|
+
'bidVolume': self.safe_string(ticker, 'best_bid_quantity'),
|
341
|
+
'ask': self.safe_string(ticker, 'best_ask'),
|
342
|
+
'askVolume': self.safe_string(ticker, 'best_ask_quantity'),
|
224
343
|
'vwap': None,
|
225
344
|
'open': None,
|
226
345
|
'close': last,
|
@@ -236,7 +355,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
236
355
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
237
356
|
"""
|
238
357
|
get the list of most recent trades for a particular symbol
|
239
|
-
|
358
|
+
|
359
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
|
360
|
+
|
240
361
|
:param str symbol: unified symbol of the market to fetch trades for
|
241
362
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
242
363
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -246,15 +367,38 @@ class coinbase(ccxt.async_support.coinbase):
|
|
246
367
|
await self.load_markets()
|
247
368
|
symbol = self.symbol(symbol)
|
248
369
|
name = 'market_trades'
|
249
|
-
trades = await self.subscribe(name, symbol, params)
|
370
|
+
trades = await self.subscribe(name, False, symbol, params)
|
250
371
|
if self.newUpdates:
|
251
372
|
limit = trades.getLimit(symbol, limit)
|
252
373
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
253
374
|
|
375
|
+
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
376
|
+
"""
|
377
|
+
get the list of most recent trades for a particular symbol
|
378
|
+
|
379
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#market-trades-channel
|
380
|
+
|
381
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
382
|
+
:param int [since]: timestamp in ms of the earliest trade to fetch
|
383
|
+
:param int [limit]: the maximum amount of trades to fetch
|
384
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
385
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
|
386
|
+
"""
|
387
|
+
await self.load_markets()
|
388
|
+
name = 'market_trades'
|
389
|
+
trades = await self.subscribe_multiple(name, False, symbols, params)
|
390
|
+
if self.newUpdates:
|
391
|
+
first = self.safe_dict(trades, 0)
|
392
|
+
tradeSymbol = self.safe_string(first, 'symbol')
|
393
|
+
limit = trades.getLimit(tradeSymbol, limit)
|
394
|
+
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
395
|
+
|
254
396
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
255
397
|
"""
|
256
398
|
watches information on multiple orders made by the user
|
257
|
-
|
399
|
+
|
400
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#user-channel
|
401
|
+
|
258
402
|
:param str [symbol]: unified market symbol of the market orders were made in
|
259
403
|
:param int [since]: the earliest time in ms to fetch orders for
|
260
404
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -263,7 +407,7 @@ class coinbase(ccxt.async_support.coinbase):
|
|
263
407
|
"""
|
264
408
|
await self.load_markets()
|
265
409
|
name = 'user'
|
266
|
-
orders = await self.subscribe(name, symbol, params)
|
410
|
+
orders = await self.subscribe(name, True, symbol, params)
|
267
411
|
if self.newUpdates:
|
268
412
|
limit = orders.getLimit(symbol, limit)
|
269
413
|
return self.filter_by_since_limit(orders, since, limit, 'timestamp', True)
|
@@ -271,7 +415,9 @@ class coinbase(ccxt.async_support.coinbase):
|
|
271
415
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
272
416
|
"""
|
273
417
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
274
|
-
|
418
|
+
|
419
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
|
420
|
+
|
275
421
|
:param str symbol: unified symbol of the market to fetch the order book for
|
276
422
|
:param int [limit]: the maximum amount of order book entries to return
|
277
423
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -281,7 +427,23 @@ class coinbase(ccxt.async_support.coinbase):
|
|
281
427
|
name = 'level2'
|
282
428
|
market = self.market(symbol)
|
283
429
|
symbol = market['symbol']
|
284
|
-
orderbook = await self.subscribe(name, symbol, params)
|
430
|
+
orderbook = await self.subscribe(name, False, symbol, params)
|
431
|
+
return orderbook.limit()
|
432
|
+
|
433
|
+
async def watch_order_book_for_symbols(self, symbols: List[str], limit: Int = None, params={}) -> OrderBook:
|
434
|
+
"""
|
435
|
+
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
436
|
+
|
437
|
+
https://docs.cloud.coinbase.com/advanced-trade-api/docs/ws-channels#level2-channel
|
438
|
+
|
439
|
+
:param str[] symbols: unified array of symbols
|
440
|
+
:param int [limit]: the maximum amount of order book entries to return
|
441
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
442
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
443
|
+
"""
|
444
|
+
await self.load_markets()
|
445
|
+
name = 'level2'
|
446
|
+
orderbook = await self.subscribe_multiple(name, False, symbols, params)
|
285
447
|
return orderbook.limit()
|
286
448
|
|
287
449
|
def handle_trade(self, client, message):
|
@@ -327,6 +489,8 @@ class coinbase(ccxt.async_support.coinbase):
|
|
327
489
|
item = currentTrades[i]
|
328
490
|
tradesArray.append(self.parse_trade(item))
|
329
491
|
client.resolve(tradesArray, messageHash)
|
492
|
+
if marketId.endswith('USD'):
|
493
|
+
client.resolve(tradesArray, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
330
494
|
return message
|
331
495
|
|
332
496
|
def handle_order(self, client, message):
|
@@ -378,6 +542,8 @@ class coinbase(ccxt.async_support.coinbase):
|
|
378
542
|
marketId = marketIds[i]
|
379
543
|
messageHash = 'user::' + marketId
|
380
544
|
client.resolve(self.orders, messageHash)
|
545
|
+
if messageHash.endswith('USD'):
|
546
|
+
client.resolve(self.orders, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
381
547
|
client.resolve(self.orders, 'user')
|
382
548
|
return message
|
383
549
|
|
@@ -484,10 +650,12 @@ class coinbase(ccxt.async_support.coinbase):
|
|
484
650
|
self.orderbooks[symbol] = self.order_book({}, limit)
|
485
651
|
orderbook = self.orderbooks[symbol]
|
486
652
|
self.handle_order_book_helper(orderbook, updates)
|
487
|
-
orderbook['timestamp'] =
|
488
|
-
orderbook['datetime'] =
|
653
|
+
orderbook['timestamp'] = self.parse8601(datetime)
|
654
|
+
orderbook['datetime'] = datetime
|
489
655
|
orderbook['symbol'] = symbol
|
490
656
|
client.resolve(orderbook, messageHash)
|
657
|
+
if messageHash.endswith('USD'):
|
658
|
+
client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
491
659
|
elif type == 'update':
|
492
660
|
orderbook = self.orderbooks[symbol]
|
493
661
|
self.handle_order_book_helper(orderbook, updates)
|
@@ -495,7 +663,8 @@ class coinbase(ccxt.async_support.coinbase):
|
|
495
663
|
orderbook['timestamp'] = self.parse8601(datetime)
|
496
664
|
orderbook['symbol'] = symbol
|
497
665
|
client.resolve(orderbook, messageHash)
|
498
|
-
|
666
|
+
if messageHash.endswith('USD'):
|
667
|
+
client.resolve(orderbook, messageHash + 'C') # sometimes we subscribe to BTC/USDC and coinbase returns BTC/USD
|
499
668
|
|
500
669
|
def handle_subscription_status(self, client, message):
|
501
670
|
#
|
@@ -511,19 +680,40 @@ class coinbase(ccxt.async_support.coinbase):
|
|
511
680
|
#
|
512
681
|
return message
|
513
682
|
|
683
|
+
def handle_heartbeats(self, client, message):
|
684
|
+
# although the subscription takes a product_ids parameter(i.e. symbol),
|
685
|
+
# there is no(clear) way of mapping the message back to the symbol.
|
686
|
+
#
|
687
|
+
# {
|
688
|
+
# "channel": "heartbeats",
|
689
|
+
# "client_id": "",
|
690
|
+
# "timestamp": "2023-06-23T20:31:26.122969572Z",
|
691
|
+
# "sequence_num": 0,
|
692
|
+
# "events": [
|
693
|
+
# {
|
694
|
+
# "current_time": "2023-06-23 20:31:56.121961769 +0000 UTC m=+91717.525857105",
|
695
|
+
# "heartbeat_counter": "3049"
|
696
|
+
# }
|
697
|
+
# ]
|
698
|
+
# }
|
699
|
+
#
|
700
|
+
return message
|
701
|
+
|
514
702
|
def handle_message(self, client, message):
|
515
703
|
channel = self.safe_string(message, 'channel')
|
516
|
-
methods = {
|
704
|
+
methods: dict = {
|
517
705
|
'subscriptions': self.handle_subscription_status,
|
518
706
|
'ticker': self.handle_tickers,
|
519
707
|
'ticker_batch': self.handle_tickers,
|
520
708
|
'market_trades': self.handle_trade,
|
521
709
|
'user': self.handle_order,
|
522
710
|
'l2_data': self.handle_order_book,
|
711
|
+
'heartbeats': self.handle_heartbeats,
|
523
712
|
}
|
524
713
|
type = self.safe_string(message, 'type')
|
525
714
|
if type == 'error':
|
526
715
|
errorMessage = self.safe_string(message, 'message')
|
527
716
|
raise ExchangeError(errorMessage)
|
528
717
|
method = self.safe_value(methods, channel)
|
529
|
-
method
|
718
|
+
if method:
|
719
|
+
method(client, message)
|
@@ -3,14 +3,14 @@
|
|
3
3
|
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
4
4
|
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
5
5
|
|
6
|
-
from ccxt.
|
7
|
-
from ccxt.abstract.hitbtc3 import ImplicitAPI
|
6
|
+
from ccxt.pro.coinbase import coinbase
|
8
7
|
|
9
8
|
|
10
|
-
class
|
9
|
+
class coinbaseadvanced(coinbase):
|
11
10
|
|
12
11
|
def describe(self):
|
13
|
-
return self.deep_extend(super(
|
14
|
-
'id': '
|
12
|
+
return self.deep_extend(super(coinbaseadvanced, self).describe(), {
|
13
|
+
'id': 'coinbaseadvanced',
|
14
|
+
'name': 'Coinbase Advanced',
|
15
15
|
'alias': True,
|
16
16
|
})
|
@@ -10,16 +10,16 @@ from ccxt.base.types import Int, Order, OrderBook, Str, Strings, Ticker, Tickers
|
|
10
10
|
from ccxt.async_support.base.ws.client import Client
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
|
+
from ccxt.base.errors import AuthenticationError
|
13
14
|
from ccxt.base.errors import ArgumentsRequired
|
14
15
|
from ccxt.base.errors import BadRequest
|
15
16
|
from ccxt.base.errors import BadSymbol
|
16
|
-
from ccxt.base.errors import AuthenticationError
|
17
17
|
|
18
18
|
|
19
|
-
class
|
19
|
+
class coinbaseexchange(ccxt.async_support.coinbaseexchange):
|
20
20
|
|
21
21
|
def describe(self):
|
22
|
-
return self.deep_extend(super(
|
22
|
+
return self.deep_extend(super(coinbaseexchange, self).describe(), {
|
23
23
|
'has': {
|
24
24
|
'ws': True,
|
25
25
|
'watchOHLCV': False, # missing on the exchange side
|
@@ -38,7 +38,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
38
38
|
},
|
39
39
|
'urls': {
|
40
40
|
'api': {
|
41
|
-
'ws': 'wss://ws-feed.
|
41
|
+
'ws': 'wss://ws-feed.exchange.coinbase.com',
|
42
42
|
},
|
43
43
|
'test': {
|
44
44
|
'ws': 'wss://ws-feed-public.sandbox.exchange.coinbase.com',
|
@@ -77,7 +77,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
77
77
|
if 'signature' in params:
|
78
78
|
# need to distinguish between public trades and user trades
|
79
79
|
url = url + '?'
|
80
|
-
subscribe = {
|
80
|
+
subscribe: dict = {
|
81
81
|
'type': 'subscribe',
|
82
82
|
'product_ids': productIds,
|
83
83
|
'channels': [
|
@@ -102,7 +102,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
102
102
|
if 'signature' in params:
|
103
103
|
# need to distinguish between public trades and user trades
|
104
104
|
url = url + '?'
|
105
|
-
subscribe = {
|
105
|
+
subscribe: dict = {
|
106
106
|
'type': 'subscribe',
|
107
107
|
'product_ids': productIds,
|
108
108
|
'channels': [
|
@@ -138,7 +138,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
138
138
|
messageHash = 'ticker'
|
139
139
|
ticker = await self.subscribe_multiple(channel, symbols, messageHash, params)
|
140
140
|
if self.newUpdates:
|
141
|
-
result = {}
|
141
|
+
result: dict = {}
|
142
142
|
result[ticker['symbol']] = ticker
|
143
143
|
return result
|
144
144
|
return self.filter_by_array(self.tickers, 'symbol', symbols)
|
@@ -163,7 +163,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
163
163
|
async def watch_trades_for_symbols(self, symbols: List[str], since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
164
164
|
"""
|
165
165
|
get the list of most recent trades for a particular symbol
|
166
|
-
:param str
|
166
|
+
:param str[] symbols: unified symbol of the market to fetch trades for
|
167
167
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
168
168
|
:param int [limit]: the maximum amount of trades to fetch
|
169
169
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -189,7 +189,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
189
189
|
:param int [since]: the earliest time in ms to fetch trades for
|
190
190
|
:param int [limit]: the maximum number of trade structures to retrieve
|
191
191
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
192
|
-
:returns dict[]: a list of
|
192
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
193
193
|
"""
|
194
194
|
if symbol is None:
|
195
195
|
raise ArgumentsRequired(self.id + ' watchMyTrades() requires a symbol argument')
|
@@ -210,7 +210,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
210
210
|
:param int [since]: the earliest time in ms to fetch trades for
|
211
211
|
:param int [limit]: the maximum number of trade structures to retrieve
|
212
212
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
213
|
-
:returns dict[]: a list of
|
213
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
214
214
|
"""
|
215
215
|
symbols = self.market_symbols(symbols, None, False)
|
216
216
|
await self.load_markets()
|
@@ -286,7 +286,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
286
286
|
marketId = marketIds[i]
|
287
287
|
messageHashes.append(name + ':' + marketId)
|
288
288
|
url = self.urls['api']['ws']
|
289
|
-
subscribe = {
|
289
|
+
subscribe: dict = {
|
290
290
|
'type': 'subscribe',
|
291
291
|
'product_ids': marketIds,
|
292
292
|
'channels': [
|
@@ -294,7 +294,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
294
294
|
],
|
295
295
|
}
|
296
296
|
request = self.extend(subscribe, params)
|
297
|
-
subscription = {
|
297
|
+
subscription: dict = {
|
298
298
|
'messageHash': name,
|
299
299
|
'symbols': symbols,
|
300
300
|
'marketIds': marketIds,
|
@@ -318,7 +318,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
318
318
|
symbol = market['symbol']
|
319
319
|
messageHash = name + ':' + market['id']
|
320
320
|
url = self.urls['api']['ws']
|
321
|
-
subscribe = {
|
321
|
+
subscribe: dict = {
|
322
322
|
'type': 'subscribe',
|
323
323
|
'product_ids': [
|
324
324
|
market['id'],
|
@@ -328,7 +328,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
328
328
|
],
|
329
329
|
}
|
330
330
|
request = self.extend(subscribe, params)
|
331
|
-
subscription = {
|
331
|
+
subscription: dict = {
|
332
332
|
'messageHash': messageHash,
|
333
333
|
'symbol': symbol,
|
334
334
|
'marketId': market['id'],
|
@@ -437,7 +437,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
437
437
|
# "side": "buy",
|
438
438
|
# "order_type": "limit"
|
439
439
|
# }
|
440
|
-
parsed = super(
|
440
|
+
parsed = super(coinbaseexchange, self).parse_trade(trade)
|
441
441
|
feeRate = None
|
442
442
|
isMaker = False
|
443
443
|
if 'maker_fee_rate' in trade:
|
@@ -470,7 +470,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
470
470
|
return parsed
|
471
471
|
|
472
472
|
def parse_ws_order_status(self, status):
|
473
|
-
statuses = {
|
473
|
+
statuses: dict = {
|
474
474
|
'filled': 'closed',
|
475
475
|
'canceled': 'canceled',
|
476
476
|
}
|
@@ -727,7 +727,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
727
727
|
#
|
728
728
|
type = self.safe_string(ticker, 'type')
|
729
729
|
if type is None:
|
730
|
-
return super(
|
730
|
+
return super(coinbaseexchange, self).parse_ticker(ticker, market)
|
731
731
|
marketId = self.safe_string(ticker, 'product_id')
|
732
732
|
symbol = self.safe_symbol(marketId, market, '-')
|
733
733
|
timestamp = self.parse8601(self.safe_string(ticker, 'time'))
|
@@ -811,7 +811,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
811
811
|
orderbook = self.orderbooks[symbol]
|
812
812
|
timestamp = self.parse8601(self.safe_string(message, 'time'))
|
813
813
|
changes = self.safe_value(message, 'changes', [])
|
814
|
-
sides = {
|
814
|
+
sides: dict = {
|
815
815
|
'sell': 'asks',
|
816
816
|
'buy': 'bids',
|
817
817
|
}
|
@@ -870,7 +870,7 @@ class coinbasepro(ccxt.async_support.coinbasepro):
|
|
870
870
|
|
871
871
|
def handle_message(self, client: Client, message):
|
872
872
|
type = self.safe_string(message, 'type')
|
873
|
-
methods = {
|
873
|
+
methods: dict = {
|
874
874
|
'snapshot': self.handle_order_book,
|
875
875
|
'l2update': self.handle_order_book,
|
876
876
|
'subscribe': self.handle_subscription_status,
|