5#include <bitcoin-build-config.h>
8#include <qt/forms/ui_sendcoinsdialog.h>
19#include <chainparams.h>
26#include <validation.h>
36#include <QFontMetrics>
39#include <QTextDocument>
45static constexpr std::array
confTargets{2, 4, 6, 12, 24, 48, 144, 504, 1008};
47 if (index+1 >
static_cast<int>(
confTargets.size())) {
56 for (
unsigned int i = 0; i <
confTargets.size(); i++) {
68 platformStyle(_platformStyle)
73 ui->addButton->setIcon(QIcon());
74 ui->clearButton->setIcon(QIcon());
75 ui->sendButton->setIcon(QIcon());
91#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))
99 QAction *clipboardQuantityAction =
new QAction(tr(
"Copy quantity"),
this);
100 QAction *clipboardAmountAction =
new QAction(tr(
"Copy amount"),
this);
101 QAction *clipboardFeeAction =
new QAction(tr(
"Copy fee"),
this);
102 QAction *clipboardAfterFeeAction =
new QAction(tr(
"Copy after fee"),
this);
103 QAction *clipboardBytesAction =
new QAction(tr(
"Copy bytes"),
this);
104 QAction *clipboardChangeAction =
new QAction(tr(
"Copy change"),
this);
111 ui->labelCoinControlQuantity->addAction(clipboardQuantityAction);
112 ui->labelCoinControlAmount->addAction(clipboardAmountAction);
113 ui->labelCoinControlFee->addAction(clipboardFeeAction);
114 ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
115 ui->labelCoinControlBytes->addAction(clipboardBytesAction);
116 ui->labelCoinControlChange->addAction(clipboardChangeAction);
120 if (!settings.contains(
"fFeeSectionMinimized"))
121 settings.setValue(
"fFeeSectionMinimized",
true);
122 if (!settings.contains(
"nFeeRadio") && settings.contains(
"nTransactionFee") && settings.value(
"nTransactionFee").toLongLong() > 0)
123 settings.setValue(
"nFeeRadio", 1);
124 if (!settings.contains(
"nFeeRadio"))
125 settings.setValue(
"nFeeRadio", 0);
126 if (!settings.contains(
"nSmartFeeSliderPosition"))
127 settings.setValue(
"nSmartFeeSliderPosition", 0);
128 if (!settings.contains(
"nTransactionFee"))
130 ui->groupFee->setId(
ui->radioSmartFee, 0);
131 ui->groupFee->setId(
ui->radioCustomFee, 1);
132 ui->groupFee->button((
int)std::max(0, std::min(1, settings.value(
"nFeeRadio").toInt())))->setChecked(
true);
133 ui->customFee->SetAllowEmpty(
false);
134 ui->customFee->setValue(settings.value(
"nTransactionFee").toLongLong());
151 this->
model = _model;
155 for(
int i = 0; i <
ui->entries->count(); ++i)
157 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
185#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))
193 ui->customFee->SetMinValue(requiredFee);
194 if (
ui->customFee->value() < requiredFee) {
195 ui->customFee->setValue(requiredFee);
197 ui->customFee->setSingleStep(requiredFee);
202 ui->optInRBF->setCheckState(Qt::Checked);
206 ui->sendButton->setText(tr(
"Sign on device"));
208 ui->sendButton->setEnabled(
true);
209 ui->sendButton->setToolTip(tr(
"Connect your hardware wallet first."));
211 ui->sendButton->setEnabled(
false);
213 ui->sendButton->setToolTip(tr(
"Set external signer script path in Options -> Wallet"));
216 ui->sendButton->setText(tr(
"Cr&eate Unsigned"));
217 ui->sendButton->setToolTip(tr(
"Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(CLIENT_NAME));
222 if (settings.value(
"nSmartFeeSliderPosition").toInt() != 0) {
225 int nConfirmTarget = 25 - settings.value(
"nSmartFeeSliderPosition").toInt();
226 settings.setValue(
"nConfTarget", nConfirmTarget);
227 settings.remove(
"nSmartFeeSliderPosition");
229 if (settings.value(
"nConfTarget").toInt() == 0)
240 settings.setValue(
"nFeeRadio",
ui->groupFee->checkedId());
242 settings.setValue(
"nTransactionFee", (qint64)
ui->customFee->value());
249 QList<SendCoinsRecipient> recipients;
252 for(
int i = 0; i <
ui->entries->count(); ++i)
254 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
259 recipients.append(entry->
getValue());
263 ui->scrollArea->ensureWidgetVisible(entry);
269 if(!valid || recipients.isEmpty())
303 QStringList formatted;
313 QString address = rcp.address;
315 QString recipientElement;
318 if(rcp.label.length() > 0)
321 recipientElement.append(QString(
" (%1)").arg(address));
325 recipientElement.append(tr(
"%1 to %2").arg(amount, address));
328 formatted.append(recipientElement);
333 question_string.append(tr(
"Do you want to create this transaction?"));
334 question_string.append(
"<br /><span style='font-size:10pt;'>");
339 question_string.append(tr(
"Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(CLIENT_NAME));
344 question_string.append(tr(
"Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.").arg(CLIENT_NAME));
347 question_string.append(tr(
"Please, review your transaction."));
349 question_string.append(
"</span>%1");
354 question_string.append(
"<hr /><b>");
355 question_string.append(tr(
"Transaction fee"));
356 question_string.append(
"</b>");
360 question_string.append(
" (" + tr(
"%1 kvB",
"PSBT transaction creation").arg((
double)
m_current_transaction->getTransactionSize() / 1000, 0,
'g', 3) +
"): ");
363 question_string.append(
"<span style='color:#aa0000; font-weight:bold;'>");
365 question_string.append(
"</span><br />");
368 question_string.append(
"<span style='font-size:10pt; font-weight:normal;'>");
369 if (
ui->optInRBF->isChecked()) {
370 question_string.append(tr(
"You can increase the fee later (signals Replace-By-Fee, BIP-125)."));
372 question_string.append(tr(
"Not signalling Replace-By-Fee, BIP-125."));
374 question_string.append(
"</span>");
378 question_string.append(
"<hr />");
380 QStringList alternativeUnits;
385 question_string.append(QString(
"<b>%1</b>: <b>%2</b>").arg(tr(
"Total Amount"))
387 question_string.append(QString(
"<br /><span style='font-size:10pt; font-weight:normal;'>(=%1)</span>")
388 .arg(alternativeUnits.join(
" " + tr(
"or") +
" ")));
390 if (formatted.size() > 1) {
391 question_string = question_string.arg(
"");
392 informative_text = tr(
"To review recipient list click \"Show Details…\"");
393 detailed_text = formatted.join(
"\n\n");
395 question_string = question_string.arg(
"<br /><br />" + formatted.at(0));
407 QMessageBox msgBox(
this);
409 msgBox.setText(tr(
"Unsigned Transaction",
"PSBT copied"));
410 msgBox.setInformativeText(tr(
"The PSBT has been copied to the clipboard. You can also save it."));
411 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
412 msgBox.setDefaultButton(QMessageBox::Discard);
413 msgBox.setObjectName(
"psbt_copied_message");
414 switch (msgBox.exec()) {
415 case QMessageBox::Save: {
416 QString selectedFilter;
417 QString fileNameSuggestion =
"";
421 fileNameSuggestion.append(
" - ");
423 QString labelOrAddress = rcp.label.isEmpty() ? rcp.address : rcp.label;
425 fileNameSuggestion.append(labelOrAddress +
"-" + amount);
428 fileNameSuggestion.append(
".psbt");
430 tr(
"Save Transaction Data"), fileNameSuggestion,
432 tr(
"Partially Signed Transaction (Binary)") + QLatin1String(
" (*.psbt)"), &selectedFilter);
433 if (filename.isEmpty()) {
443 case QMessageBox::Discard:
451 std::optional<PSBTError> err;
454 }
catch (
const std::runtime_error& e) {
455 QMessageBox::critical(
nullptr, tr(
"Sign failed"), e.what());
458 if (err == PSBTError::EXTERNAL_SIGNER_NOT_FOUND) {
460 const QString
msg = tr(
"External signer not found");
461 QMessageBox::critical(
nullptr,
msg,
msg);
464 if (err == PSBTError::EXTERNAL_SIGNER_FAILED) {
466 const QString
msg = tr(
"External signer failure");
467 QMessageBox::critical(
nullptr,
msg,
msg);
485 QString question_string, informative_text, detailed_text;
486 if (!
PrepareSendText(question_string, informative_text, detailed_text))
return;
489 const QString confirmation = tr(
"Confirm send coins");
493 confirmationDialog->setAttribute(Qt::WA_DeleteOnClose);
495 const auto retval =
static_cast<QMessageBox::StandardButton
>(confirmationDialog->exec());
497 if(retval != QMessageBox::Yes && retval != QMessageBox::Save)
503 bool send_failure =
false;
504 if (retval == QMessageBox::Save) {
508 bool complete =
false;
519 bool broadcast =
true;
523 bool complete =
false;
531 broadcast = complete && !send_failure;
568 ui->checkBoxCoinControlChange->setChecked(
false);
569 ui->lineEditCoinControlChange->clear();
573 while(
ui->entries->count())
575 ui->entries->takeAt(0)->widget()->deleteLater();
596 ui->entries->addWidget(entry);
605 ui->scrollAreaWidgetContents->resize(
ui->scrollAreaWidgetContents->sizeHint());
610 QMetaObject::invokeMethod(
ui->scrollArea, [
this] {
611 if (ui->scrollArea->verticalScrollBar()) {
612 ui->scrollArea->verticalScrollBar()->setValue(ui->scrollArea->verticalScrollBar()->maximum());
614 }, Qt::QueuedConnection);
616 updateTabsAndLabels();
631 if (
ui->entries->count() == 1)
634 entry->deleteLater();
641 for(
int i = 0; i <
ui->entries->count(); ++i)
643 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
649 QWidget::setTabOrder(prev,
ui->sendButton);
650 QWidget::setTabOrder(
ui->sendButton,
ui->clearButton);
651 QWidget::setTabOrder(
ui->clearButton,
ui->addButton);
652 return ui->addButton;
659 if(
ui->entries->count() == 1)
661 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
682 if(
ui->entries->count() == 1)
684 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
713 ui->labelBalanceName->setText(tr(
"External balance:"));
716 ui->labelBalanceName->setText(tr(
"Watch-only balance:"));
731 QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
737 switch(sendCoinsReturn.
status)
740 msgParams.first = tr(
"The recipient address is not valid. Please recheck.");
743 msgParams.first = tr(
"The amount to pay must be larger than 0.");
746 msgParams.first = tr(
"The amount exceeds your balance.");
749 msgParams.first = tr(
"The total exceeds your balance when the %1 transaction fee is included.").arg(msgArg);
752 msgParams.first = tr(
"Duplicate address found: addresses should only be used once each.");
755 msgParams.first = tr(
"Transaction creation failed!");
767 Q_EMIT
message(tr(
"Send Coins"), msgParams.first, msgParams.second);
772 ui->labelFeeMinimized->setVisible(fMinimize);
773 ui->buttonChooseFee ->setVisible(fMinimize);
774 ui->buttonMinimizeFee->setVisible(!fMinimize);
775 ui->frameFeeSelection->setVisible(!fMinimize);
776 ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0);
803 for (
int i = 0; i <
ui->entries->count(); ++i) {
804 SendCoinsEntry* e = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
805 if (e && !e->isHidden() && e != entry) {
820 ui->confTargetSelector ->setEnabled(
ui->radioSmartFee->isChecked());
821 ui->labelSmartFee ->setEnabled(
ui->radioSmartFee->isChecked());
822 ui->labelSmartFee2 ->setEnabled(
ui->radioSmartFee->isChecked());
823 ui->labelSmartFee3 ->setEnabled(
ui->radioSmartFee->isChecked());
824 ui->labelFeeEstimation ->setEnabled(
ui->radioSmartFee->isChecked());
825 ui->labelCustomFeeWarning ->setEnabled(
ui->radioCustomFee->isChecked());
826 ui->labelCustomPerKilobyte ->setEnabled(
ui->radioCustomFee->isChecked());
827 ui->customFee ->setEnabled(
ui->radioCustomFee->isChecked());
835 if (
ui->radioSmartFee->isChecked())
836 ui->labelFeeMinimized->setText(
ui->labelSmartFee->text());
844 if (
ui->radioCustomFee->isChecked()) {
876 ui->labelSmartFee2->show();
877 ui->labelFeeEstimation->setText(
"");
878 ui->fallbackFeeWarningLabel->setVisible(
true);
879 int lightness =
ui->fallbackFeeWarningLabel->palette().color(QPalette::WindowText).lightness();
880 QColor warning_colour(255 - (lightness / 5), 176 - (lightness / 3), 48 - (lightness / 14));
881 ui->fallbackFeeWarningLabel->setStyleSheet(
"QLabel { color: " + warning_colour.name() +
"; }");
882 ui->fallbackFeeWarningLabel->setIndent(
GUIUtil::TextWidth(QFontMetrics(
ui->fallbackFeeWarningLabel->font()),
"x"));
886 ui->labelSmartFee2->hide();
887 ui->labelFeeEstimation->setText(tr(
"Estimated to begin confirmation within %n block(s).",
"", returned_target));
888 ui->fallbackFeeWarningLabel->setVisible(
false);
933 ui->frameCoinControl->setVisible(checked);
935 if (!checked &&
model) {
951#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))
957 if (state == Qt::Unchecked)
960 ui->labelCoinControlChangeLabel->clear();
964 coinControlChangeEdited(ui->lineEditCoinControlChange->text());
966 ui->lineEditCoinControlChange->setEnabled((state == Qt::Checked));
976 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:red;}");
982 ui->labelCoinControlChangeLabel->setText(
"");
986 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Invalid Bitcoin address"));
991 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Unknown change address"));
994 QMessageBox::StandardButton btnRetVal = QMessageBox::question(
this, tr(
"Confirm custom change address"), tr(
"The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?"),
995 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
997 if(btnRetVal == QMessageBox::Yes)
1001 ui->lineEditCoinControlChange->setText(
"");
1002 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
1003 ui->labelCoinControlChangeLabel->setText(
"");
1008 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
1012 if (!associatedLabel.isEmpty())
1013 ui->labelCoinControlChangeLabel->setText(associatedLabel);
1015 ui->labelCoinControlChangeLabel->setText(tr(
"(no label)"));
1035 for(
int i = 0; i <
ui->entries->count(); ++i)
1037 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
1038 if(entry && !entry->isHidden())
1053 ui->labelCoinControlAutomaticallySelected->hide();
1054 ui->widgetCoinControl->show();
1059 ui->labelCoinControlAutomaticallySelected->show();
1060 ui->widgetCoinControl->hide();
1061 ui->labelCoinControlInsuffFunds->hide();
1066 : QMessageBox(parent), secDelay(_secDelay), m_enable_send(enable_send)
1068 setIcon(QMessageBox::Question);
1069 setWindowTitle(title);
1071 setInformativeText(informative_text);
1072 setDetailedText(detailed_text);
1073 setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
1074 if (always_show_unsigned || !enable_send) addButton(QMessageBox::Save);
1075 setDefaultButton(QMessageBox::Cancel);
1089 return QMessageBox::exec();
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
int64_t CAmount
Amount in satoshis (Can be negative)
const CChainParams & Params()
Return the currently selected parameters.
QString labelForAddress(const QString &address) const
Look up label for address in address book, if not found return empty string.
static QString formatHtmlWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as HTML string (with unit)
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
static QString formatWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as string (with unit)
@ MSG_INFORMATION
Predefined combinations for certain default usage cases.
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
CAmount GetFeePerK() const
Return the fee in satoshis for a vsize of 1000 vbytes.
Model for Bitcoin network client.
void numBlocksChanged(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state)
static QList< CAmount > payAmounts
static void updateLabels(wallet::CCoinControl &m_coin_control, WalletModel *, QDialog *)
static bool fSubtractFeeFromAmount
Double ended buffer combining vector and stream-like interfaces.
bool getCoinControlFeatures() const
bool getEnablePSBTControls() const
void coinControlFeaturesChanged(bool)
void displayUnitChanged(BitcoinUnit unit)
BitcoinUnit getDisplayUnit() const
bool hasSigner()
Whether -signer was set or not.
Dialog for sending bitcoins.
void useAvailableBalance(SendCoinsEntry *entry)
void presentPSBT(PartiallySignedTransaction &psbt)
ClientModel * clientModel
void coinControlChangeEdited(const QString &)
void coinControlClipboardFee()
void on_buttonChooseFee_clicked()
void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg=QString())
void setClientModel(ClientModel *clientModel)
void updateTabsAndLabels()
void updateFeeSectionControls()
SendCoinsEntry * addEntry()
void updateNumberOfBlocks(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state)
void pasteEntry(const SendCoinsRecipient &rv)
void updateFeeMinimizedLabel()
const PlatformStyle * platformStyle
std::unique_ptr< wallet::CCoinControl > m_coin_control
void coinControlClipboardQuantity()
void coinControlButtonClicked()
void coinControlClipboardAfterFee()
bool signWithExternalSigner(PartiallySignedTransaction &psbt, CMutableTransaction &mtx, bool &complete)
QWidget * setupTabChain(QWidget *prev)
Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://...
bool PrepareSendText(QString &question_string, QString &informative_text, QString &detailed_text)
void sendButtonClicked(bool checked)
void setModel(WalletModel *model)
void coinControlChangeChecked(Qt::CheckState)
bool handlePaymentRequest(const SendCoinsRecipient &recipient)
void setBalance(const interfaces::WalletBalances &balances)
void coinControlClipboardAmount()
void setAddress(const QString &address)
void coinControlClipboardChange()
std::unique_ptr< WalletModelTransaction > m_current_transaction
bool fNewRecipientAllowed
void removeEntry(SendCoinsEntry *entry)
void updateSmartFeeLabel()
void updateCoinControlState()
void coinControlClipboardBytes()
void message(const QString &title, const QString &message, unsigned int style)
SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent=nullptr)
void coinsSent(const uint256 &txid)
void on_buttonMinimizeFee_clicked()
void coinControlUpdateLabels()
void coinControlFeatureChanged(bool)
void minimizeFeeSection(bool fMinimize)
A single entry in the dialog for sending bitcoins.
void setAddress(const QString &address)
bool isClear()
Return whether the entry is still empty and unedited.
void subtractFeeFromAmountChanged()
void useAvailableBalance(SendCoinsEntry *entry)
void setValue(const SendCoinsRecipient &value)
void setModel(WalletModel *model)
void removeEntry(SendCoinsEntry *entry)
void setAmount(const CAmount &amount)
QWidget * setupTabChain(QWidget *prev)
Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://...
bool validate(interfaces::Node &node)
void checkSubtractFeeFromAmount()
SendCoinsRecipient getValue()
bool fSubtractFeeFromAmount
QString m_psbt_button_text
SendConfirmationDialog(const QString &title, const QString &text, const QString &informative_text="", const QString &detailed_text="", int secDelay=SEND_CONFIRM_DELAY, bool enable_send=true, bool always_show_unsigned=true, QWidget *parent=nullptr)
QAbstractButton * m_psbt_button
QAbstractButton * yesButton
QString confirmButtonText
Interface to Bitcoin wallet from Qt view code.
interfaces::Node & node() const
AddressTableModel * getAddressTableModel() const
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const wallet::CCoinControl &coinControl)
void sendCoins(WalletModelTransaction &transaction)
CAmount getAvailableBalance(const wallet::CCoinControl *control)
bool isMultiwallet() const
interfaces::Wallet & wallet() const
OptionsModel * getOptionsModel() const
UnlockContext requestUnlock()
void balanceChanged(const interfaces::WalletBalances &balances)
interfaces::WalletBalances getCachedBalance() const
QString getWalletName() const
@ AmountWithFeeExceedsBalance
@ TransactionCreationFailed
virtual bool isLegacy()=0
Return whether is a legacy wallet.
virtual CAmount getRequiredFee(unsigned int tx_bytes)=0
Get required fee.
virtual unsigned int getConfirmTarget()=0
Get tx confirm target.
virtual bool hasExternalSigner()=0
virtual CAmount getDefaultMaxTxFee()=0
Get max tx fee.
virtual bool isSpendable(const CTxDestination &dest)=0
Return whether wallet has private key.
virtual std::optional< common::PSBTError > fillPSBT(int sighash_type, bool sign, bool bip32derivs, size_t *n_signed, PartiallySignedTransaction &psbtx, bool &complete)=0
Fill PSBT.
virtual bool privateKeysDisabled()=0
virtual CAmount getMinimumFee(unsigned int tx_bytes, const wallet::CCoinControl &coin_control, int *returned_target, FeeReason *reason)=0
Get minimum fee.
bool HasSelected() const
Returns true if there are pre-selected inputs.
bool m_allow_other_inputs
If true, the selection process can add extra unselected inputs from the wallet while requires all sel...
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
Utility functions used by the Bitcoin Qt UI.
QString HtmlEscape(const QString &str, bool fMultiLine)
void ShowModalDialogAsynchronously(QDialog *dialog)
Shows a QDialog instance asynchronously, and deletes it on close.
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedSuffixOut)
Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix when ...
QString formatNiceTimeOffset(qint64 secs)
constexpr auto dialog_flags
auto ExceptionSafeConnect(Sender sender, Signal signal, Receiver receiver, Slot method, Qt::ConnectionType type=Qt::AutoConnection)
A drop-in replacement of QObject::connect function (see: https://doc.qt.io/qt-5/qobject....
int TextWidth(const QFontMetrics &fm, const QString &text)
Returns the distance in pixels appropriate for drawing a subsequent character after text.
void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
void setClipboard(const QString &str)
constexpr CAmount DEFAULT_PAY_TX_FEE
-paytxfee default
is a home for public enum and struct type definitions that are used internally by node code,...
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
int getConfTargetForIndex(int index)
int getIndexForConfTarget(int target)
static constexpr std::array confTargets
#define SEND_CONFIRM_DELAY
A mutable version of CTransaction.
A version of CTransaction with the PSBT format.
Collection of wallet balances.
CAmount watch_only_balance
std::string EncodeBase64(std::span< const unsigned char > input)
SynchronizationState
Current sync state passed to tip changed callbacks.