예제 #1
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (!typeof(DerivationStrategyBase).GetTypeInfo().IsAssignableFrom(bindingContext.ModelType))
            {
                return(Task.CompletedTask);
            }

            ValueProviderResult val = bindingContext.ValueProvider.GetValue(
                bindingContext.ModelName);

            if (val == null)
            {
                return(Task.CompletedTask);
            }

            string key = val.FirstValue as string;

            if (key == null)
            {
                return(Task.CompletedTask);
            }

            var network = (Network)bindingContext.HttpContext.RequestServices.GetService(typeof(Network));
            var data    = new DerivationStrategy.DerivationStrategyFactory(network).Parse(key);

            if (!bindingContext.ModelType.IsInstanceOfType(data))
            {
                throw new FormatException("Invalid destination type");
            }
            bindingContext.Result = ModelBindingResult.Success(data);
            return(Task.CompletedTask);
        }
예제 #2
0
        public void CanParseDerivationScheme()
        {
            var network = Network.Main;
            var factory = new DerivationStrategy.DerivationStrategyFactory(network);
            var tata    = new BitcoinExtPubKey("xpub661MyMwAqRbcFiadHioAunPTeic3C17HKPABCBvURz3W2ivn63jzEYYXWpDePLGncjLuRvQKx7jrKweSkoEvgQTvAo5zw4z8HPGC8Y4E4Wr", network);
            var toto    = new BitcoinExtPubKey("xpub661MyMwAqRbcFqyJE6zy5jMF7bjUtvNHgHJPbENEZtEQKRrukKWJP5xLMKntBaNya7CLMLL6u1KEk8GnrEv8pur5DFSgEMf1hRGjsJrcQKS", network);

            var direct = (DirectDerivationStrategy)factory.Parse($"{toto}-[legacy]");

            Assert.Equal($"{toto}-[legacy]", direct.ToString());
            var generated = Generate(direct);

            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Null(generated.Redeem);

            var p2wpkh = (DirectDerivationStrategy)factory.Parse($"{toto}");

            Assert.Equal($"{toto}", p2wpkh.ToString());
            generated = Generate(p2wpkh);
            Assert.Null(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.ScriptPubKey);

            var p2shp2wpkh = (P2SHDerivationStrategy)factory.Parse($"{toto}-[p2sh]");

            generated = Generate(p2shp2wpkh);
            Assert.NotNull(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.Redeem);

            //Same thing as above, reversed attribute
            p2shp2wpkh = (P2SHDerivationStrategy)factory.Parse($"{toto}-[p2sh]");
            Assert.Equal($"{toto}-[p2sh]", p2shp2wpkh.ToString());
            Assert.NotNull(generated.Redeem);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey.Hash.ScriptPubKey, generated.ScriptPubKey);
            Assert.Equal(toto.ExtPubKey.Derive(new KeyPath("0/1")).PubKey.WitHash.ScriptPubKey, generated.Redeem);

            var multiSig = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[legacy]");

            generated = Generate(multiSig);
            Assert.Equal(new Script("2 025ca59b2007a67f24fdd26acefbe8feb5e8849c207d504b16d4801a8290fe9409 03d15f88de692693e0c25cec27b68da49ae4c29805efbe08154c4acfdf951ccb54 2 OP_CHECKMULTISIG"), generated.Redeem);
            multiSig = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[legacy]-[keeporder]");
            Assert.Equal($"2-of-{toto}-{tata}-[legacy]-[keeporder]", multiSig.ToString());
            generated = Generate(multiSig);
            Assert.Equal(new Script("2 03d15f88de692693e0c25cec27b68da49ae4c29805efbe08154c4acfdf951ccb54 025ca59b2007a67f24fdd26acefbe8feb5e8849c207d504b16d4801a8290fe9409 2 OP_CHECKMULTISIG"), generated.Redeem);

            var multiP2SH = (P2WSHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}");

            Assert.Equal($"2-of-{toto}-{tata}", multiP2SH.ToString());
            generated = Generate(multiP2SH);
            Assert.IsType <WitScriptId>(generated.ScriptPubKey.GetDestination());
            Assert.NotNull(PayToMultiSigTemplate.Instance.ExtractScriptPubKeyParameters(generated.Redeem));

            var multiP2WSHP2SH = (P2SHDerivationStrategy)factory.Parse($"2-of-{toto}-{tata}-[p2sh]");

            Assert.Equal($"2-of-{toto}-{tata}-[p2sh]", multiP2WSHP2SH.ToString());
            generated = Generate(multiP2WSHP2SH);
            Assert.IsType <ScriptId>(generated.ScriptPubKey.GetDestination());
            Assert.NotNull(PayToMultiSigTemplate.Instance.ExtractScriptPubKeyParameters(generated.Redeem));
        }
예제 #3
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (!typeof(DerivationStrategyBase).GetTypeInfo().IsAssignableFrom(bindingContext.ModelType))
            {
                return(Task.CompletedTask);
            }

            ValueProviderResult val = bindingContext.ValueProvider.GetValue(
                bindingContext.ModelName);

            if (val == null)
            {
                return(Task.CompletedTask);
            }

            string key = val.FirstValue as string;

            if (key == null)
            {
                return(Task.CompletedTask);
            }

            var networkProvider = (NBXplorer.NBXplorerNetworkProvider)bindingContext.HttpContext.RequestServices.GetService(typeof(NBXplorer.NBXplorerNetworkProvider));
            var cryptoCode      = bindingContext.ValueProvider.GetValue("cryptoCode").FirstValue;
            var network         = networkProvider.GetFromCryptoCode((cryptoCode ?? "BTC"));

            try
            {
                var data = new DerivationStrategy.DerivationStrategyFactory(network.NBitcoinNetwork).Parse(key);
                if (!bindingContext.ModelType.IsInstanceOfType(data))
                {
                    throw new FormatException("Invalid destination type");
                }
                bindingContext.Result = ModelBindingResult.Success(data);
            }
            catch {
                //throw new FormatException("Wrong scheme!");
                var data = Parse(key, network.NBitcoinNetwork);
                if (!bindingContext.ModelType.IsInstanceOfType(data))
                {
                    throw new FormatException("Invalid destination type");
                }
                bindingContext.Result = ModelBindingResult.Success(data);
            }
            return(Task.CompletedTask);
        }
예제 #4
0
 public static bool TryParse(ReadOnlySpan <char> strSpan, out DerivationSchemeTrackedSource derivationSchemeTrackedSource, Network network)
 {
     if (strSpan == null)
     {
         throw new ArgumentNullException(nameof(strSpan));
     }
     if (network == null)
     {
         throw new ArgumentNullException(nameof(network));
     }
     derivationSchemeTrackedSource = null;
     if (!strSpan.StartsWith("DERIVATIONSCHEME:".AsSpan(), StringComparison.Ordinal))
     {
         return(false);
     }
     try
     {
         var factory          = new DerivationStrategy.DerivationStrategyFactory(network);
         var derivationScheme = factory.Parse(strSpan.Slice("DERIVATIONSCHEME:".Length).ToString());
         derivationSchemeTrackedSource = new DerivationSchemeTrackedSource(derivationScheme);
         return(true);
     }
     catch { return(false); }
 }
 public DerivationStrategyJsonConverter(DerivationStrategy.DerivationStrategyFactory factory)
 {
     Factory = factory;
 }