X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Frpcdump.cpp;h=b0693ed27d559d0e710678739144b335e2c5c225;hb=9c9ba366ebc85b0d8eef6d962a9fa84cffe0cae7;hp=b734eb049e5129a081b56e986305538ad393a078;hpb=48564f02c4769f26295bedfc04b796246ad0d0bc;p=novacoin.git diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp index b734eb0..b0693ed 100644 --- a/src/rpcdump.cpp +++ b/src/rpcdump.cpp @@ -34,15 +34,21 @@ public: Value importprivkey(const Array& params, bool fHelp) { - if (fHelp || params.size() < 1 || params.size() > 2) + if (fHelp || params.size() < 1 || params.size() > 3) throw runtime_error( - "importprivkey [label]\n" + "importprivkey [label] [rescan=true]\n" "Adds a private key (as returned by dumpprivkey) to your wallet."); string strSecret = params[0].get_str(); string strLabel = ""; if (params.size() > 1) strLabel = params[1].get_str(); + + // Whether to perform rescan after import + bool fRescan = true; + if (params.size() > 2) + fRescan = params[2].get_bool(); + CBitcoinSecret vchSecret; bool fGood = vchSecret.SetString(strSecret); @@ -56,14 +62,28 @@ Value importprivkey(const Array& params, bool fHelp) key.SetSecret(secret, fCompressed); CKeyID vchAddress = key.GetPubKey().GetID(); { + LOCK2(cs_main, pwalletMain->cs_wallet); + pwalletMain->MarkDirty(); pwalletMain->SetAddressBookName(vchAddress, strLabel); + // Don't throw error in case a key is already there + if (pwalletMain->HaveKey(vchAddress)) + return Value::null; + + pwalletMain->mapKeyMetadata[vchAddress].nCreateTime = 1; + if (!pwalletMain->AddKey(key)) throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet"); - pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true); - pwalletMain->ReacceptWalletTransactions(); + // whenever a key is imported, we need to scan the whole chain + pwalletMain->nTimeFirstKey = 1; // 0 would be considered 'no value' + + if (fRescan) + { + pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true); + pwalletMain->ReacceptWalletTransactions(); + } } return Value::null; @@ -97,6 +117,7 @@ Value importaddress(const Array& params, bool fHelp) fRescan = params[2].get_bool(); { + LOCK2(cs_main, pwalletMain->cs_wallet); if (::IsMine(*pwalletMain, script) == MINE_SPENDABLE) throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this address or script"); @@ -152,6 +173,8 @@ Value removeaddress(const Array& params, bool fHelp) if (!pwalletMain->HaveWatchOnly(script)) throw JSONRPCError(RPC_WALLET_ERROR, "The wallet does not contain this address or script"); + LOCK2(cs_main, pwalletMain->cs_wallet); + pwalletMain->MarkDirty(); if (!pwalletMain->RemoveWatchOnly(script)) @@ -216,3 +239,49 @@ Value dumpwallet(const Array& params, bool fHelp) return Value::null; } + +Value dumpmalleablekey(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error ( + "dumpmalleablekey \n" + "Dump the private and public key pairs, which correspond to provided key view.\n"); + + CMalleableKey mKey; + CMalleableKeyView keyView; + keyView.SetString(params[0].get_str()); + + if (!pwalletMain->GetMalleableKey(keyView, mKey)) + throw runtime_error("There is no such item in the wallet"); + + Object result; + result.push_back(Pair("PrivatePair", mKey.ToString())); + result.push_back(Pair("PublicPair", mKey.GetMalleablePubKey().ToString())); + + return result; +} + +Value importmalleablekey(const Array& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error ( + "importmalleablekey \n" + "Imports the private key pair into your wallet.\n"); + + CMalleableKey mKey; + bool fSuccess = mKey.SetString(params[0].get_str()); + + Object result; + + if (fSuccess) + { + fSuccess = pwalletMain->AddMalleableKey(mKey); + result.push_back(Pair("Successful", fSuccess)); + result.push_back(Pair("PublicPair", mKey.GetMalleablePubKey().ToString())); + result.push_back(Pair("KeyView", CMalleableKeyView(mKey).ToString())); + } + else + result.push_back(Pair("Successful", false)); + + return result; +}