diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index e8d182c4..b714775c 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -344,6 +344,7 @@ static const CRPCCommand vRPCCommands[] = { "smsgoutbox", &smsgoutbox, false, false, false }, { "smsgbuckets", &smsgbuckets, false, false, false }, { "smsggetmessagesforaccount", &smsggetmessagesforaccount, false, false, false }, + { "smsggetairdropentries", &smsggetairdropentries, false, false, false }, #endif }; diff --git a/src/rpcserver.h b/src/rpcserver.h index cba61bdd..d0ccfedc 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -214,6 +214,8 @@ extern json_spirit::Value smsgsendanon(const json_spirit::Array& params, bool fH extern json_spirit::Value smsginbox(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value smsgoutbox(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value smsgbuckets(const json_spirit::Array& params, bool fHelp); +// for airdrop +extern json_spirit::Value smsggetairdropentries(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value smsggetmessagesforaccount(const json_spirit::Array& params, bool fHelp); diff --git a/src/rpcsmessage.cpp b/src/rpcsmessage.cpp index f586612a..476778de 100644 --- a/src/rpcsmessage.cpp +++ b/src/rpcsmessage.cpp @@ -1041,3 +1041,71 @@ Value smsggetmessagesforaccount(const Array& params, bool fHelp) return result; }; + +Value smsggetairdropentries(const json_spirit::Array& params, bool fHelp) { + if (fHelp || params.size() > 1) + throw runtime_error( + "smsggetairdropentries \"ethAddress\"\n" + "Returns number of XDN addresses signed up for airdrop to the ETH address" + "\nArguments:\n" + "1. \"ethAddress\" (string, required) The ETH address.\n"); + + if (!fSecMsgEnabled) + throw runtime_error("Secure messaging is disabled."); + + if (pwalletMain->IsLocked()) + throw runtime_error("Wallet is locked."); + + std::string ethAddress; + if (params.size() > 0) + { + ethAddress = params[0].get_str(); + } else { + throw runtime_error("ETH Address is required."); + } + + uint32_t nMessages = 0; + char cbuf[256]; + + { + LOCK(cs_smsgDB); + + SecMsgDB dbInbox; + + if (!dbInbox.Open("cr+")) + throw runtime_error("Could not open DB."); + + std::string sPrefix("im"); + unsigned char chKey[18]; + + SecMsgStored smsgStored; + MessageData msg; + + leveldb::Iterator *it = dbInbox.pdb->NewIterator(leveldb::ReadOptions()); + while (dbInbox.NextSmesg(it, sPrefix, chKey, smsgStored)) { + uint32_t nPayload = smsgStored.vchMessage.size() - SMSG_HDR_LEN; + if (SecureMsgDecrypt(false, smsgStored.sAddrTo, &smsgStored.vchMessage[0], &smsgStored.vchMessage[SMSG_HDR_LEN], nPayload, msg) == 0) { + + std::string message = std::string((char *) &msg.vchMessage[0]); + json_spirit::mValue jsonMessage; + LogPrintf("JSON parse: %s \n", message); + + if (json_spirit::read_string(message, jsonMessage)) { + json_spirit::mObject obj = jsonMessage.get_obj(); + + LogPrintf("JSON parse: %s", obj["ethAddress"].get_str()); + if (obj["ethAddress"].get_str() == ethAddress) + { + nMessages++; + } + } + } + }; + delete it; + } + + Object result; + result.push_back(Pair("result", std::to_string(nMessages))); + + return result; +} diff --git a/src/smessage.cpp b/src/smessage.cpp index 8e0bb781..0d8041f6 100644 --- a/src/smessage.cpp +++ b/src/smessage.cpp @@ -4079,7 +4079,7 @@ int SignUpForAirdrop(std::string &sError, const std::string& ethAddress) if (!address.IsValid()) continue; - message = "\"{\"ethAddress\":\"" + ethAddress + "\", \"count\":\"" + std::to_string(count) + "\"}\""; + message = "{\"ethAddress\":\"" + ethAddress + "\", \"count\":\"" + std::to_string(count) + "\"}"; count++; const string &strName = item.second;