5#include <bitcoin-build-config.h>
8#include <qt/forms/ui_sendcoinsdialog.h>
19#include <chainparams.h>
25#include <validation.h>
37#include <QFontMetrics>
40#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 ui->groupFee->setId(
ui->radioSmartFee, 0);
129 ui->groupFee->setId(
ui->radioCustomFee, 1);
130 ui->groupFee->button((
int)std::max(0, std::min(1, settings.value(
"nFeeRadio").toInt())))->setChecked(
true);
131 ui->customFee->SetAllowEmpty(
false);
132 ui->customFee->setValue(settings.value(
"nTransactionFee").toLongLong());
149 this->
model = _model;
153 for(
int i = 0; i <
ui->entries->count(); ++i)
155 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
184 ui->customFee->SetMinValue(requiredFee);
185 if (
ui->customFee->value() < requiredFee) {
186 ui->customFee->setValue(requiredFee);
188 ui->customFee->setSingleStep(requiredFee);
194 ui->sendButton->setText(tr(
"Sign on device"));
196 ui->sendButton->setEnabled(
true);
197 ui->sendButton->setToolTip(tr(
"Connect your hardware wallet first."));
199 ui->sendButton->setEnabled(
false);
201 ui->sendButton->setToolTip(tr(
"Set external signer script path in Options -> Wallet"));
204 ui->sendButton->setText(tr(
"Cr&eate Unsigned"));
205 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));
210 if (settings.value(
"nSmartFeeSliderPosition").toInt() != 0) {
213 int nConfirmTarget = 25 - settings.value(
"nSmartFeeSliderPosition").toInt();
214 settings.setValue(
"nConfTarget", nConfirmTarget);
215 settings.remove(
"nSmartFeeSliderPosition");
217 if (settings.value(
"nConfTarget").toInt() == 0)
228 settings.setValue(
"nFeeRadio",
ui->groupFee->checkedId());
230 settings.setValue(
"nTransactionFee", (qint64)
ui->customFee->value());
237 QList<SendCoinsRecipient> recipients;
240 for(
int i = 0; i <
ui->entries->count(); ++i)
242 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
247 recipients.append(entry->
getValue());
251 ui->scrollArea->ensureWidgetVisible(entry);
257 if(!valid || recipients.isEmpty())
291 QStringList formatted;
301 QString address = rcp.address;
303 QString recipientElement;
306 if(rcp.label.length() > 0)
309 recipientElement.append(QString(
" (%1)").arg(address));
313 recipientElement.append(tr(
"%1 to %2").arg(amount, address));
316 formatted.append(recipientElement);
321 question_string.append(tr(
"Do you want to create this transaction?"));
322 question_string.append(
"<br /><span style='font-size:10pt;'>");
327 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));
332 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));
335 question_string.append(tr(
"Please, review your transaction."));
337 question_string.append(
"</span>%1");
342 question_string.append(
"<hr /><b>");
343 question_string.append(tr(
"Transaction fee"));
344 question_string.append(
"</b>");
348 question_string.append(
" (" + tr(
"%1 kvB",
"PSBT transaction creation").arg((
double)
m_current_transaction->getTransactionSize() / 1000, 0,
'g', 3) +
"): ");
351 question_string.append(
"<span style='color:#aa0000; font-weight:bold;'>");
353 question_string.append(
"</span><br />");
357 question_string.append(
"<span style='font-size:10pt; font-weight:normal;'>");
358 question_string.append(tr(
"You can increase the fee later."));
361 question_string.append(
"<hr />");
363 QStringList alternativeUnits;
368 question_string.append(QString(
"<b>%1</b>: <b>%2</b>").arg(tr(
"Total Amount"))
370 question_string.append(QString(
"<br /><span style='font-size:10pt; font-weight:normal;'>(=%1)</span>")
371 .arg(alternativeUnits.join(
" " + tr(
"or") +
" ")));
373 if (formatted.size() > 1) {
374 question_string = question_string.arg(
"");
375 informative_text = tr(
"To review recipient list click \"Show Details…\"");
376 detailed_text = formatted.join(
"\n\n");
378 question_string = question_string.arg(
"<br /><br />" + formatted.at(0));
390 QMessageBox msgBox(
this);
392 msgBox.setText(tr(
"Unsigned Transaction",
"PSBT copied"));
393 msgBox.setInformativeText(tr(
"The PSBT has been copied to the clipboard. You can also save it."));
394 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
395 msgBox.setDefaultButton(QMessageBox::Discard);
396 msgBox.setObjectName(
"psbt_copied_message");
397 switch (msgBox.exec()) {
398 case QMessageBox::Save: {
399 QString selectedFilter;
400 QString fileNameSuggestion =
"";
404 fileNameSuggestion.append(
" - ");
406 QString labelOrAddress = rcp.label.isEmpty() ? rcp.address : rcp.label;
408 fileNameSuggestion.append(labelOrAddress +
"-" + amount);
411 fileNameSuggestion.append(
".psbt");
413 tr(
"Save Transaction Data"), fileNameSuggestion,
415 tr(
"Partially Signed Transaction (Binary)") + QLatin1String(
" (*.psbt)"), &selectedFilter);
416 if (filename.isEmpty()) {
426 case QMessageBox::Discard:
434 std::optional<PSBTError> err;
436 err =
model->
wallet().
fillPSBT({.sign =
true, .bip32_derivs =
true},
nullptr, psbtx, complete);
437 }
catch (
const std::runtime_error& e) {
438 QMessageBox::critical(
nullptr, tr(
"Sign failed"), e.what());
441 if (err == PSBTError::EXTERNAL_SIGNER_NOT_FOUND) {
443 const QString
msg = tr(
"External signer not found");
444 QMessageBox::critical(
nullptr,
msg,
msg);
447 if (err == PSBTError::EXTERNAL_SIGNER_FAILED) {
449 const QString
msg = tr(
"External signer failure");
450 QMessageBox::critical(
nullptr,
msg,
msg);
454 qWarning() <<
"Failed to sign PSBT";
468 QString question_string, informative_text, detailed_text;
469 if (!
PrepareSendText(question_string, informative_text, detailed_text))
return;
472 const QString confirmation = tr(
"Confirm send coins");
476 confirmationDialog->setAttribute(Qt::WA_DeleteOnClose);
478 const auto retval =
static_cast<QMessageBox::StandardButton
>(confirmationDialog->exec());
480 if(retval != QMessageBox::Yes && retval != QMessageBox::Save)
486 bool send_failure =
false;
487 if (retval == QMessageBox::Save) {
491 bool complete =
false;
493 const auto err{
model->
wallet().
fillPSBT({.sign =
false, .bip32_derivs =
true},
nullptr, psbtx, complete)};
502 bool broadcast =
true;
506 bool complete =
false;
509 const auto err{
model->
wallet().
fillPSBT({.sign =
false, .bip32_derivs =
true},
nullptr, psbtx, complete)};
514 broadcast = complete && !send_failure;
551 ui->checkBoxCoinControlChange->setChecked(
false);
552 ui->lineEditCoinControlChange->clear();
556 while(
ui->entries->count())
558 ui->entries->takeAt(0)->widget()->deleteLater();
579 ui->entries->addWidget(entry);
588 ui->scrollAreaWidgetContents->resize(
ui->scrollAreaWidgetContents->sizeHint());
593 QMetaObject::invokeMethod(
ui->scrollArea, [
this] {
594 if (ui->scrollArea->verticalScrollBar()) {
595 ui->scrollArea->verticalScrollBar()->setValue(ui->scrollArea->verticalScrollBar()->maximum());
597 }, Qt::QueuedConnection);
599 updateTabsAndLabels();
614 if (
ui->entries->count() == 1)
617 entry->deleteLater();
624 for(
int i = 0; i <
ui->entries->count(); ++i)
626 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
632 QWidget::setTabOrder(prev,
ui->sendButton);
633 QWidget::setTabOrder(
ui->sendButton,
ui->clearButton);
634 QWidget::setTabOrder(
ui->clearButton,
ui->addButton);
635 return ui->addButton;
642 if(
ui->entries->count() == 1)
644 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
665 if(
ui->entries->count() == 1)
667 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
696 ui->labelBalanceName->setText(tr(
"External balance:"));
711 QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
717 switch(sendCoinsReturn.
status)
720 msgParams.first = tr(
"The recipient address is not valid. Please recheck.");
723 msgParams.first = tr(
"The amount to pay must be larger than 0.");
726 msgParams.first = tr(
"The amount exceeds your balance.");
729 msgParams.first = tr(
"Duplicate address found: addresses should only be used once each.");
732 msgParams.first = tr(
"Transaction creation failed!");
741 Q_EMIT
message(tr(
"Send Coins"), msgParams.first, msgParams.second);
746 ui->labelFeeMinimized->setVisible(fMinimize);
747 ui->buttonChooseFee ->setVisible(fMinimize);
748 ui->buttonMinimizeFee->setVisible(!fMinimize);
749 ui->frameFeeSelection->setVisible(!fMinimize);
750 ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0);
774 for (
int i = 0; i <
ui->entries->count(); ++i) {
775 SendCoinsEntry* e = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
776 if (e && !e->isHidden() && e != entry) {
791 ui->confTargetSelector ->setEnabled(
ui->radioSmartFee->isChecked());
792 ui->labelSmartFee ->setEnabled(
ui->radioSmartFee->isChecked());
793 ui->labelSmartFee2 ->setEnabled(
ui->radioSmartFee->isChecked());
794 ui->labelSmartFee3 ->setEnabled(
ui->radioSmartFee->isChecked());
795 ui->labelFeeEstimation ->setEnabled(
ui->radioSmartFee->isChecked());
796 ui->labelCustomFeeWarning ->setEnabled(
ui->radioCustomFee->isChecked());
797 ui->labelCustomPerKilobyte ->setEnabled(
ui->radioCustomFee->isChecked());
798 ui->customFee ->setEnabled(
ui->radioCustomFee->isChecked());
806 if (
ui->radioSmartFee->isChecked())
807 ui->labelFeeMinimized->setText(
ui->labelSmartFee->text());
815 if (
ui->radioCustomFee->isChecked()) {
841 std::optional<int> returned_target;
848 ui->labelSmartFee2->show();
849 ui->labelFeeEstimation->setText(
"");
850 ui->fallbackFeeWarningLabel->setVisible(
true);
851 int lightness =
ui->fallbackFeeWarningLabel->palette().color(QPalette::WindowText).lightness();
852 QColor warning_colour(255 - (lightness / 5), 176 - (lightness / 3), 48 - (lightness / 14));
853 ui->fallbackFeeWarningLabel->setStyleSheet(
"QLabel { color: " + warning_colour.name() +
"; }");
854 ui->fallbackFeeWarningLabel->setIndent(
GUIUtil::TextWidth(QFontMetrics(
ui->fallbackFeeWarningLabel->font()),
"x"));
858 ui->labelSmartFee2->hide();
859 ui->labelFeeEstimation->setText(
"");
860 if (returned_target) {
861 ui->labelFeeEstimation->setText(tr(
"Estimated to begin confirmation within %n block(s).",
"", *returned_target));
863 ui->fallbackFeeWarningLabel->setVisible(
false);
908 ui->frameCoinControl->setVisible(checked);
910 if (!checked &&
model) {
926#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))
932 if (state == Qt::Unchecked)
935 ui->labelCoinControlChangeLabel->clear();
939 coinControlChangeEdited(ui->lineEditCoinControlChange->text());
941 ui->lineEditCoinControlChange->setEnabled((state == Qt::Checked));
951 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:red;}");
957 ui->labelCoinControlChangeLabel->setText(
"");
961 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Invalid Bitcoin address"));
966 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Unknown change address"));
969 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?"),
970 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
972 if(btnRetVal == QMessageBox::Yes)
976 ui->lineEditCoinControlChange->setText(
"");
977 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
978 ui->labelCoinControlChangeLabel->setText(
"");
983 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
987 if (!associatedLabel.isEmpty())
988 ui->labelCoinControlChangeLabel->setText(associatedLabel);
990 ui->labelCoinControlChangeLabel->setText(tr(
"(no label)"));
1010 for(
int i = 0; i <
ui->entries->count(); ++i)
1012 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
1013 if(entry && !entry->isHidden())
1028 ui->labelCoinControlAutomaticallySelected->hide();
1029 ui->widgetCoinControl->show();
1034 ui->labelCoinControlAutomaticallySelected->show();
1035 ui->widgetCoinControl->hide();
1036 ui->labelCoinControlInsuffFunds->hide();
1041 : QMessageBox(parent), secDelay(_secDelay), m_enable_send(enable_send)
1043 setIcon(QMessageBox::Question);
1044 setWindowTitle(title);
1046 setInformativeText(informative_text);
1047 setDetailedText(detailed_text);
1048 setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
1049 if (always_show_unsigned || !enable_send) addButton(QMessageBox::Save);
1050 setDefaultButton(QMessageBox::Cancel);
1064 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 virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
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.
A version of CTransaction with the PSBT format.
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 coinsSent(const Txid &txid)
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 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
@ TransactionCreationFailed
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 CAmount getMinimumFee(unsigned int tx_bytes, const wallet::CCoinControl &coin_control, std::optional< int > *returned_target, FeeReason *reason)=0
Get minimum fee.
virtual std::optional< common::PSBTError > fillPSBT(const common::PSBTFillOptions &options, size_t *n_signed, PartiallySignedTransaction &psbtx, bool &complete)=0
Fill PSBT.
virtual bool privateKeysDisabled()=0
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)
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.
Collection of wallet balances.
std::string EncodeBase64(std::span< const unsigned char > input)
SynchronizationState
Current sync state passed to tip changed callbacks.
is a home for public enum and struct type definitions that are used by internally by wallet code,...