21 #include "validation.h" 28 #include <QMessageBox> 31 #include <QTextDocument> 38 fNewRecipientAllowed(true),
40 platformStyle(platformStyle)
50 ui->
addButton->setIcon(QIcon(
":/icons/" + theme +
"/add"));
51 ui->
clearButton->setIcon(QIcon(
":/icons/" + theme +
"/remove"));
52 ui->
sendButton->setIcon(QIcon(
":/icons/" + theme +
"/send"));
69 if (!
settings.contains(
"bUseDarkSend"))
70 settings.setValue(
"bUseDarkSend",
false);
71 if (!
settings.contains(
"bUseInstantX"))
72 settings.setValue(
"bUseInstantX",
false);
74 bool fUsePrivateSend =
settings.value(
"bUseDarkSend").toBool();
75 bool fUseInstantSend =
settings.value(
"bUseInstantX").toBool();
94 QAction *clipboardQuantityAction =
new QAction(tr(
"Copy quantity"),
this);
95 QAction *clipboardAmountAction =
new QAction(tr(
"Copy amount"),
this);
96 QAction *clipboardFeeAction =
new QAction(tr(
"Copy fee"),
this);
97 QAction *clipboardAfterFeeAction =
new QAction(tr(
"Copy after fee"),
this);
98 QAction *clipboardBytesAction =
new QAction(tr(
"Copy bytes"),
this);
99 QAction *clipboardLowOutputAction =
new QAction(tr(
"Copy dust"),
this);
100 QAction *clipboardChangeAction =
new QAction(tr(
"Copy change"),
this);
117 if (!
settings.contains(
"fFeeSectionMinimized"))
118 settings.setValue(
"fFeeSectionMinimized",
true);
119 if (!
settings.contains(
"nFeeRadio") &&
settings.contains(
"nTransactionFee") &&
settings.value(
"nTransactionFee").toLongLong() > 0)
121 if (!
settings.contains(
"nFeeRadio"))
123 if (!
settings.contains(
"nCustomFeeRadio") &&
settings.contains(
"nTransactionFee") &&
settings.value(
"nTransactionFee").toLongLong() > 0)
124 settings.setValue(
"nCustomFeeRadio", 1);
125 if (!
settings.contains(
"nCustomFeeRadio"))
126 settings.setValue(
"nCustomFeeRadio", 0);
127 if (!
settings.contains(
"nSmartFeeSliderPosition"))
128 settings.setValue(
"nSmartFeeSliderPosition", 0);
129 if (!
settings.contains(
"nTransactionFee"))
131 if (!
settings.contains(
"fPayOnlyMinFee"))
132 settings.setValue(
"fPayOnlyMinFee",
false);
133 if (!
settings.contains(
"fSendFreeTransactions"))
134 settings.setValue(
"fSendFreeTransactions",
false);
138 ui->
groupFee->button((
int)std::max(0, std::min(1,
settings.value(
"nFeeRadio").toInt())))->setChecked(
true);
141 ui->
groupCustomFee->button((
int)std::max(0, std::min(1,
settings.value(
"nCustomFeeRadio").toInt())))->setChecked(
true);
164 for(
int i = 0; i <
ui->
entries->count(); ++i)
175 connect(
model, SIGNAL(balanceChanged(
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount)),
this, SLOT(
setBalance(
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount,
CAmount)));
229 QList<SendCoinsRecipient> recipients;
232 for(
int i = 0; i <
ui->
entries->count(); ++i)
239 recipients.append(entry->
getValue());
248 if(!valid || recipients.isEmpty())
253 QString strFunds = tr(
"using") +
" <b>" + tr(
"anonymous funds") +
"</b>";
259 strFunds = tr(
"using") +
" <b>" + tr(
"anonymous funds") +
"</b>";
260 QString strNearestAmount(
264 "(privatesend requires this amount to be rounded up to the nearest %1)." 265 ).arg(strNearestAmount));
268 strFunds = tr(
"using") +
" <b>" + tr(
"any available funds (not anonymous)") +
"</b>";
272 recipients[0].fUseInstantSend =
true;
274 strFunds += tr(
"and InstantSend");
276 recipients[0].fUseInstantSend =
false;
295 send(recipients, strFee, strFunds);
299 send(recipients, strFee, strFunds);
324 QStringList formatted;
329 amount.append(
"</b> ").append(strFunds);
332 QString address =
"<span style='font-family: monospace;'>" + rcp.
address;
333 address.append(
"</span>");
335 QString recipientElement;
339 if(rcp.
label.length() > 0)
342 recipientElement.append(QString(
" (%1)").arg(address));
346 recipientElement = tr(
"%1 to %2").arg(amount, address);
355 recipientElement = tr(
"%1 to %2").arg(amount, address);
358 formatted.append(recipientElement);
361 QString questionString = tr(
"Are you sure you want to send?");
362 questionString.append(
"<br /><br />%1");
367 questionString.append(
"<hr /><span style='color:#aa0000;'>");
369 questionString.append(
"</span> ");
370 questionString.append(tr(
"are added as transaction fee"));
371 questionString.append(
" ");
372 questionString.append(strFee);
375 questionString.append(
" (" + QString::number((
double)currentTransaction.
getTransactionSize() / 1000) +
" kB)");
379 questionString.append(
"<hr />");
381 QStringList alternativeUnits;
389 questionString.append(tr(
"Total Amount = <b>%1</b><br />= %2")
391 .arg(alternativeUnits.join(
"<br />= ")));
394 int messageEntries = formatted.size();
395 int displayedEntries = 0;
396 for(
int i = 0; i < formatted.size(); i++){
398 formatted.removeLast();
402 displayedEntries = i+1;
405 questionString.append(
"<hr />");
406 questionString.append(tr(
"<b>(%1 of %2 entries displayed)</b>").arg(displayedEntries).arg(messageEntries));
409 QMessageBox::StandardButton
retval = QMessageBox::question(
this, tr(
"Confirm send coins"),
410 questionString.arg(formatted.join(
"<br />")),
411 QMessageBox::Yes | QMessageBox::Cancel,
412 QMessageBox::Cancel);
414 if(
retval != QMessageBox::Yes)
439 ui->
entries->takeAt(0)->widget()->deleteLater();
469 qApp->processEvents();
472 bar->setSliderPosition(bar->maximum());
492 entry->deleteLater();
499 for(
int i = 0; i <
ui->
entries->count(); ++i)
566 const CAmount& watchBalance,
const CAmount& watchUnconfirmedBalance,
const CAmount& watchImmatureBalance)
568 Q_UNUSED(unconfirmedBalance);
569 Q_UNUSED(immatureBalance);
570 Q_UNUSED(anonymizedBalance);
571 Q_UNUSED(watchBalance);
572 Q_UNUSED(watchUnconfirmedBalance);
573 Q_UNUSED(watchImmatureBalance);
581 bal = anonymizedBalance;
611 QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
618 switch(sendCoinsReturn.
status)
621 msgParams.first = tr(
"The recipient address is not valid. Please recheck.");
624 msgParams.first = tr(
"The amount to pay must be larger than 0.");
627 msgParams.first = tr(
"The amount exceeds your balance.");
630 msgParams.first = tr(
"The total exceeds your balance when the %1 transaction fee is included.").arg(msgArg);
633 msgParams.first = tr(
"Duplicate address found: addresses should only be used once each.");
636 msgParams.first = tr(
"Transaction creation failed!");
640 msgParams.first = tr(
"The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.");
647 msgParams.first = tr(
"Payment request expired.");
656 Q_EMIT
message(tr(
"Send Coins"), msgParams.first, msgParams.second);
752 int estimateFoundAtBlocks = nBlocksToConfirm;
766 ui->
labelFeeEstimation->setText(tr(
"Estimated to begin confirmation within %n block(s).",
"", estimateFoundAtBlocks));
819 if (!checked &&
model)
837 if (state == Qt::Unchecked)
882 if (!associatedLabel.isEmpty())
917 for(
int i = 0; i <
ui->
entries->count(); ++i)
920 if(entry && !entry->isHidden())
QLabel * labelCoinControlLowOutput
QLabel * labelCoinControlBytes
CTxDestination destChange
static QList< CAmount > payAmounts
QWidget * scrollAreaWidgetContents
QHBoxLayout * horizontalLayoutSmartFee
QLabel * labelCoinControlAutomaticallySelected
QButtonGroup * groupCustomFee
QPushButton * buttonMinimizeFee
QLabel * labelCoinControlAmount
bool getCoinControlFeatures()
void on_buttonChooseFee_clicked()
static void updateLabels(WalletModel *, QDialog *)
void setEnabled(bool fEnabled)
CAmount getTotalTransactionAmount()
void coinControlClipboardFee()
void updateTabsAndLabels()
CFeeRate estimateSmartFee(int nBlocks, int *answerFoundAtBlocks=NULL) const
void coinControlClipboardAfterFee()
QPushButton * buttonChooseFee
QList< SendCoinsRecipient > getRecipients()
ClientModel * clientModel
bool IsInitialized() const
unsigned int getTransactionSize()
QT_END_NAMESPACE const int defaultConfirmTarget
static CAmount GetSmallestDenomination()
EncryptionStatus getEncryptionStatus() const
QFrame * frameFeeSelection
void updateGlobalFeeVariables()
void on_buttonMinimizeFee_clicked()
QLabel * labelCoinControlInsuffFunds
void coinControlFeatureChanged(bool)
void coinControlButtonClicked()
void updateSmartFeeLabel()
static QString formatWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as string (with unit)
QLabel * labelMinFeeWarning
QRadioButton * radioCustomAtLeast
void updateFeeSectionControls()
void on_sendButton_clicked()
bool fSubtractFeeFromAmount
CAmount getWatchImmatureBalance() const
void coinControlUpdateLabels()
QWidget * widgetCoinControl
void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
const PlatformStyle * platformStyle
bool handlePaymentRequest(const SendCoinsRecipient &recipient)
void setValue(const SendCoinsRecipient &value)
SendCoinsRecipient getValue()
CAmount getAnonymizedBalance() const
static QString formatHtmlWithUnit(int unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=separatorStandard)
Format as HTML string (with unit)
QLabel * labelSmartFeeNormal
void coinControlClipboardChange()
unsigned int nTxConfirmTarget
bool fSendFreeTransactions
void setDisplayUnit(int unit)
QWidget * setupTabChain(QWidget *prev)
void setClipboard(const QString &str)
void setModel(WalletModel *model)
void coinControlClipboardBytes()
void message(const QString &title, const QString &message, unsigned int style)
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl=NULL)
CAmount getTransactionFee()
SendCoinsReturn sendCoins(WalletModelTransaction &transaction)
bool havePrivKey(const CKeyID &address) const
QCheckBox * checkBoxCoinControlChange
void setupUi(QDialog *SendCoinsDialog)
QString labelForAddress(const QString &address) const
QLabel * labelSmartFeeFast
void coinControlChangeChecked(int)
static secp256k1_context * ctx
CAmount nMinimumTotalFee
Minimum absolute fee (not per kilobyte)
void removeEntry(SendCoinsEntry *entry)
QRadioButton * radioCustomPerKilobyte
QCheckBox * checkUsePrivateSend
CAmount GetFeePerK() const
static CFeeRate fallbackFee
QString HtmlEscape(const QString &str, bool fMultiLine)
void setAddress(const QString &address)
bool fNewRecipientAllowed
QPushButton * pushButtonCoinControl
QLabel * labelCoinControlChangeLabel
SendCoinsEntry * addEntry()
OptionsModel * getOptionsModel()
void setModel(WalletModel *model)
void send(QList< SendCoinsRecipient > recipients, QString strFee, QString strFunds)
CAmount getWatchUnconfirmedBalance() const
QLabel * labelCoinControlQuantity
void setClientModel(ClientModel *clientModel)
void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg=QString())
QWidget * setupTabChain(QWidget *prev)
PaymentRequestPlus paymentRequest
QFrame * frameCoinControl
QCheckBox * checkUseInstantSend
static bool fSubtractFeeFromAmount
CTxDestination Get() const
void coinControlClipboardLowOutput()
void setModel(WalletModel *model)
QCheckBox * checkBoxMinimumFee
QLabel * labelFeeMinimized
void updateFeeMinimizedLabel()
QRadioButton * radioSmartFee
void setAddress(const QString &address)
QString authenticatedMerchant
void coinControlClipboardAmount()
static const int MAX_SEND_POPUP_ENTRIES
QCheckBox * checkBoxFreeTx
static CCoinControl * coinControl
QRadioButton * radioCustomFee
CFeeRate payTxFee(DEFAULT_TRANSACTION_FEE)
bool GetKeyID(CKeyID &keyID) const
SendCoinsDialog(const PlatformStyle *platformStyle, QWidget *parent=0)
CAmount getUnconfirmedBalance() const
static CAmount GetRequiredFee(unsigned int nTxBytes)
void minimizeFeeSection(bool fMinimize)
static const CAmount DEFAULT_TRANSACTION_FEE
-paytxfee default
QValidatedLineEdit * lineEditCoinControlChange
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
void coinControlClipboardQuantity()
CAmount getBalance(const CCoinControl *coinControl=NULL) const
CAmount getWatchBalance() const
BitcoinAmountField * customFee
QPushButton * clearButton
void setValue(const CAmount &value)
CAmount getImmatureBalance() const
QLabel * labelCoinControlFee
AddressTableModel * getAddressTableModel()
void coinControlChangeEdited(const QString &)
QLabel * labelCoinControlAfterFee
void setEnabled(bool enabled)
void setBalance(const CAmount &balance, const CAmount &unconfirmedBalance, const CAmount &immatureBalance, const CAmount &anonymizedBalance, const CAmount &watchOnlyBalance, const CAmount &watchUnconfBalance, const CAmount &watchImmatureBalance)
QLabel * labelCoinControlChange
QLabel * labelFeeEstimation
UnlockContext requestUnlock(bool fForMixingOnly=false)
void setSingleStep(const CAmount &step)
void pasteEntry(const SendCoinsRecipient &rv)