Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2.2.3 Release #155

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open

2.2.3 Release #155

wants to merge 13 commits into from

Conversation

Jaguaras
Copy link
Contributor

@Jaguaras Jaguaras commented Feb 4, 2025

Summary by CodeRabbit

  • Documentation
    • Consolidated configuration file guidance in the node management documentation, highlighting a single, clear reference to the latest configuration resource.
    • Enhanced Docker setup instructions with a new section on implementing a configuration file and updated command parameters.
    • Updated troubleshooting instructions by revising Cover Traffic node details and clarifying ticket value terminology.
    • Updated release notes for HOPRd Node and HOPR Admin UI, including new recommended versions and eligibility criteria for rewards.
    • Introduced new documents covering various topics, including Fast Sync, Cover Traffic economics, and SafeStaking.
    • Added comprehensive guides for setting up nodes across different platforms, including Docker and Dappnode, along with a troubleshooting guide for common issues.
    • Added new documents discussing anonymous routing, balancing cover traffic, and the economic model for Cover Traffic.
    • Introduced a glossary for key terms related to the HOPR network and updated various operational documents for clarity and usability.
    • Launched a new FAQ section addressing common user inquiries and operational aspects of the HOPR network.
    • Added a new document for migrating from Avado to Dappnode and detailed instructions for backing up and restoring node identities.
    • Introduced a new document detailing the heartbeat mechanism for assessing node availability.
    • Added new documentation for running multiple nodes and setting up port forwarding for HOPRd nodes.

Copy link

vercel bot commented Feb 4, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs-hoprnet-org ✅ Ready (Inspect) Visit Preview 💬 Add feedback Feb 25, 2025 10:01am

Copy link
Contributor

coderabbitai bot commented Feb 4, 2025

Warning

Rate limit exceeded

@Jaguaras has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 23 minutes and 41 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 4d97192 and 5d7b806.

📒 Files selected for processing (1)
  • static/js/custom.js (1 hunks)
📝 Walkthrough

Walkthrough

The pull request updates several documentation files related to HOPR nodes. The manage-node-strategies.md document consolidates repeated references to the default configuration file into a single note with a link to the latest version. The node-docker.md file introduces a new section on implementing a configuration file and updates the Docker command to include a new parameter for the configuration file path. Additionally, the troubleshooting.md document updates the list of Cover Traffic node addresses and revises terminology for a ticket parameter. The releases.md file updates the recommended versions for HOPRd Node and HOPR Admin UI, adds new versions, and adjusts eligibility criteria for Cover Traffic rewards based on node version. These changes improve the organization and clarity of configuration-related documentation.

Changes

File(s) Change Summary
versioned_docs/.../node/manage-node-strategies.md Consolidated configuration file information into a single note linking to the latest version of the default configuration file for all supported platforms. Updated heartbeat configuration settings.
versioned_docs/.../node/node-docker.md Added a new section titled "2.6 Implement configuration file" and updated the Docker command to include the parameter --configurationFilePath '/app/hoprd-db/hoprd-docker.cfg.yaml'.
versioned_docs/.../node/troubleshooting.md Updated the list of Cover Traffic nodes by replacing five old Ethereum addresses with five new ones and changed the terminology from "on_close_redeem_single_tickets_value_min" to "minimum_redeem_ticket_value".
versioned_docs/.../node/releases.md Updated recommended versions for HOPRd Node and HOPR Admin UI, added new versions, and adjusted eligibility criteria for Cover Traffic rewards based on node version.

Possibly related PRs

  • update config files #156: The changes in the main PR regarding updates to the aggregation_threshold in the configuration files are directly related to the modifications made in the retrieved PR, which also updates the same parameter in the same files.
  • RPC update #143: The changes in the main PR regarding the management of node strategies and configuration files are related to the modifications in the retrieved PR, which also focuses on the setup and configuration of multiple nodes using Docker and Docker Compose, specifically addressing port mappings and database locations.
  • More details about docker compose & prefix for provider #144: The changes in the main PR regarding updates to the manage-node-strategies.md documentation, specifically the configuration file details and strategy settings, are directly related to the modifications in the retrieved PR that also updates manage-node-strategies.md with similar enhancements for Docker and Docker Compose configurations.

Suggested reviewers

  • mjadach-iv
  • esterlus

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cdd5233 and 620ed28.

📒 Files selected for processing (3)
  • versioned_docs/version-v2.2.1/node/manage-node-strategies.md (1 hunks)
  • versioned_docs/version-v2.2.1/node/node-docker.md (2 hunks)
  • versioned_docs/version-v2.2.1/node/troubleshooting.md (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • versioned_docs/version-v2.2.1/node/manage-node-strategies.md
🔇 Additional comments (3)
versioned_docs/version-v2.2.1/node/node-docker.md (1)

44-45: Enhanced Docker Command with Configuration File Parameter

The Docker command now includes the new parameter
--configurationFilePath '/app/hoprd-db/hoprd-docker.cfg.yaml'
which clearly instructs users where to place the configuration file. Ensure that the provided path is valid on target systems and that any downstream documentation references are updated accordingly.

versioned_docs/version-v2.2.1/node/troubleshooting.md (2)

67-71: Updated Cover Traffic Nodes List

The list of Cover Traffic node addresses has been refreshed as intended. Please double-check these new addresses for accuracy and ensure consistency across the documentation.


121-121: Terminology Update for Neglected Tickets

The text now correctly refers to "minimum_redeem_ticket_value" instead of the previous term. It may be helpful to mention briefly that this change is for improved clarity, especially for users familiar with the old terminology.

Comment on lines +121 to +124
### 2.6 Implement configuration file

(**1**) Download the example file specificaly for Docker: [hoprd-docker.cfg.yaml](pathname:///files/hoprd-docker.cfg.yaml)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

New "Implement configuration file" Section – Clarity & Minor Typo

This new section provides useful step-by-step instructions for handling the Docker configuration file. A small note: the word “specificaly” on line 122 should be corrected to “specifically” for clarity. Additionally, consider verifying that the linked example file is accessible to users.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 620ed28 and f416062.

📒 Files selected for processing (1)
  • versioned_docs/version-v2.2.1/node/releases.md (1 hunks)
🔇 Additional comments (4)
versioned_docs/version-v2.2.1/node/releases.md (4)

1-4: Verify YAML Front Matter.

The YAML front matter is properly structured with the identifier and title. No issues found.


6-9: Descriptive Introduction Verified.

The introductory text clearly explains the purpose of the document. No changes needed.


17-17: Eligibility Note Consistency Check.

The note on eligible CT rewards correctly states that nodes running a version lower than 2.2.0 are not eligible. Make sure that this message is uniformly enforced across the documentation.


23-25: HOPR Admin UI Releases Update Verified.

The HOPR Admin UI section correctly updates the recommended version to 2.1.14 and includes the additional versions 2.1.12 and 2.1.10 with the appropriate release dates and changelog links. The implementation adheres to the release update guidelines.

Comment on lines 12 to 15
| **2.2.2 (Recommended)** | Dufour | 2025-02-10 | Yes | [Changelog](https://github.com/hoprnet/hoprnet/releases/tag/v2.2.2) |
| 2.2.1 | Dufour | 2025-01-29 | Yes | [Changelog](https://github.com/hoprnet/hoprnet/releases/tag/v2.2.1) |
| 2.2.0 | Dufour | 2025-01-15 | Yes | [Changelog](https://github.com/hoprnet/hoprnet/releases/tag/v2.2.0) |
| 2.1.5 | Dufour | 2024-11-13 | Yes | [Changelog](https://github.com/hoprnet/hoprnet/releases/tag/v2.1.5) |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Eligibility Criteria Inconsistency.

The table row for version 2.1.5 (line 15) still indicates "Yes" for CT rewards, which conflicts with the note on line 17 stating that nodes running a version lower than 2.2.0 are not eligible. For consistency with the updated eligibility criteria, please update the CT rewards eligibility for version 2.1.5 to "No".

@Jaguaras Jaguaras changed the title 2.2.2 Release 2.2.3 Release Feb 14, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 40

🔭 Outside diff range comments (1)
versioned_docs/version-v2.2.3/node/interaction-with-node.md (1)

462-463: ⚠️ Potential issue

Clarify ticket aggregation description.

The description for !AutoRedeeming strategy appears to be copied from !Aggregating strategy.

-Automatically aggregates tickets when the number of unredeemed tickets in a channel exceeds the specified threshold.
+Automatically redeems tickets based on configured thresholds and aggregation status.
🧹 Nitpick comments (97)
versioned_docs/version-v2.2.3/node/ac-migration-from-legacy.md (4)

6-7: Remove unused imports.

The Tabs and TabItem components are imported but not used in the document.

-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';

16-16: Fix grammar in the warning message.

The word "backup" is being used as a verb and should be written as two words: "back up".

-**Important:** Before following this guide to install DappnodeOS on your Avado device, make sure to first backup any data if you are running a validator or any other dApp. The migration process will otherwise wipe all existing data.
+**Important:** Before following this guide to install DappnodeOS on your Avado device, make sure to first back up any data if you are running a validator or any other dApp. The migration process will otherwise wipe all existing data.
🧰 Tools
🪛 LanguageTool

[grammar] ~16-~16: The word “backup” is a noun. The verb is spelled with a white space.
Context: ...n your Avado device, make sure to first backup any data if you are running a validator...

(NOUN_VERB_CONFUSION)


34-34: Fix step numbering.

There are two steps labeled as "(5)". This should be corrected to maintain proper sequence.

-(**5**) Then press "**Flash!**" and wait for the process to complete.
+(**6**) Then press "**Flash!**" and wait for the process to complete.

54-54: Consider security implications of publishing default credentials.

Publishing the default WiFi password in public documentation could pose a security risk. Consider either:

  1. Removing the password and providing it through a secure channel
  2. Adding a note strongly recommending users to change the default password immediately
versioned_docs/version-v2.2.3/node/run-a-node-overview.md (3)

10-19: Consider using a versioned image path.

The component descriptions and relationships are well-documented. However, consider using a versioned image path to ensure the correct diagram is displayed for each documentation version.

-![Running node overview](/img/node/HOPR-Node-Running-Overview.png)
+![Running node overview](/versioned_img/version-v2.2.3/node/HOPR-Node-Running-Overview.png)

24-31: Consider adding context for resource requirements.

While the system requirements are clear, consider adding:

  • Recommended (not just minimum) specifications for optimal performance
  • Network bandwidth requirements
  • Operating system compatibility information

32-34: Add a comma for better readability.

Add a comma to improve the sentence structure.

-If you have carefully read the requirements above and you meet them, please proceed with the onboarding process here: [https://hub.hoprnet.org](https://hub.hoprnet.org)
+If you have carefully read the requirements above, and you meet them, please proceed with the onboarding process here: [https://hub.hoprnet.org](https://hub.hoprnet.org)
🧰 Tools
🪛 LanguageTool

[uncategorized] ~34-~34: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...ve carefully read the requirements above and you meet them, please proceed with the ...

(COMMA_COMPOUND_SENTENCE)

versioned_docs/version-v2.2.3/token/token-bridging.md (2)

12-73: Consider adding estimated time and gas fee information.

The instructions are clear and well-structured. To set better user expectations, consider adding:

  • Estimated time for the bridging process
  • Approximate gas fees on Ethereum

74-137: Consider adding a note about gas price volatility.

The instructions clearly mention the two-step fee structure. Consider adding a note about checking current gas prices on Ethereum before initiating the bridge, as they can be highly volatile.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

84-84: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


88-88: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_sidebars/version-v2.2.3-sidebars.json (2)

61-64: Consider using semantic separators instead of HTML tags.

The <hr> tags are used for visual separation, but this approach might not be ideal for accessibility. Consider using CSS classes or different category types for section separation.

Replace the HTML separators with a more semantic approach:

-    {
-      "type": "html",
-      "value": "<hr>",
-      "defaultStyle": true
-    },
+    {
+      "type": "category",
+      "label": "---",
+      "className": "sidebar-separator",
+      "collapsible": false
+    },

Also applies to: 79-82, 97-100, 109-112


25-25: Standardize the collapsible behavior across sections.

There's inconsistent usage of "collapsible" and "collapsed" properties across different sections. Consider standardizing this behavior for a more consistent user experience.

Apply consistent collapsible behavior across all sections:

 {
   "type": "category",
   "label": "Token economics",
-  "collapsed": false,
+  "collapsible": true,
+  "collapsed": false,
   "items": [

Also applies to: 39-39, 50-51, 69-69, 87-87, 104-104, 117-117

versioned_docs/version-v2.2.3/developers/heartbeat.md (2)

12-14: Consider adding more details about health score implications.

The health score explanation is clear, but consider adding:

  1. What happens when a node's score reaches 0
  2. How health scores affect network routing decisions beyond path selection

Would you like me to propose additional content for these aspects?


24-28: Consider adding a plain text formula and example.

While the LaTeX formula is precise, consider:

  1. Adding a plain text version of the formula for compatibility
  2. Including a practical example showing the progression of backoff times

Example addition:

 $$
 tbo = tbase * fbo^{nfail}
 $$
+
+Plain text: backoff_time = base_time * (backoff_factor ^ number_of_failures)
+
+Example progression:
+- 1st failure: 2s * (1.5^1) = 3s
+- 2nd failure: 2s * (1.5^2) = 4.5s
+- 3rd failure: 2s * (1.5^3) = 6.75s
versioned_docs/version-v2.2.3/node/node-operations.md (3)

18-20: Verify Docker image path and improve command readability.

The Docker image path is quite long and might be hard to read. Consider using code blocks for commands and container IDs to improve readability.

-(**1**) Connect to your machine and execute the command `docker ps`. This will provide you with a list of Docker containers you are currently running. Among them, locate the container with the label "**europe-west3-docker.pkg.dev/hoprassociation/docker-images/hoprd:stable**" and note the "**container ID**".
-
-(**2**) Remove the container using the following command: `docker rm -f <Your_Container_ID>`. Replace "**\<Your_Container_ID\>**" with your container ID.
+(**1**) Connect to your machine and execute the command:
+```bash
+docker ps
+```
+This will provide you with a list of Docker containers you are currently running. Among them, locate the container with the label:
+```
+europe-west3-docker.pkg.dev/hoprassociation/docker-images/hoprd:stable
+```
+and note the container ID.
+
+(**2**) Remove the container using the following command:
+```bash
+docker rm -f <Your_Container_ID>
+```
+Replace `<Your_Container_ID>` with your container ID.

40-40: Verify the Dappnode link.

The link to the HOPR package (http://my.dappnode/packages/my/hopr.public.dappnode.eth/info) appears to be a local URL. Consider adding a note that this URL is only accessible from the user's local machine when connected to their Dappnode.

-(**2**) Go to "**Packages**", click [HOPR package](http://my.dappnode/packages/my/hopr.public.dappnode.eth/info), click on "**Pause**" icon to stop HOPR package.
+(**2**) Go to "**Packages**", click [HOPR package](http://my.dappnode/packages/my/hopr.public.dappnode.eth/info) (only accessible from your local machine), click on "**Pause**" icon to stop HOPR package.

76-76: Add note about local Dappnode URL.

Similar to the previous comment, this link also needs clarification about being a local URL.

-- To resume an existing HOPR package, navigate to "**Packages**", select the [HOPR package](http://my.dappnode/packages/my/hopr.public.dappnode.eth/info), and click the "**Play**" icon to activate it.
+- To resume an existing HOPR package, navigate to "**Packages**", select the [HOPR package](http://my.dappnode/packages/my/hopr.public.dappnode.eth/info) (only accessible from your local machine), and click the "**Play**" icon to activate it.
versioned_docs/version-v2.2.1/node/port-forwarding.md (2)

26-77: Consider adding Windows instructions for completeness.

The section provides clear and accurate commands for Linux, macOS, and Dappnode users. Consider adding a Windows tab with PowerShell/Command Prompt instructions for finding the internal IP address.

Example addition:

+<TabItem value="windows_internal_ip" label="Windows">
+
+(**1**) Open Command Prompt
+
+(**2**) Run the following command:
+
+```md
+ipconfig | findstr /i "IPv4"
+```
+
+(**3**) Look for the IPv4 address under your active network adapter.
+
+Example:
+```md
+IPv4 Address. . . . . . . . . . . : 192.168.5.68
+```
+</TabItem>
🧰 Tools
🪛 LanguageTool

[grammar] ~67-~67: The usual preposition to use with “corner” is “in”, not “on”. Did you mean “in the top right corner”?
Context: ...ect to your Dappnode dashboard (2) On the top right corner, click on the rounded pixeled circle (4...

(ON_IN_THE_CORNER)


146-153: Consider adding firewall and multi-node security guidance.

While the port forwarding setup is well explained, consider adding:

  1. Instructions for configuring host firewall (iptables/ufw for Linux, Windows Defender Firewall)
  2. More detailed guidance for running multiple nodes securely, including:
    • Port range recommendations
    • Security implications of exposing multiple ports
    • Network isolation strategies
versioned_docs/version-v2.2.3/dapps/mytokentracker.md (5)

8-8: Improve clarity and grammar in the introduction.

The sentence structure needs improvement, and commas should be added for better readability.

-MyTokenTracker which is built on the top of the HOPR protocol shows how Ethereum (d)app users can be identified by linking their Ethereum address to their IP address and the dApp they are using, without needing to access any Ethereum blockchain data directly.
+MyTokenTracker, which is built on top of the HOPR protocol, demonstrates how Ethereum (d)app users can be identified by linking their Ethereum address to their IP address and the dApps they use, without requiring direct access to Ethereum blockchain data.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~8-~8: A comma might be missing here.
Context: ...r which is built on the top of the HOPR protocol shows how Ethereum (d)app users can be ...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


12-12: Add security warning for external link.

Consider adding a security note about visiting external websites and verifying the URL before connecting wallets or entering Ethereum addresses.

-1. Visit the MyTokenTracker website: [https://mytokentracker.xyz](https://mytokentracker.xyz).
+1. Visit the MyTokenTracker website: [https://mytokentracker.xyz](https://mytokentracker.xyz).
+   > **Note:** Always verify the URL and ensure you're visiting the official website before entering any blockchain-related information.

16-19: Enhance technical explanation of the metadata leak.

Consider adding more technical details about how the asset icon requests reveal IP addresses.

 The tool will display all the assets linked to the entered address on the left side of the screen. As these assets load, it also loads specific asset icons, which can reveal your IP address. This information is displayed on the right side of the screen, exposing a metadata leak.

-For example, if you use a DEX like Uniswap, asset logos are loaded by making a request from your computer, making it easy to link your Ethereum address and IP address.
+For example, when you use a DEX like Uniswap, your browser makes HTTP requests to fetch asset logos from third-party servers. These requests include your IP address in the headers, allowing the servers to link your Ethereum address (from the request parameters) with your IP address (from the request headers).

22-22: Add technical details about HOPR mixnet protection.

Consider explaining how the HOPR mixnet prevents IP address exposure.

-3. To prevent your IP address from being exposed, use the HOPR mixnet. Click "**I'm feeling private**" to see how this works. On the right side of the screen, you'll notice that your IP address is no longer visible in the logs.
+3. To prevent your IP address from being exposed, use the HOPR mixnet. Click "**I'm feeling private**" to enable protection. The HOPR mixnet routes your asset icon requests through multiple relay nodes, ensuring that the asset servers only see the last relay node's IP address instead of your actual IP address. On the right side of the screen, you'll notice that your IP address is no longer visible in the logs.

26-30: Remove unnecessary empty lines.

The file contains multiple empty lines at the end. According to documentation best practices, files should end with a single newline.

 ![MyTokenTracker using HOPR mixnet prevents data leakage](/img/dapps/mytokentracker-no-leak.png)

-
-
-
-
-
+
versioned_docs/version-v2.2.3/node/custom-rpc-provider.md (3)

23-27: Improve wording for conciseness.

The phrase "necessary requirements" is redundant. Consider simplifying it.

-To set up a Gnosis chain node, you will need to run both the Execution Layer (EL) and Consensus Layer (CL) clients. Ensure that your hardware meets the necessary requirements:
+To set up a Gnosis chain node, you will need to run both the Execution Layer (EL) and Consensus Layer (CL) clients. Ensure that your hardware meets these requirements:
🧰 Tools
🪛 LanguageTool

[style] ~23-~23: ‘necessary requirements’ might be wordy. Consider a shorter alternative.
Context: ...ts. Ensure that your hardware meets the necessary requirements: - [EL requirements](https://docs.sedg...

(EN_WORDINESS_PREMIUM_NECESSARY_REQUIREMENTS)


64-69: Add security context for port exposure.

When exposing RPC ports, it's important to add security considerations to prevent unauthorized access.

Consider adding a security note:

(**5**) Expose the necessary ports to use the RPC endpoint for HOPRd nodes:
   
   - Navigate to the "**sedge-data**" folder and open the "**docker-compose.yml**" file.

   - Under "**execution.ports**" fill in these ports: **8545:8545** and **8551:8551**, and save the file.
+
+   > **Security Note**: Exposing RPC ports to external networks can pose security risks. Consider implementing authentication, using a reverse proxy with SSL, or restricting access to trusted IPs.
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

66-66: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


68-68: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


99-106: Add rate limit information for third-party providers.

Consider adding information about rate limits for each provider to help users make informed decisions.

- [Public Node](https://gnosis.publicnode.com)
- [Gateway FM](https://gateway.fm) (**Note:** Ensure the URL includes an API key)
- [Gnosis Chain RPC Providers](https://docs.gnosischain.com/tools/RPC%20Providers/#gnosis)
+ [Public Node](https://gnosis.publicnode.com) (Free tier with standard rate limits)
+ [Gateway FM](https://gateway.fm) (**Note:** Ensure the URL includes an API key. Check their documentation for rate limits)
+ [Gnosis Chain RPC Providers](https://docs.gnosischain.com/tools/RPC%20Providers/#gnosis) (Various providers with different rate limits)
+
+> **Note**: Check each provider's documentation for specific rate limits and usage quotas to ensure they meet your node's requirements.
versioned_docs/version-v2.2.3/node/multiple-nodes.md (4)

14-18: Consider adding examples of local RPC providers.

While the information about RPC providers is accurate, it would be helpful to provide examples of what constitutes a "local RPC provider" (e.g., local Geth node, Ganache) to help users make informed decisions.


76-82: Add validation steps after node launch.

Consider adding steps to verify that the second node is running correctly:

  1. How to check node logs
  2. How to verify the node is listening on the correct ports
  3. How to confirm the node has started without conflicts

Example validation steps:

To verify your second node is running correctly:
1. Check logs: `docker compose logs hoprd`
2. Verify ports: `netstat -tulpn | grep '909[12]'`
3. Confirm node status through the API

101-102: Fix grammatical issues in the instructions.

Add missing articles and improve readability:

-Click "**CONNECT TO NODE**" in the top right corner.  In the popup under "**Node credentials:**", do the following:
+Click "**CONNECT TO NODE**" in the top-right corner. In the popup under "**Node credentials:**", do the following:

-Click the button "**Connect to the node**" where popup should appear with your node address
+Click the button "**Connect to the node**" where a popup should appear with your node address

Also applies to: 106-107

🧰 Tools
🪛 LanguageTool

[uncategorized] ~101-~101: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cre...

(TOP_LEFT_CORNER)


108-110: Add more context about the waitlist process.

The instructions mention a tri-weekly approval process but could provide more details about:

  1. Expected waiting time
  2. How users will be notified of approval
  3. What criteria are used for approval
versioned_docs/version-v2.2.3/node/backup-restore-update.md (6)

1-4: Use correct verb form in the title.

Change "Backup" to "Back up" for grammatical correctness.

-title: Backup, Restore and Update Your Node
+title: Back up, Restore and Update Your Node

9-11: Use correct verb form in section heading and text.

Change "backup" to "back up" for grammatical correctness.

-## Backup your node identity
-Please select a platform to backup your node identity:
+## Back up your node identity
+Please select a platform to back up your node identity:
🧰 Tools
🪛 LanguageTool

[grammar] ~9-~9: The word ‘Backup’ is a noun. Do you mean the verb “Back up”?
Context: ...port TabItem from '@theme/TabItem'; ## Backup your node identity Please select a pla...

(SENT_START_BACKUP)


[grammar] ~11-~11: The word “backup” is a noun. The verb is spelled with a white space.
Context: ...e identity Please select a platform to backup your node identity: <TabItem va...

(NOUN_VERB_CONFUSION)


22-22: Standardize the default password format.

The default password format is inconsistent between Docker and Dappnode instructions. Standardize the format by using the same quotation style.

-**Note:** Your database password is set to `open-sesame-iTwnsPNg0hpagP+o6T0KOwiH9RQ0` by default, unless you changed it during the initial node setup.
+**Note:** Your database password is set to `"open-sesame-iTwnsPNg0hpagP+o6T0KOwiH9RQ0"` by default, unless you changed it during the initial node setup.

Also applies to: 45-45


63-63: Standardize internal link format.

The links to the backup section use inconsistent formats. Standardize by using the same format across all references.

-[backed up your HOPR node identity](./backup-restore-update.md#backup-your-node-identity)
-[backed up of your HOPR node identity](./backup-restore-update#backup-your-node-identity)
-[backed up your HOPR node identity](./backup-restore-update#backup-your-node-identity)
+[backed up your HOPR node identity](./backup-restore-update#backup-your-node-identity)
+[backed up your HOPR node identity](./backup-restore-update#backup-your-node-identity)
+[backed up your HOPR node identity](./backup-restore-update#backup-your-node-identity)

Also applies to: 74-74, 100-100


157-163: Improve readability of configuration changes.

The repetitive "Locate and remove" instructions could be restructured for better readability. Also, consider using a table or list format for configuration values to make future updates easier.

Consider restructuring like this:

Remove the following sections entirely:
- `protocol`
- `heartbeat`
- `network_options`

Update the following values:
| Section | Setting | Old Value | New Value |
|---------|----------|-----------|-----------|
| `strategy.strategies.!Aggregating` | `aggregation_threshold` | `100` | `1000` |
| `strategy.strategies.!Aggregating` | `aggregation_timeout` | Remove this setting | - |
| `strategy.strategies.!AutoRedeeming` | `minimum_redeem_ticket_value` | `30000000000000000000 HOPR` | `2500000000000000000 HOPR` |
| `chain` | `check_unrealized_balance` | Remove this setting | - |
🧰 Tools
🪛 LanguageTool

[style] ~162-~162: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ed under the "heartbeat" heading. - Locate and remove the entire "**network_option...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


183-183: Add hyphens to compound adjective.

The phrase "up to date" should be hyphenated when used as an adjective before a noun.

-Ensure your configuration file is up to date by applying the [latest configuration file]
+Ensure your configuration file is up-to-date by applying the [latest configuration file]
🧰 Tools
🪛 LanguageTool

[uncategorized] ~183-~183: It appears that hyphens are missing in the adjective “up-to-date”.
Context: ...5*) Ensure your configuration file is up to date by applying the [latest configuration f...

(UP_TO_DATE_HYPHEN)

versioned_docs/version-v2.2.3/node/frequently-asked-questions.md (4)

6-7: Remove unused imports.

The Tabs and TabItem components are imported but not used in the document.

-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';

75-75: Format bare URL as markdown link.

Convert the bare URL to a proper markdown link for consistency.

-Go to HOPR package configuration (http://my.dappnode/packages/my/hopr.public.dappnode.eth/config). Under "**Public host IP and port**", replace the IP address with the DynDNS URL including the port number.
+Go to HOPR package configuration ([http://my.dappnode/packages/my/hopr.public.dappnode.eth/config](http://my.dappnode/packages/my/hopr.public.dappnode.eth/config)). Under "**Public host IP and port**", replace the IP address with the DynDNS URL including the port number.
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

75-75: Bare URL used
null

(MD034, no-bare-urls)


121-124: Standardize list style.

For consistency with the rest of the document, use asterisks (*) instead of dashes (-) for unordered lists.

-The Netwatcher's task is to locate nodes on the network and create a list.
-The Aggregator collects all node information from the Netwatcher and sends it to the database.
-The EconomicHandler applies the economic model and pushes the data to the queue.
-The Postman takes the queue and distributes a series of 1-hop messages to every node.
+* The Netwatcher's task is to locate nodes on the network and create a list.
+* The Aggregator collects all node information from the Netwatcher and sends it to the database.
+* The EconomicHandler applies the economic model and pushes the data to the queue.
+* The Postman takes the queue and distributes a series of 1-hop messages to every node.
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

121-121: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


122-122: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


123-123: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


124-124: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


238-239: Standardize list style in hardware section.

For consistency with the rest of the document, use asterisks (*) instead of dashes (-) for unordered lists in the hardware comparison section.

-**Increased stability and decentralization**: Running a local Gnosis node allows you to operate your own RPC endpoint, improving node stability and contributing to decentralization, which can positively impact node performance.
-**Cost-effective in the long term**: From an economic perspective, owning hardware can be more cost-effective over time, as there are no ongoing subscription costs like with VPS providers.
+* **Increased stability and decentralization**: Running a local Gnosis node allows you to operate your own RPC endpoint, improving node stability and contributing to decentralization, which can positively impact node performance.
+* **Cost-effective in the long term**: From an economic perspective, owning hardware can be more cost-effective over time, as there are no ongoing subscription costs like with VPS providers.

-**Monitoring and maintenance**: You will need to constantly monitor your setup for internet or power outages, which can disrupt performance and require manual intervention.
+* **Monitoring and maintenance**: You will need to constantly monitor your setup for internet or power outages, which can disrupt performance and require manual intervention.

-**High uptime**: Most VPS providers offer 99.9% uptime, meaning you don't have to worry about power or internet disruptions, as these are managed by the provider.
+* **High uptime**: Most VPS providers offer 99.9% uptime, meaning you don't have to worry about power or internet disruptions, as these are managed by the provider.

-**Higher costs for running local nodes**: Running a local Gnosis node on a VPS can be expensive due to the required hardware resources and storage. Relying on third-party RPC providers may negatively impact node performance, as external endpoints can introduce latency, limitations, and instability.
+* **Higher costs for running local nodes**: Running a local Gnosis node on a VPS can be expensive due to the required hardware resources and storage. Relying on third-party RPC providers may negatively impact node performance, as external endpoints can introduce latency, limitations, and instability.

Also applies to: 243-243, 251-251, 255-255

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

238-238: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


239-239: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)

versioned_docs/version-v2.2.3/developers/starting-local-cluster.md (5)

16-22: Fix typos and formatting issues in the Requirements section.

Several issues need to be addressed:

  • Line 16-17: Remove redundant "INFO" text as the :::info directive already indicates this is an info block
  • Line 20: Fix typo "architecute" → "architecture"
  • Line 41: Add hyphen to "well-supported"
-:::info INFO
+:::info
 
 MacOS M1 users will need to follow an extra set of instructions from [NVM](https://github.com/nvm-sh/nvm#macos-troubleshooting) to allow them to use Node.js 16.
 
-Node.js should be compiled under x64 architecute.
+Node.js should be compiled under x64 architecture.
 
 :::
...
-Windows is not well supported/tested
+Windows is not well-supported/tested

Also applies to: 41-41

🧰 Tools
🪛 LanguageTool

[duplication] ~16-~16: Possible typo: you repeated a word.
Context: ...d packet relaying. ## Requirements :::info INFO MacOS M1 users will need to follow an ...

(ENGLISH_WORD_REPEAT_RULE)


45-46: Improve readability in the Local Setup section.

Several improvements can be made:

  • Line 45: Replace wordy phrase "on a daily basis" with "daily"
  • Line 64: Add comma after "Ideally"
  • Line 72: Add comma after "Before running the script"
  • Line 95: Add comma after "with the local cluster nodes"
-Running a local setup will give you a similar setup to the one the HOPR team works with on a daily basis. After all dependencies are installed,
+Running a local setup will give you a similar setup to the one the HOPR team works with daily. After all dependencies are installed,
...
-Ideally you will also have basic development toolsets
+Ideally, you will also have basic development toolsets
...
-Before running the script make sure you have:
+Before running the script, make sure you have:
...
-This should be done in each terminal you'll be communicating with the local cluster nodes as it will set up
+This should be done in each terminal you'll be communicating with the local cluster nodes, as it will set up

Also applies to: 64-64, 72-72, 95-95

🧰 Tools
🪛 LanguageTool

[style] ~45-~45: ‘on a daily basis’ might be wordy. Consider a shorter alternative.
Context: ...tup to the one the HOPR team works with on a daily basis. After all dependencies are installed, ...

(EN_WORDINESS_PREMIUM_ON_A_DAILY_BASIS)


111-111: Improve code blocks and wording in the Docker Setup section.

Several improvements needed:

  • Line 111: Replace wordy phrase "on a daily basis" with "daily"
  • Line 142, 166: Add language specifiers to code blocks
-The Docker setup will give you a similar setup to what the HOPR devs use on a daily basis.
+The Docker setup will give you a similar setup to what the HOPR devs use daily.
...
-```
+```bash
docker run -ti -p 13301-13305:13301-13305 gcr.io/hoprassociation/hopr-pluto:2.0.2

...
- +bash
docker run -d --name hopr_admin -p 3000:3000 gcr.io/hoprassociation/hopr-admin

Also applies to: 142-142, 166-166

🧰 Tools
🪛 LanguageTool

[style] ~111-~111: ‘on a daily basis’ might be wordy. Consider a shorter alternative.
Context: ...similar setup to what the HOPR devs use on a daily basis. 1. **Make sure you have Docker insta...

(EN_WORDINESS_PREMIUM_ON_A_DAILY_BASIS)


174-174: Fix typos in the Playground Setup section.

Found the following issues:

  • Line 174: Fix typo "devloping" → "developing"
  • Line 174: Add apostrophe to "node's API URL"
-This is a good alternative for testing and devloping dApps. Simply use the nodes API URL
+This is a good alternative for testing and developing dApps. Simply use the node's API URL
🧰 Tools
🪛 LanguageTool

[style] ~174-~174: Consider using a different adjective in this context to strengthen your wording.
Context: ...tes at a time before closing. This is a good alternative for testing and devloping d...

(GOOD_ALTERNATIVE)


[uncategorized] ~174-~174: It seems likely that a singular genitive (’s) apostrophe is missing.
Context: ...ing and devloping dApps. Simply use the nodes API URL and key when connecting to a no...

(AI_HYDRA_LEO_APOSTROPHE_S_XS)


189-189: Fix grammar in footnote.

Found a grammatical error:

  • Line 189: Fix "your are" → "you are"
-However, in the case your are only starting to develop
+However, in the case you are only starting to develop
🧰 Tools
🪛 LanguageTool

[grammar] ~189-~189: Did you mean “you are”, “yours are” or “your”?
Context: ... do anything else. However, in the case your are only starting to develop in node.js, ...

(YOUR_RE)


[style] ~189-~189: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... Linux-based OS, you will likely also need to install build-essentials (e.g. in Ubu...

(REP_NEED_TO_VB)

versioned_docs/version-v2.2.3/developers/smart-contract.md (1)

36-214: Fix markdown formatting issues.

Remove trailing colons from heading lines to comply with markdown standards.

Apply these changes to fix the markdown formatting:

-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
-#### Parameters:
+#### Parameters
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

36-36: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


62-62: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


82-82: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


82-82: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


103-103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


103-103: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


123-123: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


123-123: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


144-144: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


144-144: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


166-166: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


166-166: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


187-187: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


187-187: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


214-214: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


214-214: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

versioned_docs/version-v2.2.3/core/network-registry-monte-rosa.md (1)

14-14: Consider stronger wording.

To strengthen the instruction, consider replacing "make sure" with "ensure".

-The Network Registry is being used for the Monte Rosa release, so please make sure you are eligible and have been registered before trying to use this environment.
+The Network Registry is being used for the Monte Rosa release, so please ensure you are eligible and have been registered before trying to use this environment.
🧰 Tools
🪛 LanguageTool

[style] ~14-~14: Consider using a different verb to strengthen your wording.
Context: ...d for the Monte Rosa release, so please make sure you are eligible and have been register...

(MAKE_SURE_ENSURE)

versioned_docs/version-v2.2.3/token/token-wrapping.md (2)

10-10: Consider adding important prerequisites.

While the introduction is clear, consider adding:

  • Required wallet setup for Gnosis Chain
  • Minimum token amounts for staking/running nodes
  • Links to related documentation about staking requirements

12-42: Add information about transaction costs and potential issues.

Consider adding:

  • Estimated gas fees for the wrapping transaction
  • Common issues and troubleshooting steps
  • What to do if the transaction fails
  • How to verify the wrapped tokens in your wallet
versioned_docs/version-v2.2.3/token/acquiring-hopr-tokens.md (2)

40-47: Add minimum stake requirements information.

Consider enhancing the wxHOPR token requirements by including information about minimum stake requirements for node operation.

-| **wxHOPR (hopr)** | Required for initial stake to operate nodes, and for opening outgoing channels to relay data across the network. |
+| **wxHOPR (hopr)** | Required for initial stake to operate nodes (minimum stake requirement: X wxHOPR), and for opening outgoing channels to relay data across the network. Each outgoing channel requires Y wxHOPR to be locked as stake. |

14-18:

❓ Verification inconclusive

Verify smart contract addresses and enhance wxHOPR description.

The smart contract addresses should be verified to ensure they are correct and active.

Consider enhancing the wxHOPR description to better highlight its role:

-| **wxHOPR**   | Gnosis Chain | [0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1](https://gnosisscan.io/token/0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1) | Used to operate HOPR nodes. It can be [unwrapped to xHOPR](token-wrapping.md). |
+| **wxHOPR**   | Gnosis Chain | [0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1](https://gnosisscan.io/token/0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1) | The staking token required to operate HOPR nodes and open payment channels. It can be [unwrapped to xHOPR](token-wrapping.md). |

🏁 Script executed:

#!/bin/bash
# Description: Verify smart contract addresses using blockchain explorers

# Check Ethereum mainnet HOPR token contract
curl -s "https://api.etherscan.io/api?module=contract&action=getcontractcreation&contractaddresses=0xf5581dfefd8fb0e4aec526be659cfab1f8c781da"

# Check Gnosis Chain xHOPR and wxHOPR token contracts
curl -s "https://api.gnosisscan.io/api?module=contract&action=getcontractcreation&contractaddresses=0xD057604A14982FE8D88c5fC25Aac3267eA142a08,0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1"

Length of output: 468


Verify Smart Contract Addresses with Valid API Keys & Enhance wxHOPR Description

  • The automated verification for the smart contract addresses failed due to a missing/invalid API key. Please ensure that valid API keys are provided for Etherscan and GnosisScan or verify these addresses manually.
  • Consider updating the wxHOPR description to more clearly reflect its role as the staking token essential for operating HOPR nodes and opening payment channels.
-| **wxHOPR**   | Gnosis Chain | [0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1](https://gnosisscan.io/token/0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1) | Used to operate HOPR nodes. It can be [unwrapped to xHOPR](token-wrapping.md). |
+| **wxHOPR**   | Gnosis Chain | [0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1](https://gnosisscan.io/token/0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1) | The staking token required to operate HOPR nodes and open payment channels. It can be [unwrapped to xHOPR](token-wrapping.md). |
docusaurus.config.js (1)

58-59: Version number inconsistency with PR title.

The PR title indicates release 2.2.2, but the configuration is being updated to version 2.2.3. Please clarify the correct version number.

Additionally, consider keeping v2.2.0 in the onlyIncludeVersions array since it's still listed in the releases documentation and is eligible for CT rewards.

versioned_docs/version-v2.2.3/core/cover-traffic.md (2)

12-12: Fix grammatical error in sentence.

Remove the comma before "because" as the clause is essential to the meaning of the sentence.

-This is called "Cover Traffic", because the arbitrary data provides cover for legitimate packets.
+This is called "Cover Traffic" because the arbitrary data provides cover for legitimate packets.
🧰 Tools
🪛 LanguageTool

[formatting] ~12-~12: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ... network. This is called “Cover Traffic”, because the arbitrary data provides cover for l...

(COMMA_BEFORE_BECAUSE)


22-24: Consider adding more details about the staking mechanism.

The connection between Cover Traffic and staking could be clearer. Consider adding:

  • Minimum staking requirements
  • How rewards are calculated
  • Time periods for staking
versioned_docs/version-v2.2.3/developers/network-registry.md (2)

6-6: Fix typo in sentence.

Correct the spelling of "reasonable".

-To test HOPR protocol and develop dApps on top of HOPR at a resonable scale
+To test HOPR protocol and develop dApps on top of HOPR at a reasonable scale

30-46: Improve document structure by consolidating duplicate headings.

The document has duplicate "Deregister a node" headings. Consider restructuring this section to avoid confusion.

-### Deregister a node
+### Deregister a node by the runner
 
 A node runner can call `selfDeregister(string[] hoprPeerIds)` method from `HoprNetworkRegistry` smart contract to remove previously registered HOPR nodes.
 
-### Register a node by the Network Registry contract owner
+## Network Registry Contract Owner Operations
 
-#### Eligibility
+### Eligibility
 
 Owner can register any account for any node. The eligibility of an account is not going to be checked unless a `sync` method for that account gets called.
 
-#### Register the peer ID
+### Register peer IDs
 
 Owner can call `ownerRegister(address[] accounts, string[] hoprPeerIds)` method from `HoprNetworkRegistry` smart contract to register a list of HOPR nodes for a list of accounts respectively. Note that this registration can overwrite existing entries.
 
-### Deregister a node
+### Deregister nodes
 
 Owner can call `ownerDeregister(string[] hoprPeerIds)` method from `HoprNetworkRegistry` smart contract to remove a list of nodes.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~32-~32: You might be missing the article “the” here.
Context: ...register a node A node runner can call selfDeregister(string[] hoprPeerIds) me...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[style] ~38-~38: Use ‘will’ instead of ‘going to’ if the following action is certain.
Context: ...any node. The eligibility of an account is not going to be checked unless a sync method for t...

(GOING_TO_WILL)


[uncategorized] ~41-~41: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...ets called. #### Register the peer ID Owner can call `ownerRegister(address[] accou...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)


[uncategorized] ~42-~42: You might be missing the article “the” here.
Context: ...## Register the peer ID Owner can call `ownerRegister(address[] accounts, string...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~46-~46: You might be missing the article “the” here.
Context: ... ### Deregister a node Owner can call ownerDeregister(string[] hoprPeerIds) m...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

🪛 markdownlint-cli2 (0.17.2)

44-44: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/core/what-is-hopr.md (1)

19-19: Enhance video accessibility.

The embedded YouTube video should include a title attribute for better accessibility.

-<iframe class="youtube-video" width="960" height="500" src="https://www.youtube.com/embed/2ftZdR09KbU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; modestbranding; showinfo=0; fullscreen"></iframe>
+<iframe class="youtube-video" width="960" height="500" src="https://www.youtube.com/embed/2ftZdR09KbU" title="Introduction to HOPR" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; modestbranding; showinfo=0; fullscreen"></iframe>
versioned_docs/version-v2.2.3/core/probabilistic-payments.md (1)

18-21: Consider adding a visual diagram.

The explanation of probabilistic payments would benefit from a visual representation comparing the traditional vs. probabilistic payment models. This would help readers better understand the concept and its benefits.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~20-~20: A comma might be missing here.
Context: ...bout the underlying message layer. Now instead imagine that each ticket has a 1% chanc...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)

versioned_docs/version-v2.2.3/core/mixnets.md (1)

25-25: Add a comma for better readability.

Add a comma after "groups" in the sentence.

-As the packets come into the node in groups they are split apart, recombined, and these new combinations of packets are sent out to different nodes as they head to their destination.
+As the packets come into the node in groups, they are split apart, recombined, and these new combinations of packets are sent out to different nodes as they head to their destination.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~25-~25: A comma might be missing here.
Context: ...e. As the packets come into the node in groups they are split apart, recombined, and t...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)

versioned_docs/version-v2.2.3/core/cover-traffic-nodes.md (1)

30-30: Add a comma after "Initially".

Add a comma for better readability.

-Initially the HOPR Association will run these nodes itself, but in the medium-term anyone will be able to run a Cover Traffic node, provided they meet the requirements.
+Initially, the HOPR Association will run these nodes itself, but in the medium-term anyone will be able to run a Cover Traffic node, provided they meet the requirements.
🧰 Tools
🪛 LanguageTool

[typographical] ~30-~30: Consider adding a comma after ‘Initially’ for more clarity.
Context: ...y having dedicated Cover Traffic nodes. Initially the HOPR Association will run these nod...

(RB_LY_COMMA)

versioned_docs/version-v2.2.3/token/cover-traffic-economics.md (1)

17-17: Fix typo in "receiwe".

Correct the spelling of "receive".

-|  **CT probability (pct)** | Cover Traffic probability, the higher you stake, the higher probability to receiwe rewards from the Cover Traffic. |
+|  **CT probability (pct)** | Cover Traffic probability, the higher you stake, the higher probability to receive rewards from the Cover Traffic. |
versioned_docs/version-v2.2.3/core/incentives.md (1)

28-28: Consider adding a comma after introductory phrase.

For better readability, consider adding a comma after "Let's remember what we've learned about the HOPR mixnet".

-Let's remember what we've learned about the HOPR mixnet in [previous](https://medium.com/hoprnet/hopr-basics-episode-3-anonymous-routing-d9278f7de129) [episodes](https://medium.com/hoprnet/hopr-basics-episode-4-mixnets-dfbac2e6560).
+Let's remember what we've learned about the HOPR mixnet, in [previous](https://medium.com/hoprnet/hopr-basics-episode-3-anonymous-routing-d9278f7de129) [episodes](https://medium.com/hoprnet/hopr-basics-episode-4-mixnets-dfbac2e6560).
🧰 Tools
🪛 LanguageTool

[uncategorized] ~28-~28: Possible missing comma found.
Context: ...oë. For each packet, Alejandro (or more precisely his node) selects a route which hops th...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/core/anonymous-routing.md (1)

28-28: Improve grammar in sentence.

Replace "who" with "whom" for correct grammar in the sentence.

-This is quite a good system, and for a human it would already be too complicated to track who is sending messages to who.
+This is quite a good system, and for a human it would already be too complicated to track who is sending messages to whom.
🧰 Tools
🪛 LanguageTool

[typographical] ~28-~28: Consider adding a comma after this introductory phrase.
Context: ... This is quite a good system, and for a human it would already be too complicated to ...

(AS_A_NN_COMMA)


[grammar] ~28-~28: Did you mean “whom”?
Context: ...ted to track who is sending messages to who. But with enough analysis power it’s st...

(IN_WHO)


[formatting] ~28-~28: Consider inserting a comma here, unless the first half is essential to the meaning of the sentence.
Context: ...ssages to who. But with enough analysis power it’s still possible to crack networks l...

(WITH_THAT_COMMA)

versioned_docs/version-v2.2.3/core/proof-of-relay.md (1)

20-20: Fix grammar in sentence.

Change "there's" to "there are" for correct subject-verb agreement.

-The problem with this is there's no guarantees.
+The problem with this is there are no guarantees.
🧰 Tools
🪛 LanguageTool

[grammar] ~20-~20: Did you mean “there are no guarantees”?
Context: ...wn the chain. The problem with this is there’s no guarantees. Why not just take the money and not fo...

(THERE_S_MANY)

versioned_docs/version-v2.2.3/core/balancing-cover-traffic.md (2)

16-16: Add hyphens to compound adjectives.

Add hyphens to "high quality" when used as a compound adjective.

-people who hold more HOPR tokens are more likely to support the goals of the project, and more likely to have the assets necessary to run and maintain high quality nodes
+people who hold more HOPR tokens are more likely to support the goals of the project, and more likely to have the assets necessary to run and maintain high-quality nodes
🧰 Tools
🪛 LanguageTool

[uncategorized] ~16-~16: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...he assets necessary to run and maintain high quality nodes — this isn’t necessarily true. Wh...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~16-~16: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ad nodes. We also don’t want to cut out high quality nodes with lower stakes. This last poi...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


24-24: Use "number of" instead of "amount of" for countable nouns.

Replace "amount of" with "number of" when referring to countable packets.

-Each Cover Traffic node has a certain amount of packets to transmit
+Each Cover Traffic node has a certain number of packets to transmit
🧰 Tools
🪛 LanguageTool

[uncategorized] ~24-~24: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: .... Each Cover Traffic node has a certain amount of packets to transmit, and associated ...

(AMOUNTOF_TO_NUMBEROF)

versioned_docs/version-v2.2.3/core/tickets-and-payment-channels.md (1)

34-34: Use "number of" instead of "amount of" for countable nouns.

Replace "amount of" with "number of" when referring to countable transactions.

-Payment channels are a common technique in crypto to reduce the amount of transactions needed.
+Payment channels are a common technique in crypto to reduce the number of transactions needed.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~34-~34: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ommon technique in crypto to reduce the amount of transactions needed. Two users fund ...

(AMOUNTOF_TO_NUMBEROF)

versioned_docs/version-v2.2.3/node/port-forwarding.md (2)

15-15: Fix the question mark in the section heading.

The section heading should not end with a question mark as it's a statement, not a question.

-## When you don't need to set up port forwarding?
+## When you don't need to set up port forwarding
🧰 Tools
🪛 LanguageTool

[grammar] ~15-~15: Please double-check that the subject and verb are in the correct order to formulate a question.
Context: ...om outside your local network. ## When you don't need to set up port forwarding? - If y...

(HOW_YOU_ARE)


67-67: Fix grammar in the instruction.

The instruction should use "in" instead of "on" with "corner".

-(**2**) On the top right corner, click on the rounded pixeled circle (4th from the right) and note the internal IP address.
+(**2**) In the top right corner, click on the rounded pixeled circle (4th from the right) and note the internal IP address.
🧰 Tools
🪛 LanguageTool

[grammar] ~67-~67: The usual preposition to use with “corner” is “in”, not “on”. Did you mean “in the top right corner”?
Context: ...ect to your Dappnode dashboard (2) On the top right corner, click on the rounded pixeled circle (4...

(ON_IN_THE_CORNER)

versioned_docs/version-v2.2.3/node/node-dappnode.md (2)

34-34: Fix typo in the Safe address.

There's a typo in the word "Safe".

-Go to the [onboarding page](https://hub.hoprnet.org/staking/onboarding) and copy the afe and Module addresses.
+Go to the [onboarding page](https://hub.hoprnet.org/staking/onboarding) and copy the Safe and Module addresses.

68-68: Improve clarity in the connection instruction.

The instruction about connecting to the node should be more specific about the popup location.

-(**2**) Click "**CONNECT TO NODE**" in the top right corner. In the popup under "**Node credentials:**", do the following:
+(**2**) Click "**CONNECT TO NODE**" in the top right corner. In the connection popup that appears, under "**Node credentials:**", do the following:
🧰 Tools
🪛 LanguageTool

[uncategorized] ~68-~68: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cred...

(TOP_LEFT_CORNER)

versioned_docs/version-v2.2.3/token/safestaking.md (1)

36-36: Improve wording for consistency.

Replace "previously" with "formerly" for stronger wording.

-[Safe](https://safe.global/) (previously known as Gnosis Safe) is a smart account wallet that provides a secure and customizable solution for storing funds.
+[Safe](https://safe.global/) (formerly known as Gnosis Safe) is a smart account wallet that provides a secure and customizable solution for storing funds.
-[Safe](https://safe.global/) (previously known as Gnosis Safe) is the most secure smart contract wallet setup on the market.
+[Safe](https://safe.global/) (formerly known as Gnosis Safe) is the most secure smart contract wallet setup on the market.

Also applies to: 67-67

🧰 Tools
🪛 LanguageTool

[style] ~36-~36: Consider using “formerly” to strengthen your wording.
Context: ...ng Safe? Safe (previously known as Gnosis Safe) is a smart accoun...

(PREVIOUSLY_FORMERLY)

versioned_docs/version-v2.2.3/node/node-docker-compose.md (2)

22-22: Add a note about Docker Compose version availability.

Based on the retrieved learning, it would be helpful to inform users about Docker Compose version availability.

Add this note before the command:

+:::note
+The latest Docker Compose version is only available on the master branch, not on release tags.
+:::
+

50-50: Fix grammar in the API token description.

Add a comma after "token" for better readability.

-- "**HOPRD_API_TOKEN**": Replace the "**\<YOUR HOPRD API TOKEN>**" within your docker command with your own security token which is required to connect to your node via HOPR Admin UI or REST API.
+- "**HOPRD_API_TOKEN**": Replace the "**\<YOUR HOPRD API TOKEN>**" within your docker command with your own security token, which is required to connect to your node via HOPR Admin UI or REST API.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~50-~50: Possible missing comma found.
Context: ...r docker command with your own security token which is required to connect to your no...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/node/node-management-admin-ui.md (4)

30-31: Add security considerations for remote access.

When accessing the Admin UI remotely, consider adding security recommendations:

  • Use HTTPS for secure communication
  • Set up proper firewall rules
  • Consider using a VPN or SSH tunnel

196-196: Fix grammar in Aliases section.

Address the missing comma after 'Also' and improve sentence structure.

-You can use the alias command to give an address a more memorable name. Also you can import / export a list of all current aliases.
+You can use the alias command to give an address a more memorable name. Also, you can import/export a list of all current aliases.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~196-~196: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ... give an address a more memorable name. Also you can import / export a list of all c...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


208-208: Fix punctuation in message sending methods description.

Remove unnecessary comma before 'because' clause.

-- **direct message**: This method will use 0-hop, sending a direct message means it is free of charge, because it is not mixed or private.
+- **direct message**: This method will use 0-hop, sending a direct message means it is free of charge because it is not mixed or private.
🧰 Tools
🪛 LanguageTool

[formatting] ~208-~208: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...irect message means it is free of charge, because it is not mixed or private.
- **a...

(COMMA_BEFORE_BECAUSE)


232-232: Improve clarity of channel closing instructions.

The channel closing instructions could be clearer about the two-step process.

-| **Closing Channel** | To close a payment channel, you must perform two actions. First, click "**Close the Channel**" to initiate the closure. After a grace period of 5 minutes, if your node is not configured to automatically finalize the closure of the payment channel, you will need to manually click again to complete the process.
+| **Closing Channel** | Closing a payment channel is a two-step process:<br/>1. Click "**Close the Channel**" to initiate closure<br/>2. Wait for the 5-minute grace period<br/>3. If automatic finalization is not configured, click again to complete the closure<br/><br/>Note: Channel closure can be automated via the [configuration file](./manage-node-strategies.md).
versioned_docs/version-v2.2.3/developers/components/WebSocketHandler.jsx (2)

4-10: Consider adding error boundaries.

The component should be wrapped in an error boundary to gracefully handle WebSocket connection failures and provide a better user experience.

+class WebSocketErrorBoundary extends React.Component {
+  state = { hasError: false };
+  
+  static getDerivedStateFromError(error) {
+    return { hasError: true };
+  }
+  
+  render() {
+    if (this.state.hasError) {
+      return <div>Error connecting to WebSocket. Please try again.</div>;
+    }
+    return this.props.children;
+  }
+}

 export const WebSocketHandler = ({

23-25: Consider using a more robust error handling strategy.

The catch block only logs errors to the console, which might not be sufficient for production use.

Consider implementing error boundaries or error state handling:

    } catch (err) {
      console.error(err)
+     setMessage('Failed to process message')
+     // Optionally, propagate error to parent
+     if (props.onError) {
+       props.onError(err)
+     }
    }
versioned_docs/version-v2.2.3/developers/components/BoomerangChat.jsx (2)

13-24: Add loading state handling.

The address fetch operation should show a loading state to improve user experience.

+  const [isLoading, setIsLoading] = useState(false)
   useEffect(() => {
     const loadAddress = async () => {
+      setIsLoading(true)
       const headers = getHeaders(securityToken)
       const account = await fetch(`${httpEndpoint}/api/v2/account/addresses`, {
         headers
       })
         .then((res) => res.json())
-        .catch((err) => console.error(err))
+        .catch((err) => {
+          console.error(err)
+          return null
+        })
+        .finally(() => setIsLoading(false))
       setAddress(account?.hopr)
     }
     loadAddress()
   }, [securityToken, httpEndpoint])

9-10: Consider environment-based default endpoints.

Hard-coded localhost URLs might not be suitable for all environments.

-  const [wsEndpoint, setWsEndpoint] = useState('ws://localhost:3000')
-  const [httpEndpoint, setHTTPEndpoint] = useState('http://localhost:3001')
+  const [wsEndpoint, setWsEndpoint] = useState(process.env.REACT_APP_WS_ENDPOINT || 'ws://localhost:3000')
+  const [httpEndpoint, setHTTPEndpoint] = useState(process.env.REACT_APP_HTTP_ENDPOINT || 'http://localhost:3001')
versioned_docs/version-v2.2.3/developers/hooks/useWebSockets.js (3)

56-74: Add connection timeout handling.

Implement a connection timeout to handle cases where the WebSocket connection hangs.

     try {
       const wsUrl = new URL(settings.wsEndpoint)
 
+      const CONNECTION_TIMEOUT = 5000
+      const timeoutId = setTimeout(() => {
+        if (socketRef.current?.readyState === WebSocket.CONNECTING) {
+          socketRef.current.close()
+          handleErrorEvent(new Error('Connection timeout'))
+        }
+      }, CONNECTION_TIMEOUT)
+
       if (settings.securityToken) {
         wsUrl.search = `?apiToken=${settings.securityToken}`
       }
       console.info('WS Connecting..')
       socketRef.current = new WebSocket(wsUrl)
 
       // handle connection opening
-      socketRef.current.addEventListener('open', handleOpenEvent)
+      socketRef.current.addEventListener('open', () => {
+        clearTimeout(timeoutId)
+        handleOpenEvent()
+      })

84-84: Consider memoizing the settings object.

The dependency array includes settings.wsEndpoint and settings.securityToken, which could cause unnecessary re-renders if the settings object is recreated on each render of the parent component.

Consider using useMemo in the parent component or destructuring the settings in the hook:

-const useWebsocket = (settings) => {
+const useWebsocket = ({ wsEndpoint, securityToken }) => {
   // ... rest of the code ...
-  }, [settings.wsEndpoint, settings.securityToken])
+  }, [wsEndpoint, securityToken])

16-19: Consider using a more descriptive debounce delay value.

The debounce delay is set to 1e3 which is not immediately clear that it represents 1 second.

-  }, 1e3)
+  }, 1000) // 1 second delay
versioned_docs/version-v2.2.3/developers/snippets/getHeaders.md (1)

7-15: Add input validation for the security token.

The function should validate that the security token is not empty or malformed before using it in the Authorization header.

 export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
+  if (!securityToken || typeof securityToken !== 'string') {
+    throw new Error('Invalid security token')
+  }
   const headers = new Headers()
   if (isPost) {
     headers.set('Content-Type', 'application/json')
     headers.set('Accept-Content', 'application/json')
   }
   headers.set('Authorization', 'Basic ' + btoa(securityToken))
   return headers
 }
versioned_docs/version-v2.2.3/developers/snippets/useWebSocket.md (3)

78-80: Enhance error handling for invalid URLs.

The catch block only logs the error. Consider propagating the error state to the UI for better user feedback.

     } catch (err) {
       console.error('URL is invalid', settings.wsEndpoint)
+      setState((draft) => {
+        draft.status = 'ERROR'
+        draft.error = `Invalid WebSocket URL: ${settings.wsEndpoint}`
+      })
     }

22-24: Consider configurable debounce delay.

The debounce delay is hardcoded to 1 second (1e3).

+const DEFAULT_RECONNECT_DELAY = 1000
+
 const setReconnectTmspDebounced = debounce((timestamp) => {
   setReconnectTmsp(timestamp)
-}, 1e3)
+}, settings.reconnectDelay || DEFAULT_RECONNECT_DELAY)

63-80: Enhance error handling for invalid WebSocket URLs.

The error handling for invalid URLs could be more informative.

     try {
       const wsUrl = new URL(settings.wsEndpoint)
 
       if (settings.securityToken) {
         wsUrl.search = `?apiToken=${settings.securityToken}`
       }
       console.info('WS Connecting..')
       socketRef.current = new WebSocket(wsUrl)
 
       // handle connection opening
       socketRef.current.addEventListener('open', handleOpenEvent)
       // handle connection closing
       socketRef.current.addEventListener('close', handleCloseEvent)
       // handle errors
       socketRef.current.addEventListener('error', handleErrorEvent)
     } catch (err) {
-      console.error('URL is invalid', settings.wsEndpoint)
+      const error = new Error(`Invalid WebSocket URL: ${settings.wsEndpoint}`)
+      console.error(error.message, { cause: err })
+      setState(draft => {
+        draft.status = 'ERROR'
+        draft.error = error.message
+      })
     }
versioned_docs/version-v2.2.3/developers/snippets.mdx (3)

12-17: Improve grammar in the introduction.

The sentence structure needs improvement:

-Most HOPR applications require to do at least one of the following actions:
+Most HOPR applications need to perform at least one of the following actions:
🧰 Tools
🪛 LanguageTool

[grammar] ~12-~12: Did you mean “doing”? Or maybe you should add a pronoun? In active voice, ‘require’ + ‘to’ takes an object, usually a pronoun.
Context: ...nctions Most HOPR applications require to do at least one of the following actions: ...

(ALLOW_TO)


12-12: Improve grammar in the introduction.

The sentence structure could be improved.

-Most HOPR applications require to do at least one of the following actions:
+Most HOPR applications need to perform at least one of the following actions:
🧰 Tools
🪛 LanguageTool

[grammar] ~12-~12: Did you mean “doing”? Or maybe you should add a pronoun? In active voice, ‘require’ + ‘to’ takes an object, usually a pronoun.
Context: ...nctions Most HOPR applications require to do at least one of the following actions: ...

(ALLOW_TO)


84-84: Fix hyphenation and punctuation.

The text needs proper hyphenation and punctuation.

-HOPR is code agnostic so any language would work
+HOPR is code-agnostic, so any language would work
🧰 Tools
🪛 LanguageTool

[uncategorized] ~84-~84: This expression is ususally spelled with a hyphen
Context: ...th your terminal, Python or JS. HOPR is code agnostic so any language would work, you could e...

(SPECIFIC_HYPHEN)


[uncategorized] ~84-~84: Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...nal, Python or JS. HOPR is code agnostic so any language would work, you could even...

(COMMA_COMPOUND_SENTENCE_2)

versioned_docs/version-v2.2.3/node/staking-hub.md (2)

8-8: Enhance video accessibility with additional attributes.

The embedded YouTube video could benefit from improved accessibility attributes.

-<iframe class="youtube-video" width="960" height="500" src="https://www.youtube.com/embed/-zYltiDFh9I" frameborder="0" allow="rel=0; accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; modestbranding; showinfo=0; fullscreen"></iframe>
+<iframe class="youtube-video" width="960" height="500" src="https://www.youtube.com/embed/-zYltiDFh9I" title="HOPR Staking Hub Tutorial" frameborder="0" allow="rel=0; accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; modestbranding; showinfo=0; fullscreen" loading="lazy" aria-label="HOPR Staking Hub Tutorial Video"></iframe>

40-41: Fix list indentation.

The unordered list items are indented with 4 spaces instead of the standard 2 spaces.

-    - **Train**: The Train icon becomes active when a newly added node requires a quick onboarding process to complete setup.
-    - **Wallet**: Allows you to fund your node with xDai. It's important to regularly check and maintain your node's balance to ensure it can redeem tickets or perform other on-chain actions.
+  - **Train**: The Train icon becomes active when a newly added node requires a quick onboarding process to complete setup.
+  - **Wallet**: Allows you to fund your node with xDai. It's important to regularly check and maintain your node's balance to ensure it can redeem tickets or perform other on-chain actions.
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

40-40: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


41-41: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

versioned_docs/version-v2.2.3/node/node-docker.md (1)

107-108: Add warning about dynamic IP configuration.

The warning about dynamic IPs is important but could be more prominent.

-**Important:** Dynamic IPs are not suitable for this setup, as your node will become unreachable once your IP address changes. **If you have a dynamic IP, use a DDNS service** and specify the DDNS address as your public IP, including the port, in the Docker command. You can find instructions on how to do this [here](./frequently-asked-questions#how-to-use-dynamic-dns).
+:::warning
+Dynamic IPs are not suitable for this setup, as your node will become unreachable once your IP address changes. **If you have a dynamic IP, use a DDNS service** and specify the DDNS address as your public IP, including the port, in the Docker command. You can find instructions on how to do this [here](./frequently-asked-questions#how-to-use-dynamic-dns).
+:::
versioned_docs/version-v2.2.3/developers/components/RPSGame.jsx (1)

18-20: Move game constants outside component.

Game constants should be defined outside the component to prevent recreation on each render.

+const MOVES = {
+  SCISSORS: 'scissors',
+  ROCK: 'rock',
+  PAPER: 'paper'
+} as const;

 export default function RPSGame() {
-  const SCISSORS_MOVE = 'scissors'
-  const ROCK_MOVE = 'rock'
-  const PAPER_MOVE = 'paper'
versioned_docs/version-v2.2.3/developers/snippets/WebSocketHandler.md (1)

14-25: Enhance error handling in handleReceivedMessage.

The error handling could be more informative and structured.

   const handleReceivedMessage = async (ev) => {
     try {
       const data = JSON.parse(ev.data)
       console.log('WebSocket Data', data)
       if (data.type === 'message') {
         setMessage(data.msg)
       }
     } catch (err) {
-      console.error(err)
+      console.error('Failed to process WebSocket message:', {
+        error: err.message,
+        data: ev.data
+      })
+      setMessage('Error: Failed to process message')
     }
   }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfa71b and 728d94c.

📒 Files selected for processing (64)
  • docusaurus.config.js (1 hunks)
  • versioned_docs/version-v2.2.1/node/fast-sync.md (3 hunks)
  • versioned_docs/version-v2.2.1/node/port-forwarding.md (1 hunks)
  • versioned_docs/version-v2.2.1/node/releases.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/anonymous-routing.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/balancing-cover-traffic.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/cover-traffic-nodes.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/cover-traffic.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/incentives.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/mixnets.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/network-registry-monte-rosa.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/probabilistic-payments.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/proof-of-relay.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/tickets-and-payment-channels.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/what-is-hopr.md (1 hunks)
  • versioned_docs/version-v2.2.3/core/what-is-metadata.md (1 hunks)
  • versioned_docs/version-v2.2.3/dapps/mytokentracker.md (1 hunks)
  • versioned_docs/version-v2.2.3/dapps/rpch.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/BoomerangChat.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/IframeLoader.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/RPSGame.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/WebSocketHandler.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/atoms/ClusterHelper.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/atoms/Connector.jsx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/components/utils.js (1 hunks)
  • versioned_docs/version-v2.2.3/developers/heartbeat.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/hooks/useWebSockets.js (1 hunks)
  • versioned_docs/version-v2.2.3/developers/intro.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/network-registry.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/rest-api.mdx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/smart-contract.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/snippets.mdx (1 hunks)
  • versioned_docs/version-v2.2.3/developers/snippets/WebSocketHandler.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/snippets/getHeaders.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/snippets/useWebSocket.md (1 hunks)
  • versioned_docs/version-v2.2.3/developers/starting-local-cluster.md (1 hunks)
  • versioned_docs/version-v2.2.3/glossary.md (1 hunks)
  • versioned_docs/version-v2.2.3/intro.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/ac-migration-from-legacy.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/backup-restore-update.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/custom-rpc-provider.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/fast-sync.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/frequently-asked-questions.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/interaction-with-node.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/manage-node-strategies.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/monitoring-tools.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/multiple-nodes.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/node-dappnode.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/node-docker-compose.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/node-docker.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/node-management-admin-ui.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/node-operations.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/port-forwarding.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/releases.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/run-a-node-overview.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/staking-hub.md (1 hunks)
  • versioned_docs/version-v2.2.3/node/troubleshooting.md (1 hunks)
  • versioned_docs/version-v2.2.3/token/acquiring-hopr-tokens.md (1 hunks)
  • versioned_docs/version-v2.2.3/token/cover-traffic-economics.md (1 hunks)
  • versioned_docs/version-v2.2.3/token/safestaking.md (1 hunks)
  • versioned_docs/version-v2.2.3/token/token-bridging.md (1 hunks)
  • versioned_docs/version-v2.2.3/token/token-wrapping.md (1 hunks)
  • versioned_sidebars/version-v2.2.3-sidebars.json (1 hunks)
  • versions.json (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • versioned_docs/version-v2.2.3/node/monitoring-tools.md
  • versioned_docs/version-v2.2.3/intro.md
  • versions.json
  • versioned_docs/version-v2.2.3/developers/rest-api.mdx
🧰 Additional context used
🧠 Learnings (1)
versioned_docs/version-v2.2.3/node/node-docker-compose.md (1)
Learnt from: Jaguaras
PR: hoprnet/hopr-docs#142
File: versioned_docs/version-v2.1.5/node/node-docker-compose.md:22-22
Timestamp: 2024-11-22T22:15:16.713Z
Learning: In the `versioned_docs/version-v2.1.5/node/node-docker-compose.md` file of the `hoprnet/hopr-docs` repository, the latest Docker Compose version is only available on the master branch, and not on any release tags.
🪛 LanguageTool
versioned_docs/version-v2.2.3/node/staking-hub.md

[uncategorized] ~16-~16: Consider adding a hyphen.
Context: ...are on the Gnosis Chain network. In the top right corner, click "Connect Wallet", and...

(TOP_LEFT_CORNER)


[style] ~49-~49: This phrase might be redundant. Consider either removing or replacing the adjective ‘additional’.
Context: ...g) --- ## Add additional node Before adding an additional node, ensure you have allocated enough stake...

(ADD_AN_ADDITIONAL)


[uncategorized] ~75-~75: Consider adding a hyphen.
Context: ...f you see a "Connect" button in the top right corner and don't see your Safe owner wa...

(TOP_LEFT_CORNER)


[uncategorized] ~79-~79: Consider adding a hyphen.
Context: ...e-global-connected.png) (6) In the top right corner, just to the left of your connec...

(TOP_LEFT_CORNER)


[style] ~101-~101: This phrase might be redundant. Consider either removing or replacing the adjective ‘additional’.
Context: ...de/safe-wallet-confirm-tx.png) --- ## Adding an additional owner to your HOPR Safe account (1) Conn...

(ADD_AN_ADDITIONAL)


[style] ~111-~111: Consider a more expressive alternative.
Context: ...tions if one wallet is compromised. To do this, change the "**Required confirmati...

(DO_ACHIEVE)


[uncategorized] ~123-~123: Consider adding a hyphen.
Context: ...Safe wallet you want to manage from the top right corner. On the left-hand side, click "...

(TOP_LEFT_CORNER)

versioned_docs/version-v2.2.3/core/tickets-and-payment-channels.md

[style] ~17-~17: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...ements discussed in previous episodes. But a public blockchain creates two problem...

(REP_SENT_START_BUT)


[uncategorized] ~34-~34: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ommon technique in crypto to reduce the amount of transactions needed. Two users fund ...

(AMOUNTOF_TO_NUMBEROF)


[style] ~48-~48: Consider an alternative to strengthen your wording.
Context: ...o not yet have ticket aggregation). ## Further Improvements Using payment channels and tickets goe...

(IMPROVEMENTS_REFINEMENTS)

versioned_docs/version-v2.2.3/core/anonymous-routing.md

[formatting] ~26-~26: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...ng**. It’s also what gives HOPR its name, because data ‘hops’ from one person to the next...

(COMMA_BEFORE_BECAUSE)


[typographical] ~28-~28: Consider adding a comma after this introductory phrase.
Context: ... This is quite a good system, and for a human it would already be too complicated to ...

(AS_A_NN_COMMA)


[grammar] ~28-~28: Did you mean “whom”?
Context: ...ted to track who is sending messages to who. But with enough analysis power it’s st...

(IN_WHO)


[formatting] ~28-~28: Consider inserting a comma here, unless the first half is essential to the meaning of the sentence.
Context: ...ssages to who. But with enough analysis power it’s still possible to crack networks l...

(WITH_THAT_COMMA)


[style] ~32-~32: As a shorter alternative for ‘able to’, consider using “can”.
Context: ...ized network it’s important that anyone is able to join. This is crucial for freedom, but ...

(BE_ABLE_TO)

versioned_docs/version-v2.2.3/node/frequently-asked-questions.md

[uncategorized] ~40-~40: Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...PRd node, you need a static or public IP so other peers can reach you on the networ...

(COMMA_COMPOUND_SENTENCE_2)


[uncategorized] ~73-~73: Consider adding a hyphen.
Context: ... (2) Click the colorful icon in the top right corner and find "DAppNode Identity". Lo...

(TOP_LEFT_CORNER)

versioned_docs/version-v2.2.3/dapps/mytokentracker.md

[uncategorized] ~7-~7: Possible missing comma found.
Context: ...r --- ## What does MyTokenTracker do? MyTokenTracker which is built on the top of the HOPR p...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~8-~8: A comma might be missing here.
Context: ...r which is built on the top of the HOPR protocol shows how Ethereum (d)app users can be ...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)

versioned_docs/version-v2.2.3/core/probabilistic-payments.md

[grammar] ~6-~6: If the situation that you’re describing is mandatory or essential, you can use the subjunctive mood here.
Context: ...s essential that blockchain integration doesn’t compromise the metadata privacy of t...

(SUBJUNCTIVE_MOOD)


[uncategorized] ~20-~20: A comma might be missing here.
Context: ...bout the underlying message layer. Now instead imagine that each ticket has a 1% chanc...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[style] ~22-~22: ‘none at all’ might be wordy. Consider a shorter alternative.
Context: ...ckets might include several winners, or none at all. In the very short run, this introduces...

(EN_WORDINESS_PREMIUM_NONE_AT_ALL)

versioned_docs/version-v2.2.3/core/mixnets.md

[uncategorized] ~25-~25: A comma might be missing here.
Context: ...e. As the packets come into the node in groups they are split apart, recombined, and t...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[typographical] ~34-~34: Consider adding a comma but only if you want to indicate a pause in casual speech.
Context: ...n is within reach. ## Problem Solved? So is this the solution then? Unfortunatel...

(SO_COMMA)


[uncategorized] ~37-~37: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...ovide payments for data transfers which don’t undo all the strong privacy work we’...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)

versioned_docs/version-v2.2.3/core/what-is-hopr.md

[style] ~10-~10: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...to see this list? Your boss? Your bank? Your insurance company? What about everyone ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~11-~11: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...t the past year. Now make it a decade. Now make it everything you’ve ever done onl...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~14-~14: Did you mean “whom”?
Context: ... about what you’re sending, when, and who to — is all available to be hacked and ...

(WHO_TO_WHOM_TO)

versioned_docs/version-v2.2.3/node/custom-rpc-provider.md

[style] ~23-~23: ‘necessary requirements’ might be wordy. Consider a shorter alternative.
Context: ...ts. Ensure that your hardware meets the necessary requirements: - [EL requirements](https://docs.sedg...

(EN_WORDINESS_PREMIUM_NECESSARY_REQUIREMENTS)

versioned_docs/version-v2.2.3/core/what-is-metadata.md

[style] ~10-~10: Consider using “lot”.
Context: ...cture of what you do online and learn a whole lot about your life offline. This is possib...

(WHOLE_LOT)


[style] ~16-~16: To elevate your writing, try using a synonym here.
Context: ... the package is wrapped, it’s still not hard to guess what’s inside! ## Why Does Co...

(HARD_TO)


[typographical] ~20-~20: Consider adding a comma after ‘Unfortunately’ for more clarity.
Context: ...g created, or at least make it private? Unfortunately it’s not that simple: public metadata i...

(RB_LY_COMMA)


[style] ~22-~22: This phrasing can be overused. Try elevating your writing with a more formal alternative.
Context: ...ress information can be read by anyone. If they want to, they can make a note of where the enve...

(IF_YOU_WANT)

versioned_docs/version-v2.2.3/developers/snippets.mdx

[grammar] ~12-~12: Did you mean “doing”? Or maybe you should add a pronoun? In active voice, ‘require’ + ‘to’ takes an object, usually a pronoun.
Context: ...nctions Most HOPR applications require to do at least one of the following actions: ...

(ALLOW_TO)


[style] ~19-~19: This phrasing can be wordy. For improved clarity, try opting for something more concise.
Context: ...entually be included in an SDK[^1], but for the time being, having them here is the easiest and fa...

(FOR_THE_TIME_BEING)


[uncategorized] ~84-~84: This expression is ususally spelled with a hyphen
Context: ...th your terminal, Python or JS. HOPR is code agnostic so any language would work, you could e...

(SPECIFIC_HYPHEN)


[uncategorized] ~84-~84: Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...nal, Python or JS. HOPR is code agnostic so any language would work, you could even...

(COMMA_COMPOUND_SENTENCE_2)

versioned_docs/version-v2.2.3/node/node-dappnode.md

[uncategorized] ~68-~68: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cred...

(TOP_LEFT_CORNER)


[style] ~71-~71: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...tp://node.hopr.public.dappnode:3001`. - In the API token field, it will be emp...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

versioned_docs/version-v2.2.3/node/node-docker-compose.md

[uncategorized] ~50-~50: Possible missing comma found.
Context: ...r docker command with your own security token which is required to connect to your no...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/node/manage-node-strategies.md

[uncategorized] ~231-~231: Possible missing comma found.
Context: ...ptions.quality_bad_threshold` | Quality threshold since a node is considered having "**ba...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~257-~257: When ‘Blockchain-specific’ is used as a modifier, it is usually spelled with a hyphen.
Context: ...pecified in seconds. | ### hopr.chain Blockchain specific configuration. ```md chain: provid...

(SPECIFIC_HYPHEN)


[formatting] ~426-~426: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...**" strategy. ##### strategy.strategies: !Promiscuous Defines a promiscuous strat...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~440-~440: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...ver syntax. | ##### strategy.strategies: !AutoFunding Automatically funds channel...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~449-~449: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...lly funded. | ##### strategy.strategies: !Aggregating Automatically aggregates ti...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~460-~460: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...e**" state. | ##### strategy.strategies: !AutoRedeeming Automatically aggregates ...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~469-~469: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ... their value. ##### strategy.strategies: !Passive A strategy that does nothing. T...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~473-~473: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...array empty. ##### strategy.strategiesc: !ClosureFinalizer Monitors channels in t...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~479-~479: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ave been overdue for more than provided amount of seconds. |

(AMOUNTOF_TO_NUMBEROF)

versioned_docs/version-v2.2.3/core/balancing-cover-traffic.md

[style] ~8-~8: The phrase ‘a lot of’ might be wordy and overused. Consider using an alternative.
Context: ... Tying Cover Traffic to staking solves a lot of problems, but it also introduces new wr...

(A_LOT_OF)


[grammar] ~12-~12: Before the countable noun ‘between’ an article or a possessive pronoun is necessary.
Context: ...publicly available. If the link between stake and receiving Cover Traffic rewards is ...

(IN_NN_CC_VBG)


[uncategorized] ~14-~14: You might be missing the article “the” here.
Context: ... is NOT a direct link between stake and amount of Cover Traffic received, then what’s ...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~16-~16: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...he assets necessary to run and maintain high quality nodes — this isn’t necessarily true. Wh...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~16-~16: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ad nodes. We also don’t want to cut out high quality nodes with lower stakes. This last poi...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[uncategorized] ~24-~24: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: .... Each Cover Traffic node has a certain amount of packets to transmit, and associated ...

(AMOUNTOF_TO_NUMBEROF)


[style] ~26-~26: Style-wise, it’s not ideal to insert an adverb (‘properly’) in the middle of an infinitive construction (‘to relay’). Try moving the adverb to avoid split infinitives.
Context: ...ver Traffic, but if it drops offline or fails to properly relay a packet, it will take several cycles of repeate...

(SPLIT_INFINITIVE)


[uncategorized] ~30-~30: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ks the link between amount of stake and amount of rewards received. This is similar to...

(AMOUNTOF_TO_NUMBEROF)


[style] ~30-~30: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...ppens so frequently that the randomness very quickly averages out from a node runner’s persp...

(EN_WEAK_ADJECTIVE)


[style] ~31-~31: ‘In brief’ might be wordy. Consider a shorter alternative.
Context: ...et if they run a node for long enough. In brief, this weighting approach to routing wil...

(EN_WORDINESS_PREMIUM_IN_BRIEF)

versioned_docs/version-v2.2.3/node/node-management-admin-ui.md

[uncategorized] ~60-~60: Consider adding a hyphen.
Context: ...nect to your HOPR node. (1) In the top right corner of the initial HOPR Admin UI scr...

(TOP_LEFT_CORNER)


[uncategorized] ~188-~188: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... If you haven't found a node on the list and you want to ping it, you'll find the **...

(COMMA_COMPOUND_SENTENCE)


[style] ~190-~190: The phrase ‘have the ability to’ might be wordy. Consider using “can”.
Context: ...f it's not on your node list. You also have the ability to export the entire list of peers to a CS...

(HAS_THE_ABILITY_TO)


[uncategorized] ~196-~196: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ... give an address a more memorable name. Also you can import / export a list of all c...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[formatting] ~208-~208: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...irect message means it is free of charge, because it is not mixed or private.
- **a...

(COMMA_BEFORE_BECAUSE)

versioned_docs/version-v2.2.3/node/backup-restore-update.md

[grammar] ~9-~9: The word ‘Backup’ is a noun. Do you mean the verb “Back up”?
Context: ...port TabItem from '@theme/TabItem'; ## Backup your node identity Please select a pla...

(SENT_START_BACKUP)


[grammar] ~11-~11: The word “backup” is a noun. The verb is spelled with a white space.
Context: ...e identity Please select a platform to backup your node identity: <TabItem va...

(NOUN_VERB_CONFUSION)


[style] ~162-~162: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ed under the "heartbeat" heading. - Locate and remove the entire "**network_option...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~183-~183: It appears that hyphens are missing in the adjective “up-to-date”.
Context: ...5*) Ensure your configuration file is up to date by applying the [latest configuration f...

(UP_TO_DATE_HYPHEN)

versioned_docs/version-v2.2.3/node/port-forwarding.md

[grammar] ~15-~15: Please double-check that the subject and verb are in the correct order to formulate a question.
Context: ...om outside your local network. ## When you don't need to set up port forwarding? - If y...

(HOW_YOU_ARE)


[grammar] ~67-~67: The usual preposition to use with “corner” is “in”, not “on”. Did you mean “in the top right corner”?
Context: ...ect to your Dappnode dashboard (2) On the top right corner, click on the rounded pixeled circle (4...

(ON_IN_THE_CORNER)

versioned_docs/version-v2.2.3/node/node-docker.md

[uncategorized] ~163-~163: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cre...

(TOP_LEFT_CORNER)

versioned_docs/version-v2.2.3/developers/starting-local-cluster.md

[duplication] ~16-~16: Possible typo: you repeated a word.
Context: ...d packet relaying. ## Requirements :::info INFO MacOS M1 users will need to follow an ...

(ENGLISH_WORD_REPEAT_RULE)


[misspelling] ~41-~41: This word is normally spelled with a hyphen.
Context: ...system you are using, as Windows is not well supported/tested with our local setup. ## Local ...

(EN_COMPOUNDS_WELL_SUPPORTED)


[style] ~45-~45: ‘on a daily basis’ might be wordy. Consider a shorter alternative.
Context: ...tup to the one the HOPR team works with on a daily basis. After all dependencies are installed, ...

(EN_WORDINESS_PREMIUM_ON_A_DAILY_BASIS)


[style] ~58-~58: Consider a shorter alternative to avoid wordiness.
Context: ...dencies of the project and build it**: In order to install and build the required packages...

(IN_ORDER_TO_PREMIUM)


[typographical] ~63-~63: Consider adding a comma after ‘Ideally’ for more clarity.
Context: ...ang.org/tools/install) (at least 1.60) Ideally you will also have basic development to...

(RB_LY_COMMA)


[typographical] ~64-~64: If specifying a range, consider using an en dash instead of a hyphen.
Context: ...nd that this process will take at least 5-10 minutes depending on your computer. ``...

(HYPHEN_TO_EN)


[uncategorized] ~64-~64: Possible missing comma found.
Context: ...at this process will take at least 5-10 minutes depending on your computer. ```bash ma...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~72-~72: Possible missing comma found.
Context: ...ine setup script**: Before running the script make sure you have: - Both curl and ...

(AI_HYDRA_LEO_MISSING_COMMA)


[typographical] ~84-~84: If specifying a range, consider using an en dash instead of a hyphen.
Context: ...n average, the process can take between 2-6 minutes, depending on your computer. I...

(HYPHEN_TO_EN)


[uncategorized] ~95-~95: Possible missing comma found.
Context: ...be communicating with the local cluster nodes as it will set up all the environment v...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~111-~111: ‘on a daily basis’ might be wordy. Consider a shorter alternative.
Context: ...similar setup to what the HOPR devs use on a daily basis. 1. **Make sure you have Docker insta...

(EN_WORDINESS_PREMIUM_ON_A_DAILY_BASIS)


[uncategorized] ~147-~147: Possible missing comma found.
Context: ...be communicating with the local cluster nodes as it will set up all the environment v...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~174-~174: Consider using a different adjective in this context to strengthen your wording.
Context: ...tes at a time before closing. This is a good alternative for testing and devloping d...

(GOOD_ALTERNATIVE)


[uncategorized] ~174-~174: It seems likely that a singular genitive (’s) apostrophe is missing.
Context: ...ing and devloping dApps. Simply use the nodes API URL and key when connecting to a no...

(AI_HYDRA_LEO_APOSTROPHE_S_XS)


[grammar] ~189-~189: Did you mean “you are”, “yours are” or “your”?
Context: ... do anything else. However, in the case your are only starting to develop in node.js, ...

(YOUR_RE)


[style] ~189-~189: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ... Linux-based OS, you will likely also need to install build-essentials (e.g. in Ubu...

(REP_NEED_TO_VB)

versioned_docs/version-v2.2.3/node/ac-migration-from-legacy.md

[grammar] ~16-~16: The word “backup” is a noun. The verb is spelled with a white space.
Context: ...n your Avado device, make sure to first backup any data if you are running a validator...

(NOUN_VERB_CONFUSION)

versioned_docs/version-v2.2.3/node/troubleshooting.md

[uncategorized] ~23-~23: Consider adding a hyphen.
Context: ...or the HOPR Admin UI version, check the bottom right corner of the interface. The most recen...

(TOP_LEFT_CORNER)


[uncategorized] ~51-~51: The adjective “above-mentioned” is spelled with a hyphen.
Context: ... community nodes. Note: If one of above mentioned steps doesn't meet requirements, please...

(ABOVE_MENTIONED)


[typographical] ~97-~97: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ...is a payment channel with more than 34 - 35 wxHOPR in unredeemed tokens. If so,...

(DASH_RULE)


[typographical] ~99-~99: If you want to indicate numerical ranges or time ranges, consider using an en dash.
Context: ... no payment channels have more than 34 - 35 wxHOPR in unredeemed tokens, close ...

(DASH_RULE)


[uncategorized] ~142-~142: Possible missing comma found.
Context: ...Refer to this guide for detailed backup instructions follow this [guide](./backup-restore-up...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~163-~163: Possible missing comma found.
Context: ...Refer to this guide for detailed backup instructions follow this [guide](./backup-restore-up...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~309-~309: There seems to be a noun/verb agreement error (not necessarily with the noun that is immediately before ‘network’).
Context: ...appNodeWifi" and my Avado Wi-Fi network don't appear in my computer's Wi-Fi list? </s...

(SINGULAR_NOUN_AGREEMENT_DONT)


[grammar] ~325-~325: “Windows” (operating system by Microsoft) is a proper noun and needs to be capitalized.
Context: ...he following command into your terminal/windows powershell: ```md ssh dappnode@<avado_...

(A_WINDOWS)


[uncategorized] ~515-~515: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...if my DappNode isn't reachable via Wi-Fi and I've forgotten the SSH password? </summ...

(COMMA_COMPOUND_SENTENCE)


[grammar] ~518-~518: The word ‘reinstall’ is not a noun.
Context: ...lly connect to the device and perform a reinstall of the DappNode software. #### 1. Prer...

(A_INSTALL)

versioned_docs/version-v2.2.3/token/safestaking.md

[style] ~8-~8: Consider an alternative for the overused word “exactly”.
Context: ...eir individual risk tolerances. This is exactly what SafeStaking is designed to do. ##...

(EXACTLY_PRECISELY)


[style] ~24-~24: ‘pick and choose’ might be wordy. Consider a shorter alternative.
Context: ... or any combination in between. You can pick and choose which keys are needed to send messages ...

(EN_WORDINESS_PREMIUM_PICK_AND_CHOOSE)


[style] ~36-~36: Consider using “formerly” to strengthen your wording.
Context: ...ng Safe? Safe (previously known as Gnosis Safe) is a smart accoun...

(PREVIOUSLY_FORMERLY)


[grammar] ~40-~40: Make sure that ‘use to’ is correct. For habitual actions in the past or to mean ‘accustomed to’, use “used to”.
Context: ... a private key, which you keep safe and use to sign transactions and approve the movem...

(USE_TO_VERB)


[style] ~67-~67: Consider using “formerly” to strengthen your wording.
Context: ...se Safe? Safe (previously known as Gnosis Safe) is the most secur...

(PREVIOUSLY_FORMERLY)

versioned_docs/version-v2.2.3/core/cover-traffic-nodes.md

[uncategorized] ~12-~12: Possible missing comma found.
Context: ... In a decentralized network like HOPR, ideally individual nodes would dynamically issu...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~24-~24: After certain verbs like “plan,” the verb that follows is usually in the infinitive form. Did you mean “to defend”?
Context: ... affects everything from route planning to defending against attacks, and even basic concept...

(BEGINNING_TO_ADDING_NARROW)


[formatting] ~24-~24: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...e joining the network. For Cover Traffic, because nodes have a foggy picture of the netwo...

(COMMA_BEFORE_BECAUSE)


[typographical] ~30-~30: Consider adding a comma after ‘Initially’ for more clarity.
Context: ...y having dedicated Cover Traffic nodes. Initially the HOPR Association will run these nod...

(RB_LY_COMMA)

versioned_docs/version-v2.2.3/core/cover-traffic.md

[formatting] ~12-~12: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ... network. This is called “Cover Traffic”, because the arbitrary data provides cover for l...

(COMMA_BEFORE_BECAUSE)

versioned_docs/version-v2.2.3/node/run-a-node-overview.md

[uncategorized] ~34-~34: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...ve carefully read the requirements above and you meet them, please proceed with the ...

(COMMA_COMPOUND_SENTENCE)

versioned_docs/version-v2.2.3/developers/network-registry.md

[uncategorized] ~28-~28: You might be missing the article “the” here.
Context: ...er ID An eligible node runner can call selfRegister(string[] hoprPeerIds) meth...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~32-~32: You might be missing the article “the” here.
Context: ...register a node A node runner can call selfDeregister(string[] hoprPeerIds) me...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[style] ~38-~38: Use ‘will’ instead of ‘going to’ if the following action is certain.
Context: ...any node. The eligibility of an account is not going to be checked unless a sync method for t...

(GOING_TO_WILL)


[uncategorized] ~41-~41: The grammatical number of this noun doesn’t look right. Consider replacing it.
Context: ...ets called. #### Register the peer ID Owner can call `ownerRegister(address[] accou...

(AI_EN_LECTOR_REPLACEMENT_NOUN_NUMBER)


[uncategorized] ~42-~42: You might be missing the article “the” here.
Context: ...## Register the peer ID Owner can call `ownerRegister(address[] accounts, string...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~46-~46: You might be missing the article “the” here.
Context: ... ### Deregister a node Owner can call ownerDeregister(string[] hoprPeerIds) m...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

versioned_docs/version-v2.2.3/node/interaction-with-node.md

[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...epresents the selected node's peer ID. If the ping is unsuccessful, try pinging 5...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~24-~24: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ccessful, try pinging 5-10 other nodes. If you're unable to successfully ping any ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~43-~43: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... you to Betty with 1 wxHOPR staked in it and you will receive a message about the ch...

(COMMA_COMPOUND_SENTENCE)


[style] ~70-~70: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ither Betty or Betty's Peer ID. - In the "Message" field, type the messa...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~71-~71: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...essage you want to send to Betty. - In the "Send mode" field, leave the de...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~81-~81: Consider a shorter alternative to avoid wordiness.
Context: ... Below is an illustration showing that in order to relay a message through Betty’s nod...

(IN_ORDER_TO_PREMIUM)


[style] ~88-~88: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ct your node from the search results. - In the "Message" field, enter the mess...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~89-~89: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ssage you'd like to send to yourself. - In the "Send mode" field, select "**Pa...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~99-~99: Possible missing comma found.
Context: ...final channel from Chao → me is not required as the last HOP of a relay is not incen...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~108-~108: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ct your node from the search results. - In the "Message" field, enter the mess...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~109-~109: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ssage you'd like to send to yourself. - In the "Send mode" field, select "**Pa...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~117-~117: Use a comma before ‘or’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... from you to the receiver. If none exist or you don’t have sufficient funds staked ...

(COMMA_COMPOUND_SENTENCE)


[style] ~122-~122: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ct your node from the search results. - In the "Message" field, enter the mess...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~123-~123: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ssage you'd like to send to yourself. - In the "Send mode" field, select "**Au...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~143-~143: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ct your node from the search results. - In the "Message" field, enter the mess...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~144-~144: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ssage you'd like to send to yourself. - In the "Send mode" field, select "**Pa...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~238-~238: ‘In the long run’ might be wordy. Consider a shorter alternative.
Context: ...are keeping healthy connections funded. In the long run, this means your node will be more acti...

(EN_WORDINESS_PREMIUM_IN_THE_LONG_RUN)


[uncategorized] ~238-~238: Possible missing comma found.
Context: ...ns your node will be more active on the network earning more wxHOPR! When channels are...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/core/proof-of-relay.md

[grammar] ~20-~20: Did you mean “there are no guarantees”?
Context: ...wn the chain. The problem with this is there’s no guarantees. Why not just take the money and not fo...

(THERE_S_MANY)


[style] ~26-~26: You have already used this phrasing in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...nd knows he didn’t receive any payment. But he couldn’t prove it was malicious....

(REP_SENT_START_BUT)


[uncategorized] ~26-~26: The preposition “on” seems more likely in this position than the preposition “in”.
Context: ...ove** it was malicious. Things go wrong in networks all the time! And even if Dmyt...

(AI_EN_LECTOR_REPLACEMENT_PREPOSITION_IN_ON)


[style] ~48-~48: As an alternative to the over-used intensifier ‘extremely’, consider replacing this phrase.
Context: ... ## Preserving Privacy This simple but extremely powerful innovation unlocks a whole world of pos...

(EN_WEAK_ADJECTIVE)


[formatting] ~48-~48: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...xnet that can grow to an unlimited scale, because we don’t have to rely on finding trustw...

(COMMA_BEFORE_BECAUSE)

versioned_docs/version-v2.2.3/core/incentives.md

[uncategorized] ~28-~28: Possible missing comma found.
Context: ...oë. For each packet, Alejandro (or more precisely his node) selects a route which hops th...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/core/network-registry-monte-rosa.md

[style] ~14-~14: Consider using a different verb to strengthen your wording.
Context: ...d for the Monte Rosa release, so please make sure you are eligible and have been register...

(MAKE_SURE_ENSURE)

versioned_docs/version-v2.2.3/node/multiple-nodes.md

[uncategorized] ~101-~101: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cre...

(TOP_LEFT_CORNER)


[uncategorized] ~106-~106: Possible missing article found.
Context: ... button "Connect to the node" where popup should appear with your node address wh...

(AI_HYDRA_LEO_MISSING_A)

🪛 markdownlint-cli2 (0.17.2)
versioned_docs/version-v2.2.3/node/staking-hub.md

40-40: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


41-41: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

versioned_docs/version-v2.2.3/node/frequently-asked-questions.md

36-36: Headings must start at the beginning of the line
null

(MD023, heading-start-left)


75-75: Bare URL used
null

(MD034, no-bare-urls)


121-121: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


122-122: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


123-123: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


124-124: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


151-151: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


157-157: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


188-188: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


190-190: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


238-238: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


239-239: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


243-243: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


251-251: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


255-255: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


263-263: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


264-264: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)


265-265: Unordered list style
Expected: asterisk; Actual: dash

(MD004, ul-style)

versioned_docs/version-v2.2.3/node/custom-rpc-provider.md

60-60: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


62-62: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


66-66: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


68-68: Unordered list indentation
Expected: 0; Actual: 3

(MD007, ul-indent)


76-76: Bare URL used
null

(MD034, no-bare-urls)

versioned_docs/version-v2.2.3/token/token-wrapping.md

45-45: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


49-49: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


55-55: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


61-61: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


67-67: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/developers/starting-local-cluster.md

141-141: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


165-165: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

versioned_docs/version-v2.2.3/node/troubleshooting.md

380-380: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


397-397: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


479-479: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


497-497: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/token/token-bridging.md

84-84: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


88-88: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/developers/network-registry.md

44-44: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/developers/smart-contract.md

36-36: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


62-62: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


82-82: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


82-82: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


103-103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


103-103: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


123-123: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


123-123: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


144-144: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


144-144: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


166-166: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


166-166: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


187-187: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


187-187: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


214-214: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


214-214: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

🪛 Biome (1.9.4)
versioned_docs/version-v2.2.3/developers/components/atoms/ClusterHelper.jsx

[error] 24-33: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)

versioned_docs/version-v2.2.3/developers/components/WebSocketHandler.jsx

[error] 42-42: Missing key property for this element in iterable.

The order of the items may change, and having a key can help React identify which item was moved.
Check the React documentation.

(lint/correctness/useJsxKeyInIterable)

🪛 Gitleaks (8.21.2)
versioned_docs/version-v2.2.3/developers/snippets.mdx

92-94:

(curl-auth-header)


147-148:

(curl-auth-header)


185-186:

(curl-auth-header)


224-225:

(curl-auth-header)


263-264:

(curl-auth-header)


311-313:

(curl-auth-header)


355-357:

(curl-auth-header)


400-402:

(curl-auth-header)

🔇 Additional comments (42)
versioned_docs/version-v2.2.3/node/run-a-node-overview.md (2)

1-8: LGTM! Clear and well-structured introduction.

The document metadata is properly formatted, and the introduction effectively communicates the purpose and requirements for setting up a HOPRd node.


20-23: LGTM! Clear staking requirements.

The staking requirements are well-documented, clearly stating both standard and NFT-holder minimum stake amounts.

versioned_docs/version-v2.2.3/token/token-bridging.md (3)

1-5: LGTM! Well-structured document metadata.

The frontmatter is properly formatted with clear identification and appropriate settings.


7-11: LGTM! Clear imports and introduction.

The component imports are appropriate, and the introduction effectively communicates the document's purpose.


84-88: Ignore duplicate heading warnings.

The duplicate headings for navigation and wallet connection steps are intentional and necessary as they appear in different tabs. This is a false positive from the static analysis tool.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

84-84: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


88-88: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_sidebars/version-v2.2.3-sidebars.json (1)

1-140: Well-structured documentation organization!

The sidebar configuration follows documentation best practices with:

  • Clear hierarchical organization
  • Logical grouping of related topics
  • Consistent structure across different sections
versioned_docs/version-v2.2.3/developers/heartbeat.md (1)

1-5: LGTM!

The document header is well-structured and follows standard markdown documentation format.

versioned_docs/version-v2.2.1/node/fast-sync.md (1)

57-57: LGTM! Improved clarity in file handling instructions.

The changes make the instructions clearer by explicitly mentioning "previously backed-up files" instead of referring to extracted files, which aligns better with the backup process described earlier in the document.

Also applies to: 76-76, 104-104

versioned_docs/version-v2.2.1/node/port-forwarding.md (2)

11-18: LGTM! Clear explanation with important security considerations.

The section effectively explains NAT implications and provides crucial security guidance, particularly regarding REST API port exposure. The warning about securing the REST API port (3001) with a "Secret token" is an essential security practice.

🧰 Tools
🪛 LanguageTool

[grammar] ~15-~15: Please double-check that the subject and verb are in the correct order to formulate a question.
Context: ...om outside your local network. ## When you don't need to set up port forwarding? - If y...

(HOW_YOU_ARE)


83-130: LGTM! Comprehensive gateway discovery instructions.

The section provides accurate commands for all major operating systems to find the router's gateway IP address. The explanations are clear and the expected outputs are well documented.

versioned_docs/version-v2.2.3/node/custom-rpc-provider.md (3)

1-12: LGTM!

The document header and overview section are well-structured and provide clear context about RPC and its importance for HOPRd nodes.


83-97: LGTM!

The DAppNode section provides clear, step-by-step instructions with appropriate links and visual guidance.


109-111: LGTM!

The section appropriately warns users about the reliability concerns of public RPC endpoints.

versioned_docs/version-v2.2.3/node/multiple-nodes.md (1)

1-11: LGTM!

The document metadata and imports are properly structured.

versioned_docs/version-v2.2.3/node/frequently-asked-questions.md (1)

296-350: LGTM!

The waitlist section is well-organized and provides comprehensive information about the waitlist system, prioritization, and application process.

versioned_docs/version-v2.2.3/developers/starting-local-cluster.md (1)

101-101: Consider security implications of exposed API tokens.

The documentation includes an API token (^^LOCAL-testing-123^^) in multiple places. While this appears to be a testing token, consider:

  1. Adding a note that this is strictly for testing purposes
  2. Emphasizing that users should never expose their production API tokens in documentation or code

Also applies to: 153-153, 183-183

versioned_docs/version-v2.2.3/developers/smart-contract.md (2)

1-19: LGTM! Well-structured documentation.

The introduction and lifecycle description provide a clear and accurate overview of the HOPR protocol's main smart contract.


48-227: LGTM! Comprehensive event documentation.

The events are well-documented with clear descriptions and parameter tables.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

62-62: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


82-82: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


82-82: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


103-103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


103-103: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


123-123: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


123-123: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


144-144: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


144-144: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


166-166: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


166-166: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


187-187: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


187-187: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


214-214: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


214-214: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

versioned_docs/version-v2.2.3/core/network-registry-monte-rosa.md (1)

1-10: LGTM! Clear and concise introduction.

The frontmatter and introduction effectively explain the Network Registry's purpose and when it's enabled.

versioned_docs/version-v2.2.3/token/token-wrapping.md (2)

1-9: LGTM!

The frontmatter and imports are correctly structured for a tabbed documentation page.


45-67: Regarding duplicate headings in the documentation.

The static analysis tool flags duplicate headings, but this is intentional due to the tabbed interface structure. Each tab represents a separate flow (wrapping vs unwrapping), so having the same step numbers and similar headings is appropriate for maintaining consistency.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

45-45: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


49-49: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


55-55: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


61-61: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


67-67: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

versioned_docs/version-v2.2.3/token/acquiring-hopr-tokens.md (2)

1-8: LGTM! Clear and informative overview.

The metadata is properly structured, and the overview effectively explains the token's history and the rationale for migrating to Gnosis Chain.


24-37:

❓ Verification inconclusive

Verify exchange links and trading pairs.

The exchange links and trading pairs should be verified to ensure they are active and correct.


🌐 Web query:

Are the following exchanges currently active and supporting HOPR token trading?
1. Uniswap v3 DAI/HOPR pair
2. Coinbase USD/HOPR pair
3. AscendEX USDT/HOPR pair
4. CowSwap WXDAI/HOPR pair
5. Swapr WXDAI/HOPR pair

💡 Result:

HOPR token trading activity varies across different exchanges based on available data:

1. Uniswap v3 DAI/HOPR Pair

Active as of November 2022[8], with $6.8M total value locked (TVL) in the HOPR-DAI pool[8]. However, integration delays on Gnosis Chain persist[8], and no recent updates confirm ongoing activity.

2. Coinbase USD/HOPR Pair

Actively supports HOPR with a current price of $0.0607[4] and a 24-hour trading volume of $49,927[4]. Recent data (February 2025) confirms ongoing trading activity[5][9].

3. AscendEX USDT/HOPR Pair

The most popular exchange for HOPR[4], offering USDT-HOPR trading with $125,586 daily volume[4]. AscendEX’s 2025 review confirms support for spot trading pairs[2][10].

4. CowSwap WXDAI/HOPR Pair

CowSwap aggregates liquidity from decentralized exchanges (DEXs)[3], including Gnosis Chain-based pairs[7]. While no direct mention of WXDAI/HOPR exists in recent data, CowSwap’s infrastructure likely supports this pair if liquidity exists elsewhere[3][7].

5. Swapr WXDAI/HOPR Pair

A portion of HOPR liquidity was moved to Swapr on Gnosis Chain during DAO experiments[8], though no recent updates confirm its current status.

Summary Table

Exchange Pair Status Key Details
Uniswap v3 DAI/HOPR Likely Active $6.8M TVL (as of 2022)[8]
Coinbase USD/HOPR Active $49K daily volume[4][5][9]
AscendEX USDT/HOPR Active Leading exchange for HOPR[4][10]
CowSwap WXDAI/HOPR Indirect Support Aggregates liquidity[3][7]
Swapr WXDAI/HOPR Uncertain No recent updates post-DAO experiment[8]

For real-time verification, check exchange platforms directly due to potential lag in third-party data sources[1][4][10].

Citations:


Action Required: Confirm Exchange Trading Details

After verifying through external data, here are the key points to review:

  • Uniswap v3 (DAI/HOPR): The pair appears to be active based on past data, though there were integration delays noted on the Gnosis chain. Confirm if the link reflects the latest pool activity.
  • Coinbase (USD/HOPR): Trading activity is active with current price and volume data supporting its usage.
  • AscendEX (USDT/HOPR): Verified as a leading active exchange for HOPR token trading.
  • CowSwap (WXDAI/HOPR): While CowSwap aggregates liquidity effectively, there’s no direct confirmation of the WXDAI/HOPR pair’s standalone support. Please double-check if the link directs to the intended trading interface.
  • Swapr (WXDAI/HOPR): Recent data is unclear regarding active support. Verify that the link and trading pair details are up-to-date.

Please review these points and update the documentation accordingly if any discrepancies are found.

versioned_docs/version-v2.2.3/dapps/rpch.md (1)

1-19: LGTM! Well-structured documentation for RPCh.

The documentation clearly explains the purpose, problem statement, and how to get started with RPCh. The embedded video and external link provide good additional resources.

versioned_docs/version-v2.2.1/node/releases.md (1)

14-16: Eligibility Criteria Inconsistency.

The table row for version 2.1.5 still indicates "Yes" for CT rewards, which conflicts with the note stating that nodes running a version lower than 2.2.0 are not eligible. For consistency with the updated eligibility criteria, please update the CT rewards eligibility for version 2.1.5 to "No".

versioned_docs/version-v2.2.3/node/releases.md (1)

12-15: Review release dates.

The release dates are set in the future (2025). Please verify if these are intended dates or should be updated to current/past dates.

versioned_docs/version-v2.2.3/core/mixnets.md (1)

6-38: Well-structured explanation of mixnet technology!

The content provides a clear and comprehensive explanation of mixnet technology, its benefits, and challenges. The use of diagrams effectively illustrates the concepts.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~25-~25: A comma might be missing here.
Context: ...e. As the packets come into the node in groups they are split apart, recombined, and t...

(AI_EN_LECTOR_MISSING_PUNCTUATION_COMMA)


[typographical] ~34-~34: Consider adding a comma but only if you want to indicate a pause in casual speech.
Context: ...n is within reach. ## Problem Solved? So is this the solution then? Unfortunatel...

(SO_COMMA)


[uncategorized] ~37-~37: This verb does not appear to agree with the subject. Consider using a different form.
Context: ...ovide payments for data transfers which don’t undo all the strong privacy work we’...

(AI_EN_LECTOR_REPLACEMENT_VERB_AGREEMENT)

versioned_docs/version-v2.2.3/core/what-is-metadata.md (1)

6-32: Excellent explanation of metadata using relatable examples!

The content effectively explains the concept of metadata using clear analogies and real-world examples. The package visualization helps reinforce the concept.

🧰 Tools
🪛 LanguageTool

[style] ~10-~10: Consider using “lot”.
Context: ...cture of what you do online and learn a whole lot about your life offline. This is possib...

(WHOLE_LOT)


[style] ~16-~16: To elevate your writing, try using a synonym here.
Context: ... the package is wrapped, it’s still not hard to guess what’s inside! ## Why Does Co...

(HARD_TO)


[typographical] ~20-~20: Consider adding a comma after ‘Unfortunately’ for more clarity.
Context: ...g created, or at least make it private? Unfortunately it’s not that simple: public metadata i...

(RB_LY_COMMA)


[style] ~22-~22: This phrasing can be overused. Try elevating your writing with a more formal alternative.
Context: ...ress information can be read by anyone. If they want to, they can make a note of where the enve...

(IF_YOU_WANT)

versioned_docs/version-v2.2.3/core/cover-traffic-nodes.md (1)

6-33: Comprehensive explanation of Cover Traffic nodes and their implementation!

The content effectively explains the role of Cover Traffic nodes, the challenges they address, and the implementation strategy. The progression from problem statement to solution is well-structured.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~12-~12: Possible missing comma found.
Context: ... In a decentralized network like HOPR, ideally individual nodes would dynamically issu...

(AI_HYDRA_LEO_MISSING_COMMA)


[grammar] ~24-~24: After certain verbs like “plan,” the verb that follows is usually in the infinitive form. Did you mean “to defend”?
Context: ... affects everything from route planning to defending against attacks, and even basic concept...

(BEGINNING_TO_ADDING_NARROW)


[formatting] ~24-~24: If the ‘because’ clause is essential to the meaning, do not use a comma before the clause.
Context: ...e joining the network. For Cover Traffic, because nodes have a foggy picture of the netwo...

(COMMA_BEFORE_BECAUSE)


[typographical] ~30-~30: Consider adding a comma after ‘Initially’ for more clarity.
Context: ...y having dedicated Cover Traffic nodes. Initially the HOPR Association will run these nod...

(RB_LY_COMMA)

versioned_docs/version-v2.2.3/token/cover-traffic-economics.md (1)

6-60: Well-structured economic model explanation with clear examples!

The content effectively explains the economic model using practical scenarios and detailed tables. The progression through different scenarios helps understand the implications of staking decisions.

versioned_docs/version-v2.2.3/glossary.md (1)

6-102: Comprehensive and well-organized glossary!

The glossary provides clear definitions for key terms and includes helpful links to detailed documentation. The alphabetical organization makes it easy to navigate.

versioned_docs/version-v2.2.3/core/incentives.md (1)

32-32:

✅ Verification successful

Verify image path and alt text.

The image reference /img/core/mixing_packets.gif should be verified to ensure it exists in the repository and the alt text "Mixing packets" accurately describes the image content.


🏁 Script executed:

#!/bin/bash
# Check if image exists
fd -t f "mixing_packets.gif" static/img/core/

Length of output: 80


Verification Complete: Image Reference and Alt Text Are Valid

  • The image file exists at static/img/core/mixing_packets.gif.
  • The markdown reference (/img/core/mixing_packets.gif) is consistent with the repository’s static assets configuration.
  • The alt text “Mixing packets” is sufficiently descriptive.
versioned_docs/version-v2.2.3/core/anonymous-routing.md (1)

20-20:

✅ Verification successful

Verify image path and alt text.

The image reference /img/core/anonymous_routing.png should be verified to ensure it exists in the repository.


🏁 Script executed:

#!/bin/bash
# Check if image exists
fd -t f "anonymous_routing.png" static/img/core/

Length of output: 86


Image Reference Verified

  • The image reference /img/core/anonymous_routing.png in versioned_docs/version-v2.2.3/core/anonymous-routing.md has been verified to exist in the repository (located at static/img/core/anonymous_routing.png).
  • The alt text "Anonymous routing" appears appropriate. No changes required.
versioned_docs/version-v2.2.3/core/proof-of-relay.md (1)

40-40:

✅ Verification successful

Verify image path and alt text.

The image reference /img/core/proof_of_relay.gif should be verified to ensure it exists in the repository.


🏁 Script executed:

#!/bin/bash
# Check if image exists
fd -t f "proof_of_relay.gif" static/img/core/

Length of output: 80


Image Path and Alt Text Verified

The image file used in ![Proof of Relay](/img/core/proof_of_relay.gif) is present in the repository at static/img/core/proof_of_relay.gif, and the alt text "Proof of Relay" is appropriate. Please ensure that the deployment mapping correctly routes /img/core to static/img/core so that the image displays as expected.

versioned_docs/version-v2.2.3/core/tickets-and-payment-channels.md (1)

38-38:

✅ Verification successful

Verify image path and alt text.

The image reference /img/core/payment_channels.gif should be verified to ensure it exists in the repository.


🏁 Script executed:

#!/bin/bash
# Check if image exists
fd -t f "payment_channels.gif" static/img/core/

Length of output: 84


Action Required: Confirm Image Reference Mapping and Update Alt Text if Needed

  • The image file was verified and exists at static/img/core/payment_channels.gif. Please ensure that your deployment correctly maps this file to the /img/core/payment_channels.gif URL as referenced in the markdown.
  • The current alt text ("Payment channels") is acceptable, but consider providing a more descriptive alt text for improved accessibility if your design guidelines require it.
versioned_docs/version-v2.2.3/node/port-forwarding.md (1)

1-156: LGTM! The documentation is well-structured and comprehensive.

The port forwarding documentation provides clear, platform-specific instructions with helpful examples and visual aids.

🧰 Tools
🪛 LanguageTool

[grammar] ~15-~15: Please double-check that the subject and verb are in the correct order to formulate a question.
Context: ...om outside your local network. ## When you don't need to set up port forwarding? - If y...

(HOW_YOU_ARE)


[grammar] ~67-~67: The usual preposition to use with “corner” is “in”, not “on”. Did you mean “in the top right corner”?
Context: ...ect to your Dappnode dashboard (2) On the top right corner, click on the rounded pixeled circle (4...

(ON_IN_THE_CORNER)

versioned_docs/version-v2.2.3/node/node-dappnode.md (1)

1-89: LGTM! The documentation is comprehensive and user-friendly.

The Dappnode setup documentation provides clear step-by-step instructions with helpful screenshots and important notes.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~68-~68: Consider adding a hyphen.
Context: ...2**) Click "CONNECT TO NODE" in the top right corner. In the popup under "**Node cred...

(TOP_LEFT_CORNER)


[style] ~71-~71: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...tp://node.hopr.public.dappnode:3001`. - In the API token field, it will be emp...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

versioned_docs/version-v2.2.3/token/safestaking.md (1)

1-69: LGTM! The documentation is well-structured and informative.

The SafeStaking documentation provides clear explanations of concepts and architecture with helpful diagrams.

🧰 Tools
🪛 LanguageTool

[style] ~8-~8: Consider an alternative for the overused word “exactly”.
Context: ...eir individual risk tolerances. This is exactly what SafeStaking is designed to do. ##...

(EXACTLY_PRECISELY)


[style] ~24-~24: ‘pick and choose’ might be wordy. Consider a shorter alternative.
Context: ... or any combination in between. You can pick and choose which keys are needed to send messages ...

(EN_WORDINESS_PREMIUM_PICK_AND_CHOOSE)


[style] ~36-~36: Consider using “formerly” to strengthen your wording.
Context: ...ng Safe? Safe (previously known as Gnosis Safe) is a smart accoun...

(PREVIOUSLY_FORMERLY)


[grammar] ~40-~40: Make sure that ‘use to’ is correct. For habitual actions in the past or to mean ‘accustomed to’, use “used to”.
Context: ... a private key, which you keep safe and use to sign transactions and approve the movem...

(USE_TO_VERB)


[style] ~67-~67: Consider using “formerly” to strengthen your wording.
Context: ...se Safe? Safe (previously known as Gnosis Safe) is the most secur...

(PREVIOUSLY_FORMERLY)

versioned_docs/version-v2.2.3/node/node-docker-compose.md (1)

1-123: LGTM! The documentation is comprehensive and well-organized.

The Docker Compose setup documentation provides clear step-by-step instructions with helpful code examples.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~50-~50: Possible missing comma found.
Context: ...r docker command with your own security token which is required to connect to your no...

(AI_HYDRA_LEO_MISSING_COMMA)

versioned_docs/version-v2.2.3/node/fast-sync.md (1)

1-122: LGTM! The documentation is comprehensive and well-organized.

The Fast Sync documentation provides clear, platform-specific instructions with helpful examples and important notes.

versioned_docs/version-v2.2.3/node/node-management-admin-ui.md (1)

1-8: LGTM!

The document structure follows Docusaurus conventions with proper frontmatter and component imports.

versioned_docs/version-v2.2.3/node/node-docker.md (1)

43-45:

❓ Verification inconclusive

Verify Docker command security settings.

The Docker command includes several security-related flags. Let's verify their necessity and potential risks:

  1. --security-opt seccomp=unconfined disables seccomp filtering, which could pose security risks
  2. Memory limit of 2GB might need adjustment based on node requirements

🏁 Script executed:

#!/bin/bash
# Check if seccomp is required and if memory limits are sufficient
docker inspect hoprd --format '{{.HostConfig.SecurityOpt}}' 2>/dev/null
docker stats --no-stream hoprd 2>/dev/null

Length of output: 94


Action Required: Manually Verify Docker Security and Resource Settings

The Docker run command for the "hoprd" container includes risky options—most notably, --security-opt seccomp=unconfined, which disables seccomp filtering and may introduce security vulnerabilities if not strictly necessary. Additionally, the 2GB memory limit should be double-checked against the node's requirements.

  • Verify Security Option: Ensure that disabling seccomp is essential for your workload. Use docker inspect hoprd to confirm the effective security settings.
  • Validate Resource Limits: Double-check that the 2GB memory cap is adequate under expected loads. You can review current usage with docker stats hoprd.
  • Manual Confirmation Required: The test scripts executed did not produce any output. Please manually examine these container settings to avoid unintentional gaps in security and performance.

- tbase = 2s (initial backoff time)
- fbo = 1.5 (backoff factor).

The maximum backoff time is 512 seconds, corresponding to nfail = 5. This mechanism ensures a dynamic trade-off between probing online nodes and minimizing resource consumption for offline nodes.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix mathematical inconsistency in maximum backoff time.

The stated maximum backoff time of 512 seconds at nfail = 5 is inconsistent with the provided formula:

  • Using tbo = 2 * (1.5^5), the result is approximately 15.1875 seconds, not 512 seconds.

Please verify the correct maximum backoff time and update either the formula or the stated maximum.

Comment on lines +41 to +43
```md
docker run --pull always -d --restart on-failure -m 2g --security-opt seccomp=unconfined --platform linux/x86_64 --log-driver json-file --log-opt max-size=100M --log-opt max-file=5 -ti -v $HOME/.hoprd-db-dufour:/app/hoprd-db --name hoprd -p 9091:9091/tcp -p 9091:9091/udp -p 3001:3001 -e RUST_LOG=info europe-west3-docker.pkg.dev/hoprassociation/docker-images/hoprd:stable --network dufour --init --api --announce --identity /app/hoprd-db/.hopr-id-dufour --data /app/hoprd-db --apiHost '0.0.0.0' --apiToken '<YOUR_SECURITY_TOKEN>' --password 'open-sesame-iTwnsPNg0hpagP+o6T0KOwiH9RQ0' --safeAddress <SAFE_WALLET_ADDRESS> --moduleAddress <MODULE_ADDRESS> --host <YOUR_PUBLIC_IP>:9091 --provider <CUSTOM_RPC_PROVIDER>
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider adding security best practices for API tokens.

The Docker commands expose sensitive information like API tokens and passwords. Consider:

  1. Using environment variables or Docker secrets for sensitive values
  2. Adding a note about securing the API token and password

Example using environment variables:

-docker run ... --apiToken '<YOUR_SECURITY_TOKEN>' --password 'open-sesame-iTwnsPNg0hpagP+o6T0KOwiH9RQ0' ...
+docker run ... --apiToken "${HOPR_API_TOKEN}" --password "${HOPR_PASSWORD}" ...

Also applies to: 46-48

| `commitment` | bytes32 | Commitment of the channel, set by the destination node. |
| `ticketEpoch` | uint256 | Ticket epoch of the channel. |
| `ticketIndex` | uint256 | Ticket index of the channel. |
| `status` | enum(ChannelStatus) | The Proof-of-Relay secret. |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix incorrect parameter description.

The description for the status parameter is incorrect. It currently describes "The Proof-of-Relay secret" instead of the channel status enum.

Apply this diff to fix the description:

-| `status`       | enum(ChannelStatus) | The Proof-of-Relay secret.                                                            |
+| `status`       | enum(ChannelStatus) | Current status of the channel (Closed, WaitForCommitment, Open, PendingToClose).      |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| `status` | enum(ChannelStatus) | The Proof-of-Relay secret. |
| `status` | enum(ChannelStatus) | Current status of the channel (Closed, WaitForCommitment, Open, PendingToClose). |


Once you have both the NFT in your staking account and your peerID, you can visit our registration site and enter both details. These are checked automatically, and if you are indeed eligible, your NFT will be staked, your node will be funded with both mHOPR and xDAI, and your details will be added to the Network Registry smart contract.

You can then proceed to (or continue) our tutorial and begin using the hopr-admin!
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add link to tutorial.

The text references a tutorial but doesn't provide a link to it.

Add the actual link to the tutorial. For example:

-You can then proceed to (or continue) our tutorial and begin using the hopr-admin!
+You can then proceed to (or continue) our [tutorial](https://example.com/tutorial) and begin using the hopr-admin!
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
You can then proceed to (or continue) our tutorial and begin using the hopr-admin!
You can then proceed to (or continue) our [tutorial](https://example.com/tutorial) and begin using the hopr-admin!


Users from the waitlist will be added to the registry in blocks of 20. Most of these 20 will be the highest-ranking unregistered participants on the waitlist. But one of every 20 will be given randomly to people further down the list (so you always have a chance of being added even if you don't have the highest rank).

You can view the current waitlist and the registered participants here.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add link to view waitlist.

The text mentions that users can view the waitlist but doesn't provide a link to do so.

Add the actual link to view the waitlist and registered participants. For example:

-You can view the current waitlist and the registered participants here.
+You can view the current waitlist and the registered participants [here](https://example.com/waitlist).
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
You can view the current waitlist and the registered participants here.
You can view the current waitlist and the registered participants [here](https://example.com/waitlist).

if (!socketRef.current) return
socketRef.current.removeEventListener('message', handleReceivedMessage)
}
}, [socketRef.current])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix useEffect dependency array.

Using socketRef.current directly in the dependency array can cause unnecessary re-renders and potential bugs.

-  }, [socketRef.current])
+  }, [socketRef])
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
}, [socketRef.current])
}, [socketRef])

Comment on lines +28 to +35
await fetch(`${httpEndpoint}/api/v2/messages`, {
method: 'POST',
headers: getHeaders(securityToken, true),
body: JSON.stringify({
recipient: address,
body: message
})
}).catch((err) => console.error(err))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance error handling for message sending.

The fetch call only logs errors to console without informing the user or handling retries.

+  const [sendError, setSendError] = useState(null)
+  const [isSending, setIsSending] = useState(false)

   const sendMessage = async () => {
     if (!address) return
+    setIsSending(true)
+    setSendError(null)
     await fetch(`${httpEndpoint}/api/v2/messages`, {
       method: 'POST',
       headers: getHeaders(securityToken, true),
       body: JSON.stringify({
         recipient: address,
         body: message
       })
-    }).catch((err) => console.error(err))
+    })
+      .then(() => setMessage('')) // Clear message on success
+      .catch((err) => {
+        console.error(err)
+        setSendError('Failed to send message')
+      })
+      .finally(() => setIsSending(false))
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
await fetch(`${httpEndpoint}/api/v2/messages`, {
method: 'POST',
headers: getHeaders(securityToken, true),
body: JSON.stringify({
recipient: address,
body: message
})
}).catch((err) => console.error(err))
// Add state definitions at the beginning of your component
const [sendError, setSendError] = useState(null)
const [isSending, setIsSending] = useState(false)
const sendMessage = async () => {
if (!address) return
setIsSending(true)
setSendError(null)
await fetch(`${httpEndpoint}/api/v2/messages`, {
method: 'POST',
headers: getHeaders(securityToken, true),
body: JSON.stringify({
recipient: address,
body: message
})
})
.then(() => setMessage('')) // Clear message on success
.catch((err) => {
console.error(err)
setSendError('Failed to send message')
})
.finally(() => setIsSending(false))
}

Comment on lines +132 to +137
name="referee"
disabled={isReferee}
placeholder={referee}
value={referee}
onChange={(e) => setReferee(e.target.value)}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add validation for referee address input.

The referee address input lacks validation, which could lead to invalid game states.

         <input
           name="referee"
           disabled={isReferee}
           placeholder={referee}
           value={referee}
+          pattern="^[0-9a-fA-F]{64}$"
+          title="Please enter a valid HOPR address (64 hexadecimal characters)"
           onChange={(e) => setReferee(e.target.value)}
+          onInvalid={(e) => e.target.setCustomValidity('Please enter a valid HOPR address')}
+          onInput={(e) => e.target.setCustomValidity('')}
         />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
name="referee"
disabled={isReferee}
placeholder={referee}
value={referee}
onChange={(e) => setReferee(e.target.value)}
/>
<input
name="referee"
disabled={isReferee}
placeholder={referee}
value={referee}
pattern="^[0-9a-fA-F]{64}$"
title="Please enter a valid HOPR address (64 hexadecimal characters)"
onChange={(e) => setReferee(e.target.value)}
onInvalid={(e) => e.target.setCustomValidity('Please enter a valid HOPR address')}
onInput={(e) => e.target.setCustomValidity('')}
/>

Comment on lines +7 to +15
export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
const headers = new Headers()
if (isPost) {
headers.set('Content-Type', 'application/json')
headers.set('Accept-Content', 'application/json')
}
headers.set('Authorization', 'Basic ' + btoa(securityToken))
return headers
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider using a more robust Base64 encoding solution.

The btoa function has limitations with Unicode characters and is not recommended for production use.

Consider using a more robust solution like the buffer module:

-  headers.set('Authorization', 'Basic ' + btoa(securityToken))
+  headers.set('Authorization', 'Basic ' + Buffer.from(securityToken).toString('base64'))
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
const headers = new Headers()
if (isPost) {
headers.set('Content-Type', 'application/json')
headers.set('Accept-Content', 'application/json')
}
headers.set('Authorization', 'Basic ' + btoa(securityToken))
return headers
}
export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
const headers = new Headers()
if (isPost) {
headers.set('Content-Type', 'application/json')
headers.set('Accept-Content', 'application/json')
}
headers.set('Authorization', 'Basic ' + Buffer.from(securityToken).toString('base64'))
return headers
}

---

```js title="getHeaders.js"
export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove hardcoded default security token.

The default value ^^LOCAL-testing-123^^ could be a security risk if not overridden in production.

-export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
+export const getHeaders = (securityToken, isPost = false) => {
+  if (!securityToken) {
+    throw new Error('Security token is required')
+  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const getHeaders = (securityToken = '^^LOCAL-testing-123^^', isPost = false) => {
export const getHeaders = (securityToken, isPost = false) => {
if (!securityToken) {
throw new Error('Security token is required')
}
// ... rest of the function implementation
}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
static/files/hoprd-docker.cfg.yaml (1)

7-7: Verify Aggregation Threshold and Timeout Removal

The aggregation_threshold is now set to 250 (changed from 1000 as per previous defaults). Please verify that this reduction is in line with current operational expectations and load patterns. Also note that the aggregation_timeout parameter has been removed; ensure that this removal is intentional and that downstream processes or defaults will handle timing appropriately.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 728d94c and 2868ec2.

📒 Files selected for processing (2)
  • static/files/hoprd-docker.cfg.yaml (1 hunks)
  • static/files/hoprd.cfg.yaml (1 hunks)
🔇 Additional comments (1)
static/files/hoprd.cfg.yaml (1)

11-11: Confirm Consistency of Aggregation Parameter Updates

The updated aggregation_threshold: 250 aligns with the changes seen in the Docker configuration file. Additionally, the removal of aggregation_timeout must be reviewed to ensure that aggregation process timing is still appropriately managed by the system logic or defaults. Please double-check that these updates are consistently documented and tested across your deployment scenarios.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (11)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md (11)

18-28: Docker Tab Instructions – Spelling & Tone
• In line 20, “specificaly” should be corrected to “specifically”.
• The sentence in line 22 is a bit wordy; consider a more direct phrasing such as:
  “By default, the strategy settings file is pre-configured. If needed, customize it per your requirements (see Understanding Node Strategies for details).”

Suggested diff for line 20:

-(**1**) Download the example file specificaly for Docker: [hoprd-docker.cfg.yaml](pathname:///files/hoprd-docker.cfg.yaml)
+(**1**) Download the example file specifically for Docker: [hoprd-docker.cfg.yaml](pathname:///files/hoprd-docker.cfg.yaml)
🧰 Tools
🪛 LanguageTool

[style] ~22-~22: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


43-53: Docker Compose Guidance Review
The Docker Compose instructions are clear. Again, consider revising the repeated “if you have a clear understanding…” phrasing on line 52 to a more succinct alternative.

🧰 Tools
🪛 LanguageTool

[style] ~52-~52: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


55-78: Dappnode Tab Instructions – Consistency and Tone
The Dappnode instructions clearly outline the steps with supporting images. As with the Docker tab, consider tightening the language on line 59 to reduce wordiness.

🧰 Tools
🪛 LanguageTool

[style] ~59-~59: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


240-255: Protocol Configuration – Minor Language Fix
The protocol configuration is clear. In the table for protocol.outgoing_ticket_winning_prob (line 253), consider adding a determiner (“The outgoing ticket winning probability”) for improved clarity.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~253-~253: A determiner appears to be missing. Consider inserting it.
Context: ... | Outgoing ticket winning probability. Default value is 1. | | `protocol.heartbeat.tim...

(AI_EN_LECTOR_MISSING_DETERMINER)


256-274: Chain Configuration – Hyphenation Note
The chain configuration is comprehensive. In the descriptive text “Blockchain specific configuration” (line 257), please hyphenate to “Blockchain-specific configuration” for consistency.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~257-~257: When ‘Blockchain-specific’ is used as a modifier, it is usually spelled with a hyphen.
Context: ...pecified in seconds. | ### hopr.chain Blockchain specific configuration. ```md chain: provid...

(SPECIFIC_HYPHEN)


275-291: Safe Module Configuration Review
The safe module section is well documented. It would be beneficial to remind users that the provided safe address and module address are placeholders that need to be replaced with actual values.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

288-288: Bare URL used
null

(MD034, no-bare-urls)


307-323: Identity Configuration – Grammar Note
The identity section is comprehensive. Note a small grammatical correction: in line 309, “defining it's on-chain and off-chain keys” should use the possessive “its” instead of the contraction “it’s”.


324-344: API Configuration – Typo Correction
The API configuration is clear; however, in line 343, “TCP lsiten port” should be corrected to “TCP listen port”.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~340-~340: You might be missing the article “a” here.
Context: ...hentication of the REST API. When using custom secret token, it is necessary to use "*...

(AI_EN_LECTOR_MISSING_DETERMINER_A)


345-361: Inbox Configuration – Typo and Formatting
The inbox configuration is well presented. Please correct “maximumm age” (line 359) to “maximum age”. Also, ensure table pipe style consistency if required by markdownlint.


365-367: Node Strategies Introduction Tone
The introductory lines for node strategies effectively guide the reader; however, the exclamation mark in line 365 might be toned down for a more formal documentation style.


473-479: ClosureFinalizer Table Wording
In the ClosureFinalizer settings table, the description for max_closure_overdue (line 475) uses “more than provided amount of seconds.” Consider rephrasing to “more than a specified number of seconds” for improved clarity and grammatical correctness.

🧰 Tools
🪛 LanguageTool

[formatting] ~473-~473: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...array empty. ##### strategy.strategiesc: !ClosureFinalizer Monitors channels in t...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~479-~479: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ave been overdue for more than provided amount of seconds. |

(AMOUNTOF_TO_NUMBEROF)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2868ec2 and 27ed481.

📒 Files selected for processing (1)
  • versioned_docs/version-v2.2.3/node/manage-node-strategies.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
versioned_docs/version-v2.2.3/node/manage-node-strategies.md

[style] ~22-~22: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[style] ~52-~52: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[style] ~59-~59: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[uncategorized] ~253-~253: A determiner appears to be missing. Consider inserting it.
Context: ... | Outgoing ticket winning probability. Default value is 1. | | `protocol.heartbeat.tim...

(AI_EN_LECTOR_MISSING_DETERMINER)


[uncategorized] ~257-~257: When ‘Blockchain-specific’ is used as a modifier, it is usually spelled with a hyphen.
Context: ...pecified in seconds. | ### hopr.chain Blockchain specific configuration. ```md chain: provid...

(SPECIFIC_HYPHEN)


[uncategorized] ~340-~340: You might be missing the article “a” here.
Context: ...hentication of the REST API. When using custom secret token, it is necessary to use "*...

(AI_EN_LECTOR_MISSING_DETERMINER_A)


[formatting] ~426-~426: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...**" strategy. ##### strategy.strategies: !Promiscuous Defines a promiscuous strat...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~440-~440: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...ver syntax. | ##### strategy.strategies: !AutoFunding Automatically funds channel...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~449-~449: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...lly funded. | ##### strategy.strategies: !Aggregating Automatically aggregates ti...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~460-~460: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...e**" state. | ##### strategy.strategies: !AutoRedeeming Automatically aggregates ...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~469-~469: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ... their value. ##### strategy.strategies: !Passive A strategy that does nothing. T...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~473-~473: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...array empty. ##### strategy.strategiesc: !ClosureFinalizer Monitors channels in t...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~479-~479: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ave been overdue for more than provided amount of seconds. |

(AMOUNTOF_TO_NUMBEROF)

🪛 markdownlint-cli2 (0.17.2)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md

288-288: Bare URL used
null

(MD034, no-bare-urls)


467-467: Table pipe style
Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe

(MD055, table-pipe-style)

🔇 Additional comments (23)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md (23)

1-6: YAML Frontmatter Review
The frontmatter is well-structured and includes the required metadata (id, title, toc_min_heading_level, toc_max_heading_level).


8-10: Import Statements Check
The import statements for Tabs and TabItem are clear and conform to the theming requirements.


11-11: Introduction Clarity
The introductory paragraph effectively explains the purpose of node strategies but consider reviewing for conciseness if desired.


13-17: Section Heading and Setup
The heading “Create and apply configuration file to your node” and the prompt “Please select your platform:” clearly guide the reader.


29-34: Docker Command Example Review
The Docker command snippet is comprehensive and well formatted. Please ensure that placeholder values (e.g. <SECRET_TOKEN>, and the example password) are clearly documented as examples and must be replaced with secure production values.


36-40: Post-Command Instructions Clarity
The instructions following the command (lines 36-40) are clear. The note about port adjustments and the step-by-step execution guidance support user clarity.


81-87: Transition to Configuration Settings
The separator and the heading “## Understanding configuration file settings” provide a good transition into the technical details.


87-152: YAML Configuration Example Review
The configuration snippet is well organized and illustrates the complete structure. Sensitive values (e.g. passwords, host addresses) and example placeholders are appropriately shown; ensure that documentation clearly stresses that users must substitute these with secure values in production.


153-156: Link to Default Configuration Note
The note with the link to the latest default configuration file on GitHub is useful.


157-171: hopr.host Configuration Details
The host configuration snippet and accompanying table are clear. The information about including !IPv4 is valuable.


173-189: Database (hopr.db) Configuration Review
The database configuration section is well explained through both the code snippet and the descriptive table.


190-208: Heartbeat Configuration Clarity
The heartbeat configuration is clearly documented with an appropriate code snippet and table.


209-239: Network Options Configuration – Clarification Needed
The network options are detailed and useful; however, the description for network_options.min_delay (“Minimum delay (seconds) will be multiplied by backoff, it will be half the actual minimum value.”) is a bit ambiguous. Please clarify what “half the actual minimum value” means.


292-306: Transport Configuration Check
The transport configuration is succinct and clear.


362-364: Section Separator and Transition
The separator and transition into the “Understanding node strategies” section work well.


368-401: Strategies Configuration Snippet Consistency
The strategies configuration snippet neatly outlines various strategy options. Verify that the parameter values here (for example, for !AutoRedeeming) remain consistent with the detailed documentation that follows.


402-411: Info Block on Token Amounts
The info block clearly explains the 18-decimal-place requirement for HOPR token amounts. This reminder is valuable for avoiding user errors when entering values.


411-417: Explanation of on_fail_continue and allow_recursive
The brief explanations for strategy.on_fail_continue and strategy.allow_recursive are clear.


420-425: Introduction to Detailed Strategy Descriptions
The header “#### strategy.strategies” and subsequent description adequately introduce the detailed breakdown of individual strategies.


426-438: Promiscuous Strategy Documentation
The breakdown of the !Promiscuous strategy is comprehensive. The table clearly explains each setting. Consider adding default values, if available, to further guide users.

🧰 Tools
🪛 LanguageTool

[formatting] ~426-~426: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...**" strategy. ##### strategy.strategies: !Promiscuous Defines a promiscuous strat...

(DOUBLE_PUNCTUATION_PREMIUM)


440-448: AutoFunding Strategy Documentation
The !AutoFunding strategy is explained clearly with an accompanying table.

🧰 Tools
🪛 LanguageTool

[formatting] ~440-~440: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...ver syntax. | ##### strategy.strategies: !AutoFunding Automatically funds channel...

(DOUBLE_PUNCTUATION_PREMIUM)


449-455: Aggregating Strategy Documentation
The !Aggregating strategy details are thorough, with clear default values and descriptions.

🧰 Tools
🪛 LanguageTool

[formatting] ~449-~449: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...lly funded. | ##### strategy.strategies: !Aggregating Automatically aggregates ti...

(DOUBLE_PUNCTUATION_PREMIUM)


469-472: Passive and ClosureFinalizer Strategy Overview
The !Passive strategy is straightforward, and the introductory description for !ClosureFinalizer is clear.

🧰 Tools
🪛 LanguageTool

[formatting] ~469-~469: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ... their value. ##### strategy.strategies: !Passive A strategy that does nothing. T...

(DOUBLE_PUNCTUATION_PREMIUM)

Comment on lines +456 to +462
| `unrealized_balance_ratio` | `0.9` | The percentage of unredeemed ticket value in a channel that, when exceeded, triggers ticket aggregation for that channel. |
| `aggregation_timeout` | | Maximum time to wait for the ticket aggregation to complete. |
| `aggregate_on_channel_close` | `true` | When set to "**true**", the strategy will automatically aggregate tickets in channels that have transitioned to the "**PendingToClose**" state. |

##### strategy.strategies: !AutoRedeeming

Automatically aggregates tickets when the number of unredeemed tickets in a channel exceeds the specified threshold.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

AutoRedeeming Strategy Inconsistency Noted
There is an inconsistency for the minimum_redeem_ticket_value:
• In the primary strategies code block (lines 393-395), the value is "2500000000000000000 HOPR".
• In the detailed table (line 462), the default is given as 30000000000000000000 HOPR.
Please confirm the correct default value and update so that both sections are consistent.

🧰 Tools
🪛 LanguageTool

[formatting] ~460-~460: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...e**" state. | ##### strategy.strategies: !AutoRedeeming Automatically aggregates ...

(DOUBLE_PUNCTUATION_PREMIUM)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md (1)

366-404: 🛠️ Refactor suggestion

Detailed Node Strategies Configuration
The YAML snippet detailing various node strategies (!Promiscuous, !AutoFunding, !Aggregating, !AutoRedeeming, !Passive, and !ClosureFinalizer) is comprehensive.

  • Suggestions:
    • Review punctuation and formatting across strategy headings for consistency.
    • Confirm that default values (for example, the value for minimum_redeem_ticket_value in the !AutoRedeeming strategy) are consistent with other sections of the document.
🧹 Nitpick comments (13)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md (13)

11-11: Clear Introduction of Node Strategies
The introductory paragraph explains the benefits of node strategies. Consider a slight tightening of the language to meet active‐voice style recommendations.


17-27: Clear and Actionable Docker Instructions
The Docker tab steps are detailed and provide a solid step-by-step guide.

  • Suggestion: In step (2), consider a more concise phrasing such as: “If you understand the settings, customize them to match your node’s requirements.”
🧰 Tools
🪛 LanguageTool

[style] ~22-~22: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


28-34: Detailed Docker Command Guidance
The instructions clearly indicate the addition of the --configurationFilePath parameter and present a comprehensive Docker command.

  • Reminder: Verify that placeholder values (e.g. <SECRET_TOKEN>, <YOUR_PUBLIC_IP>, <CUSTOM_RPC_PROVIDER>) are documented as non-production values.

43-53: Docker Compose Section Provides Clear Guidance
The instructions for editing the Docker Compose configuration file are well laid out.

  • Suggestion: Consider rephrasing repetitive text for improved conciseness per style guidelines.
🧰 Tools
🪛 LanguageTool

[style] ~52-~52: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


85-154: Detailed Breakdown of Configuration File Settings
The explanation of the YAML configuration sections is comprehensive and informative.

  • Suggestion: Review phrasing for brevity and ensure consistent punctuation. Also, check markdownlint warnings regarding bare URLs if they apply.

209-239: Comprehensive Network Options Details
The network options section is informative; however, consider revising the description for network_options.quality_bad_threshold to add a missing comma for improved clarity.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~231-~231: Possible missing comma found.
Context: ...ptions.quality_bad_threshold` | Quality threshold since a node is considered having "**ba...

(AI_HYDRA_LEO_MISSING_COMMA)


256-274: Blockchain (chain) Configuration Review
This section clearly describes critical blockchain settings.

  • Suggestion: Use “Blockchain‐specific configuration” (with a hyphen) for improved consistency, and verify that the example provider URL is current.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~257-~257: When ‘Blockchain-specific’ is used as a modifier, it is usually spelled with a hyphen.
Context: ...pecified in seconds. | ### hopr.chain Blockchain specific configuration. ```md chain: provid...

(SPECIFIC_HYPHEN)


324-344: REST API Configuration – Minor Typo Noted
The API configuration section is detailed; however, the description for api.host.port contains a typo (“lsiten” should be “listen”).


426-439: Promiscuous Strategy Documentation
The details for the !Promiscuous strategy, including settings such as max_channels and network_quality_threshold, are clearly explained.

  • Suggestion: Ensure that punctuation at the end of headings and list items is consistent with project style guidelines.
🧰 Tools
🪛 LanguageTool

[formatting] ~426-~426: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...**" strategy. ##### strategy.strategies: !Promiscuous Defines a promiscuous strat...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~438-~438: Possible missing article found.
Context: ... | | minimum_peer_version | Specifies minimum node version of the peer the strategy s...

(AI_HYDRA_LEO_MISSING_THE)


440-448: AutoFunding Strategy Section
The explanation for the !AutoFunding strategy is clear.

  • Suggestion: Address minor punctuation inconsistencies in the header to match the style used throughout the document.
🧰 Tools
🪛 LanguageTool

[formatting] ~440-~440: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...ver syntax. | ##### strategy.strategies: !AutoFunding Automatically funds channel...

(DOUBLE_PUNCTUATION_PREMIUM)


449-458: Aggregating Strategy Documentation Review
The settings for the !Aggregating strategy (e.g., aggregation_threshold and unrealized_balance_ratio) are well explained.

  • Suggestion: Review punctuation consistency in the header and text to align with style recommendations.
🧰 Tools
🪛 LanguageTool

[formatting] ~449-~449: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...lly funded. | ##### strategy.strategies: !Aggregating Automatically aggregates ti...

(DOUBLE_PUNCTUATION_PREMIUM)


460-468: AutoRedeeming Strategy Documentation
The !AutoRedeeming strategy is documented clearly; however, please verify that the default value for minimum_redeem_ticket_value ("2500000000000000000 HOPR") is intended and consistent with other parts of the documentation.

  • Suggestion: Also check punctuation consistency in the heading.
🧰 Tools
🪛 LanguageTool

[formatting] ~460-~460: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...e**" state. | ##### strategy.strategies: !AutoRedeeming Automatically aggregates ...

(DOUBLE_PUNCTUATION_PREMIUM)

🪛 markdownlint-cli2 (0.17.2)

467-467: Table pipe style
Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe

(MD055, table-pipe-style)


469-471: Passive Strategy Section
The description for the !Passive strategy is concise and matches expectations.

  • Suggestion: A quick check on punctuation consistency in the header is recommended.
🧰 Tools
🪛 LanguageTool

[formatting] ~469-~469: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ... their value. ##### strategy.strategies: !Passive A strategy that does nothing. T...

(DOUBLE_PUNCTUATION_PREMIUM)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 27ed481 and a3fd55a.

📒 Files selected for processing (1)
  • versioned_docs/version-v2.2.3/node/manage-node-strategies.md (1 hunks)
🧰 Additional context used
🪛 LanguageTool
versioned_docs/version-v2.2.3/node/manage-node-strategies.md

[style] ~22-~22: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[style] ~52-~52: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[style] ~59-~59: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


[uncategorized] ~231-~231: Possible missing comma found.
Context: ...ptions.quality_bad_threshold` | Quality threshold since a node is considered having "**ba...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~257-~257: When ‘Blockchain-specific’ is used as a modifier, it is usually spelled with a hyphen.
Context: ...pecified in seconds. | ### hopr.chain Blockchain specific configuration. ```md chain: provid...

(SPECIFIC_HYPHEN)


[formatting] ~426-~426: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...**" strategy. ##### strategy.strategies: !Promiscuous Defines a promiscuous strat...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~438-~438: Possible missing article found.
Context: ... | | minimum_peer_version | Specifies minimum node version of the peer the strategy s...

(AI_HYDRA_LEO_MISSING_THE)


[formatting] ~440-~440: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...ver syntax. | ##### strategy.strategies: !AutoFunding Automatically funds channel...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~449-~449: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...lly funded. | ##### strategy.strategies: !Aggregating Automatically aggregates ti...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~460-~460: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...e**" state. | ##### strategy.strategies: !AutoRedeeming Automatically aggregates ...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~469-~469: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ... their value. ##### strategy.strategies: !Passive A strategy that does nothing. T...

(DOUBLE_PUNCTUATION_PREMIUM)


[formatting] ~473-~473: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...array empty. ##### strategy.strategiesc: !ClosureFinalizer Monitors channels in t...

(DOUBLE_PUNCTUATION_PREMIUM)


[uncategorized] ~479-~479: ‘Amount of’ should usually only be used with uncountable or mass nouns. Consider using “number” if this is not the case.
Context: ...ave been overdue for more than provided amount of seconds. |

(AMOUNTOF_TO_NUMBEROF)

🪛 markdownlint-cli2 (0.17.2)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md

288-288: Bare URL used
null

(MD034, no-bare-urls)


467-467: Table pipe style
Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe

(MD055, table-pipe-style)

🔇 Additional comments (21)
versioned_docs/version-v2.2.3/node/manage-node-strategies.md (21)

1-6: YAML Front Matter is Well-Structured
The front matter clearly specifies the document ID, title, and table of contents preferences.


8-10: Consistent Component Imports
The use of Tabs and TabItem components is clean and follows the project’s import conventions.


13-13: Informative Section Title
The title “Create and apply configuration file to your node” is descriptive and sets the right expectations.


15-16: Well-Prompted Platform Selection
The instruction “Please select your platform:” succinctly directs users where needed.


36-40: Additional Docker Steps are Clear
The note about port adjustments and the final execution steps are clearly communicated to the user.


55-78: Comprehensive Dappnode Configuration Instructions
The Dappnode section covers all necessary steps—from downloading the configuration file to using the file manager—and benefits from supporting screenshots.

🧰 Tools
🪛 LanguageTool

[style] ~59-~59: This phrasing can be wordy. Consider using a more active and concise tone.
Context: ...d and works well as is. However, if you have a clear understanding of the settings and their implications, yo...

(CLEARLY_UNDERSTAND)


79-79: Proper Closure of Tabs Component
The closing of the <Tabs> component is correct.


83-83: Introduction to Configuration File Structure
The “Understanding configuration file settings” heading effectively introduces the detailed discussion that follows.


156-172: Clear 'hopr.host' Configuration Section
The section on hopr.host is succinct, and the accompanying YAML snippet along with the table effectively communicates the necessary details.


173-189: Well-Structured Database (hopr.db) Section
The parameters for the database configuration are clearly defined and explained.


190-208: Thorough Heartbeat Configuration Explanation
The heartbeat settings, including the YAML snippet and descriptive table, are clearly presented.


240-255: Clear Protocol Configuration
The protocol section, with its YAML example and detailed description of parameters like outgoing_ticket_winning_prob and heartbeat.timeout, is well done.


275-291: Clear Safe Module Configuration
The safe module section is complete with both YAML and tabular explanations for each parameter.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

288-288: Bare URL used
null

(MD034, no-bare-urls)


292-306: Well-Described Transport Settings
The transport configuration is concise and clear.


307-323: Identity Section is Explicit and Clear
The identity configuration, including file path, password, and the optional private key, is clearly documented.


345-361: Inbox Configuration is Clearly Outlined
The section covering inbox settings is straightforward and well-presented.


364-365: Emphasis on Node Strategies Location
The introduction to node strategies effectively reminds the reader that these configurations live within the file.


406-410: Helpful Token Amount Guidance
The info block effectively clarifies that HOPR token amounts require 18 decimal places. This is valuable context for users adjusting configuration values.


412-415: Explanation for strategy.on_fail_continue is Clear
The description succinctly explains that enabling this setting will allow the system to continue executing subsequent strategies even if one fails.


416-419: Clear Description for strategy.allow_recursive
The explanation for allowing nested strategies is brief and clear.


422-425: Introduction to Strategy Sequence
The brief note outlining that the strategies are executed in order—and that an empty array defaults to !Passive—is clear and informative.

Comment on lines +473 to +477
##### strategy.strategiesc: !ClosureFinalizer

Monitors channels in the "**PendingToClose**" state whose channel closure grace period has elapsed, and issues a channel close transaction on these channels to finalize the closure.

| Settings | Default value | Description |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

ClosureFinalizer Strategy – Heading and Description Consistency
The header is currently written as strategy.strategiesc: !ClosureFinalizer, which appears to be a typo. It should likely be strategy.strategies: !ClosureFinalizer to maintain consistency with the other strategy headings. Additionally, consider rephrasing the description to say “more than the specified number of seconds” instead of “more than provided amount of seconds” to improve clarity.

🧰 Tools
🪛 LanguageTool

[formatting] ~473-~473: These punctuation marks differ from each other. Use only one if you are ending a sentence.
Context: ...array empty. ##### strategy.strategiesc: !ClosureFinalizer Monitors channels in t...

(DOUBLE_PUNCTUATION_PREMIUM)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
static/js/custom.js (1)

1-15: Great implementation for auto-opening details elements from URL fragments!

This is a well-structured script that elegantly handles direct linking to collapsible content. I particularly like:

  • The check for element existence before accessing properties
  • Using lowercase comparison for tag names
  • The smooth scrolling implementation for better UX

Two minor suggestions:

  • Consider adding element.focus() after opening for better accessibility
  • Fix the inconsistent indentation in the closing brackets
document.addEventListener("DOMContentLoaded", () => {
    // Extract the fragment identifier (without the '#' character)
    const hash = window.location.hash.slice(1);
    if (hash) {
      // Find the element with the matching ID
      const element = document.getElementById(hash);
      // Check if the element is a <details> element
      if (element && element.tagName.toLowerCase() === "details") {
        // Open the details element to show its content
        element.open = true;
        // Optionally scroll the details element into view
        element.scrollIntoView({ behavior: "smooth", block: "start" });
+       // Set focus to the element for better accessibility
+       element.focus();
      }
    }
-  });  
+});
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a3fd55a and 8968952.

📒 Files selected for processing (2)
  • docusaurus.config.js (2 hunks)
  • static/js/custom.js (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docusaurus.config.js

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
static/js/custom.js (1)

1-25: Overall implementation looks good with a few suggestions for improvement.

The implementation provides a useful feature that enhances navigation to anchored sections within documentation by automatically opening collapsed <details> elements when navigating to a URL with a hash fragment. This improves user experience by making deep-linked content immediately visible.

Some suggestions for improvement:

  1. Consider using requestAnimationFrame instead of setTimeout for more reliable timing after DOM content is loaded.
  2. Add a fallback for browsers that don't support the smooth scrolling behavior.
  3. Consider adding error handling around the click event to prevent potential exceptions.
document.addEventListener("DOMContentLoaded", function () {
-    // Use a slight delay to ensure the content is fully rendered.
-    setTimeout(function () {
+    // Use requestAnimationFrame for more reliable timing
+    requestAnimationFrame(function () {
      const hash = window.location.hash.slice(1);
      if (hash) {
        const targetH3 = document.getElementById(hash);
        if (targetH3) {
          // If the target element is an <h3>, trigger its click event.
          if (targetH3.tagName.toLowerCase() === "h3") {
+           try {
              targetH3.click();
+           } catch (e) {
+             console.warn("Error triggering click event:", e);
+           }
          }
          // Then, find the closest parent <details> element.
          const detailsParent = targetH3.closest("details");
          if (detailsParent) {
            detailsParent.open = true;
-           detailsParent.scrollIntoView({ behavior: "smooth", block: "start" });
+           // Add fallback for browsers that don't support smooth scrolling
+           try {
+             detailsParent.scrollIntoView({ behavior: "smooth", block: "start" });
+           } catch (e) {
+             detailsParent.scrollIntoView(true);
+           }
          } else {
            console.warn("No parent <details> element found for the target <h3> element.");
          }
        } else {
          console.warn("No element found with ID:", hash);
        }
      }
-    }, 500); // Adjust the delay if necessary
+    });
  });
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8968952 and 2f74ae7.

📒 Files selected for processing (1)
  • static/js/custom.js (1 hunks)
🔇 Additional comments (1)
static/js/custom.js (1)

6-22:

❓ Verification inconclusive

Verify browser compatibility for modern JS methods.

The code uses modern JavaScript methods like closest() which might not be supported in older browsers. Consider adding feature detection or a polyfill for better compatibility.


🏁 Script executed:

#!/bin/bash
# Description: Check browser compatibility for the methods used in custom.js

echo "Browser compatibility for Element.closest():"
echo "IE: Not supported in IE < 16"
echo "Edge: Supported since version 15"
echo "Firefox: Supported since version 35"
echo "Chrome: Supported since version 41"
echo "Safari: Supported since version 9"
echo "Opera: Supported since version 28"

echo -e "\nBrowser compatibility for Element.scrollIntoView() with options:"
echo "IE: Not supported with options"
echo "Edge: Supported since version 79"
echo "Firefox: Supported since version 36"
echo "Chrome: Supported since version 61"
echo "Safari: Supported since version 11"
echo "Opera: Supported since version 48"

Length of output: 1161


Browser Compatibility Considerations:
The current implementation in static/js/custom.js uses modern methods (Element.closest() and Element.scrollIntoView() with options) that are well supported in modern browsers (e.g., Chrome 41/61+, Firefox 35/36+, Safari 9/11+, Edge 15/79+, Opera 28/48+). However, these features are not supported in Internet Explorer. If supporting legacy browsers (like IE) is a requirement, please add feature detection or include polyfills, or document that these methods are only available in modern environments.

  • Verified that Element.closest() is unavailable in IE (< 16).
  • Verified that Element.scrollIntoView() with options is unavailable in IE.
  • Consider implementing fallbacks or polyfills if IE support is needed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
static/js/custom.js (2)

26-32: Consider adding a timeout to the MutationObserver.

While the implementation is solid, consider adding a timeout mechanism to disconnect the observer after a reasonable period (e.g., 5 seconds) to prevent it from running indefinitely if the element never appears.

      const observer = new MutationObserver(() => {
        if (openDetailsForHash()) {
          observer.disconnect();
        }
      });
      observer.observe(document.body, { childList: true, subtree: true });
+     // Ensure observer doesn't run indefinitely
+     setTimeout(() => observer.disconnect(), 5000);

8-10: Consider documenting the expected click behavior.

The code simulates a click on the h3 element without explaining what this click is expected to do. Consider adding a brief comment explaining the purpose of this simulation.

          // Simulate a click on the h3 element.
+         // This triggers any click handlers that might be attached to collapsible headings
          if (targetH3.tagName.toLowerCase() === "h3") {
            targetH3.click();
          }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2f74ae7 and 4d97192.

📒 Files selected for processing (1)
  • static/js/custom.js (1 hunks)
🔇 Additional comments (1)
static/js/custom.js (1)

1-33: LGTM, nice URL fragment handling implementation.

This script elegantly enhances documentation navigation by targeting URL fragments (#section-name) to automatically open relevant <details> elements. The implementation includes:

  1. Proper event handling using DOMContentLoaded
  2. Smart fallback with MutationObserver when elements aren't immediately available
  3. Clean resource management by disconnecting the observer when it's no longer needed
  4. Smooth scrolling for better user experience

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant