New constructor for block header class
[NovacoinLibrary.git] / Novacoin / CNovacoinAddress.cs
1 \feffusing System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace Novacoin
8 {
9     /// <summary>
10     /// Available address types
11     /// </summary>
12     public enum AddrType
13     {
14         PUBKEY_ADDRESS = 8,
15         SCRIPT_ADDRESS = 20,
16         PUBKEY_ADDRESS_TEST = 111,
17         SCRIPT_ADDRESS_TEST = 196
18     };
19
20     /// <summary>
21     /// Represents novacoin address
22     /// </summary>
23     public class CNovacoinAddress
24     {
25         private byte nVersion;
26         private List<byte> addrData;
27
28         /// <summary>
29         /// Initialize with custom data and version
30         /// </summary>
31         /// <param name="nVersionIn"></param>
32         /// <param name="addrDataIn"></param>
33         public CNovacoinAddress(byte nVersionIn, IEnumerable<byte> addrDataIn)
34         {
35             nVersion = nVersionIn;
36             addrData = addrDataIn.ToList();
37         }
38
39         /// <summary>
40         /// Initialize new instance of PUBKEY_ADDRESS
41         /// </summary>
42         /// <param name="keyID">CKeyID instance</param>
43         public CNovacoinAddress(CKeyID keyID)
44         {
45             nVersion = (byte)AddrType.PUBKEY_ADDRESS;
46             addrData = new List<byte>(keyID.hashBytes);
47         }
48
49         public CNovacoinAddress(string strNovacoinAddress)
50         {
51             addrData = AddressTools.Base58DecodeCheck(strNovacoinAddress).ToList();
52
53             nVersion = addrData[0];
54             addrData.RemoveAt(0);
55         }
56
57         /// <summary>
58         /// Initialize new instance of SCRIPT_ADDRESS
59         /// </summary>
60         /// <param name="keyID">CScriptID instance</param>
61         public CNovacoinAddress(CScriptID scriptID)
62         {
63             nVersion = (byte)AddrType.SCRIPT_ADDRESS;
64             addrData = new List<byte>(scriptID.hashBytes);
65         }
66
67         /// <summary>
68         /// Basic sanity checking
69         /// </summary>
70         public bool IsValid
71         {
72             get
73             {
74                 // Address data is normally generated by RIPEMD-160 hash function
75                 int nExpectedSize = 20;
76
77                 switch ((AddrType)nVersion)
78                 {
79                     case AddrType.PUBKEY_ADDRESS:
80                         nExpectedSize = 20; // Hash of public key
81                         break;
82                     case AddrType.SCRIPT_ADDRESS:
83                         nExpectedSize = 20; // Hash of CScript
84                         break;
85                     case AddrType.PUBKEY_ADDRESS_TEST:
86                         nExpectedSize = 20;
87                         break;
88                     case AddrType.SCRIPT_ADDRESS_TEST:
89                         nExpectedSize = 20;
90                         break;
91                     default:
92                         return false;
93                 }
94
95                 return addrData.Count == nExpectedSize;
96             }
97         }
98
99         /// <summary>
100         /// Generate base58 serialized representation of novacoin address
101         /// </summary>
102         /// <returns>Base58(data + checksum)</returns>
103         public override string ToString()
104         {
105             List<byte> r = new List<byte>();
106
107             r.Add(nVersion);
108             r.AddRange(addrData);
109
110             return AddressTools.Base58EncodeCheck(r);
111         }
112     }
113 }