Skip to content

Conversation

knst
Copy link
Collaborator

@knst knst commented Sep 26, 2025

What was done?

Regular backports from Bitcoin V24

How Has This Been Tested?

Run unit & functional tests

Breaking Changes

N/A

Checklist:

Go over all the following points, and put an x in all the boxes that apply.

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation
  • I have assigned this pull request to a milestone (for repository code-owners and collaborators only)

@knst knst added this to the 23 milestone Sep 26, 2025
Copy link

This pull request has conflicts, please rebase.

Copy link

github-actions bot commented Sep 26, 2025

✅ No Merge Conflicts Detected

This PR currently has no conflicts with other open PRs.

Copy link

coderabbitai bot commented Sep 26, 2025

Walkthrough

  • CI: Removed --disable-fuzz-binary from BITCOIN_CONFIG in the native Qt5 setup script.
  • Contrib linearize: Deleted multiple legacy endianness/hash helper functions and replaced endianness/hash logic with direct byte-reversal and dash_hash.getPoWHash.
  • Docs: Expanded CJDNS guide, added a release-notes template, and reorganized the release-process with detailed codesigning steps and updated links.
  • RPC: Moved sendrawtransaction and testmempoolaccept implementations/registrations from rawtransaction.cpp to mempool.cpp; several mempool RPCHelpMan declarations made static; adjusted getpeerinfo help text and made relaytxes optional.
  • Tests: Reworked many functional tests to use MiniWallet, added generate* tests into rpc_generate.py, removed rpc_generateblock.py and its runner entry, and updated blocktools to accept raw tx hex directly; ZMQ/interface tests now use MiniWallet.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.38% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title clearly indicates that this pull request backports a series of upstream Bitcoin changes specified by their PR numbers, which accurately reflects the main intent of the changeset.
Description Check ✅ Passed The pull request description states that it performs regular backports from Bitcoin v24 and notes the testing approach, which is directly relevant to the purpose and content of the changeset.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@knst knst marked this pull request as draft September 26, 2025 14:32
Copy link

@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: 2

🧹 Nitpick comments (1)
test/functional/interface_zmq.py (1)

238-240: Consider implementing the TODO for InstantSend testing.

The TODO comment about adding "R" sequence testing for transactions replaced with islocked txes appears to be Dash-specific functionality that should be addressed.

Would you like me to help implement the InstantSend replacement testing or create a GitHub issue to track this enhancement?

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c4a9d82 and b0a9647.

📒 Files selected for processing (17)
  • ci/test/00_setup_env_native_qt5.sh (1 hunks)
  • contrib/linearize/linearize-data.py (2 hunks)
  • contrib/linearize/linearize-hashes.py (1 hunks)
  • doc/build-openbsd.md (1 hunks)
  • doc/cjdns.md (2 hunks)
  • doc/release-notes-empty-template.md (1 hunks)
  • doc/release-notes.md (1 hunks)
  • doc/release-process.md (6 hunks)
  • src/rpc/mempool.cpp (9 hunks)
  • src/rpc/net.cpp (2 hunks)
  • src/rpc/rawtransaction.cpp (0 hunks)
  • test/functional/interface_zmq.py (7 hunks)
  • test/functional/rpc_generate.py (2 hunks)
  • test/functional/rpc_generateblock.py (0 hunks)
  • test/functional/test_framework/blocktools.py (1 hunks)
  • test/functional/test_runner.py (0 hunks)
  • test/functional/wallet_disable.py (1 hunks)
💤 Files with no reviewable changes (3)
  • test/functional/test_runner.py
  • src/rpc/rawtransaction.cpp
  • test/functional/rpc_generateblock.py
🧰 Additional context used
📓 Path-based instructions (5)
test/functional/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Functional tests should be written in Python and placed in test/functional/

Files:

  • test/functional/test_framework/blocktools.py
  • test/functional/interface_zmq.py
  • test/functional/wallet_disable.py
  • test/functional/rpc_generate.py
doc/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:

  • doc/release-notes-empty-template.md
  • doc/cjdns.md
  • doc/build-openbsd.md
  • doc/release-process.md
  • doc/release-notes.md
contrib/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the contrib directory (contributed scripts)

Files:

  • contrib/linearize/linearize-hashes.py
  • contrib/linearize/linearize-data.py
src/**/*.{cpp,h,cc,cxx,hpp}

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.{cpp,h,cc,cxx,hpp}: Dash Core C++ codebase must be written in C++20 and require at least Clang 16 or GCC 11.1
Dash uses unordered_lru_cache for efficient caching with LRU eviction

Files:

  • src/rpc/mempool.cpp
  • src/rpc/net.cpp
ci/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the ci directory (continuous integration)

Files:

  • ci/test/00_setup_env_native_qt5.sh
🧠 Learnings (2)
📓 Common learnings
Learnt from: kwvg
PR: dashpay/dash#6543
File: src/wallet/receive.cpp:240-251
Timestamp: 2025-02-06T14:34:30.466Z
Learning: Pull request #6543 is focused on move-only changes and refactoring, specifically backporting from Bitcoin. Behavior changes should be proposed in separate PRs.
📚 Learning: 2025-07-14T10:11:05.011Z
Learnt from: kwvg
PR: dashpay/dash#6754
File: contrib/containers/guix/docker-compose.yml:18-19
Timestamp: 2025-07-14T10:11:05.011Z
Learning: In the Guix build process for Dash Core, the `guix.sigs` directory requires write access as signatures are written to it during the build process, and `dash-detached-sigs` may be updated with `git pull` operations, so both directories need rw permissions in the Docker volume mounts.

Applied to files:

  • doc/release-process.md
🧬 Code graph analysis (4)
test/functional/test_framework/blocktools.py (1)
test/functional/test_framework/messages.py (1)
  • tx_from_hex (230-232)
src/rpc/mempool.cpp (4)
src/node/transaction.h (1)
  • DEFAULT_MAX_RAW_TX_FEE_RATE (27-61)
src/rpc/server_util.cpp (6)
  • EnsureAnyNodeContext (28-45)
  • EnsureAnyNodeContext (28-28)
  • EnsureMemPool (47-53)
  • EnsureMemPool (47-47)
  • EnsureChainman (87-93)
  • EnsureChainman (87-87)
src/node/transaction.cpp (2)
  • BroadcastTransaction (33-118)
  • BroadcastTransaction (33-33)
src/core_write.cpp (2)
  • ValueFromAmount (36-47)
  • ValueFromAmount (36-36)
test/functional/interface_zmq.py (4)
test/functional/test_framework/wallet.py (3)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • send_self_transfer (212-216)
test/functional/test_framework/test_framework.py (1)
  • sync_all (873-875)
test/functional/test_framework/util.py (2)
  • assert_equal (69-74)
  • assert_raises_rpc_error (132-148)
test/functional/test_framework/blocktools.py (2)
  • create_block (51-73)
  • create_coinbase (175-199)
test/functional/rpc_generate.py (1)
test/functional/test_framework/wallet.py (6)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • get_address (177-179)
  • send_self_transfer (212-216)
  • create_self_transfer (290-309)
  • get_utxo (181-199)
🪛 markdownlint-cli2 (0.18.1)
doc/cjdns.md

34-34: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


37-37: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


40-40: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


46-46: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


49-49: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


52-52: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

doc/build-openbsd.md

34-34: Heading levels should only increment by one level at a time
Expected: h5; Actual: h6

(MD001, heading-increment)


59-59: Heading levels should only increment by one level at a time
Expected: h5; Actual: h6

(MD001, heading-increment)


92-92: Heading levels should only increment by one level at a time
Expected: h4; Actual: h5

(MD001, heading-increment)

doc/release-process.md

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: mac-build / Build source
  • GitHub Check: linux64_sqlite-build / Build source
  • GitHub Check: linux64-build / Build source
  • GitHub Check: linux64_fuzz-build / Build source
  • GitHub Check: win64-build / Build source
  • GitHub Check: x86_64-pc-linux-gnu_multiprocess / Build depends
  • GitHub Check: arm-linux-gnueabihf / Build depends
  • GitHub Check: Lint / Run linters
🔇 Additional comments (39)
doc/release-notes.md (1)

125-125: Trailing newline looks good

No further action needed.

doc/release-notes-empty-template.md (1)

1-99: Template addition looks good

The structure aligns with our existing release note conventions and reads cleanly. No further changes needed.

contrib/linearize/linearize-hashes.py (1)

82-84: Endianness reversal matches prior helper logic

The inline bytes.fromhex(...)[::-1].hex() mirrors the old hex_switchEndian behavior while trimming the extra helper. No issues spotted.

test/functional/test_framework/blocktools.py (1)

67-70: LGTM!

Switching to tx_from_hex keeps this conversion in line with the rest of the test framework and simplifies the branch without altering behavior.

contrib/linearize/linearize-data.py (2)

24-25: Simplified PoW hash reversal looks correct

The direct byte reversal mirrors the previous buf/word reverse helpers while keeping everything in bytes, so comparisons downstream remain unchanged.


41-41: Hashlist byte-order flip is handled cleanly

Using bytes.fromhex(...)[::-1].hex() reliably normalizes the input and preserves the expected lowercase formatting for later lookups.

src/rpc/mempool.cpp (5)

17-17: LGTM! Clean header reorganization.

The addition of util/moneystr.h and the proper namespacing with node::DEFAULT_MAX_RAW_TX_FEE_RATE improve code organization.

Also applies to: 23-23


233-268: Appropriate return type refactoring for MempoolEntryDescription().

Converting from inline function to returning std::vector<RPCResult> improves code organization and reusability across different mempool RPCs.


688-689: Correct RPC category assignments.

The sendrawtransaction and testmempoolaccept RPCs are appropriately categorized under "rawtransactions" to maintain backward compatibility, even though the implementation has moved to mempool.cpp.


26-90: sendrawtransaction RPC fully migrated: rawtransaction.cpp no longer defines the RPC implementation—only a documentation reference remains; the function lives in mempool.cpp.


92-231: testmempoolaccept relocated to mempool.cpp
Removed from rawtransaction.cpp; CRPCCommand registration and client mappings updated accordingly.

test/functional/wallet_disable.py (1)

31-31: LGTM! Fixed inconsistent function call formatting.

The removal of spaces in DisableWalletTest().main() aligns with Python conventions and matches the style used in other test files in the codebase.

src/rpc/net.cpp (2)

102-102: Documentation improvement: "network peer" is more accurate.

Changing from "connected network node" to "connected network peer" better aligns with P2P terminology used throughout the codebase.


127-127: relaytxes remains always present at runtime, so marking it optional has no impact on consumers.

test/functional/interface_zmq.py (5)

25-27: Good integration of MiniWallet for wallet-independent testing.

The addition of MiniWallet import and initialization aligns with Bitcoin Core's effort to reduce dependency on the wallet module in functional tests, making tests more focused and maintainable.

Also applies to: 119-119, 229-229


230-237: Wallet-based transaction generation improves test clarity.

Replacing node RPC calls with wallet.send_self_transfer() makes the test flow clearer and more maintainable. The synchronization after transaction broadcast is properly handled.


277-278: Comprehensive sequence notification testing with wallet transactions.

The test properly validates ZMQ sequence notifications for wallet-generated transactions, including mempool addition ("A") notifications with correct sequence numbers.

Also applies to: 346-370


402-439: Well-structured block conflict eviction test.

The test creates a custom block to mine specific transactions and properly validates the sequence of ZMQ notifications for transaction eviction scenarios. The manual block construction using create_block provides fine control over the test scenario.


455-459: Consistent wallet usage throughout mempool sync test.

The transition to wallet-based transactions maintains test functionality while improving consistency across the test suite.

Also applies to: 483-484, 486-487

ci/test/00_setup_env_native_qt5.sh (1)

18-18: Clarify removal of --disable-fuzz-binary in native_qt5 CI
Since this script doesn’t pass --enable-fuzz, dropping --disable-fuzz-binary likely has no effect—but confirm it’s intentional (fuzz binaries should still only be built in the dedicated fuzz CI) and that CI build times remain acceptable.

test/functional/rpc_generate.py (6)

5-5: LGTM!

Updated docstring to reflect the expanded test coverage of multiple generate RPCs.


8-8: LGTM!

Appropriate import of MiniWallet for wallet-driven test scenarios.


20-22: LGTM!

Test structure now covers comprehensive scenarios for all generate RPCs, including the newly consolidated test_generateblock method.


24-26: LGTM!

Test validates both successful generation to a valid address and proper error handling for invalid addresses.


28-98: Comprehensive generateblock test coverage with proper use of MiniWallet.

The test_generateblock method provides thorough coverage of various scenarios including empty block generation, descriptor handling, mempool interaction, raw transactions, and error conditions. The implementation correctly uses MiniWallet for transaction creation and validation, following the established patterns from the test framework.

Key test scenarios covered:

  • Empty block generation to address and descriptor
  • Combo descriptor support with compressed pubkey
  • Block generation with specific txid and raw transaction
  • Error conditions for out-of-order transactions, missing txids, invalid raw transactions, and invalid addresses/descriptors

99-114: LGTM!

The test_generate method appropriately validates the deprecation behavior and help text for the legacy generate RPC command.

doc/build-openbsd.md (5)

3-3: LGTM!

Clear specification of OpenBSD 7.0 target version provides helpful context for users.


5-27: Well-structured preparation section.

The reorganized structure with clear steps and consolidated dependencies makes the guide more user-friendly. The separation of required and optional dependencies is particularly helpful.


28-66: Excellent distinction between wallet types and GUI dependencies.

The new structure clearly separates descriptor wallet support from legacy wallet support, and provides dedicated sections for optional components like Qt5. This makes it easier for users to understand what they need based on their requirements.


67-114: Comprehensive build configuration examples.

The updated build section provides multiple concrete examples for different use cases, along with important notes about external signer support limitations on OpenBSD. The explicit use of gmake throughout is correct for OpenBSD.


117-135: Improved resource limits guidance.

The reformatted resource limits section with code blocks is much clearer and provides both immediate and persistent solutions for memory limitations.

doc/release-process.md (4)

12-12: LGTM!

The added command for clearing release notes provides a helpful inline reference for maintainers.


86-86: Consistent heading style improvement.

The reorganization from setext-style headings (underlined with = or -) to ATX-style headings (prefixed with #) improves markdown consistency throughout the document. The new structure also provides clearer separation between codesigning steps for different roles.

Also applies to: 94-94, 102-102, 107-107, 117-117, 119-119, 132-132, 144-144, 148-148, 163-163, 168-168, 171-171, 176-176, 186-186


126-126: LGTM!

The updated script path with concrete filename (codesign.p12) makes the codesigning instruction more specific and actionable.


104-104: LGTM!

The updated references to the builder-keys README improve the clarity of verification instructions.

Also applies to: 173-173

doc/cjdns.md (4)

27-27: LGTM!

The updated heading better reflects the expanded content that now includes peer discovery steps.


30-30: LGTM!

The updated installation reference provides a more direct link to the installation instructions.


32-56: Excellent addition of practical peer discovery workflow.

The new content provides actionable steps for users to connect to the CJDNS network using the Hyperboria peers repository. The step-by-step process for running testAvailable.py, selecting peers, and updating the configuration file transforms this from basic documentation into a practical tutorial.


57-66: Enhanced CJDNS launching guidance.

The expanded section now includes concrete examples and validation steps, making it more practical for users. The mention of non-root user setup provides important security guidance.

in contrib/](/contrib/install_db4.sh) like so:
It is not necessary to build wallet functionality to run either `dashd` or `dash-qt`.

###### Descriptor Wallet Support
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Inconsistent heading levels.

The markdown uses h6 headers (######) when h5 would be more appropriate based on the document hierarchy. This creates a skip in heading levels which violates markdown conventions.

Apply this diff to fix the heading levels:

-###### Descriptor Wallet Support
+##### Descriptor Wallet Support

-###### Legacy Wallet Support
+##### Legacy Wallet Support

-###### Qt5
+##### Qt5

Also applies to: 42-42, 59-59

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

34-34: Heading levels should only increment by one level at a time
Expected: h5; Actual: h6

(MD001, heading-increment)

🤖 Prompt for AI Agents
In doc/build-openbsd.md around lines 34, 42, and 59 the headings use h6 markers
("######") but should be h5 ("#####") to maintain correct document hierarchy;
update those three heading lines from six hash characters to five so the heading
levels are consistent with surrounding content.


There are many ways to configure Dash Core, here are a few common examples:

##### Descriptor Wallet and GUI:
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Heading level jump from h3 to h5.

The "Descriptor Wallet and GUI" heading skips from h3 to h5, creating an inconsistent document structure.

Apply this diff to fix the heading level:

-##### Descriptor Wallet and GUI:
+#### Descriptor Wallet and GUI:
📝 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
##### Descriptor Wallet and GUI:
#### Descriptor Wallet and GUI:
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

92-92: Heading levels should only increment by one level at a time
Expected: h4; Actual: h5

(MD001, heading-increment)

🤖 Prompt for AI Agents
doc/build-openbsd.md around line 92: the "Descriptor Wallet and GUI" heading is
currently h5 (starts with '#####') which skips from the previous h3 and breaks
document structure; change the heading level to h4 by replacing the five '#'
with four ('#### Descriptor Wallet and GUI:') so headings progress consistently.

@knst knst marked this pull request as ready for review September 27, 2025 07:50
Copy link

@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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/functional/interface_zmq.py (1)

118-136: Fund MiniWallet before spending

MiniWallet is instantiated but never receives any spendable coins before the first send_self_transfer at Line 230. With an empty UTXO set, MiniWallet.get_utxo() raises StopIteration, so the test fails immediately once the transfer is attempted. Mine and mature coins for the wallet right after creation so subsequent sends have inputs to spend.

     def run_test(self):
         self.wallet = MiniWallet(self.nodes[0])
+        self.generate(self.wallet, 101)
         self.ctx = zmq.Context()
🧹 Nitpick comments (1)
doc/cjdns.md (1)

42-46: Add a language hint to the command block

Markdownlint (MD040) flags this new fenced block because it lacks a language identifier. Labeling it as bash gives readers syntax highlighting and keeps docs lint-clean.

-```
+```bash
 git clone https://github.com/hyperboria/peers hyperboria-peers
 cd hyperboria-peers
 ./testAvailable.py

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used**: CodeRabbit UI

**Review profile**: CHILL

**Plan**: Pro

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between b0a964718f75d677138f3a1787aaae6999bdf5bf and 8f4e764504180117911090a10ec9ff0251ab7b8e.

</details>

<details>
<summary>📒 Files selected for processing (17)</summary>

* `ci/test/00_setup_env_native_qt5.sh` (1 hunks)
* `contrib/linearize/linearize-data.py` (2 hunks)
* `contrib/linearize/linearize-hashes.py` (1 hunks)
* `doc/build-openbsd.md` (1 hunks)
* `doc/cjdns.md` (2 hunks)
* `doc/release-notes-empty-template.md` (1 hunks)
* `doc/release-notes.md` (1 hunks)
* `doc/release-process.md` (6 hunks)
* `src/rpc/mempool.cpp` (9 hunks)
* `src/rpc/net.cpp` (2 hunks)
* `src/rpc/rawtransaction.cpp` (0 hunks)
* `test/functional/interface_zmq.py` (7 hunks)
* `test/functional/rpc_generate.py` (2 hunks)
* `test/functional/rpc_generateblock.py` (0 hunks)
* `test/functional/test_framework/blocktools.py` (1 hunks)
* `test/functional/test_runner.py` (0 hunks)
* `test/functional/wallet_disable.py` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (3)</summary>

* test/functional/rpc_generateblock.py
* src/rpc/rawtransaction.cpp
* test/functional/test_runner.py

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* test/functional/test_framework/blocktools.py
* doc/release-notes.md
* ci/test/00_setup_env_native_qt5.sh

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (4)</summary>

<details>
<summary>doc/**</summary>


**📄 CodeRabbit inference engine (CLAUDE.md)**

> Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:
- `doc/build-openbsd.md`
- `doc/release-process.md`
- `doc/cjdns.md`
- `doc/release-notes-empty-template.md`

</details>
<details>
<summary>contrib/**</summary>


**📄 CodeRabbit inference engine (CLAUDE.md)**

> Unless specifically prompted, avoid making changes to the contrib directory (contributed scripts)

Files:
- `contrib/linearize/linearize-data.py`
- `contrib/linearize/linearize-hashes.py`

</details>
<details>
<summary>test/functional/**/*.py</summary>


**📄 CodeRabbit inference engine (CLAUDE.md)**

> Functional tests should be written in Python and placed in test/functional/

Files:
- `test/functional/interface_zmq.py`
- `test/functional/wallet_disable.py`
- `test/functional/rpc_generate.py`

</details>
<details>
<summary>src/**/*.{cpp,h,cc,cxx,hpp}</summary>


**📄 CodeRabbit inference engine (CLAUDE.md)**

> `src/**/*.{cpp,h,cc,cxx,hpp}`: Dash Core C++ codebase must be written in C++20 and require at least Clang 16 or GCC 11.1
> Dash uses unordered_lru_cache for efficient caching with LRU eviction

Files:
- `src/rpc/mempool.cpp`
- `src/rpc/net.cpp`

</details>

</details><details>
<summary>🧠 Learnings (3)</summary>

<details>
<summary>📓 Common learnings</summary>

Learnt from: kwvg
PR: #6543
File: src/wallet/receive.cpp:240-251
Timestamp: 2025-02-06T14:34:30.466Z
Learning: Pull request #6543 is focused on move-only changes and refactoring, specifically backporting from Bitcoin. Behavior changes should be proposed in separate PRs.


</details>
<details>
<summary>📚 Learning: 2025-08-08T07:01:47.332Z</summary>

Learnt from: knst
PR: #6805
File: src/wallet/rpc/wallet.cpp:357-357
Timestamp: 2025-08-08T07:01:47.332Z
Learning: In src/wallet/rpc/wallet.cpp, the upgradetohd RPC now returns a UniValue string message (RPCResult::Type::STR) instead of a boolean, including guidance about mnemonic backup and null-character passphrase handling; functional tests have been updated to assert returned strings in several cases.


**Applied to files:**
- `src/rpc/mempool.cpp`

</details>
<details>
<summary>📚 Learning: 2025-07-14T10:11:05.011Z</summary>

Learnt from: kwvg
PR: #6754
File: contrib/containers/guix/docker-compose.yml:18-19
Timestamp: 2025-07-14T10:11:05.011Z
Learning: In the Guix build process for Dash Core, the guix.sigs directory requires write access as signatures are written to it during the build process, and dash-detached-sigs may be updated with git pull operations, so both directories need rw permissions in the Docker volume mounts.


**Applied to files:**
- `doc/release-process.md`

</details>

</details><details>
<summary>🧬 Code graph analysis (3)</summary>

<details>
<summary>test/functional/interface_zmq.py (2)</summary><blockquote>

<details>
<summary>test/functional/test_framework/wallet.py (3)</summary>

* `MiniWallet` (75-314)
* `rescan_utxos` (100-118)
* `send_self_transfer` (212-216)

</details>
<details>
<summary>test/functional/test_framework/blocktools.py (2)</summary>

* `create_block` (50-72)
* `create_coinbase` (174-198)

</details>

</blockquote></details>
<details>
<summary>src/rpc/mempool.cpp (6)</summary><blockquote>

<details>
<summary>src/node/transaction.h (1)</summary>

* `DEFAULT_MAX_RAW_TX_FEE_RATE` (27-61)

</details>
<details>
<summary>src/validation.h (2)</summary>

* `node` (60-62)
* `state` (169-194)

</details>
<details>
<summary>src/rpc/server_util.cpp (6)</summary>

* `EnsureAnyNodeContext` (28-45)
* `EnsureAnyNodeContext` (28-28)
* `EnsureMemPool` (47-53)
* `EnsureMemPool` (47-47)
* `EnsureChainman` (87-93)
* `EnsureChainman` (87-87)

</details>
<details>
<summary>src/node/transaction.cpp (2)</summary>

* `BroadcastTransaction` (33-118)
* `BroadcastTransaction` (33-33)

</details>
<details>
<summary>src/validation.cpp (2)</summary>

* `ProcessNewPackage` (1356-1374)
* `ProcessNewPackage` (1356-1357)

</details>
<details>
<summary>src/core_write.cpp (2)</summary>

* `ValueFromAmount` (36-47)
* `ValueFromAmount` (36-36)

</details>

</blockquote></details>
<details>
<summary>test/functional/rpc_generate.py (2)</summary><blockquote>

<details>
<summary>test/functional/test_framework/wallet.py (6)</summary>

* `MiniWallet` (75-314)
* `rescan_utxos` (100-118)
* `get_address` (177-179)
* `send_self_transfer` (212-216)
* `create_self_transfer` (290-309)
* `get_utxo` (181-199)

</details>
<details>
<summary>test/functional/test_framework/util.py (2)</summary>

* `assert_raises_rpc_error` (132-148)
* `assert_equal` (69-74)

</details>

</blockquote></details>

</details><details>
<summary>🪛 markdownlint-cli2 (0.18.1)</summary>

<details>
<summary>doc/build-openbsd.md</summary>

34-34: Heading levels should only increment by one level at a time
Expected: h5; Actual: h6

(MD001, heading-increment)

---

59-59: Heading levels should only increment by one level at a time
Expected: h5; Actual: h6

(MD001, heading-increment)

---

92-92: Heading levels should only increment by one level at a time
Expected: h4; Actual: h5

(MD001, heading-increment)

</details>
<details>
<summary>doc/release-process.md</summary>

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

</details>
<details>
<summary>doc/cjdns.md</summary>

13-13: Bare URL used

(MD034, no-bare-urls)

---

14-14: Bare URL used

(MD034, no-bare-urls)

---

30-30: Bare URL used

(MD034, no-bare-urls)

---

42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

</details>
<details>
<summary>doc/release-notes-empty-template.md</summary>

34-34: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

37-37: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

40-40: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

46-46: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

49-49: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

52-52: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

58-58: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

61-61: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

64-64: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

67-67: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

70-70: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

73-73: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

---

76-76: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

</details>

</details>
<details>
<summary>🪛 Gitleaks (8.28.0)</summary>

<details>
<summary>test/functional/rpc_generate.py</summary>

[high] 47-47: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)</summary>

* GitHub Check: linux64_multiprocess-test / Test source
* GitHub Check: linux64_tsan-test / Test source

</details>

<details>
<summary>🔇 Additional comments (1)</summary><blockquote>

<details>
<summary>doc/build-openbsd.md (1)</summary><blockquote>

`34-60`: **Normalize subsection heading levels**

Lines 34, 42, and 59 still use h6 (`######`) directly under h4 content, repeating the earlier lint violation that was already flagged. Please bump these to h5 to keep the hierarchy consistent.

```diff
-###### Descriptor Wallet Support
+##### Descriptor Wallet Support

-###### Legacy Wallet Support
+##### Legacy Wallet Support

-###### Qt5
+##### Qt5

Comment on lines 38 to 40
``` bash
pkg_add install sqlite3
```
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Correct the pkg_add command for sqlite

Line 39 currently reads pkg_add install sqlite3, but pkg_add doesn't take an install subcommand. As written, the command fails, so users following the guide won't get descriptor-wallet support. Please drop install.

-pkg_add install sqlite3
+pkg_add sqlite3
📝 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
``` bash
pkg_add install sqlite3
```
🤖 Prompt for AI Agents
In doc/build-openbsd.md around lines 38 to 40, the pkg_add invocation is
incorrect: it currently uses an unsupported subcommand ("install") so it fails;
update the line to call pkg_add with the package name only (remove the word
"install") so the command becomes the correct pkg_add invocation for sqlite3.

Copy link

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
doc/release-process.md (1)

151-160: Correct the detached sigs checkout path

Line 151 changes pushd to ~/dashcore-detached-sigs, but earlier in the doc we instruct people to clone dash-detached-sigs. The extra “core” makes the command fail on a fresh setup. Please keep the directory name consistent.

-pushd ~/dashcore-detached-sigs
+pushd ~/dash-detached-sigs
🧹 Nitpick comments (2)
doc/cjdns.md (2)

13-14: Convert bare URLs to Markdown links to satisfy markdownlint.

markdownlint (MD034) flags the bare links you’ve introduced here. Converting them to standard Markdown links keeps the doc lint-clean without changing the content.

-See https://github.com/cjdelisle/cjdns#readme and
-https://github.com/hyperboria/docs#hyperboriadocs for more information.
+See [the CJDNS README](https://github.com/cjdelisle/cjdns#readme) and
+[Hyperboria documentation](https://github.com/hyperboria/docs#hyperboriadocs) for more information.

42-46: Add a shell language hint to the code block.

markdownlint (MD040) prefers fenced code blocks to declare their language. Tagging this snippet as bash keeps the linter happy and improves syntax highlighting.

-```
+```bash
 git clone https://github.com/hyperboria/peers hyperboria-peers
 cd hyperboria-peers
 ./testAvailable.py

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used**: CodeRabbit UI

**Review profile**: CHILL

**Plan**: Pro

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8f4e764504180117911090a10ec9ff0251ab7b8e and 445fd6f44351d089121862d0a75b077f7e0dff44.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `doc/cjdns.md` (2 hunks)
* `doc/release-notes-empty-template.md` (1 hunks)
* `doc/release-notes.md` (1 hunks)
* `doc/release-process.md` (6 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* doc/release-notes.md

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>doc/**</summary>


**📄 CodeRabbit inference engine (CLAUDE.md)**

> Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:
- `doc/release-process.md`
- `doc/release-notes-empty-template.md`
- `doc/cjdns.md`

</details>

</details><details>
<summary>🧠 Learnings (2)</summary>

<details>
<summary>📓 Common learnings</summary>

Learnt from: kwvg
PR: #6543
File: src/wallet/receive.cpp:240-251
Timestamp: 2025-02-06T14:34:30.466Z
Learning: Pull request #6543 is focused on move-only changes and refactoring, specifically backporting from Bitcoin. Behavior changes should be proposed in separate PRs.


</details>
<details>
<summary>📚 Learning: 2025-07-14T10:11:05.011Z</summary>

Learnt from: kwvg
PR: #6754
File: contrib/containers/guix/docker-compose.yml:18-19
Timestamp: 2025-07-14T10:11:05.011Z
Learning: In the Guix build process for Dash Core, the guix.sigs directory requires write access as signatures are written to it during the build process, and dash-detached-sigs may be updated with git pull operations, so both directories need rw permissions in the Docker volume mounts.


**Applied to files:**
- `doc/release-process.md`

</details>

</details><details>
<summary>🪛 markdownlint-cli2 (0.18.1)</summary>

<details>
<summary>doc/release-process.md</summary>

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

---

186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

</details>
<details>
<summary>doc/release-notes-empty-template.md</summary>

13-13: Bare URL used

(MD034, no-bare-urls)

---

14-14: Bare URL used

(MD034, no-bare-urls)

---

30-30: Bare URL used

(MD034, no-bare-urls)

---

42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

---

73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

---

81-81: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)

---

83-83: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)

---

88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

</details>
<details>
<summary>doc/cjdns.md</summary>

13-13: Bare URL used

(MD034, no-bare-urls)

---

14-14: Bare URL used

(MD034, no-bare-urls)

---

30-30: Bare URL used

(MD034, no-bare-urls)

---

42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)</summary>

* GitHub Check: linux64_multiprocess-build / Build source
* GitHub Check: mac-build / Build source
* GitHub Check: arm-linux-build / Build source
* GitHub Check: linux64_nowallet-build / Build source
* GitHub Check: linux64_tsan-build / Build source
* GitHub Check: linux64_fuzz-build / Build source
* GitHub Check: linux64_sqlite-build / Build source
* GitHub Check: linux64-build / Build source
* GitHub Check: linux64_ubsan-build / Build source
* GitHub Check: win64-build / Build source

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

block = node.getblock(hash, 2)
assert_equal(len(block['tx']), 1)
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], combo_address)

Copy link

Choose a reason for hiding this comment

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

24670: missing Generate an empty block to a combo descriptor with uncompressed pubkey test


# Adapt the following for the version you installed (major.minor only):
export AUTOCONF_VERSION=2.71
export AUTOMAKE_VERSION=1.16
Copy link

Choose a reason for hiding this comment

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

24652: this version was bumped in some another PR


Note that building with external signer support currently fails on OpenBSD,
hence you have to explicitly disable it by passing the parameter
`--disable-external-signer` to the configure script. The feature requires the
Copy link

Choose a reason for hiding this comment

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

24652: here and below - we don't have external signer option yet, too early imo, just drop 24652 for now

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

dropped 24652 for now

Comment on lines 22 to 23
installer (on Windows) or just copy over /Applications/Dash-Qt (on Mac) or
dashd/dash-qt (on Linux).
Copy link

Choose a reason for hiding this comment

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

24583:

Suggested change
installer (on Windows) or just copy over /Applications/Dash-Qt (on Mac) or
dashd/dash-qt (on Linux).
installer (on Windows) or just copy over `/Applications/Dash-Qt` (on Mac) or
`dashd`/`dash-qt` (on Linux).

- [v0.9.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.9.0.md) released Mar/13/2014

[set-of-changes]: https://github.com/dashpay/dash/compare/v22.1.2...dashpay:v22.1.3
[set-of-changes]: https://github.com/dashpay/dash/compare/v22.1.2...dashpay:v22.1.3
Copy link

Choose a reason for hiding this comment

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

24583: not sure what changed here exactly, should simply avoid touching actual release notes in this backport imo

@knst knst changed the title backport: bitcoin#24374, #24583, #24594, #24652, #24653, #24656, #24667, #24670, #24691, #24710 backport: bitcoin#24374, #24583, #24594, #24653, #24656, #24667, #24670, #24691, #24710 Sep 29, 2025
@knst knst requested a review from UdjinM6 September 29, 2025 19:06
Copy link

@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 5097b27 and e8e005a.

📒 Files selected for processing (3)
  • doc/cjdns.md (2 hunks)
  • doc/release-notes-empty-template.md (1 hunks)
  • doc/release-process.md (6 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • doc/release-notes-empty-template.md
🧰 Additional context used
📓 Path-based instructions (1)
doc/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:

  • doc/cjdns.md
  • doc/release-process.md
🧠 Learnings (2)
📓 Common learnings
Learnt from: kwvg
PR: dashpay/dash#6543
File: src/wallet/receive.cpp:240-251
Timestamp: 2025-02-06T14:34:30.466Z
Learning: Pull request #6543 is focused on move-only changes and refactoring, specifically backporting from Bitcoin. Behavior changes should be proposed in separate PRs.
📚 Learning: 2025-07-14T10:11:05.011Z
Learnt from: kwvg
PR: dashpay/dash#6754
File: contrib/containers/guix/docker-compose.yml:18-19
Timestamp: 2025-07-14T10:11:05.011Z
Learning: In the Guix build process for Dash Core, the `guix.sigs` directory requires write access as signatures are written to it during the build process, and `dash-detached-sigs` may be updated with `git pull` operations, so both directories need rw permissions in the Docker volume mounts.

Applied to files:

  • doc/release-process.md
🪛 markdownlint-cli2 (0.18.1)
doc/cjdns.md

34-34: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


37-37: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


40-40: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


46-46: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


49-49: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


52-52: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

doc/release-process.md

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: linux64_multiprocess-build / Build source
  • GitHub Check: mac-build / Build source
  • GitHub Check: linux64_nowallet-build / Build source
  • GitHub Check: linux64_sqlite-build / Build source
  • GitHub Check: linux64-build / Build source
  • GitHub Check: linux64_ubsan-build / Build source
  • GitHub Check: linux64_fuzz-build / Build source
  • GitHub Check: linux64_tsan-build / Build source
  • GitHub Check: win64-build / Build source
  • GitHub Check: arm-linux-build / Build source
🔇 Additional comments (5)
doc/release-process.md (1)

12-12: The referenced template file doc/release-notes-empty-template.md exists in the repository. The instruction is correct and actionable.

doc/cjdns.md (4)

27-27: LGTM!

The section heading is now more descriptive and accurately reflects the content that follows, which includes both installation and peer connection steps.


30-30: -->

URL anchor verified and correct.

The installation guide anchor #how-to-install-cjdns correctly corresponds to the "## How to install cjdns" heading in the cjdns repository README.


13-14: External reference URLs verified and accessible.

Both referenced repositories are valid and accessible:

The documentation additions provide appropriate external references for users seeking more information about CJDNS.


32-56: External references verified successfully.

All referenced URLs and resources have been verified:

  • The CJDNS documentation anchor links (sections "1. Generate a new configuration file", "2. Find a friend", and "3. Connect your node to your friend's node") are accessible and return HTTP 200
  • The hyperboria/peers repository exists and is accessible
  • The testAvailable.py script is present in the repository

The peer discovery workflow is well-documented and references valid external resources that users can follow.

### Windows and macOS codesigners only: Commit the detached codesign payloads

```sh
pushd ~/dashcore-detached-sigs
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify consistency between directory and repository names.

The script references ~/dashcore-detached-sigs as the local directory path, while the repository is named dash-detached-sigs (as mentioned in line 166). This naming inconsistency might confuse users. Verify that this path is correct or consider aligning the directory name with the repository name for clarity.


🏁 Script executed:

#!/bin/bash
# Description: Check for references to detached-sigs directories in the codebase

rg -n "detached-sigs" --type md -C2

Length of output: 2449


🏁 Script executed:

#!/bin/bash
# Check the setup instructions around line 42 to see if a custom directory name is specified
rg -n "git clone.*dash-detached-sigs" --type md -A2 -B2

Length of output: 322


🏁 Script executed:

#!/bin/bash
# Check if there are any other references to dashcore-detached-sigs vs dash-detached-sigs
rg -n "dashcore-detached-sigs|dash-detached-sigs" --type md

Length of output: 913


🏁 Script executed:

#!/bin/bash
# Check the guix README to understand the expected directory structure
cat contrib/guix/README.md | grep -A5 -B5 "detached-sigs"

Length of output: 305


Critical: Directory name mismatch will cause script failure.

Line 151 references ~/dashcore-detached-sigs, but the repository cloned at line 42 creates a directory named dash-detached-sigs by default (matching the repository name). This inconsistency will cause the script to fail with a "directory not found" error.

Change line 151 from:

pushd ~/dashcore-detached-sigs

to:

pushd ~/dash-detached-sigs

This aligns with the repository name used throughout the documentation (lines 42, 146, 166, and contrib/guix/README.md line 90).

🤖 Prompt for AI Agents
In doc/release-process.md around line 151 the script uses pushd
~/dashcore-detached-sigs which mismatches the actual cloned repository directory
dash-detached-sigs; update the command to use pushd ~/dash-detached-sigs so it
matches the repository name used at line 42, 146, 166 and contrib/guix/README.md
and prevents a "directory not found" error.

Copy link

This pull request has conflicts, please rebase.

Copy link

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
doc/release-process.md (1)

151-159: Fix detached sigs directory name to match repository

The repo is dash-detached-sigs, but the script uses ~/dashcore-detached-sigs, which will fail.

-pushd ~/dashcore-detached-sigs
+pushd ~/dash-detached-sigs
src/rpc/mempool.cpp (1)

233-268: Help schema vs actual field mismatch: “instantsend” (bool) vs “instantlock” (string tri-state).

MempoolEntryDescription documents a boolean “instantsend”, but entryToJSON emits “instantlock” with values "true"/"false"/"unknown" (string). This confuses clients relying on RPCHelpMan output.

Prefer aligning the help to the emitted field to avoid breaking existing clients that may already consume “instantlock”. Update the schema to document “instantlock” as a string tri-state:

-    RPCResult{RPCResult::Type::BOOL, "instantsend", "True if this transaction was locked via InstantSend"},
+    RPCResult{RPCResult::Type::STR, "instantlock", "InstantSend lock status: \"true\", \"false\", or \"unknown\""},

Alternatively (if you want to migrate toward a boolean), emit both keys for one release cycle, keeping “instantlock” for compatibility while adding a boolean “instantsend” (and drop “unknown” by omitting the key when status is unknown). Let me know if you want a patch for that approach. Based on coding guidelines.

Also applies to: 325-326

♻️ Duplicate comments (2)
test/functional/rpc_generate.py (2)

46-53: Add missing uncompressed combo pubkey test (avoid hardcoded address)

         self.log.info('Generate an empty block to a combo descriptor with compressed pubkey')
         combo_key = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
         combo_address = 'yWziQMcwmKjRdzi7eWjwiQX8EjWcd6dSg6'
         hash = self.generateblock(node, 'combo(' + combo_key + ')', [])['hash']
         block = node.getblock(hash, 2)
         assert_equal(len(block['tx']), 1)
         assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], combo_address)
+        self.log.info('Generate an empty block to a combo descriptor with uncompressed pubkey')
+        uncompressed_key = '0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'
+        # Derive expected address programmatically to avoid hardcoding
+        derived = node.deriveaddresses('combo(' + uncompressed_key + ')')
+        assert len(derived) > 0
+        hash = self.generateblock(node, 'combo(' + uncompressed_key + ')', [])['hash']
+        block = node.getblock(hash, 2)
+        assert_equal(len(block['tx']), 1)
+        assert block['tx'][0]['vout'][0]['scriptPubKey']['address'] in derived

30-33: Fund MiniWallet before generating/spending (prevents StopIteration)

-        miniwallet = MiniWallet(node)
-        miniwallet.rescan_utxos()
+        miniwallet = MiniWallet(node)
+        # Mine and mature funds to the MiniWallet descriptor
+        self.generate(miniwallet, 101)
+        miniwallet.rescan_utxos()
🧹 Nitpick comments (5)
test/functional/interface_zmq.py (1)

386-391: Replace fixed sleep with condition-based wait to reduce flakiness

Use wait_until instead of sleep(2) to wait for mempool sequence changes deterministically.

-        self.nodes[0].invalidateblock(best_hash)
-        sleep(2)  # Bit of room to make sure transaction things happened
+        self.nodes[0].invalidateblock(best_hash)
+        from test_framework.util import wait_until
+        wait_until(lambda: self.nodes[0].getrawmempool(mempool_sequence=True)["mempool_sequence"] > seq_num, timeout=10)
doc/cjdns.md (1)

39-46: Add a safety note before running third-party scripts

Cloning and executing testAvailable.py from the internet warrants a brief caution to review code and run in a constrained environment.

@@
 ./testAvailable.py

+Note: Inspect third‑party scripts before running them and consider executing in a restricted environment (e.g., disposable container/VM) to reduce risk.
+
For each peer, the ./testAvailable.py script prints the filename of the peer's
credentials followed by the ping result.



Also applies to: 48-56

</blockquote></details>
<details>
<summary>src/rpc/mempool.cpp (3)</summary><blockquote>

`56-63`: **Type-check all declared params (missing check for bypasslimits).**

RPCTypeCheck covers only 3 params while 4 are declared. Add a boolean check for the 4th (bypasslimits) to fail fast on bad input.


```diff
-            RPCTypeCheck(request.params, {
-                UniValue::VSTR,
-                UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
-                UniValue::VBOOL
-            });
+            RPCTypeCheck(request.params, {
+                UniValue::VSTR,
+                UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
+                UniValue::VBOOL,
+                UniValue::VBOOL
+            });

101-109: testmempoolaccept: clarify “maxfeerate” semantics in help to match sendrawtransaction.

You support “0 = unlimited” in code (fee check guarded by if (max_raw_tx_fee)), but the help text here doesn’t mention it, unlike sendrawtransaction. Add the same note for consistency.

-            {"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
-             "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB\n"},
+            {"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
+             "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB.\n"
+             "Set to 0 to accept any fee rate.\n"},

Also applies to: 200-216


176-177: Package error propagation is good; minor UX tweak optional.

When package_result.m_state signals a package policy error, you add "package-error" to each tx entry, but entries with unfinished validation omit 'allowed'. Consider also pushing a brief note like "reject-reason": "package-error" when validation is skipped to make it obvious why 'allowed' is absent. Purely optional.

Also applies to: 187-195

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e8e005a and 28ca522.

📒 Files selected for processing (15)
  • ci/test/00_setup_env_native_qt5.sh (1 hunks)
  • contrib/linearize/linearize-data.py (2 hunks)
  • contrib/linearize/linearize-hashes.py (1 hunks)
  • doc/cjdns.md (2 hunks)
  • doc/release-notes-empty-template.md (1 hunks)
  • doc/release-process.md (6 hunks)
  • src/rpc/mempool.cpp (9 hunks)
  • src/rpc/net.cpp (2 hunks)
  • src/rpc/rawtransaction.cpp (0 hunks)
  • test/functional/interface_zmq.py (7 hunks)
  • test/functional/rpc_generate.py (2 hunks)
  • test/functional/rpc_generateblock.py (0 hunks)
  • test/functional/test_framework/blocktools.py (1 hunks)
  • test/functional/test_runner.py (0 hunks)
  • test/functional/wallet_disable.py (1 hunks)
💤 Files with no reviewable changes (3)
  • test/functional/rpc_generateblock.py
  • test/functional/test_runner.py
  • src/rpc/rawtransaction.cpp
✅ Files skipped from review due to trivial changes (1)
  • doc/release-notes-empty-template.md
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/functional/wallet_disable.py
  • test/functional/test_framework/blocktools.py
  • ci/test/00_setup_env_native_qt5.sh
🧰 Additional context used
📓 Path-based instructions (4)
src/**/*.{cpp,h,cc,cxx,hpp}

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.{cpp,h,cc,cxx,hpp}: Dash Core C++ codebase must be written in C++20 and require at least Clang 16 or GCC 11.1
Dash uses unordered_lru_cache for efficient caching with LRU eviction

Files:

  • src/rpc/net.cpp
  • src/rpc/mempool.cpp
contrib/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the contrib directory (contributed scripts)

Files:

  • contrib/linearize/linearize-hashes.py
  • contrib/linearize/linearize-data.py
test/functional/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Functional tests should be written in Python and placed in test/functional/

Files:

  • test/functional/interface_zmq.py
  • test/functional/rpc_generate.py
doc/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:

  • doc/release-process.md
  • doc/cjdns.md
🧬 Code graph analysis (3)
test/functional/interface_zmq.py (2)
test/functional/test_framework/wallet.py (3)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • send_self_transfer (212-216)
test/functional/test_framework/blocktools.py (2)
  • create_block (50-72)
  • create_coinbase (174-198)
src/rpc/mempool.cpp (5)
src/node/transaction.h (1)
  • DEFAULT_MAX_RAW_TX_FEE_RATE (27-61)
src/rpc/server_util.cpp (6)
  • EnsureAnyNodeContext (28-45)
  • EnsureAnyNodeContext (28-28)
  • EnsureMemPool (47-53)
  • EnsureMemPool (47-47)
  • EnsureChainman (87-93)
  • EnsureChainman (87-87)
src/node/transaction.cpp (2)
  • BroadcastTransaction (33-118)
  • BroadcastTransaction (33-33)
src/validation.cpp (2)
  • ProcessNewPackage (1356-1374)
  • ProcessNewPackage (1356-1357)
src/core_write.cpp (2)
  • ValueFromAmount (36-47)
  • ValueFromAmount (36-36)
test/functional/rpc_generate.py (2)
test/functional/test_framework/wallet.py (6)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • get_address (177-179)
  • send_self_transfer (212-216)
  • create_self_transfer (290-309)
  • get_utxo (181-199)
test/functional/test_framework/util.py (2)
  • assert_raises_rpc_error (132-148)
  • assert_equal (69-74)
🪛 Gitleaks (8.28.0)
test/functional/rpc_generate.py

[high] 47-47: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🪛 markdownlint-cli2 (0.18.1)
doc/release-process.md

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

doc/cjdns.md

34-34: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


37-37: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


40-40: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


46-46: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


49-49: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)


52-52: Heading style
Expected: atx; Actual: setext

(MD003, heading-style)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: mac-build / Build source
  • GitHub Check: win64-build / Build source
  • GitHub Check: arm-linux-build / Build source
  • GitHub Check: linux64-build / Build source
  • GitHub Check: linux64_sqlite-build / Build source
  • GitHub Check: linux64_ubsan-build / Build source
  • GitHub Check: linux64_fuzz-build / Build source
  • GitHub Check: linux64_tsan-build / Build source
  • GitHub Check: linux64_nowallet-build / Build source
🔇 Additional comments (6)
contrib/linearize/linearize-hashes.py (1)

83-83: LGTM! Clean simplification using Python built-ins.

The inline endianness reversal using bytes.fromhex(...)[::-1].hex() is the idiomatic Python 3 approach and functionally equivalent to the removed hex_switchEndian helper.

contrib/linearize/linearize-data.py (2)

23-25: LGTM! Simplified hash calculation using dash_hash library.

The function now uses dash_hash.getPoWHash directly and applies the standard byte reversal idiom [::-1].hex() for display format. This eliminates the need for multiple custom helper functions.


41-41: LGTM! Consistent endianness handling.

The inline transformation bytes.fromhex(line)[::-1].hex() matches the approach in linearize-hashes.py and is functionally equivalent to the removed hex_switchEndian helper.

src/rpc/net.cpp (1)

102-103: Help text polish and optional field change look good

Wording “peer” is clearer, and marking relaytxes optional is fine; implementation still always emits it, which is acceptable. No functional risk spotted.

Also applies to: 127-128

doc/release-process.md (1)

12-12: Release-notes reset command is helpful

The “clear release notes” step is a nice quality-of-life addition.

test/functional/rpc_generate.py (1)

41-44: Fix getblock named argument: use ‘verbosity’, not ‘verbose’

getblock expects verbosity; verbose is not a valid named arg and may fail.

-        block = node.getblock(blockhash=hash, verbose=2)
+        block = node.getblock(blockhash=hash, verbosity=2)

Likely an incorrect or invalid review comment.

Comment on lines 80 to 85
AssertLockNotHeld(cs_main);
NodeContext& node = EnsureAnyNodeContext(request.context);
const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /* relay */ true, /* wait_callback */ true, bypass_limits);
if (TransactionError::OK != err) {
throw JSONRPCTransactionError(err, err_string.original);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Guard against mempool being unavailable (avoid potential null deref in release builds).

sendrawtransaction calls BroadcastTransaction without first ensuring the mempool exists. BroadcastTransaction uses asserts (compiled out with NDEBUG), so a null node.mempool could lead to a crash instead of a JSON-RPC error. Mirror the pattern used elsewhere (e.g., testmempoolaccept) and gate with EnsureMemPool().

-            NodeContext& node = EnsureAnyNodeContext(request.context);
+            NodeContext& node = EnsureAnyNodeContext(request.context);
+            // Ensure mempool availability to return a proper RPC error instead of tripping asserts.
+            (void)EnsureMemPool(node);
             const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /* relay */ true, /* wait_callback */ true, bypass_limits);
📝 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
AssertLockNotHeld(cs_main);
NodeContext& node = EnsureAnyNodeContext(request.context);
const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /* relay */ true, /* wait_callback */ true, bypass_limits);
if (TransactionError::OK != err) {
throw JSONRPCTransactionError(err, err_string.original);
}
AssertLockNotHeld(cs_main);
NodeContext& node = EnsureAnyNodeContext(request.context);
// Ensure mempool availability to return a proper RPC error instead of tripping asserts.
(void)EnsureMemPool(node);
const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /* relay */ true, /* wait_callback */ true, bypass_limits);
if (TransactionError::OK != err) {
throw JSONRPCTransactionError(err, err_string.original);
}
🤖 Prompt for AI Agents
In src/rpc/mempool.cpp around lines 80 to 85, the code calls
BroadcastTransaction without ensuring node.mempool exists which can cause a null
deref in release builds (asserts compiled out); mirror the pattern used
elsewhere by calling EnsureMemPool(node) before BroadcastTransaction and if it
returns false throw a JSON-RPC error (or use the existing
JSONRPCTransactionError pattern) so the RPC returns a controlled error instead
of crashing; update the flow to gate BroadcastTransaction behind EnsureMemPool
and propagate an appropriate error message when the mempool is unavailable.

Comment on lines +118 to 121
self.wallet = MiniWallet(self.nodes[0])
self.ctx = zmq.Context()
try:
self.test_basic()
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

MiniWallet must be funded and matured before use

MiniWallet has no UTXOs prior to send_self_transfer, so get_utxo() can raise StopIteration. Fund and mature right after instantiation.

@@
     def run_test(self):
-        self.wallet = MiniWallet(self.nodes[0])
+        self.wallet = MiniWallet(self.nodes[0])
+        # Fund MiniWallet and mature coinbases so it can spend
+        self.generate(self.wallet, 101)
+        # Optional: prime internal UTXO cache
+        self.wallet.rescan_utxos()
@@
-        self.wallet.rescan_utxos()
+        # Already rescanned above; this second rescan is optional
+        # self.wallet.rescan_utxos()

Also applies to: 228-236

🤖 Prompt for AI Agents
In test/functional/interface_zmq.py around lines 118-121, the MiniWallet is
instantiated but not funded/matured which can make get_utxo() raise
StopIteration; after self.wallet = MiniWallet(self.nodes[0]) call
self.wallet.send_self_transfer(self.nodes[0]) to create a UTXO and then mine
enough blocks to mature it (e.g. self.nodes[0].generate(100) or query coinbase
maturity and generate that many blocks) before calling self.test_basic(); apply
the same change at lines 228-236.

Copy link

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/rpc/mempool.cpp (1)

233-268: Fix help/result schema to match actual output key and type.

entryToJSON publishes "instantlock" as a string ("true"/"false"/"unknown"), but help declares a BOOL "instantsend". Align help with reality to prevent client breakage.

-    RPCResult{RPCResult::Type::BOOL, "instantsend", "True if this transaction was locked via InstantSend"},
+    RPCResult{RPCResult::Type::STR, "instantlock", "InstantSend lock state: \"true\", \"false\", or \"unknown\""},
♻️ Duplicate comments (2)
doc/release-process.md (1)

148-161: Fix directory name; avoid pushd to non-existent path.

Use dash-detached-sigs (repo name) instead of dashcore-detached-sigs.

-pushd ~/dashcore-detached-sigs
+pushd ~/dash-detached-sigs

Also, “checkout the appropriate branch for this release series” conflicts with git checkout "v${VERSION}" (usually a tag). Please confirm whether a branch (e.g., v20.x) or a tag is intended, and adjust the command accordingly. Consider avoiding rm -rf *; a safer pattern is:

-# checkout the appropriate branch for this release series
-git checkout "v${VERSION}"
-rm -rf *
+# checkout the appropriate branch or create a fresh branch for this version
+git switch -c "v${VERSION}" || git switch "v${VERSION}"
+# clear tracked/untracked files safely within the repo
+git rm -r --quiet . 2>/dev/null || true
+git clean -fdx
+# ensure signature tarballs are present in this dir (copy if needed)
+cp /path/to/signature-osx.tar.gz /path/to/signature-win.tar.gz .
src/rpc/mempool.cpp (1)

81-85: Guard against missing mempool before BroadcastTransaction.

Call EnsureMemPool(node) to return a JSON-RPC error instead of risking a crash in release builds if mempool is disabled.

-            NodeContext& node = EnsureAnyNodeContext(request.context);
+            NodeContext& node = EnsureAnyNodeContext(request.context);
+            (void)EnsureMemPool(node);
             const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /*relay=*/true, /*wait_callback=*/true, bypass_limits);
🧹 Nitpick comments (5)
doc/cjdns.md (3)

13-14: Format URLs according to Markdown best practices.

The bare URLs should be wrapped in angle brackets or converted to proper Markdown links for better readability and compliance with Markdown standards.

Apply this diff to format the URLs:

-the network router). See https://github.com/cjdelisle/cjdns#readme and
-https://github.com/hyperboria/docs#hyperboriadocs for more information.
+the network router). See <https://github.com/cjdelisle/cjdns#readme> and
+<https://github.com/hyperboria/docs#hyperboriadocs> for more information.

As per coding guidelines (based on static analysis hints).


30-30: Format URL according to Markdown best practices.

The bare URL should be wrapped in angle brackets for consistency with Markdown standards.

Apply this diff:

-https://github.com/cjdelisle/cjdns#how-to-install-cjdns.
+<https://github.com/cjdelisle/cjdns#how-to-install-cjdns>.

As per coding guidelines (based on static analysis hints).


42-46: Specify language identifier for the fenced code block.

The code block should include a language identifier (e.g., bash or shell) for proper syntax highlighting and to follow Markdown best practices.

Apply this diff:

-```
+```bash
 git clone https://github.com/hyperboria/peers hyperboria-peers
 cd hyperboria-peers
 ./testAvailable.py
doc/release-process.md (2)

94-101: Note for Guix-in-Docker users: ensure RW mounts for signatures dirs.

When building with the Guix Docker setup, mount guix.sigs and dash-detached-sigs with read-write perms; signatures and pulls need to write to these volumes. Based on learnings.


107-115: Tighten commit step; avoid -a and hyphenate “non‑codesigned”.

git commit -a can inadvertently include unrelated tracked changes. Commit only what you staged.

-### Commit your non codesigned signature to guix.sigs
+### Commit your non-codesigned signature to guix.sigs
@@
-git commit -a
+git commit -m "Add ${SIGNER} non-codesigned attestations for ${VERSION}"
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 28ca522 and d716731.

📒 Files selected for processing (8)
  • contrib/linearize/linearize-data.py (2 hunks)
  • contrib/linearize/linearize-hashes.py (1 hunks)
  • doc/cjdns.md (2 hunks)
  • doc/release-notes-empty-template.md (1 hunks)
  • doc/release-process.md (6 hunks)
  • src/rpc/mempool.cpp (9 hunks)
  • src/rpc/net.cpp (2 hunks)
  • src/rpc/rawtransaction.cpp (0 hunks)
💤 Files with no reviewable changes (1)
  • src/rpc/rawtransaction.cpp
✅ Files skipped from review due to trivial changes (1)
  • doc/release-notes-empty-template.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/rpc/net.cpp
🧰 Additional context used
📓 Path-based instructions (3)
doc/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:

  • doc/release-process.md
  • doc/cjdns.md
contrib/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the contrib directory (contributed scripts)

Files:

  • contrib/linearize/linearize-data.py
  • contrib/linearize/linearize-hashes.py
src/**/*.{cpp,h,cc,cxx,hpp}

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.{cpp,h,cc,cxx,hpp}: Dash Core C++ codebase must be written in C++20 and require at least Clang 16 or GCC 11.1
Dash uses unordered_lru_cache for efficient caching with LRU eviction

Files:

  • src/rpc/mempool.cpp
🧠 Learnings (1)
📚 Learning: 2025-07-14T10:11:05.011Z
Learnt from: kwvg
PR: dashpay/dash#6754
File: contrib/containers/guix/docker-compose.yml:18-19
Timestamp: 2025-07-14T10:11:05.011Z
Learning: In the Guix build process for Dash Core, the `guix.sigs` directory requires write access as signatures are written to it during the build process, and `dash-detached-sigs` may be updated with `git pull` operations, so both directories need rw permissions in the Docker volume mounts.

Applied to files:

  • doc/release-process.md
🧬 Code graph analysis (1)
src/rpc/mempool.cpp (4)
src/node/transaction.h (1)
  • DEFAULT_MAX_RAW_TX_FEE_RATE (27-61)
src/rpc/server_util.cpp (4)
  • EnsureAnyNodeContext (28-45)
  • EnsureAnyNodeContext (28-28)
  • EnsureMemPool (47-53)
  • EnsureMemPool (47-47)
src/node/transaction.cpp (2)
  • BroadcastTransaction (33-118)
  • BroadcastTransaction (33-33)
src/core_write.cpp (2)
  • ValueFromAmount (36-47)
  • ValueFromAmount (36-36)
🪛 markdownlint-cli2 (0.18.1)
doc/release-process.md

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

doc/cjdns.md

13-13: Bare URL used

(MD034, no-bare-urls)


14-14: Bare URL used

(MD034, no-bare-urls)


30-30: Bare URL used

(MD034, no-bare-urls)


42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: linux64_multiprocess-build / Build source
  • GitHub Check: linux64_sqlite-build / Build source
  • GitHub Check: linux64_ubsan-build / Build source
  • GitHub Check: linux64_fuzz-build / Build source
  • GitHub Check: linux64-build / Build source
  • GitHub Check: mac-build / Build source
  • GitHub Check: win64-build / Build source
  • GitHub Check: linux64_nowallet-build / Build source
  • GitHub Check: arm-linux-build / Build source
  • GitHub Check: linux64_tsan-build / Build source
🔇 Additional comments (26)
doc/cjdns.md (1)

27-66: Excellent documentation improvements.

The expanded installation instructions, Hyperboria peer discovery workflow, and new "Launching CJDNS" section significantly improve the user experience. The step-by-step guidance with concrete commands makes CJDNS setup much more accessible.

contrib/linearize/linearize-hashes.py (1)

82-84: Inline endianness reversal is correct and consistent with linearize-data.py.

bytes.fromhex(...)[::-1].hex() is a safe, readable replacement. Note it always emits lowercase; if external tooling compares case-sensitively, normalize upstream. Optionally guard with a try/except to emit a clearer error if the RPC ever returned non-hex.

Please sanity-check one or two heights with rev_hash_bytes=true against RPC getblockhash output to confirm identical results.

contrib/linearize/linearize-data.py (2)

23-26: Switch to PoW hash with reversed-byte hex looks right for Dash.

dash_hash.getPoWHash(blk_hdr)[::-1].hex() should match RPC-style block hash formatting. Just ensure getPoWHash returns a bytes-like object; if it’s a memoryview in some environments, wrap with bytes(...) before slicing.

Please verify calc_hash_str on the genesis header (or block 1) matches the hash in your hashlist/genesis config.


39-43: Direct hex byte-reversal is fine; consider defensive parsing.

The inline bytes.fromhex(line)[::-1].hex() is clear and consistent. If hashlist files may contain blank lines or stray whitespace, consider skipping empties and catching ValueError to avoid introducing an empty/invalid hash entry. Non-blocking for contrib scripts.

If feasible, run with a hashlist containing a trailing newline/blank to confirm behavior is as expected. As per coding guidelines.

doc/release-process.md (12)

86-93: LGTM: macOS SDK tarball heading/wording cleanup.


102-106: LGTM: link fixes and help text.


117-117: LGTM: Codesigning section intro.


119-131: Clarify signapple inputs (optional).

If the p12 file requires an import into the keychain first, add a one-liner or link to signapple docs. Also confirm -o runtime is the intended option for hardened runtime signatures.


132-143: LGTM: Windows detached signatures section.


144-146: LGTM: guidance to test signatures pre-tagging and repeat post-tag.


163-167: LGTM: non-codesigner waiting guidance and link to dash-detached-sigs.


171-175: LGTM: optional verification links repeated post-codesigning.


176-184: LGTM: codesigned attestations commit step.


186-186: LGTM: section heading for post-build aggregation.


168-170: Resolved: README anchor for codesigning-build-outputs exists


12-12: Confirmed doc/release-notes-empty-template.md is present; no changes needed.

src/rpc/mempool.cpp (10)

17-17: Include util/moneystr.h is correct for FormatMoney usage.


23-23: Exposing DEFAULT_MAX_RAW_TX_FEE_RATE via using is appropriate.


92-231: LGTM: testmempoolaccept implementation and results structure.

Includes package handling, maxfeerate enforcement, and mempool/chainman guards.


370-423: LGTM: getrawmempool marked static; help/result wiring OK.


424-490: LGTM: getmempoolancestors static; uses MempoolEntryDescription.


491-558: LGTM: getmempooldescendants static; mirrors ancestors impl.


559-595: LGTM: getmempoolentry static; consistent with entryToJSON.


615-646: LGTM: getmempoolinfo static; fields match MempoolInfoToJSON.


648-681: LGTM: savemempool static; returns filename path.


688-690: LGTM: Register rawtransactions handlers here.

sendrawtransaction and testmempoolaccept now correctly registered under “rawtransactions.”

Comment on lines +56 to +63
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
RPCTypeCheck(request.params, {
UniValue::VSTR,
UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
UniValue::VBOOL
});

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add type-check for bypasslimits (param index 3).

Strengthen input validation by checking the 4th parameter type.

-            RPCTypeCheck(request.params, {
-                UniValue::VSTR,
-                UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
-                UniValue::VBOOL
-            });
+            RPCTypeCheck(request.params, {
+                UniValue::VSTR,
+                UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
+                UniValue::VBOOL,
+                UniValue::VBOOL
+            });
📝 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
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
RPCTypeCheck(request.params, {
UniValue::VSTR,
UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
UniValue::VBOOL
});
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
RPCTypeCheck(request.params, {
UniValue::VSTR,
UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
UniValue::VBOOL,
UniValue::VBOOL
});
// …rest of handler…
🤖 Prompt for AI Agents
In src/rpc/mempool.cpp around lines 56-63, the RPCTypeCheck call currently
validates only three params and is missing a type check for the 4th parameter
(bypasslimits); update the initializer list passed to RPCTypeCheck to include a
UniValue::VBOOL entry as the fourth element so the bypasslimits argument is
validated as a boolean (keep the existing UniValueType() entry for the amount
param comment about VNUM or VSTR).

@PastaPastaPasta
Copy link
Member

CI Fails

MarcoFalke and others added 9 commits October 2, 2025 01:10
…face_zmq`

bc90b8d [move only] remove `is_wallet_compiled` checks (josibake)
0bfbf7f test: use MiniWallet in `interfaces_zmq` (josibake)

Pull request description:

  While working on bitcoin#24584 , `interface_zmq` started failing due to coin selection not running deterministically. The test doesn't actually need the wallet, so this PR migrates it to use MiniWallet

  _Note for reviewers:_ the second commit moves large chunks of code out of an if block, so it may be helpful to review with something that ignores whitespace, e.g `git diff -w master`

ACKs for top commit:
  vincenzopalazzo:
    ACK bitcoin@bc90b8d

Tree-SHA512: c618e23d00635d72dafdef28e68cbc88b9cc2030d4898fc5b7eac926fd621684c1958c075ed167192716b18308da5a0c1f1393396e31b99d0d3bde78b78fefc5
fa6e47d ci: Compile fuzz binary in periodic task (MarcoFalke)

Pull request description:

  There is one task that is re-run periodically by CI about once a week for all pull request to detect silent merge conflict before merge.

  It would be nice if this task also checked for silent merge conflict in the fuzz binary.

ACKs for top commit:
  fanquake:
    ACK fa6e47d green CI
  vincenzopalazzo:
    ACK bitcoin@fa6e47d

Tree-SHA512: fd5b02dc72af7a4ba973919d62c3aad11569f86a93622e2e56330ea9d379f1f015dfd5cb7efbf00718b306103028bc10c7e935579c2337fb506bd7fe3e145e1c
…ingle file

0000ff0 test: move-only: Move all generate* tests to a single file (MarcoFalke)

Pull request description:

  Seems a bit overkill to spread tests for the `generate*` methods over several files. Combining them into a single file has also a nice side-effect of requiring less node (re)starts, which are expensive in valgrind.

ACKs for top commit:
  glozow:
    utACK 0000ff0

Tree-SHA512: 8269eb05649a871011bbfbd1838d0f7d1dac4a35b3b198fc43fe85131fda8a53803b75da78cbf422eabf086006dee4421e622fbe706f6781a3848b989024001b
fac5a51 Move mempool RPCs to rpc/mempool (MarcoFalke)
fa0f666 style: Add static keyword where possible in rpc/mempool (MarcoFalke)

Pull request description:

  This moves the remaining mempool RPCs to `rpc/mempool`. Previously all mempool RPCs from the `blockchain` category have been moved. This patch moves the ones from the `rawtransactions` category.

  In the future, as a follow-up to this refactoring patch, it could be considered whether a new `mempool` category should be introduced.

  Beside a clearer code organization, this pull request should also reduce the compile time and space of the `rawtransactions.cpp` file.

ACKs for top commit:
  promag:
    Code review ACK fac5a51.

Tree-SHA512: 5578b894b68d0595869a9b03ed8dceebe3366f73dec5f090ccc36ff4002b1bc4d58af77546c2d71537c1be03694d9a28c4b1bfbb3569560997879293c5c0301e
faac877 doc: Fix getpeerinfo doc (MarcoFalke)

Pull request description:

  * Replace `node` with `peer`
  * Remove unused `\n`
  * Mark optional fields optional. See commit 9344697, found by bitcoin#23083

ACKs for top commit:
  fanquake:
    ACK faac877

Tree-SHA512: ae4d52a0dcf8e132d9084e632d65fa835b1e7d0ed5c3d45a360570414d1e20bc7fb6500ff9be94b784af1dec5badcd1304153b1a4a59a6c484a87d8afd88b8bd
254a63e contrib: refactor: replace `hex_switchEndian` in linearize scripts (Sebastian Falbesoner)
3f863cf contrib: refactor: simplify block header string routine in linearize-data.py (Sebastian Falbesoner)

Pull request description:

  This PR simplifies the linearization scripts `linearize-data.py` and `linearize-hashes.py` by replacing overly complicated cruft (block header hash string calculation, hex string reverse) with means of the Python3 standard library.

ACKs for top commit:
  laanwj:
    Code review ACK 254a63e

Tree-SHA512: 4a0e20e63bd11f23a190480b22dbc2f2a3070e2a4f3a01b8797f99bb5fc830185e91e6712c8ae97562f9a24a98aa4f19d52f02a3f5fcbe4c578ee88a41382d1d
ac45a43 doc: update release-process.md (gruve-p)

Pull request description:

ACKs for top commit:
  achow101:
    ACK ac45a43

Tree-SHA512: eb49310e5645fcab47c6a268221b688d0ae4ffb1cc6d66fc097da1feb61aa894fb00065c20cd2413b775b598f8c955d48240608107776e4f1016703d52a81212
fa4943e doc: Add template for empty release notes (MarcoFalke)

Pull request description:

  * Move release process notes from the release notes to the release process documentation
  * Clarify that wallet RPC or Settings related release notes snippets should not be duplicated. I think it should be sufficient to only mention them in the wallet section and leave them out from the general RPC section.
  * Create an empty template to ensure the release notes can be cleared with a single `cp` command. Also, this ensures that the "no duplication" note isn't deleted again. (We used to have it in at least the 22.0 and 21.0 release notes: https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.21.0.md#updated-settings , but it was lost in the 23.0 notes)

ACKs for top commit:
  laanwj:
    ACK fa4943e

Tree-SHA512: 808e100ee1e371f7746a479ddfb237c6895935cffefc0e49033505492a03288013d5c20386af30f2a7dca8ad0c0628bdb6673dcb5cc4fcf4d0183b0ec65ce941
…d a friend

6a02355 Add and improve informational links in doc/cjdns.md (Jon Atack)
19538dd Add concrete steps in doc/cjdns.md to easily find a friend (Jon Atack)

Pull request description:

  and improve the informational links.  CJDNS functions with a friend-of-a-friend topology and a key hurdle to getting started is to find a public peer and set up an outbound connection to it. This update makes doing it much easier for people getting started.

  Credit to Vasil Dimov for an [IRC suggestion in October 2021](https://www.erisian.com.au/bitcoin-core-dev/log-2021-10-04.html#l-469) and to stickies-v for IRC discussions this week and the [testing guide](https://github.com/bitcoin-core/bitcoin-devwiki/wiki/23.0-Release-Candidate-Testing-Guide) that led me to redo these steps, provide feedback at bitcoin#24706 and refine the added documentation here.

ACKs for top commit:
  dunxen:
    ACK 6a02355
  stickies-v:
    re-ACK [6a02355](bitcoin@6a02355) even though I wasn't opposed to the "friend" terminology since it's the language CJDNS seems to use to denominate the peers you connect to directly in general. Not worth bikeshedding over though.
  lsilva01:
    Strong ACK 6a02355

Tree-SHA512: b2fa2a200a6a55a709486f7ed2d3830cabffbbffa61a0d211fcb666a918b5754d4e99a58c32909fe58540598066e6ff67bf2fa2fcd56b1b5dcff3c2162f6d962
@knst
Copy link
Collaborator Author

knst commented Oct 1, 2025

CI Fails

same issue as #6862

@knst knst force-pushed the bp-v24-p1 branch from d716731 to 6855957 now

rebased on the top of develop

Copy link

@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: 2

♻️ Duplicate comments (5)
doc/release-process.md (1)

151-151: Fix directory name for detached sigs checkout.

Line 151 still points to ~/dashcore-detached-sigs, but the repo cloned above is dash-detached-sigs. Following the current instructions will fail with “directory not found.” Update the path so the commands actually work.

-pushd ~/dashcore-detached-sigs
+pushd ~/dash-detached-sigs
src/rpc/mempool.cpp (2)

58-62: Add type-check for bypasslimits parameter (index 3).

The RPCTypeCheck validates only three parameters but misses the fourth parameter bypasslimits at index 3. This weakens input validation.

Apply this diff to validate the fourth parameter:

 RPCTypeCheck(request.params, {
     UniValue::VSTR,
     UniValueType(), // VNUM or VSTR, checked inside AmountFromValue()
-    UniValue::VBOOL
+    UniValue::VBOOL,
+    UniValue::VBOOL
 });

As per past review comments.


80-85: Guard against mempool being unavailable to prevent null dereference in release builds.

BroadcastTransaction is called without first ensuring node.mempool exists. Since BroadcastTransaction uses assertions that compile out with NDEBUG, a null mempool could lead to a crash instead of a proper JSON-RPC error. Mirror the pattern used in testmempoolaccept (line 168) by calling EnsureMemPool(node) before BroadcastTransaction.

Apply this diff to add the guard:

 bilingual_str err_string;
 AssertLockNotHeld(cs_main);
 NodeContext& node = EnsureAnyNodeContext(request.context);
+CTxMemPool& mempool = EnsureMemPool(node);
 const TransactionError err = BroadcastTransaction(node, tx, err_string, max_raw_tx_fee, /*relay=*/true, /*wait_callback=*/true, bypass_limits);

As per past review comments.

test/functional/rpc_generate.py (1)

28-31: Verify MiniWallet has mature UTXOs before spending.

MiniWallet must have matured coinbase UTXOs before send_self_transfer is called at Line 56. The generateblock calls at Lines 35, 41, and 49 create coinbase outputs, but coinbase outputs require 100 confirmations to be spendable. Without additional maturity blocks, get_utxo() will raise StopIteration or return immature coins.

Verify the wallet has spendable funds before the first spend:

#!/bin/bash
# Check if there's a generate call that matures coinbases before send_self_transfer

rg -n "self\.generate.*miniwallet.*10[0-9]" test/functional/rpc_generate.py
rg -n "miniwallet\.generate.*10[0-9]" test/functional/rpc_generate.py
rg -n "generatetoaddress.*miniwallet" test/functional/rpc_generate.py

Based on past review comments (marked as addressed in commits 4180b62-28ca522), this should have been fixed by mining maturity blocks after MiniWallet instantiation.

test/functional/interface_zmq.py (1)

118-118: MiniWallet must be funded and matured before use.

MiniWallet is instantiated at Line 118 but not funded before send_self_transfer is called at Line 230. Without mature coinbase UTXOs, get_utxo() will raise StopIteration.

Apply this pattern immediately after wallet instantiation:

 self.wallet = MiniWallet(self.nodes[0])
+# Fund MiniWallet and mature coinbases so it can spend
+self.generate(self.wallet, 101)

Based on past review comments.

🧹 Nitpick comments (1)
test/functional/rpc_generate.py (1)

46-52: Missing test case for uncompressed pubkey combo descriptor.

The test validates a compressed pubkey combo descriptor but does not include a test for an uncompressed pubkey combo descriptor as noted in the upstream Bitcoin PR bitcoin#24670.

Based on past review comments.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d716731 and 6855957.

📒 Files selected for processing (15)
  • ci/test/00_setup_env_native_qt5.sh (1 hunks)
  • contrib/linearize/linearize-data.py (2 hunks)
  • contrib/linearize/linearize-hashes.py (1 hunks)
  • doc/cjdns.md (2 hunks)
  • doc/release-notes-empty-template.md (1 hunks)
  • doc/release-process.md (6 hunks)
  • src/rpc/mempool.cpp (9 hunks)
  • src/rpc/net.cpp (2 hunks)
  • src/rpc/rawtransaction.cpp (0 hunks)
  • test/functional/interface_zmq.py (7 hunks)
  • test/functional/rpc_generate.py (2 hunks)
  • test/functional/rpc_generateblock.py (0 hunks)
  • test/functional/test_framework/blocktools.py (1 hunks)
  • test/functional/test_runner.py (0 hunks)
  • test/functional/wallet_disable.py (1 hunks)
💤 Files with no reviewable changes (3)
  • test/functional/rpc_generateblock.py
  • test/functional/test_runner.py
  • src/rpc/rawtransaction.cpp
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/rpc/net.cpp
  • ci/test/00_setup_env_native_qt5.sh
  • contrib/linearize/linearize-hashes.py
  • test/functional/wallet_disable.py
🧰 Additional context used
📓 Path-based instructions (4)
test/functional/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Functional tests should be written in Python and placed in test/functional/

Files:

  • test/functional/rpc_generate.py
  • test/functional/test_framework/blocktools.py
  • test/functional/interface_zmq.py
doc/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the doc directory (documentation)

Files:

  • doc/release-process.md
  • doc/cjdns.md
  • doc/release-notes-empty-template.md
contrib/**

📄 CodeRabbit inference engine (CLAUDE.md)

Unless specifically prompted, avoid making changes to the contrib directory (contributed scripts)

Files:

  • contrib/linearize/linearize-data.py
src/**/*.{cpp,h,cc,cxx,hpp}

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.{cpp,h,cc,cxx,hpp}: Dash Core C++ codebase must be written in C++20 and require at least Clang 16 or GCC 11.1
Dash uses unordered_lru_cache for efficient caching with LRU eviction

Files:

  • src/rpc/mempool.cpp
🧬 Code graph analysis (4)
test/functional/rpc_generate.py (1)
test/functional/test_framework/wallet.py (6)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • get_address (177-179)
  • send_self_transfer (212-216)
  • create_self_transfer (290-309)
  • get_utxo (181-199)
test/functional/test_framework/blocktools.py (1)
test/functional/test_framework/messages.py (1)
  • tx_from_hex (230-232)
src/rpc/mempool.cpp (4)
src/node/transaction.h (1)
  • DEFAULT_MAX_RAW_TX_FEE_RATE (27-61)
src/rpc/server_util.cpp (6)
  • EnsureAnyNodeContext (28-45)
  • EnsureAnyNodeContext (28-28)
  • EnsureMemPool (47-53)
  • EnsureMemPool (47-47)
  • EnsureChainman (87-93)
  • EnsureChainman (87-87)
src/node/transaction.cpp (2)
  • BroadcastTransaction (33-118)
  • BroadcastTransaction (33-33)
src/core_write.cpp (2)
  • ValueFromAmount (36-47)
  • ValueFromAmount (36-36)
test/functional/interface_zmq.py (3)
test/functional/test_framework/wallet.py (3)
  • MiniWallet (75-314)
  • rescan_utxos (100-118)
  • send_self_transfer (212-216)
test/functional/test_framework/test_framework.py (1)
  • sync_all (876-878)
test/functional/test_framework/blocktools.py (2)
  • create_block (50-72)
  • create_coinbase (174-198)
🪛 markdownlint-cli2 (0.18.1)
doc/release-process.md

86-86: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


94-94: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


102-102: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


107-107: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


117-117: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


119-119: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


132-132: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


144-144: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


148-148: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


163-163: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


168-168: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


171-171: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


176-176: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)


186-186: Heading style
Expected: setext; Actual: atx

(MD003, heading-style)

doc/cjdns.md

13-13: Bare URL used

(MD034, no-bare-urls)


14-14: Bare URL used

(MD034, no-bare-urls)


30-30: Bare URL used

(MD034, no-bare-urls)


42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

doc/release-notes-empty-template.md

13-13: Bare URL used

(MD034, no-bare-urls)


14-14: Bare URL used

(MD034, no-bare-urls)


30-30: Bare URL used

(MD034, no-bare-urls)


42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


73-73: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


81-81: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


83-83: Unordered list indentation
Expected: 0; Actual: 2

(MD007, ul-indent)


88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: win64-build / Build source
  • GitHub Check: mac-build / Build source
  • GitHub Check: linux64_tsan-build / Build source
  • GitHub Check: linux64_fuzz-build / Build source
  • GitHub Check: linux64_sqlite-build / Build source
  • GitHub Check: linux64-build / Build source
  • GitHub Check: linux64_ubsan-build / Build source
  • GitHub Check: arm-linux-build / Build source
  • GitHub Check: linux64_nowallet-build / Build source
  • GitHub Check: Lint / Run linters
🔇 Additional comments (9)
contrib/linearize/linearize-data.py (2)

23-25: LGTM! Simplified hash computation.

The direct use of dash_hash.getPoWHash with byte reversal is cleaner and more maintainable than the removed helper functions. The logic correctly computes the PoW hash and returns it in the expected hex format.


40-41: LGTM! Consistent byte reversal pattern.

The inline byte reversal using bytes.fromhex(line)[::-1].hex() is clear and consistent with the approach used in calc_hash_str. This simplification improves code maintainability by removing the need for separate helper functions.

src/rpc/mempool.cpp (5)

17-17: LGTM! Appropriate includes for new RPC endpoints.

The new include and using declaration properly support the monetary formatting and fee rate defaults required by sendrawtransaction and testmempoolaccept.

Also applies to: 23-23


92-231: LGTM! Well-structured testmempoolaccept implementation.

The implementation properly:

  • Guards mempool access with EnsureMemPool (line 168)
  • Validates array bounds and transaction decoding
  • Handles both single transaction and package validation
  • Enforces maxfeerate with early exit behavior for packages
  • Distinguishes between missing inputs and other validation failures

233-268: LGTM! Appropriate scope reduction to static.

Converting MempoolEntryDescription to static linkage is good practice since it's only used within this translation unit.


370-370: LGTM! Appropriate scope reduction for internal RPC handlers.

Converting getrawmempool, getmempoolancestors, getmempooldescendants, getmempoolentry, getmempoolinfo, and savemempool to static linkage is correct since these handlers are only referenced within this translation unit for command registration.

Also applies to: 424-424, 491-491, 559-559, 615-615, 648-648


683-700: LGTM! Command registration properly integrates new RPC endpoints.

The registration correctly adds sendrawtransaction and testmempoolaccept under the "rawtransactions" category, aligning with their relocation from rawtransaction.cpp to mempool.cpp.

test/functional/test_framework/blocktools.py (1)

66-69: LGTM – Cleaner hex-to-transaction deserialization.

The direct use of tx_from_hex(tx) simplifies the code by removing the intermediate io.BytesIO step while maintaining identical functionality.

test/functional/rpc_generate.py (1)

54-97: Well-structured test coverage for generateblock RPC.

The test method provides comprehensive coverage of success and error paths including out-of-order transactions, missing mempool entries, invalid raw transactions, and various descriptor validation scenarios. The assertions and error messages are appropriate.

Comment on lines +13 to +14
the network router). See https://github.com/cjdelisle/cjdns#readme and
https://github.com/hyperboria/docs#hyperboriadocs for more information.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Fix markdownlint MD034 bare URLs.

CI is failing markdownlint because these lines use bare URLs. Wrap them as Markdown links (e.g. [CJDNS README](https://github.com/cjdelisle/cjdns#readme)), or enclose them in <…>, and do the same for the installation link on Line 30 so the lint check passes.

Also applies to: 30-30

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

13-13: Bare URL used

(MD034, no-bare-urls)


14-14: Bare URL used

(MD034, no-bare-urls)

🤖 Prompt for AI Agents
In doc/cjdns.md around lines 13-14 (and line 30), replace the bare URLs with
proper Markdown links or angle-bracketed URLs to satisfy MD034; for example wrap
each URL as [CJDNS README](https://github.com/cjdelisle/cjdns#readme) or
<https://github.com/cjdelisle/cjdns#readme> and do the same for the
hyperboria/docs link on lines 13-14 and the installation link on line 30 so
markdownlint passes.

Comment on lines +42 to +46
```
git clone https://github.com/hyperboria/peers hyperboria-peers
cd hyperboria-peers
./testAvailable.py
```
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Add a language hint to the shell snippet.

markdownlint (MD040) requires a language identifier on fenced blocks. Change the opening fence to something like ```bash so CI stops failing.

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

42-42: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In doc/cjdns.md around lines 42 to 46, the fenced code block lacks a language
hint which triggers markdownlint MD040; update the opening fence to include a
shell language identifier (for example the word bash) so the block becomes a
shell-highlighted fenced code block and CI will stop failing.

@github-actions github-actions bot mentioned this pull request Oct 1, 2025
5 tasks
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.

5 participants