Anoncoin  0.9.4
P2P Digital Currency
sendcoinsdialog.cpp
Go to the documentation of this file.
1 // Copyright (c) 2011-2014 The Bitcoin developers
2 // Copyright (c) 2013-2014 The Anoncoin Core developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include "sendcoinsdialog.h"
7 #include "ui_sendcoinsdialog.h"
8 
9 #include "addresstablemodel.h"
10 #include "anoncoinunits.h"
11 #include "coincontroldialog.h"
12 #include "guiutil.h"
13 #include "optionsmodel.h"
14 #include "sendcoinsentry.h"
15 #include "walletmodel.h"
16 
17 #include "base58.h"
18 #include "coincontrol.h"
19 #include "ui_interface.h"
20 
21 #include <QMessageBox>
22 #include <QScrollBar>
23 #include <QTextDocument>
24 
26  QDialog(parent),
27  ui(new Ui::SendCoinsDialog),
28  model(0)
29 {
30  ui->setupUi(this);
31 
32 #ifdef Q_OS_MAC // Icons on push buttons are very uncommon on Mac
33  ui->addButton->setIcon(QIcon());
34  ui->clearButton->setIcon(QIcon());
35  ui->sendButton->setIcon(QIcon());
36 #endif
37 
39 
40  addEntry();
41 
42  connect(ui->addButton, SIGNAL(clicked()), this, SLOT(addEntry()));
43  connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
44 
45  // Coin Control
46  connect(ui->pushButtonCoinControl, SIGNAL(clicked()), this, SLOT(coinControlButtonClicked()));
47  connect(ui->checkBoxCoinControlChange, SIGNAL(stateChanged(int)), this, SLOT(coinControlChangeChecked(int)));
48  connect(ui->lineEditCoinControlChange, SIGNAL(textEdited(const QString &)), this, SLOT(coinControlChangeEdited(const QString &)));
49 
50  // Coin Control: clipboard actions
51  QAction *clipboardQuantityAction = new QAction(tr("Copy quantity"), this);
52  QAction *clipboardAmountAction = new QAction(tr("Copy amount"), this);
53  QAction *clipboardFeeAction = new QAction(tr("Copy fee"), this);
54  QAction *clipboardAfterFeeAction = new QAction(tr("Copy after fee"), this);
55  QAction *clipboardBytesAction = new QAction(tr("Copy bytes"), this);
56  QAction *clipboardPriorityAction = new QAction(tr("Copy priority"), this);
57  QAction *clipboardLowOutputAction = new QAction(tr("Copy low output"), this);
58  QAction *clipboardChangeAction = new QAction(tr("Copy change"), this);
59  connect(clipboardQuantityAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardQuantity()));
60  connect(clipboardAmountAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardAmount()));
61  connect(clipboardFeeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardFee()));
62  connect(clipboardAfterFeeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardAfterFee()));
63  connect(clipboardBytesAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardBytes()));
64  connect(clipboardPriorityAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardPriority()));
65  connect(clipboardLowOutputAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardLowOutput()));
66  connect(clipboardChangeAction, SIGNAL(triggered()), this, SLOT(coinControlClipboardChange()));
67  ui->labelCoinControlQuantity->addAction(clipboardQuantityAction);
68  ui->labelCoinControlAmount->addAction(clipboardAmountAction);
69  ui->labelCoinControlFee->addAction(clipboardFeeAction);
70  ui->labelCoinControlAfterFee->addAction(clipboardAfterFeeAction);
71  ui->labelCoinControlBytes->addAction(clipboardBytesAction);
72  ui->labelCoinControlPriority->addAction(clipboardPriorityAction);
73  ui->labelCoinControlLowOutput->addAction(clipboardLowOutputAction);
74  ui->labelCoinControlChange->addAction(clipboardChangeAction);
75 
76  fNewRecipientAllowed = true;
77 }
78 
80 {
81  this->model = model;
82 
83  if(model && model->getOptionsModel())
84  {
85  for(int i = 0; i < ui->entries->count(); ++i)
86  {
87  SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
88  if(entry)
89  {
90  entry->setModel(model);
91  }
92  }
93 
96  connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64, qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64, qint64, qint64, qint64)));
97  connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
98 
99  // Coin Control
100  connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(coinControlUpdateLabels()));
101  connect(model->getOptionsModel(), SIGNAL(coinControlFeaturesChanged(bool)), this, SLOT(coinControlFeatureChanged(bool)));
102  connect(model->getOptionsModel(), SIGNAL(transactionFeeChanged(qint64)), this, SLOT(coinControlUpdateLabels()));
103  ui->frameCoinControl->setVisible(model->getOptionsModel()->getCoinControlFeatures());
105  }
106 }
107 
109 {
110  delete ui;
111 }
112 
114 {
115  if(!model || !model->getOptionsModel())
116  return;
117 
118  QList<SendCoinsRecipient> recipients;
119  bool valid = true;
120 
121  for(int i = 0; i < ui->entries->count(); ++i)
122  {
123  SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
124  if(entry)
125  {
126  if(entry->validate())
127  {
128  recipients.append(entry->getValue());
129  }
130  else
131  {
132  valid = false;
133  }
134  }
135  }
136 
137  if(!valid || recipients.isEmpty())
138  {
139  return;
140  }
141 
142  // Format confirmation message
143  QStringList formatted;
144  foreach(const SendCoinsRecipient &rcp, recipients)
145  {
146  // generate bold amount string
147  QString amount = "<b>" + AnoncoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), rcp.amount);
148  amount.append("</b>");
149  // generate monospace address string
150  QString address = "<span style='font-family: monospace;'>" + rcp.address;
151  address.append("</span>");
152 
153  QString recipientElement;
154 
155  if (!rcp.paymentRequest.IsInitialized()) // normal payment
156  {
157  if(rcp.label.length() > 0) // label with address
158  {
159  recipientElement = tr("%1 to %2").arg(amount, GUIUtil::HtmlEscape(rcp.label));
160  recipientElement.append(QString(" (%1)").arg(address));
161  }
162  else // just address
163  {
164  recipientElement = tr("%1 to %2").arg(amount, address);
165  }
166  }
167  else if(!rcp.authenticatedMerchant.isEmpty()) // secure payment request
168  {
169  recipientElement = tr("%1 to %2").arg(amount, GUIUtil::HtmlEscape(rcp.authenticatedMerchant));
170  }
171  else // insecure payment request
172  {
173  recipientElement = tr("%1 to %2").arg(amount, address);
174  }
175 
176  formatted.append(recipientElement);
177  }
178 
179  fNewRecipientAllowed = false;
180 
181 
183  if(!ctx.isValid())
184  {
185  // Unlock wallet was cancelled
186  fNewRecipientAllowed = true;
187  return;
188  }
189 
190  // prepare transaction for getting txFee earlier
191  WalletModelTransaction currentTransaction(recipients);
192  WalletModel::SendCoinsReturn prepareStatus;
193  if (model->getOptionsModel()->getCoinControlFeatures()) // coin control enabled
194  prepareStatus = model->prepareTransaction(currentTransaction, CoinControlDialog::coinControl);
195  else
196  prepareStatus = model->prepareTransaction(currentTransaction);
197 
198  // process prepareStatus and on error generate message shown to user
199  processSendCoinsReturn(prepareStatus,
201 
202  if(prepareStatus.status != WalletModel::OK) {
203  fNewRecipientAllowed = true;
204  return;
205  }
206 
207  qint64 txFee = currentTransaction.getTransactionFee();
208  QString questionString = tr("Are you sure you want to send?");
209  questionString.append("<br /><br />%1");
210 
211  if(txFee > 0)
212  {
213  // append fee string if a fee is required
214  questionString.append("<hr /><span style='color:#aa0000;'>");
215  questionString.append(AnoncoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), txFee));
216  questionString.append("</span> ");
217  questionString.append(tr("added as transaction fee"));
218  }
219 
220  // add total amount in all subdivision units
221  questionString.append("<hr />");
222  qint64 totalAmount = currentTransaction.getTotalTransactionAmount() + txFee;
223  QStringList alternativeUnits;
225  {
226  if(u != model->getOptionsModel()->getDisplayUnit())
227  alternativeUnits.append(AnoncoinUnits::formatWithUnit(u, totalAmount));
228  }
229  questionString.append(tr("Total Amount %1 (= %2)")
231  .arg(alternativeUnits.join(" " + tr("or") + " ")));
232 
233  QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm send coins"),
234  questionString.arg(formatted.join("<br />")),
235  QMessageBox::Yes | QMessageBox::Cancel,
236  QMessageBox::Cancel);
237 
238  if(retval != QMessageBox::Yes)
239  {
240  fNewRecipientAllowed = true;
241  return;
242  }
243 
244  // now send the prepared transaction
245  WalletModel::SendCoinsReturn sendStatus = model->sendCoins(currentTransaction);
246  // process sendStatus and on error generate message shown to user
247  processSendCoinsReturn(sendStatus);
248 
249  if (sendStatus.status == WalletModel::OK)
250  {
251  accept();
254  }
255  fNewRecipientAllowed = true;
256 }
257 
259 {
260  // Remove entries until only one left
261  while(ui->entries->count())
262  {
263  ui->entries->takeAt(0)->widget()->deleteLater();
264  }
265  addEntry();
266 
268 }
269 
271 {
272  clear();
273 }
274 
276 {
277  clear();
278 }
279 
281 {
282  SendCoinsEntry *entry = new SendCoinsEntry(this);
283  entry->setModel(model);
284  ui->entries->addWidget(entry);
285  connect(entry, SIGNAL(removeEntry(SendCoinsEntry*)), this, SLOT(removeEntry(SendCoinsEntry*)));
286  connect(entry, SIGNAL(payAmountChanged()), this, SLOT(coinControlUpdateLabels()));
287 
289 
290  // Focus the field, so that entry can start immediately
291  entry->clear();
292  entry->setFocus();
294  qApp->processEvents();
295  QScrollBar* bar = ui->scrollArea->verticalScrollBar();
296  if(bar)
297  bar->setSliderPosition(bar->maximum());
298  return entry;
299 }
300 
302 {
303  setupTabChain(0);
305 }
306 
308 {
309  entry->hide();
310 
311  // If the last entry is about to be removed add an empty one
312  if (ui->entries->count() == 1)
313  addEntry();
314 
315  entry->deleteLater();
316 
318 }
319 
320 QWidget *SendCoinsDialog::setupTabChain(QWidget *prev)
321 {
322  for(int i = 0; i < ui->entries->count(); ++i)
323  {
324  SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
325  if(entry)
326  {
327  prev = entry->setupTabChain(prev);
328  }
329  }
330  QWidget::setTabOrder(prev, ui->sendButton);
331  QWidget::setTabOrder(ui->sendButton, ui->clearButton);
332  QWidget::setTabOrder(ui->clearButton, ui->addButton);
333  return ui->addButton;
334 }
335 
336 void SendCoinsDialog::setAddress(const QString &address)
337 {
338  SendCoinsEntry *entry = 0;
339  // Replace the first entry if it is still unused
340  if(ui->entries->count() == 1)
341  {
342  SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(0)->widget());
343  if(first->isClear())
344  {
345  entry = first;
346  }
347  }
348  if(!entry)
349  {
350  entry = addEntry();
351  }
352 
353  entry->setAddress(address);
354 }
355 
357 {
359  return;
360 
361  SendCoinsEntry *entry = 0;
362  // Replace the first entry if it is still unused
363  if(ui->entries->count() == 1)
364  {
365  SendCoinsEntry *first = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(0)->widget());
366  if(first->isClear())
367  {
368  entry = first;
369  }
370  }
371  if(!entry)
372  {
373  entry = addEntry();
374  }
375 
376  entry->setValue(rv);
378 }
379 
381 {
382  QString strSendCoins = tr("Send Coins");
383  if (rv.paymentRequest.IsInitialized()) {
384  // Expired payment request?
385  const payments::PaymentDetails& details = rv.paymentRequest.getDetails();
386  if (details.has_expires() && (int64_t)details.expires() < GetTime())
387  {
388  emit message(strSendCoins, tr("Payment request expired"),
390  return false;
391  }
392  }
393  else {
394  CAnoncoinAddress address(rv.address.toStdString());
395  if (!address.IsValid()) {
396  emit message(strSendCoins, tr("Invalid payment address %1").arg(rv.address),
398  return false;
399  }
400  }
401 
402  pasteEntry(rv);
403  return true;
404 }
405 
406 void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance,
407  qint64 watchBalance, qint64 watchUnconfirmedBalance, qint64 watchImmatureBalance)
408 {
409  Q_UNUSED(unconfirmedBalance);
410  Q_UNUSED(immatureBalance);
411  Q_UNUSED(watchBalance);
412  Q_UNUSED(watchUnconfirmedBalance);
413  Q_UNUSED(watchImmatureBalance);
414 
415  if(model && model->getOptionsModel())
416  {
418  }
419 }
420 
422 {
423  setBalance(model->getBalance(), 0, 0, 0, 0, 0);
424 }
425 
426 void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg)
427 {
428  QPair<QString, CClientUIInterface::MessageBoxFlags> msgParams;
429  // Default to a warning message, override if error message is needed
430  msgParams.second = CClientUIInterface::MSG_WARNING;
431 
432  // This comment is specific to SendCoinsDialog usage of WalletModel::SendCoinsReturn.
433  // WalletModel::TransactionCommitFailed is used only in WalletModel::sendCoins()
434  // all others are used only in WalletModel::prepareTransaction()
435  switch(sendCoinsReturn.status)
436  {
438  msgParams.first = tr("The recipient address is not valid, please recheck.");
439  break;
441  msgParams.first = tr("The amount to pay must be larger than 0.");
442  break;
444  msgParams.first = tr("The amount exceeds your balance.");
445  break;
447  msgParams.first = tr("The total exceeds your balance when the %1 transaction fee is included.").arg(msgArg);
448  break;
450  msgParams.first = tr("Duplicate address found, can only send to each address once per send operation.");
451  break;
453  msgParams.first = tr("Transaction creation failed!");
454  msgParams.second = CClientUIInterface::MSG_ERROR;
455  break;
457  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.");
458  msgParams.second = CClientUIInterface::MSG_ERROR;
459  break;
460  // included to prevent a compiler warning.
461  case WalletModel::OK:
462  default:
463  return;
464  }
465 
466  emit message(tr("Send Coins"), msgParams.first, msgParams.second);
467 }
468 
469 // Coin Control: copy label "Quantity" to clipboard
471 {
473 }
474 
475 // Coin Control: copy label "Amount" to clipboard
477 {
478  GUIUtil::setClipboard(ui->labelCoinControlAmount->text().left(ui->labelCoinControlAmount->text().indexOf(" ")));
479 }
480 
481 // Coin Control: copy label "Fee" to clipboard
483 {
484  GUIUtil::setClipboard(ui->labelCoinControlFee->text().left(ui->labelCoinControlFee->text().indexOf(" ")));
485 }
486 
487 // Coin Control: copy label "After fee" to clipboard
489 {
490  GUIUtil::setClipboard(ui->labelCoinControlAfterFee->text().left(ui->labelCoinControlAfterFee->text().indexOf(" ")));
491 }
492 
493 // Coin Control: copy label "Bytes" to clipboard
495 {
497 }
498 
499 // Coin Control: copy label "Priority" to clipboard
501 {
503 }
504 
505 // Coin Control: copy label "Low output" to clipboard
507 {
509 }
510 
511 // Coin Control: copy label "Change" to clipboard
513 {
514  GUIUtil::setClipboard(ui->labelCoinControlChange->text().left(ui->labelCoinControlChange->text().indexOf(" ")));
515 }
516 
517 // Coin Control: settings menu - coin control enabled/disabled by user
519 {
520  ui->frameCoinControl->setVisible(checked);
521 
522  if (!checked && model) // coin control features disabled
524 
525  if (checked)
527 }
528 
529 // Coin Control: button inputs -> show actual coin control dialog
531 {
532  CoinControlDialog dlg;
533  dlg.setModel(model);
534  dlg.exec();
536 }
537 
538 // Coin Control: checkbox custom change address
540 {
541  if (state == Qt::Unchecked)
542  {
545  }
546  else
547  // use this to re-validate an already entered address
549 
550  ui->lineEditCoinControlChange->setEnabled((state == Qt::Checked));
551 }
552 
553 // Coin Control: custom change address changed
555 {
556  if (model && model->getAddressTableModel())
557  {
558  // Default to no change address until verified
560  ui->labelCoinControlChangeLabel->setStyleSheet("QLabel{color:red;}");
561 
562  CAnoncoinAddress addr = CAnoncoinAddress(text.toStdString());
563 
564  if (text.isEmpty()) // Nothing entered
565  {
566  ui->labelCoinControlChangeLabel->setText("");
567  }
568  else if (!addr.IsValid()) // Invalid address
569  {
570  ui->labelCoinControlChangeLabel->setText(tr("Warning: Invalid Anoncoin address"));
571  }
572  else // Valid address
573  {
574  CPubKey pubkey;
575  CKeyID keyid;
576  addr.GetKeyID(keyid);
577  if (!model->getPubKey(keyid, pubkey)) // Unknown change address
578  {
579  ui->labelCoinControlChangeLabel->setText(tr("Warning: Unknown change address"));
580  }
581  else // Known change address
582  {
583  ui->labelCoinControlChangeLabel->setStyleSheet("QLabel{color:black;}");
584 
585  // Query label
586  QString associatedLabel = model->getAddressTableModel()->labelForAddress(text);
587  if (!associatedLabel.isEmpty())
588  ui->labelCoinControlChangeLabel->setText(associatedLabel);
589  else
590  ui->labelCoinControlChangeLabel->setText(tr("(no label)"));
591 
593  }
594  }
595  }
596 }
597 
598 // Coin Control: update labels
600 {
602  return;
603 
604  // set pay amounts
606  for(int i = 0; i < ui->entries->count(); ++i)
607  {
608  SendCoinsEntry *entry = qobject_cast<SendCoinsEntry*>(ui->entries->itemAt(i)->widget());
609  if(entry)
611  }
612 
613  if (CoinControlDialog::coinControl->HasSelected())
614  {
615  // actual coin control calculation
617 
618  // show coin control stats
620  ui->widgetCoinControl->show();
621  }
622  else
623  {
624  // hide coin control stats
626  ui->widgetCoinControl->hide();
628  }
629 }
void removeEntry(SendCoinsEntry *entry)
static QList< Unit > availableUnits()
Get list of units, for drop-down box.
void setValue(const SendCoinsRecipient &value)
PaymentRequestPlus paymentRequest
Definition: walletmodel.h:56
bool IsInitialized() const
void coinControlClipboardPriority()
qint64 getImmatureBalance() const
Definition: walletmodel.cpp:79
static CCoinControl * coinControl
void setFocus()
QLabel * labelCoinControlPriority
SendCoinsRecipient getValue()
static QString formatWithUnit(int unit, qint64 amount, bool plussign=false)
Format as string (with unit)
Unit
Anoncoin units.
Definition: anoncoinunits.h:25
UnlockContext requestUnlock()
QPushButton * clearButton
QPushButton * sendButton
SendCoinsDialog(QWidget *parent=0)
void coinControlClipboardQuantity()
void setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance, qint64 watchOnlyBalance, qint64 watchUnconfBalance, qint64 watchImmatureBalance)
QPushButton * addButton
void coinControlClipboardAfterFee()
void setAddress(const QString &address)
QValidatedLineEdit * lineEditCoinControlChange
CTxDestination Get() const
Definition: base58.cpp:223
qint64 getWatchUnconfirmedBalance() const
Definition: walletmodel.cpp:94
inline::google::protobuf::uint64 expires() const
SendCoinsReturn sendCoins(WalletModelTransaction &transaction)
bool GetKeyID(CKeyID &keyID) const
Definition: base58.cpp:236
QString HtmlEscape(const QString &str, bool fMultiLine)
Definition: guiutil.cpp:228
bool handlePaymentRequest(const SendCoinsRecipient &recipient)
QScrollArea * scrollArea
QLabel * labelCoinControlAfterFee
AddressTableModel * getAddressTableModel()
bool validate()
QLabel * labelCoinControlQuantity
A single entry in the dialog for sending anoncoins.
bool IsValid() const
Definition: base58.cpp:216
QLabel * labelCoinControlLowOutput
QPushButton * pushButtonCoinControl
QLabel * labelCoinControlAutomaticallySelected
void coinControlFeatureChanged(bool)
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 getCoinControlFeatures()
Definition: optionsmodel.h:90
QWidget * setupTabChain(QWidget *prev)
Set up the tab chain manually, as Qt messes up the tab chain by default in some cases (issue https://...
Ui::SendCoinsDialog * ui
SendCoinsEntry * addEntry()
void clear()
void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent)
Definition: guiutil.cpp:96
qint64 getWatchImmatureBalance() const
Definition: walletmodel.cpp:99
void setAddress(const QString &address)
void coinControlClipboardChange()
void setClipboard(const QString &str)
Definition: guiutil.cpp:761
void SetNull()
Definition: coincontrol.h:22
CTxDestination destChange
Definition: coincontrol.h:15
qint64 getUnconfirmedBalance() const
Definition: walletmodel.cpp:74
An encapsulated public key.
Definition: key.h:43
bool getPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const
base58-encoded Anoncoin addresses.
Definition: base58.h:102
WalletModel * model
Dialog for sending anoncoins.
QCheckBox * checkBoxCoinControlChange
void coinControlChangeEdited(const QString &)
static void updateLabels(WalletModel *, QDialog *)
const payments::PaymentDetails & getDetails() const
int getDisplayUnit()
Definition: optionsmodel.h:87
int64_t GetTime()
Definition: util.cpp:1220
void coinControlUpdateLabels()
void UnSelectAll()
Definition: coincontrol.h:49
void setModel(WalletModel *model)
void setupUi(QDialog *SendCoinsDialog)
bool isClear()
Return whether the entry is still empty and unedited.
void coinControlClipboardLowOutput()
QLabel * labelCoinControlChangeLabel
QWidget * scrollAreaWidgetContents
void setModel(WalletModel *model)
QString labelForAddress(const QString &address) const
Interface to Anoncoin wallet from Qt view code.
Definition: walletmodel.h:97
A reference to a CKey: the Hash160 of its serialized public key.
Definition: key.h:27
qint64 getBalance(const CCoinControl *coinControl=NULL) const
Definition: walletmodel.cpp:57
void setModel(WalletModel *model)
void processSendCoinsReturn(const WalletModel::SendCoinsReturn &sendCoinsReturn, const QString &msgArg=QString())
Data model for a walletmodel transaction.
static QList< qint64 > payAmounts
SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl=NULL)
void setEnabled(bool enabled)
void coinControlClipboardBytes()
void coinControlClipboardAmount()
qint64 getWatchBalance() const
Definition: walletmodel.cpp:89
void pasteEntry(const SendCoinsRecipient &rv)
void message(const QString &title, const QString &message, unsigned int style)
QString authenticatedMerchant
Definition: walletmodel.h:58
void coinControlButtonClicked()
void coinControlClipboardFee()
OptionsModel * getOptionsModel()
QLabel * labelCoinControlInsuffFunds
void coinControlChangeChecked(int)