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/async_support/bitrue.py
CHANGED
@@ -8,9 +8,10 @@ from ccxt.abstract.bitrue import ImplicitAPI
|
|
8
8
|
import asyncio
|
9
9
|
import hashlib
|
10
10
|
import json
|
11
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
|
11
|
+
from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
|
12
12
|
from typing import List
|
13
13
|
from ccxt.base.errors import ExchangeError
|
14
|
+
from ccxt.base.errors import AuthenticationError
|
14
15
|
from ccxt.base.errors import PermissionDenied
|
15
16
|
from ccxt.base.errors import AccountSuspended
|
16
17
|
from ccxt.base.errors import ArgumentsRequired
|
@@ -26,7 +27,6 @@ from ccxt.base.errors import RateLimitExceeded
|
|
26
27
|
from ccxt.base.errors import ExchangeNotAvailable
|
27
28
|
from ccxt.base.errors import OnMaintenance
|
28
29
|
from ccxt.base.errors import InvalidNonce
|
29
|
-
from ccxt.base.errors import AuthenticationError
|
30
30
|
from ccxt.base.decimal_to_precision import TRUNCATE
|
31
31
|
from ccxt.base.decimal_to_precision import TICK_SIZE
|
32
32
|
from ccxt.base.precise import Precise
|
@@ -73,7 +73,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
73
73
|
'fetchDepositsWithdrawals': False,
|
74
74
|
'fetchDepositWithdrawFee': 'emulated',
|
75
75
|
'fetchDepositWithdrawFees': True,
|
76
|
+
'fetchFundingHistory': False,
|
76
77
|
'fetchFundingRate': False,
|
78
|
+
'fetchFundingRateHistory': False,
|
79
|
+
'fetchFundingRates': False,
|
77
80
|
'fetchIsolatedBorrowRate': False,
|
78
81
|
'fetchIsolatedBorrowRates': False,
|
79
82
|
'fetchMarginMode': False,
|
@@ -113,7 +116,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
113
116
|
'1w': '1W',
|
114
117
|
},
|
115
118
|
'urls': {
|
116
|
-
'logo': 'https://
|
119
|
+
'logo': 'https://github.com/user-attachments/assets/67abe346-1273-461a-bd7c-42fa32907c8e',
|
117
120
|
'api': {
|
118
121
|
'spot': 'https://www.bitrue.com/api',
|
119
122
|
'fapi': 'https://fapi.bitrue.com/fapi',
|
@@ -345,6 +348,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
345
348
|
# 'fetchTradesMethod': 'publicGetAggTrades', # publicGetTrades, publicGetHistoricalTrades
|
346
349
|
'fetchMyTradesMethod': 'v2PrivateGetMyTrades', # spotV1PrivateGetMyTrades
|
347
350
|
'hasAlreadyAuthenticatedSuccessfully': False,
|
351
|
+
'currencyToPrecisionRoundingMode': TRUNCATE,
|
348
352
|
'recvWindow': 5 * 1000, # 5 sec, binance default
|
349
353
|
'timeDifference': 0, # the difference between system clock and Binance clock
|
350
354
|
'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
|
@@ -356,6 +360,67 @@ class bitrue(Exchange, ImplicitAPI):
|
|
356
360
|
'networks': {
|
357
361
|
'ERC20': 'ETH',
|
358
362
|
'TRC20': 'TRX',
|
363
|
+
'AETERNITY': 'Aeternity',
|
364
|
+
'AION': 'AION',
|
365
|
+
'ALGO': 'Algorand',
|
366
|
+
'ASK': 'ASK',
|
367
|
+
'ATOM': 'ATOM',
|
368
|
+
'AVAXC': 'AVAX C-Chain',
|
369
|
+
'BCH': 'BCH',
|
370
|
+
'BEP2': 'BEP2',
|
371
|
+
'BEP20': 'BEP20',
|
372
|
+
'Bitcoin': 'Bitcoin',
|
373
|
+
'BRP20': 'BRP20',
|
374
|
+
'ADA': 'Cardano',
|
375
|
+
'CASINOCOIN': 'CasinoCoin',
|
376
|
+
'CASINOCOIN-XRPL': 'CasinoCoin XRPL',
|
377
|
+
'CONTENTOS': 'Contentos',
|
378
|
+
'DASH': 'Dash',
|
379
|
+
'DECOIN': 'Decoin',
|
380
|
+
'DFI': 'DeFiChain',
|
381
|
+
'DGB': 'DGB',
|
382
|
+
'DIVI': 'Divi',
|
383
|
+
'DOGE': 'dogecoin',
|
384
|
+
'EOS': 'EOS',
|
385
|
+
'ETC': 'ETC',
|
386
|
+
'FILECOIN': 'Filecoin',
|
387
|
+
'FREETON': 'FREETON',
|
388
|
+
'HBAR': 'HBAR',
|
389
|
+
'HEDERA': 'Hedera Hashgraph',
|
390
|
+
'HRC20': 'HRC20',
|
391
|
+
'ICON': 'ICON',
|
392
|
+
'ICP': 'ICP',
|
393
|
+
'IGNIS': 'Ignis',
|
394
|
+
'INTERNETCOMPUTER': 'Internet Computer',
|
395
|
+
'IOTA': 'IOTA',
|
396
|
+
'KAVA': 'KAVA',
|
397
|
+
'KSM': 'KSM',
|
398
|
+
'LTC': 'LiteCoin',
|
399
|
+
'LUNA': 'Luna',
|
400
|
+
'MATIC': 'MATIC',
|
401
|
+
'MOBILECOIN': 'Mobile Coin',
|
402
|
+
'MONACOIN': 'MonaCoin',
|
403
|
+
'XMR': 'Monero',
|
404
|
+
'NEM': 'NEM',
|
405
|
+
'NEP5': 'NEP5',
|
406
|
+
'OMNI': 'OMNI',
|
407
|
+
'PAC': 'PAC',
|
408
|
+
'DOT': 'Polkadot',
|
409
|
+
'RAVEN': 'Ravencoin',
|
410
|
+
'SAFEX': 'Safex',
|
411
|
+
'SOL': 'SOLANA',
|
412
|
+
'SGB': 'Songbird',
|
413
|
+
'XML': 'Stellar Lumens',
|
414
|
+
'XYM': 'Symbol',
|
415
|
+
'XTZ': 'Tezos',
|
416
|
+
'theta': 'theta',
|
417
|
+
'THETA': 'THETA',
|
418
|
+
'VECHAIN': 'VeChain',
|
419
|
+
'WANCHAIN': 'Wanchain',
|
420
|
+
'XINFIN': 'XinFin Network',
|
421
|
+
'XRP': 'XRP',
|
422
|
+
'XRPL': 'XRPL',
|
423
|
+
'ZIL': 'ZIL',
|
359
424
|
},
|
360
425
|
'defaultType': 'spot',
|
361
426
|
'timeframes': {
|
@@ -395,7 +460,92 @@ class bitrue(Exchange, ImplicitAPI):
|
|
395
460
|
'MIM': 'MIM Swarm',
|
396
461
|
},
|
397
462
|
'precisionMode': TICK_SIZE,
|
398
|
-
|
463
|
+
'features': {
|
464
|
+
'default': {
|
465
|
+
'sandbox': False,
|
466
|
+
'createOrder': {
|
467
|
+
'marginMode': False,
|
468
|
+
'triggerPrice': True,
|
469
|
+
'triggerPriceType': None,
|
470
|
+
'triggerDirection': None,
|
471
|
+
'stopLossPrice': False, # todo
|
472
|
+
'takeProfitPrice': False, # todo
|
473
|
+
'attachedStopLossTakeProfit': None,
|
474
|
+
'timeInForce': {
|
475
|
+
'IOC': True,
|
476
|
+
'FOK': True,
|
477
|
+
'PO': True,
|
478
|
+
'GTD': False,
|
479
|
+
},
|
480
|
+
'hedged': False,
|
481
|
+
'trailing': False,
|
482
|
+
'leverage': False,
|
483
|
+
'marketBuyRequiresPrice': True, # todo revise
|
484
|
+
'marketBuyByCost': True,
|
485
|
+
'selfTradePrevention': False,
|
486
|
+
'iceberg': True, # todo implement
|
487
|
+
},
|
488
|
+
'createOrders': None,
|
489
|
+
'fetchMyTrades': {
|
490
|
+
'marginMode': False,
|
491
|
+
'limit': 1000,
|
492
|
+
'daysBack': 100000,
|
493
|
+
'untilDays': 100000,
|
494
|
+
},
|
495
|
+
'fetchOrder': {
|
496
|
+
'marginMode': False,
|
497
|
+
'trigger': False,
|
498
|
+
'trailing': False,
|
499
|
+
},
|
500
|
+
'fetchOpenOrders': {
|
501
|
+
'marginMode': False,
|
502
|
+
'limit': None,
|
503
|
+
'trigger': False,
|
504
|
+
'trailing': False,
|
505
|
+
},
|
506
|
+
'fetchOrders': None,
|
507
|
+
'fetchClosedOrders': {
|
508
|
+
'marginMode': False,
|
509
|
+
'limit': 1000,
|
510
|
+
'daysBack': 90,
|
511
|
+
'daysBackCanceled': 1,
|
512
|
+
'untilDays': 90,
|
513
|
+
'trigger': False,
|
514
|
+
'trailing': False,
|
515
|
+
},
|
516
|
+
'fetchOHLCV': {
|
517
|
+
'limit': 1440,
|
518
|
+
},
|
519
|
+
},
|
520
|
+
'spot': {
|
521
|
+
'extends': 'default',
|
522
|
+
},
|
523
|
+
'forDerivatives': {
|
524
|
+
'extends': 'default',
|
525
|
+
'createOrder': {
|
526
|
+
'marginMode': True,
|
527
|
+
'leverage': True,
|
528
|
+
'marketBuyRequiresPrice': False,
|
529
|
+
'marketBuyByCost': False,
|
530
|
+
},
|
531
|
+
'fetchOHLCV': {
|
532
|
+
'limit': 300,
|
533
|
+
},
|
534
|
+
'fetchClosedOrders': None,
|
535
|
+
},
|
536
|
+
'swap': {
|
537
|
+
'linear': {
|
538
|
+
'extends': 'forDerivatives',
|
539
|
+
},
|
540
|
+
'inverse': {
|
541
|
+
'extends': 'forDerivatives',
|
542
|
+
},
|
543
|
+
},
|
544
|
+
'future': {
|
545
|
+
'linear': None,
|
546
|
+
'inverse': None,
|
547
|
+
},
|
548
|
+
},
|
399
549
|
'exceptions': {
|
400
550
|
'exact': {
|
401
551
|
'System is under maintenance.': OnMaintenance, # {"code":1,"msg":"System is under maintenance."}
|
@@ -422,7 +572,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
422
572
|
'-1022': AuthenticationError, # {"code":-1022,"msg":"Signature for self request is not valid."}
|
423
573
|
'-1100': BadRequest, # createOrder(symbol, 1, asdf) -> 'Illegal characters found in parameter 'price'
|
424
574
|
'-1101': BadRequest, # Too many parameters; expected %s and received %s.
|
425
|
-
'-1102': BadRequest, # Param %s or %s must be sent, but both were empty
|
575
|
+
'-1102': BadRequest, # Param %s or %s must be sent, but both were empty # {"code":-1102,"msg":"timestamp IllegalArgumentException.","data":null}
|
426
576
|
'-1103': BadRequest, # An unknown parameter was sent.
|
427
577
|
'-1104': BadRequest, # Not all sent parameters were read, read 8 parameters but was sent 9
|
428
578
|
'-1105': BadRequest, # Parameter %s was empty.
|
@@ -467,26 +617,22 @@ class bitrue(Exchange, ImplicitAPI):
|
|
467
617
|
'-4051': InsufficientFunds, # {"code":-4051,"msg":"Isolated balance insufficient."}
|
468
618
|
},
|
469
619
|
'broad': {
|
620
|
+
'Insufficient account balance': InsufficientFunds, # {"code":-2010,"msg":"Insufficient account balance.","data":null}
|
470
621
|
'has no operation privilege': PermissionDenied,
|
471
622
|
'MAX_POSITION': InvalidOrder, # {"code":-2010,"msg":"Filter failure: MAX_POSITION"}
|
472
623
|
},
|
473
624
|
},
|
474
625
|
})
|
475
626
|
|
476
|
-
def currency_to_precision(self, code, fee, networkCode=None):
|
477
|
-
# info is available in currencies only if the user has configured his api keys
|
478
|
-
if self.safe_value(self.currencies[code], 'precision') is not None:
|
479
|
-
return self.decimal_to_precision(fee, TRUNCATE, self.currencies[code]['precision'], self.precisionMode, self.paddingMode)
|
480
|
-
else:
|
481
|
-
return self.number_to_string(fee)
|
482
|
-
|
483
627
|
def nonce(self):
|
484
628
|
return self.milliseconds() - self.options['timeDifference']
|
485
629
|
|
486
630
|
async def fetch_status(self, params={}):
|
487
631
|
"""
|
488
632
|
the latest known information on the availability of the exchange API
|
489
|
-
|
633
|
+
|
634
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#test-connectivity
|
635
|
+
|
490
636
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
491
637
|
:returns dict: a `status structure <https://docs.ccxt.com/#/?id=exchange-status-structure>`
|
492
638
|
"""
|
@@ -510,7 +656,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
510
656
|
async def fetch_time(self, params={}):
|
511
657
|
"""
|
512
658
|
fetches the current integer timestamp in milliseconds from the exchange server
|
513
|
-
|
659
|
+
|
660
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#check-server-time
|
661
|
+
|
514
662
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
515
663
|
:returns int: the current integer timestamp in milliseconds from the exchange server
|
516
664
|
"""
|
@@ -522,78 +670,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
522
670
|
#
|
523
671
|
return self.safe_integer(response, 'serverTime')
|
524
672
|
|
525
|
-
def
|
526
|
-
uppercaseNetworkId = networkId.upper()
|
527
|
-
networksById = {
|
528
|
-
'Aeternity': 'Aeternity',
|
529
|
-
'AION': 'AION',
|
530
|
-
'Algorand': 'Algorand',
|
531
|
-
'ASK': 'ASK',
|
532
|
-
'ATOM': 'ATOM',
|
533
|
-
'AVAX C-Chain': 'AVAX C-Chain',
|
534
|
-
'bch': 'bch',
|
535
|
-
'BCH': 'BCH',
|
536
|
-
'BEP2': 'BEP2',
|
537
|
-
'BEP20': 'BEP20',
|
538
|
-
'Bitcoin': 'Bitcoin',
|
539
|
-
'BRP20': 'BRP20',
|
540
|
-
'Cardano': 'ADA',
|
541
|
-
'CasinoCoin': 'CasinoCoin',
|
542
|
-
'CasinoCoin XRPL': 'CasinoCoin XRPL',
|
543
|
-
'Contentos': 'Contentos',
|
544
|
-
'Dash': 'Dash',
|
545
|
-
'Decoin': 'Decoin',
|
546
|
-
'DeFiChain': 'DeFiChain',
|
547
|
-
'DGB': 'DGB',
|
548
|
-
'Divi': 'Divi',
|
549
|
-
'dogecoin': 'DOGE',
|
550
|
-
'EOS': 'EOS',
|
551
|
-
'ERC20': 'ERC20',
|
552
|
-
'ETC': 'ETC',
|
553
|
-
'Filecoin': 'Filecoin',
|
554
|
-
'FREETON': 'FREETON',
|
555
|
-
'HBAR': 'HBAR',
|
556
|
-
'Hedera Hashgraph': 'Hedera Hashgraph',
|
557
|
-
'HRC20': 'HRC20',
|
558
|
-
'ICON': 'ICON',
|
559
|
-
'ICP': 'ICP',
|
560
|
-
'Ignis': 'Ignis',
|
561
|
-
'Internet Computer': 'Internet Computer',
|
562
|
-
'IOTA': 'IOTA',
|
563
|
-
'KAVA': 'KAVA',
|
564
|
-
'KSM': 'KSM',
|
565
|
-
'LiteCoin': 'LiteCoin',
|
566
|
-
'Luna': 'Luna',
|
567
|
-
'MATIC': 'MATIC',
|
568
|
-
'Mobile Coin': 'Mobile Coin',
|
569
|
-
'MonaCoin': 'MonaCoin',
|
570
|
-
'Monero': 'Monero',
|
571
|
-
'NEM': 'NEM',
|
572
|
-
'NEP5': 'NEP5',
|
573
|
-
'OMNI': 'OMNI',
|
574
|
-
'PAC': 'PAC',
|
575
|
-
'Polkadot': 'Polkadot',
|
576
|
-
'Ravencoin': 'Ravencoin',
|
577
|
-
'Safex': 'Safex',
|
578
|
-
'SOLANA': 'SOL',
|
579
|
-
'Songbird': 'Songbird',
|
580
|
-
'Stellar Lumens': 'Stellar Lumens',
|
581
|
-
'Symbol': 'Symbol',
|
582
|
-
'Tezos': 'XTZ',
|
583
|
-
'theta': 'theta',
|
584
|
-
'THETA': 'THETA',
|
585
|
-
'TRC20': 'TRC20',
|
586
|
-
'VeChain': 'VeChain',
|
587
|
-
'VECHAIN': 'VECHAIN',
|
588
|
-
'Wanchain': 'Wanchain',
|
589
|
-
'XinFin Network': 'XinFin Network',
|
590
|
-
'XRP': 'XRP',
|
591
|
-
'XRPL': 'XRPL',
|
592
|
-
'ZIL': 'ZIL',
|
593
|
-
}
|
594
|
-
return self.safe_string_2(networksById, networkId, uppercaseNetworkId, networkId)
|
595
|
-
|
596
|
-
async def fetch_currencies(self, params={}):
|
673
|
+
async def fetch_currencies(self, params={}) -> Currencies:
|
597
674
|
"""
|
598
675
|
fetches all available currencies on an exchange
|
599
676
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -646,8 +723,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
646
723
|
# ],
|
647
724
|
# }
|
648
725
|
#
|
649
|
-
result = {}
|
650
|
-
coins = self.
|
726
|
+
result: dict = {}
|
727
|
+
coins = self.safe_list(response, 'coins', [])
|
651
728
|
for i in range(0, len(coins)):
|
652
729
|
currency = coins[i]
|
653
730
|
id = self.safe_string(currency, 'coin')
|
@@ -658,15 +735,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
658
735
|
minWithdrawString = None
|
659
736
|
maxWithdrawString = None
|
660
737
|
minWithdrawFeeString = None
|
661
|
-
networkDetails = self.
|
662
|
-
networks = {}
|
738
|
+
networkDetails = self.safe_list(currency, 'chainDetail', [])
|
739
|
+
networks: dict = {}
|
663
740
|
for j in range(0, len(networkDetails)):
|
664
741
|
entry = networkDetails[j]
|
665
742
|
networkId = self.safe_string(entry, 'chain')
|
666
743
|
network = self.network_id_to_code(networkId, code)
|
667
|
-
enableDeposit = self.
|
744
|
+
enableDeposit = self.safe_bool(entry, 'enableDeposit')
|
668
745
|
deposit = enableDeposit if (enableDeposit) else deposit
|
669
|
-
enableWithdraw = self.
|
746
|
+
enableWithdraw = self.safe_bool(entry, 'enableWithdraw')
|
670
747
|
withdraw = enableWithdraw if (enableWithdraw) else withdraw
|
671
748
|
networkWithdrawFeeString = self.safe_string(entry, 'withdrawFee')
|
672
749
|
if networkWithdrawFeeString is not None:
|
@@ -714,12 +791,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
714
791
|
}
|
715
792
|
return result
|
716
793
|
|
717
|
-
async def fetch_markets(self, params={}):
|
794
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
718
795
|
"""
|
719
796
|
retrieves data on all markets for bitrue
|
720
|
-
|
721
|
-
|
722
|
-
|
797
|
+
|
798
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
799
|
+
https://www.bitrue.com/api-docs#current-open-contract
|
800
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#current-open-contract
|
801
|
+
|
723
802
|
:param dict [params]: extra parameters specific to the exchange api endpoint
|
724
803
|
:returns dict[]: an array of objects representing market data
|
725
804
|
"""
|
@@ -810,7 +889,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
810
889
|
await self.load_time_difference()
|
811
890
|
return self.parse_markets(markets)
|
812
891
|
|
813
|
-
def parse_market(self, market) -> Market:
|
892
|
+
def parse_market(self, market: dict) -> Market:
|
814
893
|
id = self.safe_string(market, 'symbol')
|
815
894
|
lowercaseId = self.safe_string_lower(market, 'symbol')
|
816
895
|
side = self.safe_integer(market, 'side') # 1 linear, 0 inverse, None spot
|
@@ -842,11 +921,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
842
921
|
symbol = base + '/' + quote
|
843
922
|
if settle is not None:
|
844
923
|
symbol += ':' + settle
|
845
|
-
filters = self.
|
924
|
+
filters = self.safe_list(market, 'filters', [])
|
846
925
|
filtersByType = self.index_by(filters, 'filterType')
|
847
926
|
status = self.safe_string(market, 'status')
|
848
|
-
priceFilter = self.
|
849
|
-
amountFilter = self.
|
927
|
+
priceFilter = self.safe_dict(filtersByType, 'PRICE_FILTER', {})
|
928
|
+
amountFilter = self.safe_dict(filtersByType, 'LOT_SIZE', {})
|
850
929
|
defaultPricePrecision = self.safe_string(market, 'pricePrecision')
|
851
930
|
defaultAmountPrecision = self.safe_string(market, 'quantityPrecision')
|
852
931
|
pricePrecision = self.safe_string(priceFilter, 'priceScale', defaultPricePrecision)
|
@@ -956,7 +1035,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
956
1035
|
# ]
|
957
1036
|
# }
|
958
1037
|
#
|
959
|
-
result = {
|
1038
|
+
result: dict = {
|
960
1039
|
'info': response,
|
961
1040
|
}
|
962
1041
|
timestamp = self.safe_integer(response, 'updateTime')
|
@@ -976,9 +1055,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
976
1055
|
async def fetch_balance(self, params={}) -> Balances:
|
977
1056
|
"""
|
978
1057
|
query for balance and get the amount of funds available for trading or funds locked in orders
|
979
|
-
|
980
|
-
|
981
|
-
|
1058
|
+
|
1059
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#account-information-user_data
|
1060
|
+
https://www.bitrue.com/api-docs#account-information-v2-user_data-hmac-sha256
|
1061
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#account-information-v2-user_data-hmac-sha256
|
1062
|
+
|
982
1063
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
983
1064
|
:param str [params.type]: 'future', 'delivery', 'spot', 'swap'
|
984
1065
|
:param str [params.subType]: 'linear', 'inverse'
|
@@ -994,7 +1075,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
994
1075
|
if type == 'swap':
|
995
1076
|
if subType is not None and subType == 'inverse':
|
996
1077
|
response = await self.dapiV2PrivateGetAccount(params)
|
997
|
-
result = self.
|
1078
|
+
result = self.safe_dict(response, 'data', {})
|
998
1079
|
#
|
999
1080
|
# {
|
1000
1081
|
# "code":"0",
|
@@ -1027,7 +1108,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1027
1108
|
#
|
1028
1109
|
else:
|
1029
1110
|
response = await self.fapiV2PrivateGetAccount(params)
|
1030
|
-
result = self.
|
1111
|
+
result = self.safe_dict(response, 'data', {})
|
1031
1112
|
#
|
1032
1113
|
# {
|
1033
1114
|
# "code":"0",
|
@@ -1083,9 +1164,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1083
1164
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
1084
1165
|
"""
|
1085
1166
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1167
|
+
|
1168
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#order-book
|
1169
|
+
https://www.bitrue.com/api-docs#order-book
|
1170
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#order-book
|
1171
|
+
|
1089
1172
|
:param str symbol: unified symbol of the market to fetch the order book for
|
1090
1173
|
:param int [limit]: the maximum amount of order book entries to return
|
1091
1174
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1095,7 +1178,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1095
1178
|
market = self.market(symbol)
|
1096
1179
|
response = None
|
1097
1180
|
if market['swap']:
|
1098
|
-
request = {
|
1181
|
+
request: dict = {
|
1099
1182
|
'contractName': market['id'],
|
1100
1183
|
}
|
1101
1184
|
if limit is not None:
|
@@ -1107,7 +1190,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1107
1190
|
elif market['inverse']:
|
1108
1191
|
response = await self.dapiV1PublicGetDepth(self.extend(request, params))
|
1109
1192
|
elif market['spot']:
|
1110
|
-
request = {
|
1193
|
+
request: dict = {
|
1111
1194
|
'symbol': market['id'],
|
1112
1195
|
}
|
1113
1196
|
if limit is not None:
|
@@ -1147,7 +1230,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1147
1230
|
orderbook['nonce'] = self.safe_integer(response, 'lastUpdateId')
|
1148
1231
|
return orderbook
|
1149
1232
|
|
1150
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
1233
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
1151
1234
|
#
|
1152
1235
|
# fetchBidsAsks
|
1153
1236
|
#
|
@@ -1217,9 +1300,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1217
1300
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
1218
1301
|
"""
|
1219
1302
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1303
|
+
|
1304
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
1305
|
+
https://www.bitrue.com/api-docs#ticker
|
1306
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1307
|
+
|
1223
1308
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
1224
1309
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1225
1310
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1229,7 +1314,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1229
1314
|
response = None
|
1230
1315
|
data = None
|
1231
1316
|
if market['swap']:
|
1232
|
-
request = {
|
1317
|
+
request: dict = {
|
1233
1318
|
'contractName': market['id'],
|
1234
1319
|
}
|
1235
1320
|
if market['linear']:
|
@@ -1238,11 +1323,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1238
1323
|
response = await self.dapiV1PublicGetTicker(self.extend(request, params))
|
1239
1324
|
data = response
|
1240
1325
|
elif market['spot']:
|
1241
|
-
request = {
|
1326
|
+
request: dict = {
|
1242
1327
|
'symbol': market['id'],
|
1243
1328
|
}
|
1244
1329
|
response = await self.spotV1PublicGetTicker24hr(self.extend(request, params))
|
1245
|
-
data = self.
|
1330
|
+
data = self.safe_dict(response, 0, {})
|
1246
1331
|
else:
|
1247
1332
|
raise NotSupported(self.id + ' fetchTicker only support spot & swap markets')
|
1248
1333
|
#
|
@@ -1288,9 +1373,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1288
1373
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
1289
1374
|
"""
|
1290
1375
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
1291
|
-
|
1292
|
-
|
1293
|
-
|
1376
|
+
|
1377
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#kline-data
|
1378
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#kline-candlestick-data
|
1379
|
+
|
1294
1380
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
1295
1381
|
:param str timeframe: the length of time each candle represents
|
1296
1382
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -1300,19 +1386,17 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1300
1386
|
"""
|
1301
1387
|
await self.load_markets()
|
1302
1388
|
market = self.market(symbol)
|
1303
|
-
timeframes = self.
|
1389
|
+
timeframes = self.safe_dict(self.options, 'timeframes', {})
|
1304
1390
|
response = None
|
1305
1391
|
data = None
|
1306
1392
|
if market['swap']:
|
1307
|
-
timeframesFuture = self.
|
1308
|
-
request = {
|
1393
|
+
timeframesFuture = self.safe_dict(timeframes, 'future', {})
|
1394
|
+
request: dict = {
|
1309
1395
|
'contractName': market['id'],
|
1310
1396
|
# 1min / 5min / 15min / 30min / 1h / 1day / 1week / 1month
|
1311
1397
|
'interval': self.safe_string(timeframesFuture, timeframe, '1min'),
|
1312
1398
|
}
|
1313
1399
|
if limit is not None:
|
1314
|
-
if limit > 300:
|
1315
|
-
limit = 300
|
1316
1400
|
request['limit'] = limit
|
1317
1401
|
if market['linear']:
|
1318
1402
|
response = await self.fapiV1PublicGetKlines(self.extend(request, params))
|
@@ -1320,20 +1404,18 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1320
1404
|
response = await self.dapiV1PublicGetKlines(self.extend(request, params))
|
1321
1405
|
data = response
|
1322
1406
|
elif market['spot']:
|
1323
|
-
timeframesSpot = self.
|
1324
|
-
request = {
|
1407
|
+
timeframesSpot = self.safe_dict(timeframes, 'spot', {})
|
1408
|
+
request: dict = {
|
1325
1409
|
'symbol': market['id'],
|
1326
1410
|
# 1m / 5m / 15m / 30m / 1H / 2H / 4H / 12H / 1D / 1W
|
1327
1411
|
'scale': self.safe_string(timeframesSpot, timeframe, '1m'),
|
1328
1412
|
}
|
1329
1413
|
if limit is not None:
|
1330
|
-
if limit > 1440:
|
1331
|
-
limit = 1440
|
1332
1414
|
request['limit'] = limit
|
1333
1415
|
if since is not None:
|
1334
1416
|
request['fromIdx'] = since
|
1335
1417
|
response = await self.spotV1PublicGetMarketKline(self.extend(request, params))
|
1336
|
-
data = self.
|
1418
|
+
data = self.safe_list(response, 'data', [])
|
1337
1419
|
else:
|
1338
1420
|
raise NotSupported(self.id + ' fetchOHLCV only support spot & swap markets')
|
1339
1421
|
#
|
@@ -1410,9 +1492,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1410
1492
|
async def fetch_bids_asks(self, symbols: Strings = None, params={}):
|
1411
1493
|
"""
|
1412
1494
|
fetches the bid and ask price and volume for multiple markets
|
1413
|
-
|
1414
|
-
|
1415
|
-
|
1495
|
+
|
1496
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#symbol-order-book-ticker
|
1497
|
+
https://www.bitrue.com/api-docs#ticker
|
1498
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1499
|
+
|
1416
1500
|
:param str[]|None symbols: unified symbols of the markets to fetch the bids and asks for, all markets are returned if not assigned
|
1417
1501
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1418
1502
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1423,7 +1507,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1423
1507
|
market = self.market(first)
|
1424
1508
|
response = None
|
1425
1509
|
if market['swap']:
|
1426
|
-
request = {
|
1510
|
+
request: dict = {
|
1427
1511
|
'contractName': market['id'],
|
1428
1512
|
}
|
1429
1513
|
if market['linear']:
|
@@ -1431,7 +1515,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1431
1515
|
elif market['inverse']:
|
1432
1516
|
response = await self.dapiV1PublicGetTicker(self.extend(request, params))
|
1433
1517
|
elif market['spot']:
|
1434
|
-
request = {
|
1518
|
+
request: dict = {
|
1435
1519
|
'symbol': market['id'],
|
1436
1520
|
}
|
1437
1521
|
response = await self.spotV1PublicGetTickerBookTicker(self.extend(request, params))
|
@@ -1461,16 +1545,18 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1461
1545
|
# "time": 1699348013000
|
1462
1546
|
# }
|
1463
1547
|
#
|
1464
|
-
data = {}
|
1548
|
+
data: dict = {}
|
1465
1549
|
data[market['id']] = response
|
1466
1550
|
return self.parse_tickers(data, symbols)
|
1467
1551
|
|
1468
1552
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
1469
1553
|
"""
|
1470
1554
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1555
|
+
|
1556
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#24hr-ticker-price-change-statistics
|
1557
|
+
https://www.bitrue.com/api-docs#ticker
|
1558
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#ticker
|
1559
|
+
|
1474
1560
|
:param str[]|None symbols: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
1475
1561
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1476
1562
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
@@ -1479,7 +1565,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1479
1565
|
symbols = self.market_symbols(symbols)
|
1480
1566
|
response = None
|
1481
1567
|
data = None
|
1482
|
-
request = {}
|
1568
|
+
request: dict = {}
|
1483
1569
|
type = None
|
1484
1570
|
if symbols is not None:
|
1485
1571
|
first = self.safe_string(symbols, 0)
|
@@ -1538,14 +1624,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1538
1624
|
# the exchange returns market ids with an underscore from the tickers endpoint
|
1539
1625
|
# the market ids do not have an underscore, so it has to be removed
|
1540
1626
|
# https://github.com/ccxt/ccxt/issues/13856
|
1541
|
-
tickers = {}
|
1627
|
+
tickers: dict = {}
|
1542
1628
|
for i in range(0, len(data)):
|
1543
|
-
ticker = self.
|
1629
|
+
ticker = self.safe_dict(data, i, {})
|
1544
1630
|
market = self.market(self.safe_value(ticker, 'symbol'))
|
1545
1631
|
tickers[market['id']] = ticker
|
1546
1632
|
return self.parse_tickers(tickers, symbols)
|
1547
1633
|
|
1548
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
1634
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
1549
1635
|
#
|
1550
1636
|
# fetchTrades
|
1551
1637
|
#
|
@@ -1602,8 +1688,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1602
1688
|
orderId = self.safe_string(trade, 'orderId')
|
1603
1689
|
id = self.safe_string_2(trade, 'id', 'tradeId')
|
1604
1690
|
side = None
|
1605
|
-
buyerMaker = self.
|
1606
|
-
isBuyer = self.
|
1691
|
+
buyerMaker = self.safe_bool(trade, 'isBuyerMaker') # ignore "m" until Bitrue fixes api
|
1692
|
+
isBuyer = self.safe_bool(trade, 'isBuyer')
|
1607
1693
|
if buyerMaker is not None:
|
1608
1694
|
side = 'sell' if buyerMaker else 'buy'
|
1609
1695
|
if isBuyer is not None:
|
@@ -1615,7 +1701,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1615
1701
|
'currency': self.safe_currency_code(self.safe_string(trade, 'commissionAssert')),
|
1616
1702
|
}
|
1617
1703
|
takerOrMaker = None
|
1618
|
-
isMaker = self.
|
1704
|
+
isMaker = self.safe_bool(trade, 'isMaker')
|
1619
1705
|
if isMaker is not None:
|
1620
1706
|
takerOrMaker = 'maker' if isMaker else 'taker'
|
1621
1707
|
return self.safe_trade({
|
@@ -1637,7 +1723,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1637
1723
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1638
1724
|
"""
|
1639
1725
|
get the list of most recent trades for a particular symbol
|
1640
|
-
|
1726
|
+
|
1727
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#recent-trades-list
|
1728
|
+
|
1641
1729
|
:param str symbol: unified symbol of the market to fetch trades for
|
1642
1730
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
1643
1731
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -1648,7 +1736,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1648
1736
|
market = self.market(symbol)
|
1649
1737
|
response = None
|
1650
1738
|
if market['spot']:
|
1651
|
-
request = {
|
1739
|
+
request: dict = {
|
1652
1740
|
'symbol': market['id'],
|
1653
1741
|
# 'limit': 100, # default 100, max = 1000
|
1654
1742
|
}
|
@@ -1673,8 +1761,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1673
1761
|
#
|
1674
1762
|
return self.parse_trades(response, market, since, limit)
|
1675
1763
|
|
1676
|
-
def parse_order_status(self, status):
|
1677
|
-
statuses = {
|
1764
|
+
def parse_order_status(self, status: Str):
|
1765
|
+
statuses: dict = {
|
1678
1766
|
'INIT': 'open',
|
1679
1767
|
'PENDING_CREATE': 'open',
|
1680
1768
|
'NEW': 'open',
|
@@ -1687,7 +1775,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1687
1775
|
}
|
1688
1776
|
return self.safe_string(statuses, status, status)
|
1689
1777
|
|
1690
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1778
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1691
1779
|
#
|
1692
1780
|
# createOrder - spot
|
1693
1781
|
#
|
@@ -1768,14 +1856,13 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1768
1856
|
id = self.safe_string(order, 'orderId')
|
1769
1857
|
type = self.safe_string_lower(order, 'type')
|
1770
1858
|
side = self.safe_string_lower(order, 'side')
|
1771
|
-
fills = self.
|
1859
|
+
fills = self.safe_list(order, 'fills', [])
|
1772
1860
|
clientOrderId = self.safe_string(order, 'clientOrderId')
|
1773
1861
|
timeInForce = self.safe_string(order, 'timeInForce')
|
1774
1862
|
postOnly = (type == 'limit_maker') or (timeInForce == 'GTX') or (type == 'post_only')
|
1775
1863
|
if type == 'limit_maker':
|
1776
1864
|
type = 'limit'
|
1777
|
-
|
1778
|
-
stopPrice = self.parse_number(self.omit_zero(stopPriceString))
|
1865
|
+
triggerPrice = self.parse_number(self.omit_zero(self.safe_string(order, 'stopPrice')))
|
1779
1866
|
return self.safe_order({
|
1780
1867
|
'info': order,
|
1781
1868
|
'id': id,
|
@@ -1789,8 +1876,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1789
1876
|
'postOnly': postOnly,
|
1790
1877
|
'side': side,
|
1791
1878
|
'price': price,
|
1792
|
-
'
|
1793
|
-
'triggerPrice': stopPrice,
|
1879
|
+
'triggerPrice': triggerPrice,
|
1794
1880
|
'amount': amount,
|
1795
1881
|
'cost': cost,
|
1796
1882
|
'average': average,
|
@@ -1804,8 +1890,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1804
1890
|
async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}):
|
1805
1891
|
"""
|
1806
1892
|
create a market buy order by providing the symbol and cost
|
1807
|
-
|
1808
|
-
|
1893
|
+
|
1894
|
+
https://www.bitrue.com/api-docs#new-order-trade-hmac-sha256
|
1895
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#new-order-trade-hmac-sha256
|
1896
|
+
|
1809
1897
|
:param str symbol: unified symbol of the market to create an order in
|
1810
1898
|
:param float cost: how much you want to trade in units of the quote currency
|
1811
1899
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1821,14 +1909,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1821
1909
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1822
1910
|
"""
|
1823
1911
|
create a trade order
|
1824
|
-
|
1825
|
-
|
1826
|
-
|
1912
|
+
|
1913
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#new-order-trade
|
1914
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#new-order-trade-hmac-sha256
|
1915
|
+
|
1827
1916
|
:param str symbol: unified symbol of the market to create an order in
|
1828
1917
|
:param str type: 'market' or 'limit'
|
1829
1918
|
:param str side: 'buy' or 'sell'
|
1830
1919
|
:param float amount: how much of currency you want to trade in units of base currency
|
1831
|
-
:param float [price]: the price at which the order is to be
|
1920
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1832
1921
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1833
1922
|
:param float [params.triggerPrice]: *spot only* the price at which a trigger order is triggered at
|
1834
1923
|
:param str [params.clientOrderId]: a unique id for the order, automatically generated if not sent
|
@@ -1836,7 +1925,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1836
1925
|
:param str [params.timeInForce]: 'fok', 'ioc' or 'po'
|
1837
1926
|
:param bool [params.postOnly]: default False
|
1838
1927
|
:param bool [params.reduceOnly]: default False
|
1839
|
-
|
1928
|
+
EXCHANGE SPECIFIC PARAMETERS
|
1840
1929
|
:param decimal [params.icebergQty]:
|
1841
1930
|
:param long [params.recvWindow]:
|
1842
1931
|
:param float [params.cost]: *swap market buy only* the quote quantity that can be used alternative for the amount
|
@@ -1847,7 +1936,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1847
1936
|
response = None
|
1848
1937
|
data = None
|
1849
1938
|
uppercaseType = type.upper()
|
1850
|
-
request = {
|
1939
|
+
request: dict = {
|
1851
1940
|
'side': side.upper(),
|
1852
1941
|
'type': uppercaseType,
|
1853
1942
|
# 'timeInForce': '',
|
@@ -1898,7 +1987,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1898
1987
|
response = await self.fapiV2PrivatePostOrder(self.extend(request, params))
|
1899
1988
|
elif market['inverse']:
|
1900
1989
|
response = await self.dapiV2PrivatePostOrder(self.extend(request, params))
|
1901
|
-
data = self.
|
1990
|
+
data = self.safe_dict(response, 'data', {})
|
1902
1991
|
elif market['spot']:
|
1903
1992
|
request['symbol'] = market['id']
|
1904
1993
|
request['quantity'] = self.amount_to_precision(symbol, amount)
|
@@ -1909,10 +1998,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1909
1998
|
if clientOrderId is not None:
|
1910
1999
|
params = self.omit(params, ['newClientOrderId', 'clientOrderId'])
|
1911
2000
|
request['newClientOrderId'] = clientOrderId
|
1912
|
-
|
1913
|
-
if
|
2001
|
+
triggerPrice = self.safe_value_2(params, 'triggerPrice', 'stopPrice')
|
2002
|
+
if triggerPrice is not None:
|
1914
2003
|
params = self.omit(params, ['triggerPrice', 'stopPrice'])
|
1915
|
-
request['stopPrice'] = self.price_to_precision(symbol,
|
2004
|
+
request['stopPrice'] = self.price_to_precision(symbol, triggerPrice)
|
1916
2005
|
response = await self.spotV1PrivatePostOrder(self.extend(request, params))
|
1917
2006
|
data = response
|
1918
2007
|
else:
|
@@ -1943,9 +2032,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1943
2032
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1944
2033
|
"""
|
1945
2034
|
fetches information on an order made by the user
|
1946
|
-
|
1947
|
-
|
1948
|
-
|
2035
|
+
|
2036
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#query-order-user_data
|
2037
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#query-order-user_data-hmac-sha256
|
2038
|
+
|
2039
|
+
:param str id: the order id
|
1949
2040
|
:param str symbol: unified symbol of the market the order was made in
|
1950
2041
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1951
2042
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1958,7 +2049,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1958
2049
|
params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
|
1959
2050
|
response = None
|
1960
2051
|
data = None
|
1961
|
-
request = {}
|
2052
|
+
request: dict = {}
|
1962
2053
|
if origClientOrderId is None:
|
1963
2054
|
request['orderId'] = id
|
1964
2055
|
else:
|
@@ -1972,7 +2063,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1972
2063
|
response = await self.fapiV2PrivateGetOrder(self.extend(request, params))
|
1973
2064
|
elif market['inverse']:
|
1974
2065
|
response = await self.dapiV2PrivateGetOrder(self.extend(request, params))
|
1975
|
-
data = self.
|
2066
|
+
data = self.safe_dict(response, 'data', {})
|
1976
2067
|
elif market['spot']:
|
1977
2068
|
request['orderId'] = id # spot market id is mandatory
|
1978
2069
|
request['symbol'] = market['id']
|
@@ -2028,7 +2119,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2028
2119
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
2029
2120
|
"""
|
2030
2121
|
fetches information on multiple closed orders made by the user
|
2031
|
-
|
2122
|
+
|
2123
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#all-orders-user_data
|
2124
|
+
|
2032
2125
|
:param str symbol: unified market symbol of the market orders were made in
|
2033
2126
|
:param int [since]: the earliest time in ms to fetch orders for
|
2034
2127
|
:param int [limit]: the maximum number of order structures to retrieve
|
@@ -2041,7 +2134,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2041
2134
|
market = self.market(symbol)
|
2042
2135
|
if not market['spot']:
|
2043
2136
|
raise NotSupported(self.id + ' fetchClosedOrders only support spot markets')
|
2044
|
-
request = {
|
2137
|
+
request: dict = {
|
2045
2138
|
'symbol': market['id'],
|
2046
2139
|
# 'orderId': 123445, # long
|
2047
2140
|
# 'startTime': since,
|
@@ -2080,9 +2173,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2080
2173
|
async def fetch_open_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
2081
2174
|
"""
|
2082
2175
|
fetch all unfilled currently open orders
|
2083
|
-
|
2084
|
-
|
2085
|
-
|
2176
|
+
|
2177
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#current-open-orders-user_data
|
2178
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#cancel-all-open-orders-trade-hmac-sha256
|
2179
|
+
|
2086
2180
|
:param str symbol: unified market symbol
|
2087
2181
|
:param int [since]: the earliest time in ms to fetch open orders for
|
2088
2182
|
:param int [limit]: the maximum number of open order structures to retrieve
|
@@ -2095,14 +2189,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2095
2189
|
market = self.market(symbol)
|
2096
2190
|
response = None
|
2097
2191
|
data = None
|
2098
|
-
request = {}
|
2192
|
+
request: dict = {}
|
2099
2193
|
if market['swap']:
|
2100
2194
|
request['contractName'] = market['id']
|
2101
2195
|
if market['linear']:
|
2102
2196
|
response = await self.fapiV2PrivateGetOpenOrders(self.extend(request, params))
|
2103
2197
|
elif market['inverse']:
|
2104
2198
|
response = await self.dapiV2PrivateGetOpenOrders(self.extend(request, params))
|
2105
|
-
data = self.
|
2199
|
+
data = self.safe_list(response, 'data', [])
|
2106
2200
|
elif market['spot']:
|
2107
2201
|
request['symbol'] = market['id']
|
2108
2202
|
response = await self.spotV1PrivateGetOpenOrders(self.extend(request, params))
|
@@ -2160,9 +2254,11 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2160
2254
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
2161
2255
|
"""
|
2162
2256
|
cancels an open order
|
2163
|
-
|
2164
|
-
|
2165
|
-
|
2257
|
+
|
2258
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#cancel-order-trade
|
2259
|
+
https://www.bitrue.com/api-docs#cancel-order-trade-hmac-sha256
|
2260
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-order-trade-hmac-sha256
|
2261
|
+
|
2166
2262
|
:param str id: order id
|
2167
2263
|
:param str symbol: unified symbol of the market the order was made in
|
2168
2264
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -2176,7 +2272,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2176
2272
|
params = self.omit(params, ['origClientOrderId', 'clientOrderId'])
|
2177
2273
|
response = None
|
2178
2274
|
data = None
|
2179
|
-
request = {}
|
2275
|
+
request: dict = {}
|
2180
2276
|
if origClientOrderId is None:
|
2181
2277
|
request['orderId'] = id
|
2182
2278
|
else:
|
@@ -2190,7 +2286,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2190
2286
|
response = await self.fapiV2PrivatePostCancel(self.extend(request, params))
|
2191
2287
|
elif market['inverse']:
|
2192
2288
|
response = await self.dapiV2PrivatePostCancel(self.extend(request, params))
|
2193
|
-
data = self.
|
2289
|
+
data = self.safe_dict(response, 'data', {})
|
2194
2290
|
elif market['spot']:
|
2195
2291
|
request['symbol'] = market['id']
|
2196
2292
|
response = await self.spotV1PrivateDeleteOrder(self.extend(request, params))
|
@@ -2222,8 +2318,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2222
2318
|
async def cancel_all_orders(self, symbol: Str = None, params={}):
|
2223
2319
|
"""
|
2224
2320
|
cancel all open orders in a market
|
2225
|
-
|
2226
|
-
|
2321
|
+
|
2322
|
+
https://www.bitrue.com/api-docs#cancel-all-open-orders-trade-hmac-sha256
|
2323
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#cancel-all-open-orders-trade-hmac-sha256
|
2324
|
+
|
2227
2325
|
:param str symbol: unified market symbol of the market to cancel orders in
|
2228
2326
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2229
2327
|
:param str [params.marginMode]: 'cross' or 'isolated', for spot margin trading
|
@@ -2234,14 +2332,14 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2234
2332
|
response = None
|
2235
2333
|
data = None
|
2236
2334
|
if market['swap']:
|
2237
|
-
request = {
|
2335
|
+
request: dict = {
|
2238
2336
|
'contractName': market['id'],
|
2239
2337
|
}
|
2240
2338
|
if market['linear']:
|
2241
2339
|
response = await self.fapiV2PrivatePostAllOpenOrders(self.extend(request, params))
|
2242
2340
|
elif market['inverse']:
|
2243
2341
|
response = await self.dapiV2PrivatePostAllOpenOrders(self.extend(request, params))
|
2244
|
-
data = self.
|
2342
|
+
data = self.safe_list(response, 'data', [])
|
2245
2343
|
else:
|
2246
2344
|
raise NotSupported(self.id + ' cancelAllOrders only support future markets')
|
2247
2345
|
#
|
@@ -2258,9 +2356,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2258
2356
|
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
2259
2357
|
"""
|
2260
2358
|
fetch all trades made by the user
|
2261
|
-
|
2262
|
-
|
2263
|
-
|
2359
|
+
|
2360
|
+
https://www.bitrue.com/api_docs_includes_file/spot/index.html#account-trade-list-user_data
|
2361
|
+
https://www.bitrue.com/api_docs_includes_file/futures/index.html#account-trade-list-user_data-hmac-sha256
|
2362
|
+
|
2264
2363
|
:param str symbol: unified market symbol
|
2265
2364
|
:param int [since]: the earliest time in ms to fetch trades for
|
2266
2365
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -2273,7 +2372,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2273
2372
|
market = self.market(symbol)
|
2274
2373
|
response = None
|
2275
2374
|
data = None
|
2276
|
-
request = {}
|
2375
|
+
request: dict = {}
|
2277
2376
|
if since is not None:
|
2278
2377
|
request['startTime'] = since
|
2279
2378
|
if limit is not None:
|
@@ -2286,7 +2385,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2286
2385
|
response = await self.fapiV2PrivateGetMyTrades(self.extend(request, params))
|
2287
2386
|
elif market['inverse']:
|
2288
2387
|
response = await self.dapiV2PrivateGetMyTrades(self.extend(request, params))
|
2289
|
-
data = self.
|
2388
|
+
data = self.safe_list(response, 'data', [])
|
2290
2389
|
elif market['spot']:
|
2291
2390
|
request['symbol'] = market['id']
|
2292
2391
|
response = await self.spotV2PrivateGetMyTrades(self.extend(request, params))
|
@@ -2343,7 +2442,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2343
2442
|
async def fetch_deposits(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
2344
2443
|
"""
|
2345
2444
|
fetch all deposits made to an account
|
2346
|
-
|
2445
|
+
|
2446
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#deposit-history--withdraw_data
|
2447
|
+
|
2347
2448
|
:param str code: unified currency code
|
2348
2449
|
:param int [since]: the earliest time in ms to fetch deposits for
|
2349
2450
|
:param int [limit]: the maximum number of deposits structures to retrieve
|
@@ -2354,7 +2455,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2354
2455
|
raise ArgumentsRequired(self.id + ' fetchDeposits() requires a code argument')
|
2355
2456
|
await self.load_markets()
|
2356
2457
|
currency = self.currency(code)
|
2357
|
-
request = {
|
2458
|
+
request: dict = {
|
2358
2459
|
'coin': currency['id'],
|
2359
2460
|
'status': 1, # 0 init, 1 finished, default 0
|
2360
2461
|
# 'offset': 0,
|
@@ -2404,13 +2505,15 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2404
2505
|
# ]
|
2405
2506
|
# }
|
2406
2507
|
#
|
2407
|
-
data = self.
|
2508
|
+
data = self.safe_list(response, 'data', [])
|
2408
2509
|
return self.parse_transactions(data, currency, since, limit)
|
2409
2510
|
|
2410
2511
|
async def fetch_withdrawals(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Transaction]:
|
2411
2512
|
"""
|
2412
2513
|
fetch all withdrawals made from an account
|
2413
|
-
|
2514
|
+
|
2515
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-history--withdraw_data
|
2516
|
+
|
2414
2517
|
:param str code: unified currency code
|
2415
2518
|
:param int [since]: the earliest time in ms to fetch withdrawals for
|
2416
2519
|
:param int [limit]: the maximum number of withdrawals structures to retrieve
|
@@ -2421,7 +2524,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2421
2524
|
raise ArgumentsRequired(self.id + ' fetchWithdrawals() requires a code argument')
|
2422
2525
|
await self.load_markets()
|
2423
2526
|
currency = self.currency(code)
|
2424
|
-
request = {
|
2527
|
+
request: dict = {
|
2425
2528
|
'coin': currency['id'],
|
2426
2529
|
'status': 5, # 0 init, 5 finished, 6 canceled, default 0
|
2427
2530
|
# 'offset': 0,
|
@@ -2462,7 +2565,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2462
2565
|
return self.parse_transactions(data, currency)
|
2463
2566
|
|
2464
2567
|
def parse_transaction_status_by_type(self, status, type=None):
|
2465
|
-
statusesByType = {
|
2568
|
+
statusesByType: dict = {
|
2466
2569
|
'deposit': {
|
2467
2570
|
'0': 'pending',
|
2468
2571
|
'1': 'ok',
|
@@ -2473,10 +2576,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2473
2576
|
'6': 'canceled',
|
2474
2577
|
},
|
2475
2578
|
}
|
2476
|
-
statuses = self.
|
2579
|
+
statuses = self.safe_dict(statusesByType, type, {})
|
2477
2580
|
return self.safe_string(statuses, status, status)
|
2478
2581
|
|
2479
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
2582
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
2480
2583
|
#
|
2481
2584
|
# fetchDeposits
|
2482
2585
|
#
|
@@ -2596,10 +2699,12 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2596
2699
|
'fee': fee,
|
2597
2700
|
}
|
2598
2701
|
|
2599
|
-
async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
2702
|
+
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
2600
2703
|
"""
|
2601
2704
|
make a withdrawal
|
2602
|
-
|
2705
|
+
|
2706
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#withdraw-commit--withdraw_data
|
2707
|
+
|
2603
2708
|
:param str code: unified currency code
|
2604
2709
|
:param float amount: the amount to withdraw
|
2605
2710
|
:param str address: the address to withdraw to
|
@@ -2611,7 +2716,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2611
2716
|
self.check_address(address)
|
2612
2717
|
await self.load_markets()
|
2613
2718
|
currency = self.currency(code)
|
2614
|
-
request = {
|
2719
|
+
request: dict = {
|
2615
2720
|
'coin': currency['id'],
|
2616
2721
|
'amount': amount,
|
2617
2722
|
'addressTo': address,
|
@@ -2642,7 +2747,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2642
2747
|
# }
|
2643
2748
|
# }
|
2644
2749
|
#
|
2645
|
-
data = self.
|
2750
|
+
data = self.safe_dict(response, 'data', {})
|
2646
2751
|
return self.parse_transaction(data, currency)
|
2647
2752
|
|
2648
2753
|
def parse_deposit_withdraw_fee(self, fee, currency: Currency = None):
|
@@ -2654,9 +2759,9 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2654
2759
|
# "chainDetail": [[Object]]
|
2655
2760
|
# }
|
2656
2761
|
#
|
2657
|
-
chainDetails = self.
|
2762
|
+
chainDetails = self.safe_list(fee, 'chainDetail', [])
|
2658
2763
|
chainDetailLength = len(chainDetails)
|
2659
|
-
result = {
|
2764
|
+
result: dict = {
|
2660
2765
|
'info': fee,
|
2661
2766
|
'withdraw': {
|
2662
2767
|
'fee': None,
|
@@ -2686,14 +2791,16 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2686
2791
|
async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
|
2687
2792
|
"""
|
2688
2793
|
fetch deposit and withdraw fees
|
2689
|
-
|
2794
|
+
|
2795
|
+
https://github.com/Bitrue-exchange/Spot-official-api-docs#exchangeInfo_endpoint
|
2796
|
+
|
2690
2797
|
:param str[]|None codes: list of unified currency codes
|
2691
2798
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2692
2799
|
:returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
|
2693
2800
|
"""
|
2694
2801
|
await self.load_markets()
|
2695
2802
|
response = await self.spotV1PublicGetExchangeInfo(params)
|
2696
|
-
coins = self.
|
2803
|
+
coins = self.safe_list(response, 'coins')
|
2697
2804
|
return self.parse_deposit_withdraw_fees(coins, codes, 'coin')
|
2698
2805
|
|
2699
2806
|
def parse_transfer(self, transfer, currency=None):
|
@@ -2732,11 +2839,13 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2732
2839
|
'status': 'ok',
|
2733
2840
|
}
|
2734
2841
|
|
2735
|
-
async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}):
|
2842
|
+
async def fetch_transfers(self, code: Str = None, since: Int = None, limit: Int = None, params={}) -> List[TransferEntry]:
|
2736
2843
|
"""
|
2737
2844
|
fetch a history of internal transfers made on an account
|
2738
|
-
|
2739
|
-
|
2845
|
+
|
2846
|
+
https://www.bitrue.com/api-docs#get-future-account-transfer-history-list-user_data-hmac-sha256
|
2847
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#get-future-account-transfer-history-list-user_data-hmac-sha256
|
2848
|
+
|
2740
2849
|
:param str code: unified currency code of the currency transferred
|
2741
2850
|
:param int [since]: the earliest time in ms to fetch transfers for
|
2742
2851
|
:param int [limit]: the maximum number of transfers structures to retrieve
|
@@ -2747,7 +2856,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2747
2856
|
"""
|
2748
2857
|
await self.load_markets()
|
2749
2858
|
type = self.safe_string_2(params, 'type', 'transferType')
|
2750
|
-
request = {
|
2859
|
+
request: dict = {
|
2751
2860
|
'transferType': type,
|
2752
2861
|
}
|
2753
2862
|
currency = None
|
@@ -2784,8 +2893,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2784
2893
|
async def transfer(self, code: str, amount: float, fromAccount: str, toAccount: str, params={}) -> TransferEntry:
|
2785
2894
|
"""
|
2786
2895
|
transfer currency internally between wallets on the same account
|
2787
|
-
|
2788
|
-
|
2896
|
+
|
2897
|
+
https://www.bitrue.com/api-docs#new-future-account-transfer-user_data-hmac-sha256
|
2898
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#user-commission-rate-user_data-hmac-sha256
|
2899
|
+
|
2789
2900
|
:param str code: unified currency code
|
2790
2901
|
:param float amount: amount to transfer
|
2791
2902
|
:param str fromAccount: account to transfer from
|
@@ -2795,10 +2906,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2795
2906
|
"""
|
2796
2907
|
await self.load_markets()
|
2797
2908
|
currency = self.currency(code)
|
2798
|
-
accountTypes = self.
|
2909
|
+
accountTypes = self.safe_dict(self.options, 'accountsByType', {})
|
2799
2910
|
fromId = self.safe_string(accountTypes, fromAccount, fromAccount)
|
2800
2911
|
toId = self.safe_string(accountTypes, toAccount, toAccount)
|
2801
|
-
request = {
|
2912
|
+
request: dict = {
|
2802
2913
|
'coinSymbol': currency['id'],
|
2803
2914
|
'amount': self.currency_to_precision(code, amount),
|
2804
2915
|
'transferType': fromId + '_to_' + toId,
|
@@ -2811,14 +2922,16 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2811
2922
|
# 'data': null
|
2812
2923
|
# }
|
2813
2924
|
#
|
2814
|
-
data = self.
|
2925
|
+
data = self.safe_dict(response, 'data', {})
|
2815
2926
|
return self.parse_transfer(data, currency)
|
2816
2927
|
|
2817
2928
|
async def set_leverage(self, leverage: Int, symbol: Str = None, params={}):
|
2818
2929
|
"""
|
2819
2930
|
set the level of leverage for a market
|
2820
|
-
|
2821
|
-
|
2931
|
+
|
2932
|
+
https://www.bitrue.com/api-docs#change-initial-leverage-trade-hmac-sha256
|
2933
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#change-initial-leverage-trade-hmac-sha256
|
2934
|
+
|
2822
2935
|
:param float leverage: the rate of leverage
|
2823
2936
|
:param str symbol: unified market symbol
|
2824
2937
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -2831,7 +2944,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2831
2944
|
await self.load_markets()
|
2832
2945
|
market = self.market(symbol)
|
2833
2946
|
response = None
|
2834
|
-
request = {
|
2947
|
+
request: dict = {
|
2835
2948
|
'contractName': market['id'],
|
2836
2949
|
'leverage': leverage,
|
2837
2950
|
}
|
@@ -2843,21 +2956,36 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2843
2956
|
response = await self.dapiV2PrivatePostLevelEdit(self.extend(request, params))
|
2844
2957
|
return response
|
2845
2958
|
|
2846
|
-
def parse_margin_modification(self, data, market=None):
|
2959
|
+
def parse_margin_modification(self, data, market=None) -> MarginModification:
|
2960
|
+
#
|
2961
|
+
# setMargin
|
2962
|
+
#
|
2963
|
+
# {
|
2964
|
+
# "code": 0,
|
2965
|
+
# "msg": "success"
|
2966
|
+
# "data": null
|
2967
|
+
# }
|
2968
|
+
#
|
2847
2969
|
return {
|
2848
2970
|
'info': data,
|
2971
|
+
'symbol': market['symbol'],
|
2849
2972
|
'type': None,
|
2973
|
+
'marginMode': 'isolated',
|
2850
2974
|
'amount': None,
|
2975
|
+
'total': None,
|
2851
2976
|
'code': None,
|
2852
|
-
'symbol': market['symbol'],
|
2853
2977
|
'status': None,
|
2978
|
+
'timestamp': None,
|
2979
|
+
'datetime': None,
|
2854
2980
|
}
|
2855
2981
|
|
2856
|
-
async def set_margin(self, symbol: str, amount: float, params={}):
|
2982
|
+
async def set_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
|
2857
2983
|
"""
|
2858
2984
|
Either adds or reduces margin in an isolated position in order to set the margin to a specific value
|
2859
|
-
|
2860
|
-
|
2985
|
+
|
2986
|
+
https://www.bitrue.com/api-docs#modify-isolated-position-margin-trade-hmac-sha256
|
2987
|
+
https://www.bitrue.com/api_docs_includes_file/delivery.html#modify-isolated-position-margin-trade-hmac-sha256
|
2988
|
+
|
2861
2989
|
:param str symbol: unified market symbol of the market to set margin in
|
2862
2990
|
:param float amount: the amount to set the margin to
|
2863
2991
|
:param dict [params]: parameters specific to the exchange API endpoint
|
@@ -2868,7 +2996,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2868
2996
|
if not market['swap']:
|
2869
2997
|
raise NotSupported(self.id + ' setMargin only support swap markets')
|
2870
2998
|
response = None
|
2871
|
-
request = {
|
2999
|
+
request: dict = {
|
2872
3000
|
'contractName': market['id'],
|
2873
3001
|
'amount': self.parse_to_numeric(amount),
|
2874
3002
|
}
|
@@ -2890,7 +3018,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2890
3018
|
version = self.safe_string(api, 1)
|
2891
3019
|
access = self.safe_string(api, 2)
|
2892
3020
|
url = None
|
2893
|
-
if type == 'api' and version == 'kline':
|
3021
|
+
if (type == 'api' and version == 'kline') or (type == 'open' and path.find('listenKey') >= 0):
|
2894
3022
|
url = self.urls['api'][type]
|
2895
3023
|
else:
|
2896
3024
|
url = self.urls['api'][type] + '/' + version
|
@@ -2899,7 +3027,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2899
3027
|
if access == 'private':
|
2900
3028
|
self.check_required_credentials()
|
2901
3029
|
recvWindow = self.safe_integer(self.options, 'recvWindow', 5000)
|
2902
|
-
if type == 'spot':
|
3030
|
+
if type == 'spot' or type == 'open':
|
2903
3031
|
query = self.urlencode(self.extend({
|
2904
3032
|
'timestamp': self.nonce(),
|
2905
3033
|
'recvWindow': recvWindow,
|
@@ -2924,6 +3052,10 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2924
3052
|
signPath = signPath + '/' + version + '/' + path
|
2925
3053
|
signMessage = timestamp + method + signPath
|
2926
3054
|
if method == 'GET':
|
3055
|
+
keys = list(params.keys())
|
3056
|
+
keysLength = len(keys)
|
3057
|
+
if keysLength > 0:
|
3058
|
+
signMessage += '?' + self.urlencode(params)
|
2927
3059
|
signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
|
2928
3060
|
headers = {
|
2929
3061
|
'X-CH-APIKEY': self.apiKey,
|
@@ -2936,7 +3068,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2936
3068
|
'recvWindow': recvWindow,
|
2937
3069
|
}, params)
|
2938
3070
|
body = self.json(query)
|
2939
|
-
signMessage
|
3071
|
+
signMessage += body
|
2940
3072
|
signature = self.hmac(self.encode(signMessage), self.encode(self.secret), hashlib.sha256)
|
2941
3073
|
headers = {
|
2942
3074
|
'Content-Type': 'application/json',
|
@@ -2949,7 +3081,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
2949
3081
|
url += '?' + self.urlencode(params)
|
2950
3082
|
return {'url': url, 'method': method, 'body': body, 'headers': headers}
|
2951
3083
|
|
2952
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
3084
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
2953
3085
|
if (code == 418) or (code == 429):
|
2954
3086
|
raise DDoSProtection(self.id + ' ' + str(code) + ' ' + reason + ' ' + body)
|
2955
3087
|
# error response in a form: {"code": -1013, "msg": "Invalid quantity."}
|