Beispiel #1
0
        public static bool IsValid(string bech32, ref Network expectedNetwork)
        {
            if (bech32 == null)
            {
                throw new ArgumentNullException("bech32");
            }

            var encoder = expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_SCRIPT_ADDRESS, false);

            if (encoder == null)
            {
                return(false);
            }
            try
            {
                byte witVersion;
                var  data = encoder.Decode(bech32, out witVersion);
                if (data.Length == 32 && witVersion == 0)
                {
                    return(true);
                }
            }
            catch (FormatException) { }
            return(false);
        }
        private static string Validate(string bech32, ref Network expectedNetwork)
        {
            if (bech32 == null)
            {
                throw new ArgumentNullException("bech32");
            }
            var networks = expectedNetwork == null?Network.GetNetworks() : new[] { expectedNetwork };

            foreach (var network in networks)
            {
                var encoder = expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false);
                if (encoder == null)
                {
                    continue;
                }
                try
                {
                    byte witVersion;
                    var  data = encoder.Decode(bech32, out witVersion);
                    if (data.Length == 20 && witVersion == 0)
                    {
                        return(bech32);
                    }
                }
                catch (Bech32FormatException) { throw; }
                catch (FormatException) { continue; }
            }
            throw new FormatException("Invalid BitcoinWitPubKeyAddress");
        }
Beispiel #3
0
        private static string Validate(string bech32, Network expectedNetwork)
        {
            if (bech32 == null)
            {
                throw new ArgumentNullException(nameof(bech32));
            }
            if (expectedNetwork == null)
            {
                throw new ArgumentNullException(nameof(expectedNetwork));
            }

            if (expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false) is Bech32Encoder encoder)
            {
                try
                {
                    byte witVersion;
                    var  data = encoder.Decode(bech32, out witVersion);
                    if (data.Length == 20 && witVersion == 0)
                    {
                        return(bech32);
                    }
                }
                catch (Bech32FormatException) { throw; }
                catch (FormatException) { }
            }
            throw new FormatException("Invalid BitcoinWitPubKeyAddress");
        }
        public BitcoinWitScriptAddress(string bech32, Network expectedNetwork = null)
            : base(Validate(bech32, ref expectedNetwork), expectedNetwork)
        {
            var  encoder = expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_SCRIPT_ADDRESS, true);
            byte witVersion;
            var  decoded = encoder.Decode(bech32, out witVersion);

            _Hash = new WitScriptId(decoded);
        }
        public BitcoinWitPubKeyAddress(string bech32, Network expectedNetwork)
            : base(Validate(bech32, ref expectedNetwork), expectedNetwork)
        {
            var  encoder = expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, true);
            byte witVersion;
            var  decoded = encoder.Decode(bech32, out witVersion);

            _Hash = new WitKeyId(decoded);
        }
Beispiel #6
0
 internal static string CreateBech32(Bech32Type type, byte[] bytes, byte witnessVersion, Network network)
 {
     if (network == null)
         throw new ArgumentNullException("network");
     if (bytes == null)
         throw new ArgumentNullException("bytes");
     Bech32Encoder encoder = network.GetBech32Encoder(type, true);
     return encoder.Encode(witnessVersion, bytes);
 }
Beispiel #7
0
 public BitcoinWitScriptAddress(string bech32, Network expectedNetwork)
     : base(Validate(bech32, expectedNetwork), expectedNetwork)
 {
     if (expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_SCRIPT_ADDRESS, false) is Bech32Encoder encoder)
     {
         var decoded = encoder.Decode(bech32, out _);
         _Hash = new WitScriptId(decoded);
     }
     else
     {
         throw expectedNetwork.Bech32NotSupported(Bech32Type.WITNESS_SCRIPT_ADDRESS);
     }
 }
 public BitcoinWitPubKeyAddress(string bech32, Network expectedNetwork)
     : base(Validate(bech32, expectedNetwork), expectedNetwork)
 {
     if (expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false) is Bech32Encoder encoder)
     {
         byte witVersion;
         var  decoded = encoder.Decode(bech32, out witVersion);
         _Hash = new WitKeyId(decoded);
     }
     else
     {
         throw expectedNetwork.Bech32NotSupported(Bech32Type.WITNESS_PUBKEY_ADDRESS);
     }
 }
Beispiel #9
0
 public static T ToNetwork <T>(this T obj, Network network) where T : IBitcoinString
 {
     if (network == null)
     {
         throw new ArgumentNullException(nameof(network));
     }
     if (obj == null)
     {
         throw new ArgumentNullException(nameof(obj));
     }
     if (obj.Network == network)
     {
         return(obj);
     }
     if (obj is IBase58Data)
     {
         var b58 = (IBase58Data)obj;
         if (b58.Type != Base58Type.COLORED_ADDRESS)
         {
             byte[] version   = network.GetVersionBytes(b58.Type, true);
             var    enc       = network.NetworkStringParser.GetBase58CheckEncoder();
             var    inner     = enc.DecodeData(b58.ToString()).Skip(version.Length).ToArray();
             var    newBase58 = enc.EncodeData(version.Concat(inner).ToArray());
             return(Network.Parse <T>(newBase58, network));
         }
         else
         {
             var colored = BitcoinColoredAddress.GetWrappedBase58(obj.ToString(), obj.Network);
             var address = Network.Parse <BitcoinAddress>(colored, obj.Network).ToNetwork(network);
             return((T)(object)address.ToColoredAddress());
         }
     }
     else if (obj is IBech32Data)
     {
         var  b32     = (IBech32Data)obj;
         var  encoder = b32.Network.GetBech32Encoder(b32.Type, true);
         byte wit;
         var  data = encoder.Decode(b32.ToString(), out wit);
         encoder = network.GetBech32Encoder(b32.Type, true);
         var str = encoder.Encode(wit, data);
         return((T)(object)Network.Parse <T>(str, network));
     }
     else
     {
         throw new NotSupportedException();
     }
 }
        public static bool IsValid(string bech32, ref Network expectedNetwork, out Exception exception)
        {
            exception = null;

            if (bech32 == null)
            {
                exception = new ArgumentNullException("bech32");
                return(false);
            }

            var encoder = expectedNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false);

            if (encoder == null)
            {
                return(false);
            }

            try
            {
                byte witVersion;
                var  data = encoder.Decode(bech32, out witVersion);
                if (data.Length == 20 && witVersion == 0)
                {
                    return(true);
                }
            }
            catch (Bech32FormatException bech32FormatException)
            {
                exception = bech32FormatException;
                return(false);
            }
            catch (FormatException)
            {
                exception = new FormatException("Invalid BitcoinWitPubKeyAddress");
                return(false);
            }

            exception = new FormatException("Invalid BitcoinWitScriptAddress");
            return(false);
        }
Beispiel #11
0
        public static new TaprootAddress Create(string bech32, Network expectedNetwork)
        {
            if (bech32 is null)
            {
                throw new ArgumentNullException(nameof(bech32));
            }
            if (expectedNetwork is null)
            {
                throw new ArgumentNullException(nameof(expectedNetwork));
            }
            bech32 = bech32.ToLowerInvariant();
            if (expectedNetwork.GetBech32Encoder(Bech32Type.TAPROOT_ADDRESS, false) is Bech32Encoder encoder)
            {
                var decoded = encoder.Decode(bech32, out var v);
#if HAS_SPAN
                if (v == 1 && ECXOnlyPubKey.TryCreate(decoded, out var k))
                {
                    return(new TaprootAddress(bech32, new TaprootPubKey(k), expectedNetwork));
                }
                else
                {
                    throw new FormatException("Invalid TaprootAddress");
                }
#else
                if (v == 1 && decoded.Length == 32)
                {
                    return(new TaprootAddress(bech32, new TaprootPubKey(decoded), expectedNetwork));
                }
                else
                {
                    throw new FormatException("Invalid TaprootAddress");
                }
#endif
            }
            else
            {
                throw expectedNetwork.Bech32NotSupported(Bech32Type.TAPROOT_ADDRESS);
            }
        }
Beispiel #12
0
        public static T ToNetwork <T>(this T obj, Network network) where T : IBitcoinString
        {
            if (network == null)
            {
                throw new ArgumentNullException("network");
            }
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }
            if (obj.Network == network)
            {
                return(obj);
            }
            if (obj is IBase58Data)
            {
                var b58 = (IBase58Data)obj;

                byte[] version   = network.GetVersionBytes(b58.Type, true);
                byte[] inner     = Encoders.Base58Check.DecodeData(b58.ToString()).Skip(version.Length).ToArray();
                string newBase58 = Encoders.Base58Check.EncodeData(version.Concat(inner).ToArray());
                return(Network.Parse <T>(newBase58, network));
            }
            else if (obj is IBech32Data)
            {
                var           b32     = (IBech32Data)obj;
                Bech32Encoder encoder = b32.Network.GetBech32Encoder(b32.Type, true);
                byte          wit;
                byte[]        data = encoder.Decode(b32.ToString(), out wit);
                encoder = network.GetBech32Encoder(b32.Type, true);
                string str = encoder.Encode(wit, data);
                return((T)(object)Network.Parse <T>(str, network));
            }
            else
            {
                throw new NotSupportedException();
            }
        }