X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Frpcwallet.cpp;h=8f82c976f0b757cb3ad9eb6d334586ec50d47244;hb=8ba3ee467d792328984c6a26c8a08ead8ebbf1e0;hp=0d0946e0c0723030a2959f5704b16714d65e9f33;hpb=81aaaf43084ca0b9473e7a85e6833301cba09c30;p=novacoin.git diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index 0d0946e..8f82c97 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -20,7 +20,7 @@ static CCriticalSection cs_nWalletUnlockTime; extern int64_t nReserveBalance; extern void TxToJSON(const CTransaction& tx, const uint256& hashBlock, json_spirit::Object& entry); -std::string HelpRequiringPassphrase() +string HelpRequiringPassphrase() { return pwalletMain->IsCrypted() ? "\n\nRequires wallet passphrase to be set with walletpassphrase first" @@ -50,13 +50,13 @@ void WalletTxToJSON(const CWalletTx& wtx, Object& entry) entry.push_back(Pair("txid", wtx.GetHash().GetHex())); entry.push_back(Pair("time", (int64_t)wtx.GetTxTime())); entry.push_back(Pair("timereceived", (int64_t)wtx.nTimeReceived)); - BOOST_FOREACH(const PAIRTYPE(string,string)& item, wtx.mapValue) + for(const auto& item : wtx.mapValue) entry.push_back(Pair(item.first, item.second)); } string AccountFromValue(const Value& value) { - string strAccount = value.get_str(); + auto strAccount = value.get_str(); if (strAccount == "*") throw JSONRPCError(RPC_WALLET_INVALID_ACCOUNT_NAME, "Invalid account name"); return strAccount; @@ -85,17 +85,17 @@ Value getinfo(const Array& params, bool fHelp) timestamping.push_back(Pair("systemclock", GetTime())); timestamping.push_back(Pair("adjustedtime", GetAdjustedTime())); - int64_t nNtpOffset = GetNtpOffset(), + auto nNtpOffset = GetNtpOffset(), nP2POffset = GetNodesOffset(); - timestamping.push_back(Pair("ntpoffset", nNtpOffset != INT64_MAX ? nNtpOffset : Value::null)); - timestamping.push_back(Pair("p2poffset", nP2POffset != INT64_MAX ? nP2POffset : Value::null)); + timestamping.push_back(Pair("ntpoffset", nNtpOffset != numeric_limits::max() ? nNtpOffset : Value::null)); + timestamping.push_back(Pair("p2poffset", nP2POffset != numeric_limits::max() ? nP2POffset : Value::null)); obj.push_back(Pair("timestamping", timestamping)); obj.push_back(Pair("moneysupply", ValueFromAmount(pindexBest->nMoneySupply))); obj.push_back(Pair("connections", (int)vNodes.size())); - obj.push_back(Pair("proxy", (proxy.first.IsValid() ? proxy.first.ToStringIPPort() : string()))); + obj.push_back(Pair("proxy", (proxy.IsValid() ? proxy.ToStringIPPort() : string()))); obj.push_back(Pair("ip", addrSeenByPeer.ToStringIP())); diff.push_back(Pair("proof-of-work", GetDifficulty())); @@ -156,12 +156,12 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false) { CScript scriptPubKey; scriptPubKey.SetDestination(account.vchPubKey.GetID()); - for (map::iterator it = pwalletMain->mapWallet.begin(); + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end() && account.vchPubKey.IsValid(); ++it) { const CWalletTx& wtx = (*it).second; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) + for(const CTxOut& txout : wtx.vout) if (txout.scriptPubKey == scriptPubKey) bKeyUsed = true; } @@ -188,7 +188,7 @@ Value getaccountaddress(const Array& params, bool fHelp) "Returns the current NovaCoin address for receiving payments to this account."); // Parse the account first so we don't generate a key if there's an error - string strAccount = AccountFromValue(params[0]); + auto strAccount = AccountFromValue(params[0]); Value ret; @@ -218,7 +218,7 @@ Value setaccount(const Array& params, bool fHelp) // Detect when changing the account of an address that is the 'unused current key' of another account: if (pwalletMain->mapAddressBook.count(address)) { - string strOldAccount = pwalletMain->mapAddressBook[address]; + auto strOldAccount = pwalletMain->mapAddressBook[address]; if (address == GetAccountAddress(strOldAccount)) GetAccountAddress(strOldAccount, true); } @@ -241,7 +241,7 @@ Value getaccount(const Array& params, bool fHelp) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); string strAccount; - map::iterator mi = pwalletMain->mapAddressBook.find(address); + auto mi = pwalletMain->mapAddressBook.find(address); if (mi != pwalletMain->mapAddressBook.end() && !(*mi).second.empty()) strAccount = (*mi).second; return strAccount; @@ -255,11 +255,11 @@ Value getaddressesbyaccount(const Array& params, bool fHelp) "getaddressesbyaccount \n" "Returns the list of addresses for the given account."); - string strAccount = AccountFromValue(params[0]); + auto strAccount = AccountFromValue(params[0]); // Find all addresses that have the given account Array ret; - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook) + for(const auto& item : pwalletMain->mapAddressBook) { const CBitcoinAddress& address = item.first; const string& strName = item.second; @@ -284,13 +284,13 @@ Value mergecoins(const Array& params, bool fHelp) throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first."); // Total amount - int64_t nAmount = AmountFromValue(params[0]); + auto nAmount = AmountFromValue(params[0]); // Min input amount - int64_t nMinValue = AmountFromValue(params[1]); + auto nMinValue = AmountFromValue(params[1]); // Output amount - int64_t nOutputValue = AmountFromValue(params[2]); + auto nOutputValue = AmountFromValue(params[2]); if (nAmount < nMinimumInputValue) throw JSONRPCError(-101, "Send amount too small"); @@ -309,7 +309,7 @@ Value mergecoins(const Array& params, bool fHelp) return Value::null; Array mergedHashes; - BOOST_FOREACH(const uint256 txHash, listMerged) + for(const uint256 txHash : listMerged) mergedHashes.push_back(txHash.GetHex()); return mergedHashes; @@ -325,7 +325,7 @@ Value sendtoaddress(const Array& params, bool fHelp) // Parse address CScript scriptPubKey; - string strAddress = params[0].get_str(); + auto strAddress = params[0].get_str(); CBitcoinAddress address(strAddress); if (address.IsValid()) @@ -334,7 +334,7 @@ Value sendtoaddress(const Array& params, bool fHelp) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); // Amount - int64_t nAmount = AmountFromValue(params[1]); + auto nAmount = AmountFromValue(params[1]); if (nAmount < nMinimumInputValue) throw JSONRPCError(-101, "Send amount too small"); @@ -349,8 +349,8 @@ Value sendtoaddress(const Array& params, bool fHelp) if (pwalletMain->IsLocked()) throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first."); - string strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); - if (strError != "") + auto strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); + if (!strError.empty()) throw JSONRPCError(RPC_WALLET_ERROR, strError); return wtx.GetHash().GetHex(); @@ -367,10 +367,10 @@ Value listaddressgroupings(const Array& params, bool fHelp) Array jsonGroupings; map balances = pwalletMain->GetAddressBalances(); - BOOST_FOREACH(set grouping, pwalletMain->GetAddressGroupings()) + for(auto grouping : pwalletMain->GetAddressGroupings()) { Array jsonGrouping; - BOOST_FOREACH(CBitcoinAddress address, grouping) + for(CBitcoinAddress address : grouping) { Array addressInfo; addressInfo.push_back(address.ToString()); @@ -396,8 +396,8 @@ Value signmessage(const Array& params, bool fHelp) EnsureWalletIsUnlocked(); - string strAddress = params[0].get_str(); - string strMessage = params[1].get_str(); + auto strAddress = params[0].get_str(); + auto strMessage = params[1].get_str(); CBitcoinAddress addr(strAddress); if (!addr.IsValid()) @@ -429,9 +429,9 @@ Value verifymessage(const Array& params, bool fHelp) "verifymessage \n" "Verify a signed message"); - string strAddress = params[0].get_str(); - string strSign = params[1].get_str(); - string strMessage = params[2].get_str(); + auto strAddress = params[0].get_str(); + auto strSign = params[1].get_str(); + auto strMessage = params[2].get_str(); CBitcoinAddress addr(strAddress); if (!addr.IsValid()) @@ -451,11 +451,11 @@ Value verifymessage(const Array& params, bool fHelp) ss << strMessageMagic; ss << strMessage; - CKey key; + CPubKey key; if (!key.SetCompactSignature(Hash(ss.begin(), ss.end()), vchSig)) return false; - return (key.GetPubKey().GetID() == keyID); + return (key.GetID() == keyID); } @@ -467,7 +467,7 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) "Returns the total amount received by in transactions with at least [minconf] confirmations."); // Bitcoin address - CBitcoinAddress address = CBitcoinAddress(params[0].get_str()); + auto address = CBitcoinAddress(params[0].get_str()); if (!address.IsValid()) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); if (!IsMine(*pwalletMain,address)) @@ -479,12 +479,12 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) nMinDepth = params[1].get_int(); int64_t nAmount = 0; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; if (wtx.IsCoinBase() || wtx.IsCoinStake() || !wtx.IsFinal()) continue; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) + for(const CTxOut& txout : wtx.vout) { CBitcoinAddress addressRet; if (!ExtractAddress(*pwalletMain, txout.scriptPubKey, addressRet)) @@ -500,7 +500,7 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) void GetAccountAddresses(string strAccount, set& setAddress) { - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook) + for(const auto& item : pwalletMain->mapAddressBook) { const CBitcoinAddress& address = item.first; const string& strName = item.second; @@ -522,19 +522,19 @@ Value getreceivedbyaccount(const Array& params, bool fHelp) nMinDepth = params[1].get_int(); // Get the set of pub keys assigned to account - string strAccount = AccountFromValue(params[0]); + auto strAccount = AccountFromValue(params[0]); set setAddress; GetAccountAddresses(strAccount, setAddress); // Tally int64_t nAmount = 0; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; if (wtx.IsCoinBase() || wtx.IsCoinStake() || !wtx.IsFinal()) continue; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) + for(const CTxOut& txout : wtx.vout) { CBitcoinAddress address; if (ExtractAddress(*pwalletMain, txout.scriptPubKey, address) && IsMine(*pwalletMain, address) && setAddress.count(address)) @@ -552,7 +552,7 @@ int64_t GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMi int64_t nBalance = 0; // Tally wallet transactions - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; if (!wtx.IsFinal()) @@ -603,8 +603,8 @@ Value getbalance(const Array& params, bool fHelp) // Calculate total balance a different way from GetBalance() // (GetBalance() sums up all unspent TxOuts) // getbalance and getbalance '*' 0 should return the same number. - int64_t nBalance = 0; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + auto nBalance = 0; + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; if (!wtx.IsTrusted()) @@ -619,10 +619,10 @@ Value getbalance(const Array& params, bool fHelp) wtx.GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount, filter); if (wtx.GetDepthInMainChain() >= nMinDepth) { - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64_t)& r, listReceived) + for(const auto& r : listReceived) nBalance += r.second; } - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64_t)& r, listSent) + for(const auto& r : listSent) nBalance -= r.second; nBalance -= allFee; nBalance += allGeneratedMature; @@ -630,9 +630,9 @@ Value getbalance(const Array& params, bool fHelp) return ValueFromAmount(nBalance); } - string strAccount = AccountFromValue(params[0]); + auto strAccount = AccountFromValue(params[0]); - int64_t nBalance = GetAccountBalance(strAccount, nMinDepth, filter); + auto nBalance = GetAccountBalance(strAccount, nMinDepth, filter); return ValueFromAmount(nBalance); } @@ -645,9 +645,9 @@ Value movecmd(const Array& params, bool fHelp) "move [minconf=1] [comment]\n" "Move from one account in your wallet to another."); - string strFrom = AccountFromValue(params[0]); - string strTo = AccountFromValue(params[1]); - int64_t nAmount = AmountFromValue(params[2]); + auto strFrom = AccountFromValue(params[0]); + auto strTo = AccountFromValue(params[1]); + auto nAmount = AmountFromValue(params[2]); if (nAmount < nMinimumInputValue) throw JSONRPCError(-101, "Send amount too small"); @@ -663,7 +663,7 @@ Value movecmd(const Array& params, bool fHelp) if (!walletdb.TxnBegin()) throw JSONRPCError(RPC_DATABASE_ERROR, "database error"); - int64_t nNow = GetAdjustedTime(); + auto nNow = GetAdjustedTime(); // Debit CAccountingEntry debit; @@ -700,11 +700,11 @@ Value sendfrom(const Array& params, bool fHelp) " is a real and is rounded to the nearest " + FormatMoney(nMinimumInputValue) + HelpRequiringPassphrase()); - string strAccount = AccountFromValue(params[0]); + auto strAccount = AccountFromValue(params[0]); // Parse address CScript scriptPubKey; - string strAddress = params[0].get_str(); + auto strAddress = params[0].get_str(); CBitcoinAddress address(strAddress); if (address.IsValid()) @@ -713,7 +713,7 @@ Value sendfrom(const Array& params, bool fHelp) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); - int64_t nAmount = AmountFromValue(params[2]); + auto nAmount = AmountFromValue(params[2]); if (nAmount < nMinimumInputValue) throw JSONRPCError(-101, "Send amount too small"); @@ -732,13 +732,13 @@ Value sendfrom(const Array& params, bool fHelp) EnsureWalletIsUnlocked(); // Check funds - int64_t nBalance = GetAccountBalance(strAccount, nMinDepth, MINE_SPENDABLE); + auto nBalance = GetAccountBalance(strAccount, nMinDepth, MINE_SPENDABLE); if (nAmount > nBalance) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds"); // Send - string strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); - if (strError != "") + auto strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); + if (!strError.empty()) throw JSONRPCError(RPC_WALLET_ERROR, strError); return wtx.GetHash().GetHex(); @@ -753,8 +753,8 @@ Value sendmany(const Array& params, bool fHelp) "amounts are double-precision floating point numbers" + HelpRequiringPassphrase()); - string strAccount = AccountFromValue(params[0]); - Object sendTo = params[1].get_obj(); + auto strAccount = AccountFromValue(params[0]); + auto sendTo = params[1].get_obj(); int nMinDepth = 1; if (params.size() > 2) nMinDepth = params[2].get_int(); @@ -768,7 +768,7 @@ Value sendmany(const Array& params, bool fHelp) vector > vecSend; int64_t totalAmount = 0; - BOOST_FOREACH(const Pair& s, sendTo) + for(const Pair& s : sendTo) { CBitcoinAddress address(s.name_); if (!address.IsValid()) @@ -783,20 +783,20 @@ Value sendmany(const Array& params, bool fHelp) CScript scriptPubKey; scriptPubKey.SetAddress(address); - int64_t nAmount = AmountFromValue(s.value_); + auto nAmount = AmountFromValue(s.value_); if (nAmount < nMinimumInputValue) throw JSONRPCError(-101, "Send amount too small"); totalAmount += nAmount; - vecSend.push_back(make_pair(scriptPubKey, nAmount)); + vecSend.push_back({ scriptPubKey, nAmount }); } EnsureWalletIsUnlocked(); // Check funds - int64_t nBalance = GetAccountBalance(strAccount, nMinDepth, MINE_SPENDABLE); + auto nBalance = GetAccountBalance(strAccount, nMinDepth, MINE_SPENDABLE); if (totalAmount > nBalance) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds"); @@ -806,7 +806,7 @@ Value sendmany(const Array& params, bool fHelp) bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired); if (!fCreated) { - int64_t nTotal = pwalletMain->GetBalance(), nWatchOnly = pwalletMain->GetWatchOnlyBalance(); + auto nTotal = pwalletMain->GetBalance(), nWatchOnly = pwalletMain->GetWatchOnlyBalance(); if (totalAmount + nFeeRequired > nTotal - nWatchOnly) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds"); throw JSONRPCError(RPC_WALLET_ERROR, "Transaction creation failed"); @@ -843,11 +843,11 @@ Value addmultisigaddress(const Array& params, bool fHelp) "(got %" PRIszu " keys, but need at least %d to redeem)", keys.size(), nRequired)); if (keys.size() > 16) throw runtime_error("Number of addresses involved in the multisignature address creation > 16\nReduce the number"); - std::vector pubkeys; + vector pubkeys; pubkeys.resize(keys.size()); for (unsigned int i = 0; i < keys.size(); i++) { - const std::string& ks = keys[i].get_str(); + const auto& ks = keys[i].get_str(); // Case 1: Bitcoin address and we have full public key: CBitcoinAddress address(ks); @@ -861,16 +861,18 @@ Value addmultisigaddress(const Array& params, bool fHelp) if (!pwalletMain->GetPubKey(keyID, vchPubKey)) throw runtime_error( strprintf("no full public key for address %s",ks.c_str())); - if (!vchPubKey.IsValid() || !pubkeys[i].SetPubKey(vchPubKey)) + if (!vchPubKey.IsValid()) throw runtime_error(" Invalid public key: "+ks); + pubkeys[i] = vchPubKey; } // Case 2: hex public key else if (IsHex(ks)) { CPubKey vchPubKey(ParseHex(ks)); - if (!vchPubKey.IsValid() || !pubkeys[i].SetPubKey(vchPubKey)) + if (!vchPubKey.IsValid()) throw runtime_error(" Invalid public key: "+ks); + pubkeys[i] = vchPubKey; } else { @@ -887,7 +889,7 @@ Value addmultisigaddress(const Array& params, bool fHelp) strprintf("redeemScript exceeds size limit: %" PRIszu " > %d", inner.size(), MAX_SCRIPT_ELEMENT_SIZE)); pwalletMain->AddCScript(inner); - CBitcoinAddress address(inner.GetID()); + CBitcoinAddress address{ CScriptID(inner) }; // "most vexing parse" pwalletMain->SetAddressBookName(address, strAccount); return address.ToString(); @@ -908,10 +910,10 @@ Value addredeemscript(const Array& params, bool fHelp) strAccount = AccountFromValue(params[1]); // Construct using pay-to-script-hash: - vector innerData = ParseHexV(params[0], "redeemScript"); + auto innerData = ParseHexV(params[0], "redeemScript"); CScript inner(innerData.begin(), innerData.end()); pwalletMain->AddCScript(inner); - CBitcoinAddress address(inner.GetID()); + CBitcoinAddress address{ CScriptID(inner) }; // "most vexing parse" pwalletMain->SetAddressBookName(address, strAccount); return address.ToString(); @@ -924,7 +926,7 @@ struct tallyitem tallyitem() { nAmount = 0; - nConf = std::numeric_limits::max(); + nConf = numeric_limits::max(); } }; @@ -942,9 +944,9 @@ Value ListReceived(const Array& params, bool fByAccounts) // Tally map mapTally; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + for (const auto &wit : pwalletMain->mapWallet) { - const CWalletTx& wtx = (*it).second; + const auto& wtx = wit.second; if (wtx.IsCoinBase() || wtx.IsCoinStake() || !wtx.IsFinal()) continue; @@ -953,13 +955,13 @@ Value ListReceived(const Array& params, bool fByAccounts) if (nDepth < nMinDepth) continue; - BOOST_FOREACH(const CTxOut& txout, wtx.vout) + for(const auto& txout : wtx.vout) { CTxDestination address; if (!ExtractDestination(txout.scriptPubKey, address) || !IsMine(*pwalletMain, address)) continue; - tallyitem& item = mapTally[address]; + auto& item = mapTally[address]; item.nAmount += txout.nValue; item.nConf = min(item.nConf, nDepth); } @@ -968,16 +970,16 @@ Value ListReceived(const Array& params, bool fByAccounts) // Reply Array ret; map mapAccountTally; - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& item, pwalletMain->mapAddressBook) + for(const auto& item : pwalletMain->mapAddressBook) { - const CBitcoinAddress& address = item.first; - const string& strAccount = item.second; - map::iterator it = mapTally.find(address); + const auto& address = item.first; + const auto& strAccount = item.second; + auto it = mapTally.find(address); if (it == mapTally.end() && !fIncludeEmpty) continue; int64_t nAmount = 0; - int nConf = std::numeric_limits::max(); + int nConf = numeric_limits::max(); if (it != mapTally.end()) { nAmount = (*it).second.nAmount; @@ -986,7 +988,7 @@ Value ListReceived(const Array& params, bool fByAccounts) if (fByAccounts) { - tallyitem& item = mapAccountTally[strAccount]; + auto& item = mapAccountTally[strAccount]; item.nAmount += nAmount; item.nConf = min(item.nConf, nConf); } @@ -996,21 +998,21 @@ Value ListReceived(const Array& params, bool fByAccounts) obj.push_back(Pair("address", address.ToString())); obj.push_back(Pair("account", strAccount)); obj.push_back(Pair("amount", ValueFromAmount(nAmount))); - obj.push_back(Pair("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf))); + obj.push_back(Pair("confirmations", (nConf == numeric_limits::max() ? 0 : nConf))); ret.push_back(obj); } } if (fByAccounts) { - for (map::iterator it = mapAccountTally.begin(); it != mapAccountTally.end(); ++it) + for (const auto &acc : mapAccountTally) { - int64_t nAmount = (*it).second.nAmount; - int nConf = (*it).second.nConf; + auto nAmount = acc.second.nAmount; + int nConf = acc.second.nConf; Object obj; - obj.push_back(Pair("account", (*it).first)); + obj.push_back(Pair("account", acc.first)); obj.push_back(Pair("amount", ValueFromAmount(nAmount))); - obj.push_back(Pair("confirmations", (nConf == std::numeric_limits::max() ? 0 : nConf))); + obj.push_back(Pair("confirmations", (nConf == numeric_limits::max() ? 0 : nConf))); ret.push_back(obj); } } @@ -1067,7 +1069,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe bool involvesWatchonly = wtx.IsFromMe(MINE_WATCH_ONLY); // Generated blocks assigned to account "" - if ((nGeneratedMature+nGeneratedImmature) != 0 && (fAllAccounts || strAccount == "")) + if ((nGeneratedMature+nGeneratedImmature) != 0 && (fAllAccounts || strAccount.empty())) { Object entry; entry.push_back(Pair("account", string(""))); @@ -1089,7 +1091,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe // Sent if ((!listSent.empty() || nFee != 0) && (fAllAccounts || strAccount == strSentAccount)) { - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& s, listSent) + for(const auto& s : listSent) { Object entry; entry.push_back(Pair("account", strSentAccount)); @@ -1114,7 +1116,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe // Received if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth) { - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& r, listReceived) + for(const auto& r : listReceived) { string account; if (pwalletMain->mapAddressBook.count(r.first)) @@ -1192,11 +1194,11 @@ Value listtransactions(const Array& params, bool fHelp) Array ret; - std::list acentries; - CWallet::TxItems txOrdered = pwalletMain->OrderedTxItems(acentries, strAccount); + list acentries; + auto txOrdered = pwalletMain->OrderedTxItems(acentries, strAccount); // iterate backwards until we have nCount items to return: - for (CWallet::TxItems::reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it) + for (auto it = txOrdered.rbegin(); it != txOrdered.rend(); ++it) { CWalletTx *const pwtx = (*it).second.first; if (pwtx != 0) @@ -1213,15 +1215,15 @@ Value listtransactions(const Array& params, bool fHelp) nFrom = ret.size(); if ((nFrom + nCount) > (int)ret.size()) nCount = ret.size() - nFrom; - Array::iterator first = ret.begin(); - std::advance(first, nFrom); - Array::iterator last = ret.begin(); - std::advance(last, nFrom+nCount); + auto first = ret.begin(); + advance(first, nFrom); + auto last = ret.begin(); + advance(last, nFrom+nCount); if (last != ret.end()) ret.erase(last, ret.end()); if (first != ret.begin()) ret.erase(ret.begin(), first); - std::reverse(ret.begin(), ret.end()); // Return oldest to newest + reverse(ret.begin(), ret.end()); // Return oldest to newest return ret; } @@ -1244,12 +1246,12 @@ Value listaccounts(const Array& params, bool fHelp) map mapAccountBalances; - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& entry, pwalletMain->mapAddressBook) { + for(const auto& entry : pwalletMain->mapAddressBook) { if (IsMine(*pwalletMain, entry.first)) // This address belongs to me mapAccountBalances[entry.second] = 0; } - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) { const CWalletTx& wtx = (*it).second; int64_t nGeneratedImmature, nGeneratedMature, nFee; @@ -1258,12 +1260,12 @@ Value listaccounts(const Array& params, bool fHelp) list > listSent; wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount, includeWatchonly); mapAccountBalances[strSentAccount] -= nFee; - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& s, listSent) + for(const auto& s : listSent) mapAccountBalances[strSentAccount] -= s.second; if (wtx.GetDepthInMainChain() >= nMinDepth) { mapAccountBalances[""] += nGeneratedMature; - BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& r, listReceived) + for(const auto& r : listReceived) if (pwalletMain->mapAddressBook.count(r.first)) mapAccountBalances[pwalletMain->mapAddressBook[r.first]] += r.second; else @@ -1273,11 +1275,11 @@ Value listaccounts(const Array& params, bool fHelp) list acentries; CWalletDB(pwalletMain->strWalletFile).ListAccountCreditDebit("*", acentries); - BOOST_FOREACH(const CAccountingEntry& entry, acentries) + for(const auto& entry : acentries) mapAccountBalances[entry.strAccount] += entry.nCreditDebit; Object ret; - BOOST_FOREACH(const PAIRTYPE(string, int64_t)& accountBalance, mapAccountBalances) { + for(const auto& accountBalance : mapAccountBalances) { ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second))); } return ret; @@ -1318,9 +1320,9 @@ Value listsinceblock(const Array& params, bool fHelp) Array transactions; - for (map::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); it++) + for (auto it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); it++) { - CWalletTx tx = (*it).second; + auto tx = (*it).second; if (depth == -1 || tx.GetDepthInMainChain() < depth) ListTransactions(tx, "*", 0, true, transactions, filter); @@ -1374,10 +1376,10 @@ Value gettransaction(const Array& params, bool fHelp) TxToJSON(wtx, 0, entry); - int64_t nCredit = wtx.GetCredit(filter); - int64_t nDebit = wtx.GetDebit(filter); - int64_t nNet = nCredit - nDebit; - int64_t nFee = (wtx.IsFromMe(filter) ? wtx.GetValueOut() - nDebit : 0); + auto nCredit = wtx.GetCredit(filter); + auto nDebit = wtx.GetDebit(filter); + auto nNet = nCredit - nDebit; + auto nFee = (wtx.IsFromMe(filter) ? wtx.GetValueOut() - nDebit : 0); entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee))); if (wtx.IsFromMe(filter)) @@ -1401,10 +1403,10 @@ Value gettransaction(const Array& params, bool fHelp) else { entry.push_back(Pair("blockhash", hashBlock.GetHex())); - map::iterator mi = mapBlockIndex.find(hashBlock); + auto mi = mapBlockIndex.find(hashBlock); if (mi != mapBlockIndex.end() && (*mi).second) { - CBlockIndex* pindex = (*mi).second; + auto pindex = (*mi).second; if (pindex->IsInMainChain()) entry.push_back(Pair("confirmations", 1 + nBestHeight - pindex->nHeight)); else @@ -1427,7 +1429,7 @@ Value backupwallet(const Array& params, bool fHelp) "backupwallet \n" "Safely copies wallet.dat to destination, which can be a directory or a path with filename."); - string strDest = params[0].get_str(); + auto strDest = params[0].get_str(); if (!BackupWallet(*pwalletMain, strDest)) throw JSONRPCError(RPC_WALLET_ERROR, "Error: Wallet backup failed!"); @@ -1503,7 +1505,7 @@ void ThreadCleanWalletPassphrase(void* parg) // Make this thread recognisable as the wallet relocking thread RenameThread("novacoin-lock-wa"); - int64_t nMyWakeTime = GetTimeMillis() + *((int64_t*)parg) * 1000; + auto nMyWakeTime = GetTimeMillis() + *((int64_t*)parg) * 1000; ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime); @@ -1511,11 +1513,11 @@ void ThreadCleanWalletPassphrase(void* parg) { nWalletUnlockTime = nMyWakeTime; - do + for ( ; ; ) { if (nWalletUnlockTime==0) break; - int64_t nToSleep = nWalletUnlockTime - GetTimeMillis(); + auto nToSleep = nWalletUnlockTime - GetTimeMillis(); if (nToSleep <= 0) break; @@ -1523,7 +1525,7 @@ void ThreadCleanWalletPassphrase(void* parg) Sleep(nToSleep); ENTER_CRITICAL_SECTION(cs_nWalletUnlockTime); - } while(1); + }; if (nWalletUnlockTime) { @@ -1690,7 +1692,7 @@ public: obj.push_back(Pair("isscript", false)); if (mine == MINE_SPENDABLE) { pwalletMain->GetPubKey(keyID, vchPubKey); - obj.push_back(Pair("pubkey", HexStr(vchPubKey.Raw()))); + obj.push_back(Pair("pubkey", HexStr(vchPubKey.begin(), vchPubKey.end()))); obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed())); } return obj; @@ -1702,14 +1704,14 @@ public: if (mine == MINE_SPENDABLE) { CScript subscript; pwalletMain->GetCScript(scriptID, subscript); - std::vector addresses; + vector addresses; txnouttype whichType; int nRequired; ExtractDestinations(subscript, whichType, addresses, nRequired); obj.push_back(Pair("script", GetTxnOutputType(whichType))); obj.push_back(Pair("hex", HexStr(subscript.begin(), subscript.end()))); Array a; - BOOST_FOREACH(const CTxDestination& addr, addresses) + for(const auto& addr : addresses) a.push_back(CBitcoinAddress(addr).ToString()); obj.push_back(Pair("addresses", a)); if (whichType == TX_MULTISIG) @@ -1742,16 +1744,17 @@ Value validateaddress(const Array& params, bool fHelp) CMalleableKeyView view; bool isMine = pwalletMain->GetMalleableView(mpk, view); ret.push_back(Pair("ismine", isMine)); + ret.push_back(Pair("PubkeyPair", mpk.ToString())); if (isMine) ret.push_back(Pair("KeyView", view.ToString())); } else { - string currentAddress = address.ToString(); - CTxDestination dest = address.Get(); + auto currentAddress = address.ToString(); + auto dest = address.Get(); ret.push_back(Pair("address", currentAddress)); - isminetype mine = pwalletMain ? IsMine(*pwalletMain, address) : MINE_NO; + auto mine = IsMine(*pwalletMain, address); ret.push_back(Pair("ismine", mine != MINE_NO)); if (mine != MINE_NO) { ret.push_back(Pair("watchonly", mine == MINE_WATCH_ONLY)); @@ -1783,7 +1786,7 @@ Value reservebalance(const Array& params, bool fHelp) { if (params.size() == 1) throw runtime_error("must provide amount to reserve balance.\n"); - int64_t nAmount = AmountFromValue(params[1]); + auto nAmount = AmountFromValue(params[1]); nAmount = (nAmount / CENT) * CENT; // round to cent if (nAmount < 0) throw runtime_error("amount cannot be negative.\n"); @@ -1865,6 +1868,29 @@ Value resendtx(const Array& params, bool fHelp) return Value::null; } +Value resendwallettransactions(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 0) + throw runtime_error( + "resendwallettransactions\n" + "Immediately re-broadcast unconfirmed wallet transactions to all peers.\n" + "Intended only for testing; the wallet code periodically re-broadcasts\n" + "automatically.\n" + "Returns array of transaction ids that were re-broadcast.\n" + ); + + LOCK2(cs_main, pwalletMain->cs_wallet); + + auto txids = pwalletMain->ResendWalletTransactionsBefore(GetTime()); + Array result; + for(const auto& txid : txids) + { + result.push_back(txid.ToString()); + } + return result; +} + + // Make a public-private key pair Value makekeypair(const Array& params, bool fHelp) { @@ -1880,39 +1906,45 @@ Value makekeypair(const Array& params, bool fHelp) CKey key; key.MakeNewKey(true); - CPrivKey vchPrivKey = key.GetPrivKey(); + auto vchPrivKey = key.GetPrivKey(); Object result; result.push_back(Pair("PrivateKey", HexStr(vchPrivKey.begin(), vchPrivKey.end()))); bool fCompressed; - CSecret vchSecret = key.GetSecret(fCompressed); + auto vchSecret = key.GetSecret(fCompressed); + auto vchPubKey = key.GetPubKey(); result.push_back(Pair("Secret", HexStr(vchSecret.begin(), vchSecret.end()))); - result.push_back(Pair("PublicKey", HexStr(key.GetPubKey().Raw()))); + result.push_back(Pair("PublicKey", HexStr(vchPubKey.begin(), vchPubKey.end()))); return result; } Value newmalleablekey(const Array& params, bool fHelp) { - if (fHelp || params.size() > 0) + if (fHelp || params.size() > 1) throw runtime_error( "newmalleablekey\n" "Make a malleable public/private key pair.\n"); - if (!(fDebug || fTestNet) && GetTime() < SMALLDATA_SWITCH_TIME) - throw runtime_error("This feature has been disabled for mainNet clients"); + // Parse the account first so we don't generate a key if there's an error + string strAccount; + if (params.size() > 0) + strAccount = AccountFromValue(params[0]); - CMalleableKeyView keyView = pwalletMain->GenerateNewMalleableKey(); + auto keyView = pwalletMain->GenerateNewMalleableKey(); CMalleableKey mKey; if (!pwalletMain->GetMalleableKey(keyView, mKey)) throw runtime_error("Unable to generate new malleable key"); - CMalleablePubKey mPubKey = mKey.GetMalleablePubKey(); + auto mPubKey = mKey.GetMalleablePubKey(); + CBitcoinAddress address(mPubKey); + + pwalletMain->SetAddressBookName(address, strAccount); Object result; result.push_back(Pair("PublicPair", mPubKey.ToString())); result.push_back(Pair("PublicBytes", HexStr(mPubKey.Raw()))); - result.push_back(Pair("Address", CBitcoinAddress(mPubKey).ToString())); + result.push_back(Pair("Address", address.ToString())); result.push_back(Pair("KeyView", keyView.ToString())); return result; @@ -1929,7 +1961,7 @@ Value adjustmalleablekey(const Array& params, bool fHelp) malleableKey.SetString(params[0].get_str()); CKey privKeyVariant; - CPubKey vchPubKeyVariant = CPubKey(ParseHex(params[1].get_str())); + auto vchPubKeyVariant = CPubKey(ParseHex(params[1].get_str())); CPubKey R(ParseHex(params[2].get_str())); @@ -1939,7 +1971,7 @@ Value adjustmalleablekey(const Array& params, bool fHelp) Object result; bool fCompressed; - CSecret vchPrivKeyVariant = privKeyVariant.GetSecret(fCompressed); + auto vchPrivKeyVariant = privKeyVariant.GetSecret(fCompressed); result.push_back(Pair("PrivateKey", CBitcoinSecret(vchPrivKeyVariant, fCompressed).ToString())); @@ -1950,23 +1982,41 @@ Value adjustmalleablepubkey(const Array& params, bool fHelp) { if (fHelp || params.size() > 2 || params.size() == 0) throw runtime_error( - "adjustmalleablepubkey \n" - "Calculate new public key using provided malleable public key data.\n"); + "adjustmalleablepubkey \n" + "Calculate new public key using provided data.\n"); - string pubKeyPair = params[0].get_str(); + auto strData = params[0].get_str(); CMalleablePubKey malleablePubKey; - if (pubKeyPair.size() == 136) { - malleablePubKey.setvch(ParseHex(pubKeyPair)); - } else - malleablePubKey.SetString(pubKeyPair); + do + { + CBitcoinAddress addr(strData); + if (addr.IsValid() && addr.IsPair()) + { + // Initialize malleable pubkey with address data + malleablePubKey = CMalleablePubKey(addr.GetData()); + break; + } + CMalleableKeyView viewTmp(strData); + if (viewTmp.IsValid()) + { + // Shazaam, we have a valid key view here. + malleablePubKey = viewTmp.GetMalleablePubKey(); + break; + } + if (malleablePubKey.SetString(strData)) + break; // A valid public key pair + + throw runtime_error("Though your data seems a valid Base58 string, we were unable to recognize it."); + } + while(false); CPubKey R, vchPubKeyVariant; malleablePubKey.GetVariant(R, vchPubKeyVariant); Object result; - result.push_back(Pair("R", HexStr(R.Raw()))); - result.push_back(Pair("PubkeyVariant", HexStr(vchPubKeyVariant.Raw()))); + result.push_back(Pair("R", HexStr(R.begin(), R.end()))); + result.push_back(Pair("PubkeyVariant", HexStr(vchPubKeyVariant.begin(), vchPubKeyVariant.end()))); result.push_back(Pair("KeyVariantID", CBitcoinAddress(vchPubKeyVariant.GetID()).ToString())); return result; @@ -1979,14 +2029,12 @@ Value listmalleableviews(const Array& params, bool fHelp) "listmalleableviews\n" "Get list of views for generated malleable keys.\n"); - std::list keyViewList; + list keyViewList; pwalletMain->ListMalleableViews(keyViewList); Array result; - BOOST_FOREACH(const CMalleableKeyView &keyView, keyViewList) - { + for(const auto &keyView : keyViewList) result.push_back(keyView.ToString()); - } return result; }