Novacoin address generation
[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     public enum AddrType
10     {
11         PUBKEY_ADDRESS = 8,
12         SCRIPT_ADDRESS = 20,
13         PUBKEY_ADDRESS_TEST = 111,
14         SCRIPT_ADDRESS_TEST = 196
15     };
16
17     public class CNovacoinAddress
18     {
19         private byte nVersion;
20         private List<byte> addrData;
21
22         public CNovacoinAddress(byte nVersionIn, IEnumerable<byte> addrDataIn)
23         {
24             nVersion = nVersionIn;
25             addrData = addrDataIn.ToList();
26         }
27
28         public CNovacoinAddress(CKeyID keyID)
29         {
30             nVersion = (byte)AddrType.PUBKEY_ADDRESS;
31             addrData = new List<byte>(keyID.hashBytes);
32         }
33
34         public CNovacoinAddress(CScriptID scriptID)
35         {
36             nVersion = (byte)AddrType.SCRIPT_ADDRESS;
37             addrData = new List<byte>(scriptID.hashBytes);
38         }
39
40         public static byte[] ConcatAddress(byte[] RipeHash, byte[] Checksum)
41         {
42             byte[] ret = new byte[RipeHash.Length + 4];
43             Array.Copy(RipeHash, ret, RipeHash.Length);
44             Array.Copy(Checksum, 0, ret, RipeHash.Length, 4);
45             return ret;
46         }
47
48         public bool IsValid()
49         {
50             int nExpectedSize = 20;
51
52             switch ((AddrType) nVersion)
53             {
54                 case AddrType.PUBKEY_ADDRESS:
55                     nExpectedSize = 20; // Hash of public key
56                     break;
57                 case AddrType.SCRIPT_ADDRESS:
58                     nExpectedSize = 20; // Hash of CScript
59                     break;
60                 case AddrType.PUBKEY_ADDRESS_TEST:
61                     nExpectedSize = 20;
62                     break;
63                 case AddrType.SCRIPT_ADDRESS_TEST:
64                     nExpectedSize = 20;
65                     break;
66                 default:
67                     return false;
68             }
69
70             return addrData.Count == nExpectedSize;
71         }
72
73         public override string ToString()
74         {
75             List<byte> r = new List<byte>();
76
77             byte[] checkSum = Hash256.Compute256(addrData).hashBytes;
78             Array.Resize(ref checkSum, 4);
79
80             r.Add(nVersion);
81             r.AddRange(addrData);
82             r.AddRange(checkSum);
83
84             return AddressTools.Base58Encode(r.ToArray());
85         }
86     }
87 }