Additional CNovacoinAddress verification.
[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         /// <summary>
50         /// Initialize new instance of SCRIPT_ADDRESS
51         /// </summary>
52         /// <param name="keyID">CScriptID instance</param>
53         public CNovacoinAddress(CScriptID scriptID)
54         {
55             nVersion = (byte)AddrType.SCRIPT_ADDRESS;
56             addrData = new List<byte>(scriptID.hashBytes);
57         }
58
59         /// <summary>
60         /// Basic sanity checking
61         /// </summary>
62         /// <returns></returns>
63         public bool IsValid()
64         {
65             // Address data is normally generated by RIPEMD-160 hash function
66             int nExpectedSize = 20;
67
68             switch ((AddrType) nVersion)
69             {
70                 case AddrType.PUBKEY_ADDRESS:
71                     nExpectedSize = 20; // Hash of public key
72                     break;
73                 case AddrType.SCRIPT_ADDRESS:
74                     nExpectedSize = 20; // Hash of CScript
75                     break;
76                 case AddrType.PUBKEY_ADDRESS_TEST:
77                     nExpectedSize = 20;
78                     break;
79                 case AddrType.SCRIPT_ADDRESS_TEST:
80                     nExpectedSize = 20;
81                     break;
82                 default:
83                     return false;
84             }
85
86             return addrData.Count == nExpectedSize;
87         }
88
89         /// <summary>
90         /// Generate base58 serialized representation of novacoin address
91         /// </summary>
92         /// <returns>Base58(data + checksum)</returns>
93         public override string ToString()
94         {
95             List<byte> r = new List<byte>();
96
97             r.Add(nVersion);
98             r.AddRange(addrData);
99
100             return AddressTools.Base58EncodeCheck(r.ToArray());
101         }
102     }
103 }