What changed, and why it matters
This commit is a routine cleanup. It removes two unused namespace imports from a webhook trigger provider file and adds null checks and a page-load wait to automated UI tests. There is no change to production logic, no security fix, and no disclosed vulnerability.
No security action needed. Treat as normal maintenance/cleanup.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff only touches test code and unused using directives. BTCPayServer.Tests/PlaywrightTests.cs gains Assert.NotNull(…) guards on attributes returned by Playwright locators and one WaitForLoadStateAsync call. BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs drops unused imports (BTCPayServer.HostedServices and BTCPayServer.Plugins.Emails). No runtime behavior of the webhook provider is altered.
Changed components
BTCPayServer.Tests/PlaywrightTests.csBTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.csInspect captured patch +12 / −3
diff --git a/BTCPayServer.Tests/PlaywrightTests.cs b/BTCPayServer.Tests/PlaywrightTests.cs
index 9c57dd1..229e517 100644
--- a/BTCPayServer.Tests/PlaywrightTests.cs
+++ b/BTCPayServer.Tests/PlaywrightTests.cs
@@ -358,6 +358,7 @@ namespace BTCPayServer.Tests
var i = await s.CreateInvoice(storeId, null, cryptoCode);
await s.GoToInvoiceCheckout(i);
var lnurl = await s.Page.Locator("#Lightning_BTC-LNURL .truncate-center").GetAttributeAsync("data-text");
+ Assert.NotNull(lnurl);
var parsed = LNURL.LNURL.Parse(lnurl, out _);
var fetchedRequest = Assert.IsType<LNURLPayRequest>(await LNURL.LNURL.FetchInformation(parsed, new HttpClient()));
Assert.Equal(1m, fetchedRequest.MinSendable.ToDecimal(LightMoneyUnit.Satoshi));
@@ -457,6 +458,7 @@ namespace BTCPayServer.Tests
var invForPP = await s.CreateInvoice(null, cryptoCode);
await s.GoToInvoiceCheckout(invForPP);
lnurl = await s.Page.Locator("#Lightning_BTC-LNURL .truncate-center").GetAttributeAsync("data-text");
+ Assert.NotNull(lnurl);
LNURL.LNURL.Parse(lnurl, out _);
// Check that pull payment has lightning option
@@ -538,7 +540,7 @@ namespace BTCPayServer.Tests
await s.Page.ClickAsync("button[value='add']");
await s.FindAlertMessage();
- // Add second lightning address with advanced settings
+ // Add a second lightning address with advanced settings
// Ensure the add form is open
if (!await s.Page.Locator("#Add_Username").IsVisibleAsync())
{
@@ -564,6 +566,7 @@ namespace BTCPayServer.Tests
for (var i = 0; i < await addresses.CountAsync(); i++)
{
var value = await addresses.Nth(i).GetAttributeAsync("value");
+ Assert.NotNull(value);
var lnurl = new Uri(LNURL.LNURL.ExtractUriFromInternetIdentifier(value).ToString().Replace("https", "http"));
var request = (LNURLPayRequest)await LNURL.LNURL.FetchInformation(lnurl, new HttpClient());
var m = request.ParsedMetadata.ToDictionary(o => o.Key, o => o.Value);
@@ -606,8 +609,10 @@ namespace BTCPayServer.Tests
foreach (var inv in invoices)
{
var prompt = inv.GetPaymentPrompt(PaymentTypes.LNURL.GetPaymentMethodId("BTC"));
+ Assert.NotNull(prompt);
var handlers = s.Server.PayTester.GetService<PaymentMethodHandlerDictionary>();
var details = (LNURLPayPaymentMethodDetails)handlers.ParsePaymentPromptDetails(prompt);
+ Assert.NotNull(details);
Assert.Contains(details.ConsumedLightningAddress, new[] { lnaddress1, lnaddress2Resolved });
if (details.ConsumedLightningAddress == lnaddress2Resolved)
{
@@ -682,6 +687,7 @@ namespace BTCPayServer.Tests
var prompt = i.GetPaymentPrompt(PaymentTypes.LNURL.GetPaymentMethodId("BTC"));
if (prompt == null) return false;
var det = (LNURLPayPaymentMethodDetails)handlers2.ParsePaymentPromptDetails(prompt);
+ Assert.NotNull(det);
return det.ConsumedLightningAddress?.StartsWith(lnUsername, StringComparison.OrdinalIgnoreCase) == true;
});
Assert.NotNull(match);
@@ -2528,6 +2534,7 @@ namespace BTCPayServer.Tests
await s.RegisterNewUser(true);
await s.GoToHome();
await s.GoToServer(ServerNavPages.Roles);
+ await s.Page.WaitForLoadStateAsync(LoadState.DOMContentLoaded);
var existingServerRoles = await s.Page.Locator("table tr").AllAsync();
Assert.Equal(5, existingServerRoles.Count);
ILocator ownerRow = null;
@@ -2537,6 +2544,7 @@ namespace BTCPayServer.Tests
foreach (var roleItem in existingServerRoles)
{
var text = await roleItem.TextContentAsync();
+ Assert.NotNull(text);
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
{
ownerRow = roleItem;
@@ -2586,6 +2594,7 @@ namespace BTCPayServer.Tests
foreach (var roleItem in existingServerRoles)
{
var text = await roleItem.TextContentAsync();
+ Assert.NotNull(text);
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
{
ownerRow = roleItem;
@@ -2616,6 +2625,7 @@ namespace BTCPayServer.Tests
foreach (var roleItem in existingServerRoles)
{
var text = await roleItem.TextContentAsync();
+ Assert.NotNull(text);
if (text.Contains("owner", StringComparison.InvariantCultureIgnoreCase))
{
ownerRow = roleItem;
@@ -2631,6 +2641,7 @@ namespace BTCPayServer.Tests
foreach (var roleItem in existingServerRoles)
{
var text = await roleItem.TextContentAsync();
+ Assert.NotNull(text);
if (text.Contains("guest", StringComparison.InvariantCultureIgnoreCase))
{
guestRow = roleItem;
diff --git a/BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs b/BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs
index f341ab0..ba8b52b 100644
--- a/BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs
+++ b/BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs
@@ -4,8 +4,6 @@ using System.Threading.Tasks;
using BTCPayServer.Abstractions;
using BTCPayServer.Client.Models;
using BTCPayServer.Data;
-using BTCPayServer.HostedServices;
-using BTCPayServer.Plugins.Emails;
using BTCPayServer.Plugins.Emails.HostedServices;
using BTCPayServer.Services.PaymentRequests;
using Microsoft.AspNetCore.Mvc;
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.