Bugfix: Unspendable inputs handling
[novacoin.git] / src / keystore.cpp
index 18a3942..b4783ec 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "keystore.h"
 #include "script.h"
+#include "base58.h"
 
 extern bool fWalletUnlockMintOnly;
 
@@ -62,6 +63,28 @@ bool CBasicKeyStore::GetCScript(const CScriptID &hash, CScript& redeemScriptOut)
     return false;
 }
 
+bool CBasicKeyStore::AddWatchOnly(const CScript &dest)
+{
+    LOCK(cs_KeyStore);
+
+    CTxDestination address;
+    if (ExtractDestination(dest, address)) {
+        CKeyID keyID;
+        CBitcoinAddress(address).GetKeyID(keyID);
+        if (HaveKey(keyID))
+            return false;
+    }
+
+    setWatchOnly.insert(dest);
+    return true;
+}
+
+bool CBasicKeyStore::HaveWatchOnly(const CScript &dest) const
+{
+    LOCK(cs_KeyStore);
+    return setWatchOnly.count(dest) > 0;
+}
+
 bool CCryptoKeyStore::SetCrypted()
 {
     {
@@ -124,6 +147,13 @@ bool CCryptoKeyStore::AddKey(const CKey& key)
 {
     {
         LOCK(cs_KeyStore);
+
+        CScript script;
+        script.SetDestination(key.GetPubKey().GetID());
+
+        if (HaveWatchOnly(script))
+            return false;
+
         if (!IsCrypted())
             return CBasicKeyStore::AddKey(key);