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