@ -1975,6 +1975,49 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const
return nTotal ;
}
// Calculate total balance in a different way from GetBalance. The biggest
// difference is that GetBalance sums up all unspent TxOuts paying to the
// wallet, while this sums up both spent and unspent TxOuts paying to the
// wallet, and then subtracts the values of TxIns spending from the wallet. This
// also has fewer restrictions on which unconfirmed transactions are considered
// trusted.
CAmount CWallet : : GetLegacyBalance ( const isminefilter & filter , int minDepth , const std : : string * account ) const
{
LOCK2 ( cs_main , cs_wallet ) ;
CAmount balance = 0 ;
for ( const auto & entry : mapWallet ) {
const CWalletTx & wtx = entry . second ;
const int depth = wtx . GetDepthInMainChain ( ) ;
if ( depth < 0 | | ! CheckFinalTx ( * wtx . tx ) | | wtx . GetBlocksToMaturity ( ) > 0 ) {
continue ;
}
// Loop through tx outputs and add incoming payments. For outgoing txs,
// treat change outputs specially, as part of the amount debited.
CAmount debit = wtx . GetDebit ( filter ) ;
const bool outgoing = debit > 0 ;
for ( const CTxOut & out : wtx . tx - > vout ) {
if ( outgoing & & IsChange ( out ) ) {
debit - = out . nValue ;
} else if ( IsMine ( out ) & filter & & depth > = minDepth & & ( ! account | | * account = = GetAccountName ( out . scriptPubKey ) ) ) {
balance + = out . nValue ;
}
}
// For outgoing txs, subtract amount debited.
if ( outgoing & & ( ! account | | * account = = wtx . strFromAccount ) ) {
balance - = debit ;
}
}
if ( account ) {
balance + = CWalletDB ( * dbw ) . GetAccountCreditDebit ( * account ) ;
}
return balance ;
}
void CWallet : : AvailableCoins ( std : : vector < COutput > & vCoins , bool fOnlySafe , const CCoinControl * coinControl , bool fIncludeZeroValue ) const
{
vCoins . clear ( ) ;
@ -2911,6 +2954,21 @@ bool CWallet::DelAddressBook(const CTxDestination& address)
return CWalletDB ( * dbw ) . EraseName ( CBitcoinAddress ( address ) . ToString ( ) ) ;
}
const std : : string & CWallet : : GetAccountName ( const CScript & scriptPubKey ) const
{
CTxDestination address ;
if ( ExtractDestination ( scriptPubKey , address ) & & ! scriptPubKey . IsUnspendable ( ) ) {
auto mi = mapAddressBook . find ( address ) ;
if ( mi ! = mapAddressBook . end ( ) ) {
return mi - > second . name ;
}
}
// A scriptPubKey that doesn't have an entry in the address book is
// associated with the default account ("").
const static std : : string DEFAULT_ACCOUNT_NAME ;
return DEFAULT_ACCOUNT_NAME ;
}
bool CWallet : : SetDefaultKey ( const CPubKey & vchPubKey )
{
if ( ! CWalletDB ( * dbw ) . WriteDefaultKey ( vchPubKey ) )