|
@cjData.Round
diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiCoordinatorClientInstance.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiCoordinatorClientInstance.cs
index 4b769f7..aa7493b 100644
--- a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiCoordinatorClientInstance.cs
+++ b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiCoordinatorClientInstance.cs
@@ -19,6 +19,7 @@ using WalletWasabi.WabiSabi.Backend.PostRequests;
using WalletWasabi.WabiSabi.Client;
using WalletWasabi.WabiSabi.Client.RoundStateAwaiters;
using WalletWasabi.WabiSabi.Client.StatusChangedEvents;
+using WalletWasabi.Wallets;
using WalletWasabi.WebClients.Wasabi;
using HttpClientFactory = WalletWasabi.WebClients.Wasabi.HttpClientFactory;
@@ -63,11 +64,18 @@ public class WabisabiCoordinatorClientInstanceManager:IHostedService
}
}
- public async Task StopWallet(string name)
+ public async Task StopWallet(IWallet wallet, string coordinator = null)
{
- foreach (var servicesValue in HostedServices.Values)
+ if (coordinator is not null && HostedServices.TryGetValue(coordinator, out var instance))
{
- await servicesValue.StopWallet(name);
+ await instance.StopWallet(wallet);
+ }
+ else if (coordinator is null)
+ {
+ foreach (var servicesValue in HostedServices.Values)
+ {
+ await servicesValue.StopWallet(wallet);
+ }
}
}
@@ -184,9 +192,9 @@ public class WabisabiCoordinatorClientInstance
}
- public async Task StopWallet(string walletName)
+ public async Task StopWallet(IWallet wallet)
{
- await CoinJoinManager.StopAsyncByName(walletName, CancellationToken.None);
+ await CoinJoinManager.StopAsync(wallet, CancellationToken.None);
}
private void OnStatusChanged(object sender, StatusChangedEventArgs e)
diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiPlugin.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiPlugin.cs
index 4ff1155..0e04641 100644
--- a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiPlugin.cs
+++ b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiPlugin.cs
@@ -66,7 +66,8 @@ public class WabisabiPlugin : BaseBTCPayServerPlugin
provider.GetRequiredService(),
provider.GetRequiredService(),
utxoLocker,
- provider.GetRequiredService()
+ provider.GetRequiredService(),
+ provider.GetRequiredService>()
));
applicationBuilder.AddWabisabiCoordinator();
applicationBuilder.AddSingleton(provider => provider.GetRequiredService());
@@ -141,7 +142,7 @@ public class WabisabiPlugin : BaseBTCPayServerPlugin
{
var walletProvider =
(WalletProvider)applicationBuilderApplicationServices.GetRequiredService();
- await walletProvider.ResetWabisabiStuckPayouts();
+ await walletProvider.ResetWabisabiStuckPayouts(null);
});
Logger.DotnetLogger = applicationBuilderApplicationServices.GetService>();
diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiService.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiService.cs
index bd15b99..e05e6e5 100644
--- a/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiService.cs
+++ b/Plugins/BTCPayServer.Plugins.Wabisabi/WabisabiService.cs
@@ -62,11 +62,14 @@ namespace BTCPayServer.Plugins.Wabisabi
public async Task SetWabisabiForStore(string storeId, WabisabiStoreSettings wabisabiSettings, string termsCoord = null)
{
- foreach (var setting in wabisabiSettings.Settings)
+ foreach (var setting in wabisabiSettings.Settings.Where(setting => !setting.Enabled))
{
- if (setting.Enabled) continue;
- if(_coordinatorClientInstanceManager.HostedServices.TryGetValue(setting.Coordinator, out var coordinator))
- _ = coordinator.StopWallet(storeId);
+ _walletProvider.LoadedWallets.TryGetValue(storeId, out var walletTask);
+ if (walletTask != null)
+ {
+ var wallet = await walletTask;
+ await _coordinatorClientInstanceManager.StopWallet(wallet, setting.Coordinator);
+ }
}
if (wabisabiSettings.Settings.All(settings => !settings.Enabled))
diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/WalletProvider.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/WalletProvider.cs
index 9988ff4..c863447 100644
--- a/Plugins/BTCPayServer.Plugins.Wabisabi/WalletProvider.cs
+++ b/Plugins/BTCPayServer.Plugins.Wabisabi/WalletProvider.cs
@@ -39,6 +39,7 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
public IUTXOLocker UtxoLocker { get; set; }
private readonly ILoggerFactory _loggerFactory;
private readonly EventAggregator _eventAggregator;
+ private readonly ILogger _logger;
public WalletProvider(
IServiceProvider serviceProvider,
@@ -47,7 +48,8 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
IExplorerClientProvider explorerClientProvider,
ILoggerFactory loggerFactory,
IUTXOLocker utxoLocker,
- EventAggregator eventAggregator ) : base(TimeSpan.FromMinutes(5))
+ EventAggregator eventAggregator,
+ ILogger logger) : base(TimeSpan.FromMinutes(5))
{
UtxoLocker = utxoLocker;
_serviceProvider = serviceProvider;
@@ -56,7 +58,7 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
_explorerClientProvider = explorerClientProvider;
_loggerFactory = loggerFactory;
_eventAggregator = eventAggregator;
-
+ _logger = logger;
}
public readonly ConcurrentDictionary> LoadedWallets = new();
@@ -65,9 +67,9 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
public class WalletUnloadEventArgs : EventArgs
{
- public string Wallet { get; }
+ public IWallet Wallet { get; }
- public WalletUnloadEventArgs(string wallet)
+ public WalletUnloadEventArgs(IWallet wallet)
{
Wallet = wallet;
}
@@ -76,7 +78,7 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
public event EventHandler? WalletUnloaded;
public async Task GetWalletAsync(string name)
{
- await initialLoad;
+ await initialLoad.Task;
return await LoadedWallets.GetOrAddAsync(name, async s =>
{
@@ -118,7 +120,7 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
}
- private Task initialLoad = null;
+ private TaskCompletionSource initialLoad = new();
private IEventAggregatorSubscription _subscription;
private IEventAggregatorSubscription _subscription2;
@@ -131,7 +133,7 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
return Array.Empty();
}
- await initialLoad;
+ await initialLoad.Task;
return (await Task.WhenAll(_cachedSettings
.Select(pair => GetWalletAsync(pair.Key))))
.Where(wallet => wallet is not null);
@@ -139,22 +141,32 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
- public async Task ResetWabisabiStuckPayouts()
+ public async Task ResetWabisabiStuckPayouts(string[] storeIds)
{
- var wallets = await GetWalletsAsync();
+
+ await initialLoad.Task;
+
+ storeIds??= _cachedSettings?.Keys.ToArray() ?? Array.Empty();
+ if (!storeIds.Any())
+ {
+ return;
+ }
var pullPaymentHostedService = _serviceProvider.GetRequiredService();
var payouts = await pullPaymentHostedService.GetPayouts(new PullPaymentHostedService.PayoutQuery()
{
- States = new PayoutState[]
+ States = new[]
{
PayoutState.InProgress
},
PaymentMethods = new[] {"BTC"},
- Stores = wallets.Select(wallet => ((BTCPayWallet) wallet).StoreId).ToArray()
+ Stores = storeIds
});
var inProgressPayouts = payouts
.Where(data => data.GetProofBlobJson()?.Value("proofType") == "Wabisabi").ToArray();
+ if(!inProgressPayouts.Any())
+ return;
+ _logger.LogInformation("Moving {count} stuck coinjoin payouts to AwaitingPayment", inProgressPayouts.Length);
foreach (PayoutData payout in inProgressPayouts)
{
try
@@ -217,8 +229,12 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
private async Task UnloadWallet(string name)
{
- LoadedWallets.TryRemove(name, out _);
- WalletUnloaded?.Invoke(this, new WalletUnloadEventArgs(name));
+ LoadedWallets.TryRemove(name, out var walletTask);
+ if (walletTask != null)
+ {
+ var wallet = await walletTask;
+ WalletUnloaded?.Invoke(this, new WalletUnloadEventArgs(wallet));
+ }
}
public async Task SettingsUpdated(string storeId, WabisabiStoreSettings wabisabiSettings)
@@ -269,10 +285,11 @@ public class WalletProvider : PeriodicRunner,IWalletProvider
public override Task StartAsync(CancellationToken cancellationToken)
{
- initialLoad = Task.Run(async () =>
+ Task.Run(async () =>
{
_cachedSettings =
await _storeRepository.GetSettingsAsync(nameof(WabisabiStoreSettings));
+ initialLoad.SetResult();
}, cancellationToken);
_subscription = _eventAggregator.SubscribeAsync(@event =>
Check(@event.WalletId.StoreId, cancellationToken));
diff --git a/submodules/walletwasabi b/submodules/walletwasabi
index 7c2fbcc..3a51a87 160000
--- a/submodules/walletwasabi
+++ b/submodules/walletwasabi
@@ -1 +1 @@
-Subproject commit 7c2fbccc7ae543fbd7d0fd0c7242442d930c1f50
+Subproject commit 3a51a875421706a8780645b65564967d6d88cc1a
|