/** * Novacoin classes library * Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ using System.Collections.Generic; using System.Linq; using System; using System.Diagnostics.Contracts; 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 byte[] addrData = new byte[20]; /// /// Initialize with custom data and version /// /// /// public CNovacoinAddress(byte nVersionIn, byte[] addrDataIn) { Contract.Requires(addrDataIn.Length == 20, "Your data doesn't look like a valid hash160 of some value."); nVersion = nVersionIn; addrDataIn.CopyTo(addrData, 0); } /// /// Initialize new instance of PUBKEY_ADDRESS /// /// CKeyID instance public CNovacoinAddress(CKeyID keyID) { nVersion = (byte)AddrType.PUBKEY_ADDRESS; addrData = keyID; } /// /// Initialize new instance of SCRIPT_ADDRESS /// /// CScriptID instance public CNovacoinAddress(CScriptID scriptID) { nVersion = (byte)AddrType.SCRIPT_ADDRESS; addrData = scriptID; } /// /// Initialize new instance from base58 string /// /// public CNovacoinAddress(string strNovacoinAddress) { var RawAddrData = AddressTools.Base58DecodeCheck(strNovacoinAddress); if (RawAddrData.Length != 21) { throw new ArgumentException("Though you have provided a correct Base58 representation of some data, this data doesn't represent a valid Novacoin address."); } nVersion = RawAddrData[0]; Array.Copy(RawAddrData, 1, addrData, 0, 20); } /// /// 20 bytes, Hash160 of script or public key /// public static implicit operator byte[](CNovacoinAddress addr) { return addr.addrData; } /// /// 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.Length == nExpectedSize; } } /// /// Generate base58 serialized representation of novacoin address /// /// Base58(data + checksum) public override string ToString() { var r = new List(); r.Add(nVersion); r.AddRange(addrData); return AddressTools.Base58EncodeCheck(r.ToArray()); } } }