public TransactionPreviewViewModel(Wallet wallet, TransactionInfo info, BuildTransactionResult transaction) { _wallet = wallet; _labels = SmartLabel.Empty; _info = info; SetupCancel(enableCancel: false, enableCancelOnEscape: true, enableCancelOnPressed: false); EnableBack = true; _confirmationTimeText = ""; var destinationAmount = transaction.CalculateDestinationAmount().ToDecimal(MoneyUnit.BTC); var btcAmountText = $"{destinationAmount} bitcoins "; var fiatAmountText = destinationAmount.GenerateFiatText(_wallet.Synchronizer.UsdExchangeRate, "USD"); AmountText = $"{btcAmountText}{fiatAmountText}"; AddressText = info.Address.ToString(); var fee = transaction.Fee; var btcFeeText = $"{fee.ToDecimal(MoneyUnit.Satoshi)} sats "; var fiatFeeText = fee.ToDecimal(MoneyUnit.BTC).GenerateFiatText(_wallet.Synchronizer.UsdExchangeRate, "USD"); FeeText = $"{btcFeeText}{fiatFeeText}"; PayJoinUrl = info.PayJoinClient?.PaymentUrl.AbsoluteUri; IsPayJoin = PayJoinUrl is not null; if (PreferPsbtWorkflow) { SkipCommand = ReactiveCommand.CreateFromTask(async() => await OnConfirmAsync(transaction)); NextCommand = ReactiveCommand.CreateFromTask(async() => { var saved = await TransactionHelpers.ExportTransactionToBinaryAsync(transaction); if (saved) { Navigate().To(new SuccessViewModel("The PSBT has been successfully created.")); } }); _nextButtonText = "Save PSBT file"; } else { NextCommand = ReactiveCommand.CreateFromTask(async() => await OnConfirmAsync(transaction)); _nextButtonText = "Confirm"; } }