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());
95 QAction *clipboardQuantityAction =
new QAction(tr(
"Copy quantity"),
this);
96 QAction *clipboardAmountAction =
new QAction(tr(
"Copy amount"),
this);
97 QAction *clipboardFeeAction =
new QAction(tr(
"Copy fee"),
this);
98 QAction *clipboardAfterFeeAction =
new QAction(tr(
"Copy after fee"),
this);
99 QAction *clipboardBytesAction =
new QAction(tr(
"Copy bytes"),
this);
100 QAction *clipboardChangeAction =
new QAction(tr(
"Copy change"),
this);
107 ui->labelCoinControlQuantity->addAction(clipboardQuantityAction);
108 ui->labelCoinControlAmount->addAction(clipboardAmountAction);
109 ui->labelCoinControlFee->addAction(clipboardFeeAction);
110 ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
111 ui->labelCoinControlBytes->addAction(clipboardBytesAction);
112 ui->labelCoinControlChange->addAction(clipboardChangeAction);
116 if (!settings.contains(
"fFeeSectionMinimized"))
117 settings.setValue(
"fFeeSectionMinimized",
true);
118 if (!settings.contains(
"nFeeRadio") && settings.contains(
"nTransactionFee") && settings.value(
"nTransactionFee").toLongLong() > 0)
119 settings.setValue(
"nFeeRadio", 1);
120 if (!settings.contains(
"nFeeRadio"))
121 settings.setValue(
"nFeeRadio", 0);
122 if (!settings.contains(
"nSmartFeeSliderPosition"))
123 settings.setValue(
"nSmartFeeSliderPosition", 0);
124 if (!settings.contains(
"nTransactionFee"))
126 ui->groupFee->setId(
ui->radioSmartFee, 0);
127 ui->groupFee->setId(
ui->radioCustomFee, 1);
128 ui->groupFee->button((
int)std::max(0, std::min(1, settings.value(
"nFeeRadio").toInt())))->setChecked(
true);
129 ui->customFee->SetAllowEmpty(
false);
130 ui->customFee->setValue(settings.value(
"nTransactionFee").toLongLong());
147 this->
model = _model;
151 for(
int i = 0; i <
ui->entries->count(); ++i)
153 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
177#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
189 ui->customFee->SetMinValue(requiredFee);
190 if (
ui->customFee->value() < requiredFee) {
191 ui->customFee->setValue(requiredFee);
193 ui->customFee->setSingleStep(requiredFee);
198 ui->optInRBF->setCheckState(Qt::Checked);
202 ui->sendButton->setText(tr(
"Sign on device"));
204 ui->sendButton->setEnabled(
true);
205 ui->sendButton->setToolTip(tr(
"Connect your hardware wallet first."));
207 ui->sendButton->setEnabled(
false);
209 ui->sendButton->setToolTip(tr(
"Set external signer script path in Options -> Wallet"));
212 ui->sendButton->setText(tr(
"Cr&eate Unsigned"));
213 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));
218 if (settings.value(
"nSmartFeeSliderPosition").toInt() != 0) {
221 int nConfirmTarget = 25 - settings.value(
"nSmartFeeSliderPosition").toInt();
222 settings.setValue(
"nConfTarget", nConfirmTarget);
223 settings.remove(
"nSmartFeeSliderPosition");
225 if (settings.value(
"nConfTarget").toInt() == 0)
236 settings.setValue(
"nFeeRadio",
ui->groupFee->checkedId());
238 settings.setValue(
"nTransactionFee", (qint64)
ui->customFee->value());
245 QList<SendCoinsRecipient> recipients;
248 for(
int i = 0; i <
ui->entries->count(); ++i)
250 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
255 recipients.append(entry->
getValue());
259 ui->scrollArea->ensureWidgetVisible(entry);
265 if(!valid || recipients.isEmpty())
299 QStringList formatted;
309 QString address = rcp.address;
311 QString recipientElement;
314 if(rcp.label.length() > 0)
317 recipientElement.append(QString(
" (%1)").arg(address));
321 recipientElement.append(tr(
"%1 to %2").arg(amount, address));
324 formatted.append(recipientElement);
329 question_string.append(tr(
"Do you want to create this transaction?"));
330 question_string.append(
"<br /><span style='font-size:10pt;'>");
335 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));
340 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));
343 question_string.append(tr(
"Please, review your transaction."));
345 question_string.append(
"</span>%1");
350 question_string.append(
"<hr /><b>");
351 question_string.append(tr(
"Transaction fee"));
352 question_string.append(
"</b>");
356 question_string.append(
" (" + tr(
"%1 kvB",
"PSBT transaction creation").arg((
double)
m_current_transaction->getTransactionSize() / 1000, 0,
'g', 3) +
"): ");
359 question_string.append(
"<span style='color:#aa0000; font-weight:bold;'>");
361 question_string.append(
"</span><br />");
364 question_string.append(
"<span style='font-size:10pt; font-weight:normal;'>");
365 if (
ui->optInRBF->isChecked()) {
366 question_string.append(tr(
"You can increase the fee later (signals Replace-By-Fee, BIP-125)."));
368 question_string.append(tr(
"Not signalling Replace-By-Fee, BIP-125."));
370 question_string.append(
"</span>");
374 question_string.append(
"<hr />");
376 QStringList alternativeUnits;
381 question_string.append(QString(
"<b>%1</b>: <b>%2</b>").arg(tr(
"Total Amount"))
383 question_string.append(QString(
"<br /><span style='font-size:10pt; font-weight:normal;'>(=%1)</span>")
384 .arg(alternativeUnits.join(
" " + tr(
"or") +
" ")));
386 if (formatted.size() > 1) {
387 question_string = question_string.arg(
"");
388 informative_text = tr(
"To review recipient list click \"Show Details…\"");
389 detailed_text = formatted.join(
"\n\n");
391 question_string = question_string.arg(
"<br /><br />" + formatted.at(0));
403 QMessageBox msgBox(
this);
405 msgBox.setText(tr(
"Unsigned Transaction",
"PSBT copied"));
406 msgBox.setInformativeText(tr(
"The PSBT has been copied to the clipboard. You can also save it."));
407 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
408 msgBox.setDefaultButton(QMessageBox::Discard);
409 msgBox.setObjectName(
"psbt_copied_message");
410 switch (msgBox.exec()) {
411 case QMessageBox::Save: {
412 QString selectedFilter;
413 QString fileNameSuggestion =
"";
417 fileNameSuggestion.append(
" - ");
419 QString labelOrAddress = rcp.label.isEmpty() ? rcp.address : rcp.label;
421 fileNameSuggestion.append(labelOrAddress +
"-" + amount);
424 fileNameSuggestion.append(
".psbt");
426 tr(
"Save Transaction Data"), fileNameSuggestion,
428 tr(
"Partially Signed Transaction (Binary)") + QLatin1String(
" (*.psbt)"), &selectedFilter);
429 if (filename.isEmpty()) {
439 case QMessageBox::Discard:
447 std::optional<PSBTError> err;
450 }
catch (
const std::runtime_error& e) {
451 QMessageBox::critical(
nullptr, tr(
"Sign failed"), e.what());
454 if (err == PSBTError::EXTERNAL_SIGNER_NOT_FOUND) {
456 const QString
msg = tr(
"External signer not found");
457 QMessageBox::critical(
nullptr,
msg,
msg);
460 if (err == PSBTError::EXTERNAL_SIGNER_FAILED) {
462 const QString
msg = tr(
"External signer failure");
463 QMessageBox::critical(
nullptr,
msg,
msg);
481 QString question_string, informative_text, detailed_text;
482 if (!
PrepareSendText(question_string, informative_text, detailed_text))
return;
485 const QString confirmation = tr(
"Confirm send coins");
489 confirmationDialog->setAttribute(Qt::WA_DeleteOnClose);
491 const auto retval =
static_cast<QMessageBox::StandardButton
>(confirmationDialog->exec());
493 if(retval != QMessageBox::Yes && retval != QMessageBox::Save)
499 bool send_failure =
false;
500 if (retval == QMessageBox::Save) {
504 bool complete =
false;
515 bool broadcast =
true;
519 bool complete =
false;
527 broadcast = complete && !send_failure;
564 ui->checkBoxCoinControlChange->setChecked(
false);
565 ui->lineEditCoinControlChange->clear();
569 while(
ui->entries->count())
571 ui->entries->takeAt(0)->widget()->deleteLater();
592 ui->entries->addWidget(entry);
601 ui->scrollAreaWidgetContents->resize(
ui->scrollAreaWidgetContents->sizeHint());
606 QMetaObject::invokeMethod(
ui->scrollArea, [
this] {
607 if (ui->scrollArea->verticalScrollBar()) {
608 ui->scrollArea->verticalScrollBar()->setValue(ui->scrollArea->verticalScrollBar()->maximum());
610 }, Qt::QueuedConnection);
612 updateTabsAndLabels();
627 if (
ui->entries->count() == 1)
630 entry->deleteLater();
637 for(
int i = 0; i <
ui->entries->count(); ++i)
639 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
645 QWidget::setTabOrder(prev,
ui->sendButton);
646 QWidget::setTabOrder(
ui->sendButton,
ui->clearButton);
647 QWidget::setTabOrder(
ui->clearButton,
ui->addButton);
648 return ui->addButton;
655 if(
ui->entries->count() == 1)
657 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
678 if(
ui->entries->count() == 1)
680 SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(0)->widget());
709 ui->labelBalanceName->setText(tr(
"External balance:"));
712 ui->labelBalanceName->setText(tr(
"Watch-only balance:"));
727 QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
733 switch(sendCoinsReturn.
status)
736 msgParams.first = tr(
"The recipient address is not valid. Please recheck.");
739 msgParams.first = tr(
"The amount to pay must be larger than 0.");
742 msgParams.first = tr(
"The amount exceeds your balance.");
745 msgParams.first = tr(
"The total exceeds your balance when the %1 transaction fee is included.").arg(msgArg);
748 msgParams.first = tr(
"Duplicate address found: addresses should only be used once each.");
751 msgParams.first = tr(
"Transaction creation failed!");
763 Q_EMIT
message(tr(
"Send Coins"), msgParams.first, msgParams.second);
768 ui->labelFeeMinimized->setVisible(fMinimize);
769 ui->buttonChooseFee ->setVisible(fMinimize);
770 ui->buttonMinimizeFee->setVisible(!fMinimize);
771 ui->frameFeeSelection->setVisible(!fMinimize);
772 ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0);
799 for (
int i = 0; i <
ui->entries->count(); ++i) {
800 SendCoinsEntry* e = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
801 if (e && !e->isHidden() && e != entry) {
816 ui->confTargetSelector ->setEnabled(
ui->radioSmartFee->isChecked());
817 ui->labelSmartFee ->setEnabled(
ui->radioSmartFee->isChecked());
818 ui->labelSmartFee2 ->setEnabled(
ui->radioSmartFee->isChecked());
819 ui->labelSmartFee3 ->setEnabled(
ui->radioSmartFee->isChecked());
820 ui->labelFeeEstimation ->setEnabled(
ui->radioSmartFee->isChecked());
821 ui->labelCustomFeeWarning ->setEnabled(
ui->radioCustomFee->isChecked());
822 ui->labelCustomPerKilobyte ->setEnabled(
ui->radioCustomFee->isChecked());
823 ui->customFee ->setEnabled(
ui->radioCustomFee->isChecked());
831 if (
ui->radioSmartFee->isChecked())
832 ui->labelFeeMinimized->setText(
ui->labelSmartFee->text());
840 if (
ui->radioCustomFee->isChecked()) {
872 ui->labelSmartFee2->show();
873 ui->labelFeeEstimation->setText(
"");
874 ui->fallbackFeeWarningLabel->setVisible(
true);
875 int lightness =
ui->fallbackFeeWarningLabel->palette().color(QPalette::WindowText).lightness();
876 QColor warning_colour(255 - (lightness / 5), 176 - (lightness / 3), 48 - (lightness / 14));
877 ui->fallbackFeeWarningLabel->setStyleSheet(
"QLabel { color: " + warning_colour.name() +
"; }");
878 ui->fallbackFeeWarningLabel->setIndent(
GUIUtil::TextWidth(QFontMetrics(
ui->fallbackFeeWarningLabel->font()),
"x"));
882 ui->labelSmartFee2->hide();
883 ui->labelFeeEstimation->setText(tr(
"Estimated to begin confirmation within %n block(s).",
"", returned_target));
884 ui->fallbackFeeWarningLabel->setVisible(
false);
929 ui->frameCoinControl->setVisible(checked);
931 if (!checked &&
model) {
949 if (state == Qt::Unchecked)
952 ui->labelCoinControlChangeLabel->clear();
958 ui->lineEditCoinControlChange->setEnabled((state == Qt::Checked));
968 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:red;}");
974 ui->labelCoinControlChangeLabel->setText(
"");
978 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Invalid Bitcoin address"));
983 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Unknown change address"));
986 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?"),
987 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
989 if(btnRetVal == QMessageBox::Yes)
993 ui->lineEditCoinControlChange->setText(
"");
994 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
995 ui->labelCoinControlChangeLabel->setText(
"");
1000 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
1004 if (!associatedLabel.isEmpty())
1005 ui->labelCoinControlChangeLabel->setText(associatedLabel);
1007 ui->labelCoinControlChangeLabel->setText(tr(
"(no label)"));
1027 for(
int i = 0; i <
ui->entries->count(); ++i)
1029 SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(
ui->entries->itemAt(i)->widget());
1030 if(entry && !entry->isHidden())
1045 ui->labelCoinControlAutomaticallySelected->hide();
1046 ui->widgetCoinControl->show();
1051 ui->labelCoinControlAutomaticallySelected->show();
1052 ui->widgetCoinControl->hide();
1053 ui->labelCoinControlInsuffFunds->hide();
1058 : QMessageBox(parent), secDelay(_secDelay), m_enable_send(enable_send)
1060 setIcon(QMessageBox::Question);
1061 setWindowTitle(title);
1063 setInformativeText(informative_text);
1064 setDetailedText(detailed_text);
1065 setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
1066 if (always_show_unsigned || !enable_send) addButton(QMessageBox::Save);
1067 setDefaultButton(QMessageBox::Cancel);
1081 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 coinControlChangeChecked(int)
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)
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 by 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(Span< const unsigned char > input)
SynchronizationState
Current sync state passed to tip changed callbacks.