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