Пример #1
0
        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");
        }
Пример #3
0
        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");
        }
Пример #5
0
        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");
        }
Пример #6
0
        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);
            }
        }