using System.Collections.Generic;
using System.IO;
using System.Diagnostics.Contracts;
+using System.Numerics;
namespace Novacoin
{
public class CTransaction
{
/// <summary>
+ /// One cent = 10000 satoshis.
+ /// </summary>
+ public const ulong nCent = 10000;
+
+ /// <summary>
/// One coin = 1000000 satoshis.
/// </summary>
public const ulong nCoin = 1000000;
/// </summary>
public const uint nMaxTxSize = 250000;
+ public enum MinFeeMode
+ {
+ GMF_BLOCK,
+ GMF_RELAY,
+ GMF_SEND,
+ }
+
/// <summary>
/// Version of transaction schema.
/// </summary>
}
if (nBlockTime == 0)
{
- nBlockTime = NetUtils.GetAdjustedTime();
+ nBlockTime = NetInfo.GetAdjustedTime();
}
- if (nLockTime < (nLockTime < NetUtils.nLockTimeThreshold ? nBlockHeight : nBlockTime))
+ if (nLockTime < (nLockTime < NetInfo.nLockTimeThreshold ? nBlockHeight : nBlockTime))
{
return true;
}
}
return true;
}
-
+
/// <summary>
/// Parse byte sequence and initialize new instance of CTransaction
/// </summary>
/// <summary>
/// Amount of novacoins spent by this transaction.
/// </summary>
- public ulong ValueOut
+ public ulong nValueOut
{
get
{
}
public static bool MoneyRange(ulong nValue) { return (nValue <= nMaxMoney); }
+
+ /// <summary>
+ /// Get total sigops.
+ /// </summary>
+ /// <param name="inputs">Inputs map.</param>
+ /// <returns>Amount of sigops.</returns>
+ public uint GetP2SHSigOpCount(ref Dictionary<COutPoint, TxOutItem> inputs)
+ {
+ if (IsCoinBase)
+ {
+ return 0;
+ }
+
+ uint nSigOps = 0;
+ for (var i = 0; i < vin.Length; i++)
+ {
+ var prevout = GetOutputFor(vin[i], ref inputs);
+ if (prevout.scriptPubKey.IsPayToScriptHash)
+ {
+ nSigOps += prevout.scriptPubKey.GetSigOpCount(vin[i].scriptSig);
+ }
+ }
+
+ return nSigOps;
+ }
+
+ /// <summary>
+ /// Get sum of inputs spent by this transaction.
+ /// </summary>
+ /// <param name="inputs">Reference to innputs map.</param>
+ /// <returns>Sum of inputs.</returns>
+ public ulong GetValueIn(ref Dictionary<COutPoint, TxOutItem> inputs)
+ {
+ if (IsCoinBase)
+ {
+ return 0;
+ }
+
+ ulong nResult = 0;
+ for (int i = 0; i < vin.Length; i++)
+ {
+ nResult += GetOutputFor(vin[i], ref inputs).nValue;
+ }
+
+ return nResult;
+ }
+
+ /// <summary>
+ /// Helper method to find output in the map.
+ /// </summary>
+ /// <param name="input">Transaction input.</param>
+ /// <param name="inputs">eference to inuts map.</param>
+ /// <returns>Parent output.</returns>
+ private CTxOut GetOutputFor(CTxIn input, ref Dictionary<COutPoint, TxOutItem> inputs)
+ {
+ if (!inputs.ContainsKey(input.prevout))
+ {
+ throw new Exception("No such input");
+ }
+
+ var outItem = inputs[input.prevout];
+
+ return new CTxOut(outItem.nValue, outItem.scriptPubKey);
+ }
+
+ internal bool GetCoinAge(ref Dictionary<COutPoint, TxOutItem> inputs, out ulong nCoinAge)
+ {
+ throw new NotImplementedException();
+ }
+
+ internal static ulong GetMinFee(int v1, bool v2, MinFeeMode gMF_BLOCK, int nTxSize)
+ {
+ throw new NotImplementedException();
+ }
}
}