public async Task <IActionResult> AddDerivationScheme(string storeId, string cryptoCode) { var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } DerivationSchemeViewModel vm = new DerivationSchemeViewModel(); vm.CryptoCode = cryptoCode; vm.RootKeyPath = network.GetRootKeyPath(); vm.Network = network; var derivation = GetExistingDerivationStrategy(vm.CryptoCode, store); if (derivation != null) { vm.DerivationScheme = derivation.AccountDerivation.ToString(); vm.Config = derivation.ToJson(); } vm.Enabled = !store.GetStoreBlob().IsExcluded(new PaymentMethodId(vm.CryptoCode, PaymentTypes.BTCLike)); vm.CanUseHotWallet = await CanUseHotWallet(); return(View(vm)); }
private void SetExistingValues(StoreData store, DerivationSchemeViewModel vm) { var derivation = GetExistingDerivationStrategy(vm.CryptoCode, store); if (derivation != null) { vm.DerivationScheme = derivation.AccountDerivation.ToString(); vm.Config = derivation.ToJson(); } vm.Enabled = !store.GetStoreBlob().IsExcluded(new PaymentMethodId(vm.CryptoCode, PaymentTypes.BTCLike)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, string selectedScheme = null) { selectedScheme = selectedScheme ?? "BTC"; var store = await _Repo.FindStore(storeId, GetUserId()); if (store == null) { return(NotFound()); } DerivationSchemeViewModel vm = new DerivationSchemeViewModel(); vm.SetCryptoCurrencies(_ExplorerProvider, selectedScheme); return(View(vm)); }
private IActionResult ShowAddresses(DerivationSchemeViewModel vm, DerivationStrategy strategy) { vm.DerivationScheme = strategy.DerivationStrategyBase.ToString(); if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var line = strategy.DerivationStrategyBase.GetLineFor(DerivationFeature.Deposit); for (int i = 0; i < 10; i++) { var address = line.Derive((uint)i); vm.AddressSamples.Add((DerivationStrategyBase.GetKeyPath(DerivationFeature.Deposit).Derive((uint)i).ToString(), address.ScriptPubKey.GetDestinationAddress(strategy.Network.NBitcoinNetwork).ToString())); } } vm.Confirmation = true; return(View(vm)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, string cryptoCode) { var store = await _Repo.FindStore(storeId, GetUserId()); if (store == null) { return(NotFound()); } DerivationSchemeViewModel vm = new DerivationSchemeViewModel(); vm.ServerUrl = GetStoreUrl(storeId); vm.CryptoCode = cryptoCode; SetExistingValues(store, vm); return(View(vm)); }
private IActionResult ShowAddresses(DerivationSchemeViewModel vm, DerivationSchemeSettings strategy) { vm.DerivationScheme = strategy.AccountDerivation.ToString(); var deposit = new NBXplorer.KeyPathTemplates(null).GetKeyPathTemplate(DerivationFeature.Deposit); if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var line = strategy.AccountDerivation.GetLineFor(deposit); for (int i = 0; i < 10; i++) { var address = line.Derive((uint)i); vm.AddressSamples.Add((deposit.GetKeyPath((uint)i).ToString(), address.ScriptPubKey.GetDestinationAddress(strategy.Network.NBitcoinNetwork).ToString())); } } vm.Confirmation = true; ModelState.Remove(nameof(vm.Config)); // Remove the cached value return(View(vm)); }
public IActionResult AddDerivationScheme(string storeId, string cryptoCode) { var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } DerivationSchemeViewModel vm = new DerivationSchemeViewModel(); vm.CryptoCode = cryptoCode; vm.RootKeyPath = network.GetRootKeyPath(); SetExistingValues(store, vm); return(View(vm)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, string cryptoCode) { var store = await _Repo.FindStore(storeId, GetUserId()); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } DerivationSchemeViewModel vm = new DerivationSchemeViewModel(); vm.ServerUrl = GetStoreUrl(storeId); vm.CryptoCode = cryptoCode; vm.RootKeyPath = network.GetRootKeyPath(); SetExistingValues(store, vm); return(View(vm)); }
ShowAddresses(DerivationSchemeViewModel vm, DerivationSchemeSettings strategy) { vm.DerivationScheme = strategy.AccountDerivation.ToString(); var deposit = new NBXplorer.KeyPathTemplates(null).GetKeyPathTemplate(DerivationFeature.Deposit); if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var line = strategy.AccountDerivation.GetLineFor(deposit); for (int i = 0; i < 10; i++) { var keyPath = deposit.GetKeyPath((uint)i); var rootedKeyPath = vm.GetAccountKeypath()?.Derive(keyPath); var derivation = line.Derive((uint)i); var address = strategy.Network.NBXplorerNetwork.CreateAddress(strategy.AccountDerivation, line.KeyPathTemplate.GetKeyPath((uint)i), derivation.ScriptPubKey).ToString(); vm.AddressSamples.Add((keyPath.ToString(), address, rootedKeyPath)); } } vm.Confirmation = true; ModelState.Remove(nameof(vm.Config)); // Remove the cached value return(View(nameof(AddDerivationScheme), vm)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, DerivationSchemeViewModel vm, string cryptoCode) { vm.CryptoCode = cryptoCode; var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } vm.Network = network; vm.RootKeyPath = network.GetRootKeyPath(); DerivationSchemeSettings strategy = null; var wallet = _WalletProvider.GetWallet(network); if (wallet == null) { return(NotFound()); } if (!string.IsNullOrEmpty(vm.Config)) { if (!DerivationSchemeSettings.TryParseFromJson(vm.Config, network, out strategy)) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Message = "Config file was not in the correct format" }); vm.Confirmation = false; return(View(vm)); } } if (vm.ColdcardPublicFile != null) { if (!DerivationSchemeSettings.TryParseFromColdcard(await ReadAllText(vm.ColdcardPublicFile), network, out strategy)) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Message = "Coldcard public file was not in the correct format" }); vm.Confirmation = false; return(View(vm)); } } else { try { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var newStrategy = ParseDerivationStrategy(vm.DerivationScheme, null, network); if (newStrategy.AccountDerivation != strategy?.AccountDerivation) { var accountKey = string.IsNullOrEmpty(vm.AccountKey) ? null : new BitcoinExtPubKey(vm.AccountKey, network.NBitcoinNetwork); if (accountKey != null) { var accountSettings = newStrategy.AccountKeySettings.FirstOrDefault(a => a.AccountKey == accountKey); if (accountSettings != null) { accountSettings.AccountKeyPath = vm.KeyPath == null ? null : KeyPath.Parse(vm.KeyPath); accountSettings.RootFingerprint = string.IsNullOrEmpty(vm.RootFingerprint) ? (HDFingerprint?)null : new HDFingerprint(NBitcoin.DataEncoders.Encoders.Hex.DecodeData(vm.RootFingerprint)); } } strategy = newStrategy; strategy.Source = vm.Source; vm.DerivationScheme = strategy.AccountDerivation.ToString(); } } else { strategy = null; } } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); vm.Confirmation = false; return(View(vm)); } } var oldConfig = vm.Config; vm.Config = strategy == null ? null : strategy.ToJson(); PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); var exisingStrategy = store.GetSupportedPaymentMethods(_NetworkProvider) .Where(c => c.PaymentId == paymentMethodId) .OfType <DerivationSchemeSettings>() .FirstOrDefault(); var storeBlob = store.GetStoreBlob(); var wasExcluded = storeBlob.GetExcludedPaymentMethods().Match(paymentMethodId); var willBeExcluded = !vm.Enabled; var showAddress = // Show addresses if: // - If the user is testing the hint address in confirmation screen (vm.Confirmation && !string.IsNullOrWhiteSpace(vm.HintAddress)) || // - The user is clicking on continue after changing the config (!vm.Confirmation && oldConfig != vm.Config) || // - The user is clickingon continue without changing config nor enabling/disabling (!vm.Confirmation && oldConfig == vm.Config && willBeExcluded == wasExcluded); showAddress = showAddress && strategy != null; if (!showAddress) { try { if (strategy != null) { await wallet.TrackAsync(strategy.AccountDerivation); } store.SetSupportedPaymentMethod(paymentMethodId, strategy); storeBlob.SetExcluded(paymentMethodId, willBeExcluded); store.SetStoreBlob(storeBlob); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); return(View(vm)); } await _Repo.UpdateStore(store); if (willBeExcluded != wasExcluded) { var label = willBeExcluded ? "disabled" : "enabled"; TempData[WellKnownTempData.SuccessMessage] = $"On-Chain payments for {network.CryptoCode} has been {label}."; } else { TempData[WellKnownTempData.SuccessMessage] = $"Derivation settings for {network.CryptoCode} has been modified."; } return(RedirectToAction(nameof(UpdateStore), new { storeId = storeId })); } else if (!string.IsNullOrEmpty(vm.HintAddress)) { BitcoinAddress address = null; try { address = BitcoinAddress.Create(vm.HintAddress, network.NBitcoinNetwork); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Invalid hint address"); return(ShowAddresses(vm, strategy)); } try { var newStrategy = ParseDerivationStrategy(vm.DerivationScheme, address.ScriptPubKey, network); if (newStrategy.AccountDerivation != strategy.AccountDerivation) { strategy.AccountDerivation = newStrategy.AccountDerivation; strategy.AccountOriginal = null; } } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Impossible to find a match with this address"); return(ShowAddresses(vm, strategy)); } vm.HintAddress = ""; TempData[WellKnownTempData.SuccessMessage] = "Address successfully found, please verify that the rest is correct and click on \"Confirm\""; ModelState.Remove(nameof(vm.HintAddress)); ModelState.Remove(nameof(vm.DerivationScheme)); } return(ShowAddresses(vm, strategy)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, DerivationSchemeViewModel vm, string cryptoCode) { vm.CryptoCode = cryptoCode; var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } vm.RootKeyPath = network.GetRootKeyPath(); var wallet = _WalletProvider.GetWallet(network); if (wallet == null) { return(NotFound()); } PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); var exisingStrategy = store.GetSupportedPaymentMethods(_NetworkProvider) .Where(c => c.PaymentId == paymentMethodId) .OfType <DerivationStrategy>() .Select(c => c.DerivationStrategyBase.ToString()) .FirstOrDefault(); DerivationStrategy strategy = null; try { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { strategy = ParseDerivationStrategy(vm.DerivationScheme, null, network); vm.DerivationScheme = strategy.ToString(); } } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); vm.Confirmation = false; return(View(vm)); } var storeBlob = store.GetStoreBlob(); var wasExcluded = storeBlob.GetExcludedPaymentMethods().Match(paymentMethodId); var willBeExcluded = !vm.Enabled; var showAddress = // Show addresses if: // - If the user is testing the hint address in confirmation screen (vm.Confirmation && !string.IsNullOrWhiteSpace(vm.HintAddress)) || // - The user is setting a new derivation scheme (!vm.Confirmation && strategy != null && exisingStrategy != strategy.DerivationStrategyBase.ToString()) || // - The user is clicking on continue without changing anything (!vm.Confirmation && willBeExcluded == wasExcluded); showAddress = showAddress && strategy != null; if (!showAddress) { try { if (strategy != null) { await wallet.TrackAsync(strategy.DerivationStrategyBase); } store.SetSupportedPaymentMethod(paymentMethodId, strategy); storeBlob.SetExcluded(paymentMethodId, willBeExcluded); store.SetStoreBlob(storeBlob); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); return(View(vm)); } await _Repo.UpdateStore(store); StatusMessage = $"Derivation scheme for {network.CryptoCode} has been modified."; return(RedirectToAction(nameof(UpdateStore), new { storeId = storeId })); } else if (!string.IsNullOrEmpty(vm.HintAddress)) { BitcoinAddress address = null; try { address = BitcoinAddress.Create(vm.HintAddress, network.NBitcoinNetwork); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Invalid hint address"); return(ShowAddresses(vm, strategy)); } try { strategy = ParseDerivationStrategy(vm.DerivationScheme, address.ScriptPubKey, network); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Impossible to find a match with this address"); return(ShowAddresses(vm, strategy)); } vm.HintAddress = ""; vm.StatusMessage = "Address successfully found, please verify that the rest is correct and click on \"Confirm\""; ModelState.Remove(nameof(vm.HintAddress)); ModelState.Remove(nameof(vm.DerivationScheme)); } return(ShowAddresses(vm, strategy)); }
private void SetExistingValues(StoreData store, DerivationSchemeViewModel vm) { vm.DerivationScheme = GetExistingDerivationStrategy(vm.CryptoCode, store)?.DerivationStrategyBase.ToString(); vm.Enabled = !store.GetStoreBlob().IsExcluded(new PaymentMethodId(vm.CryptoCode, PaymentTypes.BTCLike)); }
public async Task <IActionResult> AddDerivationScheme(string storeId, DerivationSchemeViewModel vm, string cryptoCode) { vm.ServerUrl = GetStoreUrl(storeId); vm.CryptoCode = cryptoCode; var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } vm.RootKeyPath = network.GetRootKeyPath(); var wallet = _WalletProvider.GetWallet(network); if (wallet == null) { return(NotFound()); } PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); DerivationStrategy strategy = null; try { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { strategy = ParseDerivationStrategy(vm.DerivationScheme, null, network); vm.DerivationScheme = strategy.ToString(); } } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); vm.Confirmation = false; return(View(vm)); } if (!vm.Confirmation && strategy != null) { return(ShowAddresses(vm, strategy)); } if (vm.Confirmation && !string.IsNullOrWhiteSpace(vm.HintAddress)) { BitcoinAddress address = null; try { address = BitcoinAddress.Create(vm.HintAddress, network.NBitcoinNetwork); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Invalid hint address"); return(ShowAddresses(vm, strategy)); } try { strategy = ParseDerivationStrategy(vm.DerivationScheme, address.ScriptPubKey, network); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Impossible to find a match with this address"); return(ShowAddresses(vm, strategy)); } vm.HintAddress = ""; vm.StatusMessage = "Address successfully found, please verify that the rest is correct and click on \"Confirm\""; ModelState.Remove(nameof(vm.HintAddress)); ModelState.Remove(nameof(vm.DerivationScheme)); return(ShowAddresses(vm, strategy)); } else { try { if (strategy != null) { await wallet.TrackAsync(strategy.DerivationStrategyBase); } store.SetSupportedPaymentMethod(paymentMethodId, strategy); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); return(View(vm)); } await _Repo.UpdateStore(store); StatusMessage = $"Derivation scheme for {network.CryptoCode} has been modified."; return(RedirectToAction(nameof(UpdateStore), new { storeId = storeId })); } }
private void SetExistingValues(StoreData store, DerivationSchemeViewModel vm) { vm.DerivationScheme = GetExistingDerivationStrategy(vm.CryptoCode, store)?.DerivationStrategyBase.ToString(); }
public async Task <IActionResult> AddDerivationScheme(string storeId, DerivationSchemeViewModel vm, string selectedScheme = null) { selectedScheme = selectedScheme ?? "BTC"; var store = await _Repo.FindStore(storeId, GetUserId()); if (store == null) { return(NotFound()); } var network = vm.CryptoCurrency == null ? null : _ExplorerProvider.GetNetwork(vm.CryptoCurrency); vm.SetCryptoCurrencies(_ExplorerProvider, selectedScheme); if (network == null) { ModelState.AddModelError(nameof(vm.CryptoCurrency), "Invalid network"); return(View(vm)); } var wallet = _WalletProvider.GetWallet(network); if (wallet == null) { ModelState.AddModelError(nameof(vm.CryptoCurrency), "Invalid network"); return(View(vm)); } DerivationStrategyBase strategy = null; try { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { strategy = ParseDerivationStrategy(vm.DerivationScheme, vm.DerivationSchemeFormat, network); vm.DerivationScheme = strategy.ToString(); } store.SetDerivationStrategy(network, vm.DerivationScheme); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); vm.Confirmation = false; return(View(vm)); } if (strategy == null || vm.Confirmation) { try { if (strategy != null) { await wallet.TrackAsync(strategy); } store.SetDerivationStrategy(network, vm.DerivationScheme); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Invalid Derivation Scheme"); return(View(vm)); } await _Repo.UpdateStore(store); StatusMessage = $"Derivation scheme for {network.CryptoCode} has been modified."; return(RedirectToAction(nameof(UpdateStore), new { storeId = storeId })); } else { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var line = strategy.GetLineFor(DerivationFeature.Deposit); for (int i = 0; i < 10; i++) { var address = line.Derive((uint)i); vm.AddressSamples.Add((DerivationStrategyBase.GetKeyPath(DerivationFeature.Deposit).Derive((uint)i).ToString(), address.ScriptPubKey.GetDestinationAddress(network.NBitcoinNetwork).ToString())); } } vm.Confirmation = true; return(View(vm)); } }
public async Task <IActionResult> AddDerivationScheme(string storeId, DerivationSchemeViewModel vm, string cryptoCode) { vm.CryptoCode = cryptoCode; var store = HttpContext.GetStoreData(); if (store == null) { return(NotFound()); } var network = cryptoCode == null ? null : _ExplorerProvider.GetNetwork(cryptoCode); if (network == null) { return(NotFound()); } vm.RootKeyPath = network.GetRootKeyPath(); DerivationSchemeSettings strategy = null; var wallet = _WalletProvider.GetWallet(network); if (wallet == null) { return(NotFound()); } if (!string.IsNullOrEmpty(vm.Config)) { if (!DerivationSchemeSettings.TryParseFromJson(vm.Config, network, out strategy)) { vm.StatusMessage = new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Message = "El archivo de configuración no estaba en el formato correcto" }.ToString(); vm.Confirmation = false; return(View(vm)); } } if (vm.ColdcardPublicFile != null) { if (!DerivationSchemeSettings.TryParseFromColdcard(await ReadAllText(vm.ColdcardPublicFile), network, out strategy)) { vm.StatusMessage = new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Message = "El archivo público de Coldcard no estaba en el formato correcto" }.ToString(); vm.Confirmation = false; return(View(vm)); } } else { try { if (!string.IsNullOrEmpty(vm.DerivationScheme)) { var newStrategy = ParseDerivationStrategy(vm.DerivationScheme, null, network); if (newStrategy.AccountDerivation != strategy?.AccountDerivation) { var accountKey = string.IsNullOrEmpty(vm.AccountKey) ? null : new BitcoinExtPubKey(vm.AccountKey, network.NBitcoinNetwork); if (accountKey != null) { var accountSettings = newStrategy.AccountKeySettings.FirstOrDefault(a => a.AccountKey == accountKey); if (accountSettings != null) { accountSettings.AccountKeyPath = vm.KeyPath == null ? null : KeyPath.Parse(vm.KeyPath); accountSettings.RootFingerprint = string.IsNullOrEmpty(vm.RootFingerprint) ? (HDFingerprint?)null : new HDFingerprint(NBitcoin.DataEncoders.Encoders.Hex.DecodeData(vm.RootFingerprint)); } } strategy = newStrategy; strategy.Source = vm.Source; vm.DerivationScheme = strategy.AccountDerivation.ToString(); } } else { strategy = null; } } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Esquema de derivación no válido"); vm.Confirmation = false; return(View(vm)); } } var oldConfig = vm.Config; vm.Config = strategy == null ? null : strategy.ToJson(); PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); var exisingStrategy = store.GetSupportedPaymentMethods(_NetworkProvider) .Where(c => c.PaymentId == paymentMethodId) .OfType <DerivationSchemeSettings>() .FirstOrDefault(); var storeBlob = store.GetStoreBlob(); var wasExcluded = storeBlob.GetExcludedPaymentMethods().Match(paymentMethodId); var willBeExcluded = !vm.Enabled; var showAddress = // Show addresses if: // - If the user is testing the hint address in confirmation screen (vm.Confirmation && !string.IsNullOrWhiteSpace(vm.HintAddress)) || // - The user is clicking on continue after changing the config (!vm.Confirmation && oldConfig != vm.Config) || // - The user is clickingon continue without changing config nor enabling/disabling (!vm.Confirmation && oldConfig == vm.Config && willBeExcluded == wasExcluded); showAddress = showAddress && strategy != null; if (!showAddress) { try { if (strategy != null) { await wallet.TrackAsync(strategy.AccountDerivation); } store.SetSupportedPaymentMethod(paymentMethodId, strategy); storeBlob.SetExcluded(paymentMethodId, willBeExcluded); store.SetStoreBlob(storeBlob); } catch { ModelState.AddModelError(nameof(vm.DerivationScheme), "Esquema de derivación no válido"); return(View(vm)); } await _Repo.UpdateStore(store); if (oldConfig != vm.Config) { StatusMessage = $"Ajustes de derivación para{network.CryptoCode} ha sido modificado."; } if (willBeExcluded != wasExcluded) { var label = willBeExcluded ? "desactivado" : "activado"; StatusMessage = $"Pagos en cadena para {network.CryptoCode} ha sido {label}."; } return(RedirectToAction(nameof(UpdateStore), new { storeId = storeId })); } else if (!string.IsNullOrEmpty(vm.HintAddress)) { BitcoinAddress address = null; try { address = BitcoinAddress.Create(vm.HintAddress, network.NBitcoinNetwork); } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Dirección de sugerencia no válida"); return(ShowAddresses(vm, strategy)); } try { var newStrategy = ParseDerivationStrategy(vm.DerivationScheme, address.ScriptPubKey, network); if (newStrategy.AccountDerivation != strategy.AccountDerivation) { strategy.AccountDerivation = newStrategy.AccountDerivation; strategy.AccountOriginal = null; } } catch { ModelState.AddModelError(nameof(vm.HintAddress), "Imposible encontrar una coincidencia con esta dirección"); return(ShowAddresses(vm, strategy)); } vm.HintAddress = ""; vm.StatusMessage = "Dirección encontrada con éxito, verifique que el resto sea correcto y haga clic en \"Confirm\""; ModelState.Remove(nameof(vm.HintAddress)); ModelState.Remove(nameof(vm.DerivationScheme)); } return(ShowAddresses(vm, strategy)); }