2020-06-28 21:44:35 -05:00
|
|
|
using System;
|
2019-08-30 00:24:42 +09:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.ComponentModel;
|
2021-12-27 13:46:31 +09:00
|
|
|
using System.Globalization;
|
2019-08-30 00:24:42 +09:00
|
|
|
using System.Linq;
|
2020-06-28 17:55:27 +09:00
|
|
|
using System.Text;
|
2020-08-26 14:01:39 +09:00
|
|
|
using BTCPayServer.Client.JsonConverters;
|
2020-06-28 17:55:27 +09:00
|
|
|
using BTCPayServer.Client.Models;
|
2022-06-22 05:05:32 +02:00
|
|
|
using BTCPayServer.Controllers;
|
2019-08-30 00:24:42 +09:00
|
|
|
using BTCPayServer.JsonConverters;
|
2020-06-28 17:55:27 +09:00
|
|
|
using BTCPayServer.Payments;
|
2019-08-30 00:24:42 +09:00
|
|
|
using BTCPayServer.Rating;
|
2024-05-09 17:20:24 +09:00
|
|
|
using BTCPayServer.Services.Invoices;
|
2019-08-30 00:24:42 +09:00
|
|
|
using BTCPayServer.Services.Mails;
|
2020-06-28 17:55:27 +09:00
|
|
|
using Newtonsoft.Json;
|
2020-12-29 09:58:35 +01:00
|
|
|
using Newtonsoft.Json.Linq;
|
2019-08-30 00:24:42 +09:00
|
|
|
|
|
|
|
namespace BTCPayServer.Data
|
|
|
|
{
|
|
|
|
public class StoreBlob
|
|
|
|
{
|
2022-01-20 17:35:25 +01:00
|
|
|
public static string StandardDefaultCurrency = "USD";
|
2023-01-06 14:18:07 +01:00
|
|
|
|
2019-08-30 00:24:42 +09:00
|
|
|
public StoreBlob()
|
|
|
|
{
|
2020-08-26 14:01:39 +09:00
|
|
|
InvoiceExpiration = TimeSpan.FromMinutes(15);
|
2023-01-16 12:45:19 +01:00
|
|
|
DisplayExpirationTimer = TimeSpan.FromMinutes(5);
|
2022-01-25 21:55:48 -08:00
|
|
|
RefundBOLT11Expiration = TimeSpan.FromDays(30);
|
2020-08-26 14:01:39 +09:00
|
|
|
MonitoringExpiration = TimeSpan.FromDays(1);
|
2019-08-30 00:24:42 +09:00
|
|
|
PaymentTolerance = 0;
|
2019-10-07 21:06:12 -07:00
|
|
|
ShowRecommendedFee = true;
|
2019-11-06 16:21:33 -08:00
|
|
|
RecommendedFeeBlockTarget = 1;
|
2020-12-29 09:58:35 +01:00
|
|
|
PaymentMethodCriteria = new List<PaymentMethodCriteria>();
|
2022-07-06 14:14:55 +02:00
|
|
|
ReceiptOptions = InvoiceDataBase.ReceiptOptions.CreateDefault();
|
2019-08-30 00:24:42 +09:00
|
|
|
}
|
2023-01-06 14:18:07 +01:00
|
|
|
|
2019-08-30 00:24:42 +09:00
|
|
|
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
|
2020-11-09 01:11:03 -06:00
|
|
|
public NetworkFeeMode NetworkFeeMode { get; set; }
|
2019-08-30 00:24:42 +09:00
|
|
|
|
2020-11-09 01:11:03 -06:00
|
|
|
public bool LightningAmountInSatoshi { get; set; }
|
|
|
|
public bool LightningPrivateRouteHints { get; set; }
|
|
|
|
public bool OnChainWithLnInvoiceFallback { get; set; }
|
2021-04-07 06:08:42 +02:00
|
|
|
public bool LazyPaymentMethods { get; set; }
|
2020-11-09 01:11:03 -06:00
|
|
|
public bool RedirectAutomatically { get; set; }
|
2019-10-07 21:06:12 -07:00
|
|
|
public bool ShowRecommendedFee { get; set; }
|
2019-11-06 16:21:33 -08:00
|
|
|
public int RecommendedFeeBlockTarget { get; set; }
|
2021-10-20 23:17:40 +09:00
|
|
|
string _DefaultCurrency;
|
2021-12-31 16:59:02 +09:00
|
|
|
public string DefaultCurrency
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2022-01-20 17:35:25 +01:00
|
|
|
return string.IsNullOrEmpty(_DefaultCurrency) ? StandardDefaultCurrency : _DefaultCurrency;
|
2021-12-31 16:59:02 +09:00
|
|
|
}
|
2021-10-20 23:17:40 +09:00
|
|
|
set
|
|
|
|
{
|
|
|
|
_DefaultCurrency = value;
|
|
|
|
if (!string.IsNullOrEmpty(_DefaultCurrency))
|
|
|
|
_DefaultCurrency = _DefaultCurrency.Trim().ToUpperInvariant();
|
|
|
|
}
|
|
|
|
}
|
2023-05-11 10:38:40 +02:00
|
|
|
|
|
|
|
public string StoreSupportUrl { get; set; }
|
2019-11-06 16:21:33 -08:00
|
|
|
|
2019-08-30 00:24:42 +09:00
|
|
|
CurrencyPair[] _DefaultCurrencyPairs;
|
|
|
|
[JsonProperty("defaultCurrencyPairs", ItemConverterType = typeof(CurrencyPairJsonConverter))]
|
|
|
|
public CurrencyPair[] DefaultCurrencyPairs
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return _DefaultCurrencyPairs ?? Array.Empty<CurrencyPair>();
|
|
|
|
}
|
|
|
|
set
|
|
|
|
{
|
|
|
|
_DefaultCurrencyPairs = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public string GetDefaultCurrencyPairString()
|
|
|
|
{
|
|
|
|
return string.Join(',', DefaultCurrencyPairs.Select(c => c.ToString()));
|
|
|
|
}
|
|
|
|
|
|
|
|
public string DefaultLang { get; set; }
|
2020-08-26 14:01:39 +09:00
|
|
|
[DefaultValue(typeof(TimeSpan), "1.00:00:00")]
|
2019-08-30 00:24:42 +09:00
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
2020-08-26 14:01:39 +09:00
|
|
|
[JsonConverter(typeof(TimeSpanJsonConverter.Minutes))]
|
|
|
|
public TimeSpan MonitoringExpiration
|
2019-08-30 00:24:42 +09:00
|
|
|
{
|
|
|
|
get;
|
|
|
|
set;
|
|
|
|
}
|
|
|
|
|
2020-08-26 14:01:39 +09:00
|
|
|
[DefaultValue(typeof(TimeSpan), "00:15:00")]
|
2019-08-30 00:24:42 +09:00
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
2020-08-26 14:01:39 +09:00
|
|
|
[JsonConverter(typeof(TimeSpanJsonConverter.Minutes))]
|
2020-11-09 01:11:03 -06:00
|
|
|
public TimeSpan InvoiceExpiration { get; set; }
|
2019-08-30 00:24:42 +09:00
|
|
|
|
2023-01-16 12:45:19 +01:00
|
|
|
[DefaultValue(typeof(TimeSpan), "00:05:00")]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
|
|
|
[JsonConverter(typeof(TimeSpanJsonConverter.Minutes))]
|
|
|
|
public TimeSpan DisplayExpirationTimer { get; set; }
|
|
|
|
|
2019-08-30 00:24:42 +09:00
|
|
|
public decimal Spread { get; set; } = 0.0m;
|
|
|
|
|
2024-05-13 22:29:42 +09:00
|
|
|
/// <summary>
|
|
|
|
/// This may be null. Use <see cref="GetPreferredExchange(DefaultRulesCollection)"/> instead if you want to return a valid exchange
|
|
|
|
/// </summary>
|
2019-08-30 00:24:42 +09:00
|
|
|
public string PreferredExchange { get; set; }
|
2024-05-13 22:29:42 +09:00
|
|
|
/// <summary>
|
|
|
|
/// Use the preferred exchange of the store, or the recommended exchange from the default currency
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="defaultRules"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public string GetPreferredExchange(DefaultRulesCollection defaultRules)
|
|
|
|
{
|
|
|
|
return string.IsNullOrEmpty(PreferredExchange) ? defaultRules.GetRecommendedExchange(DefaultCurrency) : PreferredExchange;
|
|
|
|
}
|
2019-08-30 00:24:42 +09:00
|
|
|
|
2020-12-29 09:58:35 +01:00
|
|
|
public List<PaymentMethodCriteria> PaymentMethodCriteria { get; set; }
|
2019-08-30 00:24:42 +09:00
|
|
|
public string HtmlTitle { get; set; }
|
2021-10-20 23:17:40 +09:00
|
|
|
|
2021-07-27 08:17:56 +02:00
|
|
|
public bool AutoDetectLanguage { get; set; }
|
2019-08-30 00:24:42 +09:00
|
|
|
|
|
|
|
public bool RateScripting { get; set; }
|
2022-07-06 14:14:55 +02:00
|
|
|
#nullable enable
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
|
|
|
|
public InvoiceDataBase.ReceiptOptions ReceiptOptions { get; set; }
|
|
|
|
#nullable restore
|
2019-08-30 00:24:42 +09:00
|
|
|
public string RateScript { get; set; }
|
|
|
|
|
|
|
|
public bool AnyoneCanInvoice { get; set; }
|
|
|
|
|
|
|
|
string _LightningDescriptionTemplate;
|
|
|
|
public string LightningDescriptionTemplate
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return _LightningDescriptionTemplate ?? "Paid to {StoreName} (Order ID: {OrderId})";
|
|
|
|
}
|
|
|
|
set
|
|
|
|
{
|
|
|
|
_LightningDescriptionTemplate = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[DefaultValue(0)]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
|
|
|
public double PaymentTolerance { get; set; }
|
|
|
|
|
2024-05-13 22:29:42 +09:00
|
|
|
public BTCPayServer.Rating.RateRules GetRateRules(DefaultRulesCollection defaultRules)
|
2022-10-12 15:19:33 +02:00
|
|
|
{
|
2024-05-13 22:29:42 +09:00
|
|
|
return GetRateRules(defaultRules, out _);
|
2022-10-12 15:19:33 +02:00
|
|
|
}
|
2024-05-13 22:29:42 +09:00
|
|
|
public BTCPayServer.Rating.RateRules GetRateRules(DefaultRulesCollection defaultRules, out bool preferredSource)
|
2019-08-30 00:24:42 +09:00
|
|
|
{
|
|
|
|
if (!RateScripting ||
|
|
|
|
string.IsNullOrEmpty(RateScript) ||
|
|
|
|
!BTCPayServer.Rating.RateRules.TryParse(RateScript, out var rules))
|
|
|
|
{
|
2022-10-12 15:19:33 +02:00
|
|
|
preferredSource = true;
|
2024-05-13 22:29:42 +09:00
|
|
|
return GetDefaultRateRules(defaultRules);
|
2019-08-30 00:24:42 +09:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-10-12 15:19:33 +02:00
|
|
|
preferredSource = false;
|
2019-08-30 00:24:42 +09:00
|
|
|
rules.Spread = Spread;
|
|
|
|
return rules;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-05-13 22:29:42 +09:00
|
|
|
public RateRules GetDefaultRateRules(DefaultRulesCollection defaultRules)
|
2019-08-30 00:24:42 +09:00
|
|
|
{
|
2024-05-13 22:29:42 +09:00
|
|
|
var rules = defaultRules.WithPreferredExchange(PreferredExchange);
|
2019-08-30 00:24:42 +09:00
|
|
|
rules.Spread = Spread;
|
|
|
|
return rules;
|
|
|
|
}
|
|
|
|
|
|
|
|
[Obsolete("Use GetExcludedPaymentMethods instead")]
|
|
|
|
public string[] ExcludedPaymentMethods { get; set; }
|
|
|
|
|
|
|
|
public EmailSettings EmailSettings { get; set; }
|
2020-01-06 13:57:32 +01:00
|
|
|
public bool PayJoinEnabled { get; set; }
|
2019-08-30 00:24:42 +09:00
|
|
|
|
2020-12-29 09:58:35 +01:00
|
|
|
[JsonExtensionData]
|
|
|
|
public IDictionary<string, JToken> AdditionalData { get; set; } = new Dictionary<string, JToken>();
|
2021-10-20 23:17:40 +09:00
|
|
|
|
2022-01-24 20:17:09 +09:00
|
|
|
[DefaultValue(typeof(TimeSpan), "30.00:00:00")]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
|
|
|
|
[JsonConverter(typeof(TimeSpanJsonConverter.Days))]
|
|
|
|
public TimeSpan RefundBOLT11Expiration { get; set; }
|
|
|
|
|
2022-06-22 05:05:32 +02:00
|
|
|
public List<UIStoresController.StoreEmailRule> EmailRules { get; set; }
|
2022-10-17 12:16:29 +02:00
|
|
|
public string BrandColor { get; set; }
|
2024-09-13 14:39:21 +02:00
|
|
|
public bool ApplyBrandColorToBackend { get; set; }
|
|
|
|
|
2024-05-09 02:18:02 +02:00
|
|
|
[JsonConverter(typeof(UnresolvedUriJsonConverter))]
|
|
|
|
public UnresolvedUri LogoUrl { get; set; }
|
|
|
|
[JsonConverter(typeof(UnresolvedUriJsonConverter))]
|
|
|
|
public UnresolvedUri CssUrl { get; set; }
|
2023-04-04 10:45:40 +09:00
|
|
|
|
|
|
|
[DefaultValue(true)]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
|
|
|
public bool ShowPayInWalletButton { get; set; } = true;
|
2023-04-10 11:07:03 +09:00
|
|
|
|
2023-04-04 10:45:40 +09:00
|
|
|
[DefaultValue(true)]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
|
|
|
public bool ShowStoreHeader { get; set; } = true;
|
2023-04-10 11:07:03 +09:00
|
|
|
|
2023-03-13 02:09:56 +01:00
|
|
|
[DefaultValue(true)]
|
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
|
|
|
public bool CelebratePayment { get; set; } = true;
|
2023-07-24 15:57:24 +02:00
|
|
|
|
2023-07-26 09:45:29 -05:00
|
|
|
[DefaultValue(false)]
|
2023-07-24 15:57:24 +02:00
|
|
|
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]
|
2023-10-18 12:20:05 +02:00
|
|
|
public bool PlaySoundOnPayment { get; set; }
|
2023-07-24 15:57:24 +02:00
|
|
|
|
2024-05-09 02:18:02 +02:00
|
|
|
[JsonConverter(typeof(UnresolvedUriJsonConverter))]
|
|
|
|
public UnresolvedUri PaymentSoundUrl { get; set; }
|
2022-06-22 05:05:32 +02:00
|
|
|
|
2019-08-30 00:24:42 +09:00
|
|
|
public IPaymentFilter GetExcludedPaymentMethods()
|
|
|
|
{
|
|
|
|
#pragma warning disable CS0618 // Type or member is obsolete
|
|
|
|
if (ExcludedPaymentMethods == null || ExcludedPaymentMethods.Length == 0)
|
|
|
|
return PaymentFilter.Never();
|
2021-09-24 07:16:25 +02:00
|
|
|
|
2021-09-24 14:21:30 +09:00
|
|
|
return PaymentFilter.Any(ExcludedPaymentMethods
|
|
|
|
.Select(PaymentMethodId.TryParse).Where(id => id != null)
|
|
|
|
.Select(PaymentFilter.WhereIs).ToArray());
|
2019-08-30 00:24:42 +09:00
|
|
|
#pragma warning restore CS0618 // Type or member is obsolete
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool IsExcluded(PaymentMethodId paymentMethodId)
|
|
|
|
{
|
|
|
|
return GetExcludedPaymentMethods().Match(paymentMethodId);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void SetExcluded(PaymentMethodId paymentMethodId, bool value)
|
|
|
|
{
|
|
|
|
#pragma warning disable CS0618 // Type or member is obsolete
|
|
|
|
var methods = new HashSet<string>(ExcludedPaymentMethods ?? Array.Empty<string>());
|
|
|
|
if (value)
|
|
|
|
methods.Add(paymentMethodId.ToString());
|
|
|
|
else
|
|
|
|
methods.Remove(paymentMethodId.ToString());
|
|
|
|
ExcludedPaymentMethods = methods.ToArray();
|
|
|
|
#pragma warning restore CS0618 // Type or member is obsolete
|
|
|
|
}
|
|
|
|
}
|
2020-09-15 11:09:09 +02:00
|
|
|
public class PaymentMethodCriteria
|
|
|
|
{
|
|
|
|
[JsonConverter(typeof(PaymentMethodIdJsonConverter))]
|
|
|
|
public PaymentMethodId PaymentMethod { get; set; }
|
|
|
|
[JsonConverter(typeof(CurrencyValueJsonConverter))]
|
|
|
|
public CurrencyValue Value { get; set; }
|
|
|
|
public bool Above { get; set; }
|
|
|
|
}
|
2019-08-30 00:24:42 +09:00
|
|
|
}
|