using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 List addrData;
///
/// Initialize with custom data and version
///
///
///
public CNovacoinAddress(byte nVersionIn, IEnumerable addrDataIn)
{
nVersion = nVersionIn;
addrData = addrDataIn.ToList();
}
///
/// Initialize new instance of PUBKEY_ADDRESS
///
/// CKeyID instance
public CNovacoinAddress(CKeyID keyID)
{
nVersion = (byte)AddrType.PUBKEY_ADDRESS;
addrData = new List(keyID.hashBytes);
}
public CNovacoinAddress(string strNovacoinAddress)
{
addrData = AddressTools.Base58DecodeCheck(strNovacoinAddress).ToList();
nVersion = addrData[0];
addrData.RemoveAt(0);
}
///
/// Initialize new instance of SCRIPT_ADDRESS
///
/// CScriptID instance
public CNovacoinAddress(CScriptID scriptID)
{
nVersion = (byte)AddrType.SCRIPT_ADDRESS;
addrData = new List(scriptID.hashBytes);
}
///
/// 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.Count == nExpectedSize;
}
}
///
/// Generate base58 serialized representation of novacoin address
///
/// Base58(data + checksum)
public override string ToString()
{
List r = new List();
r.Add(nVersion);
r.AddRange(addrData);
return AddressTools.Base58EncodeCheck(r);
}
}
}