Port getalldata from ZER sans sproutness
This commit is contained in:
@@ -3026,7 +3026,319 @@ uint64_t komodo_interestsum()
|
||||
return(0);
|
||||
}
|
||||
|
||||
UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) {
|
||||
/**
|
||||
*Return current blockchain status, wallet balance, address balance and the last 200 transactions
|
||||
**/
|
||||
UniValue getalldata(const UniValue& params, bool fHelp,const CPubKey&)
|
||||
{
|
||||
if (fHelp || params.size() > 3)
|
||||
throw runtime_error(
|
||||
"getalldata \"datatype transactiontype \"\n"
|
||||
"\n"
|
||||
"This function only returns information on wallet addresses with full spending keys."
|
||||
"\n"
|
||||
"\nArguments:\n"
|
||||
"1. \"datatype\" (integer, required) \n"
|
||||
" Value of 0: Return address, balance, transactions and blockchain info\n"
|
||||
" Value of 1: Return address, balance, blockchain info\n"
|
||||
" Value of 2: Return transactions and blockchain info\n"
|
||||
"2. \"transactiontype\" (integer, optional) \n"
|
||||
" Value of 1: Return all transactions in the last 24 hours\n"
|
||||
" Value of 2: Return all transactions in the last 7 days\n"
|
||||
" Value of 3: Return all transactions in the last 30 days\n"
|
||||
" Other number: Return all transactions in the last 24 hours\n"
|
||||
"3. \"transactioncount\" (integer, optional) \n"
|
||||
"\nResult:\n"
|
||||
"\nExamples:\n"
|
||||
+ HelpExampleCli("getalldata", "0")
|
||||
+ HelpExampleRpc("getalldata", "0")
|
||||
);
|
||||
|
||||
LOCK(cs_main);
|
||||
|
||||
UniValue returnObj(UniValue::VOBJ);
|
||||
int connectionCount = 0;
|
||||
{
|
||||
LOCK2(cs_main, cs_vNodes);
|
||||
connectionCount = (int)vNodes.size();
|
||||
}
|
||||
|
||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||
int nMinDepth = 1;
|
||||
|
||||
CAmount confirmed = 0;
|
||||
CAmount unconfirmed = 0;
|
||||
CAmount locked = 0;
|
||||
CAmount immature = 0;
|
||||
|
||||
CAmount privateConfirmed = 0;
|
||||
CAmount privateUnconfirmed = 0;
|
||||
CAmount privateLocked = 0;
|
||||
CAmount privateImmature = 0;
|
||||
|
||||
balancestruct txAmounts;
|
||||
txAmounts.confirmed = 0;
|
||||
txAmounts.unconfirmed = 0;
|
||||
txAmounts.locked = 0;
|
||||
txAmounts.immature = 0;
|
||||
|
||||
|
||||
//Create map of addresses
|
||||
//Add all Transaparent addresses to list
|
||||
map<string, balancestruct> addressBalances;
|
||||
BOOST_FOREACH(const PAIRTYPE(CTxDestination, CAddressBookData)& item, pwalletMain->mapAddressBook)
|
||||
{
|
||||
string addressString = EncodeDestination(item.first);
|
||||
if (addressBalances.count(addressString) == 0)
|
||||
addressBalances.insert(make_pair(addressString,txAmounts));
|
||||
}
|
||||
|
||||
//Add all Sapling addresses to map
|
||||
std::set<libzcash::SaplingPaymentAddress> zs_addresses;
|
||||
pwalletMain->GetSaplingPaymentAddresses(zs_addresses);
|
||||
for (auto addr : zs_addresses) {
|
||||
string addressString = EncodePaymentAddress(addr);
|
||||
if (addressBalances.count(addressString) == 0)
|
||||
addressBalances.insert(make_pair(addressString,txAmounts));
|
||||
}
|
||||
|
||||
//Create Ordered List
|
||||
map<int64_t,CWalletTx> orderedTxs;
|
||||
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) {
|
||||
const uint256& wtxid = it->first;
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
orderedTxs.insert(std::pair<int64_t,CWalletTx>(wtx.nOrderPos, wtx));
|
||||
|
||||
unsigned int txType = 0;
|
||||
// 0 Unassigend
|
||||
// 1 Immature
|
||||
// 2 Unconfirmed
|
||||
// 3 Locked
|
||||
|
||||
if (!CheckFinalTx(wtx))
|
||||
continue;
|
||||
|
||||
if (wtx.GetDepthInMainChain() < 0)
|
||||
continue;
|
||||
|
||||
if (wtx.mapSaplingNoteData.size() == 0 && wtx.mapSproutNoteData.size() == 0 && !wtx.IsTrusted())
|
||||
continue;
|
||||
|
||||
//Assign Immature
|
||||
if (txType == 0 && wtx.IsCoinBase() && wtx.GetBlocksToMaturity() > 0)
|
||||
txType = 1;
|
||||
|
||||
//Assign Unconfirmed
|
||||
if (txType == 0 && wtx.GetDepthInMainChain() == 0)
|
||||
txType = 2;
|
||||
|
||||
for (unsigned int i = 0; i < wtx.vout.size(); i++) {
|
||||
|
||||
CTxDestination address;
|
||||
if (!ExtractDestination(wtx.vout[i].scriptPubKey, address))
|
||||
continue;
|
||||
|
||||
//excluded coins that we dont have the spending keys for
|
||||
isminetype mine = IsMine(*pwalletMain,address);
|
||||
if (mine != ISMINE_SPENDABLE)
|
||||
continue;
|
||||
|
||||
//Exclude spent coins
|
||||
if (pwalletMain->IsSpent(wtxid, i))
|
||||
continue;
|
||||
|
||||
//Assign locked
|
||||
if (txType == 0 && pwalletMain->IsLockedCoin((*it).first, i))
|
||||
txType = 3;
|
||||
|
||||
//Assign Locked to 10000 Zer inputs for Zeronodes
|
||||
//if (txType == 0 && fZeroNode && wtx.vout[i].nValue == 10000 * COIN)
|
||||
// txType = 3;
|
||||
|
||||
string addressString = EncodeDestination(address);
|
||||
if (addressBalances.count(addressString) == 0)
|
||||
addressBalances.insert(make_pair(addressString,txAmounts));
|
||||
|
||||
if (txType == 0) {
|
||||
addressBalances.at(addressString).confirmed += wtx.vout[i].nValue;
|
||||
confirmed += wtx.vout[i].nValue;
|
||||
} else if (txType == 1) {
|
||||
addressBalances.at(addressString).immature+= wtx.vout[i].nValue;
|
||||
immature += wtx.vout[i].nValue;
|
||||
} else if (txType == 2) {
|
||||
addressBalances.at(addressString).unconfirmed += wtx.vout[i].nValue;
|
||||
unconfirmed += wtx.vout[i].nValue;
|
||||
} else if (txType == 3) {
|
||||
addressBalances.at(addressString).locked += wtx.vout[i].nValue;
|
||||
locked += wtx.vout[i].nValue;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto & pair : wtx.mapSaplingNoteData) {
|
||||
SaplingOutPoint op = pair.first;
|
||||
SaplingNoteData nd = pair.second;
|
||||
|
||||
//Skip Spent
|
||||
if (nd.nullifier && pwalletMain->IsSaplingSpent(*nd.nullifier))
|
||||
continue;
|
||||
|
||||
//Decrypt sapling incoming commitments using IVK
|
||||
for (auto addr : zs_addresses) {
|
||||
libzcash::SaplingExtendedSpendingKey extsk;
|
||||
if (pwalletMain->GetSaplingExtendedSpendingKey(addr, extsk)) {
|
||||
auto pt = libzcash::SaplingNotePlaintext::decrypt(
|
||||
wtx.vShieldedOutput[op.n].encCiphertext,extsk.expsk.full_viewing_key().in_viewing_key(),wtx.vShieldedOutput[op.n].ephemeralKey,wtx.vShieldedOutput[op.n].cm);
|
||||
|
||||
if (txType == 0 && pwalletMain->IsLockedNote(op))
|
||||
txType == 3;
|
||||
|
||||
if (pt) {
|
||||
auto note = pt.get();
|
||||
string addressString = EncodePaymentAddress(addr);
|
||||
if (addressBalances.count(addressString) == 0)
|
||||
addressBalances.insert(make_pair(addressString,txAmounts));
|
||||
|
||||
if (txType == 0) {
|
||||
addressBalances.at(addressString).confirmed += note.value();
|
||||
privateConfirmed += note.value();
|
||||
} else if (txType == 1) {
|
||||
addressBalances.at(addressString).immature += note.value();
|
||||
privateImmature += note.value();
|
||||
} else if (txType == 2) {
|
||||
addressBalances.at(addressString).unconfirmed += note.value();
|
||||
privateUnconfirmed += note.value();
|
||||
} else if (txType == 3) {
|
||||
addressBalances.at(addressString).locked += note.value();
|
||||
privateLocked += note.value();
|
||||
}
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CAmount nBalance = 0;
|
||||
CAmount nBalanceUnconfirmed = 0;
|
||||
CAmount nBalanceTotal = 0;
|
||||
CAmount totalBalance= confirmed + privateConfirmed;
|
||||
CAmount totalUnconfirmed = unconfirmed + privateUnconfirmed;
|
||||
|
||||
|
||||
returnObj.push_back(Pair("connectionCount", connectionCount));
|
||||
returnObj.push_back(Pair("besttime", chainActive.Tip()->GetBlockTime()));
|
||||
returnObj.push_back(Pair("bestblockhash", chainActive.Tip()->GetBlockHash().GetHex()));
|
||||
returnObj.push_back(Pair("transparentbalance", FormatMoney(confirmed)));
|
||||
returnObj.push_back(Pair("transparentbalanceunconfirmed", FormatMoney(unconfirmed)));
|
||||
returnObj.push_back(Pair("privatebalance", FormatMoney(privateConfirmed)));
|
||||
returnObj.push_back(Pair("privatebalanceunconfirmed", FormatMoney(privateUnconfirmed)));
|
||||
returnObj.push_back(Pair("totalbalance", FormatMoney(totalBalance)));
|
||||
returnObj.push_back(Pair("totalunconfirmed", FormatMoney(totalUnconfirmed)));
|
||||
returnObj.push_back(Pair("lockedbalance", FormatMoney(locked)));
|
||||
returnObj.push_back(Pair("immaturebalance", FormatMoney(immature)));
|
||||
|
||||
//get all t address
|
||||
UniValue addressbalance(UniValue::VARR);
|
||||
UniValue addrlist(UniValue::VOBJ);
|
||||
|
||||
if (params.size() > 0 && (params[0].get_int() == 1 || params[0].get_int() == 0))
|
||||
{
|
||||
for (map<string, balancestruct>::iterator it = addressBalances.begin(); it != addressBalances.end(); ++it) {
|
||||
UniValue addr(UniValue::VOBJ);
|
||||
addr.push_back(Pair("amount", ValueFromAmount(it->second.confirmed)));
|
||||
addr.push_back(Pair("unconfirmed", ValueFromAmount(it->second.unconfirmed)));
|
||||
addr.push_back(Pair("locked", ValueFromAmount(it->second.locked)));
|
||||
addr.push_back(Pair("immature", ValueFromAmount(it->second.immature)));
|
||||
addr.push_back(Pair("ismine", true));
|
||||
addrlist.push_back(Pair(it->first, addr));
|
||||
}
|
||||
}
|
||||
|
||||
addressbalance.push_back(addrlist);
|
||||
returnObj.push_back(Pair("addressbalance", addressbalance));
|
||||
|
||||
|
||||
//get transactions
|
||||
int nCount = 200;
|
||||
UniValue trans(UniValue::VARR);
|
||||
UniValue transTime(UniValue::VARR);
|
||||
|
||||
if (params.size() == 3)
|
||||
{
|
||||
nCount = params[2].get_int();
|
||||
}
|
||||
|
||||
if (params.size() > 0 && (params[0].get_int() == 2 || params[0].get_int() == 0))
|
||||
{
|
||||
int day = 365 * 30; //30 Years
|
||||
if(params.size() > 1)
|
||||
{
|
||||
if(params[1].get_int() == 1)
|
||||
{
|
||||
day = 1;
|
||||
}
|
||||
else if(params[1].get_int() == 2)
|
||||
{
|
||||
day = 7;
|
||||
}
|
||||
else if(params[1].get_int() == 3)
|
||||
{
|
||||
day = 30;
|
||||
}
|
||||
else if(params[1].get_int() == 4)
|
||||
{
|
||||
day = 90;
|
||||
}
|
||||
else if(params[1].get_int() == 5)
|
||||
{
|
||||
day = 365;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint64_t t = GetTime();
|
||||
for (map<int64_t,CWalletTx>::reverse_iterator it = orderedTxs.rbegin(); it != orderedTxs.rend(); ++it)
|
||||
{
|
||||
const CWalletTx& wtx = (*it).second;
|
||||
|
||||
if (!CheckFinalTx(wtx))
|
||||
continue;
|
||||
|
||||
if (wtx.mapSaplingNoteData.size() == 0 && wtx.mapSproutNoteData.size() == 0 && !wtx.IsTrusted())
|
||||
continue;
|
||||
|
||||
//Excude transactions with less confirmations than required
|
||||
if (wtx.GetDepthInMainChain() < 0 )
|
||||
continue;
|
||||
|
||||
//Exclude Transactions older that max days old
|
||||
if (wtx.GetDepthInMainChain() > 0 && mapBlockIndex[wtx.hashBlock]->GetBlockTime() < (t - (day * 60 * 60 * 24))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
zsWalletTxJSON(wtx, trans, "*", false, 0);
|
||||
if (trans.size() >= nCount) break;
|
||||
|
||||
}
|
||||
|
||||
vector<UniValue> arrTmp = trans.getValues();
|
||||
|
||||
std::reverse(arrTmp.begin(), arrTmp.end()); // Return oldest to newest
|
||||
|
||||
trans.clear();
|
||||
trans.setArray();
|
||||
trans.push_backV(arrTmp);
|
||||
}
|
||||
|
||||
returnObj.push_back(Pair("listtransactions", trans));
|
||||
return returnObj;
|
||||
}
|
||||
|
||||
UniValue z_listreceivedaddress(const UniValue& params, bool fHelp,const CPubKey&)
|
||||
{
|
||||
if (!EnsureWalletIsAvailable(fHelp))
|
||||
return NullUniValue;
|
||||
|
||||
@@ -3167,7 +3479,8 @@ UniValue z_listreceivedbyaddress(const UniValue& params, bool fHelp) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
UniValue z_listsentbyaddress(const UniValue& params, bool fHelp,const CPubKey&) {
|
||||
UniValue z_listsentbyaddress(const UniValue& params, bool fHelp,const CPubKey&)
|
||||
{
|
||||
if (!EnsureWalletIsAvailable(fHelp))
|
||||
return NullUniValue;
|
||||
|
||||
@@ -8429,6 +8742,7 @@ static const CRPCCommand commands[] =
|
||||
{ "wallet", "encryptwallet", &encryptwallet, true },
|
||||
{ "wallet", "getaccountaddress", &getaccountaddress, true },
|
||||
{ "wallet", "getaccount", &getaccount, true },
|
||||
{ "wallet", "getalldata", &getalldata, true },
|
||||
{ "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
|
||||
{ "wallet", "getbalance", &getbalance, false },
|
||||
{ "wallet", "getnewaddress", &getnewaddress, true },
|
||||
|
||||
Reference in New Issue
Block a user