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 base58, ref Network expectedNetwork, ref PubKey blinding, ref TxDestination hash) { if (base58 == null) { throw new ArgumentNullException("base58"); } var networks = expectedNetwork == null?Network.GetNetworks() : new[] { expectedNetwork }; var data = Encoders.Base58Check.DecodeData(base58); foreach (var network in networks) { bool isP2SH = false; var versionBytes = network.GetVersionBytes(Base58Type.BLINDED_ADDRESS, false); if (versionBytes == null || !data.StartWith(versionBytes)) { continue; } var innerData = data.Skip(versionBytes.Length).ToArray(); var versionBytes2 = network.GetVersionBytes(Base58Type.PUBKEY_ADDRESS, false); if (!innerData.StartWith(versionBytes2)) { versionBytes2 = network.GetVersionBytes(Base58Type.SCRIPT_ADDRESS, false); if (!innerData.StartWith(versionBytes2)) { continue; } isP2SH = true; } if (innerData.Length != versionBytes2.Length + 33 + 20) { continue; } try { blinding = new PubKey(innerData.SafeSubarray(versionBytes2.Length, 33)); var h = innerData.SafeSubarray(versionBytes2.Length + 33, 20); hash = isP2SH ? (TxDestination) new ScriptId(h) : new KeyId(h); } catch (FormatException) { continue; } expectedNetwork = network; return(base58); } throw new FormatException("Invalid BitcoinBlindedAddress"); }
public static MoneyUnit MoneyUnit(string moneyUnitName) { foreach (Network network in Network.GetNetworks()) { if (network.MoneyUnits == null) { continue; } MoneyUnit moneyUnit = network.MoneyUnits.GetMoneyUnit(moneyUnitName); if (moneyUnit != null) { return(moneyUnit); } } throw new ArgumentOutOfRangeException("moneyUnitName", $"The '{moneyUnitName}' money unit is unknown among the networks."); }
private static string Validate(string base58, ref Network expectedNetwork) { if (base58 == null) { throw new ArgumentNullException(nameof(base58)); } var networks = expectedNetwork == null?Network.GetNetworks() : new[] { expectedNetwork }; var data = (expectedNetwork == null ? Encoders.Base58Check : expectedNetwork.NetworkStringParser.GetBase58CheckEncoder()).DecodeData(base58); foreach (var network in networks) { var versionBytes = network.GetVersionBytes(Base58Type.PUBKEY_ADDRESS, false); if (versionBytes != null && data.StartWith(versionBytes)) { if (data.Length == versionBytes.Length + 20) { expectedNetwork = network; return(base58); } } } throw new FormatException("Invalid BitcoinPubKeyAddress"); }
private static string Validate(string base58, ref Network expectedNetwork) { if (base58 == null) { throw new ArgumentNullException("base58"); } var networks = expectedNetwork == null?Network.GetNetworks() : new[] { expectedNetwork }; var data = Encoders.Base58Check.DecodeData(base58); foreach (var network in networks) { var versionBytes = network.GetVersionBytes(Base58Type.SCRIPT_ADDRESS, false); if (versionBytes != null && data.StartWith(versionBytes)) { if (data.Length == versionBytes.Length + 20) { expectedNetwork = network; return(base58); } } } throw new FormatException("Invalid BitcoinScriptAddress"); }
public static bool TryParseDefault(Network network, string amount, out Money nRet) { nRet = null; Network[] networksToCheck = (network == null ? Network.GetNetworks().ToArray() : new Network[] { network }); string[] amountAndUnit = amount.Split(' '); if ((amountAndUnit.Length != 1) && (amountAndUnit.Length != 2)) { return(false); } MoneyUnit moneyUnit = null; if (amountAndUnit.Length == 2) { foreach (Network unitsNetwork in networksToCheck) { if (unitsNetwork == null) { continue; } moneyUnit = unitsNetwork.MoneyUnits.Units.FirstOrDefault(mu => mu.Name.ToLowerInvariant() == amountAndUnit[1].ToLowerInvariant()); if (moneyUnit != null) { break; } } } if (moneyUnit == null) { moneyUnit = MoneyUnit.AtomicUnit; } decimal value; if (!decimal.TryParse(amountAndUnit[0], BitcoinStyle, CultureInfo.InvariantCulture, out value)) { return(false); } if (value < 0) { throw new FormatException("The money amount must be a positive number."); return(false); } if ((value * moneyUnit.Multiplier) - Math.Truncate(value * moneyUnit.Multiplier) > 0) { throw new FormatException("The money amount is defined in ambigous format. This could mean that you didn't use a unit name, or you used a value which is not properly expressable on the current network. Try to use unit names (like '0.12 BTC') or round the amount to have less decimal places. "); return(false); } try { nRet = new Money(value, moneyUnit); return(true); } catch (OverflowException) { return(false); } catch (ArgumentException) { return(false); } }