aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2011-01-20 13:10:01 -0500
committerGavin Andresen <gavinandresen@gmail.com>2011-01-20 13:10:01 -0500
commitd9574c2f14028297ad5121695a0c10e517bf638e (patch)
tree6f5adb8c454cf303c63ba7363e675501ac4b9b51
parent1d23c7436164faa0b1822acf5ce9507bf6ff257a (diff)
Reconcile getbalance and listaccounts 0 in the shared-wallet case
If you copied your wallet and used it on two different machines, the balance reported by getbalance and the sum(listaccounts) could disagree, because you might receive payments for an address that is in your wallet but not your address book. Now all such transactions are credited to the default empty-string account.
-rw-r--r--init.cpp3
-rw-r--r--main.cpp20
-rw-r--r--rpc.cpp8
3 files changed, 29 insertions, 2 deletions
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<pair<string, int64> >& 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<string> vAccounts;
for (map<uint256, CWalletTx>::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<pair<string, int64> > 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;
}
}
}