Feat/hyperliquid derivative

Before submitting this PR, please make sure:

[x] Your code builds clean without any errors or warnings
[x] You are using approved title ("feat/", "fix/", "docs/", "refactor/")

A description of the changes proposed in the pull request:
This PR create Hyperliquid connector to the latest standards.
Tests performed by the developer:
There was no problem testing the ETH-USD pair on the hyperliquid_perpetual_testnet connector using the perpetual_market_making strategy
Tips for QA testing:
Use the test wallet to obtain USDC according to the document( https://hyperliquid.gitbook.io/hyperliquid-docs/testnet ) and test them on the testnet network ( https://app.hyperliquid-testnet.xyz/trade )

There is some remaining unit test code being written

There is one possible problem, This Hyperliquid exchange requires the private key of the ETH wallet as an argument to the secrect key

PR update:

Test wallet created for hyperliquid
Connect wallet to exchange ok
Install on mac(m1) ok however when starting the client:

Getting error ModuleNotFoundError: No module named 'cachetools'Traceback (most recent call last):
  File "/Users/rapcomia/github/hummingbot/6675/./bin/hummingbot_quickstart.py", line 15, in <module>
    from bin.hummingbot import UIStartListener, detect_available_port
  File "/Users/rapcomia/github/hummingbot/6675/bin/hummingbot.py", line 10, in <module>
    from hummingbot.client.config.client_config_map import ClientConfigMap
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/client/config/client_config_map.py", line 17, in <module>
    from hummingbot.client.settings import (
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/client/settings.py", line 13, in <module>
    from hummingbot.core.data_type.trade_fee import TradeFeeSchema
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/core/data_type/trade_fee.py", line 7, in <module>
    from hummingbot.connector.utils import combine_to_hb_trading_pair, split_hb_trading_pair
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/utils.py", line 12, in <module>
    from hummingbot.core.utils.tracking_nonce import NonceCreator, get_tracking_nonce
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/core/utils/__init__.py", line 1, in <module>
    import cachetools
ModuleNotFoundError: No module named 'cachetools'

Tried to remove conda hummingbot and install again still the same results on 3/3 attempt
Pending to test on Ubuntu or WSL

PR update:

Install on Ubuntu when starting the client as well:
Getting error ModuleNotFoundError: No module named 'cachetools'

Traceback (most recent call last):
  File "/home/nikita/hypa6675/bin/hummingbot.py", line 10, in <module>
    from hummingbot.client.config.client_config_map import ClientConfigMap
  File "/home/nikita/hypa6675/hummingbot/client/config/client_config_map.py", line 17, in <module>
    from hummingbot.client.settings import (
  File "/home/nikita/hypa6675/hummingbot/client/settings.py", line 13, in <module>
    from hummingbot.core.data_type.trade_fee import TradeFeeSchema
  File "/home/nikita/hypa6675/hummingbot/core/data_type/trade_fee.py", line 7, in <module>
    from hummingbot.connector.utils import combine_to_hb_trading_pair, split_hb_trading_pair
  File "/home/nikita/hypa6675/hummingbot/connector/utils.py", line 12, in <module>
    from hummingbot.core.utils.tracking_nonce import NonceCreator, get_tracking_nonce
  File "/home/nikita/hypa6675/hummingbot/core/utils/__init__.py", line 1, in <module>
    import cachetools
ModuleNotFoundError: No module named 'cachetools'

@rapcmia

commit 2851e96 PR update:

Install on Ubuntu when starting the client as well:
Getting error ModuleNotFoundError: No module named 'cachetools'

Traceback (most recent call last):
  File "/home/nikita/hypa6675/bin/hummingbot.py", line 10, in <module>
    from hummingbot.client.config.client_config_map import ClientConfigMap
  File "/home/nikita/hypa6675/hummingbot/client/config/client_config_map.py", line 17, in <module>
    from hummingbot.client.settings import (
  File "/home/nikita/hypa6675/hummingbot/client/settings.py", line 13, in <module>
    from hummingbot.core.data_type.trade_fee import TradeFeeSchema
  File "/home/nikita/hypa6675/hummingbot/core/data_type/trade_fee.py", line 7, in <module>
    from hummingbot.connector.utils import combine_to_hb_trading_pair, split_hb_trading_pair
  File "/home/nikita/hypa6675/hummingbot/connector/utils.py", line 12, in <module>
    from hummingbot.core.utils.tracking_nonce import NonceCreator, get_tracking_nonce
  File "/home/nikita/hypa6675/hummingbot/core/utils/__init__.py", line 1, in <module>
    import cachetools
ModuleNotFoundError: No module named 'cachetools'

fixed

Test commit 3a82c5e3d

Confirmed issue with ModuleNotFoundError has been fixed ✅
Deposit test funds on testnet successfully
UI Button seems bugged, compared to development and background on this PR is changed

This is development:

Setup and connect hyperliquid-perpetual

We would suggest to change the first prompt from instead of public key to use wallet address 🤔

Setup simple perpmm ✅

Order create and cancelation ok
Connector does not support HEDGE atm
Connector does not support OrderType.MARKET while on exchange we can submit market orders ok

Pending:

Test on position open/close, leverage and balance allocation
Test if compatible with v2 strategies
Test in docker build

Test performed:

Cloned and install feature branch
connected hyperliquid_perpetual_testnet successfully
Created/started perpetualMM strategy using hyperliquid_perpetual_testnet
reviewed on exchange leverage set up as in config, however got ERROR - Unhandled error in background task: 'ETH' (_set_trading_pair_leverage "asset": self.coin_to_asset[coin], KeyError: 'ETH') at the start of the strategy
order to OPEN filled successfully
restarted bot, review position retrieved successfully
Review on position open/close prices on the exchange are correct (same as set up for take_profit and stop_loss)✅

A) Reviewed on exchange leverage set up as in config, however got ERROR - Unhandled error in background task: 'ETH' (_set_trading_pair_leverage "asset": self.coin_to_asset[coin], KeyError: 'ETH') at the start of the strategy
2023-11-27 08:52:05,227 - 512521 - hummingbot.core.utils.async_utils - ERROR - Unhandled error in background task: 'ETH'
Traceback (most recent call last):
  File "/home/nikita/hyper6675/hummingbot/core/utils/async_utils.py", line 9, in safe_wrapper
    return await c
  File "/home/nikita/hyper6675/hummingbot/connector/perpetual_derivative_py_base.py", line 356, in _execute_set_leverage
    success, msg = await self._set_trading_pair_leverage(trading_pair, leverage)
  File "/home/nikita/hyper6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 689, in _set_trading_pair_leverage
    "asset": self.coin_to_asset[coin],
KeyError: 'ETH'

B) Review history --verbose has lot more orders than on the exchange (showing ~112 trades intead of 6 (last order closed manually))

C) Got multiple instances of Error 422
2023-11-27 08:54:00,487 - 512521 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Error fetching status update for the active order 0x48424f54424548554436306231653665: Error executing request POST https://api.hyperliquid-testnet.xyz/info. HTTP status is 422. Error: Failed to deserialize the JSON body into the target type.

D) On retrieval position got this error, however bot was able to recover:
2023-11-27 08:27:08,034 - 512521 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (ETH-USD) Creating 1 LIMIT bid orders at (Size, Price): ['0.01 ETH, 2056.400000000000090949470177 USD'] to CLOSE position.
2023-11-27 08:27:08,980 - 512521 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - ERROR - Unexpected error in user stream listener loop.
Traceback (most recent call last):
  File "/home/nikita/hyper6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 476, in _user_stream_event_listener
    self._process_order_message(order_msg)
  File "/home/nikita/hyper6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 538, in _process_order_message
    new_state=CONSTANTS.ORDER_STATE[current_state],
KeyError: 'rejected'
2023-11-27 08:27:09,037 - 512521 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - NETWORK - Error submitting buy LIMIT order to Hyperliquid_perpetual for 0.0100 ETH-USD 2056.40000000000009094947017729282379150390625.
Traceback (most recent call last):
  File "/home/nikita/hyper6675/hummingbot/connector/exchange_py_base.py", line 452, in _create_order
    await self._place_order_and_process_update(order=order, **kwargs,)
  File "/home/nikita/hyper6675/hummingbot/connector/exchange_py_base.py", line 469, in _place_order_and_process_update
    exchange_order_id, update_timestamp = await self._place_order(
  File "/home/nikita/hyper6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 367, in _place_order
    raise IOError(f"Error submitting order {order_id}: {o_order_result['error']}")
OSError: Error submitting order 0x48424f54424548554436306231653131: Reduce only order would increase position.
2023-11-27 08:27:09,038 - 512521 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Failed to submit BUY order to Hyperliquid_perpetual. Check API key and network connection.
2023-11-27 08:27:09,044 - 512521 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54424548554436306231653131", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-11-27 08:27:09,044 - 512521 - hummingbot.connector.client_order_tracker - INFO - Order 0x48424f54424548554436306231653131 has failed. Order Update: OrderUpdate(trading_pair='ETH-USD', update_timestamp=1701073628.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x48424f54424548554436306231653131', exchange_order_id=None, misc_updates=None)

@nikspz  fixed A,C,D
For B's question:
For the first picture, there are 7 pages in the bottom right corner. Is their sum 112 trades?
The issue with the second image has been fixed.

@nikspz fixed A,C,D For B's question: For the first picture, there are 7 pages in the bottom right corner. Is their sum 112 trades? The issue with the second image has been fixed.

It's just 7 trades (from 1st to 7), not pages. Double checked, can't go to other page.
The 112 trades in the Client and 6 actual in the exchange (rest was closed positions manually by me)

Test commit 0bf27e02075fd6c61

We would suggest to change the first prompt from instead of public key to use wallet address 🤔

This is fixed, thank you

B) Review history --verbose has lot more orders than on the exchange (showing ~112 trades intead of 6 (last order closed manually))

Found an instance related to this issue where the bot suddenly got a number of order filled yet on exchange it does not record anything about it. See recording below:
https://drive.google.com/file/d/1MKqv_ahIRyx4-kt32JfcjIYqxi82ybdn/view?usp=sharing

The orders that where initially created has not been filled or cancelled as well

The orders that was filled is not listed on exchange trade history

We are assuming this might be something related to exchange, test still in progress

Steps to reproduce:

Setup simple perp-mm for hyperliquid on any supported markets
Setup spreads enough for filled order
Wait for couple of minutes, observed a sudden spike of filled orders not recorded on exchange

trades_perp-hyperliquid.csv
logs_perp-hyperliquid.log
perp-hyperliquid.yml.log

Test commit 3a82c5e3d

Confirmed issue with ModuleNotFoundError has been fixed ✅

Deposit test funds on testnet successfully

UI Button seems bugged, compared to development and background on this PR is changed

This is development:

Setup and connect hyperliquid-perpetual

We would suggest to change the first prompt from instead of public key to use wallet address 🤔

Setup simple perpmm ✅

Order create and cancelation ok
Connector does not support HEDGE atm
Connector does not support OrderType.MARKET while on exchange we can submit market orders ok

Pending:

Test on position open/close, leverage and balance allocation
Test if compatible with v2 strategies
Test in docker build

In the official example, lines 206 and 228 of the web page, the Market Order is an aggressive Limit Order IoC. (https://github.com/hyperliquid-dex/hyperliquid-python-sdk/blob/master/hyperliquid/exchange.py)
So I don't support OrderType.MARKET in the connector.  If you guys feel the need to support OrderType.MARKET, I can do it the same way with "slippage_price" method.

fixed

this issue where the bot suddenly got a number of order filled yet on exchange it does not record anything about it.

this issue where the bot suddenly got a number of order filled yet on exchange it does not record anything about it.

Still ongoing issue on commit ed0b8a2
Steps:

Clone and install PR6675
Start the client and connect hyperliquid_perpetual_testnet
Create perpetual MM using hyperliquid_perpetual_testnet and tight spreads (0.1 0.1) to get orders filled
Ran the bot longterm and review fills orders behavior

Actual:
Review history --verbose has lot more orders than on the exchange
logs_perphyper1.log
1205.zip
(showing ~255 trades intead of 23)
2023-12-05 13:31:40,129 - 2127981 - hummingbot.connector.client_order_tracker - WARNING - The order fill updates did not arrive on time for 0x48424f54534158554436306263333366. The complete update will be processed with incomplete information.
2023-12-05 13:31:40,130 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order 0x48424f54534158554436306263333366 (1.00 AVAX @ 21.986999999999998323119143606163561344146728515625 USD) has been completely filled. [clock=2023-12-05 13:31:40+00:00]
2023-12-05 13:31:40,189 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "base_asset": "AVAX", "quote_asset": "USD", "base_asset_amount": "0", "quote_asset_amount": "0", "order_type": "OrderType.LIMIT", "exchange_order_id":<PHONE_NUMBER>, "event_name": "SellOrderCompletedEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:31:40,190 - 2127981 - hummingbot.connector.client_order_tracker - INFO - SELL order 0x48424f54534158554436306263333366 completely filled.
2023-12-05 13:32:00,046 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 1.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,047 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,111 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "21.987", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.000439"}]}, "exchange_trade_id": "0xc2bc6c3bc2f09729fed404085db83b010b003781ef95db812fa1dbc92f28c545", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,111 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 2.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,112 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,130 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "21.943", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.000438"}]}, "exchange_trade_id": "0xff060c831af7185ff7e504085db537010f0018670ec4572c1f2eeb32f84e7a9f", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,131 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 3.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,132 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,150 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.023", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.00044"}]}, "exchange_trade_id": "0xda7f46f582e6d3d7187a04085db3290106009b72a31cc52831e77c85a83156a0", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,151 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 4.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,152 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,205 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.067", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.000441"}]}, "exchange_trade_id": "0xfa6a964ac650c3c6a79104085db0b601050040b7ce48eeb3ae04238ae7847e7a", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,206 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 5.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,206 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,226 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.068", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.000441"}]}, "exchange_trade_id": "0xa48d7881473b7c8a055404085dae7a010b00c8f78fd3dff15b9bc2581bbf6b23", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,226 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 6.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,227 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,244 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.032", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.00044"}]}, "exchange_trade_id": "0x24308eb67d365d2dab3f04085dacc701100026514e098bfadcf366c312cf1233", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,245 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 7.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,245 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,331 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.046", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "0.005511"}]}, "exchange_trade_id": "0x6f284234bde1a9219b9904085daa38010f0075c3e8d9927a666b1e49fd6fcc19", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,332 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 8.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,333 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,376 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.083", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.000441"}]}, "exchange_trade_id": "0x9bbb56883cee5a592f6c04085da87b010c00ce835c2bf0480e17ffdf7a04f1de", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,377 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 9.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,377 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,444 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.091", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "0.005522"}]}, "exchange_trade_id": "0x110922da1732c389cb2704085da541010e00e74e54545621ef570f733f8d754c", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-05 13:32:00,445 - 2127981 - hummingbot.connector.client_order_tracker - INFO - The SELL order 0x48424f54534158554436306263333366 amounting to 10.0/1.00 AVAX has been filled.
2023-12-05 13:32:00,445 - 2127981 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Maker sell order of 1.0 AVAX filled. [clock=2023-12-05 13:32:00+00:00]
2023-12-05 13:32:00,529 - 2127981 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x48424f54534158554436306263333366", "trading_pair": "AVAX-USD", "trade_type": "TradeType.SELL", "order_type": "OrderType.LIMIT", "price": "22.047", "amount": "1.0", "trade_fee": {"percent": "0", "percent_token": "USD", "flat_fees": [{"token": "USD", "amount": "-0.00044"}]}, "exchange_trade_id": "0xec25a398743e6e38391e04085d992d01100044c6eb20335867302ece70cba1c2", "exchange_order_id":<PHONE_NUMBER>, "leverage": 3, "position": "CLOSE", "event_name": "OrderFilledEvent", "event_source": "hyperliquid_perpetual_testnet"}

upd: Client increased trades to 815 in 30 minutes, exchange showing 32
2hypa.zip

Test commit ebec3367a02... on cloud server

This is fixed ✅

this issue where the bot suddenly got a number of order filled yet on exchange it does not record anything about it.

Created multi level orders

Connector tries to create 3 orders each side but only displays 1 level
Every refresh cycle, the rest of the orders are stuck on exchange

These orders are not recognized by the connector when stop then start command ❌
When a filled order event:

Successfully open position however the opposite side was not cancelled and stuck on connector

FIlled orders are not recorded on the client nor CSV file created ❌

There are instances of error fetching status update for active orders:

2023-12-06 03:33:20,493 - 2915206 - hummingbot.connector.client_order_tracker - INFO - Created LIMIT BUY order 0x48424f54424158554436306263663033 for 0.90 to OPEN a AVAX-USD position.
2023-12-06 03:33:20,508 - 2915206 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "type": "OrderType.LIMIT", "trading_pair": "AVAX-USD", "amount": "0.90", "price": "25.495999999999998664179656771011650562286376953125", "order_id": "0x48424f54424158554436306263663033", "creation_timestamp":<PHONE_NUMBER>.0, "exchange_order_id": "2624386596", "leverage": 3, "position": "OPEN", "event_name": "BuyOrderCreatedEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-06 03:33:20,509 - 2915206 - hummingbot.connector.client_order_tracker - INFO - Created LIMIT SELL order 0x48424f54534158554436306263663033 for 0.90 to OPEN a AVAX-USD position.
2023-12-06 03:33:20,521 - 2915206 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "type": "OrderType.LIMIT", "trading_pair": "AVAX-USD", "amount": "0.90", "price": "27.07300000000000039790393202565610408782958984375", "order_id": "0x48424f54534158554436306263663033", "creation_timestamp":<PHONE_NUMBER>.0, "exchange_order_id": "2624386599", "leverage": 3, "position": "OPEN", "event_name": "SellOrderCreatedEvent", "event_source": "hyperliquid_perpetual_testnet"}
2023-12-06 03:34:00,081 - 2915206 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Error fetching status update for the active order 0x48424f54424158554436306263663033: Error executing request POST https://api.hyperliquid-testnet.xyz/info. HTTP status is 422. Error: Failed to deserialize the JSON body into the target type.
2023-12-06 03:34:00,224 - 2915206 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Error fetching status update for the active order 0x48424f54534158554436306263663033: Error executing request POST https://api.hyperliquid-testnet.xyz/info. HTTP status is 422. Error: Failed to deserialize the JSON body into the target type.

There are instances of RuntimeError: WS is not connected
2023-12-06 03:32:27,805 - 2915206 - hummingbot.core.utils.async_utils - ERROR - Unhandled error in background task: WS is not connected.
Traceback (most recent call last):
  File "/home/ralph/github/hummingbot/6675/hummingbot/core/utils/async_utils.py", line 9, in safe_wrapper
    return await c
  File "/home/ralph/github/hummingbot/6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_user_stream_data_source.py", line 123, in _ping_thread
    await websocket_assistant.send(ping_request)
  File "/home/ralph/github/hummingbot/6675/hummingbot/core/web_assistant/ws_assistant.py", line 56, in send
    await self._connection.send(request)
  File "/home/ralph/github/hummingbot/6675/hummingbot/core/web_assistant/connections/ws_connection.py", line 51, in send
    self._ensure_connected()
  File "/home/ralph/github/hummingbot/6675/hummingbot/core/web_assistant/connections/ws_connection.py", line 74, in _ensure_connected
    raise RuntimeError("WS is not connected.")
RuntimeError: WS is not connected.

Most of the time it happened when orders created:

2023-12-06 03:32:27,805
2023-12-06 03:43:46,573
2023-12-06 03:43:53,746

Steps to reproduce:

Setup hyperliquid on testnet
Setup multi level orders on perp-mm
Observe order create, fetch and cancellation
Observe filled order event

logs_perp-hyperliquid1.log

The above issues have been fixed.

Test latest commit a46569e042d5872be7da69ecba011c17629e6b2a
Setup mainnet wallet, connected successfully
Initially setup using v1 strategy to check connector behavior when submit orders2023-12-07 12:53:02,035 - 8093 - hummingbot.client.hummingbot_application - INFO - start command initiated.
2023-12-07 12:53:02,452 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - INFO - Network status has changed to NetworkStatus.CONNECTED. Starting networking...
2023-12-07 12:53:02,786 - 8093 - hummingbot.core.data_type.order_book_tracker - INFO - Initialized order book for LOOM-USD. 1/1 completed.
2023-12-07 12:53:02,838 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_api_order_book_data_source.HyperliquidPerpetualAPIOrderBookDataSource - INFO - Subscribed to public order book, trade channels...
2023-12-07 12:53:02,839 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_user_stream_data_source.HyperliquidPerpetualUserStreamDataSource - INFO - Subscribed to private order and trades changes channels...
2023-12-07 12:53:03,315 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - NETWORK - Error setting leverage 3 for LOOM-USD: Unable to set leverage
2023-12-07 12:53:08,146 - 8093 - hummingbot.core.rate_oracle.rate_oracle - INFO - Network status has changed to NetworkStatus.CONNECTED. Starting networking...
2023-12-07 12:53:12,009 - 8093 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - Changing position mode to ONEWAY succeeded.
2023-12-07 12:53:12,453 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - NETWORK - Error setting leverage 3 for LOOM-USD: Unable to set leverage
2023-12-07 12:53:13,004 - 8093 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (LOOM-USD) Creating 1 LIMIT bid orders at (Size, Price): ['1E+2 LOOM, 0.114979999999999998872013407 USD'] to OPEN position.
2023-12-07 12:53:13,005 - 8093 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (LOOM-USD) Creating 1  LIMIT ask orders at (Size, Price): ['1E+2 LOOM, 0.117309999999999997610800051 USD'] to OPEN position.
2023-12-07 12:53:14,020 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - NETWORK - Error submitting buy LIMIT order to Hyperliquid_perpetual for 100 LOOM-USD 0.1149799999999999988720134069808409549295902252197265625.
Traceback (most recent call last):
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/exchange_py_base.py", line 452, in _create_order
    await self._place_order_and_process_update(order=order, **kwargs,)
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/exchange_py_base.py", line 469, in _place_order_and_process_update
    exchange_order_id, update_timestamp = await self._place_order(
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 382, in _place_order
    o_order_result = order_result['response']["data"]["statuses"][0]
TypeError: string indices must be integers
2023-12-07 12:53:14,024 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Failed to submit BUY order to Hyperliquid_perpetual. Check API key and network connection.
2023-12-07 12:53:14,025 - 8093 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x56650438849642e1b88beca20caa1380", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-07 12:53:14,033 - 8093 - hummingbot.connector.client_order_tracker - INFO - Order 0x56650438849642e1b88beca20caa1380 has failed. Order Update: OrderUpdate(trading_pair='LOOM-USD', update_timestamp=1701924794.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x56650438849642e1b88beca20caa1380', exchange_order_id=None, misc_updates=None)
2023-12-07 12:53:14,461 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - NETWORK - Error submitting sell LIMIT order to Hyperliquid_perpetual for 100 LOOM-USD 0.1173099999999999976108000510066631250083446502685546875.
Traceback (most recent call last):
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/exchange_py_base.py", line 452, in _create_order
    await self._place_order_and_process_update(order=order, **kwargs,)
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/exchange_py_base.py", line 469, in _place_order_and_process_update
    exchange_order_id, update_timestamp = await self._place_order(
  File "/Users/rapcomia/github/hummingbot/6675/hummingbot/connector/derivative/hyperliquid_perpetual/hyperliquid_perpetual_derivative.py", line 382, in _place_order
    o_order_result = order_result['response']["data"]["statuses"][0]
TypeError: string indices must be integers
2023-12-07 12:53:14,461 - 8093 - hummingbot.connector.derivative.hyperliquid_perpetual.hyperliquid_perpetual_derivative.HyperliquidPerpetualDerivative - WARNING - Failed to submit SELL order to Hyperliquid_perpetual. Check API key and network connection.
2023-12-07 12:53:14,462 - 8093 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x8cc65a362f336568d4d2d26dcf83af48", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-07 12:53:14,465 - 8093 - hummingbot.connector.client_order_tracker - INFO - Order 0x8cc65a362f336568d4d2d26dcf83af48 has failed. Order Update: OrderUpdate(trading_pair='LOOM-USD', update_timestamp=1701924794.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x8cc65a362f336568d4d2d26dcf83af48', exchange_order_id=None, misc_updates=None)
2023-12-07 12:53:21,975 - 8093 - hummingbot.client.hummingbot_application - INFO - stop command initiated.

2023-12-07 12:53:03,315 - Getting error setting leverage.

Run tests on two different markets using 1 and 3 values still the same error
Tried to manual adjust on exchange and run strategy again, same results

2023-12-07 12:53:14,020 - 8093 - Getting TypeError: string indices must be integers when submit orders

Steps to reproduce:

Setup on Hyperliquid mainnet to Perpetual Market Making strategy
Start the strategy and observe behavior

logs_perp-hyperliquid1.log
logs_perp-hyperliquid2.log

In the official example, lines 206 and 228 of the web page, the Market Order is an aggressive Limit Order IoC. (https://github.com/hyperliquid-dex/hyperliquid-python-sdk/blob/master/hyperliquid/exchange.py)
So I don't support OrderType.MARKET in the connector. If guys feel the need to support OrderType.MARKET, I can do it the same way with "slippage_price" method.

Yes we can proceed with this approach 🙇🏼

Pending

Test on V2 strategies

fixed& add market order type

Ran tests on commit 0c167efb3bd6bc99c8 on cloud server

Market order worked ✅
Position retrieval ✅
Start with running on v1 strategies, perpetual market-making

When creating orders, got an error order failed causing these orders be not recognized by the connector. These orders are stuck on exchange and not successfully retrieved by the client ❌

# Buy order with price 26.524 on creating process
# Sell order with price 27.059 on creating process

2023-12-08 04:18:11,108 - 1569004 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Creating 1 LIMIT bid orders at (Size, Price): ['0.7 AVAX, 26.52400000000000090949470177 USD'] to OPEN position.
2023-12-08 04:18:11,109 - 1569004 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Creating 1  LIMIT ask orders at (Size, Price): ['0.7 AVAX, 27.05999999999999872102307563 USD'] to OPEN position.
2023-12-08 04:18:12,168 - 1569004 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x5d551523555e392ff42bef1bf276bfd3", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-08 04:18:12,169 - 1569004 - hummingbot.connector.client_order_tracker - INFO - Order 0x5d551523555e392ff42bef1bf276bfd3 has failed. Order Update: OrderUpdate(trading_pair='AVAX-USD', update_timestamp=1702009092.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x5d551523555e392ff42bef1bf276bfd3', exchange_order_id=None, misc_updates=None)
2023-12-08 04:18:12,171 - 1569004 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x6ed47367e8189dbdcd65a8e184921d86", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-08 04:18:12,171 - 1569004 - hummingbot.connector.client_order_tracker - INFO - Order 0x6ed47367e8189dbdcd65a8e184921d86 has failed. Order Update: OrderUpdate(trading_pair='AVAX-USD', update_timestamp=1702009092.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x6ed47367e8189dbdcd65a8e184921d86', exchange_order_id=None, misc_updates=None)

# Buy order with price 26.574 on creating process
# Sell order with price 27.109 on creating process

2023-12-08 04:19:12,153 - 1569004 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Creating 1 LIMIT bid orders at (Size, Price): ['0.7 AVAX, 26.57400000000000162003743753 USD'] to OPEN position.
2023-12-08 04:19:12,154 - 1569004 - hummingbot.strategy.perpetual_market_making.perpetual_market_making - INFO - (AVAX-USD) Creating 1  LIMIT ask orders at (Size, Price): ['0.7 AVAX, 27.10999999999999943156581139 USD'] to OPEN position.
2023-12-08 04:19:12,406 - 1569004 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x7f2aa130523d21993d7c5bf207ba1a3f", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-08 04:19:12,406 - 1569004 - hummingbot.connector.client_order_tracker - INFO - Order 0x7f2aa130523d21993d7c5bf207ba1a3f has failed. Order Update: OrderUpdate(trading_pair='AVAX-USD', update_timestamp=1702009152.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x7f2aa130523d21993d7c5bf207ba1a3f', exchange_order_id=None, misc_updates=None)
2023-12-08 04:19:12,409 - 1569004 - hummingbot.core.event.event_reporter - EVENT_LOG - {"timestamp":<PHONE_NUMBER>.0, "order_id": "0x8292b20d99263d258cdf8635a4e0d2aa", "order_type": "OrderType.LIMIT", "event_name": "MarketOrderFailureEvent", "event_source": "hyperliquid_perpetual"}
2023-12-08 04:19:12,410 - 1569004 - hummingbot.connector.client_order_tracker - INFO - Order 0x8292b20d99263d258cdf8635a4e0d2aa has failed. Order Update: OrderUpdate(trading_pair='AVAX-USD', update_timestamp=1702009152.0, new_state=<OrderState.FAILED: 6>, client_order_id='0x8292b20d99263d258cdf8635a4e0d2aa', exchange_order_id=None, misc_updates=None)

logs_perpmm1.log
logs_perpmm1a.log

Setup multiple order levels and run balance command

Balance does not indicate what percentage is allocated
On Status, the available balance is not updated like sample screenshot below on another connector

Pending

Running connector to v2 strateiges in progress

few instances of Error fetching status update for the active order, bot was able to recover.

fixed few instances of Error fetching status update for the active order

few instances of unsupported operand type(s) for -: 'decimal.Decimal' and 'NoneType'
The cause of this problem should be in this line, but I have no right to modify it
/home/hummingbot/hummingbot/core/data_type/in_fight_order.py:212

@yancong001 I'm going to review the PR now, I think that #6715 might solve the issue.
The thing is that we are marking the order as completed but we don't have the trade fills for some reason

Hi @yancong001 Please add documentation for the connector in our docs site - https://github.com/hummingbot/hummingbot-site. You can use any of the bronze connectors as a template. Thanks!

added (https://github.com/hummingbot/hummingbot-site/pull/260)


ZTA - user identity

At this point, the user_identity for GoogleIAP is only supported in cases where it doesn't need to be requested through Google's user api. In that case we continue using the email as the display name for now.

The next steps are to get the user_identity from Google's users api and improve the documentation

The next steps are to get the user_identity from Google's users api and improve the documentation

We can do that after we merge this one :)


AKSequencer track clear() doesn't remove final event

Working with AKSequencer with AKMIDICallbackInstrument, if you add a MIDI note event at the end of a (populated) AKSequencer track like:
seq.tracks[trackIndex].add(noteNumber: 1, velocity: 0, position: AKDuration(beats: seq.length.beats), duration: AKDuration(beats: 0.0))
and subsequently
seq.tracks[trackIndex].clear()
the track will clear as expected - except for the note(s) at the track's length location, shortening the track length will change the orphaned event's duration to a negative value.
the only way to remove the event(s) is to
seq.tracks[trackIndex].clearNote(1)
Example - I have two added notes (noteNumbers 0 and 1) at the last track length location.
after a 27 beat sequence is cleared and changed to a 22 beat sequence. - without .clearNote()
seq.debug:
...
22.000: Note:Ch:0 0 0 (0.000)
22.000: Note:Ch:0 1 0 (0.000)
27.000: Note:Ch:0 0 0 (-5.000)
27.000: Note:Ch:0 1 0 (-5.000)
The orphaned events can accumulate - clearing and creating a 12 beat sequence:
12.000: Note:Ch:0 0 0 (0.000)
12.000: Note:Ch:0 1 0 (0.000)
26.000: Note:Ch:0 0 0 (-14.000)
26.000: Note:Ch:0 1 0 (-14.000)
53.000: Note:Ch:0 0 0 (-41.000)
53.000: Note:Ch:0 1 0 (-41.000)
The reason for adding the note at the end of the sequence is for the callback instrument to notify a delegate to do some needed functions after the sequence plays.

All AudioKit does is delegate clear down to CoreMIDI as follows:
/// Clear all events from the track
open func clear() {
    clearMetaEvents()
    if let track = internalMusicTrack {
        if isNotEmpty {
            MusicTrackClear(track, 0, length)
        }
    }
}

If that doesn't work I'm not sure what else we can do since the rest is closed source.

Yea I'd need to see more code. There's a new sequencer coming soon anyway, so we'll look at this once we try to settle the dust that gets kicked up from the that.

I understand the closed source. just wanted to let you know clear() isn't clearing everything.
Here's the general setup of the sequence and generation function for the 'system track' - controls a scrolling line over the written music via a delegate.
`	@objc public func initializeQuiz() {
	if seq.tracks[quizTrackIndex].isNotEmpty { seq.tracks[quizTrackIndex].clear() }

	seq.addTimeSignatureEvent(timeSignature: AKTimeSignature(topValue: UInt8(timeSignature), bottomValue: .four))
	seq.setTempo(UserDefaults.standard.double(forKey: kDefaultsTempo))

	numberOfMeasures = UserDefaults.standard.integer(forKey: kDefaultsNumberOfMeasures)
	timeSignature = 2 + UserDefaults.standard.integer(forKey: kDefaultsTimeSignatureIndex)
	// sequence length (in beats) is 1 measure prep, length of quiz (meter * number of measures) + 1 beat runoff for late releases
	seq.setLength(AKDuration(beats: Double(timeSignature * (numberOfMeasures + 1)) + 1.0))

	generateClickTrack()
	generateSystemTrack()
}

func generateSystemTrack() {

	seq.tracks[systemTrackIndex].clear()
	seq.tracks[systemTrackIndex].clearNote(1)	// needed because final midi message at end with length of 0 doesn't get removed

	// sets the resolution of 'move line' messages(quantums) relative to the tempo : bpm 30 - 150 == resolution 96 - 16 (by 16s)
	let scrollRez = (16.0 * (7 - (currentTempo / 25.0).rounded()))
	let totalQuantums = (Double(timeSignature * (numberOfMeasures + 1)) * scrollRez) + 1.0

	for i in stride(from: 0.0, to: totalQuantums, by: 1.0) {
		seq.tracks[systemTrackIndex].add(noteNumber: 0, velocity: 0, position: AKDuration(beats: (i / scrollRez)), duration: AKDuration(beats: 0.0))
		// print("system track - beat: \(Int(floor(i / scrollRez))) quantum: \(Int((i.truncatingRemainder(dividingBy: scrollRez) * (96.0 / scrollRez))))")
	}

	seq.tracks[systemTrackIndex].add(noteNumber: 1, velocity: 0, position: AKDuration(beats: seq.length.beats), duration: AKDuration(beats: 0.0))

}

`

Since the new AKSequencer is out, I'm going to close this issue.


Can no longer connect to anyone after upgrade to Windows 10

Hi,
Are there any known issues with using SimpleWebRTC with windows 10? Talky works fine but my demo application and also the SimpleWebRTC demo no longer work.
It says connecting to peer but doesn't get past that and after a while shows connection failed.
In the chrome developer console i noticed that an error 'fileInput is not defined' shows up within latest.js

that's pretty odd... since 'fileInput' does not appear anywhere in http://simplewebrtc.com/latest.js
Will check windows 10 on monday but i suspect it's unrelated.


Fix linting issues in studio-next

Fix Linting issues

Is props going to be used in the future in the file?

cc @Shurtu-gal

Thanks for the reply @Shurtu-gal. I have opened up a PR to resolve the issue.


Refactored const libfuncs by extracting build_single_cell_const.

Stack:

#2455
#2505
#2520
#2501 ⬅

⚠ Part of a stack created by spr. Do not merge manually using the UI - doing so may have unexpected results.

This change is

crates/cairo-lang-sierra-to-casm/src/invocations/misc.rs line 40 at r4 (raw file):

pub fn build_single_cell_const(
    builder: CompiledInvocationBuilder<'_>,
    value: BigInt,

Suggestion:
value: &BigInt,

crates/cairo-lang-sierra-to-casm/src/invocations/misc.rs line 40 at r4 (raw file):
Previously, orizi wrote…
why? it is cloned anyway.

You clone it in the two call sites.
But I guess your solution is more flexable.


RIPPLE-79 Cordova Android platform 'App' service renamed 'CoreAndroid'.

In cordova-android 4.0.0, the App service has been renamed to CoreAndroid.
This change adds support for the CoreAndroid service - currently identical to the existing App bridge, but of course it may change going forwards (while App should remain unchanged, for backwards compatibility).

LGTM. :metal: Will merge.


Implementing features to pass unit/types/zset

Signed-off-by: Hanif Bin Ariffin<EMAIL_ADDRESS>

Merge fixes to SortedSet's length invariant and ZADD to skip parsing options when it encounters an integer (also check the comments about this being an optimization for other commands).


chore: release 1.1.0

:robot: I have created a release *beep* *boop*
1.1.0 (2019-06-05)
Features

support apiEndpoint overrides (#272) (2c42f20)

Release is at https://github.com/googleapis/nodejs-dns/releases/tag/v1.1.0

The release build has started, the log can be viewed here. :sunflower:

:egg: You hatched a release! The release build finished successfully! :purple_heart:


Issues with padding in language modeling problems.

Related to #1013
Default 0 padding does not take into account order of vocab. If  is not located at the 0th index of the .token vocab file, a random term will be "padding" sequences (whatever term exists at this location). Rather than require the user to generate the vocab in a specific order, it may be best to replace 0 padding with [token_encoder.PAD_ID]*pad_length in areas that padding occurs.

so the vocab file was not generated by t2t? if it was pad should always be 0.
if not it is probably best to have 0/1 as pad and eos -- too many places in the code make this assumption, so maybe infeasible to change it.

Correct - this works perfectly fine and would not be difficult to adapt to ensure pad and eos are 0/1 respectively.
However, this is not really mentioned anywhere in the documentation and results in strange decoding results if a custom vocab is generated that doesn't have the proper format. If it's left as is I think it should be stated explicitly in vocabulary specification mentioning that if the subword text encoder or character encoder is not used/the user chooses to generate their own  vocab,  and  should be the first and second term in the .token file respectively.

Thanks, let me try to either document or put asserts in the code to that
effect
On Fri, Oct 26, 2018, 11:56 AM Michael Mezher<EMAIL_ADDRESS>wrote:

Closed #1176 https://github.com/tensorflow/tensor2tensor/issues/1176.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/tensorflow/tensor2tensor/issues/1176#event-1929591700,
or mute the thread
https://github.com/notifications/unsubscribe-auth/ABFCFoJWjp7Dp8FzzGZrqDK3EhcfJfuhks5uo1rHgaJpZM4X8soC
.


Consul_z1/0 is not running after update

IAAS: vsphere-cpi
BOSH: latest version in centos 7
cf-release: latest version
stemcell: latest ubuntu
bosh dorector: latest ubuntu stemcell
Observing error below after fixing IP conflicts:
==============================================
Started updating job consul_z1
Started updating job consul_z1 > consul_z1/0 (4a91d405-8175-4535-b07b-5d3d18e42a5c) (canary). Failed: `consul_z1/0 (4a91d405-8175-4535-b07b-5d3d18e42a5c)' is not running after update. Review logs for failed jobs: consul_agent (00:11:28)
Error 400007: `consul_z1/0 (4a91d405-8175-4535-b07b-5d3d18e42a5c)' is not running after update. Review logs for failed jobs: consul_agent
Task 26 error
For a more detailed error report, run: bosh task 26 --debug
===============================================
I ssh into consul_z1 and found the following:
error during start: rpc error: failed to get conn: x509: certificate is valid for *.cfvmware.research.ge.com, not server.dc1.cf.internal
2016/04/13 14:06:22 [ERR] agent.client: Failed to decode response header: EOF
2016/04/13 14:06:22 [ERR] agent.client: Failed to decode response header: EOF
Certs were generated using certstrap as specified in the document.
Not sure what cf.internal is used for, other than internal routing.
Checked certs in jobs folder and they match what is specified in stub file.
I am not sure where else to look.
Any advice and assistance is appreciated.
Thanks!

Hi valenbb,
It looks like you are using a certificate that has been generated with a common name of *.cfvmware.research.ge.com, but you didn't update the manifest properties to reference the new domain. If you update properties.consul.agent.domain to be cfvmware.research.ge.com in the cf manifest, you should be good to go.
Alternatively, you could use this script to generate certificates with common name server.dc1.cf.internal.
Thanks!
George and @christianang

Thanks George and @christianang.
I decided to leave cf.internal intact in the manifest and generate certs specific to the server. This worked successfully.
Last week, I did figure out changing cf.internal to match my domain and that worked until another error appeared, so I decided to retry from a clean slate this week. Then i stumbled into the same error when using my domain:
error during start: rpc error: failed to get conn: x509: certificate is valid for *.cfvmware.research.ge.com, not server.dc1.cfvmware.research.ge.com
2016/04/13 14:06:22 [ERR] agent.client: Failed to decode response header: EOF
2016/04/13 14:06:22 [ERR] agent.client: Failed to decode response header: EOF
Just curious why this is not documented for vsphere? I do apologize if I missed it somewhere.

Hi valenbb,
We wanted to better understand your use case for changing the domain from server.dc1.cf.internal to cfvmware.research.ge.com, since this domain is only used for internal service discovery within Cloud Foundry. Is there something special about your installation that makes it desirable to customize the domain?
We are guessing that part of the confusion here is that the server.dc1.cf.internal domain is hardcoded in scripts/generate-consul-certs and is not mentioned in the docs. Would this situation have been clearer if that script took the domain as a parameter and was mentioned on this page?
Thanks!
George and @zankich

Hi George and @zankich,
You have hit the reason excellently:
"We are guessing that part of the confusion here is that the server.dc1.cf.internal domain is hardcoded in scripts/generate-consul-certs and is not mentioned in the docs."
I was thinking that domains would be our chosen domain. If mentioned in the docs, that this is hardcoded for internal working in CF, users like myself would not have to generate consul certs.
I think the suggestion to take the domain as a parameter and mentioned would make things much better. Or, could this section be automated so we don't have to touch it during cf-stub creation?
What I find interesting is that my colleague uses the openstack-cpi and never encountered this situation. It is possible that his version of CF is from back in February of 2016 and each cpi work differently.
Just would like you to know that I am enjoying the learning process and am not upset. This is great work, and if I can bring things light, I am happy.

Hi valenbb,
Thanks so much for the feedback. We have captured this plan in this upcoming story:
https://www.pivotaltracker.com/story/show/117638983
We believe that your colleague using the openstack-cpi did not run into this problem because older versions of consul-release had cf.internal hardcoded as it's internal domain.
Thanks,
George and @zankich


There's No Example of data-binding for Popup.

I want to update what's displaying inside a popup from my Mainpage viewmodel every few seconds. (e.g. every few seconds a new data is calculated in the models (business logic of my application) and this should be get updated on the popup. how can I achieve this?
I'm using "communityToolkitMVVM".

Document Details
⚠ Do not edit this section. It is required for learn.microsoft.com ➟ GitHub issue linking.

ID: c6126a74-78aa-2c4f-ce92-2cda527ca9fd
Version Independent ID: c6126a74-78aa-2c4f-ce92-2cda527ca9fd
Content: Popup - .NET MAUI Community Toolkit - .NET Community Toolkit
Content Source: docs/maui/views/popup.md
Product: dotnet-communitytoolkit
GitHub Login: @bijington
Microsoft Alias: bramin

As a note to my future self I have started work on a sample at https://github.com/bijington/popups/tree/main in the hope that we can either build better documentation, more functionality into the toolkit, or both.


New center and zoom options

Resume
I plan to change the way in which Pikaso creates the container, to give the possibility to center the image anything natively with an algorithm instead of using a css trick to center the background image to the stage, and additionally the function of zoomIn and zoomOut
Example of implementation to center any shape in stage for example in file Background.ts:125
if (options.size === 'resize') {
  this.board.centerAndFitShape(this.image.node)
}

/**
 * Centers the stage and fit especific shape
 * @param {Konva.Shape} shape
 * @param {number} padding = 2
 * @example
 * ```ts
 * editor.board.centerAndFitShape(Konva.Shape)
 * ```
 */
centerAndFitShape(shape, padding = 2) {
  padding = padding || 0

  const rawShapeRect = shape.getClientRect({ relativeTo: this.stage }), // Note: getClientRect gives size based on scaling - we want unscaled size so use 'relativeTo: stage' param to ensure consistent measurements.

    paddedShapeRect = {
      x: rawShapeRect.x - padding,
      y: rawShapeRect.y - padding,
      width: rawShapeRect.width + (2 * padding),
      height: rawShapeRect.height + (2 * padding)
    },

    viewRect = {
      width: Math.min(this.stage.width(), this.container.offsetWidth),
      height: Math.min(this.stage.height(), this.container.offsetHeight)
    },

    widthRatio = viewRect.width / paddedShapeRect.width, heightRatio = viewRect.height / paddedShapeRect.height,

    scale = widthRatio > heightRatio ? heightRatio : widthRatio,

    centeringAjustment = {
      x: (viewRect.width - paddedShapeRect.width * scale) / 2,
      y: (viewRect.height - paddedShapeRect.height * scale) / 2
    },

    finalPosition = {
      x: centeringAjustment.x + (-paddedShapeRect.x * scale),
      y: centeringAjustment.y + (-paddedShapeRect.y * scale)
    }

  this.stage.to({
    x: finalPosition.x,
    y: finalPosition.y,
    scaleX: scale,
    scaleY: scale,
    duration: 0.1
  })
}

/**
 * Zoom the stage
 * @param {number} scaleBy
 * @see zoomIn = 1.2, zoomOut = 0.8
 */
zoom (scaleBy) {
  const oldScale = this.stage.scaleX()

  // Calculate the center of the stage
  const pos = {
    x: this.stage.width() / 2,
    y: this.stage.height() / 2
  }

  // Calculate the position of the mouse relative to the stage
  const mousePointTo = {
    x: pos.x / oldScale - this.stage.x() / oldScale,
    y: pos.y / oldScale - this.stage.y() / oldScale
  }

  // Calculate the new scale of the stage
  const newScale = Math.max(0.05, oldScale * scaleBy)

  // Calculate the new position of the stage to keep it centered
  const newPos = {
    x: -(mousePointTo.x - pos.x / newScale) * newScale,
    y: -(mousePointTo.y - pos.y / newScale) * newScale
  }

  // Update the stage with the new position and scale
  this.stage.to({
    x: newPos.x,
    y: newPos.y,
    scaleX: newScale,
    scaleY: newScale,
    duration: 0.1
  })
}

I am going to work on an algorithm that serves to pan and zoom with the mouse to integrate it if these recommendations are approved

Hey @gniuslab
It is fantastic that you are proposing adding Zooming to the core project, which is also being requested here: https://github.com/pikasojs/pikaso/issues/28
However, I am having difficulty understanding what the real use case is for centerAndFitShape.
Let's talk about that in more detail.

@Hi @raminious , the use case of the centerAndFitShape function is quite trivial to make things uncenterable if they go off-canvas, you can see how it works in detail here...
https://codepen.io/JEE42/pen/ExEgeMX
Do this exercise, move one of the red squares out of your vision and click on Fit rect group to stage

@gniuslab Is there any progress on the zooming feature?

Yes, I can implement it, but I don't know the process of how to do it, in your main branch...

@raminious This only solves the scaling problem, but does not solve the box selection x y offset problem.Sorry, my English is not good

This is my code
`stage.on('wheel', (e) => {
e.evt.preventDefault();
let oldScale = stage.scaleX();
let scaleBy=1.1
let mousePointTo = {
x: stage.getPointerPosition().x / oldScale - stage.x() / oldScale,
y: stage.getPointerPosition().y / oldScale - stage.y() / oldScale,
};
let newScale = e.evt.deltaY > 0 ? oldScale / scaleBy : oldScale * scaleBy ;
stage.scale({ x: newScale, y: newScale });

let newPos = {
  x: -(mousePointTo.x - stage.getPointerPosition().x / newScale) * newScale,
  y: -(mousePointTo.y - stage.getPointerPosition().y / newScale) * newScale,
};

stage.position(newPos);
stage.batchDraw();

});`

@ProjetNice Use getRelativePointerPosition

I still can't do this effect, I would like to add this feature and add it in the documentation, which is very helpful for beginners

I solved that problem, and this is my demo, using the vue framework
<template>
  <button @click="addPolygon">addPolygon</button>
  <button @click="changeDrag">changeDrag</button>

</template>


Adding a function signature near the decoded parameters table

I strongly feel there should be a function signature near the parameters in the decoded parameters table in both transactions and traces.
Motivation:

The function signature acts as a quick summary of the transaction action and gives extra context without even reading any input parameters
Currently, the function name is separate from the parameters table, so if you wanted to see the name of the function, you have to find it above/outside the table
There may be a handful of parameters, or parameters that are very large, making it an exercise to scroll and read all the parameter names and types from the table to figure out which function is called or which parameters are required to repeat the operation
Easy access to the function signature so developers can test the call in some other context
The function signature occurs at the bottom of the transaction page, so the user has to scroll already to see it, so adding the function signature doesn't block other content

Possible example we can talk about from #1850:

This version uses compact types like Etherscan does (example), which limits the usefulness of the function signature but keeps the size limited.
Showing full types like Blockscout does (example) is more useful, but might take up more space if the function is complex:

adding and updating my considerations from the original issue:

possibly making the input section just after the transaction action section.
I think part of my "dislikeness" of the above proposal is because the sig is glued to the input. I think separating it into 2 boxes (+working on improving the sig itself) would make it look better.
would it be possible to color the signature using the same syntax highlighter of the editor we have in the contract page?

anyway, agree on improving it (as long as we find a way to make it look beautiful on screen :)

I wonder how much space the input data section take up as a percentage of page height. If it's too high, maybe moving it earlier would force users to scroll too much to see other important transaction information.
I think we definitely could color the signature, though I would opt to use our own parameter coloring, like on the Read Contract page, since it would be much faster than the SyntaxHighlighter.
I'll try moving the signature outside the table and experiment with different ways to present it (no box, different color box, etc.)


NItem#setString not saving value at 1.20.3/1.20.4 (1_20_R3)

When using setString, and then trying to get it value isn't getting returned, and null returns instead. (Paper 1.20.4 latest release)
Example code:
NItem.of(itemStack).setString("id", "example"); // Sets "id" to example into itemStack
String value = NItem.of(itemStack).getString("id"); // returns null

I did a small investigation and found out value returned from NMS ItemStack#getOrCreateTag() isn't containing the tag set, and also tested only getting the tag to ensure a new one isn't getting created and can confirm tag existed.

Because you are using the API in a wrong way.
NItem nItem = NItem.of(itemStack).setString("id", "example"); // Sets "id" to example into itemStack
String value = nItem.getString("id"); // returns null

// save if necessary
nItem.save();

Yeah, looks like I missed the save part. Appreciate you for making this NBT API public.
Only a suggestion, might be good to put this #save() part at README examples.

Done! ty


Support middleman v4

At the moment middleman-pry doesn't support new middleman versions (4 and above).
Is it possible to add support ?

Yes, an update is ready to go, pending the release of middleman/middleman#1473. You can try it via:
gem 'middleman', github: 'AndrewKvalheim/middleman', branch: 'overridable-console-v4'
gem 'middleman-pry', github: 'AndrewKvalheim/middleman-pry', branch: 'middleman-v4'

but I don't plan on maintaining those branches.

If there are regressions on the extension API side in v4, please log them as bugs. We don't want to break existing extensions.

No regression; this hasn't been using the extension API at all until a week ago.


Protecting users from making a 'non standard passphrase'

Currently when making a new address, a 12 word passphrase is shown. This makes the user believe that the standard accepted format is 12 words separated by spaces. However any string can be used to generate an address.
I think it might be better to add a checkbox, something like [ ] allow custom passphrase, and only if that is checked does it allow a non 12 word string. This helps with awareness of how the passphrases work, and also helps in case of typos. Right now if one of the 12 words contains a typo, a new address is generated, containing obviously 0 ark. This could potentially scare non technical adopters.
I also propose to add a text popup when the custom passphrase checkbox is checked, containing a short explanation on the standard generated 12 word passphrase format, and why a new address is generated when a typo is in the passphrase
Regards
Charles

As I see, you actually cant even put an custom passphrase in the desktop wallet. So this one here means to implement custom passphrase feature first and solving this with the mentioned design decision.
Problem would be the actual verifiying step (word 3, 6, 9) which indeed needs another verifying dialog for custom passphrases.
@fix is this feature wanted?

@fileninja In fact it is currently possible to use a custom passphrase, just enter the password you want in Import Account.. Maybe include a message indicating this possibility, but I think it is rather insecure

@fileninja yes use import account if you have a custom passphrase.

this is fixed in upcoming version thanks to https://github.com/ArkEcosystem/ark-desktop/pull/116
If you want to bypass this bip39, feel free to use "import account".

Closing it. @fileninja and @AbeIgnocious feel free to reopen it if you feel i miss a point


datepicker focus event issue

When I have focus on md2-datepicker openOnFocus="true" datepicker open as well but after open datepicker doesn't work like. date not select, not hide on cancel and ok button and does not hide Esc key press. and not any error display on console.
<div class="col-md-6 margin-top-20 date-of-birth-edituser">
                <md2-datepicker formControlName="dob" type="date"
                                placeholder="Date of Birth"
                                format="DD/MM/YYYY"
                                (change)="handleChange($event)" openOnFocus="true" class="birthdate-datepicker">
                </md2-datepicker>
            </div>

@dharmeshpipariya please help me on it.

Thanks @dharmeshpipariya


Mapping of recent data

Description
As a developer, I want to load the latest PDMR data to the PDX Finder.
Acceptance criteria

[ ] mapping of unmapped entities - PDMR, DFCI
[ ] run ETL for validation

@zperova inform when mappings are done


lparams when using adapters

I have a recycler view adapter, I am creating the item views with anko.
I want the item views to match the width of the container but I am unable to set the proper lparams for them.
Previously when inflating views from XML
LayoutInflater.from(parent.context).inflate(R.layout.test, parentView, false)
The root element inside R.layout.test has the layout_width="match_parent"
Right now I am unsure how to properly create a view using anko that is based on parentView's width
The anko example repo relies on the fact that the layout parameter defaults to match_parent (it uses a ListView, I use a RecyclerView)

Add you item view to relativelayout with item view width matchparent

this is how I'm creating item views:
https://github.com/adelnizamutdinov/kasosalo/blob/master/app/src/main/kotlin/adeln/zasosalo/res/layout/message-item.kt#L25-L67
basically you'll need to create some container to get the access to lparams
or you could manually call setLayoutParams on any kind of view

Is there any solution for this? Because I'm stuck getting it to work with width = matchParent, and I'm not to excited about introducing a container around my view.

@nomisRev probably a little late, but ran into the same issue, and this is what it's working for me:
https://github.com/antoniolg/Bandhook-Kotlin/blob/888d01a52270097492443202f700ed751326ad46/app/src/main/java/com/antonioleiva/bandhookkotlin/ui/adapter/TracksAdapter.kt#L53-L53
Basically, using an AnkoContext of the proper parent, and doing it inside the ViewGroup, instead of doing it at the end:
        override fun createView(ui: AnkoContext<RecyclerView>) = with(ui) {

            linearLayout {

                lparams(width = matchParent)
                padding = dip(16)

                ...
            }

        }

Not sure if this is the best way, just been playing with Anko for a few hours.


Added router to support built-in PHP web server

I was surprised when I saw that there is no way to run grav on the built-in server, which is ideal for development, 'cos grav doesn't need a database, etc. So I'm a little researched this issue and found a solution.
Used for the past several months for me, no any problems noticed, everything works as well.
How to run:
php -S localhost:8000 router.php

Related issues:
https://github.com/getgrav/grav-plugin-admin/issues/2
https://github.com/getgrav/grav-plugin-admin/issues/3

The problem is not that Grav does not run on the built-in webserver. It does, and it works fine.
But Admin, and some other plugins, do not because of https://github.com/getgrav/grav-plugin-admin/issues/3#issuecomment-128079164.
We therefore added a check inside Admin to prevent it to run on the built-in webserver.
BUT your solution makes it work, very nice! Just not sure if / how to handle this, as people do not always read the documentation before firing the built-in webserver, so we'll get those problems back when they run php -S localhost:8000. Maybe we could have this documented somewhere, we point out to this in the error we give, and we add a setting to unlock the built-in webserver in the admin config yaml.

Thanks for this PR @ftrrtf, i've made a few minor modifications to ensure this can't be run without the router.  Please check my PR: #1219
If it's all good for you we can merge that one.

@rhukster 👍

Closing this one.. please move discussions to #1219


Fixed some typos, and added a comma

This is my first edit to this repo. Made some tweaks, including adding a serial comma.

Documentation change only, minor edit so CLA not necessary.


FIRST_PROMPT_PREFIX problems with double-width symbols

Hi,
I just tried to use a powerline segment separator / symbol as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX to have the following result:
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="%{%F{blue}%}\uE0C2"

Adding space after the character does not fix the issue, as it does in other situations.
It seems that the way the theme print this prefix it does not support double width characters.
Maybe there should be a setting for doing this automatically?
Anyone has any more info on that?
Thanks,

Ok, I just got it working adding whitespaces in front of it.
POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="  %{%F{blue}%}\uE0C2


Environment TagHelper in Blazor?

What about this example? I thought Tag Helpers can't be used with Blazor?
https://docs.microsoft.com/en-us/aspnet/core/blazor/handle-errors?view=aspnetcore-3.1#code-try-1

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: ce1440e7-febc-3fbc-09d7-7f47b740fd3b
Version Independent ID: 31071595-7c71-b6f7-3856-74f78c5c7cdf
Content: Handle errors in ASP.NET Core Blazor apps
Content Source: aspnetcore/blazor/handle-errors.md
Product: aspnet-core
Technology: aspnetcore-blazor
GitHub Login: @guardrex
Microsoft Alias: riande

Hello @XmlmXmlmX ... The Environment Tag Helper is in a page (.cshtml), not in a Razor component (.razor).


Made some Readme edits and program prompt message edits

Program execution habits and main file syntax remains practically unchanged

Hi @Femshot.
Thank you for making these changes into your PR.
They have been merged.
Thank you.


Issue in Downloading one course

Hello,
I have been trying to download one course. It's all went well till it reached one chapter. Below is the error I got

Traceback (most recent call last):
File "udemy-dl.py", line 1453, in
main()
File "udemy-dl.py", line 1016, in main
udemy.chapter_download(chapter_number=options.chapter, path=options.output, quality=options.quality, skip_captions=options.skip_captions, unsafe=options.unsafe)
File "udemy-dl.py", line 664, in chapter_download
self.download_lectures_only(lecture_best=lecture_best, lecture_title=lecture_title, inner_index=inner_index, lectures_count=lectures_count, lecture_assets=lecture_assets, filepath=filepath, unsafe=unsafe)
File "udemy-dl.py", line 414, in download_lectures_only
self.download_assets(lecture_assets=lecture_assets, filepath=filepath, unsafe=unsafe)
File "udemy-dl.py", line 327, in download_assets
assets.download(filepath=filepath, unsafe=unsafe, quiet=True, callback=self.show_progress)
File "udemy-dl/udemy/_shared.py", line 126, in download
return self._write_external_links(filepath, unsafe)
File "udemy-dl/udemy/_shared.py", line 92, in _write_external_links
file_data = [i.strip().lower() for i in open(filename, encoding='utf-8') if i]
TypeError: 'encoding' is an invalid keyword argument for this function

Use python3

@syamkrishnap you should use python3 python2 will be removed completely in next version


Multiple controllers in a single namespace

Describe the bug
Multiple controllers don't work in a single namespace although the documentation suggests so.
Checks

[x] My actions-runner-controller version (v0.x.y) does support the feature
[x] I'm using an unreleased version of the controller I built from HEAD of the default branch

To Reproduce
Steps to reproduce the behavior:

Deploy multiple controllers into a single namespace each having unique fullnameOverride, authSecret.name, scope.watchNamespace
Deploy RunnerDeployments into each namespace to be watched
Runner deployments are working only a controller that has managed to acquire lease actions-runner-system/actions-runner-controller

Expected behavior
Each controller would handle their watch namespaces.
Environment (please complete the following information):

Controller Version: master head a98729b
Deployment Method: Helm
Helm Chart Version: master head a98729b with cert fix from #806

Additional context
Logs from working controller:
2021-09-11T11:13:27.590Z	INFO	actions-runner-controller	starting manager
I0911 11:13:27.591084       1 leaderelection.go:243] attempting to acquire leader lease actions-runner-system/actions-runner-controller...
2021-09-11T11:13:27.591Z	INFO	controller-runtime.webhook.webhooks	starting webhook server
2021-09-11T11:13:27.591Z	INFO	controller-runtime.certwatcher	Updated current TLS certificate
2021-09-11T11:13:27.591Z	INFO	controller-runtime.webhook	serving webhook server	{"host": "", "port": 9443}
2021-09-11T11:13:27.591Z	INFO	controller-runtime.certwatcher	Starting certificate watcher
2021-09-11T11:13:27.691Z	INFO	controller-runtime.manager	starting metrics server	{"path": "/metrics"}
I0911 11:13:43.168501       1 leaderelection.go:253] successfully acquired lease actions-runner-system/actions-runner-controller

Logs from non-working one:
I0911 11:13:28.736646       1 leaderelection.go:243] attempting to acquire leader lease actions-runner-system/actions-runner-controller...
2021-09-11T11:13:28.736Z	INFO	controller-runtime.webhook.webhooks	starting webhook server
2021-09-11T11:13:28.739Z	INFO	controller-runtime.certwatcher	Updated current TLS certificate
2021-09-11T11:13:28.739Z	INFO	controller-runtime.webhook	serving webhook server	{"host": "", "port": 9443}
2021-09-11T11:13:28.741Z	INFO	controller-runtime.certwatcher	Starting certificate watcher
2021-09-11T11:13:28.837Z	INFO	controller-runtime.manager	starting metrics server	{"path": "/metrics"}

Runner deployments:
NAMESPACE           NAME                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
gha-xxxxxxxx-test   ghe-xxxxxxxx-test-runner       1                                            26s
gha-xxxxxxxx        ghe-xxxxxxxx-runner            1         1         1            1           3s

Also webhooks are received in every controller:
2021-09-11T11:20:32.536Z	DEBUG	controller-runtime.webhook.webhooks	received request	{"webhook": "/validate-actions-summerwind-dev-v1alpha1-runner", "UID": "c06f6ddf-653e-4def-9cdf-aa0900a4ca4d", "kind": "actions.summerwind.dev/v1alpha1, Kind=Runner", "resource": {"group":"actions.summerwind.dev","version":"v1alpha1","resource":"runners"}}
2021-09-11T11:20:32.536Z	INFO	runner-resource	validate resource to be updated	{"name": "ghe-xxxxxxxx-test-runner-2hbcv-bn457"}
2021-09-11T11:20:32.536Z	DEBUG	controller-runtime.webhook.webhooks	wrote response	{"webhook": "/validate-actions-summerwind-dev-v1alpha1-runner", "code": 200, "reason": "", "UID": "c06f6ddf-653e-4def-9cdf-aa0900a4ca4d", "allowed": true}

After adding unique election leader ids (#806), I'm able to bring up controllers for three different github instances (public and two different enterprise) on a single namespace:
> kubectl get runnerdeployment --all-namespaces

NAMESPACE           NAME                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
gha-xxxxxxxx-test   ghe-xxxxxxxx-test-runner       1         1         1            1           6m30s
gha-xxxxxxxx        ghe-xxxxxxxx-runner            1         1         1            1           6m
gha-public          gh-public-runner               1         1         1            1           6m14s

@rofafor Thanks again for your efforts and the pull request! ☺


Handling Spark Source in a distributed manner

The Spark word count example currently runs without distributing the source tasks, but performing it on the driver.
I think this issue could be handled in a couple of ways:

Getting the iterator as it is being done currently, and handling them in the executor.
Setting up SparkEnv in the executors and running the given RDDs there.
Setting up a whole new SparkSession in the executors in local mode, and running separate RDDs there.

This task was making the PR too large, and I think it would be more neat to handle it as a separate issue.
Follows #711, #745

3 is the solution for the PR 777.


Implement design for low-level rest client

See https://github.com/Azure/azure-sdk-for-python/pull/15617


ENH: Add threaded Van Der Corput

Reference issue

Following @tupui's comment, this PR adds the possibility to parallelize Van Der Corput.
Additional information

I will try to benchmark this in the couple of days that follow

Here are the performance analysis against the old version (the full python version).
I have made a script which I will be putting at the end of this message. Basically, I run every functions 200 times and i rerun this loop 10 times :
timeit.repeat(
        f"{fun}({n})",
        number=nnumber,
        repeat=NREPEAT,
        setup=f"from __main__ import {fun}",
    )

 n=100
 n=500
 n=1000
 n=10_000
 n=100_000
 n=1_000_000

scipy
407.7µs
657.4µs
992.9µs
7.1ms
70.3ms
912.2ms

cython workers=0
8.7µs
50.3µs
109.9µs
1.6ms
19.8ms
240.3ms

cython workers=4
71.9µs
86.3µs
108.6µs
537.1µs
5.8ms
69.0ms

cython workers=8
125.9µs
126.7µs
141.7µs
397.5µs
3.5ms
40.5ms

[scipy] / [scipy]
1.0
1.0
1.0
1.0
1.0
1.0

[scipy] / [cython workers=0]
47.1
13.1
9.0
4.4
3.6
3.8

[scipy] / [cython workers=4]
5.7
7.6
9.1
13.2
12.1
13.2

[scipy] / [cython workers=8]
3.2
5.2
7.0
17.8
19.9
22.5

and here is a comparison of time depending on the number of workers :

Here is the code I used to generate those data

import timeit
import sys
import numpy as np
from scipy.stats._qmc import van_der_corput as old_van_der_corput
from van_der_corput import van_der_corput as new_van_der_corput
def new_van_der_corput_workers0(n):
new_van_der_corput(n, workers=0)
def new_van_der_corput_workers4(n):
new_van_der_corput(n, workers=4)
def new_van_der_corput_workers8(n):
new_van_der_corput(n, workers=8)
FUNS = [
("scipy", "old_van_der_corput"),
("cython workers=0", "new_van_der_corput_workers0"),
("cython workers=4", "new_van_der_corput_workers4"),
("cython workers=8", "new_van_der_corput_workers8"),
]
np.random.seed(0)
TEST_VALUES = [
(100,),
(500,),
(1000,),
(10_000,),
(100_000,),
(1_000_000,),
# (10_000_000,),
# (100_000_000,),
# (1_000_000_000,),
]
NREPEAT = 10
EFFORT = 200
def ct(s):
if s > 1:
return f"{s:4.1f}s"
for p, u in ((3, "ms"), (6, "µs")):
if s * 10 ** p > 1:
return f"{s10**p:4.1f}{u}"
return f"{s10**9:4.1f}ns"
method_funs_times = {}
method_funs_values = {}
funs_times = []
funs_values = []
for funname, fun in FUNS:
times = []
values = []
for i, (sample) in enumerate(TEST_VALUES):
(n,) = sample
# nnumber = int(EFFORT / (1e-4 * (n ** 2))) + 1
nnumber = EFFORT
times.append(
np.array(
timeit.repeat(
f"{fun}({n})",
number=nnumber,
repeat=NREPEAT,
setup=f"from main import {fun}",
)
).mean()
/ nnumber
)
value = 0.0
# enable to check value
# exec(f"value={fun}(SAMPLES[{i}], method={method!r})")
values.append(value)
print(f"| {funname} | " + " | ".join(f"{ct(t)}" for t in times) + " |")
funs_times.append(times)
funs_values.append(values)

for (times, (funname, _)) in zip(funs_times, FUNS):
print(
f"| [scipy] / [{funname}] | "
+ " | ".join(f"{b/a:.1f}" for a, b in zip(times, funs_times[0]))
+ " |"
)
print()
</details

Ah it just works for the unscrambled case?
# speedup 5.3
%timeit van_der_corput(100_000, 2, start_index=0, scramble=False, workers=6)
3.09 ms ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit van_der_corput(100_000, 2, start_index=0, scramble=False, workers=1)
16.3 ms ± 249 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

The benchmark seems broken, cf CI.


Added code to calculate direction of bus (CW/CCW). Only thing not imp…

…lemented is functionality whether bus is traveling left/right or up/down

Denied for wrong repository


v1.4.0 - fix destination

fix to add destination (if specified with --destination) to the parent output directory passed through to INPUT-parent_out_dir (i.e. for MultiQC)

This change is

Hello @jethror1! Thanks for opening this PR. We checked the lines you've touched for PEP 8 issues, and found:

In the file resources/home/dnanexus/run_workflows/run_workflows.py:

Line 538:80: E501 line too long (82 > 79 characters)


Make master 0.7.0.pre (codename "Marilyn")

Awesome progress on getting 0.6.0 -- and I see 0.6.5 is being by-passed. But I wonder, what's on our plate that's preventing us from going to 1.0 with Reel, as it seems pretty solid-state now, and needing supportive gems more so than revisions, improvements, etc. What do you think @tarcieri?

( After reviewing the issue tracker for Reel ... it seems if we cleared out the issue tracker of all/most issues, we could be ready for 1.0 ... especially http/2 support... other than that, Reel has been stable and relatively full featured for some time. )

I think the next release could be 1.0. Let's see what problems people have with this one.

Right on @tarcieri. Will reorganize labels accordingly


Hide editor context menu items

After installing extensions the editor's context menu may become really bloated and hard to reach.
Extensions authors usually give the option the remove their menu items, but it would be nice to be able to remove the default ones.
I usually not using  any of the Copy/Cut/Paste menus, and I certainly not using the Command Palette... item (when I use the command palette my hands are already on the keyboard).
(This issue is similar to #3874, but for the context menu)

Yes. There should be a way to hide items from context menu just like with status bar in 1.36.1.

#9285

I think a very good starting point would be being able to disable the default entries and then later implement a general interface for all of them (built-in + contributed by extensions).

+1 to reopening this. This kind of functionality is pretty logical to have.

+1 to reopening this. I want to arrange and add/remove context menu items in a way that makes sense for my workflow. And for tabs context menu items too.

Vivaldi browser has a pretty nice way of handling modifying of context menus and also create folders to restructure items. Like, I don't mind creating Angular bits from the context menu, but it would be fine if it was in a subfolder and not spamming 10 links in my context menu. Right now I have 34 items in the context menu and only really use 5 frequently. For me it just saves a lot of time typing things out for those that prefer that.
I'd expect something where I can create folders and separators, drag items into place and then saving it. Files and folders might be separate, perhaps even file type specific context menus. Of course resetting should be possible and adding or removing commands would be nice. But even already hiding specific items would be nice to have and make me more productive.

I also have the need to hide menus, built-in menus or other extended menus, users should be able to configure ignore not to display them.

need this

+1 for this, over time more and more items have been added which I never use and they're annoying,

Why is this issue closed, and why are "duplicates" of this issue closed? Context menu is simply too big.
I personally don't need much customization, but it should be clear if the context menu takes up more space than the screen height, something is not going well. It makes the context menu useless if I have to search for various functions.
@sbatten you closed issue #171906 as a duplicate of this one, but this one is already closed. Would you mind reopening this issue because it is clearly not solved.

There should be a function to hide all context menus brought by an extension, or more flexible, to disable or remove certain menus as needed, just like the software RightMenuMgr on Windows.

+1 🥴

While I also wants to remove Cut/Copy/Past and some other stuff from the right-click menu, the major issue was commands added by extensions.
The workaround I am using is : Delete the items added by extensions.
On mac:

Go to "~/.vscode/extensions" folder
cd to extension and open package.json file
Go to "contributes" -> "commands" and remove the entry which is not needed.

Thanks to @be5invis we have greasemonkey/tampermonkey for vscode: vscode-custom-css.

Use it at your own risk.

Here is my script to hide some context menu items:
/*
Hide context menu items in vscode.
`Reload Custom CSS and JS` to apply changes.

Tricks:
  Help > Toggle Developer Tools, run `setTimeout(() => { debugger }, 3000)`
  in Console, open the context menu within 3 seconds, wait for the debugger
  to pause, then inspect items in Elements.
*/

(function () {
  console.log("Hello from custom_context_menu.js~");

  const selectors = [
    '^"Go to"', // start with "Go to"
    '"Change All Occurrences"', // exact match
    '"Share"',
    '"Share" + "_"', // sperator after "Share"
    '"_":has( + "Share")', // separator before "Share"
    '"Command Palette..."',
    '"_":has( + "Command Palette...")',
    '"Layout Controls"',
  ];

  const css_selectors = selectors
    .join(",\n")
    .replaceAll(/([*^|])?"(.+?)"/g, '[aria-label\x241="\x242"]');
  console.log(css_selectors);

  function wait_for(root) {
    const selector = ".monaco-menu-container > .monaco-scrollable-element";
    new MutationObserver((mutations) => {
      for (let mutation of mutations) {
        for (let node of mutation.addedNodes) {
          if (node.matches?.(selector)) {
            // console.log(">>", node);
            modify(node);
          }
        }
      }
    }).observe(root, { subtree: true, childList: true });
  }

  // context menu in editor
  Element.prototype._attachShadow = Element.prototype.attachShadow;
  Element.prototype.attachShadow = function () {
    const shadow = this._attachShadow({ mode: "open" });
    wait_for(shadow);
    return shadow;
  };
  // context menu in other places
  wait_for(document);

  // get mouse position
  let mouse_y = 0;
  document.addEventListener("mouseup", (e) => {
    // bug: not working in titlebar
    if (e.button === 2) {
      mouse_y = e.clientY;
      // console.log("mouse_y", mouse_y);
    }
  });

  function modify(container) {
    for (let item of container.querySelectorAll(".action-item")) {
      const label = item.querySelector(".action-label");
      const aria_label = label?.getAttribute("aria-label") || "_";
      item.setAttribute("aria-label", aria_label);
    }

    const menu = container.parentNode;
    const style = document.createElement("style");
    menu.appendChild(style);
    style.innerText = `
    .monaco-menu-container {
      ${css_selectors},
      .visible.scrollbar.vertical, .shadow {
        display: none !important;
      }
    }
    `;

    // fix context menu position
    if (menu.matches(".monaco-submenu")) {
      return;
    }
    let menu_top = parseInt(menu.style.top);
    const menu_height = menu.clientHeight;
    // console.log("menu_top", menu_top, "menu_height", menu_height);
    const titlebar_height = 40;
    const window_height = window.innerHeight;
    if (menu_top < titlebar_height && menu_height < 90) {
      mouse_y = menu_top;
    } else {
      if (mouse_y < window_height / 2) {
        menu_top = mouse_y;
        if (menu_top + menu_height > window_height) {
          menu_top = window_height - menu_height;
        }
      } else {
        menu_top = mouse_y - menu_height;
        if (menu_top < titlebar_height) {
          menu_top = titlebar_height;
        }
      }
      menu.style.top = menu_top + "px";
    }
  }
})();

Work is under way to clean the context menu https://github.com/microsoft/vscode/issues/225411

@Long0x0 Thank you for your code snippet, I made an extension that used it and can partially make the contextmenu cleaner: https://github.com/BHznJNs/vscode-custom-contextmenu


Remove rule logging and related code

This is a continuation of @dkillick 's Pull Request #2697 . As well as removing rule logging config items and all rule logging functionality from fileformats/rules.py I also removed test_verbose_fileformat_rules_logging.py which now seems redundant, and a referece to rule logs in  pp.save_pairs_from_cube .
Closes #2655

My favourite kind of PR - one that makes the codebase smaller & tidier.
Thanks @LukeC92!

I've started writing up the "What's New" for this pull request but I am not sure what the best way is to represent all of these changes.


Using jquery-confirm as a standard Confirm dialog within script

I've tried a few approaches but I can't get $.confirm to work as a replacement for Confirm. The code I am looking to use it in is:
if (confirm('do this?') == true) { do some shizzle here };
Replacing the confirm with $.confirm it doesn't work as I'd expect. If I place it within a $("#MyDiv").Click({...}) it doesn't fire until the process ends.
I think I must have missed something obvious here, so any pointers gratefully received.

confirm is blocking, the execution of code is paused for it, unfortunately this cant be done via $.confirm
Have a look at #60 #79


Having "android.enableJetifier=false", the IDE says this library won't allow it

It says this:
Your project has set `android.useAndroidX=true`, but configuration `prodDebugRuntimeClasspath` still contains legacy support libraries, which may cause runtime issues.
This behavior will not be allowed in Android Gradle plugin 8.0.
Please use only AndroidX dependencies or set `android.enableJetifier=true` in the `gradle.properties` file to migrate your project to AndroidX (see https://developer.android.com/jetpack/androidx/migrate for more info).
The following legacy support libraries are detected:
prodDebugRuntimeClasspath -> me.drakeet.support:toastcompat:1.1.0 -> com.android.support:support-annotations:27.1.1

Please update the library so that we won't need this flag anymore.

Since this repo seems to be abandoned I was looking for an alternative.
There a currently two forks of this repo which moved to AndroidX:

https://github.com/PeterNguyen0210/ToastCompat
https://github.com/kakarrot/ToastCompat

I think one should be able to use the forks via JitPack without big changes.


feat: add cairo_run_program function that takes a Program as an arg

Add cairo_run_program function to cairo_runner.
Description
It seems convenient to have an API function that runs a cairo program from a Program struct, not a serialized JSON representation.  For instance, in my use-case the program comes from a compressed binary representation, not from a json, so don't want to copy the content of cairo_run function in my project for that.
If this is useful for someone barring me please consider this tiny PR :)

Also, clippy is complaining about taking a reference to program, which is now already a reference.

Also, clippy is complaining about taking a reference to program, which is now already a reference.

Should be fine now


XSSFColumn class implementation

XSSFColumn class
This PR adds an IColumn interface (similar to an IRow interface) and implements it in a XSSFColumn object. XSSFSheet is refactored to use that new object for all operations on columns in a very similar way to the way operations on rows are done: copying, cuting, pasting, shifting (with attention to formulas), formatting (both styles and width, hidennes, un-/grouping), adding new columns, removing cells by column - pretty much all things that are possible for XSSFRows are now possible with XSSFColumn with a more fluent and easy to use API, than the ColumnHelper had provided.
Major hurdle for this was the way columns are stored in the sheet.xml - CT_Col objects are not individual columns, but are "spans" of columns. If columns from 5 to 10 have the same style, width, hidden status and outline level - they will be represented as a CT_Col object with min field of 5 and max field of 10. So its one "span" of columns from 5 to 10, rather than 6 columns. This makes it hard to work with individual columns. For this reason this PR also changes the way CT_Col objects are parsed and stored in XSSFSheet - the "spans" are now broken down to individual CT_Col objects with min and max fields set to the same value, so that each CT_Col object represents a single column. This happens when a workbook is read from a file. When a workbook is written to a file, the CT_Col objects are again merged into "spans" of columns, depending on their style, width, hidden status and outline level, to match the way Excel stores columns in the sheet.xml.
This still had drawbacks - in case if all columns on the sheet had the same formatting all the way to the end of the sheet the last CT_Col object in the sheet.xml would have max field set to the maximum number of columns in Excel (16384). This would make the sheet.xml file very large and slow to parse. This happens even if only one column is actually used in the sheet. A compromise was made - if the last CT_Col object has max field set to the maximum number of columns in Excel - the max field is set to be a maximum of:

min field + 1 of the last CT_Col object that has max field set to the maximum number of
columns in Excel
column index of the cell with a maximum column index in the sheet

This is a compromise, because if that was done on a workbook where it was intended to have all columns formatted the same way - this information about the columns beyond this calculated max field will be lost. The good news is usually this is not intended and the max field of the last CT_Col object is set to the maximum number of columns in Excel is just a result of a hastily applied formatting to the whole sheet.
The PR comes with a lot of tests, that test the new XSSFColumn object and the refactored XSSFSheet object.

A failed test case on windows in the PR pipeline seem to be a case of a bit of a flaky test.

@artem-iron, can you please resolve the conflicts?

Hi, everyone.
I no longer have the access to the fork and the account the PR was made from, could you please close this PR?
I've made a #1329 where the conflicts are resolved.


Added Cyber Security resources

Added cyber sec resources. Merge them if you think it would be good.

Thanks @NAVHITS for the PR. :tada:
The reviewers will soon review and merge it. :slightly_smiling_face:


[Feature] Not compatible with new version of plus_plugins

Version information

Device: e.g. iPhone X
OS: e.g. iOS 14.7.1
Package Version: v9.0.2
Flutter Version: e.g. v2.5.0

Is your feature request related to a problem?

Describe the solution you'd like

Describe alternatives you've considered

Additional context

Because no versions of extended_image_library match >4.0.2 <5.0.0 and extended_image_library >=4.0.0 <4.0.2 depends on web ^0.3.0, extended_image_library >=4.0.0 <4.0.2-∞ or >4.0.2 <5.0.0
  requires web ^0.3.0.
And because extended_image_library 4.0.2 depends on web ^0.4.0 and device_info_plus >=10.0.1 depends on web >=0.5.0 <=0.6.0, device_info_plus >=10.0.1 is incompatible with
  extended_image_library ^4.0.0.
And because extended_image 8.2.0 depends on extended_image_library ^4.0.1 and no versions of extended_image match >8.2.0 <9.0.0, device_info_plus >=10.0.1 is incompatible with extended_image
  ^8.2.0.
And because wechat_assets_picker 9.0.2 depends on extended_image ^8.2.0 and no versions of wechat_assets_picker match >9.0.2 <10.0.0, device_info_plus >=10.0.1 is incompatible with
  wechat_assets_picker ^9.0.2.
So, because homing_pigeon depends on both wechat_assets_picker ^9.0.2 and device_info_plus ^10.0.1, version solving failed.

The extended_image_library has been updated with the version 4.0.3. Run flutter upgrade and you'll see successful resolves.


fix: fix 100% indexing progress

Description
This pull request fixes below issues:

Indexing progress should be 1, not 100.
100% progress log is missing.

Checklist

[x] The base branch of this PR is dev, rather than main
[x] The relevant docs, if any, have been updated or created

Screenshots
[ For visual changes, include screenshots. ]
Testing
[ For new or modified features, provide step-by-step testing instructions to validate the intended behavior of the change. ]

Good catch! Based on this logic in gui/src/components/loaders/IndexingProgressBar.tsx this seems like the correct choice.
  const fillPercentage = Math.min(
    100,
    Math.max(0, indexingState.progress * 100),
  );```