using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BTCPayServer.Abstractions.Contracts; using BTCPayServer.Abstractions.Models; using BTCPayServer.Abstractions.Services; using BTCPayServer.Common; using BTCPayServer.Data; using BTCPayServer.Payments; using BTCPayServer.PayoutProcessors; using BTCPayServer.Payouts; using BTCPayServer.Services.Invoices; using BTCPayServer.Services.Stores; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NBitcoin; using WalletWasabi.Backend.Controllers; using WalletWasabi.Logging; using WalletWasabi.WabiSabi.Client; using LogLevel = WalletWasabi.Logging.LogLevel; namespace BTCPayServer.Plugins.Wabisabi; public class WabisabiPlugin : BaseBTCPayServerPlugin { public override IBTCPayServerPlugin.PluginDependency[] Dependencies { get; } = { new() { Identifier = nameof(BTCPayServer), Condition = ">=2.0.0" } }; public override void Execute(IServiceCollection applicationBuilder) { var utxoLocker = new LocalisedUTXOLocker(); applicationBuilder.AddHostedService(provider => provider.GetRequiredService()); applicationBuilder.AddSingleton(); applicationBuilder.AddSingleton(); applicationBuilder.AddSingleton(provider => new( provider, provider.GetRequiredService(), provider.GetRequiredService(), provider.GetRequiredService(), utxoLocker, provider.GetRequiredService(), provider.GetRequiredService>(), provider.GetRequiredService(), provider.GetRequiredService() )); applicationBuilder.AddWabisabiCoordinator(); applicationBuilder.AddSingleton(provider => provider.GetRequiredService()); applicationBuilder.AddHostedService(provider => provider.GetRequiredService()); ; applicationBuilder.AddSingleton(new UIExtension("Wabisabi/StoreIntegrationWabisabiOption", "store-integrations-list")); applicationBuilder.AddSingleton(new UIExtension("Wabisabi/WabisabiNav", "store-integrations-nav")); applicationBuilder.AddSingleton(new UIExtension("Wabisabi/WabisabiDashboard", "dashboard")); applicationBuilder.AddSingleton(new UIExtension("Wabisabi/WabisabiWalletSend", "onchain-wallet-send")); applicationBuilder.AddSingleton(); Logger.SetMinimumLevel(LogLevel.Info); Logger.SetModes(LogMode.DotNetLoggers); base.Execute(applicationBuilder); } public class WabisabiPayoutProcessor: IPayoutProcessorFactory { private readonly LinkGenerator _linkGenerator; public WabisabiPayoutProcessor(LinkGenerator linkGenerator) { _linkGenerator = linkGenerator; } public string Processor { get; } = "Wabisabi"; public string FriendlyName { get; } = "Coinjoin"; public string ConfigureLink(string storeId, PayoutMethodId payoutMethodId, HttpRequest request) { return _linkGenerator.GetUriByAction( nameof(WabisabiStoreController.UpdateWabisabiStoreSettings), "WabisabiStore", new { storeId}, request.Scheme, request.Host, request.PathBase); } public IEnumerable GetSupportedPayoutMethods() { return new[] { PayoutTypes.CHAIN.GetPayoutMethodId("BTC")}; } public async Task ConstructProcessor(PayoutProcessorData settings) { return new ShellSerice(); } public class ShellSerice:IHostedService { public Task StartAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } } } public override void Execute(IApplicationBuilder applicationBuilder, IServiceProvider applicationBuilderApplicationServices) { Task.Run(async () => { var walletProvider = (WalletProvider)applicationBuilderApplicationServices.GetRequiredService(); await walletProvider.ResetWabisabiStuckPayouts(null); }); Logger.DotnetLogger = applicationBuilderApplicationServices.GetService>(); base.Execute(applicationBuilder, applicationBuilderApplicationServices); } }