Fix calculation of balances and available coins.
No longer consider coins which aren't in our mempool. Add test for regression in abandonconflict.py Github-Pull: #7715 Rebased-From: 68d4282774d6a60c609301cddad0b652f16df4d9
This commit is contained in:
parent
f04f4fd2ee
commit
19866c1ffc
@ -83,6 +83,12 @@ class AbandonConflictTest(BitcoinTestFramework):
|
|||||||
# inputs are still spent, but change not received
|
# inputs are still spent, but change not received
|
||||||
newbalance = self.nodes[0].getbalance()
|
newbalance = self.nodes[0].getbalance()
|
||||||
assert(newbalance == balance - Decimal("24.9996"))
|
assert(newbalance == balance - Decimal("24.9996"))
|
||||||
|
# Unconfirmed received funds that are not in mempool, also shouldn't show
|
||||||
|
# up in unconfirmed balance
|
||||||
|
unconfbalance = self.nodes[0].getunconfirmedbalance() + self.nodes[0].getbalance()
|
||||||
|
assert(unconfbalance == newbalance)
|
||||||
|
# Also shouldn't show up in listunspent
|
||||||
|
assert(not txABC2 in [utxo["txid"] for utxo in self.nodes[0].listunspent(0)])
|
||||||
balance = newbalance
|
balance = newbalance
|
||||||
|
|
||||||
# Abandon original transaction and verify inputs are available again
|
# Abandon original transaction and verify inputs are available again
|
||||||
|
@ -1576,7 +1576,7 @@ CAmount CWallet::GetUnconfirmedBalance() const
|
|||||||
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||||
{
|
{
|
||||||
const CWalletTx* pcoin = &(*it).second;
|
const CWalletTx* pcoin = &(*it).second;
|
||||||
if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
|
if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool())
|
||||||
nTotal += pcoin->GetAvailableCredit();
|
nTotal += pcoin->GetAvailableCredit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1621,7 +1621,7 @@ CAmount CWallet::GetUnconfirmedWatchOnlyBalance() const
|
|||||||
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
|
||||||
{
|
{
|
||||||
const CWalletTx* pcoin = &(*it).second;
|
const CWalletTx* pcoin = &(*it).second;
|
||||||
if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
|
if (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0 && pcoin->InMempool())
|
||||||
nTotal += pcoin->GetAvailableWatchOnlyCredit();
|
nTotal += pcoin->GetAvailableWatchOnlyCredit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1666,6 +1666,11 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
|
|||||||
if (nDepth < 0)
|
if (nDepth < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// We should not consider coins which aren't at least in our mempool
|
||||||
|
// It's possible for these to be conflicted via ancestors which we may never be able to detect
|
||||||
|
if (nDepth == 0 && !pcoin->InMempool())
|
||||||
|
continue;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < pcoin->vout.size(); i++) {
|
for (unsigned int i = 0; i < pcoin->vout.size(); i++) {
|
||||||
isminetype mine = IsMine(pcoin->vout[i]);
|
isminetype mine = IsMine(pcoin->vout[i]);
|
||||||
if (!(IsSpent(wtxid, i)) && mine != ISMINE_NO &&
|
if (!(IsSpent(wtxid, i)) && mine != ISMINE_NO &&
|
||||||
|
Loading…
Reference in New Issue
Block a user