diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/AffiliateServer/AffiliateServerController.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/AffiliateServer/AffiliateServerController.cs index 9cb0a6d..195f4aa 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/AffiliateServer/AffiliateServerController.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/AffiliateServer/AffiliateServerController.cs @@ -63,7 +63,8 @@ public class AffiliateServerController:Controller [HttpGet("history")] public async Task ViewRequests() { - var path = Path.Combine(_dataDirectories.Value.DataDir, "Plugins", "CoinjoinAffiliate", "History.txt"); + + var path = Path.Combine(_dataDirectories.Value.DataDir, "Plugins", "CoinjoinAffiliate", $"History{DateTime.Today:dd_MM_yyyy}.txt"); if (!System.IO.File.Exists(path)) return NotFound(); @@ -73,8 +74,10 @@ public class AffiliateServerController:Controller [AllowAnonymous] [HttpPost("get_status")] + [HttpGet("get_status")] public async Task GetStatus() { + _logger.LogTrace("GetStatus Called"); var settings = await _settingsRepository.GetSettingAsync(); if(settings?.Enabled is true&& !string.IsNullOrEmpty(settings.SigningKey)) @@ -88,8 +91,11 @@ public class AffiliateServerController:Controller [AllowAnonymous] [HttpPost("notify_coinjoin")] + [HttpGet("notify_coinjoin")] public async Task GetCoinjoinRequest() { + + _logger.LogTrace("notify_coinjoin Called"); var settings = await _settingsRepository.GetSettingAsync(); if (settings?.Enabled is not true) { @@ -106,12 +112,15 @@ public class AffiliateServerController:Controller { var valid = ecdsa.VerifyData(payload.GetCanonicalSerialization(), request.Signature, HashAlgorithmName.SHA256); - if(!valid) + if (!valid) + { + + _logger.LogError($"Invalid coinjoin request sent\n{payload.GetCanonicalSerialization()}\n{request.Signature}" ); return NotFound(); - - var path = Path.Combine(_dataDirectories.Value.DataDir, "Plugins", "CoinjoinAffiliate", "History.txt"); + } + var path = Path.Combine(_dataDirectories.Value.DataDir, "Plugins", "CoinjoinAffiliate", $"History{DateTime.Today:dd_MM_yyyy}.txt"); - Directory.CreateDirectory(Path.GetDirectoryName(path)); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); await System.IO.File.AppendAllLinesAsync(path, new[] {JObject.FromObject(request).ToString(Formatting.None).Replace(Environment.NewLine, "")}, Encoding.UTF8); var response = new CoinJoinNotificationResponse(Array.Empty()); return Json(response, AffiliationJsonSerializationOptions.Settings); diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs index dcb5322..f3ef9ab 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs @@ -80,7 +80,7 @@ public class BTCPayCoinjoinCoinSelector : IRoundCoinSelector minCoins, new Dictionary() {{AnonsetType.Red, 1}, {AnonsetType.Orange, 1}, {AnonsetType.Green, 1}}, _wallet.ConsolidationMode, liquidityClue); - _logger.LogInformation(solution.ToString()); + _logger.LogTrace(solution.ToString()); return solution.Coins.ToImmutableList(); } diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj index f0d7b2d..a909bbb 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayServer.Plugins.Wabisabi.csproj @@ -13,7 +13,7 @@ Wabisabi Coinjoin Allows you to integrate your btcpayserver store with coinjoins. - 1.0.11 + 1.0.12 @@ -43,7 +43,7 @@ - + diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs index 186fce6..8b02dc8 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs @@ -575,7 +575,7 @@ public class BTCPayWallet : IWallet, IDestinationProvider } } - Logger.LogInformation($"unlocked utxos: {string.Join(',', unlocked)}"); + Logger.LogTrace($"unlocked utxos: {string.Join(',', unlocked)}"); } public async Task> GetNextDestinationsAsync(int count, bool preferTaproot, bool mixedOutputs) diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Coordinator/WabisabiCoordinatorService.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/Coordinator/WabisabiCoordinatorService.cs index 0a23522..81bce12 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Coordinator/WabisabiCoordinatorService.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Coordinator/WabisabiCoordinatorService.cs @@ -1,32 +1,20 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Net; using System.Net.Http; -using System.Reflection; using System.Threading; using System.Threading.Tasks; using BTCPayServer.Abstractions.Contracts; using BTCPayServer.Common; using BTCPayServer.Configuration; using BTCPayServer.Plugins.Wabisabi; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.AspNetCore.Hosting.Server.Features; -using Microsoft.AspNetCore.Routing; +using BTCPayServer.Services; using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using NBitcoin; using NBitcoin.RPC; using NBXplorer; -using NBXplorer.Models; using Newtonsoft.Json.Linq; -using NNostr.Client; -using WalletWasabi.Affiliation; using WalletWasabi.Bases; using WalletWasabi.BitcoinCore.Rpc; using WalletWasabi.Cache; @@ -55,7 +43,8 @@ public class WabisabiCoordinatorService : PeriodicRunner public WabisabiCoordinatorService(ISettingsRepository settingsRepository, IOptions dataDirectories, IExplorerClientProvider clientProvider, IMemoryCache memoryCache, WabisabiCoordinatorClientInstanceManager instanceManager, - IHttpClientFactory httpClientFactory) : base(TimeSpan.FromMinutes(15)) + IHttpClientFactory httpClientFactory, + IServiceProvider serviceProvider) : base(TimeSpan.FromMinutes(15)) { _settingsRepository = settingsRepository; _dataDirectories = dataDirectories; @@ -63,11 +52,13 @@ public class WabisabiCoordinatorService : PeriodicRunner _memoryCache = memoryCache; _instanceManager = instanceManager; _httpClientFactory = httpClientFactory; + _socks5HttpClientHandler = serviceProvider.GetRequiredService(); IdempotencyRequestCache = new(memoryCache); } private WabisabiCoordinatorSettings cachedSettings; + private readonly Socks5HttpClientHandler _socks5HttpClientHandler; public async Task GetSettings() { @@ -210,7 +201,7 @@ public class WabisabiCoordinatorService : PeriodicRunner { await Nostr.CreateCoordinatorDiscoveryEvent(network, s.NostrIdentity, s.UriToAdvertise, s.CoordinatorDescription) - }, cancel); + }, _socks5HttpClientHandler, cancel); } } } diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Nostr.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/Nostr.cs index 08e18fb..9517200 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Nostr.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Nostr.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; +using BTCPayServer.Services; using NBitcoin; using Newtonsoft.Json.Linq; using NNostr.Client; @@ -14,10 +15,15 @@ namespace BTCPayServer.Plugins.Wabisabi; public class Nostr { public static int Kind = 15750; + public static string TypeTagIdentifier = "type"; + public static string TypeTagValue = "wabisabi"; + public static string NetworkTagIdentifier = "network"; + public static string EndpointTagIdentifier = "endpoint"; public static async Task Publish( Uri relayUri, NostrEvent[] evts, + Socks5HttpClientHandler httpClientHandler, CancellationToken cancellationToken ) { @@ -69,12 +75,13 @@ public class Nostr CreatedAt = DateTimeOffset.UtcNow, Tags = new List() { - new() {TagIdentifier = "uri", Data = new List() {new Uri(coordinatorUri, "plugins/wabisabi-coordinator").ToString()}}, - new() {TagIdentifier = "network", Data = new List() {currentNetwork.Name.ToLower()}} + new() {TagIdentifier = EndpointTagIdentifier, Data = new List() {new Uri(coordinatorUri, "plugins/wabisabi-coordinator").ToString()}}, + new() {TagIdentifier = TypeTagIdentifier, Data = new List() { TypeTagValue}}, + new() {TagIdentifier = NetworkTagIdentifier, Data = new List() {currentNetwork.Name.ToLower()}} } }; - await evt.ComputeIdAndSign(privateKey); + await evt.ComputeIdAndSignAsync(privateKey); return evt; } @@ -127,15 +134,18 @@ public class Nostr @event.CreatedAt < DateTimeOffset.UtcNow.AddMinutes(15) && @event.Verify() && @event.Tags.Any(tag => - tag.TagIdentifier == "uri" && + tag.TagIdentifier == EndpointTagIdentifier && tag.Data.Any(s => Uri.IsWellFormedUriString(s, UriKind.Absolute))) && @event.Tags.Any(tag => - tag.TagIdentifier == "network" && tag.Data.FirstOrDefault() == network) + tag.TagIdentifier == TypeTagIdentifier && + tag.Data.FirstOrDefault() == TypeTagValue) && + @event.Tags.Any(tag => + tag.TagIdentifier == NetworkTagIdentifier && tag.Data.FirstOrDefault() == network) ).Select(@event => new DiscoveredCoordinator() { Description = @event.Content, Name = @event.PublicKey, - Uri = new Uri(@event.GetTaggedData("uri") + Uri = new Uri(@event.GetTaggedData("endpoint") .First(s => Uri.IsWellFormedUriString(s, UriKind.Absolute))) }).ToList(); } diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs index 566a585..48ca7cb 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs @@ -172,21 +172,13 @@ public class Smartifier private void CoinPropertyChanged(object sender, PropertyChangedEventArgs e) { - if (sender is SmartCoin smartCoin) + if (sender is SmartCoin smartCoin && e.PropertyName == nameof(SmartCoin.CoinJoinInProgress)) { - if (e.PropertyName == nameof(SmartCoin.CoinJoinInProgress)) + if (_utxoLocker is not null) { - // _logger.LogInformation($"{smartCoin.Outpoint}.CoinJoinInProgress = {smartCoin.CoinJoinInProgress}"); - if (_utxoLocker is not null) - { - _ = (smartCoin.CoinJoinInProgress - ? _utxoLocker.TryLock(smartCoin.Outpoint) - : _utxoLocker.TryUnlock(smartCoin.Outpoint)).ContinueWith(task => - { - // _logger.LogInformation( - // $"{(task.Result ? "Success" : "Fail")}: {(smartCoin.CoinJoinInProgress ? "" : "un")}locking coin for coinjoin: {smartCoin.Outpoint} "); - }); - } + _ = (smartCoin.CoinJoinInProgress + ? _utxoLocker.TryLock(smartCoin.Outpoint) + : _utxoLocker.TryUnlock(smartCoin.Outpoint)); } } } diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/CoinjoinHistoryTable.cshtml b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/CoinjoinHistoryTable.cshtml index 9ea2866..92f5107 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/CoinjoinHistoryTable.cshtml +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/CoinjoinHistoryTable.cshtml @@ -29,7 +29,7 @@ @if (string.IsNullOrEmpty(coin.PayoutId)) { - @coin.AnonymitySet + @coin.AnonymitySet.ToString("0.##") } else { @@ -73,10 +73,10 @@ - @cjData.CoinsIn.Length (@cjData.CoinsIn.Sum(coin => coin.Amount) BTC) (@cjInWeightedAverage anonset wavg) + @cjData.CoinsIn.Length (@cjData.CoinsIn.Sum(coin => coin.Amount) BTC) (@cjInWeightedAverage.ToString("0.##") anonset wavg) - @cjData.CoinsOut.Length (@cjData.CoinsOut.Sum(coin => coin.Amount) BTC) (@cjOutWeightedAverage anonset wavg) + @cjData.CoinsOut.Length (@cjData.CoinsOut.Sum(coin => coin.Amount) BTC) (@cjOutWeightedAverage.ToString("0.##") anonset wavg) diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml index 1491bff..baaaa43 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml @@ -267,7 +267,8 @@ { - @coin.AnonymitySet + //print to 2 decimal places with no rounding + @coin.AnonymitySet.ToString("0.##") @coin.Amount.ToDecimal(MoneyUnit.BTC) BTC diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/WabisabiStore/Spend.cshtml b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/WabisabiStore/Spend.cshtml index b3ccbe1..cb39b7f 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/WabisabiStore/Spend.cshtml +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/WabisabiStore/Spend.cshtml @@ -7,7 +7,6 @@ @using BTCPayServer @using BTCPayServer.Common @model WabisabiStoreController.SpendViewModel -@inject ContentSecurityPolicies contentSecurityPolicies @inject IScopeProvider _scopeProvider @inject WalletProvider WalletProvider @{ @@ -15,9 +14,6 @@ Layout = "../Shared/_NavLayout.cshtml"; ViewData["NavPartialName"] = "../UIStores/_Nav"; ViewData.SetActivePage("Plugins", "BTCPayServer.Views.Stores.StoreNavPages", "Spend", storeId); - var nonce = RandomUtils.GetUInt256().ToString().Substring(0, 32); - contentSecurityPolicies.Add("script-src", $"'nonce-{nonce}'"); - contentSecurityPolicies.AllowUnsafeHashes(); var wallet = (BTCPayWallet) await WalletProvider.GetWalletAsync(storeId); var coins = await wallet.GetAllCoins(); } @@ -56,7 +52,7 @@ } -