diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui index 6573517b2..9d45e2e91 100644 --- a/src/qt/forms/overviewpage.ui +++ b/src/qt/forms/overviewpage.ui @@ -6,7 +6,7 @@ 0 0 - 552 + 573 342 @@ -141,14 +141,14 @@ - + Number of transactions: - + Total number of transactions in wallet @@ -158,6 +158,32 @@ + + + + Immature: + + + + + + + + 75 + true + + + + Mined balance that has not yet matured + + + 0 BTC + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index d7bcc6f45..35d48581e 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -94,7 +94,9 @@ OverviewPage::OverviewPage(QWidget *parent) : ui(new Ui::OverviewPage), currentBalance(-1), currentUnconfirmedBalance(-1), - txdelegate(new TxViewDelegate()), filter(0) + currentImmatureBalance(-1), + txdelegate(new TxViewDelegate()), + filter(0) { ui->setupUi(this); @@ -125,13 +127,21 @@ OverviewPage::~OverviewPage() delete ui; } -void OverviewPage::setBalance(qint64 balance, qint64 unconfirmedBalance) +void OverviewPage::setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance) { int unit = model->getOptionsModel()->getDisplayUnit(); currentBalance = balance; currentUnconfirmedBalance = unconfirmedBalance; + currentImmatureBalance = immatureBalance; ui->labelBalance->setText(BitcoinUnits::formatWithUnit(unit, balance)); ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(unit, unconfirmedBalance)); + ui->labelImmature->setText(BitcoinUnits::formatWithUnit(unit, immatureBalance)); + + // only show immature (newly mined) balance if it's non-zero, so as not to complicate things + // for the non-mining users + bool showImmature = immatureBalance != 0; + ui->labelImmature->setVisible(showImmature); + ui->labelImmatureText->setVisible(showImmature); } void OverviewPage::setNumTransactions(int count) @@ -156,8 +166,8 @@ void OverviewPage::setModel(WalletModel *model) ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress); // Keep up to date with wallet - setBalance(model->getBalance(), model->getUnconfirmedBalance()); - connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64))); + setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance()); + connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64))); setNumTransactions(model->getNumTransactions()); connect(model, SIGNAL(numTransactionsChanged(int)), this, SLOT(setNumTransactions(int))); @@ -171,7 +181,7 @@ void OverviewPage::displayUnitChanged() if(!model || !model->getOptionsModel()) return; if(currentBalance != -1) - setBalance(currentBalance, currentUnconfirmedBalance); + setBalance(currentBalance, currentUnconfirmedBalance, currentImmatureBalance); txdelegate->unit = model->getOptionsModel()->getDisplayUnit(); ui->listTransactions->update(); diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h index 208b324fe..c7d3a4242 100644 --- a/src/qt/overviewpage.h +++ b/src/qt/overviewpage.h @@ -27,7 +27,7 @@ public: void showOutOfSyncWarning(bool fShow); public slots: - void setBalance(qint64 balance, qint64 unconfirmedBalance); + void setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance); void setNumTransactions(int count); signals: @@ -38,6 +38,7 @@ private: WalletModel *model; qint64 currentBalance; qint64 currentUnconfirmedBalance; + qint64 currentImmatureBalance; TxViewDelegate *txdelegate; TransactionFilterProxy *filter; diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index f6a3047a2..2eb228d1d 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -48,8 +48,8 @@ void SendCoinsDialog::setModel(WalletModel *model) } if(model) { - setBalance(model->getBalance(), model->getUnconfirmedBalance()); - connect(model, SIGNAL(balanceChanged(qint64, qint64)), this, SLOT(setBalance(qint64, qint64))); + setBalance(model->getBalance(), model->getUnconfirmedBalance(), model->getImmatureBalance()); + connect(model, SIGNAL(balanceChanged(qint64, qint64, qint64)), this, SLOT(setBalance(qint64, qint64, qint64))); } } @@ -277,9 +277,10 @@ void SendCoinsDialog::handleURI(const QString &uri) pasteEntry(rv); } -void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance) +void SendCoinsDialog::setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance) { Q_UNUSED(unconfirmedBalance); + Q_UNUSED(immatureBalance); if(!model || !model->getOptionsModel()) return; diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h index 5dcbfbeb6..358c8cf85 100644 --- a/src/qt/sendcoinsdialog.h +++ b/src/qt/sendcoinsdialog.h @@ -38,7 +38,7 @@ public slots: void accept(); SendCoinsEntry *addEntry(); void updateRemoveEnabled(); - void setBalance(qint64 balance, qint64 unconfirmedBalance); + void setBalance(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance); private: Ui::SendCoinsDialog *ui; diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index b89c3dba3..807dfc6bf 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -13,7 +13,8 @@ WalletModel::WalletModel(CWallet *wallet, OptionsModel *optionsModel, QObject *parent) : QObject(parent), wallet(wallet), optionsModel(optionsModel), addressTableModel(0), transactionTableModel(0), - cachedBalance(0), cachedUnconfirmedBalance(0), cachedNumTransactions(0), + cachedBalance(0), cachedUnconfirmedBalance(0), cachedImmatureBalance(0), + cachedNumTransactions(0), cachedEncryptionStatus(Unencrypted) { addressTableModel = new AddressTableModel(wallet, this); @@ -37,6 +38,11 @@ qint64 WalletModel::getUnconfirmedBalance() const return wallet->GetUnconfirmedBalance(); } +qint64 WalletModel::getImmatureBalance() const +{ + return wallet->GetImmatureBalance(); +} + int WalletModel::getNumTransactions() const { int numTransactions = 0; @@ -63,15 +69,18 @@ void WalletModel::updateTransaction(const QString &hash, int status) // Balance and number of transactions might have changed qint64 newBalance = getBalance(); qint64 newUnconfirmedBalance = getUnconfirmedBalance(); + qint64 newImmatureBalance = getImmatureBalance(); int newNumTransactions = getNumTransactions(); - if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance) - emit balanceChanged(newBalance, newUnconfirmedBalance); + if(cachedBalance != newBalance || cachedUnconfirmedBalance != newUnconfirmedBalance || cachedImmatureBalance != newImmatureBalance) + emit balanceChanged(newBalance, newUnconfirmedBalance, newImmatureBalance); + if(cachedNumTransactions != newNumTransactions) emit numTransactionsChanged(newNumTransactions); cachedBalance = newBalance; cachedUnconfirmedBalance = newUnconfirmedBalance; + cachedImmatureBalance = newImmatureBalance; cachedNumTransactions = newNumTransactions; } diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 8b615ffe8..c973c5cf5 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -52,6 +52,7 @@ public: qint64 getBalance() const; qint64 getUnconfirmedBalance() const; + qint64 getImmatureBalance() const; int getNumTransactions() const; EncryptionStatus getEncryptionStatus() const; @@ -116,6 +117,7 @@ private: // Cache some values to be able to detect changes qint64 cachedBalance; qint64 cachedUnconfirmedBalance; + qint64 cachedImmatureBalance; qint64 cachedNumTransactions; EncryptionStatus cachedEncryptionStatus; @@ -123,7 +125,7 @@ private: void unsubscribeFromCoreSignals(); signals: // Signal that balance in wallet changed - void balanceChanged(qint64 balance, qint64 unconfirmedBalance); + void balanceChanged(qint64 balance, qint64 unconfirmedBalance, qint64 immatureBalance); // Number of transactions in wallet changed void numTransactionsChanged(int count); diff --git a/src/wallet.cpp b/src/wallet.cpp index 62f663c0d..f4863080a 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -567,7 +567,7 @@ void CWalletTx::GetAmounts(int64& nGeneratedImmature, int64& nGeneratedMature, l } -void CWalletTx::GetAccountAmounts(const string& strAccount, int64& nGenerated, int64& nReceived, +void CWalletTx::GetAccountAmounts(const string& strAccount, int64& nGenerated, int64& nReceived, int64& nSent, int64& nFee) const { nGenerated = nReceived = nSent = nFee = 0; @@ -851,9 +851,8 @@ int64 CWallet::GetBalance() const for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx* pcoin = &(*it).second; - if (!pcoin->IsFinal() || !pcoin->IsConfirmed()) - continue; - nTotal += pcoin->GetAvailableCredit(); + if (pcoin->IsFinal() && pcoin->IsConfirmed()) + nTotal += pcoin->GetAvailableCredit(); } } @@ -868,9 +867,23 @@ int64 CWallet::GetUnconfirmedBalance() const for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx* pcoin = &(*it).second; - if (pcoin->IsFinal() && pcoin->IsConfirmed()) - continue; - nTotal += pcoin->GetAvailableCredit(); + if (!pcoin->IsFinal() || !pcoin->IsConfirmed()) + nTotal += pcoin->GetAvailableCredit(); + } + } + return nTotal; +} + +int64 CWallet::GetImmatureBalance() const +{ + int64 nTotal = 0; + { + LOCK(cs_wallet); + for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) + { + const CWalletTx& pcoin = (*it).second; + if (pcoin.IsCoinBase() && pcoin.GetBlocksToMaturity() > 0 && pcoin.GetDepthInMainChain() >= 2) + nTotal += GetCredit(pcoin); } } return nTotal; diff --git a/src/wallet.h b/src/wallet.h index 57633c4aa..c29dd738f 100644 --- a/src/wallet.h +++ b/src/wallet.h @@ -144,6 +144,7 @@ public: void ResendWalletTransactions(); int64 GetBalance() const; int64 GetUnconfirmedBalance() const; + int64 GetImmatureBalance() const; bool CreateTransaction(const std::vector >& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet); bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, CReserveKey& reservekey, int64& nFeeRet); bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);