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