diff --git a/BTCPayServer.Client/Models/LightningNetworkPaymentMethodBaseData.cs b/BTCPayServer.Client/Models/LightningNetworkPaymentMethodBaseData.cs index b30fe2360..a663bca04 100644 --- a/BTCPayServer.Client/Models/LightningNetworkPaymentMethodBaseData.cs +++ b/BTCPayServer.Client/Models/LightningNetworkPaymentMethodBaseData.cs @@ -4,6 +4,7 @@ { public string ConnectionString { get; set; } + public bool DisableBOLT11PaymentOption { get; set; } public LightningNetworkPaymentMethodBaseData() { diff --git a/BTCPayServer.Client/Models/LightningNetworkPaymentMethodData.cs b/BTCPayServer.Client/Models/LightningNetworkPaymentMethodData.cs index 416dc0930..11a96a475 100644 --- a/BTCPayServer.Client/Models/LightningNetworkPaymentMethodData.cs +++ b/BTCPayServer.Client/Models/LightningNetworkPaymentMethodData.cs @@ -16,12 +16,13 @@ namespace BTCPayServer.Client.Models { } - public LightningNetworkPaymentMethodData(string cryptoCode, string connectionString, bool enabled, string paymentMethod) + public LightningNetworkPaymentMethodData(string cryptoCode, string connectionString, bool enabled, string paymentMethod, bool disableBOLT11PaymentOption) { Enabled = enabled; CryptoCode = cryptoCode; ConnectionString = connectionString; PaymentMethod = paymentMethod; + DisableBOLT11PaymentOption = disableBOLT11PaymentOption; } public string PaymentMethod { get; set; } diff --git a/BTCPayServer/Controllers/GreenField/StoreLightningNetworkPaymentMethodsController.cs b/BTCPayServer/Controllers/GreenField/StoreLightningNetworkPaymentMethodsController.cs index 704d6169f..3357bf6f8 100644 --- a/BTCPayServer/Controllers/GreenField/StoreLightningNetworkPaymentMethodsController.cs +++ b/BTCPayServer/Controllers/GreenField/StoreLightningNetworkPaymentMethodsController.cs @@ -59,7 +59,8 @@ namespace BTCPayServer.Controllers.GreenField paymentMethod.GetExternalLightningUrl()?.ToString() ?? paymentMethod.GetDisplayableConnectionString(), !excludedPaymentMethods.Match(paymentMethod.PaymentId), - paymentMethod.PaymentId.ToStringNormalized() + paymentMethod.PaymentId.ToStringNormalized(), + paymentMethod.DisableBOLT11PaymentOption ) ) .Where((result) => enabled is null || enabled == result.Enabled) @@ -206,7 +207,7 @@ namespace BTCPayServer.Controllers.GreenField ? null : new LightningNetworkPaymentMethodData(paymentMethod.PaymentId.CryptoCode, paymentMethod.GetDisplayableConnectionString(), !excluded, - paymentMethod.PaymentId.ToStringNormalized()); + paymentMethod.PaymentId.ToStringNormalized(), paymentMethod.DisableBOLT11PaymentOption); } private bool GetNetwork(string cryptoCode, [MaybeNullWhen(false)] out BTCPayNetwork network) diff --git a/BTCPayServer/Controllers/StoresController.LightningLike.cs b/BTCPayServer/Controllers/StoresController.LightningLike.cs index d0542f66f..1944e6112 100644 --- a/BTCPayServer/Controllers/StoresController.LightningLike.cs +++ b/BTCPayServer/Controllers/StoresController.LightningLike.cs @@ -60,7 +60,8 @@ namespace BTCPayServer.Controllers } paymentMethod = new LightningSupportedPaymentMethod { - CryptoCode = paymentMethodId.CryptoCode + CryptoCode = paymentMethodId.CryptoCode, + DisableBOLT11PaymentOption = vm.LNURLEnabled && vm.LNURLStandardInvoiceEnabled && vm.DisableBolt11PaymentMethod }; paymentMethod.SetInternalNode(); } @@ -89,7 +90,8 @@ namespace BTCPayServer.Controllers paymentMethod = new LightningSupportedPaymentMethod { - CryptoCode = paymentMethodId.CryptoCode + CryptoCode = paymentMethodId.CryptoCode, + DisableBOLT11PaymentOption = vm.LNURLEnabled && vm.LNURLStandardInvoiceEnabled && vm.DisableBolt11PaymentMethod }; paymentMethod.SetLightningUrl(connectionString); @@ -184,6 +186,8 @@ namespace BTCPayServer.Controllers { vm.LightningNodeType = lightning.IsInternalNode ? LightningNodeType.Internal : LightningNodeType.Custom; vm.ConnectionString = lightning.GetDisplayableConnectionString(); + + vm.DisableBolt11PaymentMethod = lightning.DisableBOLT11PaymentOption; } else { diff --git a/BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs b/BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs index 17a9c4a88..baad0624f 100644 --- a/BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs +++ b/BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs @@ -55,6 +55,10 @@ namespace BTCPayServer.Payments.Lightning LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, Data.StoreData store, BTCPayNetwork network, object preparePaymentObject) { + if (supportedPaymentMethod.DisableBOLT11PaymentOption) + { + throw new PaymentMethodUnavailableException("BOLT11 payment method is disabled"); + } if (paymentMethod.ParentEntity.Type == InvoiceType.TopUp) { throw new PaymentMethodUnavailableException("Lightning Network payment method is not available for top-up invoices"); } @@ -66,7 +70,6 @@ namespace BTCPayServer.Payments.Lightning Activated = false }; } - //direct casting to (BTCPayNetwork) is fixed in other pull requests with better generic interfacing for handlers var storeBlob = store.GetStoreBlob(); var nodeInfo = GetNodeInfo(supportedPaymentMethod, network, logs, paymentMethod.PreferOnion); diff --git a/BTCPayServer/Payments/Lightning/LightningSupportedPaymentMethod.cs b/BTCPayServer/Payments/Lightning/LightningSupportedPaymentMethod.cs index 399dae57a..17b433e56 100644 --- a/BTCPayServer/Payments/Lightning/LightningSupportedPaymentMethod.cs +++ b/BTCPayServer/Payments/Lightning/LightningSupportedPaymentMethod.cs @@ -17,6 +17,8 @@ namespace BTCPayServer.Payments.Lightning [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)] public string? LightningConnectionString { get; set; } + public bool DisableBOLT11PaymentOption { get; set; } = false; + public LightningConnectionString? GetExternalLightningUrl() { #pragma warning disable CS0618 // Type or member is obsolete diff --git a/BTCPayServer/wwwroot/swagger/v1/swagger.template.stores-payment-methods.lightning-network.json b/BTCPayServer/wwwroot/swagger/v1/swagger.template.stores-payment-methods.lightning-network.json index 7f3070d6e..7a4f33272 100644 --- a/BTCPayServer/wwwroot/swagger/v1/swagger.template.stores-payment-methods.lightning-network.json +++ b/BTCPayServer/wwwroot/swagger/v1/swagger.template.stores-payment-methods.lightning-network.json @@ -255,6 +255,11 @@ "type": "string", "description": "The lightning connection string. Set to 'Internal Node' to use the internal node. (See [this doc](https://github.com/btcpayserver/BTCPayServer.Lightning/blob/master/README.md#examples) for some example)", "example": "type=clightning;server=..." + }, + "disableBOLT11PaymentOption": { + + "type": "boolean", + "description": "Whether to disable generation of bolt11 invoices. Useful when wanting to only use LNURL Pay exclusively." } } },