using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Novacoin { /// /// Available address types /// public enum AddrType { PUBKEY_ADDRESS = 8, SCRIPT_ADDRESS = 20, PUBKEY_ADDRESS_TEST = 111, SCRIPT_ADDRESS_TEST = 196 }; /// /// Represents novacoin address /// public class CNovacoinAddress { private byte nVersion; private List addrData; /// /// Initialize with custom data and version /// /// /// public CNovacoinAddress(byte nVersionIn, IEnumerable addrDataIn) { nVersion = nVersionIn; addrData = addrDataIn.ToList(); } /// /// Initialize new instance of PUBKEY_ADDRESS /// /// CKeyID instance public CNovacoinAddress(CKeyID keyID) { nVersion = (byte)AddrType.PUBKEY_ADDRESS; addrData = new List(keyID.hashBytes); } public CNovacoinAddress(string strNovacoinAddress) { addrData = AddressTools.Base58DecodeCheck(strNovacoinAddress).ToList(); nVersion = addrData[0]; addrData.RemoveAt(0); } /// /// Initialize new instance of SCRIPT_ADDRESS /// /// CScriptID instance public CNovacoinAddress(CScriptID scriptID) { nVersion = (byte)AddrType.SCRIPT_ADDRESS; addrData = new List(scriptID.hashBytes); } /// /// Basic sanity checking /// /// public bool IsValid { get { // Address data is normally generated by RIPEMD-160 hash function int nExpectedSize = 20; switch ((AddrType)nVersion) { case AddrType.PUBKEY_ADDRESS: nExpectedSize = 20; // Hash of public key break; case AddrType.SCRIPT_ADDRESS: nExpectedSize = 20; // Hash of CScript break; case AddrType.PUBKEY_ADDRESS_TEST: nExpectedSize = 20; break; case AddrType.SCRIPT_ADDRESS_TEST: nExpectedSize = 20; break; default: return false; } return addrData.Count == nExpectedSize; } } /// /// Generate base58 serialized representation of novacoin address /// /// Base58(data + checksum) public override string ToString() { List r = new List(); r.Add(nVersion); r.AddRange(addrData); return AddressTools.Base58EncodeCheck(r); } } }