Add new inherited Tabs
ADD
WalletWasabi.Gui/Controls/WalletExplorer/BuildTabView.xaml.cs
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace WalletWasabi.Gui.Controls.WalletExplorer
+{
+ public class BuildTabView : UserControl
+ {
+ public BuildTabView()
+ {
+ this.InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}

ADD
WalletWasabi.Gui/Controls/WalletExplorer/BuildTabViewModel.cs
+using AvalonStudio.Extensibility;
+using AvalonStudio.Shell;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WalletWasabi.Blockchain.TransactionBuilding;
+using WalletWasabi.Gui.Helpers;
+
+namespace WalletWasabi.Gui.Controls.WalletExplorer
+{
+ public class BuildTabViewModel : SendTabBaseViewModel
+ {
+ public override string DoButtonText => "Build Transaction";
+ public override string DoingButtonText => "Building Transaction...";
+
+ public BuildTabViewModel(WalletViewModel walletViewModel) : base(walletViewModel, "Build Transaction")
+ {
+ }
+
+ protected override Task DoAfterBuildTransaction(BuildTransactionResult result)
+ {
+ try
+ {
+ var txviewer = IoC.Get<IShell>().Documents?.OfType<TransactionViewerViewModel>()?.FirstOrDefault(x => x.Wallet.Id == Wallet.Id);
+ if (txviewer is null)
+ {
+ txviewer = new TransactionViewerViewModel(Wallet);
+ IoC.Get<IShell>().AddDocument(txviewer);
+ }
+ IoC.Get<IShell>().Select(txviewer);
+
+ txviewer.Update(result);
+
+ ResetUi();
+
+ NotificationHelpers.Success("Transaction is successfully built!", "");
+ }
+ catch (Exception ex)
+ {
+ return Task.FromException(ex);
+ }
+ return Task.CompletedTask;
+ }
+ }
+}

ADD
WalletWasabi.Gui/Controls/WalletExplorer/SendTabView.xaml.cs
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace WalletWasabi.Gui.Controls.WalletExplorer
+{
+ public class SendTabView : UserControl
+ {
+ public SendTabView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}

ADD
WalletWasabi.Gui/Controls/WalletExplorer/SendTabViewModel.cs
+using NBitcoin;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using WalletWasabi.Blockchain.TransactionBuilding;
+using WalletWasabi.Blockchain.Transactions;
+using WalletWasabi.Gui.Helpers;
+using WalletWasabi.Gui.Models.StatusBarStatuses;
+using WalletWasabi.Gui.ViewModels;
+using WalletWasabi.Hwi;
+using WalletWasabi.Hwi.Exceptions;
+
+namespace WalletWasabi.Gui.Controls.WalletExplorer
+{
+ public class SendTabViewModel : SendTabBaseViewModel
+ {
+ public override string DoButtonText => "Send Transaction";
+ public override string DoingButtonText => "Sending Transaction...";
+
+ public SendTabViewModel(WalletViewModel walletViewModel) : base(walletViewModel, "Send")
+ {
+ }
+
+ protected override async Task DoAfterBuildTransaction(BuildTransactionResult result)
+ {
+ MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusType.SigningTransaction);
+ SmartTransaction signedTransaction = result.Transaction;
+
+ if (IsHardwareWallet && !result.Signed) // If hardware but still has a privkey then it's password, then meh.
+ {
+ try
+ {
+ IsHardwareBusy = true;
+ MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusType.AcquiringSignatureFromHardwareWallet);
+ var client = new HwiClient(Global.Network);
+
+ using var cts = new CancellationTokenSource(TimeSpan.FromMinutes(3));
+ PSBT signedPsbt = null;
+ try
+ {
+ signedPsbt = await client.SignTxAsync(KeyManager.MasterFingerprint.Value, result.Psbt, cts.Token);
+ }
+ catch (HwiException)
+ {
+ await PinPadViewModel.UnlockAsync();
+ signedPsbt = await client.SignTxAsync(KeyManager.MasterFingerprint.Value, result.Psbt, cts.Token);
+ }
+ signedTransaction = signedPsbt.ExtractSmartTransaction(result.Transaction);
+ }
+ catch (Exception ex)
+ {
+ NotificationHelpers.Error(ex.ToTypeMessageString());
+ return;
+ }
+ finally
+ {
+ MainWindowViewModel.Instance.StatusBar.TryRemoveStatus(StatusType.AcquiringSignatureFromHardwareWallet);
+ IsHardwareBusy = false;
+ }
+ }
+
+ MainWindowViewModel.Instance.StatusBar.TryAddStatus(StatusType.BroadcastingTransaction);
+ await Task.Run(async () => await Global.TransactionBroadcaster.SendTransactionAsync(signedTransaction));
+
+ ResetUi();
+ }
+ }
+}

Add new inherited Tabs