Skip to content

fix: connection status not clear#532

Merged
PastaPastaPasta merged 10 commits into
v1.0-devfrom
fix/conn-status
Feb 10, 2026
Merged

fix: connection status not clear#532
PastaPastaPasta merged 10 commits into
v1.0-devfrom
fix/conn-status

Conversation

@lklimek
Copy link
Copy Markdown
Contributor

@lklimek lklimek commented Feb 5, 2026

Fix #62

Note: as we move towards SPV, we don't want to improve the core/zmq detection too much; right now, we just query every core few seconds.

Summary by CodeRabbit

  • New Features

    • Centralized connection-status monitoring with unified RPC/ZMQ/SPV state, dynamic tooltip messages, and backend-mode awareness.
    • Expanded action-driven navigation and onboarding actions enabling richer screen flows and background-task triggers.
  • Improvements

    • UI integrates status into per-frame updates, schedules periodic refreshes, and shows consolidated connectivity/sync panels across screens.
    • SPV status rendering and human-readable SPV state strings.
  • Breaking Changes

    • Public app/state/action API expanded; integrations must handle new state fields and action variants.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 5, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • ✅ Review completed - (🔄 Check again to review again)
📝 Walkthrough

Walkthrough

Introduces a new centralized ConnectionStatus type tracked in AppContext/AppState, expands AppAction variants, refactors the action/update flow to use connection_status for refresh/task orchestration, updates UI to surface RPC/ZMQ/SPV status, and makes SpvStatus numeric/convertible.

Changes

Cohort / File(s) Summary
Core Status Management
src/context.rs, src/context/connection_status.rs
Add ConnectionStatus (rpc/zmq/spv state, refresh, task handling). Replace zmq_connection_status with connection_status on AppContext, update constructor signature and add accessor.
App Flow & State
src/app.rs
Wire shared connection_status: Arc<ConnectionStatus> into AppState and AppContext instances. Expand AppAction variants and refactor update loop to centralize action handling, schedule connection refreshes, and consume backend task results via actions.
UI Integration
src/ui/components/top_panel.rs, src/ui/network_chooser_screen.rs
UI now queries AppContext::connection_status() (uses overall_connected(), rpc_online(), tooltip_text()), remove per-network boolean core-status fields, and render unified RPC/ZMQ/SPV status; click/startup logic respects backend mode.
SPV Representation
src/spv/manager.rs
Make SpvStatus #[repr(u8)] with explicit discriminants, add From<u8> and Display for stable numeric mapping and readable labels.
Tests / Callsites
src/ui/tokens/tokens_screen/mod.rs
Update AppContext::new test callsites to pass additional connection_status argument (use Default::default() in tests).

Sequence Diagram

sequenceDiagram
    participant AppLoop as App Update Loop
    participant Screen as Screen / UI
    participant ConnStatus as ConnectionStatus
    participant ActionProc as Action Processor
    participant Backend as Backend / Tasks
    participant UI as UI Renderer

    AppLoop->>Screen: collect actions()
    AppLoop->>ConnStatus: trigger_refresh(app_context)
    ConnStatus->>ConnStatus: evaluate RPC/ZMQ/SPV, refresh_overall()
    ConnStatus-->>AppLoop: optional AppAction (e.g., BackendTasks)
    AppLoop->>ActionProc: aggregate & dispatch actions
    loop process actions
        ActionProc->>ConnStatus: query status (overall_connected, rpc_online, tooltip_text)
        ActionProc->>Backend: dispatch BackendTask(s)
        Backend-->>ActionProc: send task_result (via channel)
        ActionProc->>AppLoop: enqueue follow-up AppAction(s)
        ActionProc->>UI: push/pop/refresh screens
        UI->>UI: render updates
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Poem

🐇 I sniff the wires where statuses play,
RPC, ZMQ, SPV now hop in array,
Actions tumble, screens leap to the fray,
One shared heart beats steady all day,
I thump — connections find their way.

🚥 Pre-merge checks | ✅ 1 | ❌ 4
❌ Failed checks (1 warning, 3 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.95% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'fix: connection status not clear' is vague and doesn't capture the main change of centralizing connection status handling across RPC, ZMQ, and SPV backends. Consider a more descriptive title such as 'Centralize connection status handling for RPC, ZMQ, and SPV' to better reflect the architectural refactoring.
Linked Issues check ❓ Inconclusive The PR addresses #62 by displaying RPC and ZMQ status on the Choose Network screen and making the status dot reflect both connections. However, a regression was identified: update_from_chainlocks only updates active network contexts, causing non-active networks to appear stale, directly undermining the PR's goal of clearer multi-network status. Verify that the chainlocks handling regression affecting non-active networks has been properly resolved, as it undermines the core requirement of displaying consistent network status across all networks.
Out of Scope Changes check ❓ Inconclusive The PR includes in-scope centralization of connection status and out-of-scope architectural changes like refactoring AppAction enum variants and updating SpvStatus with explicit discriminants. While some changes support the core objective, the expansion of AppAction and modifications to SpvStatus appear broader than necessary. Clarify whether the AppAction enum expansion and SpvStatus discriminant changes are essential to fixing connection status clarity, or if they should be extracted into separate PRs.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/conn-status

Tip

We've launched Issue Planner and it is currently in beta. Please try it out and share your feedback on Discord!


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.

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 (1)
src/context.rs (1)

4-22: ⚠️ Potential issue | 🟡 Minor

Run cargo fmt to fix the formatting failure.

Line 4-22 is flagged by CI (cargo fmt --all -- --check) for formatting/import ordering. Please re-run cargo fmt --all and commit the result.

As per coding guidelines: **/*.rs: Run cargo fmt --all to format code.

🤖 Fix all issues with AI agents
In `@src/context/connection_status.rs`:
- Around line 231-250: The trigger_refresh logic must refresh SPV status before
deciding whether to throttle and whether to poll chainlocks: call
self.refersh_zmq_and_spv(app_context) and then recompute let now_connected =
self.overall_connected() (or similar) before choosing timeout (REFRESH_CONNECTED
/ REFRESH_DISCONNECTED) and before the early return, and only return
AppAction::BackendTask(BackendTask::CoreTask(CoreTask::GetBestChainLocks)) when
now_connected (RPC mode) is true; in short, move or add the SPV refresh before
the overall_connected check and gate scheduling of GetBestChainLocks on the
recomputed overall_connected state.
🧹 Nitpick comments (1)
src/context/connection_status.rs (1)

16-173: Add inline unit tests for ConnectionStatus state transitions.

Line 16-173 introduces branchy status logic (RPC/ZMQ disable, SPV state) that would benefit from #[test] coverage for overall_connected and tooltip_text.

As per coding guidelines: **/*.rs: Write unit tests inline in source files using #[test] attribute.

Comment thread src/context/connection_status.rs
@PastaPastaPasta
Copy link
Copy Markdown
Member

Please see Claude's review:

Issues & Suggestions

  Bugs / Correctness

  1. Typo: refersh_zmq_and_spv (connection_status.rs:252)
    - Should be refresh_zmq_and_spv. Minor but shows up in the public module.
  2. update_from_chainlocks only updates the active context's ConnectionStatus
  (connection_status.rs:175-191)
    - The ChainLocks result contains data for all networks, but handle_task_result is called on
  active_context.connection_status() only. This means when the network chooser screen calls
  check_network_status() for a non-active network (e.g. testnet while mainnet is active), it reads
  rpc_online() from that network's AppContext.connection_status — which was never updated because
  handle_task_result only ran on the active context.
    - The old code directly set mainnet_core_status_online, testnet_core_status_online, etc. from
  the chainlock result. The new code only sets rpc_online on the current context's
  ConnectionStatus.
    - This is a regression for multi-network status display on the network chooser screen. The
  non-active network contexts will always show disconnected.
  3. spv_connected is redundant with is_active() (connection_status.rs:92-94)
    - SpvStatus::Running is already included in is_active() (see manager.rs:73-74), so
  status.is_active() || status == SpvStatus::Running is equivalent to just status.is_active(). Not
  a bug, but misleading.
  4. NetworkChooserScreen::display_message and display_task_result are now no-ops
  (network_chooser_screen.rs:1908, 1913)
    - The methods now just do let _ = message; and let _ = backend_task_success_result;. This is
  intentional since status updates moved to ConnectionStatus, but the error message string-matching
   in handle_task_result (connection_status.rs:219-225) is fragile — if the error message format
  ever changes, the disconnection detection silently breaks.

  Dead Code

  5. Unused public methods in ConnectionStatus:
    - rpc_connected() — never called outside the module, just wraps rpc_online().
    - zmq_required() — never called.
    - rpc_zmq_healthy() — never called.
    - overall_connected_with() — never called.

  These look like they were planned for future use but add API surface with no consumers. Consider
  removing or marking as #[allow(dead_code)] with a comment.

  Style / Minor

  6. Hardcoded discriminant values for SpvStatus (connection_status.rs:60-69)
    - The spv_status() method manually maps 1 => Starting, 2 => Syncing, etc. This is fragile if
  SpvStatus variants are ever reordered. Consider deriving or implementing a From<u8> on SpvStatus
  itself, or using #[repr(u8)] on the enum.
  7. actions Vec in app.rs is always exactly 2 elements (app.rs diff lines 35-59)
    - The refactor from single action to Vec<AppAction> is fine for extensibility, but currently
  always pushes exactly 2 items (screen action + connection refresh). A small point, but the old
  code was arguably clearer. This is fine as-is if more actions are expected.
  8. get_settings() called on every refresh cycle (connection_status.rs:265-270)
    - refersh_zmq_and_spv reads settings from the database every 2-10s to check disable_zmq. This
  is a DB query on the UI thread. Probably negligible for SQLite, but worth being aware of.

  ---
  Risk Assessment

  - Medium risk: The multi-network status regression (issue #2) means non-active networks will
  always appear disconnected on the network chooser screen. This directly undermines the PR's goal
  of making connection status clearer.
  - Low risk: The rest of the changes are straightforward refactoring with good structure.

  Verdict

  The centralization approach is solid, but the multi-network chainlock status regression needs to
  be addressed before merge. The handle_task_result in app.rs runs only on the active context, so
  chainlock results for other networks are silently dropped. The fix would be to either iterate
  over all network contexts when processing ChainLocks results, or to update update_from_chainlocks
   to dispatch to the correct per-network ConnectionStatus.

Copy link
Copy Markdown
Member

@PastaPastaPasta PastaPastaPasta left a comment

Choose a reason for hiding this comment

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

see above

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ___________________________________________________________________________\n> < In Vino Veritas, In Codice Bugas. In wine, there is truth; in code, bugs. >\n>  ---------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nIntroduces a centralized `ConnectionStatus` for RPC/ZMQ/SPV state and replaces immediate AppAction handling with an aggregated actions-driven update loop. UI screens and components now query `AppContext::connection_status()` and navigation/backend actions are expanded and processed from an actions list.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Core Status Management** <br> `src/context.rs`, `src/context/connection_status.rs`|Adds `ConnectionStatus` struct and API to centralize RPC/ZMQ/SPV connectivity, refresh orchestration, and task-result handling. Replaces `zmq_connection_status` in `AppContext` with `connection_status` and exposes accessor methods.|\n|**App Flow Refactor** <br> `src/app.rs`|Reworks main update loop to aggregate and process a list of `AppAction`s. Expands `AppAction` with many navigation and backend-related variants (pop/add/set main screen, BackendTask(s), Custom, OnboardingComplete with fields). Integrates periodic refresh trigger into action flow.|\n|**UI Integration** <br> `src/ui/components/top_panel.rs`, `src/ui/network_chooser_screen.rs`|UI now consumes `ConnectionStatus` (e.g., `overall_connected()`, `rpc_online()`, `tooltip_text()`), removes per-network boolean fields from `NetworkChooserScreen`, and updates connection-indicator click behavior to be backend-mode-aware. Renders unified RPC/ZMQ/SPV status panel.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n    participant AppLoop as App Update Loop\n    participant Welcome as Welcome/Current Screen\n    participant Refresh as Refresh Trigger\n    participant ConnStatus as ConnectionStatus\n    participant ActionProc as Action Processor\n    participant UI as UI Component\n\n    AppLoop->>Welcome: collect actions()\n    AppLoop->>Refresh: append trigger_refresh()\n    Refresh->>ConnStatus: trigger_refresh(app_context)\n    ConnStatus->>ConnStatus: evaluate RPC/ZMQ/SPV state\n    ConnStatus-->>AppLoop: return AppAction (if any)\n    AppLoop->>AppLoop: aggregate actions list\n    loop process actions\n        AppLoop->>ActionProc: handle(action)\n        ActionProc->>ConnStatus: query status (overall_connected, rpc_online, tooltip_text)\n        ConnStatus-->>UI: provide status data\n        ActionProc->>UI: push/pop/refresh screens or dispatch backend tasks\n        UI->>UI: render updates\n    end\n```\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~50 minutes\n\n## Poem\n\n> 🐇 I hop through signals, bright and keen,  \n> I bundle actions into one clean stream—  \n> RPC, ZMQ, SPV in view,  \n> Screens reshaped and statuses true,  \n> Hooray for tidy network dream!\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3 | ❌ 2</summary>\n\n<details>\n<summary>❌ Failed checks (2 warnings)</summary>\n\n|         Check name         | Status     | Explanation                                                                                                                                                                                                      | Resolution                                                                                                                                             |\n| :------------------------: | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Out of Scope Changes check | ⚠️ Warning | The PR introduces an extensive architectural refactor of the action handling system and connection status management that goes significantly beyond the issue's scope of displaying connection status on the UI. | Consider separating the action aggregation refactoring (app.rs) from the connection status display improvements to keep the PR focused and reviewable. |\n|     Docstring Coverage     | ⚠️ Warning | Docstring coverage is 5.41% which is insufficient. The required threshold is 80.00%.                                                                                                                             | Write docstrings for the functions missing them to satisfy the coverage threshold.                                                                     |\n\n</details>\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|      Check name     | Status   | Explanation                                                                                                                                                                                                              |\n| :-----------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check  | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                              |\n|     Title check     | ✅ Passed | The title 'fix: connection status not clear' directly references the issue being addressed but lacks specificity about the implemented solution.                                                                         |\n| Linked Issues check | ✅ Passed | The PR successfully implements both primary objectives: shows labeled RPC and ZMQ status on the Choose Network screen, and makes the status dot reflect both connections via the centralized ConnectionStatus mechanism. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `fix/conn-status`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dashpay/dash-evo-tool&utm_content=532)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:01 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"2804:59E6F:CF216D:37E90BF:698A083F","x-ratelimit-limit":"11250","x-ratelimit-remaining":"11233","x-ratelimit-reset":"1770657304","x-ratelimit-resource":"core","x-ratelimit-used":"17","x-xss-protection":"0"},"data":""}}

3 similar comments
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ___________________________________________________________________________\n> < In Vino Veritas, In Codice Bugas. In wine, there is truth; in code, bugs. >\n>  ---------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nIntroduces a centralized `ConnectionStatus` for RPC/ZMQ/SPV state and replaces immediate AppAction handling with an aggregated actions-driven update loop. UI screens and components now query `AppContext::connection_status()` and navigation/backend actions are expanded and processed from an actions list.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Core Status Management** <br> `src/context.rs`, `src/context/connection_status.rs`|Adds `ConnectionStatus` struct and API to centralize RPC/ZMQ/SPV connectivity, refresh orchestration, and task-result handling. Replaces `zmq_connection_status` in `AppContext` with `connection_status` and exposes accessor methods.|\n|**App Flow Refactor** <br> `src/app.rs`|Reworks main update loop to aggregate and process a list of `AppAction`s. Expands `AppAction` with many navigation and backend-related variants (pop/add/set main screen, BackendTask(s), Custom, OnboardingComplete with fields). Integrates periodic refresh trigger into action flow.|\n|**UI Integration** <br> `src/ui/components/top_panel.rs`, `src/ui/network_chooser_screen.rs`|UI now consumes `ConnectionStatus` (e.g., `overall_connected()`, `rpc_online()`, `tooltip_text()`), removes per-network boolean fields from `NetworkChooserScreen`, and updates connection-indicator click behavior to be backend-mode-aware. Renders unified RPC/ZMQ/SPV status panel.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n    participant AppLoop as App Update Loop\n    participant Welcome as Welcome/Current Screen\n    participant Refresh as Refresh Trigger\n    participant ConnStatus as ConnectionStatus\n    participant ActionProc as Action Processor\n    participant UI as UI Component\n\n    AppLoop->>Welcome: collect actions()\n    AppLoop->>Refresh: append trigger_refresh()\n    Refresh->>ConnStatus: trigger_refresh(app_context)\n    ConnStatus->>ConnStatus: evaluate RPC/ZMQ/SPV state\n    ConnStatus-->>AppLoop: return AppAction (if any)\n    AppLoop->>AppLoop: aggregate actions list\n    loop process actions\n        AppLoop->>ActionProc: handle(action)\n        ActionProc->>ConnStatus: query status (overall_connected, rpc_online, tooltip_text)\n        ConnStatus-->>UI: provide status data\n        ActionProc->>UI: push/pop/refresh screens or dispatch backend tasks\n        UI->>UI: render updates\n    end\n```\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~50 minutes\n\n## Poem\n\n> 🐇 I hop through signals, bright and keen,  \n> I bundle actions into one clean stream—  \n> RPC, ZMQ, SPV in view,  \n> Screens reshaped and statuses true,  \n> Hooray for tidy network dream!\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3 | ❌ 2</summary>\n\n<details>\n<summary>❌ Failed checks (2 warnings)</summary>\n\n|         Check name         | Status     | Explanation                                                                                                                                                                                                      | Resolution                                                                                                                                             |\n| :------------------------: | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Out of Scope Changes check | ⚠️ Warning | The PR introduces an extensive architectural refactor of the action handling system and connection status management that goes significantly beyond the issue's scope of displaying connection status on the UI. | Consider separating the action aggregation refactoring (app.rs) from the connection status display improvements to keep the PR focused and reviewable. |\n|     Docstring Coverage     | ⚠️ Warning | Docstring coverage is 5.41% which is insufficient. The required threshold is 80.00%.                                                                                                                             | Write docstrings for the functions missing them to satisfy the coverage threshold.                                                                     |\n\n</details>\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|      Check name     | Status   | Explanation                                                                                                                                                                                                              |\n| :-----------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check  | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                              |\n|     Title check     | ✅ Passed | The title 'fix: connection status not clear' directly references the issue being addressed but lacks specificity about the implemented solution.                                                                         |\n| Linked Issues check | ✅ Passed | The PR successfully implements both primary objectives: shows labeled RPC and ZMQ status on the Choose Network screen, and makes the status dot reflect both connections via the centralized ConnectionStatus mechanism. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `fix/conn-status`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dashpay/dash-evo-tool&utm_content=532)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:01 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"2804:59E6F:CF216D:37E90BF:698A083F","x-ratelimit-limit":"11250","x-ratelimit-remaining":"11233","x-ratelimit-reset":"1770657304","x-ratelimit-resource":"core","x-ratelimit-used":"17","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ___________________________________________________________________________\n> < In Vino Veritas, In Codice Bugas. In wine, there is truth; in code, bugs. >\n>  ---------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nIntroduces a centralized `ConnectionStatus` for RPC/ZMQ/SPV state and replaces immediate AppAction handling with an aggregated actions-driven update loop. UI screens and components now query `AppContext::connection_status()` and navigation/backend actions are expanded and processed from an actions list.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Core Status Management** <br> `src/context.rs`, `src/context/connection_status.rs`|Adds `ConnectionStatus` struct and API to centralize RPC/ZMQ/SPV connectivity, refresh orchestration, and task-result handling. Replaces `zmq_connection_status` in `AppContext` with `connection_status` and exposes accessor methods.|\n|**App Flow Refactor** <br> `src/app.rs`|Reworks main update loop to aggregate and process a list of `AppAction`s. Expands `AppAction` with many navigation and backend-related variants (pop/add/set main screen, BackendTask(s), Custom, OnboardingComplete with fields). Integrates periodic refresh trigger into action flow.|\n|**UI Integration** <br> `src/ui/components/top_panel.rs`, `src/ui/network_chooser_screen.rs`|UI now consumes `ConnectionStatus` (e.g., `overall_connected()`, `rpc_online()`, `tooltip_text()`), removes per-network boolean fields from `NetworkChooserScreen`, and updates connection-indicator click behavior to be backend-mode-aware. Renders unified RPC/ZMQ/SPV status panel.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n    participant AppLoop as App Update Loop\n    participant Welcome as Welcome/Current Screen\n    participant Refresh as Refresh Trigger\n    participant ConnStatus as ConnectionStatus\n    participant ActionProc as Action Processor\n    participant UI as UI Component\n\n    AppLoop->>Welcome: collect actions()\n    AppLoop->>Refresh: append trigger_refresh()\n    Refresh->>ConnStatus: trigger_refresh(app_context)\n    ConnStatus->>ConnStatus: evaluate RPC/ZMQ/SPV state\n    ConnStatus-->>AppLoop: return AppAction (if any)\n    AppLoop->>AppLoop: aggregate actions list\n    loop process actions\n        AppLoop->>ActionProc: handle(action)\n        ActionProc->>ConnStatus: query status (overall_connected, rpc_online, tooltip_text)\n        ConnStatus-->>UI: provide status data\n        ActionProc->>UI: push/pop/refresh screens or dispatch backend tasks\n        UI->>UI: render updates\n    end\n```\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~50 minutes\n\n## Poem\n\n> 🐇 I hop through signals, bright and keen,  \n> I bundle actions into one clean stream—  \n> RPC, ZMQ, SPV in view,  \n> Screens reshaped and statuses true,  \n> Hooray for tidy network dream!\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3 | ❌ 2</summary>\n\n<details>\n<summary>❌ Failed checks (2 warnings)</summary>\n\n|         Check name         | Status     | Explanation                                                                                                                                                                                                      | Resolution                                                                                                                                             |\n| :------------------------: | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Out of Scope Changes check | ⚠️ Warning | The PR introduces an extensive architectural refactor of the action handling system and connection status management that goes significantly beyond the issue's scope of displaying connection status on the UI. | Consider separating the action aggregation refactoring (app.rs) from the connection status display improvements to keep the PR focused and reviewable. |\n|     Docstring Coverage     | ⚠️ Warning | Docstring coverage is 5.41% which is insufficient. The required threshold is 80.00%.                                                                                                                             | Write docstrings for the functions missing them to satisfy the coverage threshold.                                                                     |\n\n</details>\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|      Check name     | Status   | Explanation                                                                                                                                                                                                              |\n| :-----------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check  | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                              |\n|     Title check     | ✅ Passed | The title 'fix: connection status not clear' directly references the issue being addressed but lacks specificity about the implemented solution.                                                                         |\n| Linked Issues check | ✅ Passed | The PR successfully implements both primary objectives: shows labeled RPC and ZMQ status on the Choose Network screen, and makes the status dot reflect both connections via the centralized ConnectionStatus mechanism. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `fix/conn-status`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dashpay/dash-evo-tool&utm_content=532)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:01 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"2804:59E6F:CF216D:37E90BF:698A083F","x-ratelimit-limit":"11250","x-ratelimit-remaining":"11233","x-ratelimit-reset":"1770657304","x-ratelimit-resource":"core","x-ratelimit-used":"17","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ___________________________________________________________________________\n> < In Vino Veritas, In Codice Bugas. In wine, there is truth; in code, bugs. >\n>  ---------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nIntroduces a centralized `ConnectionStatus` for RPC/ZMQ/SPV state and replaces immediate AppAction handling with an aggregated actions-driven update loop. UI screens and components now query `AppContext::connection_status()` and navigation/backend actions are expanded and processed from an actions list.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Core Status Management** <br> `src/context.rs`, `src/context/connection_status.rs`|Adds `ConnectionStatus` struct and API to centralize RPC/ZMQ/SPV connectivity, refresh orchestration, and task-result handling. Replaces `zmq_connection_status` in `AppContext` with `connection_status` and exposes accessor methods.|\n|**App Flow Refactor** <br> `src/app.rs`|Reworks main update loop to aggregate and process a list of `AppAction`s. Expands `AppAction` with many navigation and backend-related variants (pop/add/set main screen, BackendTask(s), Custom, OnboardingComplete with fields). Integrates periodic refresh trigger into action flow.|\n|**UI Integration** <br> `src/ui/components/top_panel.rs`, `src/ui/network_chooser_screen.rs`|UI now consumes `ConnectionStatus` (e.g., `overall_connected()`, `rpc_online()`, `tooltip_text()`), removes per-network boolean fields from `NetworkChooserScreen`, and updates connection-indicator click behavior to be backend-mode-aware. Renders unified RPC/ZMQ/SPV status panel.|\n\n## Sequence Diagram\n\n```mermaid\nsequenceDiagram\n    participant AppLoop as App Update Loop\n    participant Welcome as Welcome/Current Screen\n    participant Refresh as Refresh Trigger\n    participant ConnStatus as ConnectionStatus\n    participant ActionProc as Action Processor\n    participant UI as UI Component\n\n    AppLoop->>Welcome: collect actions()\n    AppLoop->>Refresh: append trigger_refresh()\n    Refresh->>ConnStatus: trigger_refresh(app_context)\n    ConnStatus->>ConnStatus: evaluate RPC/ZMQ/SPV state\n    ConnStatus-->>AppLoop: return AppAction (if any)\n    AppLoop->>AppLoop: aggregate actions list\n    loop process actions\n        AppLoop->>ActionProc: handle(action)\n        ActionProc->>ConnStatus: query status (overall_connected, rpc_online, tooltip_text)\n        ConnStatus-->>UI: provide status data\n        ActionProc->>UI: push/pop/refresh screens or dispatch backend tasks\n        UI->>UI: render updates\n    end\n```\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~50 minutes\n\n## Poem\n\n> 🐇 I hop through signals, bright and keen,  \n> I bundle actions into one clean stream—  \n> RPC, ZMQ, SPV in view,  \n> Screens reshaped and statuses true,  \n> Hooray for tidy network dream!\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3 | ❌ 2</summary>\n\n<details>\n<summary>❌ Failed checks (2 warnings)</summary>\n\n|         Check name         | Status     | Explanation                                                                                                                                                                                                      | Resolution                                                                                                                                             |\n| :------------------------: | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Out of Scope Changes check | ⚠️ Warning | The PR introduces an extensive architectural refactor of the action handling system and connection status management that goes significantly beyond the issue's scope of displaying connection status on the UI. | Consider separating the action aggregation refactoring (app.rs) from the connection status display improvements to keep the PR focused and reviewable. |\n|     Docstring Coverage     | ⚠️ Warning | Docstring coverage is 5.41% which is insufficient. The required threshold is 80.00%.                                                                                                                             | Write docstrings for the functions missing them to satisfy the coverage threshold.                                                                     |\n\n</details>\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|      Check name     | Status   | Explanation                                                                                                                                                                                                              |\n| :-----------------: | :------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check  | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                                                                              |\n|     Title check     | ✅ Passed | The title 'fix: connection status not clear' directly references the issue being addressed but lacks specificity about the implemented solution.                                                                         |\n| Linked Issues check | ✅ Passed | The PR successfully implements both primary objectives: shows labeled RPC and ZMQ status on the Choose Network screen, and makes the status dot reflect both connections via the centralized ConnectionStatus mechanism. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `fix/conn-status`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dashpay/dash-evo-tool&utm_content=532)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/dashpay/dash-evo-tool/issues/comments/3854469235","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:16:01 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"2804:59E6F:CF216D:37E90BF:698A083F","x-ratelimit-limit":"11250","x-ratelimit-remaining":"11233","x-ratelimit-reset":"1770657304","x-ratelimit-resource":"core","x-ratelimit-used":"17","x-xss-protection":"0"},"data":""}}

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: 4

🤖 Fix all issues with AI agents
In `@src/context/connection_status.rs`:
- Around line 210-217: The current TaskResult::Error branch uses a fragile
string.contains(...) to detect the "best chain lock" failure; replace this with
a structured check—either add a specific TaskResult variant like
TaskResult::ChainLockFetchFailed and match that in the handler, or (if this
handler is already scoped to the GetBestChainLocks task) treat any
TaskResult::Error for that task as a disconnect; then call
self.set_rpc_online(false) and self.refresh_overall() when that structured
variant or task-scoped error occurs (refer to TaskResult::Error, consider adding
TaskResult::ChainLockFetchFailed, and update the handler that calls
set_rpc_online and refresh_overall).
- Around line 45-60: The reset() method currently hardcodes backend_mode to
CoreBackendMode::Rpc causing a stale mode until
trigger_refresh/refresh_zmq_and_spv runs; change reset() to accept the intended
backend mode (e.g., CoreBackendMode or its u8) from the caller (or a snapshot
from AppContext) and store that value into self.backend_mode instead of
CoreBackendMode::Rpc, update all callers of reset() to pass the correct mode (so
overall_connected() and tooltip_text() read the correct mode immediately), and
keep the existing last_update and other stores unchanged.

In `@src/ui/network_chooser_screen.rs`:
- Around line 1783-1788: The small accessor check_network_status currently fails
cargo fmt and is redundant; either reformat it as a single-line expression like
`fn check_network_status(&self) -> bool {
self.current_app_context().connection_status().rpc_online() }` to satisfy
formatting, or better: inline and remove check_network_status by replacing its
call with the already-bound `status.rpc_online()` at the single call site (or
rename the method to is_rpc_online() if you prefer keeping it); references to
help locate code: check_network_status, current_app_context(),
connection_status(), rpc_online(), and the call site that already has `status`
bound.

In `@src/ui/tokens/tokens_screen/mod.rs`:
- Around line 3236-3237: The formatting of the AppContext::new(...) calls is
inconsistent and failing CI; run rustfmt (cargo fmt --all) or manually reformat
the three call sites that invoke AppContext::new (the lines creating
AppContext::new(Network::Regtest, db, None, Default::default(),
Default::default())) so they conform to project style (wrap/align arguments
consistently), then re-run tests to ensure formatting errors are resolved.
🧹 Nitpick comments (6)
src/context/connection_status.rs (2)

107-109: spv_connected is a trivial wrapper around is_active().

This static method just delegates to status.is_active(). Callers could use SpvStatus::is_active() directly. Consider removing it to reduce API surface, or if you prefer keeping it for semantic clarity, at least document why.


256-262: get_settings() DB query on every refresh tick.

disable_zmq is read from the database via get_settings() on every 2–10 second refresh cycle. Since this runs on the UI thread, consider caching the value and only refreshing it when the user actually toggles the setting (the set_disable_zmq path already exists).

src/app.rs (2)

802-808: handle_task_result always uses the current active network, even for stale/cross-network results.

If a GetBestChainLocks task was dispatched before a network switch but completes after, active_context.network will be the new network while the result may correspond to the old one. For ChainLocks, this is safe (it checks per-network fields). For error paths, it could briefly mark the wrong network offline — but the next poll self-corrects. Low risk, just noting.


1006-1011: trigger_refresh fires during the welcome/onboarding screen.

Connection status polling (including GetBestChainLocks) starts before onboarding completes. Likely harmless, but if the intent is to not poll until the user finishes setup, you could gate this behind !self.show_welcome_screen.

src/ui/network_chooser_screen.rs (2)

583-653: Status display duplicates RPC/ZMQ logic across developer and non-developer modes.

Lines 584–609 (non-dev) and 611–640 (dev) render the same RPC + ZMQ status with different layouts. Consider extracting a small helper that takes a bool vertical parameter to reduce the ~50 lines of near-duplicate UI code.

Also, format!("{:?}", spv_status) on line 650 will show raw Rust enum names (e.g., Idle, Running). A Display impl or match-to-label would be more user-friendly.


1913-1933: Dual chainlock polling — NetworkChooserScreen timer may now be redundant.

connection_status.trigger_refresh() already dispatches GetBestChainLocks from the main update loop in app.rs (every 2–10s, for every screen). The 3-second timer here (lines 1914–1932) duplicates that work when the user is on the network chooser. Consider removing this local timer since the centralized refresh handles it.

Comment thread src/context/connection_status.rs Outdated
Comment thread src/context/connection_status.rs
Comment thread src/ui/network_chooser_screen.rs Outdated
Comment thread src/ui/tokens/tokens_screen/mod.rs Outdated
@lklimek
Copy link
Copy Markdown
Contributor Author

lklimek commented Feb 9, 2026

  1. Typo: refersh_zmq_and_spv (connection_status.rs:252)

Fixed

  1. update_from_chainlocks only updates the active context's ConnectionStatus

It's intended, refactored & commented to make it more explicit + added reset() to ensure it's refreshed

  1. spv_connected is redundant with is_active() (connection_status.rs:92-94)

Fixed

  1. NetworkChooserScreen::display_message and display_task_result are now no-ops

Removed

  1. Unused public methods in ConnectionStatus:

Removed

  1. Hardcoded discriminant values for SpvStatus (connection_status.rs:60-69)

Fixed

  1. actions Vec in app.rs is always exactly 2 elements (app.rs diff lines 35-59)

Unchanged, it's opinionated

  1. get_settings() called on every refresh cycle (connection_status.rs:265-270)

Unchanged, it's cached

1 similar comment
@lklimek
Copy link
Copy Markdown
Contributor Author

lklimek commented Feb 9, 2026

  1. Typo: refersh_zmq_and_spv (connection_status.rs:252)

Fixed

  1. update_from_chainlocks only updates the active context's ConnectionStatus

It's intended, refactored & commented to make it more explicit + added reset() to ensure it's refreshed

  1. spv_connected is redundant with is_active() (connection_status.rs:92-94)

Fixed

  1. NetworkChooserScreen::display_message and display_task_result are now no-ops

Removed

  1. Unused public methods in ConnectionStatus:

Removed

  1. Hardcoded discriminant values for SpvStatus (connection_status.rs:60-69)

Fixed

  1. actions Vec in app.rs is always exactly 2 elements (app.rs diff lines 35-59)

Unchanged, it's opinionated

  1. get_settings() called on every refresh cycle (connection_status.rs:265-270)

Unchanged, it's cached

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

🤖 Fix all issues with AI agents
In `@src/app.rs`:
- Line 1083: The match arm for AppAction::Custom currently swallows messages
(AppAction::Custom(_) => {}) so SPV start failures emitted by
NetworkChooserScreen are never shown; change it to capture the message (e.g.,
AppAction::Custom(msg)) and forward it to the app's error/notification pathway
(for example call self.show_error(msg) or enqueue it via the existing
notification/error method used elsewhere in App or AppState) so the string from
NetworkChooserScreen is displayed to the user instead of being dropped.

In `@src/ui/network_chooser_screen.rs`:
- Around line 446-461: The code redundantly calls
self.current_app_context().connection_status().rpc_online() even though status
is already bound to ctx.connection_status(); replace that redundant call with
status.rpc_online() (use the existing status variable) in the block around
NetworkChooserScreen rendering, removing the extra current_app_context()
invocation to avoid duplicated work.
🧹 Nitpick comments (4)
src/context/connection_status.rs (2)

277-281: Consider adding inline unit tests for ConnectionStatus logic.

refresh_overall, update_from_chainlocks, and handle_task_result contain non-trivial logic (e.g., the RPC+ZMQ/disable_zmq combination in refresh_overall). Inline #[cfg(test)] tests would safeguard these paths as the struct evolves. As per coding guidelines, **/*.rs: "Write unit tests inline in source files using #[test] attribute."


110-112: spv_connected is a trivial delegate to SpvStatus::is_active().

This static method adds indirection without additional logic. Callers could use spv_status.is_active() directly. If the intent is to allow future divergence from is_active(), a brief comment would clarify.

src/ui/network_chooser_screen.rs (2)

644-654: {:?} (Debug) formatting for user-facing SPV status label.

Line 652 uses format!("{:?}", spv_status) which renders the raw enum variant names (e.g., Idle, Syncing). While these happen to be readable, Debug output isn't guaranteed to remain user-friendly. Consider implementing Display for SpvStatus or mapping variants to explicit user-facing strings.


1908-1928: Redundant chainlock polling — ConnectionStatus::trigger_refresh already handles this.

This 3-second recheck dispatches GetBestChainLocks from the screen, but ConnectionStatus::trigger_refresh (called every frame from app.rs line 1008–1012) already schedules the same task with its own throttle (2 s disconnected / 10 s connected). When on this screen, both mechanisms can fire, causing duplicate backend tasks.

Since the centralized trigger_refresh now covers this responsibility, consider removing the screen-level recheck to avoid double-dispatching.

Comment thread src/app.rs
Comment thread src/ui/network_chooser_screen.rs
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

🤖 Fix all issues with AI agents
In `@src/ui/network_chooser_screen.rs`:
- Around line 641-651: Replace the Debug formatting used for SPV status in the
UI with a user-facing string: implement std::fmt::Display for the SpvStatus enum
(defined in Spv manager, e.g. SpvStatus in src/spv/manager.rs) that returns
readable strings for each variant, then change the UI call in
network_chooser_screen.rs (the ui.colored_label(...) that currently does
format!("{:?}", spv_status)) to use format!("{}", spv_status) (or .to_string());
alternatively, if you prefer not to add Display, replace the debug formatting at
that call site with an explicit match on SpvStatus producing user-friendly text
for each variant.
🧹 Nitpick comments (2)
src/ui/network_chooser_screen.rs (2)

584-607: Comma label widget will render with extra spacing.

Line 594 (ui.label(",");) renders the comma as a separate egui widget, so the default item_spacing will insert gaps on both sides, producing something like Connected , ZMQ: instead of Connected, ZMQ:. Consider appending the comma to the preceding colored label or combining into a single RichText layout.

Quick fix: merge comma into the ZMQ label
-                        ui.colored_label(rpc_color, rpc_label);
-
-                        ui.label(",");
-                        ui.label("ZMQ:");
+                        ui.colored_label(rpc_color, format!("{},", rpc_label));
+                        ui.label("ZMQ:");

582-652: Consider extracting shared RPC/ZMQ status rendering logic.

The developer-mode and non-developer-mode RPC status blocks (lines 583–608 vs. 610–639) duplicate the color/label selection for both RPC and ZMQ. The only difference is layout (single row vs. separate rows). A small helper (e.g., returning (Color32, &str) tuples) could reduce duplication. Low priority since the blocks are short.

Comment thread src/ui/network_chooser_screen.rs
@lklimek lklimek self-assigned this Feb 10, 2026
lklimek and others added 2 commits February 10, 2026 15:59
Resolved conflict where src/context.rs was split into multiple files
in src/context/ directory. Applied connection status changes from
fix/conn-status branch to the new modular structure.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@PastaPastaPasta PastaPastaPasta merged commit 0e2e67a into v1.0-dev Feb 10, 2026
4 checks passed
@PastaPastaPasta PastaPastaPasta deleted the fix/conn-status branch February 10, 2026 15:58
lklimek added a commit that referenced this pull request Feb 11, 2026
* feat: wallet unlock on wallet screen (#415)

* refactor: Amount type and AmountInput component (#417)

* feat: amount input, first building version

* test(amount): fixed tests

* chore: I think final

* chore: my_tokens display correct amount

* chore: transfer tokens update

* chore: hide unit on rewards estimate column

* chore: two new helper methods

* chore: I think finals

* cargo fmt

* feat: component trait

* impl Component for AmountInput

* chore: updated component trait

* chore: update for egui enabled state mgmt

* doc: component design pattern doc

* chore: component design pattern continued

* chore: amount improvements

* chore: copilot review

* chore: amount improvements

* backport: amount component from

* chore: fix imports

* chore: refactor

* chore: futher refactor

* chore: further refactor based on feedback

* doc: simplified component design pattern description

* chore: peer review

* doc: update docs

* chore: amount input

* test: run tests using github actions and fix failing tests (#422)

* fix: failing tests

* gha: run tests

* fix: tests fail due to lack of .env file

* fix: incorrect decimals handling on token create, mint and burn screens (#419)

* feat: amount input, first building version

* test(amount): fixed tests

* chore: I think final

* chore: my_tokens display correct amount

* chore: transfer tokens update

* chore: hide unit on rewards estimate column

* chore: two new helper methods

* chore: I think finals

* cargo fmt

* feat: component trait

* impl Component for AmountInput

* chore: updated component trait

* chore: update for egui enabled state mgmt

* doc: component design pattern doc

* chore: component design pattern continued

* chore: amount improvements

* chore: copilot review

* chore: amount improvements

* refactor: mint and burn token screens use AmountInput

* chore: use AmountInput on token creator screen

* fix: burn error handling

* feat: errors displayed in the AmountInput component

* fix: vertical align of amount input

* backport: amount component from

* chore: fix imports

* chore: refactor

* chore: futher refactor

* chore: further refactor based on feedback

* doc: simplified component design pattern description

* chore: peer review

* doc: update docs

* chore: amount input

* chore: fixes after merge

* chore: self-review

* feat: amout set decimal places + rename label => with_label

* refactor: amount input init on token screen

* chore: fix token creator layout

* chore: format base amount with leading zeros in confirmation

* chore: base supply 0 by default

* feat: add network field to identity structures (#423)

* feat: add network field to identity structures

* fix

* feat: add display for private key in both WIF and Hex formats (#424)

* feat: add display for private key in both WIF and Hex formats

* fix: display private keys as normal text and depend on color theme

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* feat: allow setting zmq uri in .env (#425)

* feat: allow setting ZMQ URI

* chore: rename zmq_endpoint to core_zmq_endpoint

* fix: failing test in token screen needed update

* fix: update CI to use rust version 1.88 to match rust-toolchain

* feat: better display in key selector (#429)

* refactor: unified confirmation dialog (#413)

* refactor: unified alert window

* chore: update CLAUDE to create reusable components whenever appropriate

* feat: correct confirm dialog on set token price screen

* chore: remove callbacks which are overkill

* chore: cargo fmt

* chore: doctest fix

* chore: impl Component for ConfirmationDialog

* chore: use WidgetText

* feat: Add Escape key handling for confirmation dialog

* chore: button inactive when in progress

* chore: fixes after merge

* chore: some theme improvements

* fmt and visual appeal

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* feat: nicer contract chooser panel (#426)

* feat: nicer contract chooser panel

* fmt

* clippy

* fix: token purchasability was not refreshing unless app restart (#432)

* fix: token action buttons alignment

* feat: nicer expanding tabs in token creator (#431)

* feat: nicer expanding tabs in token creator

* fix

* feat: implement new ConfirmationDialog component throughout app (#430)

* feat: implement new ConfirmationDialog component throughout app

* fix: remove backup files

* fix: confirmation dialog on withdrawal screen always showing "loading"

* feat: Dash Masternode List and Quorum Viewer (#428)

* a lot of work on DML viewer

* more work

* more work

* more work

* more work

* more work

* more work

* more work

* more work

* ui improvements

* ui improvements

* optimizations

* fast start

* more work

* more work

* more work

* fmt

* much more work

* fixes

* updates

* fix

* fmt

* revert

* update for dashcore 40

* params for testnet

* added testnet diff

* fixes

* clippy

* more clippy

* fixes

* clean UI

* use backend tasks

* backend messages

* coderabbit suggestions to add timeouts and prevent infinite loops

* transient and fatal errors

* update dash core configs for testnet

* fmt

* fix timeout

* fix h-3 error

* clear state when switching networks

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* chore: bump version to 1.0.0-dev (#439)

The 1.0-dev branch builds were still reporting as 0.9.0

* feat: add left panel button labels and create contract subscreen chooser panel (#441)

* feat: add left panel button labels and create contract subscreen chooser panel

* fmt

* feat: clarify identity index description for identity creation

* fix: screen button labels display hard to see in dark mode

* feat: left panel scroll (#443)

* feat: left panel scroll

* clippy

* feat: add existing identity by wallet + identity index (#444)

* feat: add existing identity by wallet + identity index

* fmt

* remove logging

* update derivation index label

* add robustness

* fix: screen button labels display hard to see in dark mode

* feat: left panel scroll (#443)

* feat: left panel scroll

* clippy

* feat: load all identities up to an index

* clippy

* fix

* feat: remove wallet (#445)

* feat: remove wallet

* clippy

* Clarify wallet removal warning message

Updated warning message for wallet removal to clarify that keys will no longer work unless the wallet is re-imported.

* fix: identity creation and top-up via QR code handling (#447)

* fix: identity creation handling

* cleanup

* cleanup

* fix identity topup too

* remove note

* fix: keyword search required new platform version plus error handling and UI updates (#449)

* fix: keyword search not displaying errors

* update platform version and keyword search cleanup

* fix

* fix: handle decimals and fix schedules on price and purchase screens (#412)

* fix: inactive button on set price group action

* chore: apply review feedback

* refactor: use token amount input

* chore: update AmountInput

* chore: tiered pricing

* chore: direct purchase

* chore: remove total agreed price

* chore: max amount input defaults to max_credits

* fmt

* fix

* clippy

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>

* fix: showing used asset locks as unused (#448)

* chore: remove unused task sender

* chore: update to Platform V10

* feat: GroveSTARK ZK proofs (#450)

* works

* works

* fix

* ok

* ok

* ok

* ok

* ok

* fix verification message showing in generation screen

* remove advanced settings. set default 16 grinding bits and 128 bit security

* ok

* lock

* ok

* clippy

* fmt

* clippy and fmt

* pin grovestark dep

* fix

* ok

* clippy

* rename file

* remove ProofData

* cleanup

* fix

* rename GroveStark to GroveSTARK

* rename zk_proofs_screen to grovestark_screen

* rename ZKProofs tool subscreen to GroveSTARK

* move grovestark prover to model

* rename ContractsDashpayComingSoon to ContractsDashpay

* rename ContractsDashpay to Dashpay

* rename dashpay stuff

* fixes

* ok

* update grovestark rev

* update

* chore: update grovestark rev

* chore: update platform to v2.1.2

* feat: derive keys from loaded wallets when loading identity by ID (#446)

* feat: derive keys from loaded wallets when loading identity

* clippy

* chore: update platform version

* ok

* cleanup ui

* cleanup ui

* set max index search to 30

* set max const

* k

* fix: wallet screen not updating wallets after network change (#451)

* fix: wallet screen not updating wallets after network change

* ui improvement

* clippy

* fix: some document actions were showing error when it was success (#452)

* fix: some document actions were showing error when it was success

* add space at bottom

* feat: wallet unlock button (#459)

* fix: scrollable unused asset locks on identity creation (#460)

* fix: no error display when trying to import a wallet twice on different networks (#466)

* fix: no error display when trying to import a wallet twice on different networks

* feat: add waiting for valid seed phrase message

* fix

* fix: logging should interpret RUST_LOG env variable (#467)

* feat: signed dmg for mac (#437)

* feat: signed mac binaries and dmg

* fix

* fix

* extra check

* app bundle

* fix

* fix icon

* feat: simplify icon padding to 3% for correct sizing

* ok

* ok

* fmt

* fix: split dmgs into arm64 and x86 instead of universal

* cleanup

* fmt

* fix naming

* ok

* fix

* disk space fix

* fix

* fix

* fix attempt

* fix: enhance disk space cleanup for macOS DMG creation

- Add more aggressive cleanup of Xcode caches and derived data
- Remove additional Cargo build artifacts (.rlib, .d files)
- Clean system-level caches to free maximum space
- Add cleanup step for both ARM64 and x86_64 macOS builds
- Remove temporary icon files after app bundle creation

This should resolve the "No space left on device" error during DMG creation
on GitHub Actions runners.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* macos-latest

* latest for arm too

* revert

* re-revert

* clear cache

* fix

* cleanup

* try large

* omg

* apply suggestion

* cleanup

* fix

* fix

* fix

---------

Co-authored-by: Claude <noreply@anthropic.com>

* feat: HD wallet system, DashPay integration, SPV support, and more (#464)

* feat: dashpay

* ok

* ok

* remove doc

* ok

* ok

* database

* ok

* fix: use proper BackendTaskSuccessResults rather than Message

* fmt and clippy

* remove dashpay dip file

* logo and cleanup

* fix top panel spacing

* ui stuff

* fmt

* dip 14

* image fetching

* some fixes

* cleaning up

* todos

* feat: SPV phase 1 (#440)

* feat: spv in det

* ui

* progress bars

* working progress updates

* fmt

* fast sync

* add back progress monitoring

* back to git dep

* newer dashcore version

* deduplication

* spv context provider

* fixes

* small fix

* clippy fixes

* fixes

---------

Co-authored-by: Quantum Explorer <quantum@dash.org>

* feat: spv progress bars and sync from genesis when wallets are loaded (#454)

* feat: spv progress bars

* feat: start from 0 if syncing with wallets

* clippy

* fmt

* update

* fixes

* fix: add sdk features

* feat: add accounts and transactions to wallet screen

* clippy

* fmt

* fix: dashpay database table initialization was hanging on new db (#463)

* fix: display stuff

* add accounts and much progress

* feat: transaction history in wallet

* clippy

* ok

* feat: hd wallet

* send tx via wallet and wallet lock/unlock

* update to PeerNetworkManager

* ok

* ok

* ok

* fmt

* clippy

* clippy

* feat: clear SPV data button

* fix: switch from dash core rpc to spv mode

* feat: switch to DashSpvClientInterface

* clean spv button fix

* feat: send from wallet screen

* feat: platform addresses

* feat: platform address transitions

* feat: platform address transitions

* feat: move dashpay screen to top level

* platform addresses sdk

* remove async context provider fn

* lock

* update for new sdk with addresses and handle sdk result data

* chore: update grovestark dependency

* chore: update dash-sdk rev

* fmt

* remove elliptic curves patch

* clippy

* feat: use BackendTaskSuccessResult variants instead of Message(String)

* fmt

* clippy

* update DIP18 implementation, fixes and some features around wallets and PAs

* fix

* wallet unlock on wallet screen

* info popup component

* small fixes

* wallet unlock component

* fix startup panic

* welcome screen and dashpay stuff

* cargo fix

* cargo fmt

* chore: update deps to use most recent dash-sdk

* simplify welcome screen and move spv storage clear to advanced settings

* default connect to peers via SPV DNS seeds

* fix: exit app without waiting

* fix error message and reverse quorum hash on lookup

* fmt

* settings to turn off spv auto sync

* clippy

* work on getting started flow

* AddressProvider stuff

* address sync stuff

* many fixes all in one

* fix

* many fixes

* fixes

* amount input stuff

* alignment in identity create screen for adding keys

* more fixes

* many improvements

* simple token creator, word count selection for wallet seed phrases, more

* fix: platform address info storage

* feat: generate platform addresses and address sync post-checkpoint

* many things

* chore: update to recent changes in platform

* docs: added few lines about .env file

* fix: banned addresses and failure during address sync

* fix: updates for new platform and fee estimation

* fix: only take PA credits after checkpoint

* feat: fee estimation and display

* feat: fee estimation follow-up

* more on fee displays

* fix: proof logs in data contract create

* fix: white on white text for fee estimation display

* fix: always start as closed for advanced settings dropdown in settings screen

* fix: hard to see data contracts in the register contract screen

* fix: document create screen scroll

* fix: fee estimations accuracy

* fmt

* clippy auto fixes

* clippy manual fixes and pin dash-sdk dep

* fix failing tests

* fmt

* fix: update rust toolchain to 1.92

* refactor: hide SPV behind dev mode

* feat: warning about SPV being experimental

* cleanup based on claude review

* fmt

* cleanup based on another claude review

* fix: kittest failing

* fix: remove fee result display in success screens and clean up dashpay avatar display

* dashpay fixes and platform address fixes

* refactor: move some AppContext functions to backend_task module

* clippy

* clippy

* fix: refresh mode alignment in wallet screen and fmt

* fix: failing test due to test_db issue

* fix: dashpay avatar loading slow

* fix: add rocksdb deps to ci workflow

* fix: free up disk space in ci workflow

* fix: display warning when partial wallet refresh success occurs

* fix: propogate error for terminal balance sync

* feat: more aggressive disk cleanup in ci workflow

---------

Co-authored-by: Quantum Explorer <quantum@dash.org>
Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Co-authored-by: Ivan Shumkov <ivanshumkov@gmail.com>

* feat: comprehensive test coverage implementation (#481)

* feat: comprehensive test suite

* fmt

* fix: cannot create identity from address due to wrong identity id (#470)

* feat: dashpay

* ok

* ok

* remove doc

* ok

* ok

* database

* ok

* fix: use proper BackendTaskSuccessResults rather than Message

* fmt and clippy

* remove dashpay dip file

* logo and cleanup

* fix top panel spacing

* ui stuff

* fmt

* dip 14

* image fetching

* some fixes

* cleaning up

* todos

* feat: SPV phase 1 (#440)

* feat: spv in det

* ui

* progress bars

* working progress updates

* fmt

* fast sync

* add back progress monitoring

* back to git dep

* newer dashcore version

* deduplication

* spv context provider

* fixes

* small fix

* clippy fixes

* fixes

---------

Co-authored-by: Quantum Explorer <quantum@dash.org>

* feat: spv progress bars and sync from genesis when wallets are loaded (#454)

* feat: spv progress bars

* feat: start from 0 if syncing with wallets

* clippy

* fmt

* update

* fixes

* fix: add sdk features

* feat: add accounts and transactions to wallet screen

* clippy

* fmt

* fix: dashpay database table initialization was hanging on new db (#463)

* fix: display stuff

* add accounts and much progress

* feat: transaction history in wallet

* clippy

* ok

* feat: hd wallet

* send tx via wallet and wallet lock/unlock

* update to PeerNetworkManager

* ok

* ok

* ok

* fmt

* clippy

* clippy

* feat: clear SPV data button

* fix: switch from dash core rpc to spv mode

* feat: switch to DashSpvClientInterface

* clean spv button fix

* feat: send from wallet screen

* feat: platform addresses

* feat: platform address transitions

* feat: platform address transitions

* feat: move dashpay screen to top level

* platform addresses sdk

* remove async context provider fn

* lock

* update for new sdk with addresses and handle sdk result data

* chore: update grovestark dependency

* chore: update dash-sdk rev

* fmt

* remove elliptic curves patch

* clippy

* feat: use BackendTaskSuccessResult variants instead of Message(String)

* fmt

* clippy

* update DIP18 implementation, fixes and some features around wallets and PAs

* fix

* wallet unlock on wallet screen

* info popup component

* small fixes

* wallet unlock component

* fix startup panic

* welcome screen and dashpay stuff

* cargo fix

* cargo fmt

* chore: update deps to use most recent dash-sdk

* simplify welcome screen and move spv storage clear to advanced settings

* default connect to peers via SPV DNS seeds

* fix: exit app without waiting

* fix error message and reverse quorum hash on lookup

* fmt

* settings to turn off spv auto sync

* clippy

* work on getting started flow

* AddressProvider stuff

* address sync stuff

* many fixes all in one

* fix

* many fixes

* fixes

* amount input stuff

* alignment in identity create screen for adding keys

* more fixes

* many improvements

* simple token creator, word count selection for wallet seed phrases, more

* fix: platform address info storage

* feat: generate platform addresses and address sync post-checkpoint

* many things

* fix: cannot create identity from address

* chore: update to recent changes in platform

* docs: added few lines about .env file

* fix: banned addresses and failure during address sync

* fix: updates for new platform and fee estimation

* fix: only take PA credits after checkpoint

* feat: fee estimation and display

* feat: fee estimation follow-up

* chore: fix build

* chore: correct platform revision

* refactor: don't query for nonce when creating identity

* more on fee displays

* fix: proof logs in data contract create

* fix: white on white text for fee estimation display

* fix: always start as closed for advanced settings dropdown in settings screen

* fix: hard to see data contracts in the register contract screen

* fix: document create screen scroll

* fix: fee estimations accuracy

* fmt

* clippy auto fixes

* clippy manual fixes and pin dash-sdk dep

* fix failing tests

* fmt

* fix: update rust toolchain to 1.92

* refactor: hide SPV behind dev mode

* feat: warning about SPV being experimental

* fix: platform nonces not updated in sync

* chore: cargo fmt

* deps: update platform repo

* chore: clippy and rabbit

* chore: rabbit review

* chore: enforce address networ with require_network()

* cleanup based on claude review

* fmt

* cleanup based on another claude review

* fix: kittest failing

* fix: remove fee result display in success screens and clean up dashpay avatar display

* dashpay fixes and platform address fixes

* deps: update platform repo

* chore: fixes after merge

* refactor: move some AppContext functions to backend_task module

* clippy

* clippy

* fix: refresh mode alignment in wallet screen and fmt

* chore: fmt

* fmt

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>
Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com>
Co-authored-by: Quantum Explorer <quantum@dash.org>
Co-authored-by: Ivan Shumkov <ivanshumkov@gmail.com>

* docs: add CLAUDE.md for Claude Code guidance (#484)

Adds documentation to help Claude Code (claude.ai/code) work effectively
with this codebase, including build commands, testing instructions,
architecture overview, and UI component patterns.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* build: update dash-sdk to use rust-dashcore v0.42-dev (#483)

* build: update dash-sdk to use rust-dashcore v0.41.0

Updates dash-sdk dependency to rev 7b2669c0b250504a4cded9e2b9e78551583e6744
which includes rust-dashcore v0.41.0.

Breaking changes addressed:
- WalletBalance: confirmed field renamed to spendable(), fields now methods
- WalletManager::new() now requires Network argument
- import_wallet_from_extended_priv_key() no longer takes network argument
- current_height() no longer takes network argument
- RequestSettings: removed max_decoding_message_size field
- sync_to_tip() removed - initial sync now handled by monitor_network()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* style: apply cargo fmt

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* clippy

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* feat: hint text next to withdrawal destination input in dev mode with advanced options and owner key

* feat: implement asset lock creation and detail screens (#418)

* feat: implement asset lock creation and detail screens

* clippy fix

* some fixes

* fix: ui cleanup and backend fixes

* fix: clippy

* feat: tests

* fix: remove identity index selector for top ups

* fmt

* refactor: use `AmountInput` component

* fixes

* fix: clippy

---------

Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* fix: dev mode wouldnt toggle in left panel when unchecked in settings if config load failed (#488)

* fix: force Core RPC mode on app start if not in dev mode (#489)

* fix: display WIF format for manually added private keys (#496)

* fix: display WIF format for manually added private keys

Externally loaded identities with manually added private keys now show
both WIF and hex formats, matching the display for wallet-derived keys.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* clippy

* fmt

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* fix: security level validation for add key screen (#494)

* fix: auto-set security level based on key purpose in add key screen

When selecting a key purpose, automatically set the appropriate security
level and restrict available options: ENCRYPTION/DECRYPTION only allow
MEDIUM, TRANSFER only allows CRITICAL, and AUTHENTICATION allows
CRITICAL/HIGH/MEDIUM.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: disable security level dropdown when only one option is valid

Visually indicate to the user that the security level is fixed by the
protocol for certain key purposes (ENCRYPTION, DECRYPTION, TRANSFER).
Adds a hover tooltip explaining why the dropdown is disabled.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: remove redundant `contract_bounds_enabled` check for `has_multiple_security_levels` bool

* fmt

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: pauldelucia <pauldelucia2@gmail.com>

* fix: identity registration default key was using wrong `ContractBounds` (#487)

* fix: identity registration default key was using wrong ContractBounds

* feat: add tests

* fmt

* doc: update key descriptions

* feat: add coderabbit configuration file

* fix: document actions were auto selecting master keys but shouldnt (#493)

* fix: top up with QR was validating against wallet max balance (#492)

* fix: view platform address popup showing wrong address format (#500)

* fix: view platform address popup showing wrong address format

* fix: use helper

* feat: update sdk v3.0.1 hotfix.1 (#503)

* chore: update dash-sdk to v3.0.1-hotfix.1

Updates dash-sdk to v3.0.1-hotfix.1 to match testnet.

Breaking API changes addressed:
- WalletBalance.unconfirmed and .total are now fields instead of methods
- RequestSettings now requires max_decoding_message_size field

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: ensure dev mode is off and spv sync off for new users (#504)

* fix: ensure dev mode is off and spv sync off for new users

* fix tests

* fix

* fix: update platform address prefix from dashevo to evo (#505)

* fix: update platform address prefix from dashevo to evo

Update address detection and UI hints to use the new shorter
platform address prefixes (evo1/tevo1) instead of the old format
(dashevo1/tdashevo1) to match SDK v3.0.1 changes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: validate platform address network matches app network

Add network validation when parsing Bech32m Platform addresses to ensure
the address network prefix matches the app's configured network, showing
a descriptive error on mismatch.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: platform address balance doubling after transfer and refresh (#502)

* fix: platform address balance doubling after transfer and refresh

* fix

* feat: add fee multiplier caching and use it across all UI screens (#506)

* feat: add fee multiplier caching and use it across all UI screens

- Add fee_multiplier_permille support to PlatformFeeEstimator
- Add fee multiplier caching in AppContext with getter/setter
- Add fee_estimator() helper method on AppContext
- Cache the fee multiplier when epoch info is fetched
- Display note when fee multiplier cache is updated
- Update all UI screens to use app_context.fee_estimator()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

* fix: apply fee multiplier to all estimation functions

Update all estimate_* functions to apply the fee multiplier to the
combined total (storage + processing/registration) rather than to
individual components, ensuring consistent fee calculation across
all state transition types per the Dash Platform spec.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: reuse fee_estimator instance in token screens

Avoid duplicate construction and keep consistent multiplier snapshot
within the frame by reusing the existing fee_estimator variable.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: use DEFAULT_FEE_MULTIPLIER_PERMILLE constant in AppContext

Keep the AppContext default in sync with the estimator's canonical value
instead of hardcoding 1000.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: take from multiple platform addresses in simple send flow (#501)

* fix: take from multiple platform addresses in simple send flow

* address selection algorithm

* fix

* fix: fee payer index lookup

* cleanup

* fix: use PlatformFeeEstimator for address transfer fees

- Replace custom fee calculation with PlatformFeeEstimator
- Simplify allocation logic by calculating fee upfront
- Use 20% safety buffer on fee estimates
- Remove complex iterative allocation loop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

* Add fee deficit check in platform address allocation

The fee payer must have enough remaining balance after their
contribution to cover the transaction fee. This change calculates
the fee deficit (if fee payer's remaining balance < estimated fee)
and adds it to the shortfall, preventing impossible sends from
being attempted.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Use actual input count for fee estimation in error messages

Changed estimate_platform_fee calls to use addresses_available
(the actual number of available inputs) instead of MAX_PLATFORM_INPUTS.
This provides more accurate fee estimates and max sendable amounts
in the error messages when transactions exceed available balance.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Filter destination address from preview allocation

The preview allocation now parses the destination platform address
and passes it to allocate_platform_addresses, ensuring the destination
is never shown as an input source. This matches the behavior of the
actual send logic.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

* Filter destination from max calculation and improve warning message

The max amount calculation now excludes the destination address,
matching the allocation logic. This prevents showing an inflated
max when the destination is one of your own addresses.

Also improved the warning message to distinguish between exceeding
the address limit vs insufficient balance (including fees).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fmt

* feat: use cached fee multiplier in send_screen

Update estimate_platform_fee and allocate_platform_addresses to accept
a PlatformFeeEstimator parameter, allowing the send screen to use the
cached network fee multiplier from app_context.fee_estimator().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: address review comments in send_screen

- Add early return for empty sorted_addresses in allocate_platform_addresses
- Use safe string slicing in render_platform_source_breakdown to avoid panic
- Remove duplicate doc comment

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: prevent platform address balance doubling after internal updates (#507)

* fix: prevent platform address balance doubling after internal updates

Adds last_full_sync_balance column to track the balance checkpoint
for terminal sync pre-population, separate from the current balance.

Key changes:
- Add DB migration (v26) for last_full_sync_balance column
- Sync operations update last_full_sync_balance for next sync baseline
- Internal updates (after transfers) preserve last_full_sync_balance
- Terminal sync pre-populates with last_full_sync_balance, applies
  AddToCredits correctly without double-counting

This fixes the scenario where:
1. Transfer completes, balance updated internally
2. App restarts, refresh triggers terminal sync
3. Same AddToCredits was being re-applied because the pre-population
   baseline wasn't distinguishing between sync and internal updates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: fix docblocks for is_sync_operation and last_full_sync_balance

- Remove duplicate/obsolete is_full_sync wording from set_platform_address_info
- Update last_full_sync_balance field doc to accurately describe when it's
  updated (during syncs) vs preserved (during internal updates)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: preserve last_full_sync_balance when removing duplicate address entries

Search for last_full_sync_balance from any canonical-equivalent entry
BEFORE removing duplicates, so the value isn't lost when the existing
entry has a different Address representation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: fetch fresh nonces from platform for identity creation (#509)

When creating an identity with Platform Address funding, the cached
nonce could be stale (terminal-only sync only updates balance, not
nonce). This caused "Invalid address nonce" errors.

Now fetches fresh nonces from platform using AddressInfo::fetch_many()
before identity creation.

Note: The SDK's put_with_address_funding requires caller-provided nonces,
unlike transfer_address_funds which handles nonces internally. This
inconsistency should be addressed in the SDK.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: don't auto-generate platform address when opening receive dialog (#508)

Use platform_addresses() which checks watched_addresses for derived
Platform addresses, instead of only checking platform_address_info
which only contains synced addresses with balances.

A new address is now only generated if there are truly no Platform
addresses derived for the wallet, not just because they haven't
been synced yet.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: show N/A for UTXOs and Total Received columns on Platform addresses (#510)

Platform addresses don't have UTXOs (they have credits on Platform layer)
and we don't track historical received amounts for them. Showing 0 was
misleading - N/A is more accurate.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: reserve fees when using max button for platform address identity funding (#511)

* fix: reserve fees when using max button for platform address identity funding

When clicking the max button to fund identity creation or top-up from a
platform address, the full balance was used without reserving room for
transaction fees, causing "Insufficient combined address balances" errors.

Changes:
- Subtract estimated fee from max amount in identity creation screen
- Subtract estimated fee from max amount in identity top-up screen
- Fix fee estimation to use identity_create_asset_lock_cost (200M credits)
  instead of address_funding_asset_lock_cost (50M credits)
- Add storage-based fees to identity creation/top-up fee estimates
- Add new estimate_identity_topup_from_addresses() for platform address top-ups
- Add 20% safety buffer to account for fee variability
- Show hint explaining fee reservation when max is used

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs: fix docstrings to correctly state 20% safety buffer

The docstrings incorrectly stated 10% safety buffer while the code
applies 20% via total / 5.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* Release SPV storage lock on shutdown (#517)

* Fix dark mode text colors (#515)

* Fix dark mode text and borders

* style: apply cargo fmt formatting

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: invalid min amount when transferring funds (#523)

* fix: invalid min amount when transferring funds

* chore: rabbit's feedback

* chore: update bincode to 2.0.1, dash-sdk to v3.1-dev, and grovestark (#526)

* chore: update bincode to 2.0.1, dash-sdk to v3.1-dev, and grovestark

- Update bincode from 2.0.0-rc.3 to 2.0.1
- Update dash-sdk to latest v3.1-dev (98a0ebec)
- Update grovestark to a70bdb1a
- Fix Decode/BorrowDecode implementations for bincode 2.0.1 API changes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: migrate to using dashpay/grovestark

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: pasta <pasta@dashboost.org>

* feat: use DAPI instead of Core RPC for historical asset lock transaction info (#528)

Replace core_client.get_raw_transaction_info() calls with a new
get_transaction_info_via_dapi() function that queries transaction status
via DAPI gRPC. This removes the dependency on a local Core RPC node for
checking whether asset lock transactions have been chainlocked, which is
needed for identity registration, top-up, and platform address funding
from asset locks.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: not enough balance to pay a fee in platform to core transfers (#513)

* fix: fee estimation for AddressCreditWithdrawalTransition

* chore: max button

* refactor: remove redundant code

* chore: better hint in platform-to-core

* Refactor token creator helpers (#518)

* refactor(tokens): simplify token creator helpers

* style: cargo fmt

* Simplify wallets UI helpers and send flow (#519)

* Simplify wallets UI helpers and send flow

* Fix wallets screen helper placement

* Fix refresh_on_arrival borrow

* Stabilize token UI tests config

* Simplify wallet send address type helper

* fix: handle RegisteredTokenContract result to clear token creation spinner (#529)

The backend task returned RegisteredTokenContract on success but the
tokens screen had no handler for it, causing the spinner to spin forever.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>

* fix: build fails for windows target (#527)

* fix: build fails for windows target

* build: only create a release when tag is set

* chore: remove redundant settings from release.yml

* doc: windows requirements

* fix: windows icon

* build: change grovestark revision

* chore: fmt

* fix: don't open console window on windows

* build: grovestark recent commit

* fix: critical wallet bugs (GH#522, GH#476, GH#478, GH#85) (#534)

* fix: auto-refresh wallet UTXOs on app startup (GH#522)

On startup, bootstrap_loaded_wallets now spawns background tasks to
refresh UTXOs from Core RPC for all HD and single-key wallets. This
ensures balances are current without requiring the user to manually
click Refresh. Only applies in RPC mode; SPV handles UTXOs via
reconciliation.

Task: 1.1a

* fix: respect fee_deduct_from_output flag in platform address funding (GH#476)

When the user selects "deduct from input", use an explicit output amount
for the destination and a separate change address for the fee remainder,
so the destination receives the exact requested amount.

Task: 1.1b

* fix: reserve estimated fees in wallet balance top-up max button (GH#478)

Task: 1.1c

* fix: prevent funding address reuse across identities (GH#85)

Task: 1.1d

* fix: add 5-minute timeout to asset lock proof wait loop (wallet-008)

Task: 1.1e

* fix: use wallet-controlled change address and epoch-aware fee estimator

Use a fresh wallet receive address for platform funding change output
instead of an ephemeral key-derived address, so surplus credits remain
spendable. Also switch to epoch-aware fee estimator for accurate fee
estimation when the network fee multiplier is above 1x.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address critical review issues in wallet funding

- Use try_lock() in tokio::select! timeout arm to avoid blocking the
  async runtime when another thread holds the mutex
- Use change_address() (BIP44 internal path) instead of receive_address()
  for deriving change addresses, ensuring proper path separation
- Replace .unwrap_or(0) with .ok_or() on BTreeMap index lookup to
  surface errors instead of silently targeting the wrong output

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: auto-refresh wallet UTXOs on asset lock proof timeout (RPC mode)

When the 5-minute timeout fires, the asset lock tx has already been
broadcast and UTXOs removed locally. Trigger a background wallet
refresh in RPC mode so spent inputs are reconciled against chain state.
SPV mode handles its own reconciliation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: fix rustfmt formatting in fee estimator chain

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: replace saturating_mul with checked_mul for duffs-to-credits conversion

Overflow now returns an explicit error with diagnostic info instead of
silently clamping to u64::MAX.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tokens): restore token reorder assignment and distribution field checks (#535)

* Extract dialog rendering into wallets_screen/dialogs.rs module (#539)

Moved 4 dialog rendering functions and 10+ helper methods (~1151 lines)
from wallets_screen/mod.rs into a new dialogs.rs module. Includes
send, receive, fund platform, and private key dialogs plus their
state structs. mod.rs reduced from 3824 to 2673 lines.

Task: 3.2a

* build: update all dependencies (#531)

* fix: build fails for windows target

* build: only create a release when tag is set

* chore: remove redundant settings from release.yml

* doc: windows requirements

* fix: windows icon

* build: change grovestark revision

* chore: fmt

* fix: don't open console window on windows

* build: grovestark recent commit

* build: update dependencies

* chore: clippy

* chore: fmt

* build: update platform to most recent v3.1-dev

* feat: add key exchange protocol and state transition signing

Add YAPPR key exchange flow for DashPay, QR scanner improvements,
state transition signing screen, and refactor UI helpers.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: migrate SPV event handling to broadcast channels

Replace orphaned SpvEvent handler with three new broadcast-based
handlers (SyncEvent, WalletEvent, NetworkEvent) that subscribe to
the actual event producers in dash-spv. This fixes wallet
reconciliation never being triggered by SPV events.

- Bump dash-sdk to fb055ec008 (picks up rust-dashcore 4d2a7018
  with WalletEvent support)
- Add spawn_sync_event_handler: triggers reconcile on
  BlockProcessed, ChainLockReceived, InstantLockReceived,
  SyncComplete
- Add spawn_wallet_event_handler: triggers reconcile on all
  wallet events (TransactionReceived, BalanceUpdated)
- Add spawn_network_event_handler: updates connected_peers count
  on PeersUpdated
- Add connected_peers field to SpvManager and SpvStatusSnapshot
- Fix reconcile channel race: register channel before starting
  SPV thread so handlers always capture a valid sender
- Improve reconcile: track in-memory UTXOs, log summaries, guard
  against wiping transaction history

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: refresh receive dialog balances from wallet on each frame

The receive dialog cached address balances at open time and never
updated them, so SPV balance changes were not reflected until the
dialog was closed and reopened.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: remove YAPPR key exchange and state transition signing

Move these features to the feat/yappr-key-exchange branch. This branch
now focuses on SPV broadcast channel migration, dependency bumps, and
reconciliation fixes only.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat: replace Core RPC with DAPI for asset lock operations in SPV mode

Migrate transaction info queries, broadcasting, and finality detection
away from direct Core RPC calls so that identity registration and
top-up work in SPV-only mode. Key changes:

- Add `get_transaction_info_via_dapi()` using DAPI GetTransaction
- Add `broadcast_raw_transaction()` that routes via RPC or SPV
- Add SPV finality listener forwarding instant/chain lock events
- Make asset lock creation methods async for SPV broadcasting
- Use longer proof timeouts (5min) in SPV mode vs 2min for RPC
- Update address balances after asset lock UTXO consumption
- Add BIP32 derivation path detection for SPV address mapping
- Bump platform SDK rev to bcb41de347

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* style: apply cargo fmt formatting

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: handle ignored Results and avoid panic on poisoned lock

- Propagate update_address_balance errors via ? in create_asset_lock.rs
- Replace .expect() with .map_err()? for core_client lock in broadcast_raw_transaction
- Log try_send failures for finality events in SPV manager instead of silently dropping

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: clean up finality map on success and remove poisoned lock panic

Remove stale entries from transactions_waiting_for_finality on the
success path of asset lock proof timeout loops, preventing unbounded
map growth. Applied to both top_up_identity.rs and register_identity.rs.

Also replace .expect() on poisoned RwLock read of core_client with
graceful error propagation via map_err.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor: address PR #525 review feedback from @lklimek

- Rename get_transaction_info_via_dapi to get_transaction_info
- Extract wait_for_asset_lock_proof helper on AppContext (4 copies → 1)
- Extract recalculate_affected_address_balances and recalculate_address_balance
  helpers on Wallet (7 copies → helper calls)
- Fix unused height variable suppression in ChainLock handler
- Document single-subscriber semantics on register_finality_channel and
  register_reconcile_channel
- Fix pre-existing collapsible_if clippy warnings in determine_sync_stage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Refactor masternode list diff screen state (#520)

* refactor: split masternode list diff screen state

* fix: avoid borrows in diff screen renders

* Initial plan

* refactor: split context.rs into focused submodules (#543)

Extract the monolithic 1795-line context.rs into a context/ module with
5 focused submodules, each grouping related AppContext methods:

- mod.rs (543 lines): struct definition, constructor, config/SDK methods
- wallet_lifecycle.rs (572 lines): SPV/wallet management and reconciliation
- identity_db.rs (205 lines): identity and DPNS database operations
- contract_token_db.rs (198 lines): contract and token database operations
- settings_db.rs (84 lines): settings cache and persistence
- transaction_processing.rs (231 lines): transaction finality handling

Pure extraction with no logic changes.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract address table, asset locks, and single-key view from wallets_screen (#542)

Continue the wallets_screen/mod.rs refactoring started in #539 (dialogs
extraction). Extract three more focused submodules:

- address_table.rs: SortColumn/SortOrder enums, AddressData struct,
  sorting logic, categorize_path, and the full address table renderer
- asset_locks.rs: asset lock table rendering and fund dialog triggers
- single_key_view.rs: single-key wallet detail view with UTXO display

Reduces mod.rs from 2662 to 1947 lines (-27%).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix(startup): harden cookie parsing, config save, and logger init (#537)

* fix(startup): harden cookie parsing, config save, and logger init

* style(logging): apply rustfmt in logger init

* fix(startup): use sync_all, fix Windows rename, and remove credential leak

- Use with_file_name instead of with_extension for temp file path clarity
- Replace flush() with sync_all() for crash-safe atomic config writes
- Handle Windows rename semantics by removing target before rename
- Remove raw cookie value from error message to prevent credential leakage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: apply rustfmt

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(config): use NamedTempFile::persist() for atomic config save on Windows

Replace manual remove-then-rename sequence with tempfile::NamedTempFile
which uses MoveFileEx(MOVEFILE_REPLACE_EXISTING) on Windows for atomic
file replacement. This fixes two issues:
- Config loss if process crashes between remove_file and rename
- Open file handle on tmp file preventing rename on Windows

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix: propagate errors from wallet balance recalculation instead of silently dropping

Replace `let _ = wallet.recalculate_*()` with `?` in 5 call sites so
database errors during address-balance recalculation are surfaced
instead of silently swallowed. This matches the existing pattern in
create_asset_lock.rs which already propagates these errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: update dash-sdk to platform rev 060515987a

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: cargo fmt

* fix: connection status not clear (#532)

* fix: connection status not updated

* chore: rabbit feedback

* chore: typo + network changes

* chore: apply feedback

* chore: rabbit review

* chore: rabbit feedback

* chore: rabbitting

* chore: fmt

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: error when SPV sync height unknown instead of defaulting to 0

Passing height=0 into transaction construction when SPV hasn't synced
yet can lead to incorrect locktime/maturity behavior. Return an error
instead so the caller knows to wait for sync progress.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Merge pull request #548 from dashpay/chore/improve-claude-md

chore: improve CLAUDE.md with architecture documentation

* docs: use v1.0-dev for diffs etc agents (#551)

* fix: remove dead code with guaranteed mutex deadlock (#559)

* Initial plan

* Remove unused insert_remote_identity_if_not_exists function with deadlock bug

Co-authored-by: lklimek <842586+lklimek@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: lklimek <842586+lklimek@users.noreply.github.com>

* feat: add "Claim all" checkbox and complete merge with v1.0-dev

- Added claim_all boolean field to ClaimTokens task
- Updated handler to call claim_all_tokens or claim_token based on flag
- Added claim_all checkbox to UI (enabled by default)
- Added claimed_amount field to track tokens claimed
- Updated display_task_result to save and display claimed amount
- Updated success screen to show amount of tokens claimed
- Wire checkbox state to ClaimTokens backend task

Co-authored-by: lklimek <842586+lklimek@users.noreply.github.com>

---------

Co-authored-by: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com>
Co-authored-by: lklimek <842586+lklimek@users.noreply.github.com>
Co-authored-by: QuantumExplorer <quantum@dash.org>
Co-authored-by: pauldelucia <pauldelucia2@gmail.com>
Co-authored-by: thephez <thephez@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Ivan Shumkov <ivanshumkov@gmail.com>
Co-authored-by: PastaPastaPasta <6443210+PastaPastaPasta@users.noreply.github.com>
Co-authored-by: pasta <pasta@dashboost.org>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
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.

Lack of network status clarity

2 participants