text: // Copyright (c) 2009-2012 Bitcoin Developers
  // Distributed under the MIT/X11 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>
  
  #define printf OutputDebugStringF
  
  using namespace json_spirit;
  using namespace std;
  
  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 <CosmicCodeprivkey> [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(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key");
      if (fWalletUnlockMintOnly) // ppcoin: no importprivkey in mint-only mode
          throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Wallet is unlocked for minting only.");
  
      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(RPC_WALLET_ERROR, "Error adding key to wallet");
  
          pwalletMain->ScanForWalletTransactions(pindexGenesisBlock, true);
          pwalletMain->ReacceptWalletTransactions();
      }
  
      return Value::null;
  }
  
  Value dumpprivkey(const Array& params, bool fHelp)
  {
      if (fHelp || params.size() != 1)
          throw runtime_error(
              "dumpprivkey <CosmicCodeaddress>\n"
              "Reveals the private key corresponding to <CosmicCodeaddress>.");
  
      string strAddress = params[0].get_str();
      CBitcoinAddress address;
      if (!address.SetString(strAddress))
          throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid CosmicCode address");
      if (fWalletUnlockMintOnly) // ppcoin: no dumpprivkey in mint-only mode
          throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Wallet is unlocked for minting only.");
      CKeyID keyID;
      if (!address.GetKeyID(keyID))
          throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to a key");
      CSecret vchSecret;
      bool fCompressed;
      if (!pwalletMain->GetSecret(keyID, vchSecret, fCompressed))
          throw JSONRPCError(RPC_WALLET_ERROR, "Private key for address " + strAddress + " is not known");
      return CBitcoinSecret(vchSecret, fCompressed).ToString();
  }
  