ConnectInputs + stubs for GetCoinAge, GetMinFee and GetProofOfStakeReward.
[NovacoinLibrary.git] / Novacoin / StakeModifier.cs
index 67ed568..944fd36 100644 (file)
@@ -144,7 +144,7 @@ namespace Novacoin
             selectedCursor = null;
             foreach (var item in sortedByTimestamp)
             {
-                CBlockStoreItem cursor = CBlockStore.Instance.GetCursor(item.Item2);
+                CBlockStoreItem cursor = CBlockStore.Instance.GetMapCursor(item.Item2);
 
                 if (cursor == null)
                 {
@@ -298,7 +298,7 @@ namespace Novacoin
         static bool GetKernelStakeModifier(uint256 hashBlockFrom, ref long nStakeModifier, ref uint nStakeModifierHeight, ref uint nStakeModifierTime)
         {
             nStakeModifier = 0;
-            var cursorFrom = CBlockStore.Instance.GetCursor(hashBlockFrom);
+            var cursorFrom = CBlockStore.Instance.GetMapCursor(hashBlockFrom);
             if (cursorFrom == null)
             {
                 return false; // Block not indexed
@@ -401,7 +401,7 @@ namespace Novacoin
 
         internal static uint GetStakeModifierChecksum(CBlockStoreItem itemTemplate)
         {
-            Contract.Assert(itemTemplate.prev != null || (uint256)itemTemplate.Hash == NetUtils.nHashGenesisBlock);
+            Contract.Assert(itemTemplate.prev != null || (uint256)itemTemplate.Hash == NetInfo.nHashGenesisBlock);
 
             // Hash previous checksum with flags, hashProofOfStake and nStakeModifier
             MemoryStream ss = new MemoryStream();
@@ -443,16 +443,34 @@ namespace Novacoin
             CTxIn txin = tx.vin[0];
 
             // Read block header
-            
+
+            long nBlockPos = 0;
             CBlock block = null;
-            CTransaction txPrev = null;
-            long nBlockPos = 0, nTxPos = 0;
-            
-            if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, ref block, ref txPrev, ref nBlockPos, ref nTxPos))
+            if (!CBlockStore.Instance.GetBlockByTransactionID(txin.prevout.hash, ref block, ref nBlockPos))
             {
                 return false; // unable to read block of previous transaction
             }
 
+            long nTxPos = 0;
+            CTransaction txPrev = null;
+
+            // Iterate through vtx array
+            for (var i = 0; i < block.vtx.Length; i++)
+            {
+                if (block.vtx[i].Hash == txin.prevout.hash)
+                {
+                    txPrev = block.vtx[i];
+                    nTxPos = nBlockPos + block.GetTxOffset(i);
+
+                    break;
+                }
+            }
+
+            if (txPrev == null)
+            {
+                return false; // No such transaction found in the block
+            }
+
             if (!ScriptCode.VerifyScript(txin.scriptSig, txPrev.vout[txin.prevout.n].scriptPubKey, tx, 0, (int)scriptflag.SCRIPT_VERIFY_P2SH, 0))
             {
                 return false; // vin[0] signature check failed