Skip to content

feat(dash-spv): drive masternode sync via PipelineMode state machine#738

Open
xdustinface wants to merge 2 commits intov0.42-devfrom
feat/mn-pipeline-mode-state-machine
Open

feat(dash-spv): drive masternode sync via PipelineMode state machine#738
xdustinface wants to merge 2 commits intov0.42-devfrom
feat/mn-pipeline-mode-state-machine

Conversation

@xdustinface
Copy link
Copy Markdown
Collaborator

@xdustinface xdustinface commented May 6, 2026

Introduce a PipelineMode enum (QuorumValidation / Incremental) on MasternodeSyncState so the sync manager decides per tip whether to fire a full getqrinfo or a targeted GetMnListDiff. next_pipeline_mode is mining-window-aware: inside a cycle's DKG window it picks QuorumValidation until the cycle is fully verified, otherwise it picks Incremental to keep the tip list fresh.

Drop the CHAINLOCK_RETRY_DELAY retry (now redundant since feed_qr_info is resilient to missing rotation CL sigs) and replace the single QRINFO_TIMEOUT_SECS with a [10, 30, 60] per-attempt schedule. Add should_process_qrinfo to drop duplicate and unsolicited responses, and recover last_synced_block_hash from the engine on startup so restarts can resume with a targeted diff.

Plumb QRInfoFeedResult through SyncEvent::MasternodeStateUpdated so consumers can see what was qualified, fully verified, and stored on the same event. Add qr_infos_requested, validated_cycles, and rotation_cycles counters on MasternodesProgress so the masternode sync exposes per-cycle progress alongside the existing diffs_processed.

Summary by CodeRabbit

  • New Features

    • Two-mode masternode sync pipeline with smarter routing for full validation vs lightweight incremental updates
    • Expanded progress metrics reporting additional QRInfo/rotation counters
  • Bug Fixes

    • QRInfo deduplication and gating to ignore late/duplicate responses
    • Per-retry timeout escalation and clamping for more robust retries
    • Resilient completion paths to avoid aborting whole sync on partial verification failures and improved restart recovery

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 6, 2026

Review Change Stack

Warning

Rate limit exceeded

@xdustinface has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 53 minutes and 45 seconds before requesting another review.

To continue reviewing without waiting, purchase usage credits in the billing tab.

⌛ How to resolve this issue?

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

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

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

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d0002d4d-02f1-4ffa-8e38-9e8b33b7b7e6

📥 Commits

Reviewing files that changed from the base of the PR and between 4d3421b and 5bd2320.

📒 Files selected for processing (5)
  • dash-spv-ffi/src/callbacks.rs
  • dash-spv/src/sync/events.rs
  • dash-spv/src/sync/masternodes/manager.rs
  • dash-spv/src/sync/masternodes/progress.rs
  • dash-spv/src/sync/masternodes/sync_manager.rs
📝 Walkthrough

Walkthrough

Refactors masternode sync into PipelineMode (QuorumValidation vs Incremental), extends SyncEvent with optional QRInfo results, adds per-tip QRInfo gating and escalating QRInfo timeouts, introduces incremental completion and progress counters, updates header routing, tests, and the FFI callback match.

Changes

Masternode Sync Pipeline Refactoring

Layer / File(s) Summary
Data Shape
dash-spv/src/sync/events.rs
SyncEvent::MasternodeStateUpdated gains qr_info_result: Option<QRInfoFeedResult> and description now conditionally includes QR metrics.
Progress Counters
dash-spv/src/sync/masternodes/progress.rs
MasternodesProgress adds qr_infos_requested, validated_cycles, rotation_cycles with getters and increment APIs; Default and Display updated.
Manager State
dash-spv/src/sync/masternodes/manager.rs
Introduces PipelineMode enum and expands MasternodeSyncState with pipeline_mode, last_synced_block_hash, validated_cycle_heights, current_cycle_*, last_window_qrinfo_tip, last_processed_qrinfo_tip; new() recovers last_synced_block_hash.
Core Pipeline Logic
dash-spv/src/sync/masternodes/manager.rs
Implements next_pipeline_mode(), should_process_qrinfo(), record_qrinfo_attempt(), mark_cycle_validated(), send_tip_mnlistdiff_update(), complete_pipeline(), complete_incremental_pipeline(), and verify_and_complete(qr_info_result).
Sync Dispatch & Timeouts
dash-spv/src/sync/masternodes/sync_manager.rs
Replaces fixed QRInfo timeout with escalating schedule (QRINFO_TIMEOUT_SCHEDULE_SECS) and qrinfo_timeout_for; adds QRInfo dedup gate, captures qr_info_result, sets pipeline_mode, switches exhausted-retry and MnListDiff completion to complete_pipeline(), and routes header events via next_pipeline_mode().
Callback Integration
dash-spv-ffi/src/callbacks.rs
FFISyncEventCallbacks::dispatch pattern updated to destructure height and ignore extra fields for MasternodeStateUpdated.
Tests
dash-spv/src/sync/masternodes/manager.rs, dash-spv/src/sync/masternodes/sync_manager.rs
Adds tests for next_pipeline_mode behavior (per-tip gating, cycle rollover), QRInfo timeout schedule and clamping, QRInfo dedup gate, and updates progress/manager init tests for new counters and recovery.

Sequence Diagram

sequenceDiagram
    actor Sync as SyncManager
    participant Header as BlockHeaderStorage
    participant Manager as MasternodesManager
    participant Engine as MasternodeListEngine
    participant Requests as RequestSender

    rect rgba(100, 150, 200, 0.5)
    note over Sync,Requests: Pipeline Mode Selection
    Sync->>Manager: next_pipeline_mode(tip_height)
    Manager->>Manager: Check dkg window, cycles, attempts
    alt Mining window + fresh cycle
        Manager-->>Sync: PipelineMode::QuorumValidation
    else Incremental or out-of-window
        Manager-->>Sync: PipelineMode::Incremental
    end
    end

    rect rgba(150, 100, 200, 0.5)
    note over Sync,Requests: QuorumValidation Path
    Sync->>Requests: send_qrinfo_request()
    Sync->>Manager: record_qrinfo_attempt(tip_height)
    Sync->>Sync: waiting_for_qrinfo ← true
    Sync->>Engine: process qrinfo_feed()
    Engine-->>Sync: qr_info_result
    Sync->>Manager: mark_cycle_validated() if all verified
    Sync->>Manager: verify_and_complete(qr_info_result)
    Manager-->>Sync: SyncEvent[...MasternodeStateUpdated(qr_info_result)]
    end

    rect rgba(200, 150, 100, 0.5)
    note over Sync,Requests: Incremental Path
    Sync->>Manager: send_tip_mnlistdiff_update()
    Manager->>Requests: send_getmnlistdiff(last_synced_block_hash..tip)
    Manager-->>Sync: queued requests
    Sync->>Engine: apply_diff() for each response
    Sync->>Manager: complete_incremental_pipeline()
    Manager->>Engine: verify_non_rotating_quorums(latest_height)
    alt Verification succeeds
        Manager-->>Sync: SyncEvent[...MasternodeStateUpdated]
    else Verification fails
        Manager-->>Sync: Ok(vec![]) no event, logged warn
    end
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 The pipeline splits in two fine ways:
Quorum validates through QR's maze,
Incremental hops tip-by-tip,
Each cycle counted, each retry clipped,
A hopping rabbit cheers the sync's new praise.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: introducing a PipelineMode state machine to drive masternode sync decisions, which is the primary architectural change across multiple files.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/mn-pipeline-mode-state-machine

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.

@xdustinface
Copy link
Copy Markdown
Collaborator Author

xdustinface commented May 6, 2026

@CodeRabbit review!

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 6, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@xdustinface xdustinface marked this pull request as draft May 6, 2026 08:20
@codecov
Copy link
Copy Markdown

codecov Bot commented May 6, 2026

Codecov Report

❌ Patch coverage is 79.68254% with 64 lines in your changes missing coverage. Please review.
✅ Project coverage is 71.54%. Comparing base (dd7937a) to head (5bd2320).

Files with missing lines Patch % Lines
dash-spv/src/sync/masternodes/manager.rs 74.00% 59 Missing ⚠️
dash-spv/src/sync/events.rs 0.00% 4 Missing ⚠️
dash-spv/src/sync/masternodes/sync_manager.rs 98.33% 1 Missing ⚠️
Additional details and impacted files
@@              Coverage Diff              @@
##           v0.42-dev     #738      +/-   ##
=============================================
+ Coverage      71.49%   71.54%   +0.04%     
=============================================
  Files            320      320              
  Lines          69023    69327     +304     
=============================================
+ Hits           49350    49600     +250     
- Misses         19673    19727      +54     
Flag Coverage Δ
core 76.68% <ø> (ø)
ffi 46.20% <ø> (-0.02%) ⬇️
rpc 20.00% <ø> (ø)
spv 87.36% <79.68%> (-0.10%) ⬇️
wallet 70.07% <ø> (ø)
Files with missing lines Coverage Δ
dash-spv-ffi/src/callbacks.rs 80.14% <ø> (-0.24%) ⬇️
dash-spv/src/sync/masternodes/progress.rs 90.24% <100.00%> (+4.03%) ⬆️
dash-spv/src/sync/masternodes/sync_manager.rs 67.93% <98.33%> (+8.19%) ⬆️
dash-spv/src/sync/events.rs 60.46% <0.00%> (-4.54%) ⬇️
dash-spv/src/sync/masternodes/manager.rs 67.69% <74.00%> (+6.11%) ⬆️

... and 4 files with indirect coverage changes

@xdustinface xdustinface force-pushed the feat/mn-pipeline-mode-state-machine branch 3 times, most recently from 7d1a816 to c1a1015 Compare May 6, 2026 12:48
@xdustinface xdustinface force-pushed the fix/qr-info-rotation-quorums branch from c9d5141 to 25c3347 Compare May 6, 2026 13:05
@xdustinface xdustinface force-pushed the feat/mn-pipeline-mode-state-machine branch from c1a1015 to 60bf031 Compare May 6, 2026 13:06
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

Tip

For best results, initiate chat on the files or code changes.

@xdustinface Sure! I'll kick off a review of the PR right away.

[review]

@xdustinface
Copy link
Copy Markdown
Collaborator Author

@CodeRabbit review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (2)
dash-spv-ffi/src/callbacks.rs (1)

182-185: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Expose the new masternode update payload through the FFI API.

The Rust event now carries qr_info_result, but this callback still exports only height, and dispatch drops the new field with ... That leaves C/Swift consumers unable to observe the qualification / verification / stored-cycle data this PR is adding to MasternodeStateUpdated. Please add a C-compatible payload struct or a companion callback so the FFI surface preserves the new event semantics.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dash-spv-ffi/src/callbacks.rs` around lines 182 - 185, The current
OnMasternodeStateUpdatedCallback only exposes height and drops the new
qr_info_result field from SyncEvent::MasternodeStateUpdated in dispatch; update
the FFI to preserve that payload by defining a C-compatible struct (e.g.,
MasternodeQrInfoPayload or MasternodeStateUpdatedPayload) that includes height
and the qr_info_result fields (or minimal primitives representing
qualification/verification/stored-cycle data), and change
OnMasternodeStateUpdatedCallback to accept a pointer to that struct (or add a
companion extern "C" callback type like OnMasternodeQrInfoCallback) and marshal
qr_info_result into the C struct in the dispatch path so the FFI consumers
(C/Swift) can access the new data rather than it being dropped.
dash-spv/src/sync/masternodes/sync_manager.rs (1)

583-603: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The QRInfo retry budget is off by one.

retry_count is indexed so 0 is the initial send, but this condition still resends when the last schedule slot (retry_count == 2) times out. That produces a fourth request and another 60-second wait, so the actual worst-case is 160s instead of the documented 100s.

Suggested fix
-                    if self.sync_state.qrinfo_retry_count < MAX_RETRY_ATTEMPTS {
+                    if self.sync_state.qrinfo_retry_count
+                        < MAX_RETRY_ATTEMPTS.saturating_sub(1)
+                    {
                         tracing::warn!(
                             timeout_secs = timeout.as_secs(),
                             retry_count = self.sync_state.qrinfo_retry_count,
                             "Timeout waiting for QRInfo response, retrying..."
                         );
                         self.sync_state.qrinfo_retry_count += 1;
                         self.sync_state.clear_pending();
                         return self.send_qrinfo_for_tip(requests).await;
                     } else {
                         tracing::warn!(
                             "QRInfo timeout after {} retries, skipping masternode sync",
-                            MAX_RETRY_ATTEMPTS
+                            MAX_RETRY_ATTEMPTS.saturating_sub(1)
                         );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dash-spv/src/sync/masternodes/sync_manager.rs` around lines 583 - 603, The
QRInfo retry condition allows one extra send because retry_count is
zero-indexed; change the resend guard from self.sync_state.qrinfo_retry_count <
MAX_RETRY_ATTEMPTS to self.sync_state.qrinfo_retry_count < (MAX_RETRY_ATTEMPTS -
1) so we don't schedule a fourth request when qrinfo_retry_count == 2. Update
the branch that calls send_qrinfo_for_tip (in sync_manager.rs, around
send_qrinfo_for_tip, complete_pipeline, qrinfo_timeout_for and
self.sync_state.qrinfo_retry_count) to use that adjusted comparison and ensure
the warning message still reflects the actual remaining retries if desired.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dash-spv/src/sync/masternodes/sync_manager.rs`:
- Around line 427-465: The branch that launches a new pipeline (via
next_pipeline_mode -> send_qrinfo_for_tip or send_tip_mnlistdiff_update) must
not start if a previous pipeline still has pending work; add a guard at the top
of this Synced branch that returns early when the sync_state indicates
outstanding pipeline work (e.g. implement SyncState::has_pending_work() or
similar to check waiting_for_qrinfo, an in-flight qr_info_result, or a non-empty
pending queue) and use it: if self.sync_state.has_pending_work() {
tracing::debug!("pipeline pending, skipping new tip pipeline"); return
Ok(vec![]); } Apply the same guard in the analogous BlockHeaderSyncComplete
branch so a new Incremental/QuorumValidation mode is not started while earlier
MnListDiffs are still draining.

---

Outside diff comments:
In `@dash-spv-ffi/src/callbacks.rs`:
- Around line 182-185: The current OnMasternodeStateUpdatedCallback only exposes
height and drops the new qr_info_result field from
SyncEvent::MasternodeStateUpdated in dispatch; update the FFI to preserve that
payload by defining a C-compatible struct (e.g., MasternodeQrInfoPayload or
MasternodeStateUpdatedPayload) that includes height and the qr_info_result
fields (or minimal primitives representing
qualification/verification/stored-cycle data), and change
OnMasternodeStateUpdatedCallback to accept a pointer to that struct (or add a
companion extern "C" callback type like OnMasternodeQrInfoCallback) and marshal
qr_info_result into the C struct in the dispatch path so the FFI consumers
(C/Swift) can access the new data rather than it being dropped.

In `@dash-spv/src/sync/masternodes/sync_manager.rs`:
- Around line 583-603: The QRInfo retry condition allows one extra send because
retry_count is zero-indexed; change the resend guard from
self.sync_state.qrinfo_retry_count < MAX_RETRY_ATTEMPTS to
self.sync_state.qrinfo_retry_count < (MAX_RETRY_ATTEMPTS - 1) so we don't
schedule a fourth request when qrinfo_retry_count == 2. Update the branch that
calls send_qrinfo_for_tip (in sync_manager.rs, around send_qrinfo_for_tip,
complete_pipeline, qrinfo_timeout_for and self.sync_state.qrinfo_retry_count) to
use that adjusted comparison and ensure the warning message still reflects the
actual remaining retries if desired.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 084ccea3-ad53-47c3-90b7-27037c6822ce

📥 Commits

Reviewing files that changed from the base of the PR and between 25c3347 and 60bf031.

📒 Files selected for processing (5)
  • dash-spv-ffi/src/callbacks.rs
  • dash-spv/src/sync/events.rs
  • dash-spv/src/sync/masternodes/manager.rs
  • dash-spv/src/sync/masternodes/progress.rs
  • dash-spv/src/sync/masternodes/sync_manager.rs

Comment thread dash-spv/src/sync/masternodes/sync_manager.rs
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 7, 2026
xdustinface added a commit that referenced this pull request May 7, 2026
When a `QRInfo` response is processed the `waiting_for_qrinfo` flag clears immediately while the historical `MnListDiff`s still drain through `mnlistdiff_pipeline`. Until then `pipeline_mode` holds `QuorumValidation { qr_info_result }`. A subsequent `BlockHeadersStored` (or `BlockHeaderSyncComplete`) firing in `Synced` could see `next_pipeline_mode` return `Incremental` (the cycle was just marked validated), call `send_tip_mnlistdiff_update`, overwrite `pipeline_mode = Incremental`, and append a tip request onto the still-draining queue. When the shared pipeline finally completes, `complete_pipeline` dispatched to `complete_incremental_pipeline` and the original `qr_info_result` (with rotated quorum data) was discarded.

Add the `has_pending_requests()` early-return at the top of both `Synced` arms, mirroring the guard the `tick` handler already uses. The `tick` handler picks up any tip gap once the pipeline drains, so no incremental update is lost.

Addresses CodeRabbit review comment on PR [#738](#738)
[review comment](#738 (comment))
Base automatically changed from fix/qr-info-rotation-quorums to v0.42-dev May 7, 2026 09:35
@xdustinface xdustinface dismissed coderabbitai[bot]’s stale review May 7, 2026 09:35

The base branch was changed.

@xdustinface xdustinface marked this pull request as ready for review May 7, 2026 09:36
Introduce a `PipelineMode` enum (`QuorumValidation` / `Incremental`) on `MasternodeSyncState` so the sync manager decides per tip whether to fire a full `getqrinfo` or a targeted `GetMnListDiff`. `next_pipeline_mode` is mining-window-aware: inside a cycle's DKG window it picks `QuorumValidation` until the cycle is fully verified, otherwise it picks `Incremental` to keep the tip list fresh.

Drop the `CHAINLOCK_RETRY_DELAY` retry (now redundant since `feed_qr_info` is resilient to missing rotation CL sigs) and replace the single `QRINFO_TIMEOUT_SECS` with a `[10, 30, 60]` per-attempt schedule. Add `should_process_qrinfo` to drop duplicate and unsolicited responses, and recover `last_synced_block_hash` from the engine on startup so restarts can resume with a targeted diff.

Plumb `QRInfoFeedResult` through `SyncEvent::MasternodeStateUpdated` so consumers can see what was qualified, fully verified, and stored on the same event. Add `qr_infos_requested`, `validated_cycles`, and `rotation_cycles` counters on `MasternodesProgress` so the masternode sync exposes per-cycle progress alongside the existing `diffs_processed`.
When a `QRInfo` response is processed the `waiting_for_qrinfo` flag clears immediately while the historical `MnListDiff`s still drain through `mnlistdiff_pipeline`. Until then `pipeline_mode` holds `QuorumValidation { qr_info_result }`. A subsequent `BlockHeadersStored` (or `BlockHeaderSyncComplete`) firing in `Synced` could see `next_pipeline_mode` return `Incremental` (the cycle was just marked validated), call `send_tip_mnlistdiff_update`, overwrite `pipeline_mode = Incremental`, and append a tip request onto the still-draining queue. When the shared pipeline finally completes, `complete_pipeline` dispatched to `complete_incremental_pipeline` and the original `qr_info_result` (with rotated quorum data) was discarded.

Add the `has_pending_requests()` early-return at the top of both `Synced` arms, mirroring the guard the `tick` handler already uses. The `tick` handler picks up any tip gap once the pipeline drains, so no incremental update is lost.

Addresses CodeRabbit review comment on PR [#738](#738)
[review comment](#738 (comment))
@xdustinface xdustinface force-pushed the feat/mn-pipeline-mode-state-machine branch from 4d3421b to 5bd2320 Compare May 7, 2026 09:41
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dash-spv/src/sync/masternodes/sync_manager.rs`:
- Around line 18-39: The retry loop currently lets qrinfo_retry_count reach a
value equal to QRINFO_TIMEOUT_SCHEDULE_SECS.len(), causing a 4th attempt that is
clamped by qrinfo_timeout_for; to fix (Option B) keep MAX_RETRY_ATTEMPTS =
QRINFO_TIMEOUT_SCHEDULE_SECS.len() as u8 and change the retry logic in the tick
loop that increments/compares qrinfo_retry_count so it prevents entering an
attempt whose retry_count == QRINFO_TIMEOUT_SCHEDULE_SECS.len() (i.e., check the
limit before doing the post-increment or use < MAX_RETRY_ATTEMPTS against the
value that will be used), ensuring qrinfo_timeout_for remains purely defensive
and total attempts equal the schedule length.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f776e982-f511-45ec-afbd-5441b180959e

📥 Commits

Reviewing files that changed from the base of the PR and between 60bf031 and 4d3421b.

📒 Files selected for processing (1)
  • dash-spv/src/sync/masternodes/sync_manager.rs

Comment thread dash-spv/src/sync/masternodes/sync_manager.rs
Copy link
Copy Markdown
Member

@QuantumExplorer QuantumExplorer left a comment

Choose a reason for hiding this comment

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

AI likes it, I like it.

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.

2 participants