/**
* 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());
}
}
}