diff --git a/init.cpp b/init.cpp index e114d80727..d93eaba795 100644 --- a/init.cpp +++ b/init.cpp @@ -346,6 +346,9 @@ bool AppInit2(int argc, char* argv[]) return false; } + if (GetBoolArg("-rescan")) + ScanForWalletTransactions(pindexGenesisBlock); + // Add wallet transactions that aren't already in a block to mapTransactions ReacceptWalletTransactions(); diff --git a/main.cpp b/main.cpp index ac0c563ece..3079d38464 100644 --- a/main.cpp +++ b/main.cpp @@ -442,8 +442,13 @@ void CWalletTx::GetAmounts(int64& nGenerated, list >& listRe else if (ExtractPubKey(txout.scriptPubKey, false, vchPubKey)) address = PubKeyToAddress(vchPubKey); else - address = " unknown "; // some type of weird non-standard transaction? + { + printf("CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n", + this->GetHash().ToString().c_str()); + address = " unknown "; + } + // Don't report 'change' txouts if (nDebit > 0 && txout.IsChange()) continue; @@ -479,8 +484,19 @@ void CWalletTx::GetAccountAmounts(const string& strAccount, int64& nGenerated, i CRITICAL_BLOCK(cs_mapAddressBook) { foreach(const PAIRTYPE(string,int64)& r, listReceived) - if (mapAddressBook.count(r.first) && mapAddressBook[r.first] == strAccount) + { + if (mapAddressBook.count(r.first)) + { + if (mapAddressBook[r.first] == strAccount) + { + nReceived += r.second; + } + } + else if (strAccount.empty()) + { nReceived += r.second; + } + } } } diff --git a/rpc.cpp b/rpc.cpp index 286ddcd0b0..055e0cf1e7 100644 --- a/rpc.cpp +++ b/rpc.cpp @@ -626,6 +626,7 @@ Value getbalance(const Array& params, bool fHelp) // (GetBalance() sums up all unspent TxOuts) // getbalance and getbalance '*' should always return the same number. int64 nBalance = 0; + vector vAccounts; for (map::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; @@ -636,12 +637,17 @@ Value getbalance(const Array& params, bool fHelp) list > listSent; wtx.GetAmounts(allGenerated, listReceived, listSent, allFee, strSentAccount); foreach(const PAIRTYPE(string,int64)& r, listReceived) + { nBalance += r.second; + if (!count(vAccounts.begin(), vAccounts.end(), r.first)) + vAccounts.push_back(r.first); + } foreach(const PAIRTYPE(string,int64)& r, listSent) nBalance -= r.second; nBalance -= allFee; nBalance += allGenerated; } + printf("Found %d accounts\n", vAccounts.size()); return (double)nBalance / (double)COIN; } @@ -1080,6 +1086,8 @@ Value listaccounts(const Array& params, bool fHelp) foreach(const PAIRTYPE(string, int64)& r, listReceived) if (mapAddressBook.count(r.first)) mapAccountBalances[mapAddressBook[r.first]] += r.second; + else + mapAccountBalances[""] += r.second; } } }