From 07146b6c409e4f56464145fd4145858f9976beb0 Mon Sep 17 00:00:00 2001 From: Jianping Wu Date: Tue, 30 Oct 2018 14:45:05 -0700 Subject: [PATCH] Wallet getDebit with excluded keva. --- src/wallet/wallet.cpp | 31 ++++++++++++++++++++----------- src/wallet/wallet.h | 30 ++++++++++++++++++------------ 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 8b9481acf..83a35ece7 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1316,7 +1316,7 @@ isminetype CWallet::IsMine(const CTxIn &txin) const // Note that this function doesn't distinguish between a 0-valued input, // and a not-"is mine" (according to the filter) input. -CAmount CWallet::GetDebit(const CTxIn &txin, const isminefilter& filter) const +CAmount CWallet::GetDebit(const CTxIn &txin, const isminefilter& filter, bool fExcludeKeva) const { { LOCK(cs_wallet); @@ -1325,8 +1325,15 @@ CAmount CWallet::GetDebit(const CTxIn &txin, const isminefilter& filter) const { const CWalletTx& prev = (*mi).second; if (txin.prevout.n < prev.tx->vout.size()) + { + const CTxOut& prevout = prev.tx->vout[txin.prevout.n]; + if (fExcludeKeva + && CKevaScript::isKevaScript(prevout.scriptPubKey)) + return 0; + if (IsMine(prev.tx->vout[txin.prevout.n]) & filter) - return prev.tx->vout[txin.prevout.n].nValue; + return prevout.nValue; + } } } return 0; @@ -1386,12 +1393,12 @@ bool CWallet::IsFromMe(const CTransaction& tx) const return (GetDebit(tx, ISMINE_ALL) > 0); } -CAmount CWallet::GetDebit(const CTransaction& tx, const isminefilter& filter) const +CAmount CWallet::GetDebit(const CTransaction& tx, const isminefilter& filter, bool fExcludeKeva) const { CAmount nDebit = 0; for (const CTxIn& txin : tx.vin) { - nDebit += GetDebit(txin, filter); + nDebit += GetDebit(txin, filter, fExcludeKeva); if (!MoneyRange(nDebit)) throw std::runtime_error(std::string(__func__) + ": value out of range"); } @@ -1520,7 +1527,7 @@ void CWalletTx::GetAmounts(std::list& listReceived, CAmount nDebit = GetDebit(filter); if (nDebit > 0) // debit>0 means we signed/sent this transaction { - CAmount nValueOut = tx->GetValueOut(); + CAmount nValueOut = tx->GetValueOut(true); nFee = nDebit - nValueOut; } @@ -1749,7 +1756,7 @@ std::set CWalletTx::GetConflicts() const return result; } -CAmount CWalletTx::GetDebit(const isminefilter& filter) const +CAmount CWalletTx::GetDebit(const isminefilter& filter, bool fExcludeKeva) const { if (tx->vin.empty()) return 0; @@ -1757,19 +1764,21 @@ CAmount CWalletTx::GetDebit(const isminefilter& filter) const CAmount debit = 0; if(filter & ISMINE_SPENDABLE) { - if (fDebitCached) - debit += nDebitCached; + if (fDebitCached) { + debit += (fExcludeKeva ? nDebitCached : nDebitWithKevaCached); + } else { - nDebitCached = pwallet->GetDebit(*tx, ISMINE_SPENDABLE); + nDebitCached = pwallet->GetDebit(*tx, ISMINE_SPENDABLE, false); fDebitCached = true; debit += nDebitCached; } } if(filter & ISMINE_WATCH_ONLY) { - if(fWatchDebitCached) - debit += nWatchDebitCached; + if(fWatchDebitCached) { + debit += (fExcludeKeva ? nWatchDebitCached : nWatchDebitWithKevaCached, false); + } else { nWatchDebitCached = pwallet->GetDebit(*tx, ISMINE_WATCH_ONLY); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 0ccfb823b..0560fe919 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -107,7 +107,9 @@ enum OutputType : int OUTPUT_TYPE_P2SH_SEGWIT, OUTPUT_TYPE_BECH32, - OUTPUT_TYPE_DEFAULT = OUTPUT_TYPE_P2SH_SEGWIT + //OUTPUT_TYPE_DEFAULT = OUTPUT_TYPE_P2SH_SEGWIT + // JWU TODO FIXME: Update once we have segwit on Kevacoin. + OUTPUT_TYPE_DEFAULT = OUTPUT_TYPE_LEGACY }; extern OutputType g_address_type; @@ -270,7 +272,7 @@ public: bool IsCoinBase() const { return tx->IsCoinBase(); } }; -/** +/** * A transaction with a bunch of additional info that only the owner cares about. * It includes any unrecorded transactions needed to link it back to the block chain. */ @@ -341,10 +343,12 @@ public: mutable bool fChangeCached; mutable bool fInMempool; mutable CAmount nDebitCached; + mutable CAmount nDebitWithKevaCached; mutable CAmount nCreditCached; mutable CAmount nImmatureCreditCached; mutable CAmount nAvailableCreditCached; mutable CAmount nWatchDebitCached; + mutable CAmount nWatchDebitWithKevaCached; mutable CAmount nWatchCreditCached; mutable CAmount nImmatureWatchCreditCached; mutable CAmount nAvailableWatchCreditCached; @@ -381,10 +385,12 @@ public: fChangeCached = false; fInMempool = false; nDebitCached = 0; + nDebitWithKevaCached = 0; nCreditCached = 0; nImmatureCreditCached = 0; nAvailableCreditCached = 0; nWatchDebitCached = 0; + nWatchDebitWithKevaCached = 0; nWatchCreditCached = 0; nAvailableWatchCreditCached = 0; nImmatureWatchCreditCached = 0; @@ -456,7 +462,7 @@ public: } //! filter decides which addresses will count towards the debit - CAmount GetDebit(const isminefilter& filter) const; + CAmount GetDebit(const isminefilter& filter, bool fExcludeKeva = true) const; CAmount GetCredit(const isminefilter& filter) const; CAmount GetImmatureCredit(bool fUseCache=true) const; CAmount GetAvailableCredit(bool fUseCache=true) const; @@ -661,7 +667,7 @@ private: class WalletRescanReserver; //forward declarations for ScanForWalletTransactions/RescanFromTime -/** +/** * A CWallet is an extension of a keystore, which also maintains a set of transactions and balances, * and provides the ability to create new transactions. */ @@ -933,7 +939,7 @@ public: void GetKeyBirthTimes(std::map &mapKeyBirth) const; unsigned int ComputeTimeSmart(const CWalletTx& wtx) const; - /** + /** * Increment the next transaction order id * @return next transaction order id */ @@ -1027,7 +1033,7 @@ public: * Returns amount of debit if the input matches the * filter, otherwise returns 0 */ - CAmount GetDebit(const CTxIn& txin, const isminefilter& filter) const; + CAmount GetDebit(const CTxIn& txin, const isminefilter& filter, bool fExcludeKeva = true) const; isminetype IsMine(const CTxOut& txout) const; CAmount GetCredit(const CTxOut& txout, const isminefilter& filter) const; bool IsChange(const CTxOut& txout) const; @@ -1035,7 +1041,7 @@ public: bool IsMine(const CTransaction& tx) const; /** should probably be renamed to IsRelevantToMe */ bool IsFromMe(const CTransaction& tx) const; - CAmount GetDebit(const CTransaction& tx, const isminefilter& filter) const; + CAmount GetDebit(const CTransaction& tx, const isminefilter& filter, bool fExcludeKeva = true) const; /** Returns whether all of the inputs match the filter */ bool IsAllFromMe(const CTransaction& tx, const isminefilter& filter) const; CAmount GetCredit(const CTransaction& tx, const isminefilter& filter) const; @@ -1053,7 +1059,7 @@ public: const std::string& GetAccountName(const CScript& scriptPubKey) const; void GetScriptForMining(std::shared_ptr &script); - + unsigned int GetKeyPoolSize() { AssertLockHeld(cs_wallet); // set{Ex,In}ternalKeyPool @@ -1078,7 +1084,7 @@ public: //! Flush wallet (bitdb flush) void Flush(bool shutdown=false); - /** + /** * Address book entry changed. * @note called with lock cs_wallet held. */ @@ -1087,7 +1093,7 @@ public: const std::string &purpose, ChangeType status)> NotifyAddressBookChanged; - /** + /** * Wallet transaction added, removed or updated. * @note called with lock cs_wallet held. */ @@ -1134,7 +1140,7 @@ public: /* Generates a new HD master key (will not be activated) */ CPubKey GenerateNewHDMasterKey(); - + /* Set the current HD master key (will reset the chain child index counters) Sets the master key's version based on the current wallet version (so the caller must ensure the current wallet version is correct before calling @@ -1202,7 +1208,7 @@ public: }; -/** +/** * Account information. * Stored in wallet with key "acc"+string account name. */