Files
PalladiumWallet/src/App/ViewModels/MainWindowViewModel.WalletInfo.cs
T
davide 4a97172346 feat(ui): Wallet menu overlay — info, xpub, and password-protected seed reveal
Add a Wallet menu item (between File and Settings) that opens an in-app
overlay showing wallet metadata: file name, network, type (HD seed / xprv /
WIF / watch-only), script kind, derivation path, master fingerprint, and
account xpub.

Includes a seed section: if the wallet has no seed, a note is shown; if it
has one and is unencrypted the seed is revealed directly; if encrypted the
user must enter the wallet file password before the mnemonic is displayed.
The revealed seed is shown in a danger-coloured bordered box with a warning.
Closing the overlay (backdrop, Close button, or Esc) always clears the
password input and hides the seed.

Also adds the private-key password-prompt overlay and its localization keys
(shared UI scaffolding used by the following commit).
2026-06-21 22:27:55 +02:00

115 lines
3.5 KiB
C#

using System.IO;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using PalladiumWallet.App.Localization;
namespace PalladiumWallet.App.ViewModels;
public partial class MainWindowViewModel
{
[ObservableProperty]
private bool isWalletInfoOpen;
[ObservableProperty]
private string walletInfoSeedPasswordInput = "";
[ObservableProperty]
private bool isWalletInfoSeedRevealed;
[ObservableProperty]
private string walletInfoSeedError = "";
// ---- computed wallet info (populated when overlay opens) ----
public string WalletInfoFileName =>
_walletPath is null ? "" :
Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(_walletPath));
public string WalletInfoNetwork => _doc?.Network ?? "";
public string WalletInfoType
{
get
{
if (_doc is null) return "";
if (_doc.Mnemonic is not null) return Loc.Tr("walletinfo.type.seed");
if (_doc.AccountXprv is not null) return Loc.Tr("walletinfo.type.xprv");
if (_doc.WifKeys is { Count: > 0 }) return Loc.Tr("walletinfo.type.wif");
return Loc.Tr("walletinfo.type.watchonly");
}
}
public string WalletInfoScriptKind => _doc?.ScriptKind ?? "";
public string WalletInfoDerivPath => _doc?.AccountPath ?? "";
public string WalletInfoXpub => _doc?.AccountXpub ?? "";
public string WalletInfoFingerprint => _doc?.MasterFingerprint ?? "";
public bool WalletInfoHasSeed => _doc?.Mnemonic is not null;
public bool WalletInfoSeedNeedsPassword => !string.IsNullOrEmpty(_password);
public string WalletInfoSeedText => IsWalletInfoSeedRevealed ? (_doc?.Mnemonic ?? "") : "";
public bool WalletInfoHasPassphrase => !string.IsNullOrEmpty(_doc?.Passphrase);
[RelayCommand]
private void OpenWalletInfo()
{
WalletInfoSeedPasswordInput = "";
IsWalletInfoSeedRevealed = false;
WalletInfoSeedError = "";
OnPropertyChanged(nameof(WalletInfoFileName));
OnPropertyChanged(nameof(WalletInfoNetwork));
OnPropertyChanged(nameof(WalletInfoType));
OnPropertyChanged(nameof(WalletInfoScriptKind));
OnPropertyChanged(nameof(WalletInfoDerivPath));
OnPropertyChanged(nameof(WalletInfoXpub));
OnPropertyChanged(nameof(WalletInfoFingerprint));
OnPropertyChanged(nameof(WalletInfoHasSeed));
OnPropertyChanged(nameof(WalletInfoSeedNeedsPassword));
OnPropertyChanged(nameof(WalletInfoHasPassphrase));
IsWalletInfoOpen = true;
}
[RelayCommand]
private void CloseWalletInfo()
{
IsWalletInfoOpen = false;
WalletInfoSeedPasswordInput = "";
IsWalletInfoSeedRevealed = false;
WalletInfoSeedError = "";
OnPropertyChanged(nameof(WalletInfoSeedText));
}
[RelayCommand]
private void RevealSeed()
{
if (_doc?.Mnemonic is null) return;
if (WalletInfoSeedNeedsPassword)
{
if (WalletInfoSeedPasswordInput != _password)
{
WalletInfoSeedError = Loc.Tr("msg.wrongpassword");
return;
}
}
WalletInfoSeedError = "";
IsWalletInfoSeedRevealed = true;
OnPropertyChanged(nameof(WalletInfoSeedText));
}
[RelayCommand]
private void HideSeed()
{
IsWalletInfoSeedRevealed = false;
WalletInfoSeedPasswordInput = "";
WalletInfoSeedError = "";
OnPropertyChanged(nameof(WalletInfoSeedText));
}
}