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
@@ -7,10 +7,11 @@ from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.wavesexchange import ImplicitAPI
|
8
8
|
import asyncio
|
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, Currency, DepositAddress, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
11
11
|
from typing import List
|
12
12
|
from typing import Any
|
13
13
|
from ccxt.base.errors import ExchangeError
|
14
|
+
from ccxt.base.errors import AuthenticationError
|
14
15
|
from ccxt.base.errors import AccountSuspended
|
15
16
|
from ccxt.base.errors import ArgumentsRequired
|
16
17
|
from ccxt.base.errors import BadRequest
|
@@ -20,8 +21,7 @@ from ccxt.base.errors import InvalidOrder
|
|
20
21
|
from ccxt.base.errors import OrderNotFound
|
21
22
|
from ccxt.base.errors import DuplicateOrderId
|
22
23
|
from ccxt.base.errors import ExchangeNotAvailable
|
23
|
-
from ccxt.base.
|
24
|
-
from ccxt.base.decimal_to_precision import DECIMAL_PLACES
|
24
|
+
from ccxt.base.decimal_to_precision import TICK_SIZE
|
25
25
|
from ccxt.base.precise import Precise
|
26
26
|
|
27
27
|
|
@@ -34,6 +34,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
34
34
|
'countries': ['CH'], # Switzerland
|
35
35
|
'certified': False,
|
36
36
|
'pro': False,
|
37
|
+
'dex': True,
|
37
38
|
'has': {
|
38
39
|
'CORS': None,
|
39
40
|
'spot': True,
|
@@ -58,6 +59,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
58
59
|
'fetchCrossBorrowRate': False,
|
59
60
|
'fetchCrossBorrowRates': False,
|
60
61
|
'fetchDepositAddress': True,
|
62
|
+
'fetchDepositAddresses': None,
|
63
|
+
'fetchDepositAddressesByNetwork': None,
|
61
64
|
'fetchDepositWithdrawFee': 'emulated',
|
62
65
|
'fetchDepositWithdrawFees': True,
|
63
66
|
'fetchFundingHistory': False,
|
@@ -80,8 +83,11 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
80
83
|
'fetchOrderBook': True,
|
81
84
|
'fetchOrders': True,
|
82
85
|
'fetchPosition': False,
|
86
|
+
'fetchPositionHistory': False,
|
83
87
|
'fetchPositionMode': False,
|
84
88
|
'fetchPositions': False,
|
89
|
+
'fetchPositionsForSymbol': False,
|
90
|
+
'fetchPositionsHistory': False,
|
85
91
|
'fetchPositionsRisk': False,
|
86
92
|
'fetchPremiumIndexOHLCV': False,
|
87
93
|
'fetchTicker': True,
|
@@ -90,6 +96,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
90
96
|
'fetchTransfer': False,
|
91
97
|
'fetchTransfers': False,
|
92
98
|
'reduceMargin': False,
|
99
|
+
'sandbox': True,
|
93
100
|
'setLeverage': False,
|
94
101
|
'setMarginMode': False,
|
95
102
|
'setPositionMode': False,
|
@@ -131,7 +138,13 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
131
138
|
'forward': 'https://wx.network/api/v1/forward/matcher',
|
132
139
|
'market': 'https://wx.network/api/v1/forward/marketdata/api/v1',
|
133
140
|
},
|
134
|
-
'doc':
|
141
|
+
'doc': [
|
142
|
+
'https://docs.wx.network',
|
143
|
+
'https://docs.waves.tech',
|
144
|
+
'https://api.wavesplatform.com/v0/docs/',
|
145
|
+
'https://nodes.wavesnodes.com/api-docs/index.html',
|
146
|
+
'https://matcher.waves.exchange/api-docs/index.html',
|
147
|
+
],
|
135
148
|
'www': 'https://wx.network',
|
136
149
|
},
|
137
150
|
'api': {
|
@@ -325,9 +338,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
325
338
|
},
|
326
339
|
},
|
327
340
|
'currencies': {
|
328
|
-
'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.
|
341
|
+
'WX': self.safe_currency_structure({'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': None, 'code': 'WX', 'precision': self.parse_number('1e-8')}),
|
329
342
|
},
|
330
|
-
'precisionMode':
|
343
|
+
'precisionMode': TICK_SIZE,
|
331
344
|
'options': {
|
332
345
|
'allowedCandles': 1440,
|
333
346
|
'accessToken': None,
|
@@ -338,7 +351,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
338
351
|
'wavesAddress': None,
|
339
352
|
'withdrawFeeUSDN': 7420,
|
340
353
|
'withdrawFeeWAVES': 100000,
|
341
|
-
'wavesPrecision': 8,
|
354
|
+
'wavesPrecision': 1e-8,
|
342
355
|
'messagePrefix': 'W', # W for production, T for testnet
|
343
356
|
'networks': {
|
344
357
|
'ERC20': 'ETH',
|
@@ -386,8 +399,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
386
399
|
async def get_fees_for_asset(self, symbol: str, side, amount, price, params={}):
|
387
400
|
await self.load_markets()
|
388
401
|
market = self.market(symbol)
|
389
|
-
amount = self.
|
390
|
-
price = self.
|
402
|
+
amount = self.to_real_symbol_amount(symbol, amount)
|
403
|
+
price = self.to_real_symbol_price(symbol, price)
|
391
404
|
request = self.extend({
|
392
405
|
'baseId': market['baseId'],
|
393
406
|
'quoteId': market['quoteId'],
|
@@ -418,7 +431,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
418
431
|
matcherFee = self.safe_string(mode, 'matcherFee')
|
419
432
|
feeAssetId = self.safe_string(mode, 'feeAssetId')
|
420
433
|
feeAsset = self.safe_currency_code(feeAssetId)
|
421
|
-
adjustedMatcherFee = self.
|
434
|
+
adjustedMatcherFee = self.from_real_currency_amount(feeAsset, matcherFee)
|
422
435
|
amountAsString = self.number_to_string(amount)
|
423
436
|
priceAsString = self.number_to_string(price)
|
424
437
|
feeCost = self.fee_to_precision(symbol, self.parse_number(adjustedMatcherFee))
|
@@ -495,7 +508,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
495
508
|
self.options['quotes'] = quotes
|
496
509
|
return quotes
|
497
510
|
|
498
|
-
async def fetch_markets(self, params={}):
|
511
|
+
async def fetch_markets(self, params={}) -> List[Market]:
|
499
512
|
"""
|
500
513
|
retrieves data on all markets for wavesexchange
|
501
514
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -566,8 +579,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
566
579
|
'strike': None,
|
567
580
|
'optionType': None,
|
568
581
|
'precision': {
|
569
|
-
'amount': self.
|
570
|
-
'price': self.
|
582
|
+
'amount': self.parse_number(self.parse_precision(self.safe_string(entry, 'amountAssetDecimals'))),
|
583
|
+
'price': self.parse_number(self.parse_precision(self.safe_string(entry, 'priceAssetDecimals'))),
|
571
584
|
},
|
572
585
|
'limits': {
|
573
586
|
'leverage': {
|
@@ -595,6 +608,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
595
608
|
async def fetch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
596
609
|
"""
|
597
610
|
fetches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
611
|
+
|
612
|
+
https://matcher.waves.exchange/api-docs/index.html#/markets/getOrderBook
|
613
|
+
|
598
614
|
:param str symbol: unified symbol of the market to fetch the order book for
|
599
615
|
:param int [limit]: the maximum amount of order book entries to return
|
600
616
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -621,12 +637,11 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
621
637
|
|
622
638
|
def parse_order_book_side(self, bookSide, market=None, limit: Int = None):
|
623
639
|
precision = market['precision']
|
624
|
-
wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '8')
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
pricePrecision = '1e' + Precise.string_sub(wavesPrecision, difference)
|
640
|
+
wavesPrecision = self.safe_string(self.options, 'wavesPrecision', '1e-8')
|
641
|
+
amountPrecisionString = self.safe_string(precision, 'amount')
|
642
|
+
pricePrecisionString = self.safe_string(precision, 'price')
|
643
|
+
difference = Precise.string_div(amountPrecisionString, pricePrecisionString)
|
644
|
+
pricePrecision = Precise.string_div(wavesPrecision, difference)
|
630
645
|
result = []
|
631
646
|
for i in range(0, len(bookSide)):
|
632
647
|
entry = bookSide[i]
|
@@ -635,9 +650,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
635
650
|
price = None
|
636
651
|
amount = None
|
637
652
|
if (pricePrecision is not None) and (entryPrice is not None):
|
638
|
-
price = Precise.
|
639
|
-
if (
|
640
|
-
amount = Precise.
|
653
|
+
price = Precise.string_mul(entryPrice, pricePrecision)
|
654
|
+
if (amountPrecisionString is not None) and (entryAmount is not None):
|
655
|
+
amount = Precise.string_mul(entryAmount, amountPrecisionString)
|
641
656
|
if (limit is not None) and (i > limit):
|
642
657
|
break
|
643
658
|
result.append([
|
@@ -716,6 +731,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
716
731
|
async def sign_in(self, params={}):
|
717
732
|
"""
|
718
733
|
sign in, must be called prior to using other authenticated methods
|
734
|
+
|
735
|
+
https://docs.wx.network/en/api/auth/oauth2-token
|
736
|
+
|
719
737
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
720
738
|
:returns: response from exchange
|
721
739
|
"""
|
@@ -732,7 +750,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
732
750
|
payload = prefix + messageHex
|
733
751
|
hexKey = self.binary_to_base16(self.base58_to_binary(self.secret))
|
734
752
|
signature = self.axolotl(payload, hexKey, 'ed25519')
|
735
|
-
request = {
|
753
|
+
request: dict = {
|
736
754
|
'grant_type': 'password',
|
737
755
|
'scope': 'general',
|
738
756
|
'username': self.apiKey,
|
@@ -749,7 +767,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
749
767
|
return self.options['accessToken']
|
750
768
|
return None
|
751
769
|
|
752
|
-
def parse_ticker(self, ticker, market: Market = None) -> Ticker:
|
770
|
+
def parse_ticker(self, ticker: dict, market: Market = None) -> Ticker:
|
753
771
|
#
|
754
772
|
# {
|
755
773
|
# "symbol": "WAVES/BTC",
|
@@ -826,13 +844,16 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
826
844
|
async def fetch_ticker(self, symbol: str, params={}) -> Ticker:
|
827
845
|
"""
|
828
846
|
fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
847
|
+
|
848
|
+
https://api.wavesplatform.com/v0/docs/#/pairs/getPairsListAll
|
849
|
+
|
829
850
|
:param str symbol: unified symbol of the market to fetch the ticker for
|
830
851
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
831
852
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
832
853
|
"""
|
833
854
|
await self.load_markets()
|
834
855
|
market = self.market(symbol)
|
835
|
-
request = {
|
856
|
+
request: dict = {
|
836
857
|
'pairs': market['id'],
|
837
858
|
}
|
838
859
|
response = await self.publicGetPairs(self.extend(request, params))
|
@@ -861,13 +882,13 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
861
882
|
#
|
862
883
|
data = self.safe_value(response, 'data', [])
|
863
884
|
ticker = self.safe_value(data, 0, {})
|
864
|
-
dataTicker = self.
|
885
|
+
dataTicker = self.safe_dict(ticker, 'data', {})
|
865
886
|
return self.parse_ticker(dataTicker, market)
|
866
887
|
|
867
888
|
async def fetch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
868
889
|
"""
|
869
890
|
fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
|
870
|
-
:param str[]
|
891
|
+
:param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
871
892
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
872
893
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
873
894
|
"""
|
@@ -906,6 +927,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
906
927
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
907
928
|
"""
|
908
929
|
fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
930
|
+
|
931
|
+
https://api.wavesplatform.com/v0/docs/#/candles/getCandles
|
932
|
+
|
909
933
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
910
934
|
:param str timeframe: the length of time each candle represents
|
911
935
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
@@ -915,7 +939,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
915
939
|
"""
|
916
940
|
await self.load_markets()
|
917
941
|
market = self.market(symbol)
|
918
|
-
request = {
|
942
|
+
request: dict = {
|
919
943
|
'baseId': market['baseId'],
|
920
944
|
'quoteId': market['quoteId'],
|
921
945
|
'interval': self.safe_string(self.timeframes, timeframe, timeframe),
|
@@ -1015,7 +1039,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1015
1039
|
self.safe_number(data, 'volume', 0),
|
1016
1040
|
]
|
1017
1041
|
|
1018
|
-
async def fetch_deposit_address(self, code: str, params={}):
|
1042
|
+
async def fetch_deposit_address(self, code: str, params={}) -> DepositAddress:
|
1019
1043
|
"""
|
1020
1044
|
fetch the deposit address for a currency associated with self account
|
1021
1045
|
:param str code: unified currency code
|
@@ -1060,8 +1084,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1060
1084
|
# ]
|
1061
1085
|
# }
|
1062
1086
|
#
|
1063
|
-
currencies = {}
|
1064
|
-
networksByCurrency = {}
|
1087
|
+
currencies: dict = {}
|
1088
|
+
networksByCurrency: dict = {}
|
1065
1089
|
items = self.safe_value(supportedCurrencies, 'items', [])
|
1066
1090
|
for i in range(0, len(items)):
|
1067
1091
|
entry = items[i]
|
@@ -1078,7 +1102,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1078
1102
|
raise ExchangeError(self.id + ' fetchDepositAddress() ' + code + ' not supported. Currency code must be one of ' + ', '.join(codes))
|
1079
1103
|
response = None
|
1080
1104
|
if network is None:
|
1081
|
-
request = {
|
1105
|
+
request: dict = {
|
1082
1106
|
'currency': code,
|
1083
1107
|
}
|
1084
1108
|
response = await self.privateGetDepositAddressesCurrency(self.extend(request, params))
|
@@ -1088,21 +1112,20 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1088
1112
|
supportedNetworkKeys = list(supportedNetworks.keys())
|
1089
1113
|
raise ExchangeError(self.id + ' ' + network + ' network ' + code + ' deposit address not supported. Network must be one of ' + ', '.join(supportedNetworkKeys))
|
1090
1114
|
if network == 'WAVES':
|
1091
|
-
request = {
|
1115
|
+
request: dict = {
|
1092
1116
|
'publicKey': self.apiKey,
|
1093
1117
|
}
|
1094
1118
|
responseInner = await self.nodeGetAddressesPublicKeyPublicKey(self.extend(request, request))
|
1095
1119
|
addressInner = self.safe_string(response, 'address')
|
1096
1120
|
return {
|
1097
|
-
'
|
1098
|
-
'code': code, # kept here for backward-compatibility, but will be removed soon
|
1121
|
+
'info': responseInner,
|
1099
1122
|
'currency': code,
|
1100
1123
|
'network': network,
|
1124
|
+
'address': addressInner,
|
1101
1125
|
'tag': None,
|
1102
|
-
'info': responseInner,
|
1103
1126
|
}
|
1104
1127
|
else:
|
1105
|
-
request = {
|
1128
|
+
request: dict = {
|
1106
1129
|
'currency': code,
|
1107
1130
|
'platform': network,
|
1108
1131
|
}
|
@@ -1137,12 +1160,11 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1137
1160
|
addresses = self.safe_value(response, 'deposit_addresses')
|
1138
1161
|
address = self.safe_string(addresses, 0)
|
1139
1162
|
return {
|
1140
|
-
'
|
1141
|
-
'code': code, # kept here for backward-compatibility, but will be removed soon
|
1163
|
+
'info': response,
|
1142
1164
|
'currency': code,
|
1143
|
-
'tag': None,
|
1144
1165
|
'network': unifiedNetwork,
|
1145
|
-
'
|
1166
|
+
'address': address,
|
1167
|
+
'tag': None,
|
1146
1168
|
}
|
1147
1169
|
|
1148
1170
|
async def get_matcher_public_key(self):
|
@@ -1167,50 +1189,35 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1167
1189
|
return ''
|
1168
1190
|
return currencyId
|
1169
1191
|
|
1170
|
-
def
|
1192
|
+
def to_real_currency_amount(self, code: str, amount: float, networkCode=None):
|
1193
|
+
currency = self.currency(code)
|
1194
|
+
stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(currency, 'precision'))
|
1195
|
+
return int(stringValue)
|
1196
|
+
|
1197
|
+
def from_real_currency_amount(self, code: str, amountString: str):
|
1198
|
+
if not (code in self.currencies):
|
1199
|
+
return amountString
|
1200
|
+
currency = self.currency(code)
|
1201
|
+
precisionAmount = self.safe_string(currency, 'precision')
|
1202
|
+
return Precise.string_mul(amountString, precisionAmount)
|
1203
|
+
|
1204
|
+
def to_real_symbol_price(self, symbol: str, price: float):
|
1205
|
+
market = self.market(symbol)
|
1206
|
+
stringValue = Precise.string_div(self.number_to_string(price), self.safe_string(market['precision'], 'price'))
|
1207
|
+
return int(stringValue)
|
1208
|
+
|
1209
|
+
def from_real_symbol_price(self, symbol: str, priceString: str):
|
1171
1210
|
market = self.markets[symbol]
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
def custom_amount_to_precision(self, symbol, amount):
|
1181
|
-
amountPrecision = self.number_to_string(self.to_precision(amount, self.number_to_string(self.markets[symbol]['precision']['amount'])))
|
1182
|
-
return self.parse_to_int(float(amountPrecision))
|
1183
|
-
|
1184
|
-
def currency_to_precision(self, code, amount, networkCode=None):
|
1185
|
-
amountPrecision = self.number_to_string(self.to_precision(amount, self.currencies[code]['precision']))
|
1186
|
-
return self.parse_to_int(float(amountPrecision))
|
1187
|
-
|
1188
|
-
def from_precision(self, amount, scale):
|
1189
|
-
if amount is None:
|
1190
|
-
return None
|
1191
|
-
precise = Precise(amount)
|
1192
|
-
precise.decimals = self.sum(precise.decimals, scale)
|
1193
|
-
precise.reduce()
|
1194
|
-
return str(precise)
|
1195
|
-
|
1196
|
-
def to_precision(self, amount, scale):
|
1197
|
-
amountString = self.number_to_string(amount)
|
1198
|
-
precise = Precise(amountString)
|
1199
|
-
# precise.decimals should be integer
|
1200
|
-
precise.decimals = self.parse_to_int(Precise.string_sub(self.number_to_string(precise.decimals), self.number_to_string(scale)))
|
1201
|
-
precise.reduce()
|
1202
|
-
stringValue = str(precise)
|
1203
|
-
return stringValue
|
1204
|
-
|
1205
|
-
def currency_from_precision(self, currency, amount):
|
1206
|
-
scale = self.currencies[currency]['precision']
|
1207
|
-
return self.from_precision(amount, scale)
|
1208
|
-
|
1209
|
-
def price_from_precision(self, symbol, price):
|
1211
|
+
return Precise.string_mul(priceString, self.safe_string(market['precision'], 'price'))
|
1212
|
+
|
1213
|
+
def to_real_symbol_amount(self, symbol: str, amount: float):
|
1214
|
+
market = self.market(symbol)
|
1215
|
+
stringValue = Precise.string_div(self.number_to_string(amount), self.safe_string(market['precision'], 'amount'))
|
1216
|
+
return int(stringValue)
|
1217
|
+
|
1218
|
+
def from_real_symbol_amount(self, symbol: str, amountString: str):
|
1210
1219
|
market = self.markets[symbol]
|
1211
|
-
|
1212
|
-
scale = self.sum(wavesPrecision, market['precision']['price']) - market['precision']['amount']
|
1213
|
-
return self.from_precision(price, scale)
|
1220
|
+
return Precise.string_mul(amountString, market['precision']['amount'])
|
1214
1221
|
|
1215
1222
|
def safe_get_dynamic(self, settings):
|
1216
1223
|
orderFee = self.safe_value(settings, 'orderFee')
|
@@ -1228,13 +1235,16 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1228
1235
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1229
1236
|
"""
|
1230
1237
|
create a trade order
|
1238
|
+
|
1239
|
+
https://matcher.waves.exchange/api-docs/index.html#/serialize/serializeOrder
|
1240
|
+
|
1231
1241
|
:param str symbol: unified symbol of the market to create an order in
|
1232
1242
|
:param str type: 'market' or 'limit'
|
1233
1243
|
:param str side: 'buy' or 'sell'
|
1234
1244
|
:param float amount: how much of currency you want to trade in units of base currency
|
1235
|
-
:param float [price]: the price at which the order is to be
|
1245
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1236
1246
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1237
|
-
:param float [params.
|
1247
|
+
:param float [params.triggerPrice]: The price at which a stop order is triggered at
|
1238
1248
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1239
1249
|
"""
|
1240
1250
|
self.check_required_dependencies()
|
@@ -1245,12 +1255,13 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1245
1255
|
amountAsset = self.get_asset_id(market['baseId'])
|
1246
1256
|
priceAsset = self.get_asset_id(market['quoteId'])
|
1247
1257
|
isMarketOrder = (type == 'market')
|
1248
|
-
|
1249
|
-
isStopOrder = (
|
1258
|
+
triggerPrice = self.safe_float_2(params, 'triggerPrice', 'stopPrice')
|
1259
|
+
isStopOrder = (triggerPrice is not None)
|
1250
1260
|
if (isMarketOrder) and (price is None):
|
1251
1261
|
raise InvalidOrder(self.id + ' createOrder() requires a price argument for ' + type + ' orders to determine the max price for buy and the min price for sell')
|
1252
1262
|
timestamp = self.milliseconds()
|
1253
|
-
defaultExpiryDelta =
|
1263
|
+
defaultExpiryDelta = None
|
1264
|
+
defaultExpiryDelta, params = self.handle_option_and_params(params, 'createOrder', 'defaultExpiry', self.safe_integer(self.options, 'createOrderDefaultExpiry', 2419200000))
|
1254
1265
|
expiration = self.sum(timestamp, defaultExpiryDelta)
|
1255
1266
|
matcherFees = await self.get_fees_for_asset(symbol, side, amount, price)
|
1256
1267
|
# {
|
@@ -1284,33 +1295,33 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1284
1295
|
raise InvalidOrder(self.id + ' asset fee must be ' + baseFeeAsset + ' or ' + discountFeeAsset)
|
1285
1296
|
matcherFeeAsset = self.safe_currency_code(matcherFeeAssetId)
|
1286
1297
|
rawMatcherFee = baseMatcherFee if (matcherFeeAssetId == baseFeeAssetId) else discountMatcherFee
|
1287
|
-
floatMatcherFee = float(self.
|
1298
|
+
floatMatcherFee = float(self.from_real_currency_amount(matcherFeeAsset, rawMatcherFee))
|
1288
1299
|
if (matcherFeeAsset in balances) and (balances[matcherFeeAsset]['free'] >= floatMatcherFee):
|
1289
1300
|
matcherFee = int(rawMatcherFee)
|
1290
1301
|
else:
|
1291
1302
|
raise InsufficientFunds(self.id + ' not enough funds of the selected asset fee')
|
1303
|
+
floatBaseMatcherFee = self.from_real_currency_amount(baseFeeAsset, baseMatcherFee)
|
1304
|
+
floatDiscountMatcherFee = self.from_real_currency_amount(discountFeeAsset, discountMatcherFee)
|
1292
1305
|
if matcherFeeAssetId is None:
|
1293
1306
|
# try to the pay the fee using the base first then discount asset
|
1294
|
-
|
1295
|
-
if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= floatBaseMatcherFee):
|
1307
|
+
if (baseFeeAsset in balances) and (balances[baseFeeAsset]['free'] >= float(floatBaseMatcherFee)):
|
1296
1308
|
matcherFeeAssetId = baseFeeAssetId
|
1297
1309
|
matcherFee = int(baseMatcherFee)
|
1298
1310
|
else:
|
1299
|
-
|
1300
|
-
if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= floatDiscountMatcherFee):
|
1311
|
+
if (discountFeeAsset in balances) and (balances[discountFeeAsset]['free'] >= float(floatDiscountMatcherFee)):
|
1301
1312
|
matcherFeeAssetId = discountFeeAssetId
|
1302
1313
|
matcherFee = int(discountMatcherFee)
|
1303
1314
|
if matcherFeeAssetId is None:
|
1304
|
-
raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees')
|
1305
|
-
amount = self.
|
1306
|
-
price = self.
|
1307
|
-
assetPair = {
|
1315
|
+
raise InsufficientFunds(self.id + ' not enough funds on none of the eligible asset fees: ' + baseFeeAsset + ' ' + floatBaseMatcherFee + ' or ' + discountFeeAsset + ' ' + floatDiscountMatcherFee)
|
1316
|
+
amount = self.to_real_symbol_amount(symbol, amount)
|
1317
|
+
price = self.to_real_symbol_price(symbol, price)
|
1318
|
+
assetPair: dict = {
|
1308
1319
|
'amountAsset': amountAsset,
|
1309
1320
|
'priceAsset': priceAsset,
|
1310
1321
|
}
|
1311
1322
|
sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
|
1312
1323
|
chainId = 84 if (sandboxMode) else 87
|
1313
|
-
body = {
|
1324
|
+
body: dict = {
|
1314
1325
|
'senderPublicKey': self.apiKey,
|
1315
1326
|
'matcherPublicKey': matcherPublicKey,
|
1316
1327
|
'assetPair': assetPair,
|
@@ -1336,12 +1347,12 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1336
1347
|
# },
|
1337
1348
|
# }
|
1338
1349
|
#
|
1339
|
-
attachment = {
|
1350
|
+
attachment: dict = {
|
1340
1351
|
'v': 1,
|
1341
1352
|
'c': {
|
1342
1353
|
't': 'sp',
|
1343
1354
|
'v': {
|
1344
|
-
'p': self.
|
1355
|
+
'p': self.to_real_symbol_price(symbol, triggerPrice),
|
1345
1356
|
},
|
1346
1357
|
},
|
1347
1358
|
}
|
@@ -1385,17 +1396,20 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1385
1396
|
# }
|
1386
1397
|
#
|
1387
1398
|
if isMarketOrder:
|
1388
|
-
response = await self.matcherPostMatcherOrderbookMarket(body)
|
1389
|
-
value = self.
|
1399
|
+
response = await self.matcherPostMatcherOrderbookMarket(self.extend(body, params))
|
1400
|
+
value = self.safe_dict(response, 'message')
|
1390
1401
|
return self.parse_order(value, market)
|
1391
1402
|
else:
|
1392
|
-
response = await self.matcherPostMatcherOrderbook(body)
|
1393
|
-
value = self.
|
1403
|
+
response = await self.matcherPostMatcherOrderbook(self.extend(body, params))
|
1404
|
+
value = self.safe_dict(response, 'message')
|
1394
1405
|
return self.parse_order(value, market)
|
1395
1406
|
|
1396
1407
|
async def cancel_order(self, id: str, symbol: Str = None, params={}):
|
1397
1408
|
"""
|
1398
1409
|
cancels an open order
|
1410
|
+
|
1411
|
+
https://matcher.waves.exchange/api-docs/index.html#/cancel/cancelOrdersByIdsWithKeyOrSignature
|
1412
|
+
|
1399
1413
|
:param str id: order id
|
1400
1414
|
:param str symbol: unified symbol of the market the order was made in
|
1401
1415
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
@@ -1418,7 +1432,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1418
1432
|
firstMessage = self.safe_value(message, 0)
|
1419
1433
|
firstOrder = self.safe_value(firstMessage, 0)
|
1420
1434
|
returnedId = self.safe_string(firstOrder, 'orderId')
|
1421
|
-
return {
|
1435
|
+
return self.safe_order({
|
1422
1436
|
'info': response,
|
1423
1437
|
'id': returnedId,
|
1424
1438
|
'clientOrderId': None,
|
@@ -1437,11 +1451,15 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1437
1451
|
'status': None,
|
1438
1452
|
'fee': None,
|
1439
1453
|
'trades': None,
|
1440
|
-
}
|
1454
|
+
})
|
1441
1455
|
|
1442
1456
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
1443
1457
|
"""
|
1444
1458
|
fetches information on an order made by the user
|
1459
|
+
|
1460
|
+
https://matcher.waves.exchange/api-docs/index.html#/status/getOrderStatusByPKAndIdWithSig
|
1461
|
+
|
1462
|
+
:param str id: order id
|
1445
1463
|
:param str symbol: unified symbol of the market the order was made in
|
1446
1464
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1447
1465
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1460,7 +1478,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1460
1478
|
binary = self.binary_concat_array(byteArray)
|
1461
1479
|
hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
|
1462
1480
|
signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
|
1463
|
-
request = {
|
1481
|
+
request: dict = {
|
1464
1482
|
'Timestamp': str(timestamp),
|
1465
1483
|
'Signature': signature,
|
1466
1484
|
'publicKey': self.apiKey,
|
@@ -1492,7 +1510,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1492
1510
|
binary = self.binary_concat_array(byteArray)
|
1493
1511
|
hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
|
1494
1512
|
signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
|
1495
|
-
request = {
|
1513
|
+
request: dict = {
|
1496
1514
|
'Accept': 'application/json',
|
1497
1515
|
'Timestamp': str(timestamp),
|
1498
1516
|
'Signature': signature,
|
@@ -1533,7 +1551,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1533
1551
|
if symbol is not None:
|
1534
1552
|
market = self.market(symbol)
|
1535
1553
|
address = await self.get_waves_address()
|
1536
|
-
request = {
|
1554
|
+
request: dict = {
|
1537
1555
|
'address': address,
|
1538
1556
|
'activeOnly': True,
|
1539
1557
|
}
|
@@ -1555,7 +1573,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1555
1573
|
if symbol is not None:
|
1556
1574
|
market = self.market(symbol)
|
1557
1575
|
address = await self.get_waves_address()
|
1558
|
-
request = {
|
1576
|
+
request: dict = {
|
1559
1577
|
'address': address,
|
1560
1578
|
'closedOnly': True,
|
1561
1579
|
}
|
@@ -1582,8 +1600,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1582
1600
|
# ]
|
1583
1601
|
return self.parse_orders(response, market, since, limit)
|
1584
1602
|
|
1585
|
-
def parse_order_status(self, status):
|
1586
|
-
statuses = {
|
1603
|
+
def parse_order_status(self, status: Str):
|
1604
|
+
statuses: dict = {
|
1587
1605
|
'Cancelled': 'canceled',
|
1588
1606
|
'Accepted': 'open',
|
1589
1607
|
'Filled': 'closed',
|
@@ -1597,7 +1615,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1597
1615
|
quoteId = self.safe_string(assetPair, 'priceAsset', 'WAVES')
|
1598
1616
|
return self.safe_currency_code(baseId) + '/' + self.safe_currency_code(quoteId)
|
1599
1617
|
|
1600
|
-
def parse_order(self, order, market: Market = None) -> Order:
|
1618
|
+
def parse_order(self, order: dict, market: Market = None) -> Order:
|
1601
1619
|
#
|
1602
1620
|
# createOrder
|
1603
1621
|
#
|
@@ -1667,23 +1685,23 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1667
1685
|
elif market is not None:
|
1668
1686
|
symbol = market['symbol']
|
1669
1687
|
amountCurrency = self.safe_currency_code(self.safe_string(assetPair, 'amountAsset', 'WAVES'))
|
1670
|
-
price = self.
|
1671
|
-
amount = self.
|
1672
|
-
filled = self.
|
1673
|
-
average = self.
|
1688
|
+
price = self.from_real_symbol_price(symbol, priceString)
|
1689
|
+
amount = self.from_real_currency_amount(amountCurrency, amountString)
|
1690
|
+
filled = self.from_real_currency_amount(amountCurrency, filledString)
|
1691
|
+
average = self.from_real_symbol_price(symbol, self.safe_string(order, 'avgWeighedPrice'))
|
1674
1692
|
status = self.parse_order_status(self.safe_string(order, 'status'))
|
1675
1693
|
fee = None
|
1676
1694
|
if 'type' in order:
|
1677
|
-
|
1695
|
+
code = self.safe_currency_code(self.safe_string(order, 'feeAsset'))
|
1678
1696
|
fee = {
|
1679
|
-
'currency':
|
1680
|
-
'fee': self.parse_number(self.
|
1697
|
+
'currency': code,
|
1698
|
+
'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'filledFee'))),
|
1681
1699
|
}
|
1682
1700
|
else:
|
1683
|
-
|
1701
|
+
code = self.safe_currency_code(self.safe_string(order, 'matcherFeeAssetId', 'WAVES'))
|
1684
1702
|
fee = {
|
1685
|
-
'currency':
|
1686
|
-
'fee': self.parse_number(self.
|
1703
|
+
'currency': code,
|
1704
|
+
'fee': self.parse_number(self.from_real_currency_amount(code, self.safe_string(order, 'matcherFee'))),
|
1687
1705
|
}
|
1688
1706
|
triggerPrice = None
|
1689
1707
|
attachment = self.safe_string(order, 'attachment')
|
@@ -1708,7 +1726,6 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1708
1726
|
'postOnly': None,
|
1709
1727
|
'side': side,
|
1710
1728
|
'price': price,
|
1711
|
-
'stopPrice': triggerPrice,
|
1712
1729
|
'triggerPrice': triggerPrice,
|
1713
1730
|
'amount': amount,
|
1714
1731
|
'cost': None,
|
@@ -1723,7 +1740,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1723
1740
|
async def get_waves_address(self):
|
1724
1741
|
cachedAddreess = self.safe_string(self.options, 'wavesAddress')
|
1725
1742
|
if cachedAddreess is None:
|
1726
|
-
request = {
|
1743
|
+
request: dict = {
|
1727
1744
|
'publicKey': self.apiKey,
|
1728
1745
|
}
|
1729
1746
|
response = await self.nodeGetAddressesPublicKeyPublicKey(request)
|
@@ -1748,7 +1765,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1748
1765
|
self.check_required_keys()
|
1749
1766
|
await self.load_markets()
|
1750
1767
|
wavesAddress = await self.get_waves_address()
|
1751
|
-
request = {
|
1768
|
+
request: dict = {
|
1752
1769
|
'address': wavesAddress,
|
1753
1770
|
}
|
1754
1771
|
totalBalance = await self.nodeGetAssetsBalanceAddress(request)
|
@@ -1787,7 +1804,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1787
1804
|
# ]
|
1788
1805
|
# }
|
1789
1806
|
balances = self.safe_value(totalBalance, 'balances', [])
|
1790
|
-
result = {}
|
1807
|
+
result: dict = {}
|
1791
1808
|
timestamp = None
|
1792
1809
|
assetIds = []
|
1793
1810
|
nonStandardBalances = []
|
@@ -1798,19 +1815,17 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1798
1815
|
issueTransaction = self.safe_value(entry, 'issueTransaction')
|
1799
1816
|
currencyId = self.safe_string(entry, 'assetId')
|
1800
1817
|
balance = self.safe_string(entry, 'balance')
|
1801
|
-
|
1802
|
-
|
1803
|
-
nonStandardBalances.append(balance)
|
1804
|
-
continue
|
1805
|
-
decimals = self.safe_integer(issueTransaction, 'decimals')
|
1806
|
-
code = None
|
1807
|
-
if currencyId in self.currencies_by_id:
|
1818
|
+
currencyExists = (currencyId in self.currencies_by_id)
|
1819
|
+
if currencyExists:
|
1808
1820
|
code = self.safe_currency_code(currencyId)
|
1809
1821
|
result[code] = self.account()
|
1810
|
-
result[code]['total'] = self.
|
1822
|
+
result[code]['total'] = self.from_real_currency_amount(code, balance)
|
1823
|
+
elif issueTransaction is None:
|
1824
|
+
assetIds.append(currencyId)
|
1825
|
+
nonStandardBalances.append(balance)
|
1811
1826
|
nonStandardAssets = len(assetIds)
|
1812
1827
|
if nonStandardAssets:
|
1813
|
-
requestInner = {
|
1828
|
+
requestInner: dict = {
|
1814
1829
|
'ids': assetIds,
|
1815
1830
|
}
|
1816
1831
|
response = await self.publicGetAssets(requestInner)
|
@@ -1819,11 +1834,11 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1819
1834
|
entry = data[i]
|
1820
1835
|
balance = nonStandardBalances[i]
|
1821
1836
|
inner = self.safe_value(entry, 'data')
|
1822
|
-
|
1837
|
+
precision = self.parse_precision(self.safe_string(inner, 'precision'))
|
1823
1838
|
ticker = self.safe_string(inner, 'ticker')
|
1824
1839
|
code = self.safe_currency_code(ticker)
|
1825
1840
|
result[code] = self.account()
|
1826
|
-
result[code]['total'] =
|
1841
|
+
result[code]['total'] = Precise.string_mul(balance, precision)
|
1827
1842
|
currentTimestamp = self.milliseconds()
|
1828
1843
|
byteArray = [
|
1829
1844
|
self.base58_to_binary(self.apiKey),
|
@@ -1832,7 +1847,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1832
1847
|
binary = self.binary_concat_array(byteArray)
|
1833
1848
|
hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
|
1834
1849
|
signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
|
1835
|
-
matcherRequest = {
|
1850
|
+
matcherRequest: dict = {
|
1836
1851
|
'publicKey': self.apiKey,
|
1837
1852
|
'signature': signature,
|
1838
1853
|
'timestamp': str(currentTimestamp),
|
@@ -1846,11 +1861,8 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1846
1861
|
if not (code in result):
|
1847
1862
|
result[code] = self.account()
|
1848
1863
|
amount = self.safe_string(reservedBalance, currencyId)
|
1849
|
-
|
1850
|
-
|
1851
|
-
else:
|
1852
|
-
result[code]['used'] = amount
|
1853
|
-
wavesRequest = {
|
1864
|
+
result[code]['used'] = self.from_real_currency_amount(code, amount)
|
1865
|
+
wavesRequest: dict = {
|
1854
1866
|
'address': wavesAddress,
|
1855
1867
|
}
|
1856
1868
|
wavesTotal = await self.nodeGetAddressesBalanceAddress(wavesRequest)
|
@@ -1859,20 +1871,27 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1859
1871
|
# "confirmations": 0,
|
1860
1872
|
# "balance": 909085978
|
1861
1873
|
# }
|
1862
|
-
result['WAVES'] = self.safe_value(result, 'WAVES',
|
1863
|
-
result['WAVES']['total'] = self.
|
1864
|
-
|
1865
|
-
for i in range(0, len(codes)):
|
1866
|
-
code = codes[i]
|
1867
|
-
if self.safe_value(result[code], 'used') is None:
|
1868
|
-
result[code]['used'] = '0'
|
1874
|
+
result['WAVES'] = self.safe_value(result, 'WAVES', self.account())
|
1875
|
+
result['WAVES']['total'] = self.from_real_currency_amount('WAVES', self.safe_string(wavesTotal, 'balance'))
|
1876
|
+
result = self.set_undefined_balances_to_zero(result)
|
1869
1877
|
result['timestamp'] = timestamp
|
1870
1878
|
result['datetime'] = self.iso8601(timestamp)
|
1871
1879
|
return self.safe_balance(result)
|
1872
1880
|
|
1881
|
+
def set_undefined_balances_to_zero(self, balances, key='used'):
|
1882
|
+
codes = list(balances.keys())
|
1883
|
+
for i in range(0, len(codes)):
|
1884
|
+
code = codes[i]
|
1885
|
+
if self.safe_value(balances[code], 'used') is None:
|
1886
|
+
balances[code][key] = '0'
|
1887
|
+
return balances
|
1888
|
+
|
1873
1889
|
async def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
|
1874
1890
|
"""
|
1875
1891
|
fetch all trades made by the user
|
1892
|
+
|
1893
|
+
https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
|
1894
|
+
|
1876
1895
|
:param str symbol: unified market symbol
|
1877
1896
|
:param int [since]: the earliest time in ms to fetch trades for
|
1878
1897
|
:param int [limit]: the maximum number of trades structures to retrieve
|
@@ -1881,7 +1900,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1881
1900
|
"""
|
1882
1901
|
await self.load_markets()
|
1883
1902
|
address = await self.get_waves_address()
|
1884
|
-
request = {
|
1903
|
+
request: dict = {
|
1885
1904
|
'sender': address,
|
1886
1905
|
}
|
1887
1906
|
market = None
|
@@ -1962,6 +1981,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1962
1981
|
async def fetch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
1963
1982
|
"""
|
1964
1983
|
get the list of most recent trades for a particular symbol
|
1984
|
+
|
1985
|
+
https://api.wavesplatform.com/v0/docs/#/transactions/searchTxsExchange
|
1986
|
+
|
1965
1987
|
:param str symbol: unified symbol of the market to fetch trades for
|
1966
1988
|
:param int [since]: timestamp in ms of the earliest trade to fetch
|
1967
1989
|
:param int [limit]: the maximum amount of trades to fetch
|
@@ -1970,7 +1992,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1970
1992
|
"""
|
1971
1993
|
await self.load_markets()
|
1972
1994
|
market = self.market(symbol)
|
1973
|
-
request = {
|
1995
|
+
request: dict = {
|
1974
1996
|
'amountAsset': market['baseId'],
|
1975
1997
|
'priceAsset': market['quoteId'],
|
1976
1998
|
}
|
@@ -2048,7 +2070,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2048
2070
|
#
|
2049
2071
|
return self.parse_trades(data, market, since, limit)
|
2050
2072
|
|
2051
|
-
def parse_trade(self, trade, market: Market = None) -> Trade:
|
2073
|
+
def parse_trade(self, trade: dict, market: Market = None) -> Trade:
|
2052
2074
|
#
|
2053
2075
|
# {__type: "transaction",
|
2054
2076
|
# "data":
|
@@ -2138,7 +2160,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2138
2160
|
}, market)
|
2139
2161
|
|
2140
2162
|
def parse_deposit_withdraw_fees(self, response, codes: Strings = None, currencyIdKey=None) -> Any:
|
2141
|
-
depositWithdrawFees = {}
|
2163
|
+
depositWithdrawFees: dict = {}
|
2142
2164
|
codes = self.market_codes(codes)
|
2143
2165
|
for i in range(0, len(response)):
|
2144
2166
|
entry = response[i]
|
@@ -2203,8 +2225,10 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2203
2225
|
async def fetch_deposit_withdraw_fees(self, codes: Strings = None, params={}):
|
2204
2226
|
"""
|
2205
2227
|
fetch deposit and withdraw fees
|
2206
|
-
|
2207
|
-
|
2228
|
+
|
2229
|
+
https://docs.wx.network/en/api/gateways/deposit/currencies
|
2230
|
+
https://docs.wx.network/en/api/gateways/withdraw/currencies
|
2231
|
+
|
2208
2232
|
:param str[]|None codes: list of unified currency codes
|
2209
2233
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2210
2234
|
:returns dict: a list of `fee structures <https://docs.ccxt.com/#/?id=fee-structure>`
|
@@ -2276,7 +2300,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2276
2300
|
data = self.array_concat(data, items)
|
2277
2301
|
return self.parse_deposit_withdraw_fees(data, codes, 'id')
|
2278
2302
|
|
2279
|
-
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
2303
|
+
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
2280
2304
|
errorCode = self.safe_string(response, 'error')
|
2281
2305
|
success = self.safe_bool(response, 'success', True)
|
2282
2306
|
Exception = self.safe_value(self.exceptions, errorCode)
|
@@ -2290,7 +2314,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2290
2314
|
raise ExchangeError(self.id + ' ' + body)
|
2291
2315
|
return None
|
2292
2316
|
|
2293
|
-
async def withdraw(self, code: str, amount: float, address, tag=None, params={}):
|
2317
|
+
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
2294
2318
|
"""
|
2295
2319
|
make a withdrawal
|
2296
2320
|
:param str code: unified currency code
|
@@ -2304,7 +2328,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2304
2328
|
# currently only works for BTC and WAVES
|
2305
2329
|
if code != 'WAVES':
|
2306
2330
|
supportedCurrencies = await self.privateGetWithdrawCurrencies()
|
2307
|
-
currencies = {}
|
2331
|
+
currencies: dict = {}
|
2308
2332
|
items = self.safe_value(supportedCurrencies, 'items', [])
|
2309
2333
|
for i in range(0, len(items)):
|
2310
2334
|
entry = items[i]
|
@@ -2315,7 +2339,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2315
2339
|
raise ExchangeError(self.id + ' withdraw() ' + code + ' not supported. Currency code must be one of ' + str(codes))
|
2316
2340
|
await self.load_markets()
|
2317
2341
|
hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
|
2318
|
-
set = {}
|
2342
|
+
set: dict = {}
|
2319
2343
|
for i in range(0, len(hexChars)):
|
2320
2344
|
key = hexChars[i]
|
2321
2345
|
set[key] = True
|
@@ -2333,7 +2357,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2333
2357
|
if code == 'WAVES' and not isErc20:
|
2334
2358
|
proxyAddress = address
|
2335
2359
|
else:
|
2336
|
-
withdrawAddressRequest = {
|
2360
|
+
withdrawAddressRequest: dict = {
|
2337
2361
|
'address': address,
|
2338
2362
|
'currency': code,
|
2339
2363
|
}
|
@@ -2370,7 +2394,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2370
2394
|
feeAssetId = 'WAVES'
|
2371
2395
|
type = 4 # transfer
|
2372
2396
|
version = 2
|
2373
|
-
amountInteger = self.
|
2397
|
+
amountInteger = self.to_real_currency_amount(code, amount)
|
2374
2398
|
currency = self.currency(code)
|
2375
2399
|
timestamp = self.milliseconds()
|
2376
2400
|
byteArray = [
|
@@ -2388,7 +2412,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2388
2412
|
binary = self.binary_concat_array(byteArray)
|
2389
2413
|
hexSecret = self.binary_to_base16(self.base58_to_binary(self.secret))
|
2390
2414
|
signature = self.axolotl(self.binary_to_base16(binary), hexSecret, 'ed25519')
|
2391
|
-
request = {
|
2415
|
+
request: dict = {
|
2392
2416
|
'senderPublicKey': self.apiKey,
|
2393
2417
|
'amount': amountInteger,
|
2394
2418
|
'fee': fee,
|
@@ -2417,7 +2441,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2417
2441
|
#
|
2418
2442
|
return self.parse_transaction(result, currency)
|
2419
2443
|
|
2420
|
-
def parse_transaction(self, transaction, currency: Currency = None) -> Transaction:
|
2444
|
+
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
2421
2445
|
#
|
2422
2446
|
# withdraw
|
2423
2447
|
#
|
@@ -2430,18 +2454,45 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2430
2454
|
# "amount": 0
|
2431
2455
|
# }
|
2432
2456
|
#
|
2457
|
+
# withdraw new:
|
2458
|
+
# {
|
2459
|
+
# type: "4",
|
2460
|
+
# id: "2xnWTqG9ar7jEDrLxfbVyyspPZ6XZNrrw9ai9sQ81Eya",
|
2461
|
+
# fee: "100000",
|
2462
|
+
# feeAssetId: null,
|
2463
|
+
# timestamp: "1715786263807",
|
2464
|
+
# version: "2",
|
2465
|
+
# sender: "3P81LLX1kk2CSJC9L8C2enxdHB7XvnSGAEE",
|
2466
|
+
# senderPublicKey: "DdmzmXf9mty1FBE8AdVGnrncVLEAzP4gR4nWoTFAJoXz",
|
2467
|
+
# proofs: ["RyoKwdSYv3EqotJCYftfFM9JE2j1ZpDRxKwYfiRhLAFeyNp6VfJUXNDS884XfeCeHeNypNmTCZt5NYR1ekyjCX3",],
|
2468
|
+
# recipient: "3P9tXxu38a8tgewNEKFzourVxeqHd11ppOc",
|
2469
|
+
# assetId: null,
|
2470
|
+
# feeAsset: null,
|
2471
|
+
# amount: "2000000",
|
2472
|
+
# attachment: "",
|
2473
|
+
# }
|
2474
|
+
#
|
2433
2475
|
currency = self.safe_currency(None, currency)
|
2476
|
+
code = currency['code']
|
2477
|
+
typeRaw = self.safe_string(transaction, 'type')
|
2478
|
+
type = 'withdraw' if (typeRaw == '4') else 'deposit'
|
2479
|
+
amount = self.parse_number(self.from_real_currency_amount(code, self.safe_string(transaction, 'amount')))
|
2480
|
+
feeString = self.safe_string(transaction, 'fee')
|
2481
|
+
feeAssetId = self.safe_string(transaction, 'feeAssetId', 'WAVES')
|
2482
|
+
feeCode = self.safe_currency_code(feeAssetId)
|
2483
|
+
feeAmount = self.parse_number(self.from_real_currency_amount(feeCode, feeString))
|
2484
|
+
timestamp = self.safe_integer(transaction, 'timestamp')
|
2434
2485
|
return {
|
2435
|
-
'id':
|
2486
|
+
'id': self.safe_string(transaction, 'id'),
|
2436
2487
|
'txid': None,
|
2437
|
-
'timestamp':
|
2438
|
-
'datetime':
|
2488
|
+
'timestamp': timestamp,
|
2489
|
+
'datetime': self.iso8601(timestamp),
|
2439
2490
|
'network': None,
|
2440
|
-
'addressFrom':
|
2491
|
+
'addressFrom': self.safe_string(transaction, 'sender'),
|
2441
2492
|
'address': None,
|
2442
|
-
'addressTo':
|
2443
|
-
'amount':
|
2444
|
-
'type':
|
2493
|
+
'addressTo': self.safe_string(transaction, 'recipient'),
|
2494
|
+
'amount': amount,
|
2495
|
+
'type': type,
|
2445
2496
|
'currency': currency['code'],
|
2446
2497
|
'status': None,
|
2447
2498
|
'updated': None,
|
@@ -2450,6 +2501,9 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
2450
2501
|
'tagTo': None,
|
2451
2502
|
'comment': None,
|
2452
2503
|
'internal': None,
|
2453
|
-
'fee':
|
2504
|
+
'fee': {
|
2505
|
+
'currency': feeCode,
|
2506
|
+
'cost': feeAmount,
|
2507
|
+
},
|
2454
2508
|
'info': transaction,
|
2455
2509
|
}
|