text: // Copyright (c) 2009-2012 Bitcoin Developers
  // Copyright (c) 2012-2015 The Peercoin developers
  // Copyright (c) 2014-2015 The Dumpstercoin developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #include "init.h" // for pwalletMain
  #include "bitcoinrpc.h"
  #include "ui_interface.h"
  #include "base58.h"
  
  #include <boost/lexical_cast.hpp>
  
  #include "json/json_spirit_reader_template.h"
  #include "json/json_spirit_writer_template.h"
  #include "json/json_spirit_utils.h"
  
  #define printf OutputDebugStringF
  
  using namespace json_spirit;
  using namespace std;
  
  extern Object JSONRPCError(int code, const string& message);
  
  class CTxDump
  {
  public:
      CBlockIndex *pindex;
      int64 nValue;
      bool fSpent;
      CWalletTx* ptx;
      int nOut;
      CTxDump(CWalletTx* ptx = NULL, int nOut = -1)
      {
          pindex = NULL;
          nValue = 0;
          fSpent = false;
          this->ptx = ptx;
          this->nOut = nOut;
      }
  };
  
  Value importprivkey(const Array& params, bool fHelp)
  {
      if (fHelp || params.size() < 1 || params.size() > 2)
          throw runtime_error(
              "importprivkey <paycoinprivkey> [label]\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();
      CBitcoinSecret vchSecret;
      bool fGood = vchSecret.SetString(strSecret);
  
      if (!fGood) throw JSONRPCError(-5,"Invalid private key");
      if (pwalletMain->IsLocked())
          throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
      if (fWalletUnlockMintOnly) // paycoin: no importprivkey in mint-only mode
          throw JSONRPCError(-102, "Wallet is unlocked for minting only (unlock with walletpassphrase).");
  
      CKey key;
      bool fCompressed;
      CSecret secret = vchSecret.GetSecret(fCompressed);
      key.SetSecret(secret, fCompressed);
      CKeyID vchAddress = key.GetPubKey().GetID();
      {
          LOCK2(cs_main, pwalletMain->cs_wallet);
  
          pwalletMain->MarkDirty();
          pwalletMain->SetAddressBookName(vchAddress, strLabel);
  
          if (!pwalletMain->AddKey(key))
              throw JSONRPCError(-4,"Error adding key to wallet");
  
          pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true);
          pwalletMain->ReacceptWalletTransactions();
      }
  
      MainFrameRepaint();
  
      return Value::null;
  }
  
  Value dumpprivkey(const Array& params, bool fHelp)
  {
      if (fHelp || params.size() != 1)
          throw runtime_error(
              "dumpprivkey <paycoinaddress>\n"
              "Reveals the private key corresponding to <paycoinaddress>.");
  
      string strAddress = params[0].get_str();
      CBitcoinAddress address;
      if (!address.SetString(strAddress))
          throw JSONRPCError(-5, "Invalid Dumpstercoin address");
      if (pwalletMain->IsLocked())
          throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.");
      if (fWalletUnlockMintOnly) // paycoin: no dumpprivkey in mint-only mode
          throw JSONRPCError(-102, "Wallet is unlocked for minting only (unlock with walletpassphrase).");
      CKeyID keyID;
      if (!address.GetKeyID(keyID))
          throw JSONRPCError(-3, "Address does not refer to a key");
      CSecret vchSecret;
      bool fCompressed;
      if (!pwalletMain->GetSecret(keyID, vchSecret, fCompressed))
          throw JSONRPCError(-4,"Private key for address " + strAddress + " is not known");
      return CBitcoinSecret(vchSecret, fCompressed).ToString();
  }
  