ccxt-ir 4.3.46.0.2__py2.py3-none-any.whl → 4.5.0__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 +39 -35
- ccxt/abantether.py +9 -9
- ccxt/abstract/alpaca.py +4 -0
- ccxt/abstract/apex.py +31 -0
- ccxt/abstract/bigone.py +1 -1
- ccxt/abstract/binance.py +106 -48
- ccxt/abstract/binancecoinm.py +106 -48
- ccxt/abstract/binanceus.py +141 -83
- ccxt/abstract/binanceusdm.py +106 -48
- ccxt/abstract/bingx.py +50 -1
- ccxt/abstract/bitbank.py +5 -0
- ccxt/abstract/bitfinex.py +136 -65
- ccxt/abstract/bitflyer.py +1 -0
- ccxt/abstract/bitget.py +67 -0
- ccxt/abstract/bitmart.py +19 -1
- ccxt/abstract/bitopro.py +1 -0
- ccxt/abstract/bitrue.py +68 -68
- ccxt/abstract/bitstamp.py +1 -0
- ccxt/abstract/blofin.py +30 -0
- ccxt/abstract/btcbox.py +2 -0
- ccxt/abstract/bybit.py +28 -13
- ccxt/abstract/cex.py +28 -29
- ccxt/abstract/coinbaseexchange.py +1 -0
- ccxt/abstract/coinbaseinternational.py +1 -1
- ccxt/abstract/cryptocom.py +16 -0
- ccxt/abstract/cryptomus.py +20 -0
- ccxt/abstract/defx.py +69 -0
- ccxt/abstract/deribit.py +1 -0
- ccxt/abstract/derive.py +117 -0
- ccxt/abstract/digifinex.py +1 -0
- ccxt/abstract/ellipx.py +25 -0
- ccxt/abstract/foxbit.py +26 -0
- ccxt/abstract/gate.py +19 -0
- ccxt/abstract/gateio.py +19 -0
- ccxt/abstract/gemini.py +1 -0
- ccxt/abstract/hibachi.py +26 -0
- ccxt/abstract/hyperliquid.py +1 -1
- ccxt/abstract/independentreserve.py +6 -0
- ccxt/abstract/kraken.py +1 -0
- ccxt/abstract/krakenfutures.py +4 -0
- ccxt/abstract/kucoin.py +10 -0
- ccxt/abstract/kucoinfutures.py +18 -0
- ccxt/abstract/lbank.py +2 -1
- ccxt/abstract/luno.py +1 -0
- ccxt/abstract/mexc.py +2 -0
- ccxt/abstract/modetrade.py +119 -0
- ccxt/abstract/myokx.py +349 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/abstract/okx.py +25 -0
- ccxt/abstract/okxus.py +349 -0
- ccxt/abstract/onetrading.py +0 -12
- ccxt/abstract/paradex.py +23 -0
- ccxt/abstract/phemex.py +2 -0
- ccxt/abstract/poloniex.py +36 -0
- ccxt/abstract/tradeogre.py +3 -1
- ccxt/abstract/upbit.py +51 -34
- ccxt/abstract/whitebit.py +16 -0
- ccxt/abstract/woo.py +64 -6
- ccxt/abstract/xt.py +10 -5
- ccxt/afratether.py +7 -7
- ccxt/alpaca.py +828 -51
- ccxt/apex.py +1875 -0
- ccxt/arzinja.py +7 -7
- ccxt/arzplus.py +9 -9
- ccxt/ascendex.py +501 -306
- ccxt/async_support/__init__.py +39 -35
- ccxt/async_support/abantether.py +10 -10
- ccxt/async_support/afratether.py +9 -9
- ccxt/async_support/alpaca.py +828 -51
- ccxt/async_support/apex.py +1875 -0
- ccxt/async_support/arzinja.py +10 -10
- ccxt/async_support/arzplus.py +12 -12
- ccxt/async_support/ascendex.py +502 -306
- ccxt/async_support/base/exchange.py +303 -89
- ccxt/async_support/base/ws/cache.py +9 -3
- ccxt/async_support/base/ws/client.py +173 -38
- ccxt/async_support/base/ws/future.py +25 -37
- ccxt/async_support/bequant.py +5 -3
- ccxt/async_support/bigone.py +279 -144
- ccxt/async_support/binance.py +2347 -1158
- ccxt/async_support/binancecoinm.py +9 -3
- ccxt/async_support/binanceus.py +17 -3
- ccxt/async_support/binanceusdm.py +9 -4
- ccxt/async_support/bingx.py +2962 -920
- ccxt/async_support/bit2c.py +147 -27
- ccxt/async_support/bitbank.py +151 -23
- ccxt/async_support/bitbns.py +104 -30
- ccxt/async_support/bitfinex.py +3291 -1113
- ccxt/async_support/bitflyer.py +202 -27
- ccxt/async_support/bitget.py +3683 -1538
- ccxt/async_support/bithumb.py +195 -38
- ccxt/async_support/bitimen.py +12 -12
- ccxt/async_support/bitir.py +38 -38
- ccxt/async_support/bitmart.py +1288 -350
- ccxt/async_support/bitmex.py +260 -75
- ccxt/async_support/bitopro.py +262 -62
- ccxt/async_support/bitpin.py +17 -16
- ccxt/async_support/bitrue.py +459 -290
- ccxt/async_support/bitso.py +199 -54
- ccxt/async_support/bitstamp.py +230 -96
- ccxt/async_support/bitteam.py +167 -25
- ccxt/async_support/{huobijp.py → bittrade.py} +158 -30
- ccxt/async_support/bitvavo.py +213 -49
- ccxt/async_support/blockchaincom.py +160 -46
- ccxt/async_support/blofin.py +502 -120
- ccxt/async_support/btcalpha.py +169 -31
- ccxt/async_support/btcbox.py +292 -23
- ccxt/async_support/btcmarkets.py +211 -58
- ccxt/async_support/btcturk.py +161 -38
- ccxt/async_support/bybit.py +1775 -1030
- ccxt/async_support/cex.py +1440 -1303
- ccxt/async_support/coinbase.py +724 -212
- ccxt/async_support/coinbaseadvanced.py +2 -1
- ccxt/async_support/coinbaseexchange.py +388 -89
- ccxt/async_support/coinbaseinternational.py +412 -57
- ccxt/async_support/coincatch.py +177 -78
- ccxt/async_support/coincheck.py +135 -19
- ccxt/async_support/coinex.py +606 -232
- ccxt/async_support/coinmate.py +189 -63
- ccxt/async_support/coinmetro.py +195 -54
- ccxt/async_support/coinone.py +158 -51
- ccxt/async_support/coinsph.py +336 -61
- ccxt/async_support/coinspot.py +151 -52
- ccxt/async_support/cryptocom.py +661 -111
- ccxt/async_support/cryptomus.py +1137 -0
- ccxt/async_support/defx.py +2071 -0
- ccxt/async_support/delta.py +299 -99
- ccxt/async_support/deribit.py +348 -126
- ccxt/async_support/derive.py +2572 -0
- ccxt/async_support/digifinex.py +430 -214
- ccxt/async_support/ellipx.py +2029 -0
- ccxt/async_support/eterex.py +10 -10
- ccxt/async_support/excoino.py +31 -31
- ccxt/async_support/exir.py +14 -14
- ccxt/async_support/exmo.py +344 -131
- ccxt/async_support/exnovin.py +10 -10
- ccxt/async_support/farhadexchange.py +12 -12
- ccxt/async_support/fmfwio.py +2 -1
- ccxt/async_support/foxbit.py +1935 -0
- ccxt/async_support/gate.py +1351 -529
- ccxt/async_support/gateio.py +2 -1
- ccxt/async_support/gemini.py +144 -39
- ccxt/async_support/hashkey.py +152 -109
- ccxt/async_support/hibachi.py +2080 -0
- ccxt/async_support/hitbtc.py +395 -167
- ccxt/async_support/hitobit.py +12 -12
- ccxt/async_support/hollaex.py +307 -119
- ccxt/async_support/htx.py +851 -383
- ccxt/async_support/huobi.py +2 -1
- ccxt/async_support/hyperliquid.py +1848 -536
- ccxt/async_support/independentreserve.py +288 -15
- ccxt/async_support/indodax.py +190 -33
- ccxt/async_support/jibitex.py +12 -12
- ccxt/async_support/kraken.py +795 -351
- ccxt/async_support/krakenfutures.py +214 -62
- ccxt/async_support/kucoin.py +715 -396
- ccxt/async_support/kucoinfutures.py +652 -89
- ccxt/async_support/latoken.py +217 -113
- ccxt/async_support/lbank.py +425 -97
- ccxt/async_support/luno.py +382 -35
- ccxt/async_support/mercado.py +113 -6
- ccxt/async_support/mexc.py +874 -437
- ccxt/async_support/modetrade.py +2818 -0
- ccxt/async_support/myokx.py +54 -0
- ccxt/async_support/ndax.py +221 -64
- ccxt/async_support/nobitex.py +31 -37
- ccxt/async_support/novadax.py +190 -34
- ccxt/async_support/oceanex.py +217 -28
- ccxt/async_support/okcoin.py +253 -145
- ccxt/async_support/okexchange.py +11 -11
- ccxt/async_support/okx.py +1088 -351
- ccxt/async_support/okxus.py +54 -0
- ccxt/async_support/ompfinex.py +25 -24
- ccxt/async_support/onetrading.py +213 -392
- ccxt/async_support/oxfun.py +245 -166
- ccxt/async_support/p2b.py +151 -29
- ccxt/async_support/paradex.py +562 -49
- ccxt/async_support/paymium.py +82 -19
- ccxt/async_support/phemex.py +713 -172
- ccxt/async_support/poloniex.py +1602 -283
- ccxt/async_support/probit.py +224 -95
- ccxt/async_support/ramzinex.py +30 -27
- ccxt/async_support/sarmayex.py +9 -9
- ccxt/async_support/sarrafex.py +13 -13
- ccxt/async_support/tabdeal.py +14 -13
- ccxt/async_support/tetherland.py +9 -9
- ccxt/async_support/timex.py +210 -51
- ccxt/async_support/tokocrypto.py +167 -47
- ccxt/async_support/tradeogre.py +266 -31
- ccxt/async_support/twox.py +9 -9
- ccxt/async_support/ubitex.py +12 -12
- ccxt/async_support/upbit.py +568 -165
- ccxt/async_support/vertex.py +160 -32
- ccxt/async_support/wallex.py +12 -12
- ccxt/async_support/wavesexchange.py +165 -30
- ccxt/async_support/whitebit.py +975 -127
- ccxt/async_support/woo.py +1918 -1016
- ccxt/async_support/woofipro.py +433 -141
- ccxt/async_support/xt.py +649 -193
- ccxt/async_support/yobit.py +195 -70
- ccxt/async_support/zaif.py +91 -15
- ccxt/async_support/zonda.py +151 -36
- ccxt/base/decimal_to_precision.py +14 -10
- ccxt/base/errors.py +49 -18
- ccxt/base/exchange.py +1556 -450
- ccxt/base/precise.py +10 -0
- ccxt/base/types.py +114 -6
- ccxt/bequant.py +5 -3
- ccxt/bigone.py +279 -144
- ccxt/binance.py +2347 -1158
- ccxt/binancecoinm.py +9 -3
- ccxt/binanceus.py +17 -3
- ccxt/binanceusdm.py +9 -4
- ccxt/bingx.py +2962 -920
- ccxt/bit2c.py +147 -27
- ccxt/bitbank.py +151 -23
- ccxt/bitbns.py +104 -30
- ccxt/bitfinex.py +3290 -1113
- ccxt/bitflyer.py +202 -27
- ccxt/bitget.py +3683 -1538
- ccxt/bithumb.py +194 -38
- ccxt/bitimen.py +9 -9
- ccxt/bitir.py +35 -35
- ccxt/bitmart.py +1288 -350
- ccxt/bitmex.py +260 -75
- ccxt/bitopro.py +262 -62
- ccxt/bitpin.py +15 -14
- ccxt/bitrue.py +459 -290
- ccxt/bitso.py +199 -54
- ccxt/bitstamp.py +230 -96
- ccxt/bitteam.py +167 -25
- ccxt/{huobijp.py → bittrade.py} +158 -30
- ccxt/bitvavo.py +213 -49
- ccxt/blockchaincom.py +160 -46
- ccxt/blofin.py +502 -120
- ccxt/btcalpha.py +169 -31
- ccxt/btcbox.py +291 -23
- ccxt/btcmarkets.py +211 -58
- ccxt/btcturk.py +161 -38
- ccxt/bybit.py +1775 -1030
- ccxt/cex.py +1439 -1303
- ccxt/coinbase.py +724 -212
- ccxt/coinbaseadvanced.py +2 -1
- ccxt/coinbaseexchange.py +388 -89
- ccxt/coinbaseinternational.py +412 -57
- ccxt/coincatch.py +177 -78
- ccxt/coincheck.py +135 -19
- ccxt/coinex.py +606 -232
- ccxt/coinmate.py +189 -63
- ccxt/coinmetro.py +194 -54
- ccxt/coinone.py +158 -51
- ccxt/coinsph.py +336 -61
- ccxt/coinspot.py +151 -52
- ccxt/cryptocom.py +661 -111
- ccxt/cryptomus.py +1137 -0
- ccxt/defx.py +2070 -0
- ccxt/delta.py +299 -99
- ccxt/deribit.py +348 -126
- ccxt/derive.py +2571 -0
- ccxt/digifinex.py +430 -214
- ccxt/ellipx.py +2029 -0
- ccxt/eterex.py +7 -7
- ccxt/excoino.py +29 -29
- ccxt/exir.py +11 -11
- ccxt/exmo.py +343 -131
- ccxt/exnovin.py +8 -8
- ccxt/farhadexchange.py +10 -10
- ccxt/fmfwio.py +2 -1
- ccxt/foxbit.py +1935 -0
- ccxt/gate.py +1351 -529
- ccxt/gateio.py +2 -1
- ccxt/gemini.py +144 -39
- ccxt/hashkey.py +152 -109
- ccxt/hibachi.py +2079 -0
- ccxt/hitbtc.py +395 -167
- ccxt/hitobit.py +9 -9
- ccxt/hollaex.py +307 -119
- ccxt/htx.py +851 -383
- ccxt/huobi.py +2 -1
- ccxt/hyperliquid.py +1848 -536
- ccxt/independentreserve.py +287 -15
- ccxt/indodax.py +190 -33
- ccxt/jibitex.py +9 -9
- ccxt/kraken.py +794 -351
- ccxt/krakenfutures.py +214 -62
- ccxt/kucoin.py +715 -396
- ccxt/kucoinfutures.py +652 -89
- ccxt/latoken.py +217 -113
- ccxt/lbank.py +425 -97
- ccxt/luno.py +382 -35
- ccxt/mercado.py +113 -6
- ccxt/mexc.py +873 -437
- ccxt/modetrade.py +2818 -0
- ccxt/myokx.py +54 -0
- ccxt/ndax.py +221 -64
- ccxt/nobitex.py +29 -35
- ccxt/novadax.py +190 -34
- ccxt/oceanex.py +217 -28
- ccxt/okcoin.py +253 -145
- ccxt/okexchange.py +9 -9
- ccxt/okx.py +1088 -351
- ccxt/okxus.py +54 -0
- ccxt/ompfinex.py +22 -21
- ccxt/onetrading.py +213 -392
- ccxt/oxfun.py +245 -166
- ccxt/p2b.py +151 -29
- ccxt/paradex.py +562 -49
- ccxt/paymium.py +82 -19
- ccxt/phemex.py +712 -172
- ccxt/poloniex.py +1601 -283
- ccxt/pro/__init__.py +76 -17
- ccxt/pro/alpaca.py +21 -6
- ccxt/pro/apex.py +984 -0
- ccxt/pro/ascendex.py +58 -10
- ccxt/pro/bequant.py +6 -1
- ccxt/pro/binance.py +728 -156
- ccxt/pro/binancecoinm.py +6 -2
- ccxt/pro/binanceus.py +8 -4
- ccxt/pro/binanceusdm.py +7 -2
- ccxt/pro/bingx.py +333 -142
- ccxt/pro/bitfinex.py +727 -262
- ccxt/pro/bitget.py +570 -79
- ccxt/pro/bithumb.py +20 -6
- ccxt/pro/bitmart.py +216 -87
- ccxt/pro/bitmex.py +47 -9
- ccxt/pro/bitopro.py +26 -14
- ccxt/pro/bitrue.py +22 -22
- ccxt/pro/bitstamp.py +54 -21
- ccxt/pro/{huobijp.py → bittrade.py} +7 -6
- ccxt/pro/bitvavo.py +191 -67
- ccxt/pro/blockchaincom.py +21 -8
- ccxt/pro/blofin.py +9 -1
- ccxt/pro/bybit.py +632 -245
- ccxt/pro/cex.py +59 -24
- ccxt/pro/coinbase.py +102 -73
- ccxt/pro/coinbaseadvanced.py +2 -1
- ccxt/pro/coinbaseexchange.py +8 -8
- ccxt/pro/coinbaseinternational.py +181 -25
- ccxt/pro/coincatch.py +6 -7
- ccxt/pro/coincheck.py +11 -6
- ccxt/pro/coinex.py +967 -665
- ccxt/pro/coinone.py +16 -9
- ccxt/pro/cryptocom.py +448 -45
- ccxt/pro/defx.py +831 -0
- ccxt/pro/deribit.py +150 -14
- ccxt/pro/derive.py +704 -0
- ccxt/pro/exmo.py +239 -6
- ccxt/pro/gate.py +623 -65
- ccxt/pro/gateio.py +2 -1
- ccxt/pro/gemini.py +27 -11
- ccxt/pro/hashkey.py +2 -2
- ccxt/pro/hitbtc.py +196 -91
- ccxt/pro/hollaex.py +23 -7
- ccxt/pro/htx.py +51 -14
- ccxt/pro/huobi.py +2 -1
- ccxt/pro/hyperliquid.py +591 -27
- ccxt/pro/independentreserve.py +9 -6
- ccxt/pro/kraken.py +640 -320
- ccxt/pro/krakenfutures.py +62 -35
- ccxt/pro/kucoin.py +267 -46
- ccxt/pro/kucoinfutures.py +165 -21
- ccxt/pro/lbank.py +102 -21
- ccxt/pro/luno.py +12 -8
- ccxt/pro/mexc.py +877 -111
- ccxt/pro/modetrade.py +1271 -0
- ccxt/pro/myokx.py +38 -0
- ccxt/pro/ndax.py +15 -2
- ccxt/pro/okcoin.py +23 -4
- ccxt/pro/okx.py +573 -98
- ccxt/pro/okxus.py +38 -0
- ccxt/pro/onetrading.py +30 -13
- ccxt/pro/oxfun.py +131 -27
- ccxt/pro/p2b.py +88 -22
- ccxt/pro/paradex.py +3 -3
- ccxt/pro/phemex.py +75 -21
- ccxt/pro/poloniex.py +124 -41
- ccxt/pro/probit.py +87 -80
- ccxt/pro/tradeogre.py +272 -0
- ccxt/pro/upbit.py +152 -12
- ccxt/pro/vertex.py +8 -3
- ccxt/pro/whitebit.py +58 -5
- ccxt/pro/woo.py +228 -37
- ccxt/pro/woofipro.py +106 -18
- ccxt/pro/xt.py +111 -5
- ccxt/probit.py +224 -95
- ccxt/protobuf/__init__.py +0 -0
- ccxt/protobuf/mexc/PrivateAccountV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateDealsV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PrivateOrdersV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicAggreDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicAggreDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicBookTickerBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicBookTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicDealsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsBatchV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicIncreaseDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicLimitDepthsV3Api_pb2.py +39 -0
- ccxt/protobuf/mexc/PublicMiniTickerV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PublicMiniTickersV3Api_pb2.py +38 -0
- ccxt/protobuf/mexc/PublicSpotKlineV3Api_pb2.py +37 -0
- ccxt/protobuf/mexc/PushDataV3ApiWrapper_pb2.py +52 -0
- ccxt/protobuf/mexc/__init__.py +0 -0
- ccxt/ramzinex.py +28 -25
- ccxt/sarmayex.py +7 -7
- ccxt/sarrafex.py +10 -10
- ccxt/static_dependencies/__init__.py +1 -1
- ccxt/static_dependencies/lark/py.typed +0 -0
- ccxt/static_dependencies/marshmallow/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_dataclass/py.typed +0 -0
- ccxt/static_dependencies/marshmallow_oneofschema/py.typed +0 -0
- ccxt/tabdeal.py +12 -11
- ccxt/test/tests_async.py +261 -57
- ccxt/test/tests_helpers.py +1 -3
- ccxt/test/tests_init.py +4 -3
- ccxt/test/tests_sync.py +261 -57
- ccxt/tetherland.py +7 -7
- ccxt/timex.py +210 -51
- ccxt/tokocrypto.py +167 -47
- ccxt/tradeogre.py +266 -31
- ccxt/twox.py +7 -7
- ccxt/ubitex.py +9 -9
- ccxt/upbit.py +568 -165
- ccxt/vertex.py +160 -32
- ccxt/wallex.py +9 -9
- ccxt/wavesexchange.py +165 -30
- ccxt/whitebit.py +975 -127
- ccxt/woo.py +1917 -1016
- ccxt/woofipro.py +432 -141
- ccxt/xt.py +649 -193
- ccxt/yobit.py +194 -70
- ccxt/zaif.py +91 -15
- ccxt/zonda.py +151 -36
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/METADATA +225 -73
- ccxt_ir-4.5.0.dist-info/RECORD +743 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/WHEEL +1 -1
- ccxt/abstract/ace.py +0 -15
- ccxt/abstract/bitbay.py +0 -53
- ccxt/abstract/bitcoincom.py +0 -115
- ccxt/abstract/bitfinex2.py +0 -139
- ccxt/abstract/bitpanda.py +0 -35
- ccxt/abstract/bl3p.py +0 -19
- ccxt/abstract/coinlist.py +0 -54
- ccxt/abstract/currencycom.py +0 -68
- ccxt/abstract/hitbtc3.py +0 -115
- ccxt/abstract/idex.py +0 -26
- ccxt/abstract/kuna.py +0 -182
- ccxt/abstract/lykke.py +0 -29
- ccxt/abstract/poloniexfutures.py +0 -48
- ccxt/abstract/wazirx.py +0 -30
- ccxt/ace.py +0 -1012
- ccxt/async_support/ace.py +0 -1012
- ccxt/async_support/base/ws/aiohttp_client.py +0 -125
- ccxt/async_support/base/ws/fast_client.py +0 -96
- ccxt/async_support/bitbay.py +0 -17
- ccxt/async_support/bitcoincom.py +0 -17
- ccxt/async_support/bitfinex2.py +0 -3552
- ccxt/async_support/bitpanda.py +0 -16
- ccxt/async_support/bl3p.py +0 -485
- ccxt/async_support/coinlist.py +0 -2243
- ccxt/async_support/currencycom.py +0 -1950
- ccxt/async_support/hitbtc3.py +0 -16
- ccxt/async_support/idex.py +0 -1766
- ccxt/async_support/kuna.py +0 -1841
- ccxt/async_support/lykke.py +0 -1270
- ccxt/async_support/poloniexfutures.py +0 -1717
- ccxt/async_support/wazirx.py +0 -1224
- ccxt/bitbay.py +0 -17
- ccxt/bitcoincom.py +0 -17
- ccxt/bitfinex2.py +0 -3552
- ccxt/bitpanda.py +0 -16
- ccxt/bl3p.py +0 -485
- ccxt/coinlist.py +0 -2243
- ccxt/currencycom.py +0 -1950
- ccxt/hitbtc3.py +0 -16
- ccxt/idex.py +0 -1766
- ccxt/kuna.py +0 -1841
- ccxt/lykke.py +0 -1270
- ccxt/poloniexfutures.py +0 -1717
- ccxt/pro/bitcoincom.py +0 -34
- ccxt/pro/bitfinex2.py +0 -1083
- ccxt/pro/bitpanda.py +0 -15
- ccxt/pro/currencycom.py +0 -536
- ccxt/pro/idex.py +0 -672
- ccxt/pro/poloniexfutures.py +0 -990
- ccxt/pro/wazirx.py +0 -749
- ccxt/test/base/__init__.py +0 -29
- 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 -109
- 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 -31
- 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_liquidation.py +0 -50
- 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 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- 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 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- 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/test/test_async.py +0 -1649
- ccxt/test/test_sync.py +0 -1648
- ccxt/wazirx.py +0 -1224
- ccxt_ir-4.3.46.0.2.dist-info/RECORD +0 -772
- /ccxt/abstract/{huobijp.py → bittrade.py} +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info/licenses}/LICENSE.txt +0 -0
- {ccxt_ir-4.3.46.0.2.dist-info → ccxt_ir-4.5.0.dist-info}/top_level.txt +0 -0
ccxt/pro/hyperliquid.py
CHANGED
|
@@ -5,26 +5,31 @@
|
|
|
5
5
|
|
|
6
6
|
import ccxt.async_support
|
|
7
7
|
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
|
|
8
|
-
from ccxt.base.types import Int, Market, Order, OrderBook, Str, Trade
|
|
8
|
+
from ccxt.base.types import Any, Bool, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
|
|
9
9
|
from ccxt.async_support.base.ws.client import Client
|
|
10
10
|
from typing import List
|
|
11
|
-
from ccxt.base.errors import ExchangeError
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
class hyperliquid(ccxt.async_support.hyperliquid):
|
|
15
14
|
|
|
16
|
-
def describe(self):
|
|
15
|
+
def describe(self) -> Any:
|
|
17
16
|
return self.deep_extend(super(hyperliquid, self).describe(), {
|
|
18
17
|
'has': {
|
|
19
18
|
'ws': True,
|
|
19
|
+
'cancelOrderWs': True,
|
|
20
|
+
'cancelOrdersWs': True,
|
|
21
|
+
'createOrderWs': True,
|
|
22
|
+
'createOrdersWs': True,
|
|
23
|
+
'editOrderWs': True,
|
|
20
24
|
'watchBalance': False,
|
|
21
25
|
'watchMyTrades': True,
|
|
22
26
|
'watchOHLCV': True,
|
|
23
27
|
'watchOrderBook': True,
|
|
24
28
|
'watchOrders': True,
|
|
25
|
-
'watchTicker':
|
|
26
|
-
'watchTickers':
|
|
29
|
+
'watchTicker': True,
|
|
30
|
+
'watchTickers': True,
|
|
27
31
|
'watchTrades': True,
|
|
32
|
+
'watchTradesForSymbols': False,
|
|
28
33
|
'watchPosition': False,
|
|
29
34
|
},
|
|
30
35
|
'urls': {
|
|
@@ -53,9 +58,148 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
53
58
|
},
|
|
54
59
|
})
|
|
55
60
|
|
|
61
|
+
async def create_orders_ws(self, orders: List[OrderRequest], params={}):
|
|
62
|
+
"""
|
|
63
|
+
create a list of trade orders using WebSocket post request
|
|
64
|
+
|
|
65
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
|
|
66
|
+
|
|
67
|
+
:param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
|
68
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
69
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
70
|
+
"""
|
|
71
|
+
await self.load_markets()
|
|
72
|
+
url = self.urls['api']['ws']['public']
|
|
73
|
+
ordersRequest = self.createOrdersRequest(orders, params)
|
|
74
|
+
wrapped = self.wrap_as_post_action(ordersRequest)
|
|
75
|
+
request = self.safe_dict(wrapped, 'request', {})
|
|
76
|
+
requestId = self.safe_string(wrapped, 'requestId')
|
|
77
|
+
response = await self.watch(url, requestId, request, requestId)
|
|
78
|
+
responseOjb = self.safe_dict(response, 'response', {})
|
|
79
|
+
data = self.safe_dict(responseOjb, 'data', {})
|
|
80
|
+
statuses = self.safe_list(data, 'statuses', [])
|
|
81
|
+
return self.parse_orders(statuses, None)
|
|
82
|
+
|
|
83
|
+
async def create_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
|
84
|
+
"""
|
|
85
|
+
create a trade order using WebSocket post request
|
|
86
|
+
|
|
87
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#place-an-order
|
|
88
|
+
|
|
89
|
+
:param str symbol: unified symbol of the market to create an order in
|
|
90
|
+
:param str type: 'market' or 'limit'
|
|
91
|
+
:param str side: 'buy' or 'sell'
|
|
92
|
+
:param float amount: how much of currency you want to trade in units of base currency
|
|
93
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
94
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
95
|
+
:param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
|
|
96
|
+
:param bool [params.postOnly]: True or False whether the order is post-only
|
|
97
|
+
:param bool [params.reduceOnly]: True or False whether the order is reduce-only
|
|
98
|
+
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
|
99
|
+
:param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
|
|
100
|
+
:param str [params.slippage]: the slippage for market order
|
|
101
|
+
:param str [params.vaultAddress]: the vault address for order
|
|
102
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
103
|
+
"""
|
|
104
|
+
await self.load_markets()
|
|
105
|
+
order, globalParams = self.parseCreateEditOrderArgs(None, symbol, type, side, amount, price, params)
|
|
106
|
+
orders = await self.create_orders_ws([order], globalParams)
|
|
107
|
+
parsedOrder = orders[0]
|
|
108
|
+
return parsedOrder
|
|
109
|
+
|
|
110
|
+
async def edit_order_ws(self, id: str, symbol: str, type: str, side: str, amount: Num = None, price: Num = None, params={}):
|
|
111
|
+
"""
|
|
112
|
+
edit a trade order
|
|
113
|
+
|
|
114
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint#modify-multiple-orders
|
|
115
|
+
|
|
116
|
+
:param str id: cancel order id
|
|
117
|
+
:param str symbol: unified symbol of the market to create an order in
|
|
118
|
+
:param str type: 'market' or 'limit'
|
|
119
|
+
:param str side: 'buy' or 'sell'
|
|
120
|
+
:param float amount: how much of currency you want to trade in units of base currency
|
|
121
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
|
122
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
123
|
+
:param str [params.timeInForce]: 'Gtc', 'Ioc', 'Alo'
|
|
124
|
+
:param bool [params.postOnly]: True or False whether the order is post-only
|
|
125
|
+
:param bool [params.reduceOnly]: True or False whether the order is reduce-only
|
|
126
|
+
:param float [params.triggerPrice]: The price at which a trigger order is triggered at
|
|
127
|
+
:param str [params.clientOrderId]: client order id,(optional 128 bit hex string e.g. 0x1234567890abcdef1234567890abcdef)
|
|
128
|
+
:param str [params.vaultAddress]: the vault address for order
|
|
129
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
130
|
+
"""
|
|
131
|
+
await self.load_markets()
|
|
132
|
+
market = self.market(symbol)
|
|
133
|
+
url = self.urls['api']['ws']['public']
|
|
134
|
+
order, globalParams = self.parseCreateEditOrderArgs(id, symbol, type, side, amount, price, params)
|
|
135
|
+
postRequest = self.editOrdersRequest([order], globalParams)
|
|
136
|
+
wrapped = self.wrap_as_post_action(postRequest)
|
|
137
|
+
request = self.safe_dict(wrapped, 'request', {})
|
|
138
|
+
requestId = self.safe_string(wrapped, 'requestId')
|
|
139
|
+
response = await self.watch(url, requestId, request, requestId)
|
|
140
|
+
# response is the same self.edit_order
|
|
141
|
+
responseObject = self.safe_dict(response, 'response', {})
|
|
142
|
+
dataObject = self.safe_dict(responseObject, 'data', {})
|
|
143
|
+
statuses = self.safe_list(dataObject, 'statuses', [])
|
|
144
|
+
first = self.safe_dict(statuses, 0, {})
|
|
145
|
+
parsedOrder = self.parse_order(first, market)
|
|
146
|
+
return parsedOrder
|
|
147
|
+
|
|
148
|
+
async def cancel_orders_ws(self, ids: List[str], symbol: Str = None, params={}):
|
|
149
|
+
"""
|
|
150
|
+
cancel multiple orders using WebSocket post request
|
|
151
|
+
|
|
152
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/post-requests
|
|
153
|
+
|
|
154
|
+
:param str[] ids: list of order ids to cancel
|
|
155
|
+
:param str symbol: unified symbol of the market the orders were made in
|
|
156
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
157
|
+
:param str[] [params.clientOrderId]: list of client order ids to cancel instead of order ids
|
|
158
|
+
:param str [params.vaultAddress]: the vault address for order cancellation
|
|
159
|
+
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
160
|
+
"""
|
|
161
|
+
self.check_required_credentials()
|
|
162
|
+
await self.load_markets()
|
|
163
|
+
request = self.cancelOrdersRequest(ids, symbol, params)
|
|
164
|
+
url = self.urls['api']['ws']['public']
|
|
165
|
+
wrapped = self.wrap_as_post_action(request)
|
|
166
|
+
wsRequest = self.safe_dict(wrapped, 'request', {})
|
|
167
|
+
requestId = self.safe_string(wrapped, 'requestId')
|
|
168
|
+
response = await self.watch(url, requestId, wsRequest, requestId)
|
|
169
|
+
responseObj = self.safe_dict(response, 'response', {})
|
|
170
|
+
data = self.safe_dict(responseObj, 'data', {})
|
|
171
|
+
statuses = self.safe_list(data, 'statuses', [])
|
|
172
|
+
orders = []
|
|
173
|
+
for i in range(0, len(statuses)):
|
|
174
|
+
status = statuses[i]
|
|
175
|
+
orders.append(self.safe_order({
|
|
176
|
+
'info': status,
|
|
177
|
+
'status': status,
|
|
178
|
+
}))
|
|
179
|
+
return orders
|
|
180
|
+
|
|
181
|
+
async def cancel_order_ws(self, id: str, symbol: Str = None, params={}):
|
|
182
|
+
"""
|
|
183
|
+
cancel a single order using WebSocket post request
|
|
184
|
+
|
|
185
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/post-requests
|
|
186
|
+
|
|
187
|
+
:param str id: order id to cancel
|
|
188
|
+
:param str symbol: unified symbol of the market the order was made in
|
|
189
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
190
|
+
:param str [params.clientOrderId]: client order id to cancel instead of order id
|
|
191
|
+
:param str [params.vaultAddress]: the vault address for order cancellation
|
|
192
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
|
193
|
+
"""
|
|
194
|
+
orders = await self.cancel_orders_ws([id], symbol, params)
|
|
195
|
+
return self.safe_dict(orders, 0)
|
|
196
|
+
|
|
56
197
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
|
57
198
|
"""
|
|
58
199
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
200
|
+
|
|
201
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
202
|
+
|
|
59
203
|
:param str symbol: unified symbol of the market to fetch the order book for
|
|
60
204
|
:param int [limit]: the maximum amount of order book entries to return
|
|
61
205
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
@@ -70,13 +214,41 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
70
214
|
'method': 'subscribe',
|
|
71
215
|
'subscription': {
|
|
72
216
|
'type': 'l2Book',
|
|
73
|
-
'coin': market['
|
|
217
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
74
218
|
},
|
|
75
219
|
}
|
|
76
220
|
message = self.extend(request, params)
|
|
77
221
|
orderbook = await self.watch(url, messageHash, message, messageHash)
|
|
78
222
|
return orderbook.limit()
|
|
79
223
|
|
|
224
|
+
async def un_watch_order_book(self, symbol: str, params={}) -> Any:
|
|
225
|
+
"""
|
|
226
|
+
unWatches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
|
227
|
+
|
|
228
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
229
|
+
|
|
230
|
+
:param str symbol: unified symbol of the market to fetch the order book for
|
|
231
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
232
|
+
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
|
|
233
|
+
"""
|
|
234
|
+
await self.load_markets()
|
|
235
|
+
market = self.market(symbol)
|
|
236
|
+
symbol = market['symbol']
|
|
237
|
+
subMessageHash = 'orderbook:' + symbol
|
|
238
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
239
|
+
url = self.urls['api']['ws']['public']
|
|
240
|
+
id = str(self.nonce())
|
|
241
|
+
request: dict = {
|
|
242
|
+
'id': id,
|
|
243
|
+
'method': 'unsubscribe',
|
|
244
|
+
'subscription': {
|
|
245
|
+
'type': 'l2Book',
|
|
246
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
247
|
+
},
|
|
248
|
+
}
|
|
249
|
+
message = self.extend(request, params)
|
|
250
|
+
return await self.watch(url, messageHash, message, messageHash)
|
|
251
|
+
|
|
80
252
|
def handle_order_book(self, client, message):
|
|
81
253
|
#
|
|
82
254
|
# {
|
|
@@ -123,15 +295,83 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
123
295
|
messageHash = 'orderbook:' + symbol
|
|
124
296
|
client.resolve(orderbook, messageHash)
|
|
125
297
|
|
|
298
|
+
async def watch_ticker(self, symbol: str, params={}) -> Ticker:
|
|
299
|
+
"""
|
|
300
|
+
|
|
301
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
302
|
+
|
|
303
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
304
|
+
:param str symbol: unified symbol of the market to fetch the ticker for
|
|
305
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
306
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
307
|
+
"""
|
|
308
|
+
market = self.market(symbol)
|
|
309
|
+
symbol = market['symbol']
|
|
310
|
+
tickers = await self.watch_tickers([symbol], params)
|
|
311
|
+
return tickers[symbol]
|
|
312
|
+
|
|
313
|
+
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
|
314
|
+
"""
|
|
315
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
316
|
+
|
|
317
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
318
|
+
|
|
319
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
|
320
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
321
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
322
|
+
"""
|
|
323
|
+
await self.load_markets()
|
|
324
|
+
symbols = self.market_symbols(symbols, None, True)
|
|
325
|
+
messageHash = 'tickers'
|
|
326
|
+
url = self.urls['api']['ws']['public']
|
|
327
|
+
request: dict = {
|
|
328
|
+
'method': 'subscribe',
|
|
329
|
+
'subscription': {
|
|
330
|
+
'type': 'webData2', # allMids
|
|
331
|
+
'user': '0x0000000000000000000000000000000000000000',
|
|
332
|
+
},
|
|
333
|
+
}
|
|
334
|
+
tickers = await self.watch(url, messageHash, self.extend(request, params), messageHash)
|
|
335
|
+
if self.newUpdates:
|
|
336
|
+
return self.filter_by_array_tickers(tickers, 'symbol', symbols)
|
|
337
|
+
return self.tickers
|
|
338
|
+
|
|
339
|
+
async def un_watch_tickers(self, symbols: Strings = None, params={}) -> Any:
|
|
340
|
+
"""
|
|
341
|
+
unWatches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
342
|
+
|
|
343
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
344
|
+
|
|
345
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
|
346
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
347
|
+
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
|
348
|
+
"""
|
|
349
|
+
await self.load_markets()
|
|
350
|
+
symbols = self.market_symbols(symbols, None, True)
|
|
351
|
+
subMessageHash = 'tickers'
|
|
352
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
353
|
+
url = self.urls['api']['ws']['public']
|
|
354
|
+
request: dict = {
|
|
355
|
+
'method': 'unsubscribe',
|
|
356
|
+
'subscription': {
|
|
357
|
+
'type': 'webData2', # allMids
|
|
358
|
+
'user': '0x0000000000000000000000000000000000000000',
|
|
359
|
+
},
|
|
360
|
+
}
|
|
361
|
+
return await self.watch(url, messageHash, self.extend(request, params), messageHash)
|
|
362
|
+
|
|
126
363
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
127
364
|
"""
|
|
128
365
|
watches information on multiple trades made by the user
|
|
366
|
+
|
|
367
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
368
|
+
|
|
129
369
|
:param str symbol: unified market symbol of the market orders were made in
|
|
130
370
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
131
371
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
132
372
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
133
373
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
|
134
|
-
:returns dict[]: a list of
|
|
374
|
+
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
135
375
|
"""
|
|
136
376
|
userAddress = None
|
|
137
377
|
userAddress, params = self.handlePublicAddress('watchMyTrades', params)
|
|
@@ -154,6 +394,82 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
154
394
|
limit = trades.getLimit(symbol, limit)
|
|
155
395
|
return self.filter_by_symbol_since_limit(trades, symbol, since, limit, True)
|
|
156
396
|
|
|
397
|
+
def handle_ws_tickers(self, client: Client, message):
|
|
398
|
+
#
|
|
399
|
+
# {
|
|
400
|
+
# "channel": "webData2",
|
|
401
|
+
# "data": {
|
|
402
|
+
# "meta": {
|
|
403
|
+
# "universe": [
|
|
404
|
+
# {
|
|
405
|
+
# "szDecimals": 5,
|
|
406
|
+
# "name": "BTC",
|
|
407
|
+
# "maxLeverage": 50,
|
|
408
|
+
# "onlyIsolated": False
|
|
409
|
+
# },
|
|
410
|
+
# ...
|
|
411
|
+
# ],
|
|
412
|
+
# },
|
|
413
|
+
# "assetCtxs": [
|
|
414
|
+
# {
|
|
415
|
+
# "funding": "0.00003005",
|
|
416
|
+
# "openInterest": "2311.50778",
|
|
417
|
+
# "prevDayPx": "63475.0",
|
|
418
|
+
# "dayNtlVlm": "468043329.64289033",
|
|
419
|
+
# "premium": "0.00094264",
|
|
420
|
+
# "oraclePx": "64712.0",
|
|
421
|
+
# "markPx": "64774.0",
|
|
422
|
+
# "midPx": "64773.5",
|
|
423
|
+
# "impactPxs": [
|
|
424
|
+
# "64773.0",
|
|
425
|
+
# "64774.0"
|
|
426
|
+
# ]
|
|
427
|
+
# },
|
|
428
|
+
# ...
|
|
429
|
+
# ],
|
|
430
|
+
# "spotAssetCtxs": [
|
|
431
|
+
# {
|
|
432
|
+
# "prevDayPx": "0.20937",
|
|
433
|
+
# "dayNtlVlm": "11188888.61984999",
|
|
434
|
+
# "markPx": "0.19722",
|
|
435
|
+
# "midPx": "0.197145",
|
|
436
|
+
# "circulatingSupply": "598760557.12072003",
|
|
437
|
+
# "coin": "PURR/USDC"
|
|
438
|
+
# },
|
|
439
|
+
# ...
|
|
440
|
+
# ],
|
|
441
|
+
# }
|
|
442
|
+
# }
|
|
443
|
+
#
|
|
444
|
+
# spot
|
|
445
|
+
rawData = self.safe_dict(message, 'data', {})
|
|
446
|
+
spotAssets = self.safe_list(rawData, 'spotAssetCtxs', [])
|
|
447
|
+
parsedTickers = []
|
|
448
|
+
for i in range(0, len(spotAssets)):
|
|
449
|
+
assetObject = spotAssets[i]
|
|
450
|
+
marketId = self.safe_string(assetObject, 'coin')
|
|
451
|
+
market = self.safe_market(marketId, None, None, 'spot')
|
|
452
|
+
ticker = self.parse_ws_ticker(assetObject, market)
|
|
453
|
+
parsedTickers.append(ticker)
|
|
454
|
+
# perpetuals
|
|
455
|
+
meta = self.safe_dict(rawData, 'meta', {})
|
|
456
|
+
universe = self.safe_list(meta, 'universe', [])
|
|
457
|
+
assetCtxs = self.safe_list(rawData, 'assetCtxs', [])
|
|
458
|
+
for i in range(0, len(universe)):
|
|
459
|
+
data = self.extend(
|
|
460
|
+
self.safe_dict(universe, i, {}),
|
|
461
|
+
self.safe_dict(assetCtxs, i, {})
|
|
462
|
+
)
|
|
463
|
+
id = data['name'] + '/USDC:USDC'
|
|
464
|
+
market = self.safe_market(id, None, None, 'swap')
|
|
465
|
+
ticker = self.parse_ws_ticker(data, market)
|
|
466
|
+
parsedTickers.append(ticker)
|
|
467
|
+
tickers = self.index_by(parsedTickers, 'symbol')
|
|
468
|
+
client.resolve(tickers, 'tickers')
|
|
469
|
+
|
|
470
|
+
def parse_ws_ticker(self, rawTicker, market: Market = None) -> Ticker:
|
|
471
|
+
return self.parse_ticker(rawTicker, market)
|
|
472
|
+
|
|
157
473
|
def handle_my_trades(self, client: Client, message):
|
|
158
474
|
#
|
|
159
475
|
# {
|
|
@@ -208,14 +524,17 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
208
524
|
client.resolve(trades, messageHash)
|
|
209
525
|
|
|
210
526
|
async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
527
|
+
# s
|
|
528
|
+
# @method
|
|
529
|
+
# @name hyperliquid#watchTrades
|
|
530
|
+
# @description watches information on multiple trades made in a market
|
|
531
|
+
# @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
532
|
+
# @param {string} symbol unified market symbol of the market trades were made in
|
|
533
|
+
# @param {int} [since] the earliest time in ms to fetch trades for
|
|
534
|
+
# @param {int} [limit] the maximum number of trade structures to retrieve
|
|
535
|
+
# @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
536
|
+
# @returns {object[]} a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
|
537
|
+
#
|
|
219
538
|
await self.load_markets()
|
|
220
539
|
market = self.market(symbol)
|
|
221
540
|
symbol = market['symbol']
|
|
@@ -225,7 +544,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
225
544
|
'method': 'subscribe',
|
|
226
545
|
'subscription': {
|
|
227
546
|
'type': 'trades',
|
|
228
|
-
'coin': market['
|
|
547
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
229
548
|
},
|
|
230
549
|
}
|
|
231
550
|
message = self.extend(request, params)
|
|
@@ -234,6 +553,32 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
234
553
|
limit = trades.getLimit(symbol, limit)
|
|
235
554
|
return self.filter_by_since_limit(trades, since, limit, 'timestamp', True)
|
|
236
555
|
|
|
556
|
+
async def un_watch_trades(self, symbol: str, params={}) -> Any:
|
|
557
|
+
"""
|
|
558
|
+
unWatches information on multiple trades made in a market
|
|
559
|
+
|
|
560
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
561
|
+
|
|
562
|
+
:param str symbol: unified market symbol of the market trades were made in
|
|
563
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
564
|
+
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
|
565
|
+
"""
|
|
566
|
+
await self.load_markets()
|
|
567
|
+
market = self.market(symbol)
|
|
568
|
+
symbol = market['symbol']
|
|
569
|
+
subMessageHash = 'trade:' + symbol
|
|
570
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
571
|
+
url = self.urls['api']['ws']['public']
|
|
572
|
+
request: dict = {
|
|
573
|
+
'method': 'unsubscribe',
|
|
574
|
+
'subscription': {
|
|
575
|
+
'type': 'trades',
|
|
576
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
577
|
+
},
|
|
578
|
+
}
|
|
579
|
+
message = self.extend(request, params)
|
|
580
|
+
return await self.watch(url, messageHash, message, messageHash)
|
|
581
|
+
|
|
237
582
|
def handle_trades(self, client: Client, message):
|
|
238
583
|
#
|
|
239
584
|
# {
|
|
@@ -269,7 +614,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
269
614
|
messageHash = 'trade:' + symbol
|
|
270
615
|
client.resolve(trades, messageHash)
|
|
271
616
|
|
|
272
|
-
def parse_ws_trade(self, trade, market: Market = None) -> Trade:
|
|
617
|
+
def parse_ws_trade(self, trade: dict, market: Market = None) -> Trade:
|
|
273
618
|
#
|
|
274
619
|
# fetchMyTrades
|
|
275
620
|
#
|
|
@@ -321,7 +666,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
321
666
|
'datetime': self.iso8601(timestamp),
|
|
322
667
|
'symbol': symbol,
|
|
323
668
|
'id': id,
|
|
324
|
-
'order':
|
|
669
|
+
'order': self.safe_string(trade, 'oid'),
|
|
325
670
|
'type': None,
|
|
326
671
|
'side': side,
|
|
327
672
|
'takerOrMaker': None,
|
|
@@ -334,6 +679,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
334
679
|
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
|
335
680
|
"""
|
|
336
681
|
watches historical candlestick data containing the open, high, low, close price, and the volume of a market
|
|
682
|
+
|
|
683
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
684
|
+
|
|
337
685
|
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
338
686
|
:param str timeframe: the length of time each candle represents
|
|
339
687
|
:param int [since]: timestamp in ms of the earliest candle to fetch
|
|
@@ -349,7 +697,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
349
697
|
'method': 'subscribe',
|
|
350
698
|
'subscription': {
|
|
351
699
|
'type': 'candle',
|
|
352
|
-
'coin': market['
|
|
700
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
353
701
|
'interval': timeframe,
|
|
354
702
|
},
|
|
355
703
|
}
|
|
@@ -360,6 +708,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
360
708
|
limit = ohlcv.getLimit(symbol, limit)
|
|
361
709
|
return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
|
|
362
710
|
|
|
711
|
+
async def un_watch_ohlcv(self, symbol: str, timeframe='1m', params={}) -> Any:
|
|
712
|
+
"""
|
|
713
|
+
watches historical candlestick data containing the open, high, low, close price, and the volume of a market
|
|
714
|
+
|
|
715
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
716
|
+
|
|
717
|
+
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
|
718
|
+
:param str timeframe: the length of time each candle represents
|
|
719
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
720
|
+
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
|
721
|
+
"""
|
|
722
|
+
await self.load_markets()
|
|
723
|
+
market = self.market(symbol)
|
|
724
|
+
symbol = market['symbol']
|
|
725
|
+
url = self.urls['api']['ws']['public']
|
|
726
|
+
request: dict = {
|
|
727
|
+
'method': 'unsubscribe',
|
|
728
|
+
'subscription': {
|
|
729
|
+
'type': 'candle',
|
|
730
|
+
'coin': market['baseName'] if market['swap'] else market['id'],
|
|
731
|
+
'interval': timeframe,
|
|
732
|
+
},
|
|
733
|
+
}
|
|
734
|
+
subMessageHash = 'candles:' + timeframe + ':' + symbol
|
|
735
|
+
messagehash = 'unsubscribe:' + subMessageHash
|
|
736
|
+
message = self.extend(request, params)
|
|
737
|
+
return await self.watch(url, messagehash, message, messagehash)
|
|
738
|
+
|
|
363
739
|
def handle_ohlcv(self, client: Client, message):
|
|
364
740
|
#
|
|
365
741
|
# {
|
|
@@ -395,15 +771,34 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
395
771
|
messageHash = 'candles:' + timeframe + ':' + symbol
|
|
396
772
|
client.resolve(ohlcv, messageHash)
|
|
397
773
|
|
|
774
|
+
def handle_ws_post(self, client: Client, message: dict):
|
|
775
|
+
# {
|
|
776
|
+
# channel: "post",
|
|
777
|
+
# data: {
|
|
778
|
+
# id: <number>,
|
|
779
|
+
# response: {
|
|
780
|
+
# type: "info" | "action" | "error",
|
|
781
|
+
# payload: {...}
|
|
782
|
+
# }
|
|
783
|
+
# }
|
|
784
|
+
data = self.safe_dict(message, 'data')
|
|
785
|
+
id = self.safe_string(data, 'id')
|
|
786
|
+
response = self.safe_dict(data, 'response')
|
|
787
|
+
payload = self.safe_dict(response, 'payload')
|
|
788
|
+
client.resolve(payload, id)
|
|
789
|
+
|
|
398
790
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
|
399
791
|
"""
|
|
400
792
|
watches information on multiple orders made by the user
|
|
793
|
+
|
|
794
|
+
https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/websocket/subscriptions
|
|
795
|
+
|
|
401
796
|
:param str symbol: unified market symbol of the market orders were made in
|
|
402
797
|
:param int [since]: the earliest time in ms to fetch orders for
|
|
403
798
|
:param int [limit]: the maximum number of order structures to retrieve
|
|
404
799
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
|
405
800
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
|
406
|
-
:returns dict[]: a list of
|
|
801
|
+
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
|
407
802
|
"""
|
|
408
803
|
await self.load_markets()
|
|
409
804
|
userAddress = None
|
|
@@ -472,21 +867,168 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
472
867
|
client.resolve(stored, innerMessageHash)
|
|
473
868
|
client.resolve(stored, messageHash)
|
|
474
869
|
|
|
475
|
-
def handle_error_message(self, client: Client, message):
|
|
870
|
+
def handle_error_message(self, client: Client, message) -> Bool:
|
|
476
871
|
#
|
|
477
|
-
#
|
|
872
|
+
# {
|
|
873
|
+
# "channel": "post",
|
|
874
|
+
# "data": {
|
|
875
|
+
# "id": 1,
|
|
876
|
+
# "response": {
|
|
877
|
+
# "type": "action",
|
|
878
|
+
# "payload": {
|
|
879
|
+
# "status": "ok",
|
|
880
|
+
# "response": {
|
|
881
|
+
# "type": "order",
|
|
882
|
+
# "data": {
|
|
883
|
+
# "statuses": [
|
|
884
|
+
# {
|
|
885
|
+
# "error": "Order price cannot be more than 80% away from the reference price"
|
|
886
|
+
# }
|
|
887
|
+
# ]
|
|
888
|
+
# }
|
|
889
|
+
# }
|
|
890
|
+
# }
|
|
891
|
+
# }
|
|
892
|
+
# }
|
|
893
|
+
# }
|
|
894
|
+
#
|
|
895
|
+
# {
|
|
478
896
|
# "channel": "error",
|
|
479
897
|
# "data": "Error parsing JSON into valid websocket request: {\"type\": \"allMids\"}"
|
|
480
898
|
# }
|
|
481
899
|
#
|
|
482
900
|
channel = self.safe_string(message, 'channel', '')
|
|
483
|
-
ret_msg = self.safe_string(message, 'data', '')
|
|
484
901
|
if channel == 'error':
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
902
|
+
ret_msg = self.safe_string(message, 'data', '')
|
|
903
|
+
errorMsg = self.id + ' ' + ret_msg
|
|
904
|
+
client.reject(errorMsg)
|
|
905
|
+
return True
|
|
906
|
+
data = self.safe_dict(message, 'data', {})
|
|
907
|
+
id = self.safe_string(message, 'id')
|
|
908
|
+
response = self.safe_dict(data, 'response', {})
|
|
909
|
+
payload = self.safe_dict(response, 'payload', {})
|
|
910
|
+
status = self.safe_string(payload, 'status')
|
|
911
|
+
if status is not None and status != 'ok':
|
|
912
|
+
errorMsg = self.id + ' ' + self.json(payload)
|
|
913
|
+
client.reject(errorMsg, id)
|
|
914
|
+
return True
|
|
915
|
+
type = self.safe_string(payload, 'type')
|
|
916
|
+
if type == 'error':
|
|
917
|
+
error = self.id + ' ' + self.json(payload)
|
|
918
|
+
client.reject(error, id)
|
|
919
|
+
return True
|
|
920
|
+
try:
|
|
921
|
+
self.handle_errors(0, '', '', '', {}, self.json(payload), payload, {}, {})
|
|
922
|
+
except Exception as e:
|
|
923
|
+
client.reject(e, id)
|
|
924
|
+
return True
|
|
925
|
+
return False
|
|
926
|
+
|
|
927
|
+
def handle_order_book_unsubscription(self, client: Client, subscription: dict):
|
|
928
|
+
#
|
|
929
|
+
# "subscription":{
|
|
930
|
+
# "type":"l2Book",
|
|
931
|
+
# "coin":"BTC",
|
|
932
|
+
# "nSigFigs":5,
|
|
933
|
+
# "mantissa":null
|
|
934
|
+
# }
|
|
935
|
+
#
|
|
936
|
+
coin = self.safe_string(subscription, 'coin')
|
|
937
|
+
marketId = self.coinToMarketId(coin)
|
|
938
|
+
symbol = self.safe_symbol(marketId)
|
|
939
|
+
subMessageHash = 'orderbook:' + symbol
|
|
940
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
941
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
|
942
|
+
if symbol in self.orderbooks:
|
|
943
|
+
del self.orderbooks[symbol]
|
|
944
|
+
|
|
945
|
+
def handle_trades_unsubscription(self, client: Client, subscription: dict):
|
|
946
|
+
#
|
|
947
|
+
coin = self.safe_string(subscription, 'coin')
|
|
948
|
+
marketId = self.coinToMarketId(coin)
|
|
949
|
+
symbol = self.safe_symbol(marketId)
|
|
950
|
+
subMessageHash = 'trade:' + symbol
|
|
951
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
952
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
|
953
|
+
if symbol in self.trades:
|
|
954
|
+
del self.trades[symbol]
|
|
955
|
+
|
|
956
|
+
def handle_tickers_unsubscription(self, client: Client, subscription: dict):
|
|
957
|
+
#
|
|
958
|
+
subMessageHash = 'tickers'
|
|
959
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
960
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
|
961
|
+
symbols = list(self.tickers.keys())
|
|
962
|
+
for i in range(0, len(symbols)):
|
|
963
|
+
del self.tickers[symbols[i]]
|
|
964
|
+
|
|
965
|
+
def handle_ohlcv_unsubscription(self, client: Client, subscription: dict):
|
|
966
|
+
coin = self.safe_string(subscription, 'coin')
|
|
967
|
+
marketId = self.coinToMarketId(coin)
|
|
968
|
+
symbol = self.safe_symbol(marketId)
|
|
969
|
+
interval = self.safe_string(subscription, 'interval')
|
|
970
|
+
timeframe = self.find_timeframe(interval)
|
|
971
|
+
subMessageHash = 'candles:' + timeframe + ':' + symbol
|
|
972
|
+
messageHash = 'unsubscribe:' + subMessageHash
|
|
973
|
+
self.clean_unsubscription(client, subMessageHash, messageHash)
|
|
974
|
+
if symbol in self.ohlcvs:
|
|
975
|
+
if timeframe in self.ohlcvs[symbol]:
|
|
976
|
+
del self.ohlcvs[symbol][timeframe]
|
|
977
|
+
|
|
978
|
+
def handle_subscription_response(self, client: Client, message):
|
|
979
|
+
# {
|
|
980
|
+
# "channel":"subscriptionResponse",
|
|
981
|
+
# "data":{
|
|
982
|
+
# "method":"unsubscribe",
|
|
983
|
+
# "subscription":{
|
|
984
|
+
# "type":"l2Book",
|
|
985
|
+
# "coin":"BTC",
|
|
986
|
+
# "nSigFigs":5,
|
|
987
|
+
# "mantissa":null
|
|
988
|
+
# }
|
|
989
|
+
# }
|
|
990
|
+
# }
|
|
991
|
+
#
|
|
992
|
+
# {
|
|
993
|
+
# "channel":"subscriptionResponse",
|
|
994
|
+
# "data":{
|
|
995
|
+
# "method":"unsubscribe",
|
|
996
|
+
# "subscription":{
|
|
997
|
+
# "type":"trades",
|
|
998
|
+
# "coin":"PURR/USDC"
|
|
999
|
+
# }
|
|
1000
|
+
# }
|
|
1001
|
+
# }
|
|
1002
|
+
#
|
|
1003
|
+
data = self.safe_dict(message, 'data', {})
|
|
1004
|
+
method = self.safe_string(data, 'method')
|
|
1005
|
+
if method == 'unsubscribe':
|
|
1006
|
+
subscription = self.safe_dict(data, 'subscription', {})
|
|
1007
|
+
type = self.safe_string(subscription, 'type')
|
|
1008
|
+
if type == 'l2Book':
|
|
1009
|
+
self.handle_order_book_unsubscription(client, subscription)
|
|
1010
|
+
elif type == 'trades':
|
|
1011
|
+
self.handle_trades_unsubscription(client, subscription)
|
|
1012
|
+
elif type == 'webData2':
|
|
1013
|
+
self.handle_tickers_unsubscription(client, subscription)
|
|
1014
|
+
elif type == 'candle':
|
|
1015
|
+
self.handle_ohlcv_unsubscription(client, subscription)
|
|
488
1016
|
|
|
489
1017
|
def handle_message(self, client: Client, message):
|
|
1018
|
+
#
|
|
1019
|
+
# {
|
|
1020
|
+
# "channel":"subscriptionResponse",
|
|
1021
|
+
# "data":{
|
|
1022
|
+
# "method":"unsubscribe",
|
|
1023
|
+
# "subscription":{
|
|
1024
|
+
# "type":"l2Book",
|
|
1025
|
+
# "coin":"BTC",
|
|
1026
|
+
# "nSigFigs":5,
|
|
1027
|
+
# "mantissa":null
|
|
1028
|
+
# }
|
|
1029
|
+
# }
|
|
1030
|
+
# }
|
|
1031
|
+
#
|
|
490
1032
|
if self.handle_error_message(client, message):
|
|
491
1033
|
return
|
|
492
1034
|
topic = self.safe_string(message, 'channel', '')
|
|
@@ -497,6 +1039,9 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
497
1039
|
'candle': self.handle_ohlcv,
|
|
498
1040
|
'orderUpdates': self.handle_order,
|
|
499
1041
|
'userFills': self.handle_my_trades,
|
|
1042
|
+
'webData2': self.handle_ws_tickers,
|
|
1043
|
+
'post': self.handle_ws_post,
|
|
1044
|
+
'subscriptionResponse': self.handle_subscription_response,
|
|
500
1045
|
}
|
|
501
1046
|
exacMethod = self.safe_value(methods, topic)
|
|
502
1047
|
if exacMethod is not None:
|
|
@@ -510,7 +1055,7 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
510
1055
|
method(client, message)
|
|
511
1056
|
return
|
|
512
1057
|
|
|
513
|
-
def ping(self, client):
|
|
1058
|
+
def ping(self, client: Client):
|
|
514
1059
|
return {
|
|
515
1060
|
'method': 'ping',
|
|
516
1061
|
}
|
|
@@ -523,3 +1068,22 @@ class hyperliquid(ccxt.async_support.hyperliquid):
|
|
|
523
1068
|
#
|
|
524
1069
|
client.lastPong = self.safe_integer(message, 'pong')
|
|
525
1070
|
return message
|
|
1071
|
+
|
|
1072
|
+
def request_id(self) -> float:
|
|
1073
|
+
requestId = self.sum(self.safe_integer(self.options, 'requestId', 0), 1)
|
|
1074
|
+
self.options['requestId'] = requestId
|
|
1075
|
+
return requestId
|
|
1076
|
+
|
|
1077
|
+
def wrap_as_post_action(self, request: dict) -> dict:
|
|
1078
|
+
requestId = self.request_id()
|
|
1079
|
+
return {
|
|
1080
|
+
'requestId': requestId,
|
|
1081
|
+
'request': {
|
|
1082
|
+
'method': 'post',
|
|
1083
|
+
'id': requestId,
|
|
1084
|
+
'request': {
|
|
1085
|
+
'type': 'action',
|
|
1086
|
+
'payload': request,
|
|
1087
|
+
},
|
|
1088
|
+
},
|
|
1089
|
+
}
|