From 1f27e7e2bf6ee7fc14bc9dfbc983ad82c4890afa Mon Sep 17 00:00:00 2001 From: flo071 Date: Thu, 23 Jul 2020 11:51:26 +0200 Subject: [PATCH] exclude locked coins from Available to mint amount --- src/qt/sigmadialog.cpp | 10 ++++++++-- src/qt/sigmadialog.h | 1 + src/qt/walletmodel.cpp | 16 ++++++++++++++-- src/qt/walletmodel.h | 4 +++- src/wallet/wallet.cpp | 17 ++++++++++++----- src/wallet/wallet.h | 4 ++-- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/qt/sigmadialog.cpp b/src/qt/sigmadialog.cpp index c9c4921e..11740627 100644 --- a/src/qt/sigmadialog.cpp +++ b/src/qt/sigmadialog.cpp @@ -125,8 +125,9 @@ void SigmaDialog::setWalletModel(WalletModel *model) if (model && model->getOptionsModel()) { connect(model, SIGNAL(balanceChanged(CAmount, CAmount, CAmount, CAmount, CAmount, CAmount, CAmount)), - this, SLOT(updateAvailableToMintBalance(CAmount))); - updateAvailableToMintBalance(model->getBalance()); + this, SLOT(updateMintableBalance())); + connect(model, SIGNAL(updateMintable()), this, SLOT(updateMintableBalance())); + updateMintableBalance(); connect(model, SIGNAL(notifySigmaChanged(const std::vector, const std::vector)), this, SLOT(updateCoins(const std::vector, const std::vector))); model->checkSigmaAmount(true); @@ -441,6 +442,11 @@ void SigmaDialog::updateAvailableToMintBalance(const CAmount& balance) ui->availableAmount->setText(formattedBalance); } +void SigmaDialog::updateMintableBalance() +{ + updateAvailableToMintBalance(this->walletModel->getBalance(NULL, true)); +} + // Coin Control: copy label "Quantity" to clipboard void SigmaDialog::coinControlClipboardQuantity() { diff --git a/src/qt/sigmadialog.h b/src/qt/sigmadialog.h index fabc6d7e..e44e942c 100644 --- a/src/qt/sigmadialog.h +++ b/src/qt/sigmadialog.h @@ -72,6 +72,7 @@ private Q_SLOTS: void on_sendButton_clicked(); void removeEntry(SendCoinsEntry* entry); void updateAvailableToMintBalance(const CAmount& balance); + void updateMintableBalance(); void updateCoins(const std::vector& spendable, const std::vector& pending); Q_SIGNALS: diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 36200131..dc0c259c 100755 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -59,7 +59,7 @@ WalletModel::~WalletModel() unsubscribeFromCoreSignals(); } -CAmount WalletModel::getBalance(const CCoinControl *coinControl) const +CAmount WalletModel::getBalance(const CCoinControl *coinControl, bool fExcludeLocked) const { if (coinControl) { @@ -73,7 +73,7 @@ CAmount WalletModel::getBalance(const CCoinControl *coinControl) const return nBalance; } - return wallet->GetBalance(); + return wallet->GetBalance(fExcludeLocked); } CAmount WalletModel::getStake() const @@ -732,6 +732,16 @@ void WalletModel::listCoins(std::map >& mapCoins, COutput out(&wallet->mapWallet[outpoint.hash], outpoint.n, nDepth, true, true); if (outpoint.n < out.tx->vout.size() && wallet->IsMine(out.tx->vout[outpoint.n]) == ISMINE_SPENDABLE) vCoins.push_back(out); + + if(nCoinType == ALL_COINS){ + // We are now taking ALL_COINS to mean everything sans mints + if(out.tx->vout[out.i].scriptPubKey.IsZerocoinMint() || out.tx->vout[out.i].scriptPubKey.IsSigmaMint()) + continue; + } else if(nCoinType == ONLY_MINTS){ + // Do not consider anything other than mints + if(!(out.tx->vout[out.i].scriptPubKey.IsZerocoinMint() || out.tx->vout[out.i].scriptPubKey.IsSigmaMint())) + continue; + } } BOOST_FOREACH(const COutput& out, vCoins) @@ -765,12 +775,14 @@ void WalletModel::lockCoin(COutPoint& output) { LOCK2(cs_main, wallet->cs_wallet); wallet->LockCoin(output); + Q_EMIT updateMintable(); } void WalletModel::unlockCoin(COutPoint& output) { LOCK2(cs_main, wallet->cs_wallet); wallet->UnlockCoin(output); + Q_EMIT updateMintable(); } void WalletModel::listLockedCoins(std::vector& vOutpts) diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 9e437bd0..5a3a65e2 100755 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -137,7 +137,7 @@ class WalletModel : public QObject TransactionTableModel *getTransactionTableModel(); RecentRequestsTableModel *getRecentRequestsTableModel(); - CAmount getBalance(const CCoinControl *coinControl = NULL) const; + CAmount getBalance(const CCoinControl *coinControl = NULL, bool fExcludeLocked = false) const; CAmount getStake() const; CAmount getUnconfirmedBalance() const; CAmount getImmatureBalance() const; @@ -274,6 +274,8 @@ class WalletModel : public QObject void balanceChanged(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& stake, const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance); + void updateMintable(); + // Encryption status of wallet changed void encryptionStatusChanged(int status); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 33015207..3a5a3b76 100755 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2090,7 +2090,7 @@ CAmount CWalletTx::GetImmatureStakeCredit(bool fUseCache) const return 0; } -CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const { +CAmount CWalletTx::GetAvailableCredit(bool fUseCache, bool fExcludeLocked) const { if (pwallet == 0) return 0; @@ -2099,7 +2099,7 @@ CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const { return 0; // We cannot use cache if vout contains mints due to it will not update when it spend - if (fUseCache && fAvailableCreditCached && !IsZerocoinMint() && !IsSigmaMint()) + if (fUseCache && fAvailableCreditCached && !IsZerocoinMint() && !IsSigmaMint() && !fExcludeLocked) return nAvailableCreditCached; CAmount nCredit = 0; @@ -2108,7 +2108,10 @@ CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const { if (!pwallet->IsSpent(hashTx, i)) { const CTxOut &txout = vout[i]; bool isPrivate = txout.scriptPubKey.IsZerocoinMint() || txout.scriptPubKey.IsSigmaMint(); - nCredit += isPrivate ? 0 : pwallet->GetCredit(txout, ISMINE_SPENDABLE); + bool condition = isPrivate; + if (fExcludeLocked) + condition = (isPrivate || pwallet->IsLockedCoin(hashTx, i)); + nCredit += condition ? 0 : pwallet->GetCredit(txout, ISMINE_SPENDABLE); if (!MoneyRange(nCredit)) throw std::runtime_error("CWalletTx::GetAvailableCredit() : value out of range"); } @@ -2116,6 +2119,10 @@ CAmount CWalletTx::GetAvailableCredit(bool fUseCache) const { nAvailableCreditCached = nCredit; fAvailableCreditCached = true; + + if (fExcludeLocked) + fAvailableCreditCached = false; + return nCredit; } @@ -2311,14 +2318,14 @@ void CWallet::ResendWalletTransactions(int64_t nBestBlockTime) { */ -CAmount CWallet::GetBalance() const { +CAmount CWallet::GetBalance(bool fExcludeLocked) const { CAmount nTotal = 0; { LOCK2(cs_main, cs_wallet); for (map::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx *pcoin = &(*it).second; if (pcoin->IsTrusted()) - nTotal += pcoin->GetAvailableCredit(); + nTotal += pcoin->GetAvailableCredit(true, fExcludeLocked); } } diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index dc091417..e4b8d632 100755 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -439,7 +439,7 @@ class CWalletTx : public CMerkleTx CAmount GetCredit(const isminefilter& filter) const; CAmount GetImmatureCredit(bool fUseCache=true) const; CAmount GetImmatureStakeCredit(bool fUseCache=true) const; - CAmount GetAvailableCredit(bool fUseCache=true) const; + CAmount GetAvailableCredit(bool fUseCache=true, bool fExcludeLocked = false) const; CAmount GetImmatureWatchOnlyCredit(const bool& fUseCache=true) const; CAmount GetAvailableWatchOnlyCredit(const bool& fUseCache=true) const; CAmount GetAnonymizedCredit(bool fUseCache=true) const; @@ -836,7 +836,7 @@ class CWallet : public CCryptoKeyStore, public CValidationInterface void ResendWalletTransactions(int64_t nBestBlockTime); std::vector ResendWalletTransactionsBefore(int64_t nTime); //noirnode - CAmount GetBalance() const; + CAmount GetBalance(bool fExcludeLocked = false) const; CAmount GetUnconfirmedBalance() const; CAmount GetImmatureBalance() const; CAmount GetStake() const;