public async Task <IActionResult> GenerateNBXWallet(string storeId, string cryptoCode, GenerateWalletRequest request) { Logs.Events.LogInformation($"GenerateNBXWallet called {storeId}, {cryptoCode}"); if (!await CanUseHotWallet()) { return(NotFound()); } Logs.Events.LogInformation($"GenerateNBXWallet after CanUseHotWallet"); var network = _NetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); var client = _ExplorerProvider.GetExplorerClient(cryptoCode); var response = await client.GenerateWalletAsync(request); if (response == null) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Html = "There was an error generating your wallet. Is your node available?" }); return(RedirectToAction("AddDerivationScheme", new { storeId, cryptoCode })); } Logs.Events.LogInformation($"GenerateNBXWallet after GenerateWalletAsync"); var store = HttpContext.GetStoreData(); var result = await AddDerivationScheme(storeId, new DerivationSchemeViewModel() { Confirmation = false, Network = network, RootFingerprint = response.AccountKeyPath.MasterFingerprint.ToString(), RootKeyPath = network.GetRootKeyPath(), CryptoCode = cryptoCode, DerivationScheme = response.DerivationScheme.ToString(), Source = "NBXplorer", AccountKey = response.AccountHDKey.Neuter().ToWif(), DerivationSchemeFormat = "BTCPay", KeyPath = response.AccountKeyPath.KeyPath.ToString(), Enabled = !store.GetStoreBlob() .IsExcluded(new PaymentMethodId(cryptoCode, PaymentTypes.BTCLike)) }, cryptoCode); TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Success, Html = !string.IsNullOrEmpty(request.ExistingMnemonic) ? "Your wallet has been imported." : $"Your wallet has been generated. Please store your seed securely! <br/><code>{response.Mnemonic}</code>" }); Logs.Events.LogInformation($"GenerateNBXWallet returning success result"); return(result); }
public override Task <GenerateWalletResponse> GenerateWallet(GenerateWalletRequest request, ServerCallContext context) { var resp = new GenerateWalletResponse(); resp.Result = new GenerateWalletResponse.Types.WalletAddress() { Address = "qwweqweqwe", AddressExtension = new GenerateWalletResponse.Types.BcnAddressExtension() { AddressExtensionDisplayName = "Display-name", BaseAddressDisplayName = "base-address-display", DepositAddressExtension = "deposit-address", TypeForDeposit = "type-of-deposit", TypeForWithdrawal = "type-of-withdrawal" } }; return(Task.FromResult(resp)); }
public GenerateWalletResponse GenerateWallet(GenerateWalletRequest request = null, CancellationToken cancellationToken = default) { request ??= new GenerateWalletRequest(); return(GenerateWalletAsync(request, cancellationToken).GetAwaiter().GetResult()); }
public Task <GenerateWalletResponse> GenerateWalletAsync(GenerateWalletRequest request = null, CancellationToken cancellationToken = default) { request ??= new GenerateWalletRequest(); return(SendAsync <GenerateWalletResponse>(HttpMethod.Post, request, "v1/cryptos/{0}/derivations", new object[] { CryptoCode }, cancellationToken)); }
public async Task <IActionResult> GenerateOnChainWallet(string storeId, string cryptoCode, GenerateWalletRequest request) { var network = _btcPayNetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); if (network is null) { return(NotFound()); } if (!_walletProvider.IsAvailable(network)) { return(this.CreateAPIError("not-available", $"{cryptoCode} services are not currently available")); } var method = GetExistingBtcLikePaymentMethod(cryptoCode); if (method != null) { return(this.CreateAPIError("already-configured", $"{cryptoCode} wallet is already configured for this store")); } var canUseHotWallet = await CanUseHotWallet(); if (request.SavePrivateKeys && !canUseHotWallet.HotWallet) { ModelState.AddModelError(nameof(request.SavePrivateKeys), "This instance forbids non-admins from having a hot wallet for your store."); } if (request.ImportKeysToRPC && !canUseHotWallet.RPCImport) { ModelState.AddModelError(nameof(request.ImportKeysToRPC), "This instance forbids non-admins from having importing the wallet addresses/keys to the underlying node."); } if (!ModelState.IsValid) { return(this.CreateValidationError(ModelState)); } var client = _explorerClientProvider.GetExplorerClient(network); GenerateWalletResponse response; try { response = await client.GenerateWalletAsync(request); if (response == null) { return(this.CreateAPIError("not-available", $"{cryptoCode} services are not currently available")); } } catch (Exception e) { return(this.CreateAPIError("not-available", $"{cryptoCode} error: {e.Message}")); } var derivationSchemeSettings = new DerivationSchemeSettings(response.DerivationScheme, network); derivationSchemeSettings.Source = string.IsNullOrEmpty(request.ExistingMnemonic) ? "NBXplorerGenerated" : "ImportedSeed"; derivationSchemeSettings.IsHotWallet = request.SavePrivateKeys; var accountSettings = derivationSchemeSettings.GetSigningAccountKeySettings(); accountSettings.AccountKeyPath = response.AccountKeyPath.KeyPath; accountSettings.RootFingerprint = response.AccountKeyPath.MasterFingerprint; derivationSchemeSettings.AccountOriginal = response.DerivationScheme.ToString(); var store = Store; var storeBlob = store.GetStoreBlob(); store.SetSupportedPaymentMethod(new PaymentMethodId(cryptoCode, PaymentTypes.BTCLike), derivationSchemeSettings); store.SetStoreBlob(storeBlob); await _storeRepository.UpdateStore(store); var rawResult = GetExistingBtcLikePaymentMethod(cryptoCode, store); var result = new OnChainPaymentMethodDataWithSensitiveData(rawResult.CryptoCode, rawResult.DerivationScheme, rawResult.Enabled, rawResult.Label, rawResult.AccountKeyPath, response.GetMnemonic()); return(Ok(result)); }
public async Task <IActionResult> GenerateNBXWallet(string storeId, string cryptoCode, GenerateWalletRequest request) { var hotWallet = await CanUseHotWallet(); if (!hotWallet.HotWallet || (!hotWallet.RPCImport && request.ImportKeysToRPC)) { return(NotFound()); } var network = _NetworkProvider.GetNetwork <BTCPayNetwork>(cryptoCode); var client = _ExplorerProvider.GetExplorerClient(cryptoCode); GenerateWalletResponse response; try { response = await client.GenerateWalletAsync(request); } catch (Exception e) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Html = $"There was an error generating your wallet: {e.Message}" }); return(RedirectToAction(nameof(AddDerivationScheme), new { storeId, cryptoCode })); } if (response == null) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Error, Html = "There was an error generating your wallet. Is your node available?" }); return(RedirectToAction(nameof(AddDerivationScheme), new { storeId, cryptoCode })); } var store = HttpContext.GetStoreData(); var result = await AddDerivationScheme(storeId, new DerivationSchemeViewModel() { Confirmation = string.IsNullOrEmpty(request.ExistingMnemonic), Network = network, RootFingerprint = response.AccountKeyPath.MasterFingerprint.ToString(), RootKeyPath = network.GetRootKeyPath(), CryptoCode = cryptoCode, DerivationScheme = response.DerivationScheme.ToString(), Source = "NBXplorer", AccountKey = response.AccountHDKey.Neuter().ToWif(), DerivationSchemeFormat = "BTCPay", KeyPath = response.AccountKeyPath.KeyPath.ToString(), Enabled = !store.GetStoreBlob() .IsExcluded(new PaymentMethodId(cryptoCode, PaymentTypes.BTCLike)) }, cryptoCode); if (!ModelState.IsValid || !(result is RedirectToActionResult)) { return(result); } TempData.Clear(); if (string.IsNullOrEmpty(request.ExistingMnemonic)) { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Success, Html = $"Your wallet has been generated. Please store your seed securely! <br/><code class=\"alert-link\">{response.Mnemonic}</code>" }); } else { TempData.SetStatusMessageModel(new StatusMessageModel() { Severity = StatusMessageModel.StatusSeverity.Warning, Html = "Please check your addresses and confirm" }); } return(result); }
public async Task <IActionResult> GenerateWallet(string storeId, string cryptoCode, WalletSetupMethod method, GenerateWalletRequest request) { var checkResult = IsAvailable(cryptoCode, out var store, out var network); if (checkResult != null) { return(checkResult); } var(hotWallet, rpcImport) = await CanUseHotWallet(); if (!hotWallet && request.SavePrivateKeys || !rpcImport && request.ImportKeysToRPC) { return(NotFound()); } var client = _ExplorerProvider.GetExplorerClient(cryptoCode); var isImport = method == WalletSetupMethod.Seed; var vm = new WalletSetupViewModel { StoreId = storeId, CryptoCode = cryptoCode, Method = method, SetupRequest = request, Confirmation = string.IsNullOrEmpty(request.ExistingMnemonic), Network = network, RootKeyPath = network.GetRootKeyPath(), Enabled = !store.GetStoreBlob().IsExcluded(new PaymentMethodId(cryptoCode, PaymentTypes.BTCLike)), Source = "NBXplorer", DerivationSchemeFormat = "BTCPay", CanUseHotWallet = true, CanUseRPCImport = rpcImport }; if (isImport && string.IsNullOrEmpty(request.ExistingMnemonic)) { ModelState.AddModelError(nameof(request.ExistingMnemonic), "Please provide your existing seed"); return(View(vm.ViewName, vm)); } GenerateWalletResponse response; try { response = await client.GenerateWalletAsync(request); if (response == null) { throw new Exception("Node unavailable"); } } catch (Exception e) { TempData.SetStatusMessageModel(new StatusMessageModel { Severity = StatusMessageModel.StatusSeverity.Error, Html = $"There was an error generating your wallet: {e.Message}" }); return(View(vm.ViewName, vm)); } // Set wallet properties from generate response vm.RootFingerprint = response.AccountKeyPath.MasterFingerprint.ToString(); vm.DerivationScheme = response.DerivationScheme.ToString(); vm.AccountKey = response.AccountHDKey.Neuter().ToWif(); vm.KeyPath = response.AccountKeyPath.KeyPath.ToString(); var result = await UpdateWallet(vm); if (!ModelState.IsValid || !(result is RedirectToActionResult)) { return(result); } if (!isImport) { TempData.SetStatusMessageModel(new StatusMessageModel { Severity = StatusMessageModel.StatusSeverity.Success, Html = "<span class='text-centered'>Your wallet has been generated.</span>" }); var seedVm = new RecoverySeedBackupViewModel { CryptoCode = cryptoCode, Mnemonic = response.Mnemonic, Passphrase = response.Passphrase, IsStored = request.SavePrivateKeys, ReturnUrl = Url.Action(nameof(GenerateWalletConfirm), new { storeId, cryptoCode }) }; return(this.RedirectToRecoverySeedBackup(seedVm)); } TempData.SetStatusMessageModel(new StatusMessageModel { Severity = StatusMessageModel.StatusSeverity.Warning, Html = "Please check your addresses and confirm." }); return(result); }