Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
0521ef0
fix(withdraw): pre-select only a locally-signable withdrawal key
lklimek Jul 10, 2026
e795129
docs(claude): correct secret-storage note on identity-key encryption
lklimek Jul 9, 2026
ecaa46f
feat(masternodes): add page-nav model with two-scope selection (A1)
lklimek Jul 9, 2026
736c3bc
feat(masternodes): generalize breadcrumb into page-aware global switc…
lklimek Jul 9, 2026
eeb65e3
feat(masternodes): render global switcher on root screens + shared ap…
lklimek Jul 9, 2026
b336dd8
feat(masternodes): load-time key encryption plumbing (B0)
lklimek Jul 9, 2026
d8e3c55
chore(masternodes): drop ephemeral review ID from A3 reconciliation c…
lklimek Jul 9, 2026
5386d82
feat(masternodes): FR-6 resolution-layer boundary + masternode access…
lklimek Jul 9, 2026
d3e6b05
feat(masternodes): register Expert-gated Masternodes root tab (B2)
lklimek Jul 9, 2026
a47542d
feat(masternodes): empty state + card grid + card body (B3)
lklimek Jul 9, 2026
94309ff
feat(masternodes): dedicated load form + ProTxHash validator (B4)
lklimek Jul 9, 2026
1b8d2bf
feat(masternodes): detail view — header, actions, keys, remove (B5a)
lklimek Jul 9, 2026
daa474c
feat(masternodes): Testnet Fill-Random on the load form (B6)
lklimek Jul 9, 2026
3a9e583
feat(masternodes): inline DPNS voting + missing-voter prompt (B5b)
lklimek Jul 9, 2026
18caa36
feat(masternodes): page-scoped nav pill — FR-6 boundary in code (B7)
lklimek Jul 9, 2026
dc6747e
test(masternodes): cross-cutting integration coverage (B8)
lklimek Jul 9, 2026
1e27cd9
docs(user-stories): catalog the Masternodes tab, retire the legacy lo…
lklimek Jul 9, 2026
9a73dc2
docs(masternodes): commit final design docs (DOC-002)
lklimek Jul 9, 2026
dc6cd92
docs(masternodes): trim oversized module docs, catalog global-nav swi…
lklimek Jul 9, 2026
fe9b2be
fix(masternodes): guard identity load against silent overwrite (QA-00…
lklimek Jul 9, 2026
f0f0c84
fix(masternodes): key routing, network-switch reset, live refresh
lklimek Jul 9, 2026
3271149
fix(masternodes): SHOULD-FIX pass + QA-token cleanup + offline tests
lklimek Jul 9, 2026
5826b85
fix(dashpay): close FR-6 boundary bypass via DashPay identity selecto…
lklimek Jul 9, 2026
61a6fc9
test(masternodes): Marvin punch-list — in-flight guard + execution tests
lklimek Jul 9, 2026
6bf8291
docs(changelog): add Masternodes tab and global nav switcher (DOC-005)
lklimek Jul 9, 2026
80fd1d2
fix(masternodes): default GUI build broken — masternode_input feature…
lklimek Jul 9, 2026
b2ac420
docs(masternodes): correct global-nav coverage claim (F-003)
lklimek Jul 9, 2026
7a69b92
fix(masternodes): Fable final round — Tier-2 merge seal, load gate, P…
lklimek Jul 9, 2026
3be88f0
fix(masternodes): add load-form back link + remove object pill from b…
lklimek Jul 9, 2026
14b07cf
fix(masternodes): reject load when selected node type mismatches on-c…
lklimek Jul 9, 2026
908744f
fix(masternodes): surface a visible warning when node type is unverified
lklimek Jul 9, 2026
7508da5
revert(masternodes): drop Fix #3 node-type validation entirely
lklimek Jul 9, 2026
ce7096d
fix(masternodes): adapt retargeted tab to platform-wallet rewrite APIs
lklimek Jul 10, 2026
8377889
merge(withdraw): pre-select only a locally-signable withdrawal key
lklimek Jul 10, 2026
279d383
test(withdraw): screen-level kittest coverage for default_withdrawal_…
lklimek Jul 10, 2026
2edbc18
fix(withdraw): skip wallet resolution when no signable key exists
lklimek Jul 10, 2026
a37c78d
docs(masternodes): add user story for network-switch reset behavior
lklimek Jul 10, 2026
e235f88
test(withdraw): flip banner-leak test to a regression lock (2edbc18e)
lklimek Jul 10, 2026
c15173b
merge(withdraw): add screen-level kittest coverage + fix raw-error-ba…
lklimek Jul 10, 2026
a7cf0a4
fix(mcp): stop det-cli double-prefixing the HTTP bearer token
lklimek Jul 10, 2026
ad558d5
fix(masternodes): share Expert Mode flag app-wide; node-specific load…
lklimek Jul 10, 2026
9646771
merge(mcp): fix det-cli headless double-Bearer auth bug
lklimek Jul 10, 2026
c81db44
merge(masternodes): fix Expert Mode nav sync + node-specific load error
lklimek Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,38 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
before. Each suggestion now shows a small label for its wallet and its
type, and the field shows a hint listing the tags you can use when it's
empty.

- **Masternodes tab**: a new "Masternodes" entry in the left nav (visible when
Expert mode is on) for loading and managing masternode and evonode (HP
masternode) identities by ProTxHash. Loaded nodes appear as a card list
showing type, voter-key readiness, key status, and DPNS-voting status;
opening a card shows a detail view with inline DPNS contested-name voting,
Withdraw / Top up / Transfer actions, key management, and — for evonodes
only — a link to claim token rewards. The load form accepts an optional
password to encrypt the entered voting/owner/payout keys immediately
instead of only after a separate step; leaving it blank keeps today's
behavior, and protection can always be added later from the key screen.
This replaces loading a masternode or evonode from *Identities → Load
Existing Identity → Show Advanced Options*, which no longer offers those
identity types.

- **Wallet/identity indicator on more screens (rollout in progress)**: the
wallet and identity picker previously shown only at the top of the Identity
Hub now also appears at the top of the Identities, DashPay, DPNS, and
Wallets screens. On the Identity Hub and the new Masternodes tab it's fully
interactive — you can change which wallet or identity you're acting as
right there. On the other four it's currently a read-only preview of your
active wallet/identity, with a tooltip on where to change it; making it
interactive there, and adding it to the remaining screens, is tracked as a
follow-up.

### Changed

- **Masternode and evonode identities no longer appear in the Identity Hub or
Identities picker**: they now live exclusively on the new Masternodes tab,
so you're never offered actions (like registering a username) that don't
apply to a node's collateral/voting identity.

- **Wallet balance breakdown is single-sourced**: the per-account tabs and the
wallet header now derive every balance from one place. The Core header total
and the Core per-account breakdown are read from the same generation of synced
Expand Down Expand Up @@ -108,6 +138,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### Fixed

- **Expert mode now reveals the Masternodes tab without a restart**: turning on
Expert mode in Settings immediately shows the "Masternodes" entry in the left
nav. Previously the Expert-mode flag was stored separately per network, so the
nav entry could stay hidden (reading a stale value on whichever network context
the app was showing) until the app was restarted. Expert mode is now a single
app-wide flag shared across all networks.

- **Clearer error when loading a masternode by an unknown ProTxHash**: entering a
valid-looking but unregistered ProTxHash in the masternode load form now says no
masternode or evonode was found for that ProTxHash, instead of the misleading
generic "Identity not found — check the ID or name" message.

- **Withdrawal key selection**: the Withdraw screen now pre-selects only a key
whose private key you actually hold (a payout/Transfer key preferred, Owner as
fallback). Previously it could pick a key that exists on the identity but whose
private key isn't loaded locally — common on loaded masternode/evonode
identities where only the Owner key was supplied — which made the withdrawal
fail at signing with an unhelpful technical error. When no usable key is
loaded, the screen guides you to add one instead of failing mid-withdrawal.
- `WalletBackend` is now initialised eagerly at `AppState` start, eliminating a
retry-loop spam on the SDK connection during cold boot.
- Wallet store is rehydrated on cold start, resolving a regression where wallets
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Code lives by responsibility, not convenience:
- **`backend_task/`** — async business logic, one submodule per domain; the authoritative enforcement layer. `TaskError` and its typed variants live in `backend_task/error.rs`.
- **`database/`** — SQLite persistence, one module per domain.
- **`context/`** — `AppContext` submodules (`*_db.rs`, lifecycle, settings, status).
- **`wallet_backend/`** — the wallet orchestration seam: adapters, views, backend-side live caches, signers, the secret chokepoint, the event bridge. All wallet secret bytes (HD seed, imported single key, identity private key) enter/leave the vault through ONE chokepoint, `wallet_backend/secret_seam.rs` (raw `SecretBytes`, no DET-side serialization). Per-secret at-rest encryption is implemented via `put_secret_protected`/`get_secret_protected` (Argon2id + XChaCha20-Poly1305, per-secret object-password envelope, AAD bound to `wallet_id ‖ label`); unprotected secrets use `put_secret`/`get_secret` (raw, keyless vault). The keyless-vault residual (identity keys and no-password secrets) is the deferred tier. Design + migration: `docs/ai-design/2026-06-19-secret-storage-seam/`.
- **`wallet_backend/`** — the wallet orchestration seam: adapters, views, backend-side live caches, signers, the secret chokepoint, the event bridge. All wallet secret bytes (HD seed, imported single key, identity private key) enter/leave the vault through ONE chokepoint, `wallet_backend/secret_seam.rs` (raw `SecretBytes`, no DET-side serialization). Per-secret at-rest encryption is implemented via `put_secret_protected`/`get_secret_protected` (Argon2id + XChaCha20-Poly1305, per-secret object-password envelope, AAD bound to `wallet_id ‖ label`); unprotected secrets use `put_secret`/`get_secret` (raw, keyless vault). Identity keys (imported/loaded, including masternode voting/owner/payout) enter unprotected (Tier-1 keyless) at load/creation time — the load flow has no password field — but can be sealed to Tier-2 per-identity afterward via `IdentityTask::ProtectIdentityKeys` (Key Info screen → "Add password protection…"; gated by vault-key scheme, not identity type). The keyless-vault residual is only no-password secrets and keys the user has not opted to protect. Design + migration: `docs/ai-design/2026-06-19-secret-storage-seam/`.
- **`ui/<domain>/`** — screens (`ScreenLike`). UI may *call* `model/` validators for instant feedback but never implements its own validation.
- **`ui/components/`** — reusable **Component-pattern widgets ONLY**: a `show()` plus a `ComponentResponse`, a display-only render widget, or component infrastructure. If it does not render egui, it is not a component.
- **`ui/state/`** — non-widget UI state: per-screen view-models and async fetch-state caches (e.g. `TrackedAssetLockCache`). Owned by screens, may return `BackendTask`, render nothing.
Expand Down
5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@ name = "backend-e2e"
path = "tests/backend-e2e/main.rs"
required-features = ["testing"]

[[test]]
name = "mcp_http_auth"
path = "tests/mcp_http_auth.rs"
required-features = ["mcp"]

[[bench]]
name = "wallet_hydration"
harness = false
Expand Down
Loading
Loading