410de4470b6a23643fe120d539d312ff89ec74c4
[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         /// <returns></returns>
71         public bool IsValid
72         {
73             get
74             {
75                 // Address data is normally generated by RIPEMD-160 hash function
76                 int nExpectedSize = 20;
77
78                 switch ((AddrType)nVersion)
79                 {
80                     case AddrType.PUBKEY_ADDRESS:
81                         nExpectedSize = 20; // Hash of public key
82                         break;
83                     case AddrType.SCRIPT_ADDRESS:
84                         nExpectedSize = 20; // Hash of CScript
85                         break;
86                     case AddrType.PUBKEY_ADDRESS_TEST:
87                         nExpectedSize = 20;
88                         break;
89                     case AddrType.SCRIPT_ADDRESS_TEST:
90                         nExpectedSize = 20;
91                         break;
92                     default:
93                         return false;
94                 }
95
96                 return addrData.Count == nExpectedSize;
97             }
98         }
99
100         /// <summary>
101         /// Generate base58 serialized representation of novacoin address
102         /// </summary>
103         /// <returns>Base58(data + checksum)</returns>
104         public override string ToString()
105         {
106             List<byte> r = new List<byte>();
107
108             r.Add(nVersion);
109             r.AddRange(addrData);
110
111             return AddressTools.Base58EncodeCheck(r);
112         }
113     }
114 }