/// <summary> /// Decodes the given address into its constituting hash, format, network and type /// </summary> /// <param name="address">A valid Bitcoin Cash address in any format</param> /// <returns></returns> private static BchAddrData DecodeBase58Address(string address) { var payload = Encoders.Base58Check.DecodeData(address); var versionByte = payload[0]; var hash = payload.Skip(1).ToArray(); switch (versionByte) { case 0: return(BchAddrData.Create(CashFormat.Legacy, CashNetwork.Mainnet, CashType.P2PKH, hash)); case 5: return(BchAddrData.Create(CashFormat.Legacy, CashNetwork.Mainnet, CashType.P2SH, hash)); case 111: return(BchAddrData.Create(CashFormat.Legacy, CashNetwork.Testnet, CashType.P2PKH, hash)); case 196: return(BchAddrData.Create(CashFormat.Legacy, CashNetwork.Testnet, CashType.P2SH, hash)); case 28: return(BchAddrData.Create(CashFormat.Bitpay, CashNetwork.Mainnet, CashType.P2PKH, hash)); case 40: return(BchAddrData.Create(CashFormat.Bitpay, CashNetwork.Mainnet, CashType.P2SH, hash)); default: throw new Validation.ValidationError($"Invalid address type in version byte: {versionByte}"); } }
/// <summary> /// Encodes the given decoded address into cashaddr format /// </summary> /// <param name="decoded"></param> /// <returns></returns> public static string EncodeAsCashaddr(BchAddrData decoded) { var prefix = GetCashaddrkPrefix(decoded); var type = decoded.Type == CashType.P2PKH ? "P2PKH" : "P2SH"; var hash = decoded.Hash; return(CashAddr.Encode(prefix, type, hash)); }
/// <summary> /// Encodes the given decoded address into bitpay format /// </summary> /// <param name="decoded"></param> /// <returns></returns> public static string EncodeAsBitpay(BchAddrData decoded) { var versionByte = GetVersionByte(CashFormat.Bitpay, decoded.Network, decoded.Type); var buffer = new byte[1] { versionByte }; buffer = buffer.Concat(decoded.Hash).ToArray(); return(Encoders.Base58Check.EncodeData(buffer)); }
/// <summary> /// Encodes the given decoded address into cashaddr format without a prefix /// </summary> /// <param name="decoded"></param> /// <returns></returns> public static string EncodeAsCashaddrNoPrefix(BchAddrData decoded) { var address = EncodeAsCashaddr(decoded); if (address.IndexOf(":") != -1) { return(address.Split(':')[1]); } throw new Validation.ValidationError($"Invalid BchAddrData"); }
public static string GetCashaddrkPrefix(BchAddrData data) { switch (data.Network) { case CashNetwork.Mainnet: return("bitcoincash"); case CashNetwork.Testnet: return("bchtest"); case CashNetwork.RegTest: return("bchreg"); } throw new Validation.ValidationError($"Invalid BchAddrData"); }
/// <summary> /// Attempts to decode the given address assuming it is a cashaddr address with explicit prefix /// </summary> /// <param name="address">A valid Bitcoin Cash address in any format</param> /// <returns></returns> private static BchAddrData DecodeCashAddressWithPrefix(string address) { var decoded = CashAddr.Decode(address); var type = decoded.Type == "P2PKH" ? CashType.P2PKH : CashType.P2SH; switch (decoded.Prefix) { case "bitcoincash": return(BchAddrData.Create(CashFormat.Cashaddr, CashNetwork.Mainnet, type, decoded.Hash)); case "bchtest": return(BchAddrData.Create(CashFormat.Cashaddr, CashNetwork.Testnet, type, decoded.Hash)); case "regtest": return(BchAddrData.Create(CashFormat.Cashaddr, CashNetwork.RegTest, type, decoded.Hash)); } throw new Validation.ValidationError($"Invalid address {address}"); }
/// <summary> /// Attempts to decode the given address assuming it is a cashaddr address with explicit prefix /// </summary> /// <param name="address">A valid Bitcoin Cash address in any format</param> /// <returns></returns> private static BchAddrData DecodeCashAddressWithPrefix(string address, Network network) { var decoded = CashAddr.Decode(address); return(BchAddrData.Create(CashFormat.Cashaddr, network, decoded.Type, decoded.Hash)); }
/// <summary> /// Encodes the given decoded address into cashaddr format /// </summary> /// <param name="decoded"></param> /// <returns></returns> public static string EncodeAsCashaddr(BchAddrData decoded) { return(CashAddr.Encode(decoded.Prefix, decoded.Type, decoded.Hash)); }