Browse Source

Wallet getDebit with excluded keva.

cn
Jianping Wu 6 years ago
parent
commit
5977428951
  1. 31
      src/wallet/wallet.cpp
  2. 14
      src/wallet/wallet.h

31
src/wallet/wallet.cpp

@ -1316,7 +1316,7 @@ isminetype CWallet::IsMine(const CTxIn &txin) const @@ -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 @@ -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 @@ -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<COutputEntry>& listReceived, @@ -1520,7 +1527,7 @@ void CWalletTx::GetAmounts(std::list<COutputEntry>& 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<uint256> CWalletTx::GetConflicts() const @@ -1749,7 +1756,7 @@ std::set<uint256> 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 @@ -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);

14
src/wallet/wallet.h

@ -107,7 +107,9 @@ enum OutputType : int @@ -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;
@ -341,10 +343,12 @@ public: @@ -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: @@ -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: @@ -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;
@ -1027,7 +1033,7 @@ public: @@ -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: @@ -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;

Loading…
Cancel
Save