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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 public GenerateWalletResponse GenerateWallet(GenerateWalletRequest request = null, CancellationToken cancellationToken = default)
 {
     request ??= new GenerateWalletRequest();
     return(GenerateWalletAsync(request, cancellationToken).GetAwaiter().GetResult());
 }
Esempio n. 4
0
 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));
        }
Esempio n. 6
0
        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);
        }