ccxt 4.2.77__py2.py3-none-any.whl → 4.4.48__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ccxt/__init__.py +36 -14
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +112 -48
- ccxt/abstract/binancecoinm.py +112 -48
- ccxt/abstract/binanceus.py +147 -83
- ccxt/abstract/binanceusdm.py +112 -48
- ccxt/abstract/bingx.py +133 -78
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitfinex1.py +69 -0
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +8 -1
- ccxt/abstract/bitmart.py +13 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitpanda.py +0 -12
- ccxt/abstract/bitrue.py +3 -3
- ccxt/abstract/bitstamp.py +26 -3
- ccxt/abstract/blofin.py +24 -0
- ccxt/abstract/btcbox.py +1 -0
- ccxt/abstract/bybit.py +29 -14
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinbaseadvanced.py +94 -0
- ccxt/abstract/{coinbasepro.py → coinbaseexchange.py} +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/coincatch.py +94 -0
- ccxt/abstract/coinex.py +233 -123
- ccxt/abstract/coinmetro.py +1 -0
- ccxt/abstract/cryptocom.py +14 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/gate.py +20 -0
- ccxt/abstract/gateio.py +20 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hashkey.py +67 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +4 -3
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +24 -0
- ccxt/abstract/kucoinfutures.py +34 -0
- ccxt/abstract/luno.py +2 -0
- ccxt/abstract/mexc.py +4 -0
- ccxt/abstract/myokx.py +340 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +30 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/oxfun.py +34 -0
- ccxt/abstract/paradex.py +40 -0
- ccxt/abstract/phemex.py +1 -0
- ccxt/abstract/upbit.py +4 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/abstract/whitebit.py +31 -1
- ccxt/abstract/woo.py +6 -2
- ccxt/abstract/woofipro.py +119 -0
- ccxt/abstract/xt.py +153 -0
- ccxt/abstract/zonda.py +6 -0
- ccxt/ace.py +164 -60
- ccxt/alpaca.py +727 -63
- ccxt/ascendex.py +395 -249
- ccxt/async_support/__init__.py +36 -14
- ccxt/async_support/ace.py +164 -60
- ccxt/async_support/alpaca.py +727 -63
- ccxt/async_support/ascendex.py +396 -249
- ccxt/async_support/base/exchange.py +531 -155
- ccxt/async_support/base/ws/aiohttp_client.py +28 -5
- ccxt/async_support/base/ws/cache.py +3 -2
- ccxt/async_support/base/ws/client.py +26 -5
- ccxt/async_support/base/ws/fast_client.py +4 -3
- ccxt/async_support/base/ws/functions.py +1 -1
- ccxt/async_support/base/ws/future.py +40 -31
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bequant.py +1 -1
- ccxt/async_support/bigone.py +329 -202
- ccxt/async_support/binance.py +3030 -1087
- ccxt/async_support/binancecoinm.py +2 -1
- ccxt/async_support/binanceus.py +12 -1
- ccxt/async_support/binanceusdm.py +3 -1
- ccxt/async_support/bingx.py +3104 -880
- ccxt/async_support/bit2c.py +119 -38
- ccxt/async_support/bitbank.py +215 -76
- ccxt/async_support/bitbns.py +124 -53
- ccxt/async_support/bitfinex.py +3236 -1078
- ccxt/async_support/bitfinex1.py +1711 -0
- ccxt/async_support/bitflyer.py +238 -49
- ccxt/async_support/bitget.py +1513 -563
- ccxt/async_support/bithumb.py +199 -65
- ccxt/async_support/bitmart.py +1320 -435
- ccxt/async_support/bitmex.py +308 -111
- ccxt/async_support/bitopro.py +256 -96
- ccxt/async_support/bitrue.py +365 -233
- ccxt/async_support/bitso.py +201 -89
- ccxt/async_support/bitstamp.py +438 -269
- ccxt/async_support/bitteam.py +179 -73
- ccxt/async_support/bitvavo.py +180 -70
- ccxt/async_support/bl3p.py +92 -25
- ccxt/async_support/blockchaincom.py +193 -79
- ccxt/async_support/blofin.py +392 -148
- ccxt/async_support/btcalpha.py +161 -55
- ccxt/async_support/btcbox.py +250 -34
- ccxt/async_support/btcmarkets.py +232 -85
- ccxt/async_support/btcturk.py +159 -60
- ccxt/async_support/bybit.py +2231 -1193
- ccxt/async_support/cex.py +1409 -1329
- ccxt/async_support/coinbase.py +1454 -287
- ccxt/async_support/coinbaseadvanced.py +17 -0
- ccxt/async_support/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/async_support/coinbaseinternational.py +428 -88
- ccxt/async_support/coincatch.py +5152 -0
- ccxt/async_support/coincheck.py +121 -38
- ccxt/async_support/coinex.py +4020 -3339
- ccxt/async_support/coinlist.py +273 -116
- ccxt/async_support/coinmate.py +204 -97
- ccxt/async_support/coinmetro.py +203 -110
- ccxt/async_support/coinone.py +142 -68
- ccxt/async_support/coinsph.py +206 -89
- ccxt/async_support/coinspot.py +137 -62
- ccxt/async_support/cryptocom.py +515 -185
- ccxt/async_support/currencycom.py +203 -85
- ccxt/async_support/defx.py +2066 -0
- ccxt/async_support/delta.py +404 -109
- ccxt/async_support/deribit.py +557 -323
- ccxt/async_support/digifinex.py +340 -223
- ccxt/async_support/ellipx.py +1826 -0
- ccxt/async_support/exmo.py +259 -128
- ccxt/async_support/gate.py +1472 -463
- ccxt/async_support/gemini.py +206 -84
- ccxt/async_support/hashkey.py +4164 -0
- ccxt/async_support/hitbtc.py +334 -178
- ccxt/async_support/hollaex.py +134 -83
- ccxt/async_support/htx.py +1095 -563
- ccxt/async_support/huobijp.py +105 -56
- ccxt/async_support/hyperliquid.py +1633 -268
- ccxt/async_support/idex.py +148 -95
- ccxt/async_support/independentreserve.py +236 -31
- ccxt/async_support/indodax.py +165 -62
- ccxt/async_support/kraken.py +871 -354
- ccxt/async_support/krakenfutures.py +324 -100
- ccxt/async_support/kucoin.py +917 -357
- ccxt/async_support/kucoinfutures.py +1004 -149
- ccxt/async_support/kuna.py +138 -106
- ccxt/async_support/latoken.py +135 -79
- ccxt/async_support/lbank.py +290 -113
- ccxt/async_support/luno.py +112 -62
- ccxt/async_support/lykke.py +104 -55
- ccxt/async_support/mercado.py +36 -29
- ccxt/async_support/mexc.py +995 -429
- ccxt/async_support/myokx.py +43 -0
- ccxt/async_support/ndax.py +163 -82
- ccxt/async_support/novadax.py +121 -75
- ccxt/async_support/oceanex.py +175 -59
- ccxt/async_support/okcoin.py +222 -163
- ccxt/async_support/okx.py +1776 -454
- ccxt/async_support/onetrading.py +132 -414
- ccxt/async_support/oxfun.py +2832 -0
- ccxt/async_support/p2b.py +79 -51
- ccxt/async_support/paradex.py +2017 -0
- ccxt/async_support/paymium.py +56 -32
- ccxt/async_support/phemex.py +572 -196
- ccxt/async_support/poloniex.py +218 -95
- ccxt/async_support/poloniexfutures.py +260 -92
- ccxt/async_support/probit.py +143 -110
- ccxt/async_support/timex.py +123 -70
- ccxt/async_support/tokocrypto.py +129 -93
- ccxt/async_support/tradeogre.py +39 -25
- ccxt/async_support/upbit.py +322 -113
- ccxt/async_support/vertex.py +2983 -0
- ccxt/async_support/wavesexchange.py +227 -173
- ccxt/async_support/wazirx.py +145 -65
- ccxt/async_support/whitebit.py +533 -138
- ccxt/async_support/woo.py +1137 -296
- ccxt/async_support/woofipro.py +2716 -0
- ccxt/async_support/xt.py +4628 -0
- ccxt/async_support/yobit.py +160 -92
- ccxt/async_support/zaif.py +80 -33
- ccxt/async_support/zonda.py +140 -69
- ccxt/base/errors.py +51 -20
- ccxt/base/exchange.py +1722 -480
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +223 -4
- ccxt/bequant.py +1 -1
- ccxt/bigone.py +329 -202
- ccxt/binance.py +3030 -1087
- ccxt/binancecoinm.py +2 -1
- ccxt/binanceus.py +12 -1
- ccxt/binanceusdm.py +3 -1
- ccxt/bingx.py +3104 -880
- ccxt/bit2c.py +119 -38
- ccxt/bitbank.py +215 -76
- ccxt/bitbns.py +124 -53
- ccxt/bitfinex.py +3235 -1078
- ccxt/bitfinex1.py +1710 -0
- ccxt/bitflyer.py +238 -49
- ccxt/bitget.py +1513 -563
- ccxt/bithumb.py +198 -65
- ccxt/bitmart.py +1320 -435
- ccxt/bitmex.py +308 -111
- ccxt/bitopro.py +256 -96
- ccxt/bitrue.py +365 -233
- ccxt/bitso.py +201 -89
- ccxt/bitstamp.py +438 -269
- ccxt/bitteam.py +179 -73
- ccxt/bitvavo.py +180 -70
- ccxt/bl3p.py +92 -25
- ccxt/blockchaincom.py +193 -79
- ccxt/blofin.py +392 -148
- ccxt/btcalpha.py +161 -55
- ccxt/btcbox.py +250 -34
- ccxt/btcmarkets.py +232 -85
- ccxt/btcturk.py +159 -60
- ccxt/bybit.py +2231 -1193
- ccxt/cex.py +1408 -1329
- ccxt/coinbase.py +1454 -287
- ccxt/coinbaseadvanced.py +17 -0
- ccxt/{coinbasepro.py → coinbaseexchange.py} +233 -99
- ccxt/coinbaseinternational.py +428 -88
- ccxt/coincatch.py +5152 -0
- ccxt/coincheck.py +121 -38
- ccxt/coinex.py +4020 -3339
- ccxt/coinlist.py +273 -116
- ccxt/coinmate.py +204 -97
- ccxt/coinmetro.py +203 -110
- ccxt/coinone.py +142 -68
- ccxt/coinsph.py +206 -89
- ccxt/coinspot.py +137 -62
- ccxt/cryptocom.py +515 -185
- ccxt/currencycom.py +203 -85
- ccxt/defx.py +2065 -0
- ccxt/delta.py +404 -109
- ccxt/deribit.py +557 -323
- ccxt/digifinex.py +340 -223
- ccxt/ellipx.py +1826 -0
- ccxt/exmo.py +259 -128
- ccxt/gate.py +1472 -463
- ccxt/gemini.py +206 -84
- ccxt/hashkey.py +4164 -0
- ccxt/hitbtc.py +334 -178
- ccxt/hollaex.py +134 -83
- ccxt/htx.py +1095 -563
- ccxt/huobijp.py +105 -56
- ccxt/hyperliquid.py +1632 -268
- ccxt/idex.py +148 -95
- ccxt/independentreserve.py +235 -31
- ccxt/indodax.py +165 -62
- ccxt/kraken.py +871 -354
- ccxt/krakenfutures.py +324 -100
- ccxt/kucoin.py +917 -357
- ccxt/kucoinfutures.py +1004 -149
- ccxt/kuna.py +138 -106
- ccxt/latoken.py +135 -79
- ccxt/lbank.py +290 -113
- ccxt/luno.py +112 -62
- ccxt/lykke.py +104 -55
- ccxt/mercado.py +36 -29
- ccxt/mexc.py +994 -429
- ccxt/myokx.py +43 -0
- ccxt/ndax.py +163 -82
- ccxt/novadax.py +121 -75
- ccxt/oceanex.py +175 -59
- ccxt/okcoin.py +222 -163
- ccxt/okx.py +1776 -454
- ccxt/onetrading.py +132 -414
- ccxt/oxfun.py +2831 -0
- ccxt/p2b.py +79 -51
- ccxt/paradex.py +2017 -0
- ccxt/paymium.py +56 -32
- ccxt/phemex.py +572 -196
- ccxt/poloniex.py +218 -95
- ccxt/poloniexfutures.py +260 -92
- ccxt/pro/__init__.py +29 -5
- ccxt/pro/alpaca.py +32 -17
- ccxt/pro/ascendex.py +62 -14
- ccxt/pro/bequant.py +4 -0
- ccxt/pro/binance.py +1596 -329
- ccxt/pro/binancecoinm.py +1 -0
- ccxt/pro/binanceus.py +2 -9
- ccxt/pro/binanceusdm.py +2 -0
- ccxt/pro/bingx.py +527 -134
- ccxt/pro/bitcoincom.py +4 -1
- ccxt/pro/bitfinex.py +731 -266
- ccxt/pro/bitfinex1.py +635 -0
- ccxt/pro/bitget.py +726 -357
- ccxt/pro/bithumb.py +380 -0
- ccxt/pro/bitmart.py +138 -39
- ccxt/pro/bitmex.py +199 -40
- ccxt/pro/bitopro.py +25 -13
- ccxt/pro/bitrue.py +31 -32
- ccxt/pro/bitstamp.py +7 -6
- ccxt/pro/bitvavo.py +203 -81
- ccxt/pro/blockchaincom.py +30 -17
- ccxt/pro/blofin.py +692 -0
- ccxt/pro/bybit.py +791 -82
- ccxt/pro/cex.py +99 -51
- ccxt/pro/coinbase.py +220 -30
- ccxt/{async_support/hitbtc3.py → pro/coinbaseadvanced.py} +5 -5
- ccxt/pro/{coinbasepro.py → coinbaseexchange.py} +19 -19
- ccxt/pro/coinbaseinternational.py +193 -30
- ccxt/pro/coincatch.py +1464 -0
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +965 -665
- ccxt/pro/coinone.py +17 -10
- ccxt/pro/cryptocom.py +446 -66
- ccxt/pro/currencycom.py +11 -10
- ccxt/pro/defx.py +832 -0
- ccxt/pro/deribit.py +167 -31
- ccxt/pro/exmo.py +252 -20
- ccxt/pro/gate.py +729 -64
- ccxt/pro/gemini.py +44 -26
- ccxt/pro/hashkey.py +802 -0
- ccxt/pro/hitbtc.py +208 -103
- ccxt/pro/hollaex.py +25 -9
- ccxt/pro/htx.py +83 -39
- ccxt/pro/huobijp.py +17 -16
- ccxt/pro/hyperliquid.py +502 -31
- ccxt/pro/idex.py +28 -13
- ccxt/pro/independentreserve.py +21 -16
- ccxt/pro/kraken.py +298 -51
- ccxt/pro/krakenfutures.py +166 -75
- ccxt/pro/kucoin.py +395 -77
- ccxt/pro/kucoinfutures.py +400 -99
- ccxt/pro/lbank.py +52 -31
- ccxt/pro/luno.py +12 -10
- ccxt/pro/mexc.py +400 -50
- ccxt/pro/myokx.py +28 -0
- ccxt/pro/ndax.py +25 -12
- ccxt/pro/okcoin.py +28 -9
- ccxt/pro/okx.py +935 -124
- ccxt/pro/onetrading.py +41 -24
- ccxt/pro/oxfun.py +1054 -0
- ccxt/pro/p2b.py +100 -24
- ccxt/pro/paradex.py +352 -0
- ccxt/pro/phemex.py +92 -33
- ccxt/pro/poloniex.py +128 -49
- ccxt/pro/poloniexfutures.py +53 -32
- ccxt/pro/probit.py +92 -85
- ccxt/pro/upbit.py +401 -8
- ccxt/pro/vertex.py +943 -0
- ccxt/pro/wazirx.py +46 -28
- ccxt/pro/whitebit.py +65 -12
- ccxt/pro/woo.py +437 -65
- ccxt/pro/woofipro.py +1271 -0
- ccxt/pro/xt.py +1067 -0
- ccxt/probit.py +143 -110
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/__init__.py +38 -0
- ccxt/static_dependencies/lark/__pyinstaller/__init__.py +6 -0
- ccxt/static_dependencies/lark/__pyinstaller/hook-lark.py +14 -0
- ccxt/static_dependencies/lark/ast_utils.py +59 -0
- ccxt/static_dependencies/lark/common.py +86 -0
- ccxt/static_dependencies/lark/exceptions.py +292 -0
- ccxt/static_dependencies/lark/grammar.py +130 -0
- ccxt/static_dependencies/lark/grammars/__init__.py +0 -0
- ccxt/static_dependencies/lark/indenter.py +143 -0
- ccxt/static_dependencies/lark/lark.py +658 -0
- ccxt/static_dependencies/lark/lexer.py +678 -0
- ccxt/static_dependencies/lark/load_grammar.py +1428 -0
- ccxt/static_dependencies/lark/parse_tree_builder.py +391 -0
- ccxt/static_dependencies/lark/parser_frontends.py +257 -0
- ccxt/static_dependencies/lark/parsers/__init__.py +0 -0
- ccxt/static_dependencies/lark/parsers/cyk.py +340 -0
- ccxt/static_dependencies/lark/parsers/earley.py +314 -0
- ccxt/static_dependencies/lark/parsers/earley_common.py +42 -0
- ccxt/static_dependencies/lark/parsers/earley_forest.py +801 -0
- ccxt/static_dependencies/lark/parsers/grammar_analysis.py +203 -0
- ccxt/static_dependencies/lark/parsers/lalr_analysis.py +332 -0
- ccxt/static_dependencies/lark/parsers/lalr_interactive_parser.py +158 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser.py +122 -0
- ccxt/static_dependencies/lark/parsers/lalr_parser_state.py +110 -0
- ccxt/static_dependencies/lark/parsers/xearley.py +165 -0
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/lark/reconstruct.py +107 -0
- ccxt/static_dependencies/lark/tools/__init__.py +70 -0
- ccxt/static_dependencies/lark/tools/nearley.py +202 -0
- ccxt/static_dependencies/lark/tools/serialize.py +32 -0
- ccxt/static_dependencies/lark/tools/standalone.py +196 -0
- ccxt/static_dependencies/lark/tree.py +267 -0
- ccxt/static_dependencies/lark/tree_matcher.py +186 -0
- ccxt/static_dependencies/lark/tree_templates.py +180 -0
- ccxt/static_dependencies/lark/utils.py +343 -0
- ccxt/static_dependencies/lark/visitors.py +596 -0
- ccxt/static_dependencies/marshmallow/__init__.py +81 -0
- ccxt/static_dependencies/marshmallow/base.py +65 -0
- ccxt/static_dependencies/marshmallow/class_registry.py +94 -0
- ccxt/static_dependencies/marshmallow/decorators.py +231 -0
- ccxt/static_dependencies/marshmallow/error_store.py +60 -0
- ccxt/static_dependencies/marshmallow/exceptions.py +71 -0
- ccxt/static_dependencies/marshmallow/fields.py +2114 -0
- ccxt/static_dependencies/marshmallow/orderedset.py +89 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/schema.py +1228 -0
- ccxt/static_dependencies/marshmallow/types.py +12 -0
- ccxt/static_dependencies/marshmallow/utils.py +378 -0
- ccxt/static_dependencies/marshmallow/validate.py +678 -0
- ccxt/static_dependencies/marshmallow/warnings.py +2 -0
- ccxt/static_dependencies/marshmallow_dataclass/__init__.py +1047 -0
- ccxt/static_dependencies/marshmallow_dataclass/collection_field.py +51 -0
- ccxt/static_dependencies/marshmallow_dataclass/lazy_class_attribute.py +45 -0
- ccxt/static_dependencies/marshmallow_dataclass/mypy.py +71 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/typing.py +14 -0
- ccxt/static_dependencies/marshmallow_dataclass/union_field.py +82 -0
- ccxt/static_dependencies/marshmallow_oneofschema/__init__.py +1 -0
- ccxt/static_dependencies/marshmallow_oneofschema/one_of_schema.py +193 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/static_dependencies/starknet/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/data_types.py +123 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/cairo_types.py +77 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser.py +46 -0
- ccxt/static_dependencies/starknet/cairo/deprecated_parse/parser_transformer.py +138 -0
- ccxt/static_dependencies/starknet/cairo/felt.py +64 -0
- ccxt/static_dependencies/starknet/cairo/type_parser.py +121 -0
- ccxt/static_dependencies/starknet/cairo/v1/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v1/type_parser.py +59 -0
- ccxt/static_dependencies/starknet/cairo/v2/__init__.py +0 -0
- ccxt/static_dependencies/starknet/cairo/v2/type_parser.py +77 -0
- ccxt/static_dependencies/starknet/ccxt_utils.py +7 -0
- ccxt/static_dependencies/starknet/common.py +15 -0
- ccxt/static_dependencies/starknet/constants.py +39 -0
- ccxt/static_dependencies/starknet/hash/__init__.py +0 -0
- ccxt/static_dependencies/starknet/hash/address.py +79 -0
- ccxt/static_dependencies/starknet/hash/compiled_class_hash_objects.py +111 -0
- ccxt/static_dependencies/starknet/hash/selector.py +16 -0
- ccxt/static_dependencies/starknet/hash/storage.py +12 -0
- ccxt/static_dependencies/starknet/hash/utils.py +78 -0
- ccxt/static_dependencies/starknet/models/__init__.py +0 -0
- ccxt/static_dependencies/starknet/models/typed_data.py +45 -0
- ccxt/static_dependencies/starknet/serialization/__init__.py +24 -0
- ccxt/static_dependencies/starknet/serialization/_calldata_reader.py +40 -0
- ccxt/static_dependencies/starknet/serialization/_context.py +142 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/__init__.py +10 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/_common.py +82 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/array_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/bool_serializer.py +37 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/byte_array_serializer.py +66 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/cairo_data_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/enum_serializer.py +71 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/felt_serializer.py +50 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/named_tuple_serializer.py +58 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/option_serializer.py +43 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/output_serializer.py +40 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/payload_serializer.py +72 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/struct_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/tuple_serializer.py +36 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint256_serializer.py +76 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/uint_serializer.py +100 -0
- ccxt/static_dependencies/starknet/serialization/data_serializers/unit_serializer.py +32 -0
- ccxt/static_dependencies/starknet/serialization/errors.py +10 -0
- ccxt/static_dependencies/starknet/serialization/factory.py +229 -0
- ccxt/static_dependencies/starknet/serialization/function_serialization_adapter.py +110 -0
- ccxt/static_dependencies/starknet/serialization/tuple_dataclass.py +59 -0
- ccxt/static_dependencies/starknet/utils/__init__.py +0 -0
- ccxt/static_dependencies/starknet/utils/constructor_args_translator.py +86 -0
- ccxt/static_dependencies/starknet/utils/iterable.py +13 -0
- ccxt/static_dependencies/starknet/utils/schema.py +13 -0
- ccxt/static_dependencies/starknet/utils/typed_data.py +182 -0
- ccxt/static_dependencies/starkware/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/__init__.py +0 -0
- ccxt/static_dependencies/starkware/crypto/fast_pedersen_hash.py +50 -0
- ccxt/static_dependencies/starkware/crypto/math_utils.py +78 -0
- ccxt/static_dependencies/starkware/crypto/signature.py +2344 -0
- ccxt/static_dependencies/starkware/crypto/utils.py +63 -0
- ccxt/static_dependencies/sympy/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/__init__.py +0 -0
- ccxt/static_dependencies/sympy/core/intfunc.py +35 -0
- ccxt/static_dependencies/sympy/external/__init__.py +0 -0
- ccxt/static_dependencies/sympy/external/gmpy.py +345 -0
- ccxt/static_dependencies/sympy/external/importtools.py +187 -0
- ccxt/static_dependencies/sympy/external/ntheory.py +637 -0
- ccxt/static_dependencies/sympy/external/pythonmpq.py +341 -0
- ccxt/static_dependencies/typing_inspect/__init__.py +0 -0
- ccxt/static_dependencies/typing_inspect/typing_inspect.py +851 -0
- ccxt/test/{test_async.py → tests_async.py} +456 -391
- ccxt/test/tests_helpers.py +285 -0
- ccxt/test/tests_init.py +39 -0
- ccxt/test/{test_sync.py → tests_sync.py} +456 -393
- ccxt/timex.py +123 -70
- ccxt/tokocrypto.py +129 -93
- ccxt/tradeogre.py +39 -25
- ccxt/upbit.py +322 -113
- ccxt/vertex.py +2983 -0
- ccxt/wavesexchange.py +227 -173
- ccxt/wazirx.py +145 -65
- ccxt/whitebit.py +533 -138
- ccxt/woo.py +1137 -296
- ccxt/woofipro.py +2716 -0
- ccxt/xt.py +4627 -0
- ccxt/yobit.py +159 -92
- ccxt/zaif.py +80 -33
- ccxt/zonda.py +140 -69
- ccxt-4.4.48.dist-info/LICENSE.txt +21 -0
- ccxt-4.4.48.dist-info/METADATA +646 -0
- ccxt-4.4.48.dist-info/RECORD +669 -0
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/WHEEL +1 -1
- ccxt/abstract/bitbay.py +0 -47
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3496
- ccxt/async_support/flowbtc.py +0 -34
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3496
- ccxt/flowbtc.py +0 -34
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1081
- ccxt/test/base/__init__.py +0 -28
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -103
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -32
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -190
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -32
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -63
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -345
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -86
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- ccxt-4.2.77.dist-info/METADATA +0 -626
- ccxt-4.2.77.dist-info/RECORD +0 -534
- {ccxt-4.2.77.dist-info → ccxt-4.4.48.dist-info}/top_level.txt +0 -0
ccxt/async_support/kuna.py
CHANGED
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.kuna import ImplicitAPI
|
8
8
|
import hashlib
|
9
9
|
import json
|
10
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
10
|
+
from ccxt.base.types import Balances, Currencies, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
13
|
from ccxt.base.errors import ArgumentsRequired
|
@@ -58,6 +58,8 @@ class kuna(Exchange, ImplicitAPI):
|
|
58
58
|
'fetchCurrencies': True,
|
59
59
|
'fetchDeposit': True,
|
60
60
|
'fetchDepositAddress': True,
|
61
|
+
'fetchDepositAddresses': False,
|
62
|
+
'fetchDepositAddressesByNetwork': False,
|
61
63
|
'fetchDeposits': True,
|
62
64
|
'fetchDepositsWithdrawals': False,
|
63
65
|
'fetchFundingHistory': False,
|
@@ -409,7 +411,9 @@ class kuna(Exchange, ImplicitAPI):
|
|
409
411
|
async def fetch_time(self, params={}):
|
410
412
|
"""
|
411
413
|
fetches the current integer timestamp in milliseconds from the exchange server
|
412
|
-
|
414
|
+
|
415
|
+
https://docs.kuna.io/docs/get-time-on-the-server
|
416
|
+
|
413
417
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
414
418
|
:returns int: the current integer timestamp in milliseconds from the exchange server
|
415
419
|
"""
|
@@ -425,10 +429,12 @@ class kuna(Exchange, ImplicitAPI):
|
|
425
429
|
data = self.safe_value(response, 'data', {})
|
426
430
|
return self.safe_integer(data, 'timestamp_miliseconds')
|
427
431
|
|
428
|
-
async def fetch_currencies(self, params={}):
|
432
|
+
async def fetch_currencies(self, params={}) -> Currencies:
|
429
433
|
"""
|
430
434
|
fetches all available currencies on an exchange
|
431
|
-
|
435
|
+
|
436
|
+
https://docs.kuna.io/docs/get-information-about-available-currencies
|
437
|
+
|
432
438
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
433
439
|
:returns dict: an associative dictionary of currencies
|
434
440
|
"""
|
@@ -460,15 +466,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
460
466
|
data = self.safe_value(response, 'data', [])
|
461
467
|
return self.parse_currencies(data)
|
462
468
|
|
463
|
-
def
|
464
|
-
currencies = self.to_array(currencies)
|
465
|
-
result = {}
|
466
|
-
for i in range(0, len(currencies)):
|
467
|
-
currency = self.parse_currency(currencies[i])
|
468
|
-
result[currency['code']] = currency
|
469
|
-
return result
|
470
|
-
|
471
|
-
def parse_currency(self, currency):
|
469
|
+
def parse_currency(self, currency: dict) -> Currency:
|
472
470
|
#
|
473
471
|
# {
|
474
472
|
# "code": "BTC",
|
@@ -492,7 +490,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
492
490
|
currencyId = self.safe_string(currency, 'code')
|
493
491
|
precision = self.safe_string(currency, 'precision')
|
494
492
|
tradePrecision = self.safe_string(currency, 'tradePrecision')
|
495
|
-
return {
|
493
|
+
return self.safe_currency_structure({
|
496
494
|
'info': currency,
|
497
495
|
'id': currencyId,
|
498
496
|
'code': self.safe_currency_code(currencyId),
|
@@ -503,7 +501,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
503
501
|
'deposit': None,
|
504
502
|
'withdraw': None,
|
505
503
|
'fee': None,
|
506
|
-
'precision': Precise.string_min(precision, tradePrecision),
|
504
|
+
'precision': self.parse_number(Precise.string_min(precision, tradePrecision)),
|
507
505
|
'limits': {
|
508
506
|
'amount': {
|
509
507
|
'min': None,
|
@@ -515,12 +513,14 @@ class kuna(Exchange, ImplicitAPI):
|
|
515
513
|
},
|
516
514
|
},
|
517
515
|
'networks': {},
|
518
|
-
}
|
516
|
+
})
|
519
517
|
|
520
|
-
async def fetch_markets(self, params={}):
|
518
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
521
519
|
"""
|
522
520
|
retrieves data on all markets for kuna
|
523
|
-
|
521
|
+
|
522
|
+
https://docs.kuna.io/docs/get-all-traded-markets
|
523
|
+
|
524
524
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
525
525
|
:returns dict[]: an array of objects representing market data
|
526
526
|
"""
|
@@ -610,7 +610,9 @@ class kuna(Exchange, ImplicitAPI):
|
|
610
610
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
611
611
|
"""
|
612
612
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
613
|
-
|
613
|
+
|
614
|
+
https://docs.kuna.io/docs/get-public-orders-book
|
615
|
+
|
614
616
|
:param str symbol: unified symbol of the market to fetch the order book for
|
615
617
|
:param int [limit]: 5, 10, 20, 50, 100, 500, or 1000(default)
|
616
618
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -618,7 +620,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
618
620
|
"""
|
619
621
|
await self.load_markets()
|
620
622
|
market = self.market(symbol)
|
621
|
-
request = {
|
623
|
+
request: dict = {
|
622
624
|
'pairs': market['id'],
|
623
625
|
}
|
624
626
|
if limit is not None:
|
@@ -650,10 +652,10 @@ class kuna(Exchange, ImplicitAPI):
|
|
650
652
|
# }
|
651
653
|
# }
|
652
654
|
#
|
653
|
-
data = self.
|
655
|
+
data = self.safe_dict(response, 'data', {})
|
654
656
|
return self.parse_order_book(data, market['symbol'], None, 'bids', 'asks', 0, 1)
|
655
657
|
|
656
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
658
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
657
659
|
#
|
658
660
|
# {
|
659
661
|
# "pair": "BTC_USDT", # Traded pair
|
@@ -694,7 +696,9 @@ class kuna(Exchange, ImplicitAPI):
|
|
694
696
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
695
697
|
"""
|
696
698
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market. The average is not returned in the response, but the median can be accessed via response['info']['price']
|
697
|
-
|
699
|
+
|
700
|
+
https://docs.kuna.io/docs/get-market-info-by-tickers
|
701
|
+
|
698
702
|
:param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
699
703
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
700
704
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -704,7 +708,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
704
708
|
raise ArgumentsRequired(self.id + ' fetchTickers() requires a symbols argument')
|
705
709
|
symbols = self.market_symbols(symbols)
|
706
710
|
marketIds = self.market_ids(symbols)
|
707
|
-
request = {
|
711
|
+
request: dict = {
|
708
712
|
'pairs': ','.join(marketIds),
|
709
713
|
}
|
710
714
|
response = await self.v4PublicGetMarketsPublicTickersPairsPairs(self.extend(request, params))
|
@@ -728,20 +732,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
728
732
|
# ]
|
729
733
|
# }
|
730
734
|
#
|
731
|
-
data = self.
|
735
|
+
data = self.safe_list(response, 'data', [])
|
732
736
|
return self.parse_tickers(data, symbols, params)
|
733
737
|
|
734
738
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
735
739
|
"""
|
736
740
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
737
|
-
|
741
|
+
|
742
|
+
https://docs.kuna.io/docs/get-market-info-by-tickers
|
743
|
+
|
738
744
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
739
745
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
740
746
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
741
747
|
"""
|
742
748
|
await self.load_markets()
|
743
749
|
market = self.market(symbol)
|
744
|
-
request = {
|
750
|
+
request: dict = {
|
745
751
|
'pairs': market['id'],
|
746
752
|
}
|
747
753
|
response = await self.v4PublicGetMarketsPublicTickersPairsPairs(self.extend(request, params))
|
@@ -766,12 +772,12 @@ class kuna(Exchange, ImplicitAPI):
|
|
766
772
|
# }
|
767
773
|
#
|
768
774
|
data = self.safe_value(response, 'data', [])
|
769
|
-
ticker = self.
|
775
|
+
ticker = self.safe_dict(data, 0)
|
770
776
|
return self.parse_ticker(ticker, market)
|
771
777
|
|
772
778
|
async def fetch_l3_order_book(self, symbol: str, limit: Int = None, params={}):
|
773
779
|
"""
|
774
|
-
|
780
|
+
TODO: double check
|
775
781
|
fetches level 3 information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
776
782
|
:param str symbol: unified market symbol
|
777
783
|
:param int [limit]: max number of orders to return, default is None
|
@@ -783,7 +789,9 @@ class kuna(Exchange, ImplicitAPI):
|
|
783
789
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
784
790
|
"""
|
785
791
|
get the list of most recent trades for a particular symbol
|
786
|
-
|
792
|
+
|
793
|
+
https://docs.kuna.io/docs/get-public-trades-book
|
794
|
+
|
787
795
|
:param str symbol: unified symbol of the market to fetch trades for
|
788
796
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
789
797
|
:param int [limit]: between 1 and 100, 25 by default
|
@@ -792,7 +800,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
792
800
|
"""
|
793
801
|
await self.load_markets()
|
794
802
|
market = self.market(symbol)
|
795
|
-
request = {
|
803
|
+
request: dict = {
|
796
804
|
'pairs': market['id'],
|
797
805
|
}
|
798
806
|
if limit is not None:
|
@@ -817,7 +825,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
817
825
|
data = self.safe_list(response, 'data', [])
|
818
826
|
return self.parse_trades(data, market, since, limit)
|
819
827
|
|
820
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
828
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
821
829
|
#
|
822
830
|
# fetchTrades(public)
|
823
831
|
#
|
@@ -870,7 +878,6 @@ class kuna(Exchange, ImplicitAPI):
|
|
870
878
|
'fee': {
|
871
879
|
'cost': self.safe_string(trade, 'fee'),
|
872
880
|
'currency': self.safe_currency_code(self.safe_string(trade, 'feeCurrency')),
|
873
|
-
'rate': None,
|
874
881
|
},
|
875
882
|
}, market)
|
876
883
|
|
@@ -885,7 +892,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
885
892
|
# ...
|
886
893
|
# ]
|
887
894
|
#
|
888
|
-
result = {'info': response}
|
895
|
+
result: dict = {'info': response}
|
889
896
|
for i in range(0, len(response)):
|
890
897
|
balance = response[i]
|
891
898
|
currencyId = self.safe_string(balance, 'currency')
|
@@ -919,16 +926,18 @@ class kuna(Exchange, ImplicitAPI):
|
|
919
926
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
920
927
|
"""
|
921
928
|
create a trade order
|
922
|
-
|
929
|
+
|
930
|
+
https://docs.kuna.io/docs/create-a-new-order-private
|
931
|
+
|
923
932
|
:param str symbol: unified symbol of the market to create an order in
|
924
933
|
:param str type: 'market' or 'limit'
|
925
934
|
:param str side: 'buy' or 'sell'
|
926
935
|
:param float amount: how much of currency you want to trade in units of base currency
|
927
|
-
:param float [price]: the price at which the order is to be
|
936
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
928
937
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
929
938
|
:param float [params.triggerPrice]: the price at which a trigger order is triggered at
|
930
|
-
|
931
|
-
|
939
|
+
|
940
|
+
EXCHANGE SPECIFIC PARAMETERS
|
932
941
|
:param str [params.id]: id must be a UUID format, if you do not specify id, it will be generated automatically.
|
933
942
|
:param float [params.quoteQuantity]: the max quantity of the quote asset to use for selling/buying
|
934
943
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -938,7 +947,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
938
947
|
triggerPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
|
939
948
|
params = self.omit(params, ['triggerPrice', 'stopPrice'])
|
940
949
|
capitalizedType = self.capitalize(type)
|
941
|
-
request = {
|
950
|
+
request: dict = {
|
942
951
|
'pair': market['id'],
|
943
952
|
'orderSide': 'Bid' if (side == 'buy') else 'Ask',
|
944
953
|
'quantity': self.number_to_string(amount),
|
@@ -968,7 +977,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
968
977
|
# }
|
969
978
|
# }
|
970
979
|
#
|
971
|
-
data = self.
|
980
|
+
data = self.safe_dict(response, 'data', {})
|
972
981
|
return self.parse_order(data, market)
|
973
982
|
|
974
983
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
@@ -980,7 +989,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
980
989
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
981
990
|
"""
|
982
991
|
await self.load_markets()
|
983
|
-
request = {
|
992
|
+
request: dict = {
|
984
993
|
'orderId': id,
|
985
994
|
}
|
986
995
|
response = await self.v4PrivatePostOrderPrivateCancel(self.extend(request, params))
|
@@ -1008,7 +1017,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1008
1017
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1009
1018
|
"""
|
1010
1019
|
await self.load_markets()
|
1011
|
-
request = {
|
1020
|
+
request: dict = {
|
1012
1021
|
'orderIds': ids,
|
1013
1022
|
}
|
1014
1023
|
response = await self.v4PrivatePostOrderPrivateCancelMulti(self.extend(request, params))
|
@@ -1023,11 +1032,11 @@ class kuna(Exchange, ImplicitAPI):
|
|
1023
1032
|
# ]
|
1024
1033
|
# }
|
1025
1034
|
#
|
1026
|
-
data = self.
|
1035
|
+
data = self.safe_list(response, 'data', [])
|
1027
1036
|
return self.parse_orders(data)
|
1028
1037
|
|
1029
|
-
def parse_order_status(self, status):
|
1030
|
-
statuses = {
|
1038
|
+
def parse_order_status(self, status: Str):
|
1039
|
+
statuses: dict = {
|
1031
1040
|
'Canceled': 'canceled',
|
1032
1041
|
'Closed': 'filled',
|
1033
1042
|
'Pending': 'open',
|
@@ -1038,7 +1047,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1038
1047
|
}
|
1039
1048
|
return self.safe_string(statuses, status, status)
|
1040
1049
|
|
1041
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1050
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1042
1051
|
#
|
1043
1052
|
# createOrder, fetchOrder, fetchOpenOrders, fetchOrdersByStatus
|
1044
1053
|
#
|
@@ -1082,7 +1091,6 @@ class kuna(Exchange, ImplicitAPI):
|
|
1082
1091
|
#
|
1083
1092
|
marketId = self.safe_string(order, 'pair')
|
1084
1093
|
datetime = self.safe_string(order, 'createdAt')
|
1085
|
-
triggerPrice = self.safe_string(order, 'stopPrice')
|
1086
1094
|
side = self.safe_string(order, 'side')
|
1087
1095
|
if side == 'Bid':
|
1088
1096
|
side = 'buy'
|
@@ -1103,8 +1111,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1103
1111
|
'postOnly': None,
|
1104
1112
|
'side': side,
|
1105
1113
|
'price': self.safe_string(order, 'price'),
|
1106
|
-
'
|
1107
|
-
'triggerPrice': triggerPrice,
|
1114
|
+
'triggerPrice': self.safe_string(order, 'stopPrice'),
|
1108
1115
|
'amount': self.safe_string(order, 'quantity'),
|
1109
1116
|
'filled': self.safe_string(order, 'executedQuantity'),
|
1110
1117
|
'remaining': None,
|
@@ -1117,16 +1124,19 @@ class kuna(Exchange, ImplicitAPI):
|
|
1117
1124
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1118
1125
|
"""
|
1119
1126
|
fetches information on an order made by the user
|
1120
|
-
|
1127
|
+
|
1128
|
+
https://docs.kuna.io/docs/get-order-details-by-id
|
1129
|
+
|
1130
|
+
:param str id: order id
|
1121
1131
|
:param str symbol: not used by kuna fetchOrder
|
1122
1132
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1123
|
-
|
1124
|
-
|
1133
|
+
|
1134
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1125
1135
|
:param boolean [params.withTrades]: default is True, specify if the response should include trades associated with the order
|
1126
1136
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1127
1137
|
"""
|
1128
1138
|
await self.load_markets()
|
1129
|
-
request = {
|
1139
|
+
request: dict = {
|
1130
1140
|
'id': id,
|
1131
1141
|
'withTrades': True,
|
1132
1142
|
}
|
@@ -1165,20 +1175,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1165
1175
|
# }
|
1166
1176
|
# }
|
1167
1177
|
#
|
1168
|
-
data = self.
|
1178
|
+
data = self.safe_dict(response, 'data', {})
|
1169
1179
|
return self.parse_order(data)
|
1170
1180
|
|
1171
1181
|
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1172
1182
|
"""
|
1173
1183
|
fetch all unfilled currently open orders
|
1174
|
-
|
1184
|
+
|
1185
|
+
https://docs.kuna.io/docs/get-active-client-orders-private
|
1186
|
+
|
1175
1187
|
:param str symbol: unified market symbol
|
1176
1188
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1177
1189
|
:param int [limit]: 1-100, the maximum number of open orders structures to retrieve
|
1178
1190
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1179
1191
|
:param int [params.until]: the latest timestamp(ms) to fetch orders for
|
1180
|
-
|
1181
|
-
|
1192
|
+
|
1193
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1182
1194
|
:param str [params.sort]: asc(oldest-on-top) or desc(newest-on-top)
|
1183
1195
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1184
1196
|
"""
|
@@ -1186,7 +1198,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1186
1198
|
until = self.safe_integer(params, 'until')
|
1187
1199
|
params = self.omit(params, ['until'])
|
1188
1200
|
market = None
|
1189
|
-
request = {
|
1201
|
+
request: dict = {
|
1190
1202
|
}
|
1191
1203
|
if symbol is not None:
|
1192
1204
|
market = self.market(symbol)
|
@@ -1219,20 +1231,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1219
1231
|
# ]
|
1220
1232
|
# }
|
1221
1233
|
#
|
1222
|
-
data = self.
|
1234
|
+
data = self.safe_list(response, 'data', [])
|
1223
1235
|
return self.parse_orders(data, market, since, limit)
|
1224
1236
|
|
1225
1237
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1226
1238
|
"""
|
1227
1239
|
fetches information on multiple closed orders made by the user
|
1228
|
-
|
1240
|
+
|
1241
|
+
https://docs.kuna.io/docs/get-private-orders-history
|
1242
|
+
|
1229
1243
|
:param str symbol: unified market symbol of the market orders were made in
|
1230
1244
|
:param int [since]: the earliest time in ms to fetch orders for
|
1231
1245
|
:param int [limit]: the maximum number of order structures to retrieve
|
1232
1246
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1233
1247
|
:param int [params.until]: the latest time in ms to fetch orders for
|
1234
|
-
|
1235
|
-
|
1248
|
+
|
1249
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1236
1250
|
:param str [params.sort]: asc(oldest-on-top) or desc(newest-on-top)
|
1237
1251
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1238
1252
|
"""
|
@@ -1241,15 +1255,17 @@ class kuna(Exchange, ImplicitAPI):
|
|
1241
1255
|
async def fetch_orders_by_status(self, status, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1242
1256
|
"""
|
1243
1257
|
fetch a list of orders
|
1244
|
-
|
1258
|
+
|
1259
|
+
https://docs.kuna.io/docs/get-private-orders-history
|
1260
|
+
|
1245
1261
|
:param str status: canceled, closed, expired, open, pending, rejected, or waitStop
|
1246
1262
|
:param str symbol: unified market symbol of the market orders were made in
|
1247
1263
|
:param int [since]: the earliest time in ms to fetch orders for
|
1248
1264
|
:param int [limit]: 1-100, the maximum number of open orders structures to retrieve
|
1249
1265
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1250
1266
|
:param int [params.until]: the latest timestamp(ms) to fetch orders for
|
1251
|
-
|
1252
|
-
|
1267
|
+
|
1268
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1253
1269
|
:param str [params.sort]: asc(oldest-on-top) or desc(newest-on-top)
|
1254
1270
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1255
1271
|
"""
|
@@ -1259,7 +1275,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1259
1275
|
until = self.safe_integer(params, 'until')
|
1260
1276
|
params = self.omit(params, ['until'])
|
1261
1277
|
market = None
|
1262
|
-
request = {
|
1278
|
+
request: dict = {
|
1263
1279
|
'status': self.capitalize(status),
|
1264
1280
|
}
|
1265
1281
|
if symbol is not None:
|
@@ -1294,26 +1310,28 @@ class kuna(Exchange, ImplicitAPI):
|
|
1294
1310
|
# ]
|
1295
1311
|
# }
|
1296
1312
|
#
|
1297
|
-
data = self.
|
1313
|
+
data = self.safe_list(response, 'data', [])
|
1298
1314
|
return self.parse_orders(data, market, since, limit)
|
1299
1315
|
|
1300
1316
|
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1301
1317
|
"""
|
1302
1318
|
fetch all trades made by the user
|
1303
|
-
|
1319
|
+
|
1320
|
+
https://docs.kuna.io/docs/get-private-trades-history
|
1321
|
+
|
1304
1322
|
:param str symbol: unified market symbol
|
1305
1323
|
:param int [since]: not used by kuna fetchMyTrades
|
1306
1324
|
:param int [limit]: not used by kuna fetchMyTrades
|
1307
1325
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1308
|
-
|
1309
|
-
|
1326
|
+
|
1327
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1310
1328
|
:param str [params.orderId]: UUID of an order, to receive trades for self order only
|
1311
1329
|
:param str [params.sort]: asc(oldest-on-top) or desc(newest-on-top)
|
1312
1330
|
:returns Trade[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
1313
1331
|
"""
|
1314
1332
|
await self.load_markets()
|
1315
1333
|
market = None
|
1316
|
-
request = {}
|
1334
|
+
request: dict = {}
|
1317
1335
|
if symbol is not None:
|
1318
1336
|
market = self.market(symbol)
|
1319
1337
|
request['pair'] = market['id']
|
@@ -1337,21 +1355,23 @@ class kuna(Exchange, ImplicitAPI):
|
|
1337
1355
|
# ]
|
1338
1356
|
# }
|
1339
1357
|
#
|
1340
|
-
data = self.
|
1358
|
+
data = self.safe_list(response, 'data')
|
1341
1359
|
return self.parse_trades(data, market, since, limit)
|
1342
1360
|
|
1343
|
-
async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
1361
|
+
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
1344
1362
|
"""
|
1345
1363
|
make a withdrawal
|
1346
|
-
|
1364
|
+
|
1365
|
+
https://docs.kuna.io/docs/create-a-withdraw
|
1366
|
+
|
1347
1367
|
:param str code: unified currency code
|
1348
1368
|
:param float amount: the amount to withdraw
|
1349
1369
|
:param str address: the address to withdraw to
|
1350
1370
|
:param str tag:
|
1351
1371
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1352
1372
|
:param str [params.chain]: the chain to withdraw to
|
1353
|
-
|
1354
|
-
|
1373
|
+
|
1374
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1355
1375
|
:param str [params.id]: id must be a uuid format, if you do not specify id, it will be generated automatically
|
1356
1376
|
:param boolean [params.withdrawAll]: self field says that the amount should also include a fee
|
1357
1377
|
:returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
@@ -1367,7 +1387,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1367
1387
|
else:
|
1368
1388
|
chain = currency['id'].upper()
|
1369
1389
|
networkId = self.network_code_to_id(chain)
|
1370
|
-
request = {
|
1390
|
+
request: dict = {
|
1371
1391
|
'currency': networkId,
|
1372
1392
|
'amount': amount,
|
1373
1393
|
'address': address,
|
@@ -1384,20 +1404,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1384
1404
|
# }
|
1385
1405
|
# }
|
1386
1406
|
#
|
1387
|
-
data = self.
|
1407
|
+
data = self.safe_dict(response, 'data', {})
|
1388
1408
|
return self.parse_transaction(data, currency)
|
1389
1409
|
|
1390
1410
|
async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1391
1411
|
"""
|
1392
1412
|
fetch all withdrawals made to an account
|
1393
|
-
|
1413
|
+
|
1414
|
+
https://docs.kuna.io/docs/get-withdraw-history
|
1415
|
+
|
1394
1416
|
:param str code: unified currency code
|
1395
1417
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
1396
1418
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
1397
1419
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1398
1420
|
:param int [params.until]: the latest time in ms to fetch deposits for
|
1399
|
-
|
1400
|
-
|
1421
|
+
|
1422
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1401
1423
|
:param str [params.status]: Created, Canceled, PartiallyProcessed, Processing, Processed, WaitForConfirmation, Pending, AmlChecking
|
1402
1424
|
:param str [params.sortField]: amount(sorting by time), createdAt(sorting by date)
|
1403
1425
|
:param str [params.sortOrder]: asc(oldest-on-top), or desc(newest-on-top, default)
|
@@ -1411,7 +1433,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1411
1433
|
currency = None
|
1412
1434
|
if code is not None:
|
1413
1435
|
currency = self.currency(code)
|
1414
|
-
request = {}
|
1436
|
+
request: dict = {}
|
1415
1437
|
if code is not None:
|
1416
1438
|
request['currency'] = code
|
1417
1439
|
if since is not None:
|
@@ -1445,20 +1467,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1445
1467
|
# ]
|
1446
1468
|
# }
|
1447
1469
|
#
|
1448
|
-
data = self.
|
1470
|
+
data = self.safe_list(response, 'data', [])
|
1449
1471
|
return self.parse_transactions(data, currency)
|
1450
1472
|
|
1451
1473
|
async def fetch_withdrawal(self, id: str, code: Str = None, params={}):
|
1452
1474
|
"""
|
1453
1475
|
fetch data on a currency withdrawal via the withdrawal id
|
1454
|
-
|
1476
|
+
|
1477
|
+
https://docs.kuna.io/docs/get-withdraw-details-by-id
|
1478
|
+
|
1455
1479
|
:param str id: withdrawal id
|
1456
1480
|
:param str code: not used by kuna.fetchWithdrawal
|
1457
1481
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1458
1482
|
:returns dict: a `transaction structure <https://docs.ccxt.com/#/?id=transaction-structure>`
|
1459
1483
|
"""
|
1460
1484
|
await self.load_markets()
|
1461
|
-
request = {
|
1485
|
+
request: dict = {
|
1462
1486
|
'withdrawId': id,
|
1463
1487
|
}
|
1464
1488
|
response = await self.v4PrivateGetWithdrawPrivateDetailsWithdrawId(self.extend(request, params))
|
@@ -1483,20 +1507,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1483
1507
|
# }
|
1484
1508
|
# }
|
1485
1509
|
#
|
1486
|
-
data = self.
|
1510
|
+
data = self.safe_dict(response, 'data', {})
|
1487
1511
|
return self.parse_transaction(data)
|
1488
1512
|
|
1489
1513
|
async def create_deposit_address(self, code: str, params={}):
|
1490
1514
|
"""
|
1491
1515
|
create a currency deposit address
|
1492
|
-
|
1516
|
+
|
1517
|
+
https://docs.kuna.io/docs/generate-a-constant-crypto-address-for-deposit
|
1518
|
+
|
1493
1519
|
:param str code: unified currency code of the currency for the deposit address
|
1494
1520
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1495
1521
|
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
1496
1522
|
"""
|
1497
1523
|
await self.load_markets()
|
1498
1524
|
currency = self.currency(code)
|
1499
|
-
request = {
|
1525
|
+
request: dict = {
|
1500
1526
|
'source': currency['id'],
|
1501
1527
|
}
|
1502
1528
|
response = await self.v4PrivatePostDepositPrivateCryptoGenerateAddress(self.extend(request, params))
|
@@ -1509,20 +1535,22 @@ class kuna(Exchange, ImplicitAPI):
|
|
1509
1535
|
# }
|
1510
1536
|
# }
|
1511
1537
|
#
|
1512
|
-
data = self.
|
1538
|
+
data = self.safe_dict(response, 'data', {})
|
1513
1539
|
return self.parse_deposit_address(data, currency)
|
1514
1540
|
|
1515
|
-
async def fetch_deposit_address(self, code: str, params={}):
|
1541
|
+
async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
1516
1542
|
"""
|
1517
1543
|
fetch the deposit address for a currency associated with self account
|
1518
|
-
|
1544
|
+
|
1545
|
+
https://docs.kuna.io/docs/find-crypto-address-for-deposit
|
1546
|
+
|
1519
1547
|
:param str code: unified currency code
|
1520
1548
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1521
1549
|
:returns dict: an `address structure <https://docs.ccxt.com/#/?id=address-structure>`
|
1522
1550
|
"""
|
1523
1551
|
await self.load_markets()
|
1524
1552
|
currency = self.currency(code)
|
1525
|
-
request = {
|
1553
|
+
request: dict = {
|
1526
1554
|
'source': currency['id'].upper(),
|
1527
1555
|
}
|
1528
1556
|
response = await self.v4PrivateGetDepositPrivateCryptoAddress(self.extend(request, params))
|
@@ -1535,10 +1563,10 @@ class kuna(Exchange, ImplicitAPI):
|
|
1535
1563
|
# }
|
1536
1564
|
# }
|
1537
1565
|
#
|
1538
|
-
data = self.
|
1566
|
+
data = self.safe_dict(response, 'data', {})
|
1539
1567
|
return self.parse_deposit_address(data, currency)
|
1540
1568
|
|
1541
|
-
def parse_deposit_address(self, depositAddress, currency: Currency = None):
|
1569
|
+
def parse_deposit_address(self, depositAddress, currency: Currency = None) -> DepositAddress:
|
1542
1570
|
#
|
1543
1571
|
# {
|
1544
1572
|
# "id": "c52b6646-fb91-4760-b147-a4f952e8652c", # ID of the address.
|
@@ -1555,8 +1583,8 @@ class kuna(Exchange, ImplicitAPI):
|
|
1555
1583
|
'tag': None,
|
1556
1584
|
}
|
1557
1585
|
|
1558
|
-
def parse_transaction_status(self, status):
|
1559
|
-
statuses = {
|
1586
|
+
def parse_transaction_status(self, status: Str):
|
1587
|
+
statuses: dict = {
|
1560
1588
|
'Created': 'pending',
|
1561
1589
|
'Canceled': 'canceled',
|
1562
1590
|
'PartiallyProcessed': 'pending',
|
@@ -1571,14 +1599,16 @@ class kuna(Exchange, ImplicitAPI):
|
|
1571
1599
|
async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
1572
1600
|
"""
|
1573
1601
|
fetch all deposits made to an account
|
1574
|
-
|
1602
|
+
|
1603
|
+
https://docs.kuna.io/docs/get-deposit-history
|
1604
|
+
|
1575
1605
|
:param str code: unified currency code
|
1576
1606
|
:param int [since]: the earliest time in ms to fetch deposits for
|
1577
1607
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
1578
1608
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1579
1609
|
:param int [params.until]: the latest time in ms to fetch deposits for
|
1580
|
-
|
1581
|
-
|
1610
|
+
|
1611
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1582
1612
|
:param str [params.status]: Created, Canceled, PartiallyProcessed, Processing, Processed, WaitForConfirmation, Pending, AmlChecking
|
1583
1613
|
:param str [params.sortField]: amount(sorting by time), createdAt(sorting by date)
|
1584
1614
|
:param str [params.sortOrder]: asc(oldest-on-top), or desc(newest-on-top, default)
|
@@ -1592,7 +1622,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1592
1622
|
currency = None
|
1593
1623
|
if code is not None:
|
1594
1624
|
currency = self.currency(code)
|
1595
|
-
request = {}
|
1625
|
+
request: dict = {}
|
1596
1626
|
if code is not None:
|
1597
1627
|
request['currency'] = code
|
1598
1628
|
if since is not None:
|
@@ -1626,13 +1656,15 @@ class kuna(Exchange, ImplicitAPI):
|
|
1626
1656
|
# ]
|
1627
1657
|
# }
|
1628
1658
|
#
|
1629
|
-
data = self.
|
1659
|
+
data = self.safe_list(response, 'data', [])
|
1630
1660
|
return self.parse_transactions(data, currency)
|
1631
1661
|
|
1632
1662
|
async def fetch_deposit(self, id: str, code: Str = None, params={}):
|
1633
1663
|
"""
|
1634
1664
|
fetch data on a currency deposit via the deposit id
|
1635
|
-
|
1665
|
+
|
1666
|
+
https://docs.kuna.io/docs/get-deposit-details-by-id
|
1667
|
+
|
1636
1668
|
:param str id: deposit id
|
1637
1669
|
:param str code: filter by currency code
|
1638
1670
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1642,7 +1674,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1642
1674
|
currency = None
|
1643
1675
|
if code is not None:
|
1644
1676
|
currency = self.currency(code)
|
1645
|
-
request = {
|
1677
|
+
request: dict = {
|
1646
1678
|
'depositId': id,
|
1647
1679
|
}
|
1648
1680
|
response = await self.v4PrivateGetDepositPrivateDetailsDepositId(self.extend(request, params))
|
@@ -1667,10 +1699,10 @@ class kuna(Exchange, ImplicitAPI):
|
|
1667
1699
|
# }
|
1668
1700
|
# }
|
1669
1701
|
#
|
1670
|
-
data = self.
|
1702
|
+
data = self.safe_dict(response, 'data', {})
|
1671
1703
|
return self.parse_transaction(data, currency)
|
1672
1704
|
|
1673
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
1705
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
1674
1706
|
#
|
1675
1707
|
# {
|
1676
1708
|
# "id": "a201cb3c-5830-57ac-ad2c-f6a588dd55eb", # Unique ID of deposit
|
@@ -1814,7 +1846,7 @@ class kuna(Exchange, ImplicitAPI):
|
|
1814
1846
|
body = json.dumps(body)
|
1815
1847
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
1816
1848
|
|
1817
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
1849
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1818
1850
|
#
|
1819
1851
|
# {
|
1820
1852
|
# "errors": [
|