added includedWatchonly argument to listreceivedbyaddress/...account

This commit is contained in:
JaSK 2014-05-31 16:57:26 +02:00
parent f87ba3df64
commit 0fa2f8899a
2 changed files with 33 additions and 8 deletions

View file

@ -37,8 +37,10 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "getreceivedbyaccount", 1 }, { "getreceivedbyaccount", 1 },
{ "listreceivedbyaddress", 0 }, { "listreceivedbyaddress", 0 },
{ "listreceivedbyaddress", 1 }, { "listreceivedbyaddress", 1 },
{ "listreceivedbyaddress", 2 },
{ "listreceivedbyaccount", 0 }, { "listreceivedbyaccount", 0 },
{ "listreceivedbyaccount", 1 }, { "listreceivedbyaccount", 1 },
{ "listreceivedbyaccount", 2 },
{ "getbalance", 1 }, { "getbalance", 1 },
{ "getbalance", 2 }, { "getbalance", 2 },
{ "getblockhash", 0 }, { "getblockhash", 0 },
@ -65,7 +67,6 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "listunspent", 1 }, { "listunspent", 1 },
{ "listunspent", 2 }, { "listunspent", 2 },
{ "getblock", 1 }, { "getblock", 1 },
{ "gettransaction", 1},
{ "getrawtransaction", 1 }, { "getrawtransaction", 1 },
{ "createrawtransaction", 0 }, { "createrawtransaction", 0 },
{ "createrawtransaction", 1 }, { "createrawtransaction", 1 },

View file

@ -932,10 +932,12 @@ struct tallyitem
int64_t nAmount; int64_t nAmount;
int nConf; int nConf;
vector<uint256> txids; vector<uint256> txids;
bool fIsWatchonly;
tallyitem() tallyitem()
{ {
nAmount = 0; nAmount = 0;
nConf = std::numeric_limits<int>::max(); nConf = std::numeric_limits<int>::max();
fIsWatchonly = false;
} }
}; };
@ -951,6 +953,11 @@ Value ListReceived(const Array& params, bool fByAccounts)
if (params.size() > 1) if (params.size() > 1)
fIncludeEmpty = params[1].get_bool(); fIncludeEmpty = params[1].get_bool();
isminefilter filter = MINE_SPENDABLE;
if(params.size() > 2)
if(params[2].get_bool())
filter = filter | MINE_WATCH_ONLY;
// Tally // Tally
map<CBitcoinAddress, tallyitem> mapTally; map<CBitcoinAddress, tallyitem> mapTally;
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
@ -967,13 +974,19 @@ Value ListReceived(const Array& params, bool fByAccounts)
BOOST_FOREACH(const CTxOut& txout, wtx.vout) BOOST_FOREACH(const CTxOut& txout, wtx.vout)
{ {
CTxDestination address; CTxDestination address;
if (!ExtractDestination(txout.scriptPubKey, address) || !IsMine(*pwalletMain, address)) if (!ExtractDestination(txout.scriptPubKey, address))
continue;
isminefilter mine = IsMine(*pwalletMain, address);
if(!mine & filter)
continue; continue;
tallyitem& item = mapTally[address]; tallyitem& item = mapTally[address];
item.nAmount += txout.nValue; item.nAmount += txout.nValue;
item.nConf = min(item.nConf, nDepth); item.nConf = min(item.nConf, nDepth);
item.txids.push_back(wtx.GetHash()); item.txids.push_back(wtx.GetHash());
if (mine & MINE_WATCH_ONLY)
item.fIsWatchonly = true;
} }
} }
@ -990,10 +1003,12 @@ Value ListReceived(const Array& params, bool fByAccounts)
int64_t nAmount = 0; int64_t nAmount = 0;
int nConf = std::numeric_limits<int>::max(); int nConf = std::numeric_limits<int>::max();
bool fIsWatchonly = false;
if (it != mapTally.end()) if (it != mapTally.end())
{ {
nAmount = (*it).second.nAmount; nAmount = (*it).second.nAmount;
nConf = (*it).second.nConf; nConf = (*it).second.nConf;
fIsWatchonly = (*it).second.fIsWatchonly;
} }
if (fByAccounts) if (fByAccounts)
@ -1001,10 +1016,13 @@ Value ListReceived(const Array& params, bool fByAccounts)
tallyitem& item = mapAccountTally[strAccount]; tallyitem& item = mapAccountTally[strAccount];
item.nAmount += nAmount; item.nAmount += nAmount;
item.nConf = min(item.nConf, nConf); item.nConf = min(item.nConf, nConf);
item.fIsWatchonly = fIsWatchonly;
} }
else else
{ {
Object obj; Object obj;
if(fIsWatchonly)
obj.push_back(Pair("involvesWatchonly", true));
obj.push_back(Pair("address", address.ToString())); obj.push_back(Pair("address", address.ToString()));
obj.push_back(Pair("account", strAccount)); obj.push_back(Pair("account", strAccount));
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); obj.push_back(Pair("amount", ValueFromAmount(nAmount)));
@ -1029,6 +1047,8 @@ Value ListReceived(const Array& params, bool fByAccounts)
int64_t nAmount = (*it).second.nAmount; int64_t nAmount = (*it).second.nAmount;
int nConf = (*it).second.nConf; int nConf = (*it).second.nConf;
Object obj; Object obj;
if((*it).second.fIsWatchonly)
obj.push_back(Pair("involvesWatchonly", true));
obj.push_back(Pair("account", (*it).first)); obj.push_back(Pair("account", (*it).first));
obj.push_back(Pair("amount", ValueFromAmount(nAmount))); obj.push_back(Pair("amount", ValueFromAmount(nAmount)));
obj.push_back(Pair("confirmations", (nConf == std::numeric_limits<int>::max() ? 0 : nConf))); obj.push_back(Pair("confirmations", (nConf == std::numeric_limits<int>::max() ? 0 : nConf)));
@ -1041,17 +1061,19 @@ Value ListReceived(const Array& params, bool fByAccounts)
Value listreceivedbyaddress(const Array& params, bool fHelp) Value listreceivedbyaddress(const Array& params, bool fHelp)
{ {
if (fHelp || params.size() > 2) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"listreceivedbyaddress ( minconf includeempty )\n" "listreceivedbyaddress ( minconf includeempty includeWatchonly)\n"
"\nList balances by receiving address.\n" "\nList balances by receiving address.\n"
"\nArguments:\n" "\nArguments:\n"
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n" "1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
"2. includeempty (numeric, optional, dafault=false) Whether to include addresses that haven't received any payments.\n" "2. includeempty (numeric, optional, dafault=false) Whether to include addresses that haven't received any payments.\n"
"3. includeWatchonly (bool, optional, default=false) Whether to include watchonly addresses (see 'importaddress').\n"
"\nResult:\n" "\nResult:\n"
"[\n" "[\n"
" {\n" " {\n"
" \"involvesWatchonly\" : \"true\", (bool) Only returned if imported addresses were involved in transaction\n"
" \"address\" : \"receivingaddress\", (string) The receiving address\n" " \"address\" : \"receivingaddress\", (string) The receiving address\n"
" \"account\" : \"accountname\", (string) The account of the receiving address. The default account is \"\".\n" " \"account\" : \"accountname\", (string) The account of the receiving address. The default account is \"\".\n"
" \"amount\" : x.xxx, (numeric) The total amount in btc received by the address\n" " \"amount\" : x.xxx, (numeric) The total amount in btc received by the address\n"
@ -1063,7 +1085,7 @@ Value listreceivedbyaddress(const Array& params, bool fHelp)
"\nExamples:\n" "\nExamples:\n"
+ HelpExampleCli("listreceivedbyaddress", "") + HelpExampleCli("listreceivedbyaddress", "")
+ HelpExampleCli("listreceivedbyaddress", "6 true") + HelpExampleCli("listreceivedbyaddress", "6 true")
+ HelpExampleRpc("listreceivedbyaddress", "6, true") + HelpExampleRpc("listreceivedbyaddress", "6, true, true")
); );
return ListReceived(params, false); return ListReceived(params, false);
@ -1071,17 +1093,19 @@ Value listreceivedbyaddress(const Array& params, bool fHelp)
Value listreceivedbyaccount(const Array& params, bool fHelp) Value listreceivedbyaccount(const Array& params, bool fHelp)
{ {
if (fHelp || params.size() > 2) if (fHelp || params.size() > 3)
throw runtime_error( throw runtime_error(
"listreceivedbyaccount ( minconf includeempty )\n" "listreceivedbyaccount ( minconf includeempty includeWatchonly)\n"
"\nList balances by account.\n" "\nList balances by account.\n"
"\nArguments:\n" "\nArguments:\n"
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n" "1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
"2. includeempty (boolean, optional, default=false) Whether to include accounts that haven't received any payments.\n" "2. includeempty (boolean, optional, default=false) Whether to include accounts that haven't received any payments.\n"
"3. includeWatchonly (bool, optional, default=false) Whether to include watchonly addresses (see 'importaddress').\n"
"\nResult:\n" "\nResult:\n"
"[\n" "[\n"
" {\n" " {\n"
" \"involvesWatchonly\" : \"true\", (bool) Only returned if imported addresses were involved in transaction\n"
" \"account\" : \"accountname\", (string) The account name of the receiving account\n" " \"account\" : \"accountname\", (string) The account name of the receiving account\n"
" \"amount\" : x.xxx, (numeric) The total amount received by addresses with this account\n" " \"amount\" : x.xxx, (numeric) The total amount received by addresses with this account\n"
" \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included\n" " \"confirmations\" : n (numeric) The number of confirmations of the most recent transaction included\n"
@ -1092,7 +1116,7 @@ Value listreceivedbyaccount(const Array& params, bool fHelp)
"\nExamples:\n" "\nExamples:\n"
+ HelpExampleCli("listreceivedbyaccount", "") + HelpExampleCli("listreceivedbyaccount", "")
+ HelpExampleCli("listreceivedbyaccount", "6 true") + HelpExampleCli("listreceivedbyaccount", "6 true")
+ HelpExampleRpc("listreceivedbyaccount", "6, true") + HelpExampleRpc("listreceivedbyaccount", "6, true, true")
); );
return ListReceived(params, true); return ListReceived(params, true);