Example #1
0
        /// <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}");
            }
        }
Example #2
0
        /// <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));
        }
Example #3
0
        /// <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));
        }
Example #4
0
        /// <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");
        }
Example #5
0
        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");
        }
Example #6
0
        /// <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}");
        }
Example #7
0
        /// <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));
        }
Example #8
0
 /// <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));
 }