5 #include <bitcoin-build-config.h> 8 #include <qt/forms/ui_sendcoinsdialog.h> 19 #include <chainparams.h> 25 #include <txmempool.h> 26 #include <validation.h> 36 #include <QFontMetrics> 39 #include <QTextDocument> 44 static constexpr std::array
confTargets{2, 4, 6, 12, 24, 48, 144, 504, 1008};
46 if (index+1 > static_cast<int>(
confTargets.size())) {
55 for (
unsigned int i = 0; i <
confTargets.size(); i++) {
67 platformStyle(_platformStyle)
72 ui->addButton->setIcon(QIcon());
73 ui->clearButton->setIcon(QIcon());
74 ui->sendButton->setIcon(QIcon());
90 #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) 98 QAction *clipboardQuantityAction =
new QAction(tr(
"Copy quantity"),
this);
99 QAction *clipboardAmountAction =
new QAction(tr(
"Copy amount"),
this);
100 QAction *clipboardFeeAction =
new QAction(tr(
"Copy fee"),
this);
101 QAction *clipboardAfterFeeAction =
new QAction(tr(
"Copy after fee"),
this);
102 QAction *clipboardBytesAction =
new QAction(tr(
"Copy bytes"),
this);
103 QAction *clipboardChangeAction =
new QAction(tr(
"Copy change"),
this);
110 ui->labelCoinControlQuantity->addAction(clipboardQuantityAction);
111 ui->labelCoinControlAmount->addAction(clipboardAmountAction);
112 ui->labelCoinControlFee->addAction(clipboardFeeAction);
113 ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
114 ui->labelCoinControlBytes->addAction(clipboardBytesAction);
115 ui->labelCoinControlChange->addAction(clipboardChangeAction);
119 if (!settings.contains(
"fFeeSectionMinimized"))
120 settings.setValue(
"fFeeSectionMinimized",
true);
121 if (!settings.contains(
"nFeeRadio") && settings.contains(
"nTransactionFee") && settings.value(
"nTransactionFee").toLongLong() > 0)
122 settings.setValue(
"nFeeRadio", 1);
123 if (!settings.contains(
"nFeeRadio"))
124 settings.setValue(
"nFeeRadio", 0);
125 if (!settings.contains(
"nSmartFeeSliderPosition"))
126 settings.setValue(
"nSmartFeeSliderPosition", 0);
127 ui->groupFee->setId(
ui->radioSmartFee, 0);
128 ui->groupFee->setId(
ui->radioCustomFee, 1);
129 ui->groupFee->button((
int)std::max(0, std::min(1, settings.value(
"nFeeRadio").toInt())))->setChecked(
true);
130 ui->customFee->SetAllowEmpty(
false);
131 ui->customFee->setValue(settings.value(
"nTransactionFee").toLongLong());
148 this->
model = _model;
152 for(
int i = 0; i <
ui->entries->count(); ++i)
182 #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) 190 ui->customFee->SetMinValue(requiredFee);
191 if (
ui->customFee->value() < requiredFee) {
192 ui->customFee->setValue(requiredFee);
194 ui->customFee->setSingleStep(requiredFee);
199 ui->optInRBF->setCheckState(Qt::Checked);
203 ui->sendButton->setText(tr(
"Sign on device"));
205 ui->sendButton->setEnabled(
true);
206 ui->sendButton->setToolTip(tr(
"Connect your hardware wallet first."));
208 ui->sendButton->setEnabled(
false);
210 ui->sendButton->setToolTip(tr(
"Set external signer script path in Options -> Wallet"));
213 ui->sendButton->setText(tr(
"Cr&eate Unsigned"));
214 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));
219 if (settings.value(
"nSmartFeeSliderPosition").toInt() != 0) {
222 int nConfirmTarget = 25 - settings.value(
"nSmartFeeSliderPosition").toInt();
223 settings.setValue(
"nConfTarget", nConfirmTarget);
224 settings.remove(
"nSmartFeeSliderPosition");
226 if (settings.value(
"nConfTarget").toInt() == 0)
237 settings.setValue(
"nFeeRadio",
ui->groupFee->checkedId());
239 settings.setValue(
"nTransactionFee", (qint64)
ui->customFee->value());
246 QList<SendCoinsRecipient> recipients;
249 for(
int i = 0; i <
ui->entries->count(); ++i)
256 recipients.append(entry->
getValue());
260 ui->scrollArea->ensureWidgetVisible(entry);
266 if(!valid || recipients.isEmpty())
300 QStringList formatted;
310 QString address = rcp.address;
312 QString recipientElement;
315 if(rcp.label.length() > 0)
318 recipientElement.append(QString(
" (%1)").arg(address));
322 recipientElement.append(tr(
"%1 to %2").arg(amount, address));
325 formatted.append(recipientElement);
330 question_string.append(tr(
"Do you want to create this transaction?"));
331 question_string.append(
"<br /><span style='font-size:10pt;'>");
336 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));
341 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));
344 question_string.append(tr(
"Please, review your transaction."));
346 question_string.append(
"</span>%1");
351 question_string.append(
"<hr /><b>");
352 question_string.append(tr(
"Transaction fee"));
353 question_string.append(
"</b>");
357 question_string.append(
" (" + tr(
"%1 kvB",
"PSBT transaction creation").arg((
double)
m_current_transaction->getTransactionSize() / 1000, 0,
'g', 3) +
"): ");
360 question_string.append(
"<span style='color:#aa0000; font-weight:bold;'>");
362 question_string.append(
"</span><br />");
365 question_string.append(
"<span style='font-size:10pt; font-weight:normal;'>");
366 if (
ui->optInRBF->isChecked()) {
367 question_string.append(tr(
"You can increase the fee later (signals Replace-By-Fee, BIP-125)."));
369 question_string.append(tr(
"Not signalling Replace-By-Fee, BIP-125."));
371 question_string.append(
"</span>");
375 question_string.append(
"<hr />");
377 QStringList alternativeUnits;
382 question_string.append(QString(
"<b>%1</b>: <b>%2</b>").arg(tr(
"Total Amount"))
384 question_string.append(QString(
"<br /><span style='font-size:10pt; font-weight:normal;'>(=%1)</span>")
385 .arg(alternativeUnits.join(
" " + tr(
"or") +
" ")));
387 if (formatted.size() > 1) {
388 question_string = question_string.arg(
"");
389 informative_text = tr(
"To review recipient list click \"Show Details…\"");
390 detailed_text = formatted.join(
"\n\n");
392 question_string = question_string.arg(
"<br /><br />" + formatted.at(0));
404 QMessageBox msgBox(
this);
406 msgBox.setText(tr(
"Unsigned Transaction",
"PSBT copied"));
407 msgBox.setInformativeText(tr(
"The PSBT has been copied to the clipboard. You can also save it."));
408 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
409 msgBox.setDefaultButton(QMessageBox::Discard);
410 msgBox.setObjectName(
"psbt_copied_message");
411 switch (msgBox.exec()) {
412 case QMessageBox::Save: {
413 QString selectedFilter;
414 QString fileNameSuggestion =
"";
418 fileNameSuggestion.append(
" - ");
420 QString labelOrAddress = rcp.label.isEmpty() ? rcp.address : rcp.label;
422 fileNameSuggestion.append(labelOrAddress +
"-" + amount);
425 fileNameSuggestion.append(
".psbt");
427 tr(
"Save Transaction Data"), fileNameSuggestion,
429 tr(
"Partially Signed Transaction (Binary)") + QLatin1String(
" (*.psbt)"), &selectedFilter);
430 if (filename.isEmpty()) {
440 case QMessageBox::Discard:
448 std::optional<PSBTError> err;
451 }
catch (
const std::runtime_error& e) {
452 QMessageBox::critical(
nullptr, tr(
"Sign failed"), e.what());
455 if (err == PSBTError::EXTERNAL_SIGNER_NOT_FOUND) {
457 const QString
msg = tr(
"External signer not found");
458 QMessageBox::critical(
nullptr,
msg,
msg);
461 if (err == PSBTError::EXTERNAL_SIGNER_FAILED) {
463 const QString
msg = tr(
"External signer failure");
464 QMessageBox::critical(
nullptr,
msg,
msg);
468 qWarning() <<
"Failed to sign PSBT";
482 QString question_string, informative_text, detailed_text;
483 if (!
PrepareSendText(question_string, informative_text, detailed_text))
return;
486 const QString confirmation = tr(
"Confirm send coins");
490 confirmationDialog->setAttribute(Qt::WA_DeleteOnClose);
492 const auto retval =
static_cast<QMessageBox::StandardButton
>(confirmationDialog->exec());
494 if(retval != QMessageBox::Yes && retval != QMessageBox::Save)
500 bool send_failure =
false;
501 if (retval == QMessageBox::Save) {
505 bool complete =
false;
507 const auto err{
model->
wallet().
fillPSBT(std::nullopt,
false,
true,
nullptr, psbtx, complete)};
516 bool broadcast =
true;
520 bool complete =
false;
523 const auto err{
model->
wallet().
fillPSBT(std::nullopt,
false,
true,
nullptr, psbtx, complete)};
528 broadcast = complete && !send_failure;
565 ui->checkBoxCoinControlChange->setChecked(
false);
566 ui->lineEditCoinControlChange->clear();
570 while(
ui->entries->count())
572 ui->entries->takeAt(0)->widget()->deleteLater();
593 ui->entries->addWidget(entry);
602 ui->scrollAreaWidgetContents->resize(
ui->scrollAreaWidgetContents->sizeHint());
607 QMetaObject::invokeMethod(
ui->scrollArea, [
this] {
608 if (ui->scrollArea->verticalScrollBar()) {
609 ui->scrollArea->verticalScrollBar()->setValue(ui->scrollArea->verticalScrollBar()->maximum());
611 }, Qt::QueuedConnection);
613 updateTabsAndLabels();
628 if (
ui->entries->count() == 1)
631 entry->deleteLater();
638 for(
int i = 0; i <
ui->entries->count(); ++i)
646 QWidget::setTabOrder(prev,
ui->sendButton);
647 QWidget::setTabOrder(
ui->sendButton,
ui->clearButton);
648 QWidget::setTabOrder(
ui->clearButton,
ui->addButton);
649 return ui->addButton;
656 if(
ui->entries->count() == 1)
679 if(
ui->entries->count() == 1)
710 ui->labelBalanceName->setText(tr(
"External balance:"));
725 QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
731 switch(sendCoinsReturn.
status)
734 msgParams.first = tr(
"The recipient address is not valid. Please recheck.");
737 msgParams.first = tr(
"The amount to pay must be larger than 0.");
740 msgParams.first = tr(
"The amount exceeds your balance.");
743 msgParams.first = tr(
"Duplicate address found: addresses should only be used once each.");
746 msgParams.first = tr(
"Transaction creation failed!");
758 Q_EMIT
message(tr(
"Send Coins"), msgParams.first, msgParams.second);
763 ui->labelFeeMinimized->setVisible(fMinimize);
764 ui->buttonChooseFee ->setVisible(fMinimize);
765 ui->buttonMinimizeFee->setVisible(!fMinimize);
766 ui->frameFeeSelection->setVisible(!fMinimize);
767 ui->horizontalLayoutSmartFee->setContentsMargins(0, (fMinimize ? 0 : 6), 0, 0);
791 for (
int i = 0; i <
ui->entries->count(); ++i) {
793 if (e && !e->isHidden() && e != entry) {
808 ui->confTargetSelector ->setEnabled(
ui->radioSmartFee->isChecked());
809 ui->labelSmartFee ->setEnabled(
ui->radioSmartFee->isChecked());
810 ui->labelSmartFee2 ->setEnabled(
ui->radioSmartFee->isChecked());
811 ui->labelSmartFee3 ->setEnabled(
ui->radioSmartFee->isChecked());
812 ui->labelFeeEstimation ->setEnabled(
ui->radioSmartFee->isChecked());
813 ui->labelCustomFeeWarning ->setEnabled(
ui->radioCustomFee->isChecked());
814 ui->labelCustomPerKilobyte ->setEnabled(
ui->radioCustomFee->isChecked());
815 ui->customFee ->setEnabled(
ui->radioCustomFee->isChecked());
823 if (
ui->radioSmartFee->isChecked())
824 ui->labelFeeMinimized->setText(
ui->labelSmartFee->text());
832 if (
ui->radioCustomFee->isChecked()) {
866 ui->labelSmartFee2->show();
867 ui->labelFeeEstimation->setText(
"");
868 ui->fallbackFeeWarningLabel->setVisible(
true);
869 int lightness =
ui->fallbackFeeWarningLabel->palette().color(QPalette::WindowText).lightness();
870 QColor warning_colour(255 - (lightness / 5), 176 - (lightness / 3), 48 - (lightness / 14));
871 ui->fallbackFeeWarningLabel->setStyleSheet(
"QLabel { color: " + warning_colour.name() +
"; }");
872 ui->fallbackFeeWarningLabel->setIndent(
GUIUtil::TextWidth(QFontMetrics(
ui->fallbackFeeWarningLabel->font()),
"x"));
876 ui->labelSmartFee2->hide();
877 ui->labelFeeEstimation->setText(tr(
"Estimated to begin confirmation within %n block(s).",
"", returned_target));
878 ui->fallbackFeeWarningLabel->setVisible(
false);
923 ui->frameCoinControl->setVisible(checked);
925 if (!checked &&
model) {
941 #if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) 947 if (state == Qt::Unchecked)
950 ui->labelCoinControlChangeLabel->clear();
954 coinControlChangeEdited(ui->lineEditCoinControlChange->text());
956 ui->lineEditCoinControlChange->setEnabled((state == Qt::Checked));
966 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:red;}");
972 ui->labelCoinControlChangeLabel->setText(
"");
976 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Invalid Bitcoin address"));
981 ui->labelCoinControlChangeLabel->setText(tr(
"Warning: Unknown change address"));
984 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?"),
985 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
987 if(btnRetVal == QMessageBox::Yes)
991 ui->lineEditCoinControlChange->setText(
"");
992 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
993 ui->labelCoinControlChangeLabel->setText(
"");
998 ui->labelCoinControlChangeLabel->setStyleSheet(
"QLabel{color:black;}");
1002 if (!associatedLabel.isEmpty())
1003 ui->labelCoinControlChangeLabel->setText(associatedLabel);
1005 ui->labelCoinControlChangeLabel->setText(tr(
"(no label)"));
1025 for(
int i = 0; i <
ui->entries->count(); ++i)
1028 if(entry && !entry->isHidden())
1043 ui->labelCoinControlAutomaticallySelected->hide();
1044 ui->widgetCoinControl->show();
1049 ui->labelCoinControlAutomaticallySelected->show();
1050 ui->widgetCoinControl->hide();
1051 ui->labelCoinControlInsuffFunds->hide();
1056 : QMessageBox(parent), secDelay(_secDelay), m_enable_send(enable_send)
1058 setIcon(QMessageBox::Question);
1059 setWindowTitle(title);
1061 setInformativeText(informative_text);
1062 setDetailedText(detailed_text);
1063 setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
1064 if (always_show_unsigned || !enable_send) addButton(QMessageBox::Save);
1065 setDefaultButton(QMessageBox::Cancel);
1079 return QMessageBox::exec();
std::shared_ptr< const CTransaction > CTransactionRef
virtual bool privateKeysDisabled()=0
bool signWithExternalSigner(PartiallySignedTransaction &psbt, CMutableTransaction &mtx, bool &complete)
void removeEntry(SendCoinsEntry *entry)
Predefined combinations for certain default usage cases.
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
OptionsModel * getOptionsModel() const
interfaces::Wallet & wallet() const
void setValue(const SendCoinsRecipient &value)
Utility functions used by the Bitcoin Qt UI.
SynchronizationState
Current sync state passed to tip changed callbacks.
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const wallet::CCoinControl &coinControl)
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
void presentPSBT(PartiallySignedTransaction &psbt)
void sendButtonClicked(bool checked)
void updateFeeMinimizedLabel()
void on_buttonChooseFee_clicked()
SendCoinsRecipient getValue()
bool hasSigner()
Whether -signer was set or not.
int TextWidth(const QFontMetrics &fm, const QString &text)
Returns the distance in pixels appropriate for drawing a subsequent character after text...
UnlockContext requestUnlock()
void coinControlClipboardQuantity()
void coinControlClipboardAfterFee()
void setAddress(const QString &address)
interfaces::WalletBalances getCachedBalance() const
virtual CAmount getDefaultMaxTxFee()=0
Get max tx fee.
#define SEND_CONFIRM_DELAY
virtual std::optional< common::PSBTError > fillPSBT(std::optional< int > sighash_type, bool sign, bool bip32derivs, size_t *n_signed, PartiallySignedTransaction &psbtx, bool &complete)=0
Fill PSBT.
BitcoinUnit getDisplayUnit() const
void coinControlFeaturesChanged(bool)
QString HtmlEscape(const QString &str, bool fMultiLine)
bool handlePaymentRequest(const SendCoinsRecipient &recipient)
A version of CTransaction with the PSBT format.
std::string EncodeBase64(std::span< const unsigned char > input)
void ShowModalDialogAsynchronously(QDialog *dialog)
Shows a QDialog instance asynchronously, and deletes it on close.
static constexpr std::array confTargets
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized...
virtual bool isSpendable(const CTxDestination &dest)=0
Return whether wallet has private key.
A single entry in the dialog for sending bitcoins.
bool HasSelected() const
Returns true if there are pre-selected inputs.
static QString formatWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as string (with unit)
constexpr auto dialog_flags
void coinControlFeatureChanged(bool)
virtual bool hasExternalSigner()=0
std::unique_ptr< wallet::CCoinControl > m_coin_control
QWidget * setupTabChain(QWidget *prev)
Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://...
std::unique_ptr< WalletModelTransaction > m_current_transaction
int64_t CAmount
Amount in satoshis (Can be negative)
static QList< CAmount > payAmounts
QWidget * setupTabChain(QWidget *prev)
Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://...
SendCoinsEntry * addEntry()
bool validate(interfaces::Node &node)
void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
void displayUnitChanged(BitcoinUnit unit)
void setBalance(const interfaces::WalletBalances &balances)
void setAddress(const QString &address)
void coinControlClipboardChange()
Collection of wallet balances.
void useAvailableBalance(SendCoinsEntry *entry)
void setClientModel(ClientModel *clientModel)
void setClipboard(const QString &str)
ClientModel * clientModel
void updateCoinControlState()
Double ended buffer combining vector and stream-like interfaces.
void numBlocksChanged(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType header, SynchronizationState sync_state)
void coinsSent(const Txid &txid)
QString labelForAddress(const QString &address) const
Look up label for address in address book, if not found return empty string.
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.html#connect-3), that guaranties that all exceptions are handled within the slot.
Dialog for sending bitcoins.
void coinControlChangeEdited(const QString &)
QString getWalletName() const
bool getEnablePSBTControls() const
interfaces::Node & node() const
void removeEntry(SendCoinsEntry *entry)
Model for Bitcoin network client.
void coinControlUpdateLabels()
bool isMultiwallet() const
void setModel(WalletModel *model)
int getConfTargetForIndex(int index)
SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent=nullptr)
void coinControlChangeChecked(Qt::CheckState)
bool getCoinControlFeatures() const
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)
static CTransactionRef MakeTransactionRef(Tx &&txIn)
void checkSubtractFeeFromAmount()
bool isClear()
Return whether the entry is still empty and unedited.
void minimizeFeeSection(bool fMinimize)
void updateFeeSectionControls()
void subtractFeeFromAmountChanged()
static bool fSubtractFeeFromAmount
void updateSmartFeeLabel()
bool PrepareSendText(QString &question_string, QString &informative_text, QString &detailed_text)
static void updateLabels(wallet::CCoinControl &m_coin_control, WalletModel *, QDialog *)
QString confirmButtonText
int getIndexForConfTarget(int target)
void updateTabsAndLabels()
const CChainParams & Params()
Return the currently selected parameters.
Interface to Bitcoin wallet from Qt view code.
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 ...
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
void setAmount(const CAmount &amount)
void setModel(WalletModel *model)
bool m_allow_other_inputs
If true, the selection process can add extra unselected inputs from the wallet while requires all sel...
void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg=QString())
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac...
void coinControlClipboardBytes()
void useAvailableBalance(SendCoinsEntry *entry)
A mutable version of CTransaction.
virtual unsigned int getConfirmTarget()=0
Get tx confirm target.
AddressTableModel * getAddressTableModel() const
CAmount getAvailableBalance(const wallet::CCoinControl *control)
static QString formatHtmlWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as HTML string (with unit)
bool fSubtractFeeFromAmount
const PlatformStyle * platformStyle
QString formatNiceTimeOffset(qint64 secs)
void coinControlClipboardAmount()
void sendCoins(WalletModelTransaction &transaction)
void on_buttonMinimizeFee_clicked()
QString m_psbt_button_text
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
is a home for public enum and struct type definitions that are used internally by node code...
void pasteEntry(const SendCoinsRecipient &rv)
QAbstractButton * yesButton
virtual CAmount getRequiredFee(unsigned int tx_bytes)=0
Get required fee.
void message(const QString &title, const QString &message, unsigned int style)
QAbstractButton * m_psbt_button
bool fNewRecipientAllowed
virtual CAmount getMinimumFee(unsigned int tx_bytes, const wallet::CCoinControl &coin_control, int *returned_target, FeeReason *reason)=0
Get minimum fee.
CAmount GetFeePerK() const
Return the fee in satoshis for a vsize of 1000 vbytes.
void balanceChanged(const interfaces::WalletBalances &balances)
void coinControlButtonClicked()
void coinControlClipboardFee()
void updateNumberOfBlocks(int count, const QDateTime &blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state)