Skip to content

Comments

backport: merge extracted non-ZK fixes back into zk#644

Draft
lklimek wants to merge 22 commits intozkfrom
zk-extract/all-merged
Draft

backport: merge extracted non-ZK fixes back into zk#644
lklimek wants to merge 22 commits intozkfrom
zk-extract/all-merged

Conversation

@lklimek
Copy link
Contributor

@lklimek lklimek commented Feb 24, 2026

Summary

This branch serves as the integration point for merging extracted non-ZK fixes back into the zk branch. The zk branch contains a mix of zero-knowledge shielded pool support and unrelated improvements. We extracted 9 independent fix/feature sets into standalone branches based on v1.0-dev, each with its own PR.

Merge Workflow

  1. Individual extraction PRs merge into v1.0-dev (reviewed independently)
  2. Merge v1.0-dev into this branch (zk-extract/all-merged) to pick up the changes
  3. This PR merges the result into zk, bringing the shared history into alignment

Extraction PRs

# PR Branch Description
1 #635 zk-extract/platform-sync-simplification Remove PlatformSyncMode, use SDK incremental sync API (3-arg sync_address_balances)
2 #636 zk-extract/asset-lock-fee-fix Dynamic fee calculation for asset lock transactions (replaces hardcoded 3000 duffs)
3 #637 zk-extract/address-nonce-column Show nonce column for Platform Payment addresses in wallet table
4 #638 zk-extract/mine-blocks-dialog "Mine Blocks" dialog for devnet/regtest (dev mode only)
5 #639 zk-extract/platform-address-helper is_platform_address() helper + hint/example constants
6 #640 zk-extract/configure-local-script scripts/configure-local.sh — reads dashmate config for local .env
7 #641 zk-extract/dashmate-auto-update Auto-update dashmate RPC password from config, errors via MessageBanner
8 #642 zk-extract/sync-status-panel Sync status panel in wallet screen (SPV phase, platform sync info, timestamps)
9 #643 zk-extract/db-arc-mutex Wrap DB connection in Arc<Mutex<Connection>> with shared_connection() accessor

SDK Dependency

PR #635 requires a Platform SDK backport (rev 0fa82e6652097d17a700d8bcc006d6b2aa922c6e) that adds the 3-arg sync_address_balances() API without ZK features. The other PRs have no SDK dependency changes.

Manual Test Scenarios

UI-impacting PRs (#635, #636, #637, #638, #641, #642) include manual test scenario files in docs/ai-design/2026-02-24-*/manual-test-scenarios.md.

Test plan

  • All 9 extraction PRs pass CI independently
  • Merge extraction PRs into v1.0-dev
  • Merge updated v1.0-dev into this branch
  • Verify no regressions in zk after merging this PR
  • Run manual test scenarios from each extraction PR

Claude Session Info

Session ID: 88c54f17-2dd9-438c-abdd-43ccacf179bb

To resume this session:

claude --resume 88c54f17-2dd9-438c-abdd-43ccacf179bb

🤖 Generated with Claude Code by Claudius the Magnificent

lklimek and others added 6 commits February 24, 2026 09:11
…627)

During SPV reconciliation, per_address_sum only contains addresses with
current UTXOs. Addresses whose funds were fully spent never had their
balance reset to zero, causing the address table to display stale
non-zero balances even though UTXO count correctly showed 0.

Now explicitly zeroes address_balances for any known address absent from
the refreshed UTXO map before applying current sums.

Closes #571

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

* fix: handle malformed YAML gracefully in load_testnet_nodes_from_yml

Replace .expect() with match expression to avoid panicking when
.testnet_nodes.yml contains malformed YAML. Instead, logs the error
with tracing::error and returns None, allowing the application to
continue without crashing.

Closes #557

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

* fix: propagate YAML parse errors to UI and remove unwrap calls

- Change load_testnet_nodes_from_yml to return Result<Option<TestnetNodes>, String>
  so parse errors display in the UI error banner instead of only logging
- Use explicit type annotation on serde_yaml_ng::from_str::<TestnetNodes>
- Replace .unwrap() with .and_then() in fill_random_hpmn/fill_random_masternode

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

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: lklimek <lklimek@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* chore: move doc/ contents into docs/ and update references

Consolidate documentation under a single docs/ directory.

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

* chore: CLAUDE.md should write manual test scenarios for PRs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…tion (#603)

* build(flatpak): use only-arches for dynamic protoc architecture selection

Replace the fragile sed-based CI patching of the Flatpak manifest with
Flatpak's native `only-arches` source selector. The protoc module now
declares both x86_64 and aarch64 sources inline, and build-commands use
a glob pattern (`protoc-*.zip`) so no per-arch fixup is needed.

Changes:
- flatpak manifest: add aarch64 protoc source with `only-arches`,
  use glob in unzip commands, remove stale CI-patching comment
- CI workflow: remove `protoc-zip`/`protoc-sha256` matrix variables
  and the "Patch manifest for architecture" step

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

* fix(flatpak): use dest-filename for deterministic protoc extraction

Use dest-filename to normalize both arch-specific protoc zips to a
common name, avoiding glob expansion in build-commands. This ensures
the unzip target is deterministic regardless of shell behavior in the
Flatpak sandbox.

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

* build: update platform to b445b6f0 and remove rust-dashcore patches

Update dashpay/platform dependency from d6f4eb9a to b445b6f0e0bd4863
(3.0.1 → 3.1.0-dev.1). Remove the [patch] section that pinned
rust-dashcore crates to a separate rev, as the new platform commit
resolves them correctly on its own.

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

---------

Co-authored-by: Claude <noreply@anthropic.com>
…ection() (#643)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@lklimek lklimek self-assigned this Feb 24, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 24, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch zk-extract/all-merged

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.

lklimek and others added 16 commits February 24, 2026 12:13
…641)

* feat(ui): add Auto Update button for dashmate RPC password

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

* docs: add manual test scenarios for dashmate auto-update

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

* fix(ui): show error message when dashmate Auto Update fails

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

* fix(ui): use MessageBanner for dashmate Auto Update errors

Replace custom inline Frame-based error display with the codebase's
standard MessageBanner::set_global() pattern. The banner is rendered
centrally by island_central_panel() and auto-dismisses after a default
duration, providing a consistent user experience.

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

---------

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

* fix(wallet): use mode-aware broadcast for platform funding in SPV mode

fund_platform_address_from_wallet_utxos() called core_client.send_raw_transaction()
directly, bypassing the mode-aware broadcast_raw_transaction() helper. This broke
core-to-platform transfers in SPV mode where no RPC connection is available.

Changes:
- Replace direct RPC broadcast with self.broadcast_raw_transaction() which
  routes to SPV manager in SPV mode and Core RPC in RPC mode
- Guard UTXO reload fallback with core_backend_mode() check: only attempt
  RPC-based reload_utxos in RPC mode; return error in SPV mode where wallet
  state is authoritative (matching register_identity.rs and top_up_identity.rs)
- Remove unused dash_sdk::dashcore_rpc::RpcApi import

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

* fix(wallet): use mode-aware broadcast for platform funding in SPV mode

fund_platform_address_from_wallet_utxos() called core_client.send_raw_transaction()
directly, bypassing the mode-aware broadcast_raw_transaction() helper. This broke
core-to-platform transfers in SPV mode where no RPC connection is available.

Changes:
- Replace direct RPC broadcast with self.broadcast_raw_transaction() which
  routes to SPV manager in SPV mode and Core RPC in RPC mode
- Guard UTXO reload fallback with core_backend_mode() check: only attempt
  RPC-based reload_utxos in RPC mode; return error in SPV mode where wallet
  state is authoritative (matching register_identity.rs and top_up_identity.rs)
- Store asset lock transaction in DB after broadcast so the SPV finality
  listener can retrieve it when processing InstantLock/ChainLock events
  (without this, the finality proof is never populated and the wait loop
  times out after 5 minutes)
- Remove unused dash_sdk::dashcore_rpc::RpcApi import

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

* refactor(wallet): simplify reload_utxos signature and callers

- Change reload_utxos from (Client, Network, Option<AppContext>) to
  (&AppContext), returning Result<bool, String> (true = UTXOs changed)
- SPV mode: no-op returning Ok(false) instead of error
- RPC mode: acquire core_client internally with map_err (SEC-03 fix)
- Callers skip retry when reload reports no changes
- Replace inline tokio::select! timeout loop in fund_platform_address
  with shared wait_for_asset_lock_proof helper (SEC-04 fix)
- Add mode-aware post-timeout recovery (RPC: refresh_wallet_info,
  SPV: tracing::warn about automatic reconciliation)

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

* fix(wallet): address review findings CODE-01, CODE-02, CODE-04

- CODE-01: Move store_asset_lock_transaction before broadcast to
  eliminate race where SPV finality listener fires before the DB row
  exists. Clean up DB row and finality tracking on broadcast failure.
- CODE-02: Guard DB persistence in reload_utxos with `if changed`
  to skip empty-set iteration when nothing changed.
- CODE-04: Renumber step comments sequentially (1-9, no gaps).

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…setup (#640)

* feat(scripts): add configure-local.sh for dashmate network setup

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

* fix(scripts): address PR review comments on configure-local.sh

- Hide RPC password from console output, show "(found)" instead
- Support DASHMATE_CMD env var for custom dashmate command
  (e.g. DASHMATE_CMD="yarn dashmate" ./configure-local.sh)

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

* fix(scripts): quote RPC password in .env output

Wrap the RPC password value in single quotes when writing to .env
to prevent mis-parsing if the password contains #, spaces, or $.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…on input count (#636)

* fix(wallet): calculate asset lock tx fee dynamically based on input count

Replace hardcoded 3000 duff fee with dynamic fee calculation that accounts
for actual number of inputs. Estimates tx size using standard component
sizes (P2PKH input ~148B, output ~34B, header ~10B, payload ~60B) and
uses max(3000, estimated_size) to always meet the min relay fee.

Properly handles fee shortfall when allow_take_fee_from_amount is set,
and returns clear error messages for insufficient funds.

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

* docs: add manual test scenarios for asset lock fee fix

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

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* refactor(wallet): extract asset lock fee calculation to pure function

Extract fee/amount/change computation from the inline logic in
asset_lock_transaction_from_private_key() into a standalone
calculate_asset_lock_fee() function.

Uses an iterative approach that fixes a bug where the fee was computed
assuming a change output existed (based on the initial 3000-duff
estimate). When the real fee eliminated the change, the code
overestimated by 34 bytes and could trigger a false insufficient-funds
error on edge cases with many inputs.

Also removes stale edge case E3 from manual test scenarios (referenced
a database refactor not in this PR).

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

* test(wallet): add unit tests for calculate_asset_lock_fee()

Covers basic fee scenarios (minimum fee, scaling with inputs, exact
change, fee-from-amount, insufficient funds) and two regression tests
that prove the bug fixed in the previous commit — false insufficient
funds when change disappears under the real fee with many inputs.

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

* fix(wallet): overflow guard, dust threshold, and constant for fee calc

- Use checked_add for requested_amount + fee to prevent u64 overflow
- Add DUST_THRESHOLD (546 duffs) — change below this is absorbed into
  the fee instead of creating a non-standard dust output
- Replace hardcoded 3_000u64 with MIN_ASSET_LOCK_FEE constant in caller

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

* Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update docs/ai-design/2026-02-24-asset-lock-fee-fix/manual-test-scenarios.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(wallet): correct UTXO rollback type mismatch in asset lock fee error path

The rollback code used `extend()` which expected `(Address, HashMap<OutPoint, TxOut>)`
but received `(OutPoint, (TxOut, Address))` from `take_unspent_utxos_for()`. Re-group
UTXOs by address using entry API to match `self.utxos` structure.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…d signed (#645)

* fix(wallet): calculate asset lock tx fee dynamically based on input count

Replace hardcoded 3000 duff fee with dynamic fee calculation that accounts
for actual number of inputs. Estimates tx size using standard component
sizes (P2PKH input ~148B, output ~34B, header ~10B, payload ~60B) and
uses max(3000, estimated_size) to always meet the min relay fee.

Properly handles fee shortfall when allow_take_fee_from_amount is set,
and returns clear error messages for insufficient funds.

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

* docs: add manual test scenarios for asset lock fee fix

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

* Initial plan

* fix(wallet): defer UTXO removal until asset lock tx is fully built and signed

Previously, `asset_lock_transaction_from_private_key` called
`take_unspent_utxos_for` which immediately removed selected UTXOs from
`Wallet.utxos`. Since fee recalculation and signing happen afterward,
any failure at those steps (fee shortfall, missing private key, change
address derivation error) would permanently drop UTXOs — especially
dangerous in SPV mode where there is no Core RPC reload fallback.

Fix:
- Add `select_unspent_utxos_for` (`&self`, non-mutating) that performs
  the same UTXO selection logic without removing anything.
- Add `remove_selected_utxos` (`&mut self`) for explicit removal.
- Refactor `take_unspent_utxos_for` to delegate to these two methods
  (no behavior change for existing callers).
- In `asset_lock_transaction_from_private_key`, use
  `select_unspent_utxos_for` for selection and only call
  `remove_selected_utxos` after the full tx is built and signed.

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

* refactor(wallet): consolidate UTXO removal, DB persistence, and balance recalc into remove_selected_utxos

Previously, every backend task caller had to manually: (1) remove UTXOs
from the in-memory map, (2) drop them from the database, and (3)
recalculate affected address balances.  This was error-prone — the
payment transaction builders were missing the balance recalculation
entirely.

Now `remove_selected_utxos` accepts an optional `&AppContext` and
handles all three steps atomically.  The redundant cleanup blocks in
5 backend task callers are removed.  Also applies the safe
select-then-commit UTXO pattern to `build_standard_payment_transaction`
and `build_multi_recipient_payment_transaction`, fixing the same
UTXO-loss-on-signing-failure bug that was previously fixed only for
asset lock transactions.

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

---------

Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* fix(wallet): calculate asset lock tx fee dynamically based on input count

Replace hardcoded 3000 duff fee with dynamic fee calculation that accounts
for actual number of inputs. Estimates tx size using standard component
sizes (P2PKH input ~148B, output ~34B, header ~10B, payload ~60B) and
uses max(3000, estimated_size) to always meet the min relay fee.

Properly handles fee shortfall when allow_take_fee_from_amount is set,
and returns clear error messages for insufficient funds.

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

* docs: add manual test scenarios for asset lock fee fix

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

* Initial plan

* fix(wallet): defer UTXO removal until asset lock tx is fully built and signed

Previously, `asset_lock_transaction_from_private_key` called
`take_unspent_utxos_for` which immediately removed selected UTXOs from
`Wallet.utxos`. Since fee recalculation and signing happen afterward,
any failure at those steps (fee shortfall, missing private key, change
address derivation error) would permanently drop UTXOs — especially
dangerous in SPV mode where there is no Core RPC reload fallback.

Fix:
- Add `select_unspent_utxos_for` (`&self`, non-mutating) that performs
  the same UTXO selection logic without removing anything.
- Add `remove_selected_utxos` (`&mut self`) for explicit removal.
- Refactor `take_unspent_utxos_for` to delegate to these two methods
  (no behavior change for existing callers).
- In `asset_lock_transaction_from_private_key`, use
  `select_unspent_utxos_for` for selection and only call
  `remove_selected_utxos` after the full tx is built and signed.

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

* refactor(wallet): consolidate UTXO removal, DB persistence, and balance recalc into remove_selected_utxos

Previously, every backend task caller had to manually: (1) remove UTXOs
from the in-memory map, (2) drop them from the database, and (3)
recalculate affected address balances.  This was error-prone — the
payment transaction builders were missing the balance recalculation
entirely.

Now `remove_selected_utxos` accepts an optional `&AppContext` and
handles all three steps atomically.  The redundant cleanup blocks in
5 backend task callers are removed.  Also applies the safe
select-then-commit UTXO pattern to `build_standard_payment_transaction`
and `build_multi_recipient_payment_transaction`, fixing the same
UTXO-loss-on-signing-failure bug that was previously fixed only for
asset lock transactions.

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

* fix(wallet): address audit findings from PR #645 review

- Add checked arithmetic to UTXO selection (amount + fee overflow safety)
- Replace hardcoded fee in single-UTXO path with calculate_asset_lock_fee
- Add UTXO selection retry when real fee exceeds initial estimate
- Document write-lock invariant on select_unspent_utxos_for
- Replace .unwrap() with .map_err() on wallet write locks
- Restrict Database::shared_connection visibility to pub(crate)

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

* refactor(wallet): simplify remove_selected_utxos to take &Database + Network directly

Replace Option<&AppContext> with concrete dependencies (&Database, Network),
removing the need for take_unspent_utxos_for. Extract balance recalculation
into a private helper reused by both remove_selected_utxos and the existing
AppContext-based wrapper.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
… mode (#638)

* feat(wallet): add Mine Blocks dialog for Regtest/Devnet dev mode

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

* docs: add manual test scenarios for mine blocks dialog

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

* fix(wallet): close Mine Blocks dialog after Cancel/Mine click

The dialog stayed open (in a broken state) after clicking Mine or Cancel
because the local `open` variable was written back to `is_open` after the
dialog state had already been reset. Pass `is_open` directly to egui's
`.open()` and use a separate `close` flag for button-triggered dismissal.

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

* fix(wallet): address audit findings for Mine Blocks dialog

- Wrap `generate_to_address` in `spawn_blocking` to avoid blocking
  the async runtime thread (HIGH)
- Replace `.expect()` on core client lock with `.map_err()?` for
  graceful error handling instead of panic (HIGH)
- Cap block count at 1000 to prevent resource exhaustion on the
  Core node (HIGH)

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

* fix(wallet): filter non-numeric input in Mine Blocks block count field

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

* fix(wallet): address review comments on Mine Blocks dialog

- Replace assume_checked() with require_network() for address
  validation (CodeRabbit #2)
- Use styled Frame-with-dismiss error display matching Send dialog
  pattern (CodeRabbit #3)
- Don't open dialog when no wallet selected; show MessageBanner
  instead (CodeRabbit #4)
- Extract shared load_bip44_external_addresses() helper to eliminate
  near-duplicate code between mine and receive dialogs (CodeRabbit #5)
- Add backend-side network guard (Regtest/Devnet) for defense-in-depth
  (CodeRabbit #6)
- Rename shadowed ctx binding to refresh_ctx for clarity (CodeRabbit #7)

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

* fix(wallet): address remaining review comments on Mine Blocks dialog

- Change MineBlocksSuccess(usize) to MineBlocksSuccess(u64) for
  type consistency with block_count parameter (Claudius #5)
- Align dialog close pattern with Send/Receive: use local `open`
  variable for egui X button, reset state inside closure for
  Cancel/Mine buttons (Claudius #6)

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

---------

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

* feat(ui): show nonce column for Platform Payment addresses

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

* docs: add manual test scenarios for address nonce column

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

* fix(wallet): reset sort column when switching to platform payment account

When toggling to a Platform Payment account view, the sort column could
remain set to UTXOs or TotalReceived which are not rendered for that
account type. This resets it to Balance (descending) in that case.

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

* perf(wallet): gate platform info lookup on account type

Skip get_platform_address_info() for non-platform addresses to avoid
unnecessary linear scans in the fallback path.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ister_addresses params (#649)

All 12 wallet functions that took `register_addresses: Option<&AppContext>`
now require `&AppContext` unconditionally (placed first after `&mut self`
per project convention). This eliminates silently skipped UTXO removal and
address registration when callers forget to pass Some(...).

For `identity_authentication_ecdsa_public_keys_data_map`, a separate
`register_addresses: bool` flag controls whether addresses are registered
in the DB, preserving the search-loop optimization in load_identity.rs.

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

During SPV reconciliation, per_address_sum only contains addresses with
current UTXOs. Addresses whose funds were fully spent never had their
balance reset to zero, causing the address table to display stale
non-zero balances even though UTXO count correctly showed 0.

Now explicitly zeroes address_balances for any known address absent from
the refreshed UTXO map before applying current sums.

Closes #571

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

* fix: handle malformed YAML gracefully in load_testnet_nodes_from_yml

Replace .expect() with match expression to avoid panicking when
.testnet_nodes.yml contains malformed YAML. Instead, logs the error
with tracing::error and returns None, allowing the application to
continue without crashing.

Closes #557

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

* fix: propagate YAML parse errors to UI and remove unwrap calls

- Change load_testnet_nodes_from_yml to return Result<Option<TestnetNodes>, String>
  so parse errors display in the UI error banner instead of only logging
- Use explicit type annotation on serde_yaml_ng::from_str::<TestnetNodes>
- Replace .unwrap() with .and_then() in fill_random_hpmn/fill_random_masternode

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

---------

Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: lklimek <lklimek@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* chore: move doc/ contents into docs/ and update references

Consolidate documentation under a single docs/ directory.

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

* chore: CLAUDE.md should write manual test scenarios for PRs

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…tion (#603)

* build(flatpak): use only-arches for dynamic protoc architecture selection

Replace the fragile sed-based CI patching of the Flatpak manifest with
Flatpak's native `only-arches` source selector. The protoc module now
declares both x86_64 and aarch64 sources inline, and build-commands use
a glob pattern (`protoc-*.zip`) so no per-arch fixup is needed.

Changes:
- flatpak manifest: add aarch64 protoc source with `only-arches`,
  use glob in unzip commands, remove stale CI-patching comment
- CI workflow: remove `protoc-zip`/`protoc-sha256` matrix variables
  and the "Patch manifest for architecture" step

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

* fix(flatpak): use dest-filename for deterministic protoc extraction

Use dest-filename to normalize both arch-specific protoc zips to a
common name, avoiding glob expansion in build-commands. This ensures
the unzip target is deterministic regardless of shell behavior in the
Flatpak sandbox.

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

* build: update platform to b445b6f0 and remove rust-dashcore patches

Update dashpay/platform dependency from d6f4eb9a to b445b6f0e0bd4863
(3.0.1 → 3.1.0-dev.1). Remove the [patch] section that pinned
rust-dashcore crates to a separate rev, as the new platform commit
resolves them correctly on its own.

https://claude.ai/code/session_015AD2pCWoJdV2VDydcqFHPG

---------

Co-authored-by: Claude <noreply@anthropic.com>
Resolve conflicts preserving shielded pool features from HEAD while
adopting v1.0-dev improvements: refactored asset lock fee calculation,
mine dialog hardening, network validation, and API signature updates.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The [patch] section referenced ../platform local paths that don't exist
in CI. Since dash-sdk already depends on the feat/zk branch, all
transitive platform crates resolve correctly without patches. Also fixes
a formatting issue in address_table.rs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.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.

2 participants