X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Frpcwallet.cpp;h=7ad807e23006319b14debebc83fd7ae805be47eb;hb=75744e6526193604bfbcc6be3a3793315556f12c;hp=6a7a3b101a544f1757dd869f8569391b7f338d1e;hpb=fe0f38a9dd454d2847bedc08c2bcad720b36116c;p=novacoin.git diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index 6a7a3b1..7ad807e 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -323,8 +323,14 @@ Value sendtoaddress(const Array& params, bool fHelp) " is a real and is rounded to the nearest " + FormatMoney(nMinimumInputValue) + HelpRequiringPassphrase()); - CBitcoinAddress address(params[0].get_str()); - if (!address.IsValid()) + // Parse address + CScript scriptPubKey; + string strAddress = params[0].get_str(); + + CBitcoinAddress address(strAddress); + if (address.IsValid()) + scriptPubKey.SetAddress(address); + else throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); // Amount @@ -343,7 +349,7 @@ 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->SendMoneyToDestination(address.Get(), nAmount, wtx); + string strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); if (strError != "") throw JSONRPCError(RPC_WALLET_ERROR, strError); @@ -695,9 +701,18 @@ Value sendfrom(const Array& params, bool fHelp) + HelpRequiringPassphrase()); string strAccount = AccountFromValue(params[0]); - CBitcoinAddress address(params[1].get_str()); - if (!address.IsValid()) + + // Parse address + CScript scriptPubKey; + string strAddress = params[0].get_str(); + + CBitcoinAddress address(strAddress); + if (address.IsValid()) + scriptPubKey.SetAddress(address); + else throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid NovaCoin address"); + + int64_t nAmount = AmountFromValue(params[2]); if (nAmount < nMinimumInputValue) @@ -722,7 +737,7 @@ Value sendfrom(const Array& params, bool fHelp) throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Account has insufficient funds"); // Send - string strError = pwalletMain->SendMoneyToDestination(address.Get(), nAmount, wtx); + string strError = pwalletMain->SendMoney(scriptPubKey, nAmount, wtx); if (strError != "") throw JSONRPCError(RPC_WALLET_ERROR, strError); @@ -759,12 +774,15 @@ Value sendmany(const Array& params, bool fHelp) if (!address.IsValid()) throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid NovaCoin address: ")+s.name_); - if (setAddress.count(address)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_); - setAddress.insert(address); + if (!address.IsPair()) + { + if (setAddress.count(address)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_); + setAddress.insert(address); + } CScript scriptPubKey; - scriptPubKey.SetDestination(address.Get()); + scriptPubKey.SetAddress(address); int64_t nAmount = AmountFromValue(s.value_); if (nAmount < nMinimumInputValue) @@ -1717,18 +1735,34 @@ Value validateaddress(const Array& params, bool fHelp) ret.push_back(Pair("isvalid", isValid)); if (isValid) { - CTxDestination dest = address.Get(); - string currentAddress = address.ToString(); - ret.push_back(Pair("address", currentAddress)); - isminetype mine = pwalletMain ? IsMine(*pwalletMain, dest) : MINE_NO; - ret.push_back(Pair("ismine", mine != MINE_NO)); - if (mine != MINE_NO) { - ret.push_back(Pair("watchonly", mine == MINE_WATCH_ONLY)); - Object detail = boost::apply_visitor(DescribeAddressVisitor(mine), dest); - ret.insert(ret.end(), detail.begin(), detail.end()); + if (address.IsPair()) + { + CMalleablePubKey mpk; + mpk.setvch(address.GetData()); + ret.push_back(Pair("ispair", true)); + + CMalleableKeyView view; + bool isMine = pwalletMain->GetMalleableView(mpk, view); + ret.push_back(Pair("ismine", isMine)); + + if (isMine) + ret.push_back(Pair("KeyView", view.ToString())); + } + else + { + CTxDestination dest = address.Get(); + string currentAddress = address.ToString(); + ret.push_back(Pair("address", currentAddress)); + isminetype mine = pwalletMain ? IsMine(*pwalletMain, dest) : MINE_NO; + ret.push_back(Pair("ismine", mine != MINE_NO)); + if (mine != MINE_NO) { + ret.push_back(Pair("watchonly", mine == MINE_WATCH_ONLY)); + Object detail = boost::apply_visitor(DescribeAddressVisitor(mine), dest); + ret.insert(ret.end(), detail.begin(), detail.end()); + } + if (pwalletMain->mapAddressBook.count(dest)) + ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest])); } - if (pwalletMain->mapAddressBook.count(dest)) - ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest])); } return ret; } @@ -1755,7 +1789,7 @@ Value reservebalance(const Array& params, bool fHelp) nAmount = (nAmount / CENT) * CENT; // round to cent if (nAmount < 0) throw runtime_error("amount cannot be negative.\n"); - mapArgs["-reservebalance"] = FormatMoney(nAmount).c_str(); + mapArgs["-reservebalance"] = FormatMoney(nAmount); } else { @@ -1866,17 +1900,22 @@ Value newmalleablekey(const Array& params, bool fHelp) "newmalleablekey\n" "Make a malleable public/private key pair.\n"); - CMalleableKey malleableKey; - malleableKey.MakeNewKeys(); - CMalleablePubKey malleablePubKey = malleableKey.GetMalleablePubKey(); + if (!(fDebug || fTestNet) && GetTime() < SMALLDATA_SWITCH_TIME) + throw runtime_error("This feature has been disabled for mainNet clients"); + + CMalleableKeyView keyView = pwalletMain->GenerateNewMalleableKey(); - CDataStream ssPublicBytes(SER_NETWORK, PROTOCOL_VERSION); - ssPublicBytes << malleablePubKey; + CMalleableKey mKey; + if (!pwalletMain->GetMalleableKey(keyView, mKey)) + throw runtime_error("Unable to generate new malleable key"); + + CMalleablePubKey mPubKey = mKey.GetMalleablePubKey(); Object result; - result.push_back(Pair("PrivatePair", malleableKey.ToString())); - result.push_back(Pair("PublicPair", malleablePubKey.ToString())); - result.push_back(Pair("PublicBytes", HexStr(ssPublicBytes.begin(), ssPublicBytes.end()))); + 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("KeyView", keyView.ToString())); return result; } @@ -1919,9 +1958,8 @@ Value adjustmalleablepubkey(const Array& params, bool fHelp) string pubKeyPair = params[0].get_str(); CMalleablePubKey malleablePubKey; - if (pubKeyPair.size() == 138) { - CDataStream ssPublicBytes(ParseHex(pubKeyPair), SER_NETWORK, PROTOCOL_VERSION); - ssPublicBytes >> malleablePubKey; + if (pubKeyPair.size() == 136) { + malleablePubKey.setvch(ParseHex(pubKeyPair)); } else malleablePubKey.SetString(pubKeyPair); @@ -1933,25 +1971,25 @@ Value adjustmalleablepubkey(const Array& params, bool fHelp) result.push_back(Pair("PubkeyVariant", HexStr(vchPubKeyVariant.Raw()))); result.push_back(Pair("KeyVariantID", CBitcoinAddress(vchPubKeyVariant.GetID()).ToString())); - return result; } -Value listmalleablepubkeys(const Array& params, bool fHelp) +Value listmalleableviews(const Array& params, bool fHelp) { if (fHelp || params.size() != 0) throw runtime_error( - "listmalleablepubkeys\n" - "Get list of malleable public keys.\n"); + "listmalleableviews\n" + "Get list of views for generated malleable keys.\n"); - std::list keyList; - pwalletMain->ListMalleablePubKeys(keyList); + std::list keyViewList; + pwalletMain->ListMalleableViews(keyViewList); Array result; - BOOST_FOREACH(const CMalleablePubKey &key, keyList) + BOOST_FOREACH(const CMalleableKeyView &keyView, keyViewList) { - result.push_back(key.ToString()); + result.push_back(keyView.ToString()); } return result; } +