Executive summary
btcpayserver/btcpayserver scores 45 out of 100 and is rated Weak, while five of its eight lenses score higher still: Event-Driven at 82, rated Strong, and Architecture at 74, Security and Compliance at 68, Performance at 63 and Maturity at 60, all rated Adequate.
The score is lower than those five because the weakest lens counts most, and here that is Accessibility, which scores 40 and is rated Weak. Its Keyboard semantics dimension scores 1.3 out of 10, and until that reaches 4, Accessibility can't be rated higher than Adequate. The first actions are to resolve the 3 Leaked secret finding(s) in REDACTED Scanning and to resolve the 1 Inverted test pyramid finding(s) in Test Distribution. The weakest lenses score close to each other, so improving any of them moves the score.
253 findings are critical: 130 in Explicit Debt, 40 in Forms & labels, 24 in Keyboard semantics, 23 in Static Analysis (SAST), seven in Secrets (history), six in ARIA correctness, six in Captive dependencies, four in Project dependency cycles, four in Text alternatives, three in REDACTED Scanning, two in Outbox / dual-write, two in Page structure, one in IaC & Container Security and one in Web-Security Posture.
Watchdog couldn't measure Runtime accessibility in this code, so that dimension is left out of the score. The product code is 112,676 lines, which would take an estimated 3.5 person-years, around €520,000, to rebuild.
The weakest lenses score close to each other, so improving any of them moves the score.
New since the last survey: 254 findings
- Cyclomatic Complexity · GreenfieldOfferingController.CreateOfferingPlan (cyclomatic 16) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs
- Cognitive Complexity · GreenfieldLightningNodeApiController.PayInvoice (cognitive 20) BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs
- God Classes · TooManyMethods: PluginManager BTCPayServer/Plugins/PluginManager.cs
- God Classes · MethodTooLong: PluginManager.AddPlugins BTCPayServer/Plugins/PluginManager.cs
- God Classes · FileTooLong: Plugins/PluginManager.cs BTCPayServer/Plugins/PluginManager.cs
- Code Duplication · Duplicated block (17 lines × 2) BTCPayServer/Models/StoreViewModels/GeneralSettingsViewModel.cs
- Code Duplication · Duplicated block (14 lines × 2) BTCPayServer/Plugins/Crowdfund/Models/UpdateCrowdfundViewModel.cs
- Code Duplication · Duplicated block (14 lines × 2) REDACTED
- Code Duplication · Duplicated block (6 lines × 2) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs
- Code Duplication · Duplicated block (5 lines × 2) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs
- REDACTED Scanning · REDACTED
- REDACTED Scanning · REDACTED
- Churn × Complexity Hotspots · Hotspot: BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs
- Churn × Complexity Hotspots · Hotspot: REDACTED REDACTED
- Churn × Complexity Hotspots · Hotspot: BTCPayServer/wwwroot/crowdfund/app.js BTCPayServer/wwwroot/crowdfund/app.js
- Churn × Complexity Hotspots · Hotspot: BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs
- Churn × Complexity Hotspots · Hotspot: BTCPayServer/Plugins/PluginManager.cs BTCPayServer/Plugins/PluginManager.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer.Client/JsonConverters/SaneOutpointJsonConverter.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer.Common/Logging/ConsoleLogger.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer.Common/Logging/ConsoleLogger.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Components/MainNav/MainNav.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Controllers/UIInvoiceController.UI.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Extensions.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Extensions.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Extensions/UserExtensions.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/HostedServices/BackgroundJobSchedulerHostedService.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/HostedServices/InvoiceWatcher.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/HostedServices/NBXplorerWaiter.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/HostedServices/PeriodicTaskLauncherHostedService.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/HostedServices/PeriodicTaskLauncherHostedService.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Payments/Lightning/LightningListener.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Multisig/HostedServices/MultisigEmailTriggerHostedService.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/PluginManager.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/PluginManager.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Subscriptions/Controllers/UISubscriptionControllerBase.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Webhooks/TriggerProviders/InvoiceTriggerProvider.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Plugins/Webhooks/WebhookSender.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Services/Fees/FallbackFeeProvider.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Services/ProcessRunner.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Services/Reporting/InvoicesReportProvider.cs
- Explicit Debt · EmptyCatchBlock BTCPayServer/Blazor/VaultBridge/VaultBridgeUI.razor
- Explicit Debt · BarePragmaDisable repeated across 10 files BTCPayServer.Data/Data/AddressInvoiceData.cs
- Explicit Debt · Dead code: SearchTermRouteKey BTCPayServer/Components/DateRangeSelector/DateRangeSelector.cs
- Explicit Debt · Dead code: GetPayoutSpecificActions BTCPayServer/Data/Payouts/IPayoutHandler.cs
- Explicit Debt · Dead code: GetEnabledPaymentMethods REDACTED
- Explicit Debt · Dead code: IsLightningEnabled REDACTED
- Explicit Debt · Dead code: IsLNUrlEnabled REDACTED
- Explicit Debt · Dead code: ParseOutputDescriptor BTCPayServer/DerivationSchemeParser.cs
- Explicit Debt · Dead code: ItemCombinations BTCPayServer/DerivationSchemeParser.cs
- Explicit Debt · Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs
- Explicit Debt · Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs
- Explicit Debt · Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs
- Explicit Debt · Dead code: GetSigningAccountKeySettingsOrDefault BTCPayServer/DerivationSchemeSettings.cs
- Explicit Debt · Dead code: IsFullySetup BTCPayServer/DerivationSchemeSettings.cs
- Explicit Debt · Dead code: GetAdjustedForegroundForBackground BTCPayServer/Extensions/ColorExtensions.cs
- Explicit Debt · Dead code: EnsureLocal BTCPayServer/Extensions/UrlHelperExtensions.cs
- Explicit Debt · Dead code: IndexLink BTCPayServer/Extensions/UrlHelperExtensions.cs
- Explicit Debt · Dead code: SetLightningUrl BTCPayServer/Payments/Lightning/LightningPaymentMethodConfig.cs
- Explicit Debt · Dead code: CanRemove BTCPayServer/PayoutProcessors/IPayoutProcessorFactory.cs
- Explicit Debt · Dead code: CreateFromPackage BTCPayServer/Plugins/Dotnet/LibraryModel/ManagedLibrary.cs
- Explicit Debt · Dead code: CreateFromPackage BTCPayServer/Plugins/Dotnet/LibraryModel/NativeLibrary.cs
- Explicit Debt · Dead code: AddManagedLibrary BTCPayServer/Plugins/Dotnet/Loader/AssemblyLoadContextBuilder.cs
- Explicit Debt · Dead code: AddNativeLibrary BTCPayServer/Plugins/Dotnet/Loader/AssemblyLoadContextBuilder.cs
- Explicit Debt · Dead code: AddResourceProbingPath BTCPayServer/Plugins/Dotnet/Loader/AssemblyLoadContextBuilder.cs
- Explicit Debt · Dead code: AddPluginFromAssemblyFile BTCPayServer/Plugins/Dotnet/MvcPluginExtensions.cs
- Explicit Debt · Dead code: GetStoreEmailRulesLink BTCPayServer/Plugins/Emails/LinkGeneratorExtensions.cs
- Explicit Debt · Dead code: GetItemsHash BTCPayServer/Plugins/GlobalSearch/Views/GlobalSearchViewModel.cs
- Explicit Debt · Dead code: RecurringToString BTCPayServer/Plugins/Subscriptions/StringLocalizerExtensions.Subscriptions.cs
- Explicit Debt · Dead code: GetPermissions BTCPayServer/Security/GreenField/APIKeyExtensions.cs
- Explicit Debt · Dead code: GetImplicitStoreId BTCPayServer/Security/SecurityExtensions.cs
- Explicit Debt · Dead code: AddAddressInvoice BTCPayServer/Services/Invoices/InvoiceRepository.cs
- Explicit Debt · Dead code: FromBytes BTCPayServer/Services/Invoices/InvoiceRepository.cs
- Explicit Debt · Dead code: ToJsonString BTCPayServer/Services/Invoices/InvoiceRepository.cs
- Explicit Debt · Dead code: GetBaseNotification BTCPayServer/Services/Notifications/NotificationSender.cs
- Explicit Debt · Dead code: ShortDisplayName BTCPayServer/Services/ProcessRunner.cs
- Explicit Debt · Dead code: ToggleUser BTCPayServer/Services/UserService.cs
- Explicit Debt · Dead code: GetWalletLabelsForObjects BTCPayServer/Services/WalletRepository.cs
- Explicit Debt · Dead code: GetChangeAddressAsync BTCPayServer/Services/Wallets/BTCPayWallet.cs
- Explicit Debt · Dead code: BroadcastTransactionsAsync BTCPayServer/Services/Wallets/BTCPayWallet.cs
- Explicit Debt · Dead code: HasInvitationToken BTCPayServer/UserManagerExtensions.cs
- Explicit Debt · Dead code: SetBreadcrumbs BTCPayServer/ViewDataDictionaryExtensions.cs
- Explicit Debt · Dead code: GetPageTimeZone BTCPayServer/ViewDataDictionaryExtensions.cs
- Explicit Debt · Dead code: CreateEmailRule BTCPayServer.Tests/PMO/EmailRulePMO.cs
- Explicit Debt · Dead code: SearchTextValue BTCPayServer.Tests/PMO/SearchFiltersPMO.cs
- Explicit Debt · Dead code: AddManager BTCPayServer.Tests/TestAccount.cs
- Explicit Debt · Dead code: AddEmployee BTCPayServer.Tests/TestAccount.cs
- Explicit Debt · Dead code: CanUseAzureBlobStorage BTCPayServer.Tests/ThirdPartyTests.cs
- Explicit Debt · Dead code: UpdateTranslations BTCPayServer.Tests/UtilitiesTests.cs
- Explicit Debt · Dead code: GetNumberFormatInfoOrDefault BTCPayServer.Rating/CurrencyNameTable.cs
- Explicit Debt · Dead code: ToUpdateAdditionalDataJson BTCPayServer.Data/Data/BaseEntityData.cs
- Explicit Debt · Dead code: GetCssClass BTCPayServer.Data/Data/InvoiceEventData.cs
- Explicit Debt · Dead code: TradeResultData BTCPayServer.Data/Data/TradeResultData.cs
- Secrets (history) · REDACTED
- Secrets (history) · REDACTED
Fixed since the last survey: 1174 findings
- Cyclomatic Complexity · UIMaintenanceController.Maintenance (cyclomatic 21) BTCPayServer/Plugins/Maintenance/Controllers/UIMaintenanceController.cs
- Cognitive Complexity · UIMaintenanceController.Maintenance (cognitive 30) BTCPayServer/Plugins/Maintenance/Controllers/UIMaintenanceController.cs
- Code Duplication · Duplicated block (17 lines × 2) BTCPayServer/Models/StoreViewModels/GeneralSettingsViewModel.cs
- Code Duplication · Duplicated block (14 lines × 2) BTCPayServer/Plugins/Crowdfund/Models/UpdateCrowdfundViewModel.cs
- Code Duplication · Duplicated block (14–15 lines × 2) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs
- Coupling · Off the main sequence: BTCPayServer.Rating
- Churn × Complexity Hotspots · Hotspot: BTCPayServer/Plugins/Maintenance/Controllers/UIMaintenanceController.cs BTCPayServer/Plugins/Maintenance/Controllers/UIMaintenanceController.cs
- Explicit Debt · BarePragmaDisable repeated 15 times in 9 files BTCPayServer.Data/Data/AddressInvoiceData.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer.Tests/ApiKeysTests.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Controllers/GreenField/GreenfieldApiKeysController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Controllers/GreenField/GreenfieldFilesController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Controllers/GreenField/GreenfieldObsoleteController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UIErrorController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UIInvoiceController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UILNURLAuthController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UIManageController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UIReportsController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Controllers/UIStoresController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Data/Payouts/LightningLike/UILightningLikePayoutController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Fido2/UIFido2Controller.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp REDACTED
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp REDACTED
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Plugins/Bitpay/Controllers/BitpayInvoiceController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Plugins/Bitpay/Controllers/BitpayRateController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/DynamicDNS/Controllers/UIDynamicDnsController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Forms/UIFormsController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/GlobalSearch/Controllers/UISearchController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Maintenance/Controllers/UIMaintenanceController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Monetization/Controllers/UIServerMonetizationController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Multisig/Controllers/UIMultisigSetupController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Multisig/Controllers/UIMultisigWalletsController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/PayButton/Controllers/UIPayButtonController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/PluginManager/Controllers/UIPluginManagerController.cs
- Static Analysis (SAST) · Medium: REDACTED REDACTED
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Translations/Controllers/UITranslationController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Translations/Controllers/UITranslationController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainPaymentMethodsController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs
- Static Analysis (SAST) · Medium: watchdog-controllerbase-missing-or-broken-authorization-csharp BTCPayServer/Plugins/Webhooks/Controllers/GreenfieldStoreWebhooksController.cs
- Static Analysis (SAST) · Medium: REDACTED BTCPayServer/Plugins/Webhooks/Controllers/UIStoreWebhooksController.cs
- Cancellation propagation · Async method without CancellationToken: GetLightningClient BTCPayServer/Components/StoreLightningBalance/StoreLightningBalance.cs
- Cancellation propagation · Async method without CancellationToken: GetInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: ArchiveInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: CreateInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: MarkInvoiceStatus BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: UnarchiveInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: GetInvoicePaymentMethods BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: ActivateInvoicePaymentMethod BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- Cancellation propagation · Async method without CancellationToken: CanUseInternalLightning BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs
- Cancellation propagation · Async method without CancellationToken: GetNotifications BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: GetNotification BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateNotification BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: DeleteNotification BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: GetNotificationSettings BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateNotificationSettings BTCPayServer/Controllers/GreenField/GreenfieldNotificationsController.cs
- Cancellation propagation · Async method without CancellationToken: GetPaymentRequests BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs
- Cancellation propagation · Async method without CancellationToken: GetPaymentRequest BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs
- Cancellation propagation · Async method without CancellationToken: ArchivePaymentRequest BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs
- Cancellation propagation · Async method without CancellationToken: CreateOrUpdatePaymentRequest BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs
- Cancellation propagation · Async method without CancellationToken: GetPullPayments REDACTED
- Cancellation propagation · Async method without CancellationToken: CreatePullPayment REDACTED
- Cancellation propagation · Async method without CancellationToken: RegisterBoltcard REDACTED
- Cancellation propagation · Async method without CancellationToken: GetPullPayment REDACTED
- Cancellation propagation · Async method without CancellationToken: GetPayouts REDACTED
- Cancellation propagation · Async method without CancellationToken: GetPayout REDACTED
- Cancellation propagation · Async method without CancellationToken: GetPullPaymentLNURL REDACTED
- Cancellation propagation · Async method without CancellationToken: CreatePayoutThroughStore REDACTED
- Cancellation propagation · Async method without CancellationToken: ArchivePullPayment REDACTED
- Cancellation propagation · Async method without CancellationToken: GetStorePayouts REDACTED
- Cancellation propagation · Async method without CancellationToken: CancelPayout REDACTED
- Cancellation propagation · Async method without CancellationToken: MarkPayout REDACTED
- Cancellation propagation · Async method without CancellationToken: GetStorePayout REDACTED
- Cancellation propagation · Async method without CancellationToken: ServerEmailSettings BTCPayServer/Controllers/GreenField/GreenfieldServerEmailController.cs
- Cancellation propagation · Async method without CancellationToken: ServerEmailSettings BTCPayServer/Controllers/GreenField/GreenfieldServerEmailController.cs
- Cancellation propagation · Async method without CancellationToken: GetServerRoles BTCPayServer/Controllers/GreenField/GreenfieldServerRolesController.cs
- Cancellation propagation · Async method without CancellationToken: GetStoreLightningAutomatedPayoutProcessors BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedLightningPayoutProcessorsController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateStoreLightningAutomatedPayoutProcessor BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedLightningPayoutProcessorsController.cs
- Cancellation propagation · Async method without CancellationToken: GetStoreOnChainAutomatedPayoutProcessors BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedOnChainPayoutProcessorsController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateStoreOnchainAutomatedPayoutProcessor BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedOnChainPayoutProcessorsController.cs
- Cancellation propagation · Async method without CancellationToken: SendEmailFromStore BTCPayServer/Controllers/GreenField/GreenfieldStoreEmailController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateStoreEmailSettings BTCPayServer/Controllers/GreenField/GreenfieldStoreEmailController.cs
- Cancellation propagation · Async method without CancellationToken: GetStoreLightningAddresses BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningAddressesController.cs
- Cancellation propagation · Async method without CancellationToken: RemoveStoreLightningAddress BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningAddressesController.cs
- Cancellation propagation · Async method without CancellationToken: GetStoreLightningAddress BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningAddressesController.cs
- Cancellation propagation · Async method without CancellationToken: AddOrUpdateStoreLightningAddress BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningAddressesController.cs
- Cancellation propagation · Async method without CancellationToken: GetStorePaymentMethod BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs
- Cancellation propagation · Async method without CancellationToken: RemoveStorePaymentMethod BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs
- Cancellation propagation · Async method without CancellationToken: UpdateStorePaymentMethod BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs
- Cancellation propagation · Async method without CancellationToken: GetStorePaymentMethods BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs
- Cancellation propagation · Async method without CancellationToken: GetStorePayoutProcessors BTCPayServer/Controllers/GreenField/GreenfieldStorePayoutProcessorsController.cs
- Cancellation propagation · Async method without CancellationToken: RemoveStorePayoutProcessor BTCPayServer/Controllers/GreenField/GreenfieldStorePayoutProcessorsController.cs
Rebuild cost: about €520,000 · Estimate
| Cost to rebuild | €170,000 to €860,000, for 2,787 to 9,084 hours of work, about 3.5 person-years for 2 to 7 engineers |
|---|---|
| Difficulty of the problem | High, judged from the kind of software and how it is built. Code that solves a harder problem, such as payments or medical bookings, costs more per line to write. |
| Quality factor | ×0.7 at a score of 45. Better code takes more work to write, so the factor is ×1.0 at a score of 70, lower below it and higher above it. |
| Size | Large: 112,676 lines of product code |
Top priorities
Diagnosis: what the measurements show together
Architecture — module dependency graph
Architecture: which parts of the code depend on which
| uses → | 1 BTCPayServer.Abstractions | 2 BTCPayServer.Client.Models | 3 BTCPayServer.Services.Rates | 4 BTCPayServer.Abstractions.Models | 5 BTCPayServer.Logging | 6 BTCPayServer.Payouts | 7 BTCPayServer.Abstractions.Contracts | 8 BTCPayServer.Services.Invoices | 9 BTCPayServer.Events | 10 BTCPayServer.PaymentRequest | 11 BTCPayServer.Services.Stores | 12 BTCPayServer.Plugins.Crowdfund.Controllers | 13 BTCPayServer.Services.Wallets | 14 BTCPayServer.Plugins.Wallets.Views.ViewModels | 15 BTCPayServer.Services.Apps | 16 BTCPayServer.HostedServices | 17 BTCPayServer.Services.Reporting | 18 BTCPayServer.Services | 19 BTCPayServer.Models | 20 BTCPayServer.Plugins.Emails.Services | 21 BTCPayServer.Payments.Bitcoin | 22 BTCPayServer.Payments.Lightning | 23 BTCPayServer.Payments | 24 BTCPayServer.Data | 25 BTCPayServer.Models.StoreViewModels | 26 BTCPayServer.PayoutProcessors | 27 BTCPayServer.Plugins.Emails.Views | 28 BTCPayServer.Plugins.Webhooks | 29 BTCPayServer.Plugins.Subscriptions | 30 BTCPayServer.Plugins.Monetization | 31 BTCPayServer.Controllers | 32 BTCPayServer.Configuration | 33 BTCPayServer.Plugins.PointOfSale.Controllers | 34 BTCPayServer | 35 (global) | 36 BTCPayServer.Hosting | 37 BTCPayServer.Plugins.Bitpay.Controllers | 38 BTCPayServer.Data.Payouts.LightningLike | 39 BTCPayServer.PayoutProcessors.Lightning | 40 BTCPayServer.Controllers.Greenfield |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 BTCPayServer.Abstractions | ||||||||||||||||||||||||||||||||||||||||
| 2 BTCPayServer.Client.Models | ||||||||||||||||||||||||||||||||||||||||
| 3 BTCPayServer.Services.Rates | ||||||||||||||||||||||||||||||||||||||||
| 4 BTCPayServer.Abstractions.Models | 3 | |||||||||||||||||||||||||||||||||||||||
| 5 BTCPayServer.Logging | 2 | |||||||||||||||||||||||||||||||||||||||
| 6 BTCPayServer.Payouts | 1 | 1 | ||||||||||||||||||||||||||||||||||||||
| 7 BTCPayServer.Abstractions.Contracts | 2 | |||||||||||||||||||||||||||||||||||||||
| 8 BTCPayServer.Services.Invoices | 1 | 11 | 1 | 1 | 1 | 1 | 11 | 13 | 8 | |||||||||||||||||||||||||||||||
| 9 BTCPayServer.Events | 5 | 5 | 1 | 1 | 4 | 17 | 2 | |||||||||||||||||||||||||||||||||
| 10 BTCPayServer.PaymentRequest | 1 | 1 | 2 | 1 | 4 | 2 | 1 | 2 | ||||||||||||||||||||||||||||||||
| 11 BTCPayServer.Services.Stores | 1 | 2 | 1 | 1 | 13 | 1 | ||||||||||||||||||||||||||||||||||
| 12 BTCPayServer.Plugins.Crowdfund.Controllers | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||||||||||||
| 13 BTCPayServer.Services.Wallets | 2 | 2 | 2 | 1 | 2 | 6 | 1 | 3 | 8 | |||||||||||||||||||||||||||||||
| 14 BTCPayServer.Plugins.Wallets.Views.ViewModels | 2 | 1 | 1 | 1 | 9 | 2 | 4 | |||||||||||||||||||||||||||||||||
| 15 BTCPayServer.Services.Apps | 6 | 1 | 1 | 4 | 1 | 1 | 1 | 1 | 6 | 3 | ||||||||||||||||||||||||||||||
| 16 BTCPayServer.HostedServices | 1 | 4 | 7 | 14 | 2 | 6 | 11 | 2 | 1 | 1 | 1 | 1 | 12 | 26 | 4 | 25 | ||||||||||||||||||||||||
| 17 BTCPayServer.Services.Reporting | 3 | 1 | 11 | 2 | 1 | 1 | 1 | 11 | 3 | 2 | ||||||||||||||||||||||||||||||
| 18 BTCPayServer.Services | 3 | 4 | 1 | 3 | 1 | 7 | 3 | 1 | 1 | 1 | 2 | 1 | 6 | 16 | 5 | 26 | ||||||||||||||||||||||||
| 19 BTCPayServer.Models | 1 | 1 | 1 | 2 | 1 | 1 | 2 | 2 | ||||||||||||||||||||||||||||||||
| 20 BTCPayServer.Plugins.Emails.Services | 1 | 4 | 2 | 8 | 1 | 4 | ||||||||||||||||||||||||||||||||||
| 21 BTCPayServer.Payments.Bitcoin | 1 | 1 | 1 | 10 | 3 | 1 | 5 | 1 | 19 | 13 | ||||||||||||||||||||||||||||||
| 22 BTCPayServer.Payments.Lightning | 3 | 2 | 1 | 13 | 2 | 3 | 12 | 1 | 1 | 27 | 1 | 5 | 12 | |||||||||||||||||||||||||||
| 23 BTCPayServer.Payments | 1 | 3 | 13 | 1 | 1 | 9 | 1 | |||||||||||||||||||||||||||||||||
| 24 BTCPayServer.Data | 7 | 1 | 5 | 2 | 7 | 2 | 1 | 8 | 5 | |||||||||||||||||||||||||||||||
| 25 BTCPayServer.Models.StoreViewModels | 4 | 1 | 1 | 1 | 3 | 2 | 5 | |||||||||||||||||||||||||||||||||
| 26 BTCPayServer.PayoutProcessors | 1 | 5 | 1 | 1 | 1 | 3 | 1 | 15 | 4 | |||||||||||||||||||||||||||||||
| 27 BTCPayServer.Plugins.Emails.Views | 1 | 2 | ||||||||||||||||||||||||||||||||||||||
| 28 BTCPayServer.Plugins.Webhooks | 4 | 1 | 1 | 1 | 6 | 1 | ||||||||||||||||||||||||||||||||||
| 29 BTCPayServer.Plugins.Subscriptions | 2 | 11 | 2 | 1 | 1 | 2 | 2 | 2 | 3 | 4 | 3 | 6 | 2 | 1 | 2 | |||||||||||||||||||||||||
| 30 BTCPayServer.Plugins.Monetization | 1 | 1 | 2 | 1 | 9 | 6 | 1 | 1 | 1 | |||||||||||||||||||||||||||||||
| 31 BTCPayServer.Controllers | 7 | 10 | 2 | 4 | 6 | 13 | 1 | 13 | 7 | 18 | 4 | 8 | 74 | 3 | 3 | 1 | 11 | 31 | 18 | 2 | 1 | 1 | 8 | 37 | 2 | |||||||||||||||
| 32 BTCPayServer.Configuration | 1 | 1 | 2 | |||||||||||||||||||||||||||||||||||||
| 33 BTCPayServer.Plugins.PointOfSale.Controllers | 1 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | ||||||||||||||||||||||||||||||||
| 34 BTCPayServer | 2 | 1 | 5 | 1 | 1 | 8 | 1 | 1 | 1 | 2 | 10 | 2 | 4 | 3 | 16 | 1 | 1 | 1 | 1 | 2 | ||||||||||||||||||||
| 35 (global) | 2 | 2 | 1 | 2 | 1 | 1 | 2 | 3 | 1 | 1 | 12 | 5 | ||||||||||||||||||||||||||||
| 36 BTCPayServer.Hosting | 1 | 2 | 2 | 1 | 4 | 1 | 1 | 1 | 6 | 2 | 5 | 3 | 5 | |||||||||||||||||||||||||||
| 37 BTCPayServer.Plugins.Bitpay.Controllers | 1 | 3 | 5 | 2 | 1 | 5 | 2 | 3 | 1 | 1 | ||||||||||||||||||||||||||||||
| 38 BTCPayServer.Data.Payouts.LightningLike | 1 | 1 | 3 | 2 | 1 | 1 | 2 | 1 | 1 | 10 | 2 | 3 | 1 | 1 | ||||||||||||||||||||||||||
| 39 BTCPayServer.PayoutProcessors.Lightning | 5 | 1 | 1 | 1 | 1 | 2 | 6 | 3 | 1 | 3 | 3 | |||||||||||||||||||||||||||||
| 40 BTCPayServer.Controllers.Greenfield | 78 | 6 | 1 | 2 | 9 | 12 | 1 | 11 | 7 | 3 | 6 | 30 | 1 | 5 | 23 | 5 | 3 | 3 | 20 | 1 |
4→7 BTCPayServer.Abstractions.Models uses BTCPayServer.Abstractions.Contracts part of a loop✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Abstractions.Models uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Abstractions.Models.BaseBTCPayServerPlugin→BTCPayServer.Abstractions.Contracts.IBTCPayServerPluginBTCPayServer.Abstractions.Models.BaseBTCPayServerPlugin→BTCPayServer.Abstractions.Contracts.PluginDependencyBTCPayServer.Abstractions.Models.UploadImageResultModel→BTCPayServer.Abstractions.Contracts.IStoredFile
- Direction
- BTCPayServer.Abstractions.Models uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Abstractions.Models, while a change to BTCPayServer.Abstractions.Models can't break BTCPayServer.Abstractions.Contracts.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
5→24 BTCPayServer.Logging uses BTCPayServer.Data part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Logging uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Logging.InvoiceLog→BTCPayServer.Data.EventSeverityBTCPayServer.Logging.InvoiceLogs→BTCPayServer.Data.EventSeverity
- Direction
- BTCPayServer.Logging uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Logging, while a change to BTCPayServer.Logging can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
6→34 BTCPayServer.Payouts uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payouts uses a type in BTCPayServer.
- The types involved
BTCPayServer.Payouts.PayoutMethodHandlerDictionary→BTCPayServer.HandlersDictionary
- Direction
- BTCPayServer.Payouts uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Payouts, while a change to BTCPayServer.Payouts can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
6→35 BTCPayServer.Payouts uses (global) part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payouts uses a type in (global).
- The types involved
BTCPayServer.Payouts.PayoutMethodHandlerDictionary→IPayoutHandler
- Direction
- BTCPayServer.Payouts uses (global), so a change to (global) can break BTCPayServer.Payouts, while a change to BTCPayServer.Payouts can't break (global).
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
7→4 BTCPayServer.Abstractions.Contracts uses BTCPayServer.Abstractions.Models✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Abstractions.Contracts uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Abstractions.Contracts.BaseDbContextFactory→BTCPayServer.Abstractions.Models.DatabaseOptionsBTCPayServer.Abstractions.Contracts.IFileService→BTCPayServer.Abstractions.Models.UploadImageResultModel
- Direction
- BTCPayServer.Abstractions.Contracts uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Abstractions.Contracts, while a change to BTCPayServer.Abstractions.Contracts can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Abstractions.Contracts uses a module listed above it, which is the healthy direction.
8→1 BTCPayServer.Services.Invoices uses BTCPayServer.Abstractions✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Abstractions.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Abstractions.RequestBaseUrl
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Abstractions, so a change to BTCPayServer.Abstractions can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Abstractions.
- Position
- Below the diagonal: BTCPayServer.Services.Invoices uses a module listed above it, which is the healthy direction.
8→2 BTCPayServer.Services.Invoices uses BTCPayServer.Client.Models✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Client.Models.InvoiceExceptionStatusBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Client.Models.InvoiceStatusBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Client.Models.InvoiceTypeBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Client.Models.ReceiptOptionsBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Client.Models.SpeedPolicyBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Client.Models.InvoiceStatusBTCPayServer.Services.Invoices.InvoiceState→BTCPayServer.Client.Models.InvoiceExceptionStatusBTCPayServer.Services.Invoices.InvoiceState→BTCPayServer.Client.Models.InvoiceStatusBTCPayServer.Services.Invoices.InvoiceStatusLegacyExtensions→BTCPayServer.Client.Models.InvoiceExceptionStatusBTCPayServer.Services.Invoices.InvoiceStatusLegacyExtensions→BTCPayServer.Client.Models.InvoiceStatusBTCPayServer.Services.Invoices.PosReceiptData→BTCPayServer.Client.Models.AppItem
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services.Invoices uses a module listed above it, which is the healthy direction.
8→3 BTCPayServer.Services.Invoices uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Services.Invoices uses a module listed above it, which is the healthy direction.
8→5 BTCPayServer.Services.Invoices uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Logging.InvoiceLogs
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Services.Invoices uses a module listed above it, which is the healthy direction.
8→18 BTCPayServer.Services.Invoices uses BTCPayServer.Services part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Services.Invoices.PosReceiptData→BTCPayServer.Services.DisplayFormatter
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
8→19 BTCPayServer.Services.Invoices uses BTCPayServer.Models part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Models.InvoiceResponse
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Models.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
8→23 BTCPayServer.Services.Invoices uses BTCPayServer.Payments part of a loop✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Payments.IPaymentMethodBitpayAPIExtensionBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Payments.InvoiceCreationContextBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Payments.PaymentMethodContextBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.Invoices.PaymentBlob→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Services.Invoices.PaymentEntity→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Services.Invoices.PaymentPrompt→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.Invoices.PaymentPromptDictionary→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
8→24 BTCPayServer.Services.Invoices uses BTCPayServer.Data part of a loop✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Data.RefundDataBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.Data.StoreDataBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.AppDataBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.EventSeverityBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.InvoiceDataBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.InvoiceEventDataBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.Data.WebhookDeliveryDataBTCPayServer.Services.Invoices.PaymentEntity→BTCPayServer.Data.PaymentStatusBTCPayServer.Services.Invoices.PaymentService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Invoices.PaymentService→BTCPayServer.Data.PaymentDataBTCPayServer.Services.Invoices.RateBook→BTCPayServer.Data.WalletObjectData
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
8→34 BTCPayServer.Services.Invoices uses BTCPayServer part of a loop✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Services.Invoices uses a type in BTCPayServer.
- The types involved
BTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.Invoices.InvoiceEntity→BTCPayServer.IHasAdditionalDataBTCPayServer.Services.Invoices.InvoiceMetadata→BTCPayServer.IHasAdditionalDataBTCPayServer.Services.Invoices.InvoiceQuery→BTCPayServer.SearchStringBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Services.Invoices.InvoiceRepository→BTCPayServer.EventAggregatorBTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary→BTCPayServer.HandlersDictionaryBTCPayServer.Services.Invoices.PaymentService→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Services.Invoices uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services.Invoices, while a change to BTCPayServer.Services.Invoices can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
9→1 BTCPayServer.Events uses BTCPayServer.Abstractions✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.Abstractions.
- The types involved
BTCPayServer.Events.BypassMonetizationChanged→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Events.CreditRefunded→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Events.Invited→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Events.NewSubscriber→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Events.Registered→BTCPayServer.Abstractions.RequestBaseUrl
- Direction
- BTCPayServer.Events uses BTCPayServer.Abstractions, so a change to BTCPayServer.Abstractions can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.Abstractions.
- Position
- Below the diagonal: BTCPayServer.Events uses a module listed above it, which is the healthy direction.
9→8 BTCPayServer.Events uses BTCPayServer.Services.Invoices✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Events.InvoiceDataChangedEvent→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Events.InvoiceDataChangedEvent→BTCPayServer.Services.Invoices.InvoiceStateBTCPayServer.Events.InvoiceEvent→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Events.InvoiceEvent→BTCPayServer.Services.Invoices.PaymentEntityBTCPayServer.Events.InvoicePaymentMethodActivated→BTCPayServer.Services.Invoices.InvoiceEntity
- Direction
- BTCPayServer.Events uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Events uses a module listed above it, which is the healthy direction.
9→16 BTCPayServer.Events uses BTCPayServer.HostedServices part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Events.NBXplorerStateChangedEvent→BTCPayServer.HostedServices.NBXplorerState
- Direction
- BTCPayServer.Events uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.HostedServices.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
9→18 BTCPayServer.Events uses BTCPayServer.Services part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Events.Registered→BTCPayServer.Services.CallbackGenerator
- Direction
- BTCPayServer.Events uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
9→23 BTCPayServer.Events uses BTCPayServer.Payments part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Events.InvoiceNewPaymentDetailsEvent→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Events.InvoicePaymentMethodActivated→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Events.NewBlockEvent→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Events.NewOnChainTransactionEvent→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Events uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
9→24 BTCPayServer.Events uses BTCPayServer.Data part of a loop✕
- Connections
- 17 pairs of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Events.Accepted→BTCPayServer.Data.StoreInvitationRowBTCPayServer.Events.AppEvent→BTCPayServer.Data.AppDataBTCPayServer.Events.Approved→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.BypassMonetizationChanged→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.ConfirmationEmailRequested→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.ConfirmedEmail→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.Created→BTCPayServer.Data.AppDataBTCPayServer.Events.Deleted→BTCPayServer.Data.AppDataBTCPayServer.Events.DisabledChanged→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.Invited→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.PasswordResetRequested→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.Registered→BTCPayServer.Data.ApplicationUserBTCPayServer.Events.Removed→BTCPayServer.Data.StoreDataBTCPayServer.Events.StoreEvent→BTCPayServer.Data.StoreDataBTCPayServer.Events.StoreUserInvitationEvent→BTCPayServer.Data.StoreInvitationRowBTCPayServer.Events.Updated→BTCPayServer.Data.AppDataBTCPayServer.Events.UserEvent→BTCPayServer.Data.ApplicationUser
- Direction
- BTCPayServer.Events uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
9→34 BTCPayServer.Events uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Events uses a type in BTCPayServer.
- The types involved
BTCPayServer.Events.NBXplorerStateChangedEvent→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Events.WalletChangedEvent→BTCPayServer.WalletId
- Direction
- BTCPayServer.Events uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Events, while a change to BTCPayServer.Events can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
10→3 BTCPayServer.PaymentRequest uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.PaymentRequest uses a module listed above it, which is the healthy direction.
10→5 BTCPayServer.PaymentRequest uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.PaymentRequest uses a module listed above it, which is the healthy direction.
10→8 BTCPayServer.PaymentRequest uses BTCPayServer.Services.Invoices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.PaymentRequest uses a module listed above it, which is the healthy direction.
10→16 BTCPayServer.PaymentRequest uses BTCPayServer.HostedServices part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.HostedServices.EventHostedServiceBase
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.HostedServices.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
10→18 BTCPayServer.PaymentRequest uses BTCPayServer.Services part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Services.DisplayFormatterBTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Services.TransactionLinkProvidersBTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.Services.DelayedTaskSchedulerBTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.Services.PrettyNameProvider
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
10→24 BTCPayServer.PaymentRequest uses BTCPayServer.Data part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.Data.PaymentRequestDataBTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.Data.PaymentRequestData
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
10→31 BTCPayServer.PaymentRequest uses BTCPayServer.Controllers part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestHub→BTCPayServer.Controllers.UIPaymentRequestController
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.Controllers.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
10→34 BTCPayServer.PaymentRequest uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.PaymentRequest uses a type in BTCPayServer.
- The types involved
BTCPayServer.PaymentRequest.PaymentRequestService→BTCPayServer.BTCPayNetworkProviderBTCPayServer.PaymentRequest.PaymentRequestStreamer→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.PaymentRequest uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.PaymentRequest, while a change to BTCPayServer.PaymentRequest can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
11→2 BTCPayServer.Services.Stores uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.Stores.RestrictedStoreData→BTCPayServer.Client.Models.SpeedPolicy
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services.Stores uses a module listed above it, which is the healthy direction.
11→7 BTCPayServer.Services.Stores uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Services.Stores.ScopeProvider→BTCPayServer.Abstractions.Contracts.IScopeProviderBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Abstractions.Contracts.IStoreRepository
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Services.Stores uses a module listed above it, which is the healthy direction.
11→18 BTCPayServer.Services.Stores uses BTCPayServer.Services part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Services.SettingsRepository
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
11→23 BTCPayServer.Services.Stores uses BTCPayServer.Payments part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
11→24 BTCPayServer.Services.Stores uses BTCPayServer.Data part of a loop✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.Stores.GeneratedInvitation→BTCPayServer.Data.StoreInvitationRowBTCPayServer.Services.Stores.RestrictedStoreData→BTCPayServer.Data.StoreBlobBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.StoreDataBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.StoreInvitationExtendedRowBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.StoreInvitationRowBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.StoreRoleBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.UserStoreBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.WebhookBlobBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.WebhookDataBTCPayServer.Services.Stores.StoreRepository→BTCPayServer.Data.WebhookDeliveryDataBTCPayServer.Services.Stores.StoreUser→BTCPayServer.Data.UserBlob
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
11→34 BTCPayServer.Services.Stores uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Stores uses a type in BTCPayServer.
- The types involved
BTCPayServer.Services.Stores.StoreRepository→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Services.Stores uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services.Stores, while a change to BTCPayServer.Services.Stores can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
12→3 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Plugins.Crowdfund.Controllers uses a module listed above it, which is the healthy direction.
12→7 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Abstractions.Contracts.IFileService
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Plugins.Crowdfund.Controllers uses a module listed above it, which is the healthy direction.
12→11 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Plugins.Crowdfund.Controllers uses a module listed above it, which is the healthy direction.
12→15 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Apps part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Services.Apps.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
12→18 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Services.UriResolver
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
12→24 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Data part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Data.AppData
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
12→31 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Controllers part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.Controllers.UIInvoiceController
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.Controllers.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
12→34 BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Crowdfund.Controllers uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Plugins.Crowdfund.Controllers uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Crowdfund.Controllers, while a change to BTCPayServer.Plugins.Crowdfund.Controllers can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
13→2 BTCPayServer.Services.Wallets uses BTCPayServer.Client.Models✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.Client.Models.HistogramDataBTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.Client.Models.HistogramType
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services.Wallets uses a module listed above it, which is the healthy direction.
13→5 BTCPayServer.Services.Wallets uses BTCPayServer.Logging✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.Logging.LogsBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Services.Wallets uses a module listed above it, which is the healthy direction.
13→8 BTCPayServer.Services.Wallets uses BTCPayServer.Services.Invoices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Services.Wallets uses a module listed above it, which is the healthy direction.
13→11 BTCPayServer.Services.Wallets uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Services.Wallets uses a module listed above it, which is the healthy direction.
13→16 BTCPayServer.Services.Wallets uses BTCPayServer.HostedServices part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.HostedServices.NBXplorerDashboard
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.HostedServices.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
13→18 BTCPayServer.Services.Wallets uses BTCPayServer.Services part of a loop✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.Services.NBXplorerConnectionFactoryBTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.Services.WalletRepositoryBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.Services.NBXplorerConnectionFactoryBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.Services.WalletRepositoryBTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.Services.NBXplorerConnectionFactoryBTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.Services.WalletRepository
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
13→23 BTCPayServer.Services.Wallets uses BTCPayServer.Payments part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
13→24 BTCPayServer.Services.Wallets uses BTCPayServer.Data part of a loop✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.Data.StoreData
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
13→34 BTCPayServer.Services.Wallets uses BTCPayServer part of a loop✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Services.Wallets uses a type in BTCPayServer.
- The types involved
BTCPayServer.Services.Wallets.BTCPayWallet→BTCPayServer.BTCPayNetworkBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.Wallets.BTCPayWalletProvider→BTCPayServer.ExplorerClientProviderBTCPayServer.Services.Wallets.WalletHistogramService→BTCPayServer.WalletIdBTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.EventAggregatorBTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.ExplorerClientProviderBTCPayServer.Services.Wallets.WalletReceiveService→BTCPayServer.WalletId
- Direction
- BTCPayServer.Services.Wallets uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services.Wallets, while a change to BTCPayServer.Services.Wallets can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
14→2 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Client.Models✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.PayoutsModel→BTCPayServer.Client.Models.PayoutStateBTCPayServer.Plugins.Wallets.Views.ViewModels.PullPaymentsModel→BTCPayServer.Client.Models.PullPaymentState
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Wallets.Views.ViewModels uses a module listed above it, which is the healthy direction.
14→6 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.PayoutsModel→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Plugins.Wallets.Views.ViewModels uses a module listed above it, which is the healthy direction.
14→8 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.TransactionViewModel→BTCPayServer.Services.Invoices.RateBook
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Plugins.Wallets.Views.ViewModels uses a module listed above it, which is the healthy direction.
14→13 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Services.Wallets✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.TransactionViewModel→BTCPayServer.Services.Wallets.TransactionHistoryLine
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Plugins.Wallets.Views.ViewModels uses a module listed above it, which is the healthy direction.
14→19 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Models part of a loop✕
- Connections
- 9 pairs of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.ListTransactionsViewModel→BTCPayServer.Models.BasePagingViewModelBTCPayServer.Plugins.Wallets.Views.ViewModels.PayoutsModel→BTCPayServer.Models.BasePagingViewModelBTCPayServer.Plugins.Wallets.Views.ViewModels.PullPaymentsModel→BTCPayServer.Models.BasePagingViewModelBTCPayServer.Plugins.Wallets.Views.ViewModels.SignWithSeedViewModel→BTCPayServer.Models.IHasBackAndReturnUrlBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletPSBTCombineViewModel→BTCPayServer.Models.IHasBackAndReturnUrlBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletPSBTReadyViewModel→BTCPayServer.Models.IHasBackAndReturnUrlBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletSendModel→BTCPayServer.Models.IHasBackAndReturnUrlBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletSendVaultModel→BTCPayServer.Models.IHasBackAndReturnUrlBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletSigningOptionsModel→BTCPayServer.Models.IHasBackAndReturnUrl
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Models.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
14→24 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Data part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.ListTransactionsViewModel→BTCPayServer.Data.PendingTransactionBTCPayServer.Plugins.Wallets.Views.ViewModels.UpdatePullPaymentModel→BTCPayServer.Data.PullPaymentData
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
14→34 BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Plugins.Wallets.Views.ViewModels uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Wallets.Views.ViewModels.ListTransactionsViewModel→BTCPayServer.SearchStringBTCPayServer.Plugins.Wallets.Views.ViewModels.ListWalletsViewModel→BTCPayServer.BTCPayNetworkBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletLabelsModel→BTCPayServer.WalletIdBTCPayServer.Plugins.Wallets.Views.ViewModels.WalletViewModel→BTCPayServer.WalletId
- Direction
- BTCPayServer.Plugins.Wallets.Views.ViewModels uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Wallets.Views.ViewModels, while a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
15→2 BTCPayServer.Services.Apps uses BTCPayServer.Client.Models✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.Apps.AppService→BTCPayServer.Client.Models.AppCartItemBTCPayServer.Services.Apps.AppService→BTCPayServer.Client.Models.AppItemBTCPayServer.Services.Apps.AppService→BTCPayServer.Client.Models.AppItemStatsBTCPayServer.Services.Apps.AppService→BTCPayServer.Client.Models.AppSalesStatsBTCPayServer.Services.Apps.IHasItemStatsAppType→BTCPayServer.Client.Models.AppItemStatsBTCPayServer.Services.Apps.IHasSaleStatsAppType→BTCPayServer.Client.Models.AppSalesStats
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→3 BTCPayServer.Services.Apps uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Services.Apps.AppService→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→5 BTCPayServer.Services.Apps uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Services.Apps.AppHubStreamer→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→8 BTCPayServer.Services.Apps uses BTCPayServer.Services.Invoices✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Services.Apps.AppService→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Services.Apps.AppService→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.Apps.IHasItemStatsAppType→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Services.Apps.IHasSaleStatsAppType→BTCPayServer.Services.Invoices.InvoiceEntity
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→11 BTCPayServer.Services.Apps uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Services.Apps.AppService→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→12 BTCPayServer.Services.Apps uses BTCPayServer.Plugins.Crowdfund.Controllers✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Plugins.Crowdfund.Controllers.
- The types involved
BTCPayServer.Services.Apps.AppHub→BTCPayServer.Plugins.Crowdfund.Controllers.UICrowdfundController
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Plugins.Crowdfund.Controllers, so a change to BTCPayServer.Plugins.Crowdfund.Controllers can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Plugins.Crowdfund.Controllers.
- Position
- Below the diagonal: BTCPayServer.Services.Apps uses a module listed above it, which is the healthy direction.
15→16 BTCPayServer.Services.Apps uses BTCPayServer.HostedServices part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Services.Apps.AppHubStreamer→BTCPayServer.HostedServices.EventHostedServiceBase
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.HostedServices.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
15→18 BTCPayServer.Services.Apps uses BTCPayServer.Services part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Services.Apps.AppHubStreamer→BTCPayServer.Services.PrettyNameProvider
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
15→24 BTCPayServer.Services.Apps uses BTCPayServer.Data part of a loop✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.Apps.AppBaseType→BTCPayServer.Data.AppDataBTCPayServer.Services.Apps.AppService→BTCPayServer.Data.AppDataBTCPayServer.Services.Apps.AppService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Apps.AppService→BTCPayServer.Data.StoreDataBTCPayServer.Services.Apps.IHasItemStatsAppType→BTCPayServer.Data.AppDataBTCPayServer.Services.Apps.IHasSaleStatsAppType→BTCPayServer.Data.AppData
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
15→34 BTCPayServer.Services.Apps uses BTCPayServer part of a loop✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services.Apps uses a type in BTCPayServer.
- The types involved
BTCPayServer.Services.Apps.AppHubStreamer→BTCPayServer.EventAggregatorBTCPayServer.Services.Apps.AppService→BTCPayServer.EventAggregatorBTCPayServer.Services.Apps.CrowdfundSettings→BTCPayServer.UnresolvedUri
- Direction
- BTCPayServer.Services.Apps uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services.Apps, while a change to BTCPayServer.Services.Apps can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
16→1 BTCPayServer.HostedServices uses BTCPayServer.Abstractions✕
- Connections
- 1 pair of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Abstractions.
- The types involved
BTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.Abstractions.RequestBaseUrl
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Abstractions, so a change to BTCPayServer.Abstractions can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Abstractions.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→2 BTCPayServer.HostedServices uses BTCPayServer.Client.Models✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.HostedServices.LegacyWalletTransactionInfo→BTCPayServer.Client.Models.LabelDataBTCPayServer.HostedServices.MarkPayoutRequest→BTCPayServer.Client.Models.PayoutStateBTCPayServer.HostedServices.PayoutQuery→BTCPayServer.Client.Models.PayoutStateBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Client.Models.CreatePullPaymentRequest
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→3 BTCPayServer.HostedServices uses BTCPayServer.Services.Rates✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.HostedServices.ExchangeRatesCache→BTCPayServer.Services.Rates.BackgroundFetcherStateBTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.Rates.RateResultBTCPayServer.HostedServices.RatesHostedService→BTCPayServer.Services.Rates.BackgroundFetcherRateProviderBTCPayServer.HostedServices.RatesHostedService→BTCPayServer.Services.Rates.RateProviderFactory
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→5 BTCPayServer.HostedServices uses BTCPayServer.Logging✕
- Connections
- 14 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.HostedServices.AppInventoryUpdaterHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.BackgroundJobClient→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.BackgroundJobSchedulerHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.BaseAsyncService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.DelayedTransactionBroadcasterHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.EventHostedServiceBase→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.InvoiceEventSaverService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.NBXplorerWaiter→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.NBXplorerWaiters→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Logging.LogsBTCPayServer.HostedServices.TransactionLabelMarkerHostedService→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→6 BTCPayServer.HostedServices uses BTCPayServer.Payouts✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.HostedServices.ClaimRequest→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→7 BTCPayServer.HostedServices uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.HostedServices.BlobMigratorHostedService→BTCPayServer.Abstractions.Contracts.ISettingsRepositoryBTCPayServer.HostedServices.Handler→BTCPayServer.Abstractions.Contracts.NotificationViewModelBTCPayServer.HostedServices.InvoiceBlobMigratorHostedService→BTCPayServer.Abstractions.Contracts.ISettingsRepositoryBTCPayServer.HostedServices.PaymentRequestsMigratorHostedService→BTCPayServer.Abstractions.Contracts.ISettingsRepositoryBTCPayServer.HostedServices.PluginUpdateNotification→BTCPayServer.Abstractions.Contracts.BaseNotificationBTCPayServer.HostedServices.SettingsAccessorsStartupTask→BTCPayServer.Abstractions.Contracts.IStartupTask
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→8 BTCPayServer.HostedServices uses BTCPayServer.Services.Invoices✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.HostedServices.InvoiceBlobMigratorHostedService→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.HostedServices.InvoiceEventSaverService→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.Services.Invoices.PaymentServiceBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.HostedServices.TopUpRequest→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.HostedServices.TransactionLabelMarkerHostedService→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.HostedServices.UpdateInvoiceContext→BTCPayServer.Services.Invoices.InvoiceEntity
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→9 BTCPayServer.HostedServices uses BTCPayServer.Events✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Events.
- The types involved
BTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.Events.NewOnChainTransactionEventBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Events.InvoiceEvent
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Events, so a change to BTCPayServer.Events can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Events.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→10 BTCPayServer.HostedServices uses BTCPayServer.PaymentRequest✕
- Connections
- 1 pair of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.PaymentRequest.
- The types involved
BTCPayServer.HostedServices.PaymentRequestsMigratorHostedService→BTCPayServer.PaymentRequest.PaymentRequestStreamer
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.PaymentRequest, so a change to BTCPayServer.PaymentRequest can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.PaymentRequest.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→11 BTCPayServer.HostedServices uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→14 BTCPayServer.HostedServices uses BTCPayServer.Plugins.Wallets.Views.ViewModels✕
- Connections
- 1 pair of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Plugins.Wallets.Views.ViewModels.
- The types involved
BTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Plugins.Wallets.Views.ViewModels.ProgressModel
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Plugins.Wallets.Views.ViewModels, so a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Plugins.Wallets.Views.ViewModels.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→15 BTCPayServer.HostedServices uses BTCPayServer.Services.Apps✕
- Connections
- 1 pair of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.HostedServices.AppInventoryUpdaterHostedService→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.HostedServices uses a module listed above it, which is the healthy direction.
16→18 BTCPayServer.HostedServices uses BTCPayServer.Services part of a loop✕
- Connections
- 12 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.HostedServices.BackgroundJobClient→BTCPayServer.Services.IBackgroundJobClientBTCPayServer.HostedServices.BackgroundJobSchedulerHostedService→BTCPayServer.Services.IBackgroundJobClientBTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Services.SettingsRepositoryBTCPayServer.HostedServices.DelayedTransactionBroadcasterHostedService→BTCPayServer.Services.DelayedTransactionBroadcasterBTCPayServer.HostedServices.GithubVersionFetcher→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.HostedServices.GithubVersionFetcher→BTCPayServer.Services.SettingsRepositoryBTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.Services.WalletRepositoryBTCPayServer.HostedServices.PluginUpdateFetcher→BTCPayServer.Services.SettingsRepositoryBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Services.DisplayFormatterBTCPayServer.HostedServices.SettingsAccessorsStartupTask→BTCPayServer.Services.SettingsRepositoryBTCPayServer.HostedServices.TransactionLabelMarkerHostedService→BTCPayServer.Services.WalletRepository
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
16→24 BTCPayServer.HostedServices uses BTCPayServer.Data part of a loop✕
- Connections
- 26 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Data. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.HostedServices.BlobMigratorHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.HostedServices.BlobMigratorHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.ClaimRequest→BTCPayServer.Data.IClaimDestinationBTCPayServer.HostedServices.ClaimResponse→BTCPayServer.Data.PayoutDataBTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Data.WalletTransactionDataBTCPayServer.HostedServices.DbPeriodicTask→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.InvoiceBlobMigratorHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.HostedServices.InvoiceBlobMigratorHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.InvoiceBlobMigratorHostedService→BTCPayServer.Data.InvoiceDataBTCPayServer.HostedServices.MarkPayoutRequest→BTCPayServer.Data.PayoutBlobBTCPayServer.HostedServices.PaymentRequestsMigratorHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.HostedServices.PaymentRequestsMigratorHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.PaymentRequestsMigratorHostedService→BTCPayServer.Data.PaymentRequestDataBTCPayServer.HostedServices.PayoutEvent→BTCPayServer.Data.PayoutDataBTCPayServer.HostedServices.PendingTransactionEvent→BTCPayServer.Data.PendingTransactionBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.Data.PendingTransactionBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.Data.PendingTransactionBlobBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Data.PayoutDataBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Data.PullPaymentBlobBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.Data.PullPaymentData
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
16→32 BTCPayServer.HostedServices uses BTCPayServer.Configuration part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.HostedServices.DbMigrationsHostedService→BTCPayServer.Configuration.DataDirectoriesBTCPayServer.HostedServices.GithubVersionFetcher→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.HostedServices.Handler→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.HostedServices.RatesHostedService→BTCPayServer.Configuration.DataDirectories
- Direction
- BTCPayServer.HostedServices uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.Configuration.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
16→34 BTCPayServer.HostedServices uses BTCPayServer part of a loop✕
- Connections
- 25 pairs of types, where a type in BTCPayServer.HostedServices uses a type in BTCPayServer.
- The types involved
BTCPayServer.HostedServices.AppInventoryUpdaterHostedService→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.BackgroundJob→BTCPayServer.IDelayBTCPayServer.HostedServices.BackgroundJobClient→BTCPayServer.IDelayBTCPayServer.HostedServices.EventHostedServiceBase→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.EventHostedServiceBase→BTCPayServer.IEventAggregatorSubscriptionBTCPayServer.HostedServices.InvoiceEventSaverService→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.InvoiceWatcher→BTCPayServer.ExplorerClientProviderBTCPayServer.HostedServices.NBXplorerDashboard→BTCPayServer.BTCPayNetworkBaseBTCPayServer.HostedServices.NBXplorerDashboard→BTCPayServer.GetMempoolInfoResponseBTCPayServer.HostedServices.NBXplorerSummary→BTCPayServer.BTCPayNetworkBaseBTCPayServer.HostedServices.NBXplorerSummary→BTCPayServer.GetMempoolInfoResponseBTCPayServer.HostedServices.NBXplorerWaiter→BTCPayServer.BTCPayNetworkBTCPayServer.HostedServices.NBXplorerWaiter→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.NBXplorerWaiters→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.NBXplorerWaiters→BTCPayServer.ExplorerClientProviderBTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.DefaultRulesCollectionBTCPayServer.HostedServices.OnChainRateTrackerHostedService→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.BTCPayNetworkProviderBTCPayServer.HostedServices.PendingTransactionService→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.BTCPayNetworkProviderBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.DefaultRulesCollectionBTCPayServer.HostedServices.PullPaymentHostedService→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.SettingsAccessorsStartupTask→BTCPayServer.EventAggregatorBTCPayServer.HostedServices.TransactionLabelMarkerHostedService→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.HostedServices uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.HostedServices, while a change to BTCPayServer.HostedServices can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
17→2 BTCPayServer.Services.Reporting uses BTCPayServer.Client.Models✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.Reporting.MetadataFields→BTCPayServer.Client.Models.FieldBTCPayServer.Services.Reporting.ViewDefinition→BTCPayServer.Client.Models.ChartDefinitionBTCPayServer.Services.Reporting.ViewDefinition→BTCPayServer.Client.Models.Field
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→6 BTCPayServer.Services.Reporting uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Services.Reporting.PayoutsReportProvider→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→8 BTCPayServer.Services.Reporting uses BTCPayServer.Services.Invoices✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Services.Reporting.Context→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Services.Reporting.InvoicesReportProvider→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Services.Reporting.InvoicesReportProvider→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.Reporting.InvoicesReportProvider→BTCPayServer.Services.Invoices.PaymentEntityBTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Services.Reporting.PaymentRequestsReportProvider→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.Reporting.PaymentRequestsReportProvider→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Services.Reporting.PaymentsReportProvider→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.Reporting.PaymentsReportProvider→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Services.Reporting.ProductsReportProvider→BTCPayServer.Services.Invoices.InvoiceRepository
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→11 BTCPayServer.Services.Reporting uses BTCPayServer.Services.Stores✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Services.Reporting.InvoicesReportProvider→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→13 BTCPayServer.Services.Reporting uses BTCPayServer.Services.Wallets✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.Wallets.BTCPayWalletProvider
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→15 BTCPayServer.Services.Reporting uses BTCPayServer.Services.Apps✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Services.Reporting.ProductsReportProvider→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→16 BTCPayServer.Services.Reporting uses BTCPayServer.HostedServices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Services.Reporting.PayoutsReportProvider→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Services.Reporting uses a module listed above it, which is the healthy direction.
17→18 BTCPayServer.Services.Reporting uses BTCPayServer.Services part of a loop✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Services.Reporting.Context→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.InvoicesReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.NBXplorerConnectionFactoryBTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.Services.WalletRepositoryBTCPayServer.Services.Reporting.PaymentRequestsReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.PaymentsReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.PayoutsReportProvider→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Services.Reporting.PayoutsReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.ProductsReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Services.Reporting.RefundsReportProvider→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Services.Reporting.RefundsReportProvider→BTCPayServer.Services.DisplayFormatter
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Services.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
17→24 BTCPayServer.Services.Reporting uses BTCPayServer.Data part of a loop✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.Reporting.PaymentRequestsReportProvider→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Reporting.PaymentsReportProvider→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.Reporting.RefundsReportProvider→BTCPayServer.Data.ApplicationDbContextFactory
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
17→34 BTCPayServer.Services.Reporting uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services.Reporting uses a type in BTCPayServer.
- The types involved
BTCPayServer.Services.Reporting.OnChainWalletReportProvider→BTCPayServer.BTCPayNetworkBTCPayServer.Services.Reporting.PaymentsReportProvider→BTCPayServer.BTCPayNetworkProvider
- Direction
- BTCPayServer.Services.Reporting uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services.Reporting, while a change to BTCPayServer.Services.Reporting can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
18→1 BTCPayServer.Services uses BTCPayServer.Abstractions✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Abstractions.
- The types involved
BTCPayServer.Services.CallbackGenerator→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Services.CanLoginContext→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Services.ServerSettings→BTCPayServer.Abstractions.RequestBaseUrl
- Direction
- BTCPayServer.Services uses BTCPayServer.Abstractions, so a change to BTCPayServer.Abstractions can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Abstractions.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→2 BTCPayServer.Services uses BTCPayServer.Client.Models✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Services.LightningHistogramService→BTCPayServer.Client.Models.HistogramDataBTCPayServer.Services.LightningHistogramService→BTCPayServer.Client.Models.HistogramTypeBTCPayServer.Services.ReportService→BTCPayServer.Client.Models.StoreReportResponseBTCPayServer.Services.ServerInfoSyncStatusData2→BTCPayServer.Client.Models.ServerInfoSyncStatusData
- Direction
- BTCPayServer.Services uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→3 BTCPayServer.Services uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Services.DisplayFormatter→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Services uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→5 BTCPayServer.Services uses BTCPayServer.Logging✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.Logging.LogsBTCPayServer.Services.NBXplorerConnectionFactory→BTCPayServer.Logging.LogsBTCPayServer.Services.TorServices→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Services uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→6 BTCPayServer.Services uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Services.BTCPayNetworkJsonSerializerSettings→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Services uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→7 BTCPayServer.Services uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Services.DefaultSwaggerProvider→BTCPayServer.Abstractions.Contracts.ISwaggerProviderBTCPayServer.Services.NBXSyncSummaryProvider→BTCPayServer.Abstractions.Contracts.ISyncStatusBTCPayServer.Services.NBXSyncSummaryProvider→BTCPayServer.Abstractions.Contracts.ISyncSummaryProviderBTCPayServer.Services.ServerInfoSyncStatusData2→BTCPayServer.Abstractions.Contracts.ISyncStatusBTCPayServer.Services.SettingsRepository→BTCPayServer.Abstractions.Contracts.ISettingsRepositoryBTCPayServer.Services.UIExtensionsRegistry→BTCPayServer.Abstractions.Contracts.IUIExtensionBTCPayServer.Services.UriResolver→BTCPayServer.Abstractions.Contracts.IFileService
- Direction
- BTCPayServer.Services uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→8 BTCPayServer.Services uses BTCPayServer.Services.Invoices✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Services.Cheater→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.InvoiceActivator→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Services.InvoiceActivator→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Services uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→11 BTCPayServer.Services uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Services.InvoiceActivator→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Services uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→13 BTCPayServer.Services uses BTCPayServer.Services.Wallets✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Services.GetWalletObjectsQuery→BTCPayServer.Services.Wallets.ReceivedCoin
- Direction
- BTCPayServer.Services uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→14 BTCPayServer.Services uses BTCPayServer.Plugins.Wallets.Views.ViewModels✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Plugins.Wallets.Views.ViewModels.
- The types involved
BTCPayServer.Services.WalletRepository→BTCPayServer.Plugins.Wallets.Views.ViewModels.ReservedAddress
- Direction
- BTCPayServer.Services uses BTCPayServer.Plugins.Wallets.Views.ViewModels, so a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Plugins.Wallets.Views.ViewModels.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→16 BTCPayServer.Services uses BTCPayServer.HostedServices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Services.NBXSyncSummaryProvider→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Services.TorServices→BTCPayServer.HostedServices.BaseAsyncService
- Direction
- BTCPayServer.Services uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→17 BTCPayServer.Services uses BTCPayServer.Services.Reporting✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Services.Reporting.
- The types involved
BTCPayServer.Services.ReportService→BTCPayServer.Services.Reporting.ReportProvider
- Direction
- BTCPayServer.Services uses BTCPayServer.Services.Reporting, so a change to BTCPayServer.Services.Reporting can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Services.Reporting.
- Position
- Below the diagonal: BTCPayServer.Services uses a module listed above it, which is the healthy direction.
18→23 BTCPayServer.Services uses BTCPayServer.Payments part of a loop✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Services.BlockExplorerOverrideItem→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.Entry→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.InvoiceActivator→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.PrettyNameProvider→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.TransactionLinkProviders→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Services.UntranslatedPrettyName→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Services uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
18→24 BTCPayServer.Services uses BTCPayServer.Data part of a loop✕
- Connections
- 16 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Services.ApplicationUserWithRoles→BTCPayServer.Data.ApplicationUserBTCPayServer.Services.BTCPayServerSecurityStampValidator→BTCPayServer.Data.ApplicationUserBTCPayServer.Services.CallbackGenerator→BTCPayServer.Data.ApplicationUserBTCPayServer.Services.CanLoginContext→BTCPayServer.Data.ApplicationUserBTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.Data.PlannedTransactionBTCPayServer.Services.SettingsRepository→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Services.SettingsRepository→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.SettingsRepository→BTCPayServer.Data.SettingDataBTCPayServer.Services.UserService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.UserService→BTCPayServer.Data.ApplicationUserBTCPayServer.Services.WalletRepository→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Services.WalletRepository→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Services.WalletRepository→BTCPayServer.Data.WalletObjectDataBTCPayServer.Services.WalletRepository→BTCPayServer.Data.WalletObjectLinkDataBTCPayServer.Services.WalletRepository→BTCPayServer.Data.WalletTransactionInfo
- Direction
- BTCPayServer.Services uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
18→32 BTCPayServer.Services uses BTCPayServer.Configuration part of a loop✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Services.BTCPayServerEnvironment→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Services.NBXplorerConnectionFactory→BTCPayServer.Configuration.NBXplorerOptionsBTCPayServer.Services.SocketFactory→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Services.Socks5HttpClientHandler→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Services.TorServices→BTCPayServer.Configuration.BTCPayServerOptions
- Direction
- BTCPayServer.Services uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.Configuration.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
18→34 BTCPayServer.Services uses BTCPayServer part of a loop✕
- Connections
- 26 pairs of types, where a type in BTCPayServer.Services uses a type in BTCPayServer. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Services.BTCPayNetworkJsonSerializerSettings→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.BTCPayServerEnvironment→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.CallbackGenerator→BTCPayServer.WalletIdBTCPayServer.Services.Cheater→BTCPayServer.ExplorerClientProviderBTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.BTCPayNetworkBTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.DelayedTransactionBroadcaster→BTCPayServer.ExplorerClientProviderBTCPayServer.Services.GetWalletObjectsQuery→BTCPayServer.WalletIdBTCPayServer.Services.IFeeProviderFactory→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Services.IJsonConverterRegistration→BTCPayServer.BTCPayNetworkBTCPayServer.Services.InvoiceActivator→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.InvoiceActivator→BTCPayServer.EventAggregatorBTCPayServer.Services.JsonConverterRegistration→BTCPayServer.BTCPayNetworkBTCPayServer.Services.LightningClientFactoryService→BTCPayServer.BTCPayNetworkBTCPayServer.Services.Record→BTCPayServer.BTCPayNetworkBTCPayServer.Services.SettingsRepository→BTCPayServer.EventAggregatorBTCPayServer.Services.ThemeSettings→BTCPayServer.UnresolvedUriBTCPayServer.Services.TorService→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Services.TorServices→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Services.TorServices→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Services.UriResolver→BTCPayServer.UnresolvedUriBTCPayServer.Services.UserService→BTCPayServer.EventAggregatorBTCPayServer.Services.WalletFileParsers→BTCPayServer.BTCPayNetworkBTCPayServer.Services.WalletFileParsers→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Services.WalletObjectId→BTCPayServer.WalletId
- Direction
- BTCPayServer.Services uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Services, while a change to BTCPayServer.Services can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
19→2 BTCPayServer.Models uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Models.PayoutLine→BTCPayServer.Client.Models.PayoutState
- Direction
- BTCPayServer.Models uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Models uses a module listed above it, which is the healthy direction.
19→3 BTCPayServer.Models uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Models.ViewPullPaymentModel→BTCPayServer.Services.Rates.CurrencyData
- Direction
- BTCPayServer.Models uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Models uses a module listed above it, which is the healthy direction.
19→6 BTCPayServer.Models uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Models.ViewPullPaymentModel→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Models uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Models uses a module listed above it, which is the healthy direction.
19→8 BTCPayServer.Models uses BTCPayServer.Services.Invoices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Models.InvoiceResponse→BTCPayServer.Services.Invoices.InvoiceCryptoInfoBTCPayServer.Models.InvoiceResponse→BTCPayServer.Services.Invoices.InvoicePaymentUrls
- Direction
- BTCPayServer.Models uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Models uses a module listed above it, which is the healthy direction.
19→18 BTCPayServer.Models uses BTCPayServer.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Models.StoreBrandingViewModel→BTCPayServer.Services.UriResolver
- Direction
- BTCPayServer.Models uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Models uses a module listed above it, which is the healthy direction.
19→23 BTCPayServer.Models uses BTCPayServer.Payments part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Models.PayoutLine→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Models uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
19→24 BTCPayServer.Models uses BTCPayServer.Data part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Models.StoreBrandingViewModel→BTCPayServer.Data.StoreBlobBTCPayServer.Models.ViewPullPaymentModel→BTCPayServer.Data.PullPaymentData
- Direction
- BTCPayServer.Models uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
19→34 BTCPayServer.Models uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Models uses a type in BTCPayServer.
- The types involved
BTCPayServer.Models.BasePagingViewModel→BTCPayServer.SearchStringBTCPayServer.Models.PostRedirectViewModel→BTCPayServer.MultiValueDictionary
- Direction
- BTCPayServer.Models uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Models, while a change to BTCPayServer.Models can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
20→2 BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.Emails.Services.EmailSettings→BTCPayServer.Client.Models.EmailSettingsData
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Services uses a module listed above it, which is the healthy direction.
20→5 BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Logging✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Plugins.Emails.Services.EmailSender→BTCPayServer.Logging.LogsBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Logging.LogsBTCPayServer.Plugins.Emails.Services.ServerEmailSender→BTCPayServer.Logging.LogsBTCPayServer.Plugins.Emails.Services.StoreEmailSender→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Services uses a module listed above it, which is the healthy direction.
20→11 BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Services.Stores✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Plugins.Emails.Services.StoreEmailSender→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Services uses a module listed above it, which is the healthy direction.
20→18 BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Services✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Emails.Services.EmailSender→BTCPayServer.Services.IBackgroundJobClientBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Services.IBackgroundJobClientBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Services.ISettingsAccessorBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Plugins.Emails.Services.ServerEmailSender→BTCPayServer.Services.IBackgroundJobClientBTCPayServer.Plugins.Emails.Services.ServerEmailSender→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Plugins.Emails.Services.StoreEmailSender→BTCPayServer.Services.IBackgroundJobClient
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Services uses a module listed above it, which is the healthy direction.
20→24 BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Data part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Emails.Services.StoreEmailSender→BTCPayServer.Data.StoreData
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
20→34 BTCPayServer.Plugins.Emails.Services uses BTCPayServer part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Plugins.Emails.Services uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Emails.Services.EmailSender→BTCPayServer.EventAggregatorBTCPayServer.Plugins.Emails.Services.EmailSenderFactory→BTCPayServer.EventAggregatorBTCPayServer.Plugins.Emails.Services.ServerEmailSender→BTCPayServer.EventAggregatorBTCPayServer.Plugins.Emails.Services.StoreEmailSender→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Plugins.Emails.Services uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Emails.Services, while a change to BTCPayServer.Plugins.Emails.Services can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
21→2 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinPaymentPromptDetails→BTCPayServer.Client.Models.NetworkFeeMode
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→3 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→5 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→8 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Invoices✕
- Connections
- 10 pairs of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinPaymentLinkExtension→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Bitcoin.BitcoinPaymentLinkExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.InvoiceCryptoInfoBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Invoices.PaymentEntityBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Invoices.PaymentService
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→13 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Wallets✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Wallets.BTCPayWalletBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.Services.Wallets.BTCPayWalletProvider
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→16 BTCPayServer.Payments.Bitcoin uses BTCPayServer.HostedServices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.HostedServices.NBXplorerDashboard
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→18 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Services.CheaterBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.Services.DisplayFormatterBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Services.DisplayFormatterBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Services.IFeeProviderFactoryBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Services.WalletRepository
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→19 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Models.InvoiceResponse
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Payments.Bitcoin uses a module listed above it, which is the healthy direction.
21→23 BTCPayServer.Payments.Bitcoin uses BTCPayServer.Payments part of a loop✕
- Connections
- 19 pairs of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.ICheckoutCheatModeExtensionBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.MineBlockContextBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.MineBlockResultBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.PayInvoiceContextBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.PayInvoiceResultBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.Payments.CheckoutModelContextBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.Payments.ICheckoutModelExtensionBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Payments.PaymentMethodConfigValidationContextBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Payments.PaymentMethodContextBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Bitcoin.BitcoinPaymentLinkExtension→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Payments.Bitcoin.BitcoinPaymentLinkExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Payments.IPaymentMethodBitpayAPIExtensionBTCPayServer.Payments.Bitcoin.BitcoinPaymentMethodBitpayAPIExtension→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
21→34 BTCPayServer.Payments.Bitcoin uses BTCPayServer part of a loop✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Payments.Bitcoin uses a type in BTCPayServer.
- The types involved
BTCPayServer.Payments.Bitcoin.AlternativeConfig→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.AlternativeConfig→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Payments.Bitcoin.BitcoinCheckoutCheatModeExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.BitcoinCheckoutModelExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler→BTCPayServer.ExplorerClientProviderBTCPayServer.Payments.Bitcoin.BitcoinPaymentLinkExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.IHasNetwork→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.EventAggregatorBTCPayServer.Payments.Bitcoin.NBXplorerListener→BTCPayServer.ExplorerClientProviderBTCPayServer.Payments.Bitcoin.Prepare→BTCPayServer.DerivationSchemeSettings
- Direction
- BTCPayServer.Payments.Bitcoin uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Payments.Bitcoin, while a change to BTCPayServer.Payments.Bitcoin can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
22→2 BTCPayServer.Payments.Lightning uses BTCPayServer.Client.Models✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Payments.Lightning.ILightningPaymentHandler→BTCPayServer.Client.Models.LightningPaymentDataBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Client.Models.LightningPaymentDataBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Client.Models.LightningPaymentData
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→5 BTCPayServer.Payments.Lightning uses BTCPayServer.Logging✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Logging.LogsBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→6 BTCPayServer.Payments.Lightning uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→8 BTCPayServer.Payments.Lightning uses BTCPayServer.Services.Invoices✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Services.Invoices.PaymentServiceBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Invoices.PaymentServiceBTCPayServer.Payments.Lightning.LightningPaymentLinkExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.Lightning.LightningPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.InvoiceCryptoInfoBTCPayServer.Payments.Lightning.LightningPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.Lightning.ListenedInvoice→BTCPayServer.Services.Invoices.PaymentPrompt
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→11 BTCPayServer.Payments.Lightning uses BTCPayServer.Services.Stores✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→16 BTCPayServer.Payments.Lightning uses BTCPayServer.HostedServices✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.HostedServices.BaseAsyncServiceBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→18 BTCPayServer.Payments.Lightning uses BTCPayServer.Services✕
- Connections
- 12 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.Services.DisplayFormatterBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Services.CheaterBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningExtensions→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Services.ISettingsAccessorBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Services.SocketFactoryBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.Services.LightningClientFactoryService
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→19 BTCPayServer.Payments.Lightning uses BTCPayServer.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Payments.Lightning.LightningPaymentMethodBitpayAPIExtension→BTCPayServer.Models.InvoiceResponse
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→21 BTCPayServer.Payments.Lightning uses BTCPayServer.Payments.Bitcoin✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Payments.Bitcoin.
- The types involved
BTCPayServer.Payments.Lightning.ILightningPaymentHandler→BTCPayServer.Payments.Bitcoin.IHasNetwork
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Payments.Bitcoin, so a change to BTCPayServer.Payments.Bitcoin can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Payments.Bitcoin.
- Position
- Below the diagonal: BTCPayServer.Payments.Lightning uses a module listed above it, which is the healthy direction.
22→23 BTCPayServer.Payments.Lightning uses BTCPayServer.Payments part of a loop✕
- Connections
- 27 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Payments. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Payments.Lightning.ILightningPaymentHandler→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.Payments.CheckoutModelContextBTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.Payments.ICheckoutModelExtensionBTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Payments.LNURLPayPaymentMethodDetailsBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Payments.PaymentMethodContextBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.ICheckoutCheatModeExtensionBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.MineBlockContextBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.MineBlockResultBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.PayInvoiceContextBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.PayInvoiceResultBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Payments.PaymentMethodConfigValidationContextBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Payments.PaymentMethodContextBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Payments.PrefixedInvoiceLogsBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Payments.Lightning.LightningPaymentLinkExtension→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Payments.Lightning.LightningPaymentLinkExtension→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Payments.Lightning.LightningPaymentMethodBitpayAPIExtension→BTCPayServer.Payments.IPaymentLinkExtension
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Payments.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
22→24 BTCPayServer.Payments.Lightning uses BTCPayServer.Data part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Data.StoreData
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
22→32 BTCPayServer.Payments.Lightning uses BTCPayServer.Configuration part of a loop✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Payments.Lightning.LightningExtensions→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.Configuration.LightningNetworkOptions
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.Configuration.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
22→34 BTCPayServer.Payments.Lightning uses BTCPayServer part of a loop✕
- Connections
- 12 pairs of types, where a type in BTCPayServer.Payments.Lightning uses a type in BTCPayServer.
- The types involved
BTCPayServer.Payments.Lightning.LNCheckoutModelExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LNURLPayPaymentHandler→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningCheckoutCheatModeExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningExtensions→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningInstanceListener→BTCPayServer.EventAggregatorBTCPayServer.Payments.Lightning.LightningLikePaymentHandler→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Payments.Lightning.LightningListener→BTCPayServer.EventAggregatorBTCPayServer.Payments.Lightning.LightningPaymentLinkExtension→BTCPayServer.BTCPayNetworkBTCPayServer.Payments.Lightning.LightningPendingPayoutListener→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Payments.Lightning.ListenedInvoice→BTCPayServer.BTCPayNetwork
- Direction
- BTCPayServer.Payments.Lightning uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Payments.Lightning, while a change to BTCPayServer.Payments.Lightning can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
23→3 BTCPayServer.Payments uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Services.Rates.RateFetcher
- Direction
- BTCPayServer.Payments uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Payments uses a module listed above it, which is the healthy direction.
23→5 BTCPayServer.Payments uses BTCPayServer.Logging✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Logging.InvoiceLogsBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Logging.InvoiceLogsBTCPayServer.Payments.PrefixedInvoiceLogs→BTCPayServer.Logging.InvoiceLogs
- Direction
- BTCPayServer.Payments uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Payments uses a module listed above it, which is the healthy direction.
23→8 BTCPayServer.Payments uses BTCPayServer.Services.Invoices✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Payments.CheckoutModelContext→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.CheckoutModelContext→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.IPaymentLinkExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.IPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.InvoiceCryptoInfoBTCPayServer.Payments.IPaymentMethodBitpayAPIExtension→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Payments.PayInvoiceContext→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.PayInvoiceContext→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Services.Invoices.PaymentPrompt
- Direction
- BTCPayServer.Payments uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Payments uses a module listed above it, which is the healthy direction.
23→19 BTCPayServer.Payments uses BTCPayServer.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Payments.IPaymentMethodBitpayAPIExtension→BTCPayServer.Models.InvoiceResponse
- Direction
- BTCPayServer.Payments uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Payments uses a module listed above it, which is the healthy direction.
23→22 BTCPayServer.Payments uses BTCPayServer.Payments.Lightning✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Payments.Lightning.
- The types involved
BTCPayServer.Payments.LNURLPayPaymentMethodDetails→BTCPayServer.Payments.Lightning.LigthningPaymentPromptDetails
- Direction
- BTCPayServer.Payments uses BTCPayServer.Payments.Lightning, so a change to BTCPayServer.Payments.Lightning can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Payments.Lightning.
- Position
- Below the diagonal: BTCPayServer.Payments uses a module listed above it, which is the healthy direction.
23→24 BTCPayServer.Payments uses BTCPayServer.Data part of a loop✕
- Connections
- 9 pairs of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Payments.CheckoutModelContext→BTCPayServer.Data.StoreBlobBTCPayServer.Payments.CheckoutModelContext→BTCPayServer.Data.StoreDataBTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Data.StoreBlobBTCPayServer.Payments.InvoiceCreationContext→BTCPayServer.Data.StoreDataBTCPayServer.Payments.PayInvoiceContext→BTCPayServer.Data.StoreDataBTCPayServer.Payments.PaymentMethodConfigValidationContext→BTCPayServer.Data.StoreDataBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Data.StoreBlobBTCPayServer.Payments.PaymentMethodContext→BTCPayServer.Data.StoreDataBTCPayServer.Payments.PrefixedInvoiceLogs→BTCPayServer.Data.EventSeverity
- Direction
- BTCPayServer.Payments uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.Data.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
23→34 BTCPayServer.Payments uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Payments uses a type in BTCPayServer.
- The types involved
BTCPayServer.Payments.IPaymentMethodHandler→BTCPayServer.IHandler
- Direction
- BTCPayServer.Payments uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Payments, while a change to BTCPayServer.Payments can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
24→2 BTCPayServer.Data uses BTCPayServer.Client.Models✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Data.PaymentRequestData→BTCPayServer.Client.Models.PaymentRequestStatusBTCPayServer.Data.PayoutData→BTCPayServer.Client.Models.PayoutStateBTCPayServer.Data.StoreBlob→BTCPayServer.Client.Models.NetworkFeeModeBTCPayServer.Data.StoreBlob→BTCPayServer.Client.Models.ReceiptOptionsBTCPayServer.Data.StoreData→BTCPayServer.Client.Models.SpeedPolicyBTCPayServer.Data.WalletTransactionInfo→BTCPayServer.Client.Models.LabelDataBTCPayServer.Data.WebhookDeliveryBlob→BTCPayServer.Client.Models.WebhookDeliveryStatus
- Direction
- BTCPayServer.Data uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→4 BTCPayServer.Data uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Data.ApplicationDbContextFactory→BTCPayServer.Abstractions.Models.DatabaseOptions
- Direction
- BTCPayServer.Data uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→6 BTCPayServer.Data uses BTCPayServer.Payouts✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Data.InvoiceDataExtensions→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.Data.PayoutExtensions→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Data.PayoutExtensions→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.Data.PullPaymentBlob→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.Data.PullPaymentsExtensions→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Data uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→7 BTCPayServer.Data uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Data.ApplicationDbContextFactory→BTCPayServer.Abstractions.Contracts.BaseDbContextFactoryBTCPayServer.Data.StoredFile→BTCPayServer.Abstractions.Contracts.IStoredFile
- Direction
- BTCPayServer.Data uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→8 BTCPayServer.Data uses BTCPayServer.Services.Invoices✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Data.InvoiceDataExtensions→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Data.InvoiceDataExtensions→BTCPayServer.Services.Invoices.InvoiceStateBTCPayServer.Data.PaymentDataExtensions→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Data.PaymentDataExtensions→BTCPayServer.Services.Invoices.PaymentBlobBTCPayServer.Data.PaymentDataExtensions→BTCPayServer.Services.Invoices.PaymentEntityBTCPayServer.Data.StoreDataExtensions→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Data.WalletTransactionInfo→BTCPayServer.Services.Invoices.RateBook
- Direction
- BTCPayServer.Data uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→18 BTCPayServer.Data uses BTCPayServer.Services✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Data.PayoutExtensions→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Data.WalletTransactionInfo→BTCPayServer.Services.Attachment
- Direction
- BTCPayServer.Data uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→20 BTCPayServer.Data uses BTCPayServer.Plugins.Emails.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Plugins.Emails.Services.
- The types involved
BTCPayServer.Data.StoreBlob→BTCPayServer.Plugins.Emails.Services.EmailSettings
- Direction
- BTCPayServer.Data uses BTCPayServer.Plugins.Emails.Services, so a change to BTCPayServer.Plugins.Emails.Services can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Plugins.Emails.Services.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→23 BTCPayServer.Data uses BTCPayServer.Payments✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Data.InvoiceDataExtensions→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Data.PaymentDataExtensions→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Data.PaymentDataExtensions→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Data.PaymentMethodCriteria→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Data.StoreBlob→BTCPayServer.Payments.IPaymentFilterBTCPayServer.Data.StoreBlob→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Data.StoreDataExtensions→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Data.StoreDataExtensions→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Data uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Data uses a module listed above it, which is the healthy direction.
24→34 BTCPayServer.Data uses BTCPayServer part of a loop✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Data uses a type in BTCPayServer.
- The types involved
BTCPayServer.Data.PaymentMethodCriteria→BTCPayServer.CurrencyValueBTCPayServer.Data.RateSettings→BTCPayServer.DefaultRulesCollectionBTCPayServer.Data.StoreBlob→BTCPayServer.DefaultRulesCollectionBTCPayServer.Data.StoreBlob→BTCPayServer.UnresolvedUriBTCPayServer.Data.WalletTransactionInfo→BTCPayServer.WalletId
- Direction
- BTCPayServer.Data uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Data, while a change to BTCPayServer.Data can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
25→2 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Client.Models✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Models.StoreViewModels.GeneralSettingsViewModel→BTCPayServer.Client.Models.NetworkFeeModeBTCPayServer.Models.StoreViewModels.GeneralSettingsViewModel→BTCPayServer.Client.Models.SpeedPolicyBTCPayServer.Models.StoreViewModels.PaymentViewModel→BTCPayServer.Client.Models.NetworkFeeModeBTCPayServer.Models.StoreViewModels.ReceiptOptionsViewModel→BTCPayServer.Client.Models.ReceiptOptions
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→4 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Models.StoreViewModels.Source→BTCPayServer.Abstractions.Models.ConfirmModel
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→18 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Models.StoreViewModels.CheckoutAppearanceViewModel→BTCPayServer.Services.LanguageService
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→19 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Models.StoreViewModels.LightningViewModel→BTCPayServer.Models.AdditionalServiceViewModel
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→23 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Payments✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Models.StoreViewModels.Format→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Models.StoreViewModels.StoreDerivationScheme→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Models.StoreViewModels.StoreLightningNode→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→24 BTCPayServer.Models.StoreViewModels uses BTCPayServer.Data✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Models.StoreViewModels.StoreDashboardViewModel→BTCPayServer.Data.AppDataBTCPayServer.Models.StoreViewModels.StoreViewModel→BTCPayServer.Data.UserStore
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Models.StoreViewModels uses a module listed above it, which is the healthy direction.
25→34 BTCPayServer.Models.StoreViewModels uses BTCPayServer part of a loop✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Models.StoreViewModels uses a type in BTCPayServer.
- The types involved
BTCPayServer.Models.StoreViewModels.DerivationSchemeViewModel→BTCPayServer.BTCPayNetworkBTCPayServer.Models.StoreViewModels.StoreDashboardViewModel→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Models.StoreViewModels.StoreDerivationScheme→BTCPayServer.WalletIdBTCPayServer.Models.StoreViewModels.WalletSettingsViewModel→BTCPayServer.WalletIdBTCPayServer.Models.StoreViewModels.WalletSetupViewModel→BTCPayServer.WalletCreationPermissions
- Direction
- BTCPayServer.Models.StoreViewModels uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Models.StoreViewModels, while a change to BTCPayServer.Models.StoreViewModels can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
26→5 BTCPayServer.PayoutProcessors uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.PayoutProcessors.PayoutProcessorService→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→6 BTCPayServer.PayoutProcessors uses BTCPayServer.Payouts✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.IPayoutProcessorFactory→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.PayoutProcessorQuery→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.PayoutProcessorsExtensions→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.StorePayoutProcessorsView→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→7 BTCPayServer.PayoutProcessors uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Abstractions.Contracts.IPluginHookService
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→8 BTCPayServer.PayoutProcessors uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→11 BTCPayServer.PayoutProcessors uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→16 BTCPayServer.PayoutProcessors uses BTCPayServer.HostedServices✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.HostedServices.BaseAsyncServiceBTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.HostedServices.PayoutEventBTCPayServer.PayoutProcessors.PayoutProcessorService→BTCPayServer.HostedServices.EventHostedServiceBase
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→23 BTCPayServer.PayoutProcessors uses BTCPayServer.Payments✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→24 BTCPayServer.PayoutProcessors uses BTCPayServer.Data✕
- Connections
- 15 pairs of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.PayoutProcessors.AfterPayoutActionData→BTCPayServer.Data.PayoutDataBTCPayServer.PayoutProcessors.AfterPayoutActionData→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.AfterPayoutActionData→BTCPayServer.Data.StoreDataBTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Data.PayoutDataBTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.BeforePayoutActionData→BTCPayServer.Data.PayoutDataBTCPayServer.PayoutProcessors.BeforePayoutActionData→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.BeforePayoutActionData→BTCPayServer.Data.StoreDataBTCPayServer.PayoutProcessors.IPayoutProcessorFactory→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.PayoutProcessorService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.PayoutProcessors.PayoutProcessorService→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.PayoutProcessorUpdated→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.PayoutProcessorsExtensions→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.StorePayoutProcessorsView→BTCPayServer.Data.PayoutProcessorData
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors uses a module listed above it, which is the healthy direction.
26→34 BTCPayServer.PayoutProcessors uses BTCPayServer part of a loop✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.PayoutProcessors uses a type in BTCPayServer.
- The types involved
BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.EventAggregatorBTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessor→BTCPayServer.IEventAggregatorSubscriptionBTCPayServer.PayoutProcessors.PayoutProcessorService→BTCPayServer.EventAggregatorBTCPayServer.PayoutProcessors.UIPayoutProcessorsController→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.PayoutProcessors uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.PayoutProcessors, while a change to BTCPayServer.PayoutProcessors can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
27→20 BTCPayServer.Plugins.Emails.Views uses BTCPayServer.Plugins.Emails.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Emails.Views uses a type in BTCPayServer.Plugins.Emails.Services.
- The types involved
BTCPayServer.Plugins.Emails.Views.EmailsViewModel→BTCPayServer.Plugins.Emails.Services.EmailSettings
- Direction
- BTCPayServer.Plugins.Emails.Views uses BTCPayServer.Plugins.Emails.Services, so a change to BTCPayServer.Plugins.Emails.Services can break BTCPayServer.Plugins.Emails.Views, while a change to BTCPayServer.Plugins.Emails.Views can't break BTCPayServer.Plugins.Emails.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Views uses a module listed above it, which is the healthy direction.
27→24 BTCPayServer.Plugins.Emails.Views uses BTCPayServer.Data✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Emails.Views uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Emails.Views.StoreEmailRuleViewModel→BTCPayServer.Data.BTCPayAdditionalDataBTCPayServer.Plugins.Emails.Views.StoreEmailRuleViewModel→BTCPayServer.Data.EmailRuleData
- Direction
- BTCPayServer.Plugins.Emails.Views uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Emails.Views, while a change to BTCPayServer.Plugins.Emails.Views can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.Emails.Views uses a module listed above it, which is the healthy direction.
28→2 BTCPayServer.Plugins.Webhooks uses BTCPayServer.Client.Models✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhookDeliveryRequest→BTCPayServer.Client.Models.WebhookEventBTCPayServer.Plugins.Webhooks.WebhookSender→BTCPayServer.Client.Models.WebhookEventBTCPayServer.Plugins.Webhooks.WebhookTriggerContext→BTCPayServer.Client.Models.StoreWebhookEventBTCPayServer.Plugins.Webhooks.WebhookTriggerProvider→BTCPayServer.Client.Models.StoreWebhookEvent
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Webhooks uses a module listed above it, which is the healthy direction.
28→4 BTCPayServer.Plugins.Webhooks uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhooksPlugin→BTCPayServer.Abstractions.Models.BaseBTCPayServerPlugin
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Webhooks uses a module listed above it, which is the healthy direction.
28→11 BTCPayServer.Plugins.Webhooks uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhookSender→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Plugins.Webhooks uses a module listed above it, which is the healthy direction.
28→18 BTCPayServer.Plugins.Webhooks uses BTCPayServer.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhooksTranslationProvider→BTCPayServer.Services.IDefaultTranslationProvider
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Webhooks uses a module listed above it, which is the healthy direction.
28→24 BTCPayServer.Plugins.Webhooks uses BTCPayServer.Data✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhookDeliveryRequest→BTCPayServer.Data.WebhookBlobBTCPayServer.Plugins.Webhooks.WebhookDeliveryRequest→BTCPayServer.Data.WebhookDeliveryDataBTCPayServer.Plugins.Webhooks.WebhookSender→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Plugins.Webhooks.WebhookSender→BTCPayServer.Data.WebhookDataBTCPayServer.Plugins.Webhooks.WebhookTriggerContext→BTCPayServer.Data.StoreDataBTCPayServer.Plugins.Webhooks.WebhookTriggerProvider→BTCPayServer.Data.StoreData
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.Webhooks uses a module listed above it, which is the healthy direction.
28→34 BTCPayServer.Plugins.Webhooks uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Webhooks uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Webhooks.WebhookSender→BTCPayServer.MultiProcessingQueue
- Direction
- BTCPayServer.Plugins.Webhooks uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Webhooks, while a change to BTCPayServer.Plugins.Webhooks can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
29→1 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Abstractions✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Abstractions.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Abstractions.RequestBaseUrlBTCPayServer.Plugins.Subscriptions.UrlHelperExtensions→BTCPayServer.Abstractions.RequestBaseUrl
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Abstractions, so a change to BTCPayServer.Abstractions can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Abstractions.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→2 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Client.Models✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.FeatureModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.OfferingModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.OfferingPlanModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.OnPayBehaviorBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.PlanCheckoutModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.PortalSessionModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.RecurringIntervalBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.SubscriberModelBTCPayServer.Plugins.Subscriptions.Mapper→BTCPayServer.Client.Models.SubscriptionPhaseBTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Client.Models.DisabledReasonBTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Client.Models.StoreWebhookEvent
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→3 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Rates✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionContext→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→4 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionsPlugin→BTCPayServer.Abstractions.Models.BaseBTCPayServerPlugin
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→5 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→8 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Invoices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionContext→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Services.Invoices.InvoiceEntity
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→9 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Events✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Events.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Events.DisabledReasonBTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Events.SubscriberEvent
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Events, so a change to BTCPayServer.Events can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Events.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→15 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Apps✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Plugins.Subscriptions.AppServiceSubscriptionsExtensions→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Plugins.Subscriptions.SubscriptionsAppType→BTCPayServer.Services.Apps.AppBaseType
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→16 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.HostedServices✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.HostedServices.EventHostedServiceBaseBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.HostedServices.IPeriodicTaskBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→17 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Reporting✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Services.Reporting.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriberCreditHistoryReportProvider→BTCPayServer.Services.Reporting.QueryContextBTCPayServer.Plugins.Subscriptions.SubscriberCreditHistoryReportProvider→BTCPayServer.Services.Reporting.ReportProviderBTCPayServer.Plugins.Subscriptions.SubscribersReportProvider→BTCPayServer.Services.Reporting.QueryContextBTCPayServer.Plugins.Subscriptions.SubscribersReportProvider→BTCPayServer.Services.Reporting.ReportProvider
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services.Reporting, so a change to BTCPayServer.Services.Reporting can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Services.Reporting.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→18 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriberCreditHistoryReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Plugins.Subscriptions.SubscribersReportProvider→BTCPayServer.Services.DisplayFormatterBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Services.SettingsRepository
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→24 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Data✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriberCreditHistoryReportProvider→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Plugins.Subscriptions.SubscribersReportProvider→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Plugins.Subscriptions.SubscriptionContext→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Plugins.Subscriptions.SubscriptionsAppType→BTCPayServer.Data.AppData
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→28 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Plugins.Webhooks✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Plugins.Webhooks.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Plugins.Webhooks.WebhookTriggerContextBTCPayServer.Plugins.Subscriptions.SubscriberWebhookProvider→BTCPayServer.Plugins.Webhooks.WebhookTriggerProvider
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Plugins.Webhooks, so a change to BTCPayServer.Plugins.Webhooks can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Plugins.Webhooks.
- Position
- Below the diagonal: BTCPayServer.Plugins.Subscriptions uses a module listed above it, which is the healthy direction.
29→32 BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Configuration part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionsAppType→BTCPayServer.Configuration.BTCPayServerOptions
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.Configuration.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
29→34 BTCPayServer.Plugins.Subscriptions uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Subscriptions uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Subscriptions.SubscriptionContext→BTCPayServer.EventAggregatorBTCPayServer.Plugins.Subscriptions.SubscriptionHostedService→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Plugins.Subscriptions uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Subscriptions, while a change to BTCPayServer.Plugins.Subscriptions can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
30→4 BTCPayServer.Plugins.Monetization uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationPlugin→BTCPayServer.Abstractions.Models.BaseBTCPayServerPlugin
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→5 BTCPayServer.Plugins.Monetization uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→9 BTCPayServer.Plugins.Monetization uses BTCPayServer.Events✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Events.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Events.NewSubscriberBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Events.SubscriberEvent
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Events, so a change to BTCPayServer.Events can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Events.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→16 BTCPayServer.Plugins.Monetization uses BTCPayServer.HostedServices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.HostedServices.EventHostedServiceBase
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→18 BTCPayServer.Plugins.Monetization uses BTCPayServer.Services✕
- Connections
- 9 pairs of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationEmailTriggerTransformer→BTCPayServer.Services.ISettingsAccessorBTCPayServer.Plugins.Monetization.MonetizationEmailTriggerTransformer→BTCPayServer.Services.ServerSettingsBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Services.ISettingsAccessorBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Services.SecurityStampInvalidatorBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Services.UserServiceBTCPayServer.Plugins.Monetization.MonetizationLoginExtension→BTCPayServer.Services.CanLoginContextBTCPayServer.Plugins.Monetization.MonetizationLoginExtension→BTCPayServer.Services.ISettingsAccessorBTCPayServer.Plugins.Monetization.MonetizationLoginExtension→BTCPayServer.Services.LoginExtension
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→24 BTCPayServer.Plugins.Monetization uses BTCPayServer.Data✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Monetization.DataExtensions→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Data.ApplicationUserBTCPayServer.Plugins.Monetization.MonetizationLoginExtension→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Plugins.Monetization.MonetizationLoginExtension→BTCPayServer.Data.ApplicationDbContextFactory
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→27 BTCPayServer.Plugins.Monetization uses BTCPayServer.Plugins.Emails.Views✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Plugins.Emails.Views.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationEmailTriggerTransformer→BTCPayServer.Plugins.Emails.Views.EmailTriggerViewModel
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Plugins.Emails.Views, so a change to BTCPayServer.Plugins.Emails.Views can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Plugins.Emails.Views.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→29 BTCPayServer.Plugins.Monetization uses BTCPayServer.Plugins.Subscriptions✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.Plugins.Subscriptions.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.Plugins.Subscriptions.SubscriptionHostedService
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer.Plugins.Subscriptions, so a change to BTCPayServer.Plugins.Subscriptions can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.Plugins.Subscriptions.
- Position
- Below the diagonal: BTCPayServer.Plugins.Monetization uses a module listed above it, which is the healthy direction.
30→34 BTCPayServer.Plugins.Monetization uses BTCPayServer part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Monetization uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Monetization.MonetizationHostedService→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Plugins.Monetization uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Monetization, while a change to BTCPayServer.Plugins.Monetization can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
31→2 BTCPayServer.Controllers uses BTCPayServer.Client.Models✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Client.Models.CreateInvoiceRequestBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Client.Models.OnExistingBehaviorBTCPayServer.Controllers.UIReportsController→BTCPayServer.Client.Models.FieldBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Client.Models.PayoutStateBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Client.Models.PullPaymentStateBTCPayServer.Controllers.UIStoresController→BTCPayServer.Client.Models.HistogramTypeBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Client.Models.HistogramType
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→3 BTCPayServer.Controllers uses BTCPayServer.Services.Rates✕
- Connections
- 10 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.Controllers.UIUserStoresController→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Rates.RateFetcher
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→5 BTCPayServer.Controllers uses BTCPayServer.Logging✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Controllers.UIAccountController→BTCPayServer.Logging.LogsBTCPayServer.Controllers.UIServerController→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→6 BTCPayServer.Controllers uses BTCPayServer.Payouts✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→7 BTCPayServer.Controllers uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Controllers.UIAppsController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.UIHomeController→BTCPayServer.Abstractions.Contracts.ISwaggerProviderBTCPayServer.Controllers.UIManageController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.UIManageController→BTCPayServer.Abstractions.Contracts.INotificationHandlerBTCPayServer.Controllers.UIServerController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.UIStoresController→BTCPayServer.Abstractions.Contracts.IFileService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→8 BTCPayServer.Controllers uses BTCPayServer.Services.Invoices✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Controllers.UIAppsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Invoices.InvoiceQueryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Invoices.PaymentPromptBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIPublicLightningNodeInfoController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→10 BTCPayServer.Controllers uses BTCPayServer.PaymentRequest✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.PaymentRequest.
- The types involved
BTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.PaymentRequest.PaymentRequestService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.PaymentRequest, so a change to BTCPayServer.PaymentRequest can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.PaymentRequest.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→11 BTCPayServer.Controllers uses BTCPayServer.Services.Stores✕
- Connections
- 13 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Controllers.UIAppsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIHomeController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UINotificationsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIPublicLightningNodeInfoController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIServerController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIUserStoresController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→13 BTCPayServer.Controllers uses BTCPayServer.Services.Wallets✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Wallets.BTCPayWalletBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Wallets.TransactionHistoryLineBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Wallets.WalletHistogramServiceBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Services.Wallets.WalletReceiveService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→14 BTCPayServer.Controllers uses BTCPayServer.Plugins.Wallets.Views.ViewModels✕
- Connections
- 18 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Plugins.Wallets.Views.ViewModels.
- The types involved
BTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Plugins.Wallets.Views.ViewModels.UpdatePullPaymentModelBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.NewPullPaymentModelBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.PayoutsModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.BumpTargetBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.FeeRateOptionBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.ListTransactionsViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.RescanWalletModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.ReservedAddressBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.SignWithSeedViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.SigningContextModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.StringAmountsBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.TransactionTagModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletBumpFeeViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletPSBTCombineViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletPSBTReadyViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletPSBTViewModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletSendModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Plugins.Wallets.Views.ViewModels.WalletSendVaultModel
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Plugins.Wallets.Views.ViewModels, so a change to BTCPayServer.Plugins.Wallets.Views.ViewModels can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Plugins.Wallets.Views.ViewModels.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→15 BTCPayServer.Controllers uses BTCPayServer.Services.Apps✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Controllers.UIAppsController→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Controllers.UIServerController→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Controllers.UIStoresController→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→16 BTCPayServer.Controllers uses BTCPayServer.HostedServices✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.HostedServices.PullPaymentHostedServiceBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.HostedServices.PullPaymentHostedServiceBTCPayServer.Controllers.UIServerController→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.HostedServices.PullPaymentHostedServiceBTCPayServer.Controllers.UIWalletsController→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Controllers.UIWalletsController→BTCPayServer.HostedServices.PendingTransactionFullIdBTCPayServer.Controllers.UIWalletsController→BTCPayServer.HostedServices.PendingTransactionServiceBTCPayServer.Controllers.UIWalletsController→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→18 BTCPayServer.Controllers uses BTCPayServer.Services✕
- Connections
- 74 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Services. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.CallbackGeneratorBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.CanLoginContextBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.PermissionServiceBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Controllers.UIAccountController→BTCPayServer.Services.UserServiceBTCPayServer.Controllers.UIBoltcardController→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.Controllers.UIBoltcardController→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Controllers.UIHomeController→BTCPayServer.Services.LanguageServiceBTCPayServer.Controllers.UIHomeController→BTCPayServer.Services.PermissionServiceBTCPayServer.Controllers.UIHomeController→BTCPayServer.Services.ThemeSettingsBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.CurrencyFormatBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.DisplayFormatterBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.InvoiceActivatorBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.LanguageServiceBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.PermissionServiceBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.PrettyNameProviderBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.TransactionLinkProvidersBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Services.UriResolverBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.CallbackGeneratorBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.PermissionServiceBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.UriResolverBTCPayServer.Controllers.UIManageController→BTCPayServer.Services.UserService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→19 BTCPayServer.Controllers uses BTCPayServer.Models✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Controllers.ShowLightningNodeInfoViewModel→BTCPayServer.Models.StoreBrandingViewModelBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Models.ViewPullPaymentModelBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Models.PostRedirectViewModel
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→20 BTCPayServer.Controllers uses BTCPayServer.Plugins.Emails.Services✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Plugins.Emails.Services.
- The types involved
BTCPayServer.Controllers.UIAccountController→BTCPayServer.Plugins.Emails.Services.EmailSenderFactoryBTCPayServer.Controllers.UIServerController→BTCPayServer.Plugins.Emails.Services.EmailSenderFactoryBTCPayServer.Controllers.UIStoresController→BTCPayServer.Plugins.Emails.Services.EmailSenderFactory
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Plugins.Emails.Services, so a change to BTCPayServer.Plugins.Emails.Services can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Plugins.Emails.Services.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→22 BTCPayServer.Controllers uses BTCPayServer.Payments.Lightning✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Payments.Lightning.
- The types involved
BTCPayServer.Controllers.UIStoresController→BTCPayServer.Payments.Lightning.LightningPaymentMethodConfig
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Payments.Lightning, so a change to BTCPayServer.Payments.Lightning can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Payments.Lightning.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→23 BTCPayServer.Controllers uses BTCPayServer.Payments✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.ICheckoutCheatModeExtensionBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.ICheckoutModelExtensionBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.IGlobalCheckoutModelExtensionBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.IPaymentFilterBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.InvoiceCreationContextBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Controllers.UIPublicLightningNodeInfoController→BTCPayServer.Payments.ICheckoutModelExtensionBTCPayServer.Controllers.UIPublicLightningNodeInfoController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Controllers.UIStoresController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Payments.ICheckoutModelExtensionBTCPayServer.Controllers.UIWalletsController→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→24 BTCPayServer.Controllers uses BTCPayServer.Data✕
- Connections
- 31 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Data. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Controllers.AddApiKeyViewModel→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.ApiKeysViewModel→BTCPayServer.Data.APIKeyDataBTCPayServer.Controllers.UIAccountController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIAppsController→BTCPayServer.Data.AppDataBTCPayServer.Controllers.UIBoltcardController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIHomeController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Data.PaymentRequestDataBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.UIManageController→BTCPayServer.Data.APIKeyDataBTCPayServer.Controllers.UIManageController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIManageController→BTCPayServer.Data.CredentialTypeBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.Data.PaymentRequestDataBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIReportsController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIServerController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Data.PayoutDataBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.UIStoresController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.UIStoresController→BTCPayServer.Data.RateSettings
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→25 BTCPayServer.Controllers uses BTCPayServer.Models.StoreViewModels✕
- Connections
- 18 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Models.StoreViewModels.
- The types involved
BTCPayServer.Controllers.UIHomeController→BTCPayServer.Models.StoreViewModels.RecoverySeedBackupViewModelBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Models.StoreViewModels.WalletSettingsViewModelBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Models.StoreViewModels.WalletSetupMethodBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Models.StoreViewModels.WalletSetupRequestBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.Models.StoreViewModels.WalletSetupViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.CheckoutAppearanceViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.FormatBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.GeneralSettingsViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.LightningNodeViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.LightningSettingsViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.RatesViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.SourceBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.StoreDerivationSchemeBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.StoreLightningNodeBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.StoreUserViewModelBTCPayServer.Controllers.UIStoresController→BTCPayServer.Models.StoreViewModels.StoreUsersViewModelBTCPayServer.Controllers.UIUserStoresController→BTCPayServer.Models.StoreViewModels.CreateStoreViewModelBTCPayServer.Controllers.UIUserStoresController→BTCPayServer.Models.StoreViewModels.StoreInvitationViewModel
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Models.StoreViewModels, so a change to BTCPayServer.Models.StoreViewModels can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Models.StoreViewModels.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→26 BTCPayServer.Controllers uses BTCPayServer.PayoutProcessors✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.PayoutProcessors.
- The types involved
BTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.PayoutProcessors.IPayoutProcessorFactoryBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.PayoutProcessors.PayoutProcessorService
- Direction
- BTCPayServer.Controllers uses BTCPayServer.PayoutProcessors, so a change to BTCPayServer.PayoutProcessors can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.PayoutProcessors.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→28 BTCPayServer.Controllers uses BTCPayServer.Plugins.Webhooks✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Plugins.Webhooks.
- The types involved
BTCPayServer.Controllers.UIInvoiceController→BTCPayServer.Plugins.Webhooks.WebhookSender
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Plugins.Webhooks, so a change to BTCPayServer.Plugins.Webhooks can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Plugins.Webhooks.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→30 BTCPayServer.Controllers uses BTCPayServer.Plugins.Monetization✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Plugins.Monetization.
- The types involved
BTCPayServer.Controllers.UIServerController→BTCPayServer.Plugins.Monetization.MonetizationSettings
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Plugins.Monetization, so a change to BTCPayServer.Plugins.Monetization can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Plugins.Monetization.
- Position
- Below the diagonal: BTCPayServer.Controllers uses a module listed above it, which is the healthy direction.
31→32 BTCPayServer.Controllers uses BTCPayServer.Configuration part of a loop✕
- Connections
- 8 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Controllers.UIAccountController→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Controllers.UIServerController→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Controllers.UIServerController→BTCPayServer.Configuration.ExternalConnectionStringBTCPayServer.Controllers.UIServerController→BTCPayServer.Configuration.ExternalServiceBTCPayServer.Controllers.UIServerController→BTCPayServer.Configuration.ExternalServicesOptionsBTCPayServer.Controllers.UIStoresController→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Controllers.UIStoresController→BTCPayServer.Configuration.ExternalServicesOptionsBTCPayServer.Controllers.UIStoresController→BTCPayServer.Configuration.LightningNetworkOptions
- Direction
- BTCPayServer.Controllers uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.Configuration.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
31→34 BTCPayServer.Controllers uses BTCPayServer part of a loop✕
- Connections
- 37 pairs of types, where a type in BTCPayServer.Controllers uses a type in BTCPayServer. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Controllers.UIAccountController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.UIAccountController→BTCPayServer.LnurlAuthServiceBTCPayServer.Controllers.UIAccountController→BTCPayServer.LoginWithLNURLAuthViewModelBTCPayServer.Controllers.UIAppsController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIBoltcardController→BTCPayServer.UILNURLControllerBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.DefaultRulesCollectionBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.ExplorerClientProviderBTCPayServer.Controllers.UIInvoiceController→BTCPayServer.SearchStringBTCPayServer.Controllers.UIManageController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.UIPaymentRequestController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIPullPaymentController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIReportsController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIServerController→BTCPayServer.BTCPayHostEnvironmentBTCPayServer.Controllers.UIServerController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIServerController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.BTCPayNetworkBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.ExplorerClientProviderBTCPayServer.Controllers.UIStoreOnChainWalletsController→BTCPayServer.WalletCreationPermissionsBTCPayServer.Controllers.UIStorePullPaymentsController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIStoresController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.UIStoresController→BTCPayServer.DefaultRulesCollection
- Direction
- BTCPayServer.Controllers uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
31→35 BTCPayServer.Controllers uses (global) part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Controllers uses a type in (global).
- The types involved
BTCPayServer.Controllers.UIServerController→UpdateRoleViewModelBTCPayServer.Controllers.UIStoresController→UpdateRoleViewModel
- Direction
- BTCPayServer.Controllers uses (global), so a change to (global) can break BTCPayServer.Controllers, while a change to BTCPayServer.Controllers can't break (global).
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
32→5 BTCPayServer.Configuration uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Configuration uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Configuration.BTCPayServerOptions→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Configuration uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Configuration, while a change to BTCPayServer.Configuration can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Configuration uses a module listed above it, which is the healthy direction.
32→31 BTCPayServer.Configuration uses BTCPayServer.Controllers✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Configuration uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.Configuration.ExternalConnectionString→BTCPayServer.Controllers.Macaroons
- Direction
- BTCPayServer.Configuration uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.Configuration, while a change to BTCPayServer.Configuration can't break BTCPayServer.Controllers.
- Position
- Below the diagonal: BTCPayServer.Configuration uses a module listed above it, which is the healthy direction.
32→34 BTCPayServer.Configuration uses BTCPayServer part of a loop✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Configuration uses a type in BTCPayServer.
- The types involved
BTCPayServer.Configuration.BTCPayServerOptions→BTCPayServer.SSRFAllowedDestinationBTCPayServer.Configuration.DefaultConfiguration→BTCPayServer.BTCPayNetworkProvider
- Direction
- BTCPayServer.Configuration uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Configuration, while a change to BTCPayServer.Configuration can't break BTCPayServer.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
33→2 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Client.Models.AppItem
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→3 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→8 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.Invoices.InvoiceRepository
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→11 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→15 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Apps✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.Apps.PointOfSaleSettings
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→18 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.DisplayFormatterBTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Services.UriResolver
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→24 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Data✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Data.AppData
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
33→31 BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Controllers✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.PointOfSale.Controllers uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.Plugins.PointOfSale.Controllers.UIPointOfSaleController→BTCPayServer.Controllers.UIInvoiceController
- Direction
- BTCPayServer.Plugins.PointOfSale.Controllers uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.Plugins.PointOfSale.Controllers, while a change to BTCPayServer.Plugins.PointOfSale.Controllers can't break BTCPayServer.Controllers.
- Position
- Below the diagonal: BTCPayServer.Plugins.PointOfSale.Controllers uses a module listed above it, which is the healthy direction.
34→2 BTCPayServer uses BTCPayServer.Client.Models✕
- Connections
- 2 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.BoltcardDataExtensions→BTCPayServer.Client.Models.OnExistingBehaviorBTCPayServer.UILNURLController→BTCPayServer.Client.Models.CreateInvoiceRequest
- Direction
- BTCPayServer uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→3 BTCPayServer uses BTCPayServer.Services.Rates✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→5 BTCPayServer uses BTCPayServer.Logging✕
- Connections
- 5 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.ActionLogicExtensions→BTCPayServer.Logging.LogsBTCPayServer.BTCPayNetworkProvider→BTCPayServer.Logging.LogsBTCPayServer.ChannelSubscription→BTCPayServer.Logging.LogsBTCPayServer.EventAggregator→BTCPayServer.Logging.LogsBTCPayServer.ExplorerClientProvider→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→6 BTCPayServer uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→7 BTCPayServer uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Abstractions.Contracts.IPluginHookService
- Direction
- BTCPayServer uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→8 BTCPayServer uses BTCPayServer.Services.Invoices✕
- Connections
- 8 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Services.Invoices.InvoiceCryptoInfoBTCPayServer.Extensions→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Extensions→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.StoreExtensions→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.UILNURLController→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.UILNURLController→BTCPayServer.Services.Invoices.InvoiceMetadataBTCPayServer.UILNURLController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.UILNURLController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→11 BTCPayServer uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→13 BTCPayServer uses BTCPayServer.Services.Wallets✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Services.Wallets.BTCPayWallet
- Direction
- BTCPayServer uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→15 BTCPayServer uses BTCPayServer.Services.Apps✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→16 BTCPayServer uses BTCPayServer.HostedServices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.ExplorerClientProvider→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.UILNURLController→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→18 BTCPayServer uses BTCPayServer.Services✕
- Connections
- 10 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.ActionLogicExtensions→BTCPayServer.Services.PoliciesSettingsBTCPayServer.ActionLogicExtensions→BTCPayServer.Services.SettingsRepositoryBTCPayServer.AuthorizationExtensions→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Extensions→BTCPayServer.Services.CanLoginContextBTCPayServer.Extensions→BTCPayServer.Services.PolicyDefinitionBTCPayServer.SettingsRepositoryExtensions→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.SettingsRepositoryExtensions→BTCPayServer.Services.SettingsRepositoryBTCPayServer.StoreExtensions→BTCPayServer.Services.PermissionServiceBTCPayServer.UILNURLController→BTCPayServer.Services.DisplayFormatterBTCPayServer.UILNURLController→BTCPayServer.Services.InvoiceActivator
- Direction
- BTCPayServer uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→21 BTCPayServer uses BTCPayServer.Payments.Bitcoin✕
- Connections
- 2 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Payments.Bitcoin.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Payments.Bitcoin.BitcoinLikePaymentDataBTCPayServer.Extensions→BTCPayServer.Payments.Bitcoin.BitcoinLikePaymentHandler
- Direction
- BTCPayServer uses BTCPayServer.Payments.Bitcoin, so a change to BTCPayServer.Payments.Bitcoin can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Payments.Bitcoin.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→22 BTCPayServer uses BTCPayServer.Payments.Lightning✕
- Connections
- 4 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Payments.Lightning.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Payments.Lightning.LNURLPayPaymentHandlerBTCPayServer.Extensions→BTCPayServer.Payments.Lightning.LightningLikePaymentHandlerBTCPayServer.Extensions→BTCPayServer.Payments.Lightning.LightningPaymentMethodConfigBTCPayServer.UILNURLController→BTCPayServer.Payments.Lightning.LNURLPaymentMethodConfig
- Direction
- BTCPayServer uses BTCPayServer.Payments.Lightning, so a change to BTCPayServer.Payments.Lightning can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Payments.Lightning.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→23 BTCPayServer uses BTCPayServer.Payments✕
- Connections
- 3 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.UILNURLController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.WalletId→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→24 BTCPayServer uses BTCPayServer.Data✕
- Connections
- 16 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.BoltcardDataExtensions→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Extensions→BTCPayServer.Data.AppDataBTCPayServer.Extensions→BTCPayServer.Data.PaymentRequestDataBTCPayServer.Extensions→BTCPayServer.Data.PullPaymentDataBTCPayServer.Extensions→BTCPayServer.Data.StoreDataBTCPayServer.LightningAddressService→BTCPayServer.Data.ApplicationDbContextBTCPayServer.LightningAddressService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.LightningAddressService→BTCPayServer.Data.LightningAddressDataBTCPayServer.LnurlAuthService→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.StoreExtensions→BTCPayServer.Data.StoreDataBTCPayServer.StoreExtensions→BTCPayServer.Data.StoreRoleBTCPayServer.UILNURLAuthController→BTCPayServer.Data.ApplicationUserBTCPayServer.UILNURLController→BTCPayServer.Data.StoreBlobBTCPayServer.UILNURLController→BTCPayServer.Data.StoreDataBTCPayServer.UserExtensions→BTCPayServer.Data.ApplicationUserBTCPayServer.UserManagerExtensions→BTCPayServer.Data.ApplicationUser
- Direction
- BTCPayServer uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→25 BTCPayServer uses BTCPayServer.Models.StoreViewModels✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Models.StoreViewModels.
- The types involved
BTCPayServer.Extensions→BTCPayServer.Models.StoreViewModels.RecoverySeedBackupViewModel
- Direction
- BTCPayServer uses BTCPayServer.Models.StoreViewModels, so a change to BTCPayServer.Models.StoreViewModels can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Models.StoreViewModels.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→26 BTCPayServer uses BTCPayServer.PayoutProcessors✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.PayoutProcessors.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.PayoutProcessors.PayoutProcessorService
- Direction
- BTCPayServer uses BTCPayServer.PayoutProcessors, so a change to BTCPayServer.PayoutProcessors can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.PayoutProcessors.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→27 BTCPayServer uses BTCPayServer.Plugins.Emails.Views✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Plugins.Emails.Views.
- The types involved
BTCPayServer.WebhookExtensions→BTCPayServer.Plugins.Emails.Views.EmailTriggerViewModel
- Direction
- BTCPayServer uses BTCPayServer.Plugins.Emails.Views, so a change to BTCPayServer.Plugins.Emails.Views can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Plugins.Emails.Views.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→31 BTCPayServer uses BTCPayServer.Controllers✕
- Connections
- 1 pair of types, where a type in BTCPayServer uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.UILNURLController→BTCPayServer.Controllers.UIInvoiceController
- Direction
- BTCPayServer uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Controllers.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
34→32 BTCPayServer uses BTCPayServer.Configuration✕
- Connections
- 2 pairs of types, where a type in BTCPayServer uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.ExplorerClientProvider→BTCPayServer.Configuration.NBXplorerOptionsBTCPayServer.Extensions→BTCPayServer.Configuration.DataDirectories
- Direction
- BTCPayServer uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer, while a change to BTCPayServer can't break BTCPayServer.Configuration.
- Position
- Below the diagonal: BTCPayServer uses a module listed above it, which is the healthy direction.
35→2 (global) uses BTCPayServer.Client.Models✕
- Connections
- 2 pairs of types, where a type in (global) uses a type in BTCPayServer.Client.Models.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Client.Models.PayoutStateIPayoutHandler→BTCPayServer.Client.Models.PayoutState
- Direction
- (global) uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break (global), while a change to (global) can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→4 (global) uses BTCPayServer.Abstractions.Models✕
- Connections
- 2 pairs of types, where a type in (global) uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Abstractions.Models.StatusMessageModelIPayoutHandler→BTCPayServer.Abstractions.Models.StatusMessageModel
- Direction
- (global) uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break (global), while a change to (global) can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→5 (global) uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in (global) uses a type in BTCPayServer.Logging.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Logging.Logs
- Direction
- (global) uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break (global), while a change to (global) can't break BTCPayServer.Logging.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→6 (global) uses BTCPayServer.Payouts✕
- Connections
- 2 pairs of types, where a type in (global) uses a type in BTCPayServer.Payouts.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Payouts.PayoutMethodIdIPayoutHandler→BTCPayServer.Payouts.PayoutMethodId
- Direction
- (global) uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break (global), while a change to (global) can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→8 (global) uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in (global) uses a type in BTCPayServer.Services.Invoices.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- (global) uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break (global), while a change to (global) can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→9 (global) uses BTCPayServer.Events✕
- Connections
- 1 pair of types, where a type in (global) uses a type in BTCPayServer.Events.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Events.NewOnChainTransactionEvent
- Direction
- (global) uses BTCPayServer.Events, so a change to BTCPayServer.Events can break (global), while a change to (global) can't break BTCPayServer.Events.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→16 (global) uses BTCPayServer.HostedServices✕
- Connections
- 2 pairs of types, where a type in (global) uses a type in BTCPayServer.HostedServices.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.HostedServices.ClaimRequestIPayoutHandler→BTCPayServer.HostedServices.ClaimRequest
- Direction
- (global) uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break (global), while a change to (global) can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→18 (global) uses BTCPayServer.Services✕
- Connections
- 3 pairs of types, where a type in (global) uses a type in BTCPayServer.Services.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBitcoinLikePayoutHandler→BTCPayServer.Services.TransactionLinkProvidersBitcoinLikePayoutHandler→BTCPayServer.Services.WalletRepository
- Direction
- (global) uses BTCPayServer.Services, so a change to BTCPayServer.Services can break (global), while a change to (global) can't break BTCPayServer.Services.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→21 (global) uses BTCPayServer.Payments.Bitcoin✕
- Connections
- 1 pair of types, where a type in (global) uses a type in BTCPayServer.Payments.Bitcoin.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Payments.Bitcoin.IHasNetwork
- Direction
- (global) uses BTCPayServer.Payments.Bitcoin, so a change to BTCPayServer.Payments.Bitcoin can break (global), while a change to (global) can't break BTCPayServer.Payments.Bitcoin.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→23 (global) uses BTCPayServer.Payments✕
- Connections
- 1 pair of types, where a type in (global) uses a type in BTCPayServer.Payments.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Payments.PaymentMethodId
- Direction
- (global) uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break (global), while a change to (global) can't break BTCPayServer.Payments.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→24 (global) uses BTCPayServer.Data✕
- Connections
- 12 pairs of types, where a type in (global) uses a type in BTCPayServer.Data.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.Data.ApplicationDbContextFactoryBitcoinLikePayoutHandler→BTCPayServer.Data.IClaimDestinationBitcoinLikePayoutHandler→BTCPayServer.Data.IPayoutProofBitcoinLikePayoutHandler→BTCPayServer.Data.PayoutDataBitcoinLikePayoutHandler→BTCPayServer.Data.PayoutTransactionOnChainBlobBitcoinLikePayoutHandler→BTCPayServer.Data.PullPaymentBlobBitcoinLikePayoutHandler→BTCPayServer.Data.StoreDataIPayoutHandler→BTCPayServer.Data.IClaimDestinationIPayoutHandler→BTCPayServer.Data.IPayoutProofIPayoutHandler→BTCPayServer.Data.PayoutDataIPayoutHandler→BTCPayServer.Data.PullPaymentBlobIPayoutHandler→BTCPayServer.Data.StoreData
- Direction
- (global) uses BTCPayServer.Data, so a change to BTCPayServer.Data can break (global), while a change to (global) can't break BTCPayServer.Data.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
35→34 (global) uses BTCPayServer✕
- Connections
- 5 pairs of types, where a type in (global) uses a type in BTCPayServer.
- The types involved
BitcoinLikePayoutHandler→BTCPayServer.BTCPayNetworkBitcoinLikePayoutHandler→BTCPayServer.BTCPayNetworkProviderBitcoinLikePayoutHandler→BTCPayServer.EventAggregatorBitcoinLikePayoutHandler→BTCPayServer.ExplorerClientProviderIPayoutHandler→BTCPayServer.IHandler
- Direction
- (global) uses BTCPayServer, so a change to BTCPayServer can break (global), while a change to (global) can't break BTCPayServer.
- Position
- Below the diagonal: (global) uses a module listed above it, which is the healthy direction.
36→2 BTCPayServer.Hosting uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Client.Models.AppItem
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→3 BTCPayServer.Hosting uses BTCPayServer.Services.Rates✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.Services.Rates.CurrencyDataBTCPayServer.Hosting.LoadCurrencyNameTableStartupTask→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→5 BTCPayServer.Hosting uses BTCPayServer.Logging✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.Logging.LogsBTCPayServer.Hosting.Startup→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→6 BTCPayServer.Hosting uses BTCPayServer.Payouts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→7 BTCPayServer.Hosting uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 4 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Hosting.BlockExplorerLinkStartupTask→BTCPayServer.Abstractions.Contracts.IStartupTaskBTCPayServer.Hosting.LoadCurrencyNameTableStartupTask→BTCPayServer.Abstractions.Contracts.IStartupTaskBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Abstractions.Contracts.IStartupTask
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→8 BTCPayServer.Hosting uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→11 BTCPayServer.Hosting uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→15 BTCPayServer.Hosting uses BTCPayServer.Services.Apps✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.Apps.AppService
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→18 BTCPayServer.Hosting uses BTCPayServer.Services✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.Services.TransactionLinkProviderBTCPayServer.Hosting.BlockExplorerLinkStartupTask→BTCPayServer.Services.TransactionLinkProvidersBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Hosting.OnionLocationMiddleware→BTCPayServer.Services.BTCPayServerEnvironment
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→23 BTCPayServer.Hosting uses BTCPayServer.Payments✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→24 BTCPayServer.Hosting uses BTCPayServer.Data✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Data.IMigrationExecutorBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Data.WalletBlobInfoBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Data.WalletData
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→32 BTCPayServer.Hosting uses BTCPayServer.Configuration✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Hosting.Startup→BTCPayServer.Configuration.BTCPayServerOptionsBTCPayServer.Hosting.Startup→BTCPayServer.Configuration.DataDirectories
- Direction
- BTCPayServer.Hosting uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.Configuration.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
36→34 BTCPayServer.Hosting uses BTCPayServer✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Hosting uses a type in BTCPayServer.
- The types involved
BTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.BTCPayNetworkBTCPayServer.Hosting.BTCPayServerServices→BTCPayServer.BTCPayNetworkBaseBTCPayServer.Hosting.BlockExplorerLinkStartupTask→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Hosting.MigrationStartupTask→BTCPayServer.LightningAddressServiceBTCPayServer.Hosting.RateRule_Obsolete→BTCPayServer.BTCPayNetworkBase
- Direction
- BTCPayServer.Hosting uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Hosting, while a change to BTCPayServer.Hosting can't break BTCPayServer.
- Position
- Below the diagonal: BTCPayServer.Hosting uses a module listed above it, which is the healthy direction.
37→2 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Client.Models.SpeedPolicy
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→3 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Rates✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Services.Rates.RateFetcher
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→8 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Invoices✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→11 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Stores✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→18 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController→BTCPayServer.Services.PermissionService
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→19 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Models✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Models.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayAccessTokenController→BTCPayServer.Models.DataWrapperBTCPayServer.Plugins.Bitpay.Controllers.BitpayAccessTokenController→BTCPayServer.Models.PairingCodeResponseBTCPayServer.Plugins.Bitpay.Controllers.BitpayAccessTokenController→BTCPayServer.Models.TokenRequestBTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Models.DataWrapperBTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Models.InvoiceResponse
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Models, so a change to BTCPayServer.Models can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Models.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→23 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Payments✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Payments.IPaymentMethodBitpayAPIExtensionBTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→24 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Data✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Data.StoreDataBTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.Data.StoreDataBTCPayServer.Plugins.Bitpay.Controllers.UIStoresTokenController→BTCPayServer.Data.StoreData
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→31 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Controllers✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayInvoiceController→BTCPayServer.Controllers.UIInvoiceController
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.Controllers.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
37→34 BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Plugins.Bitpay.Controllers uses a type in BTCPayServer.
- The types involved
BTCPayServer.Plugins.Bitpay.Controllers.BitpayRateController→BTCPayServer.DefaultRulesCollection
- Direction
- BTCPayServer.Plugins.Bitpay.Controllers uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Plugins.Bitpay.Controllers, while a change to BTCPayServer.Plugins.Bitpay.Controllers can't break BTCPayServer.
- Position
- Below the diagonal: BTCPayServer.Plugins.Bitpay.Controllers uses a module listed above it, which is the healthy direction.
38→2 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Client.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Client.Models.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Client.Models.PayoutState
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→4 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Abstractions.Models✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Abstractions.Models.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Abstractions.Models.StatusMessageModel
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Abstractions.Models, so a change to BTCPayServer.Abstractions.Models can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Abstractions.Models.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→6 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payouts✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→8 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services.Invoices✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→11 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→16 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.HostedServices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.HostedServices.ClaimRequest
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→18 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Services.LightningClientFactoryService
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→21 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payments.Bitcoin✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Payments.Bitcoin.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Payments.Bitcoin.IHasNetwork
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payments.Bitcoin, so a change to BTCPayServer.Payments.Bitcoin can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Payments.Bitcoin.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→23 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payments✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→24 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Data✕
- Connections
- 10 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.ILightningLikeLikeClaimDestination→BTCPayServer.Data.IClaimDestinationBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Data.IClaimDestinationBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Data.IPayoutProofBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Data.PayoutDataBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Data.PullPaymentBlobBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Data.StoreDataBTCPayServer.Data.Payouts.LightningLike.PayoutLightningBlob→BTCPayServer.Data.IPayoutProofBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Data.ApplicationDbContextBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Data.PayoutData
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→32 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Configuration✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.Configuration.LightningNetworkOptions
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.Configuration.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→34 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.BTCPayNetworkBTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→BTCPayServer.ResourceTrackerBTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→35 BTCPayServer.Data.Payouts.LightningLike uses (global)✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in (global).
- The types involved
BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandler→IPayoutHandler
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses (global), so a change to (global) can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break (global).
- Position
- Below the diagonal: BTCPayServer.Data.Payouts.LightningLike uses a module listed above it, which is the healthy direction.
38→39 BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.PayoutProcessors.Lightning part of a loop✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Data.Payouts.LightningLike uses a type in BTCPayServer.PayoutProcessors.Lightning.
- The types involved
BTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController→BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory
- Direction
- BTCPayServer.Data.Payouts.LightningLike uses BTCPayServer.PayoutProcessors.Lightning, so a change to BTCPayServer.PayoutProcessors.Lightning can break BTCPayServer.Data.Payouts.LightningLike, while a change to BTCPayServer.Data.Payouts.LightningLike can't break BTCPayServer.PayoutProcessors.Lightning.
- Position
- Above the diagonal, so it is part of a loop. Neither module can be changed, tested or released on its own until one of these dependencies is removed.
39→6 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Payouts✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory→BTCPayServer.Payouts.PayoutMethodIdBTCPayServer.PayoutProcessors.Lightning.UILightningAutomatedPayoutProcessorsController→BTCPayServer.Payouts.PayoutMethodId
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→7 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Abstractions.Contracts.IPluginHookService
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→8 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services.Invoices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→11 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services.Stores✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→16 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.HostedServices✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.HostedServices.PullPaymentHostedService
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→18 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Services.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Services.LightningClientFactoryService
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→24 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Data✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutBlob→BTCPayServer.Data.AutomatedPayoutBlobBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.PayoutBlobBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.PayoutDataBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory→BTCPayServer.Data.PayoutProcessorData
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→26 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.PayoutProcessors✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.PayoutProcessors.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.PayoutProcessors.BaseAutomatedPayoutProcessorBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory→BTCPayServer.PayoutProcessors.IPayoutProcessorFactoryBTCPayServer.PayoutProcessors.Lightning.UILightningAutomatedPayoutProcessorsController→BTCPayServer.PayoutProcessors.PayoutProcessorService
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.PayoutProcessors, so a change to BTCPayServer.PayoutProcessors can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.PayoutProcessors.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→32 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Configuration✕
- Connections
- 1 pair of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Configuration.LightningNetworkOptions
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Configuration.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→34 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.BTCPayNetworkBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.EventAggregatorBTCPayServer.PayoutProcessors.Lightning.UILightningAutomatedPayoutProcessorsController→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
39→38 BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Data.Payouts.LightningLike✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.PayoutProcessors.Lightning uses a type in BTCPayServer.Data.Payouts.LightningLike.
- The types involved
BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.Payouts.LightningLike.LNURLPayClaimDestinatonBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.Payouts.LightningLike.LightningLikePayoutHandlerBTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutProcessor→BTCPayServer.Data.Payouts.LightningLike.ResultVM
- Direction
- BTCPayServer.PayoutProcessors.Lightning uses BTCPayServer.Data.Payouts.LightningLike, so a change to BTCPayServer.Data.Payouts.LightningLike can break BTCPayServer.PayoutProcessors.Lightning, while a change to BTCPayServer.PayoutProcessors.Lightning can't break BTCPayServer.Data.Payouts.LightningLike.
- Position
- Below the diagonal: BTCPayServer.PayoutProcessors.Lightning uses a module listed above it, which is the healthy direction.
40→2 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Client.Models✕
- Connections
- 78 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Client.Models. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldApiKeysController→BTCPayServer.Client.Models.ApiKeyDataBTCPayServer.Controllers.Greenfield.GreenfieldApiKeysController→BTCPayServer.Client.Models.CreateApiKeyRequestBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.AppBaseDataBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.CrowdfundAppDataBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.CrowdfundAppRequestBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.IAppRequestBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.PointOfSaleAppDataBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Client.Models.PointOfSaleAppRequestBTCPayServer.Controllers.Greenfield.GreenfieldFilesController→BTCPayServer.Client.Models.FileDataBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Client.Models.ConnectToNodeRequestBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Client.Models.CreateLightningInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Client.Models.HistogramTypeBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Client.Models.OpenLightningChannelRequestBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Client.Models.PayLightningInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.CreateInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.InvoiceDataBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.InvoicePaymentMethodDataModelBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.MarkInvoiceStatusRequestBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.PaymentBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.PullPaymentDataBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.RefundInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Client.Models.UpdateInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Client.Models.ConnectToNodeRequestBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Client.Models.CreateLightningInvoiceRequestBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Client.Models.HistogramType
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Client.Models, so a change to BTCPayServer.Client.Models can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Client.Models.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→3 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Rates✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services.Rates.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Rates.RateFetcherBTCPayServer.Controllers.Greenfield.GreenfieldPaymentRequestsController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Services.Rates.CurrencyNameTableBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Services.Rates.CurrencyNameTable
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Rates, so a change to BTCPayServer.Services.Rates can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.Rates.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→5 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Logging✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Logging.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldUsersController→BTCPayServer.Logging.Logs
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Logging, so a change to BTCPayServer.Logging can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Logging.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→6 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Payouts✕
- Connections
- 2 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Payouts.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Payouts.PayoutMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Payouts.PayoutMethodHandlerDictionary
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Payouts, so a change to BTCPayServer.Payouts can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Payouts.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→7 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Abstractions.Contracts✕
- Connections
- 9 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Abstractions.Contracts.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.Greenfield.GreenfieldFilesController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.Greenfield.GreenfieldFilesController→BTCPayServer.Abstractions.Contracts.IStoredFileBTCPayServer.Controllers.Greenfield.GreenfieldNotificationsController→BTCPayServer.Abstractions.Contracts.INotificationHandlerBTCPayServer.Controllers.Greenfield.GreenfieldNotificationsController→BTCPayServer.Abstractions.Contracts.NotificationViewModelBTCPayServer.Controllers.Greenfield.GreenfieldServerInfoController→BTCPayServer.Abstractions.Contracts.ISyncSummaryProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.Greenfield.GreenfieldUsersController→BTCPayServer.Abstractions.Contracts.IFileServiceBTCPayServer.Controllers.Greenfield.ServerInfoData2→BTCPayServer.Abstractions.Contracts.ISyncStatus
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Abstractions.Contracts, so a change to BTCPayServer.Abstractions.Contracts can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Abstractions.Contracts.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→8 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Invoices✕
- Connections
- 12 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services.Invoices.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Invoices.InvoiceEntityBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Invoices.PaymentEntityBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldPaymentRequestsController→BTCPayServer.Services.Invoices.InvoiceRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldServerInfoController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningNodeApiController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionaryBTCPayServer.Controllers.Greenfield.GreenfieldStorePaymentMethodsController→BTCPayServer.Services.Invoices.PaymentMethodHandlerDictionary
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Invoices, so a change to BTCPayServer.Services.Invoices can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.Invoices.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→10 BTCPayServer.Controllers.Greenfield uses BTCPayServer.PaymentRequest✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.PaymentRequest.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldPaymentRequestsController→BTCPayServer.PaymentRequest.PaymentRequestService
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.PaymentRequest, so a change to BTCPayServer.PaymentRequest can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.PaymentRequest.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→11 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Stores✕
- Connections
- 11 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services.Stores.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldServerRolesController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldServerRolesController→BTCPayServer.Services.Stores.StoreRoleBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldStorePaymentMethodsController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreRolesController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreRolesController→BTCPayServer.Services.Stores.StoreRoleBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Services.Stores.GeneratedInvitationBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Services.Stores.StoreRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Services.Stores.StoreRoleIdBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Services.Stores.StoreRepository
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Stores, so a change to BTCPayServer.Services.Stores can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.Stores.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→13 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Wallets✕
- Connections
- 7 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services.Wallets.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Services.Wallets.BTCPayWalletBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Wallets.BTCPayWalletBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Wallets.BTCPayWalletProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Wallets.TransactionHistoryLineBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Wallets.WalletHistogramServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.Wallets.WalletReceiveService
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Wallets, so a change to BTCPayServer.Services.Wallets can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.Wallets.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→15 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Apps✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services.Apps.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.Apps.AppServiceBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.Apps.CrowdfundSettingsBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.Apps.PointOfSaleSettings
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services.Apps, so a change to BTCPayServer.Services.Apps can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.Apps.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→16 BTCPayServer.Controllers.Greenfield uses BTCPayServer.HostedServices✕
- Connections
- 6 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.HostedServices.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldHealthController→BTCPayServer.HostedServices.NBXplorerDashboardBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.HostedServices.PullPaymentHostedServiceBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.HostedServices.ClaimResponseBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.HostedServices.PayoutPaidResultBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.HostedServices.PullPaymentHostedServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.HostedServices.NBXplorerDashboard
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.HostedServices, so a change to BTCPayServer.HostedServices can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.HostedServices.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→18 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services✕
- Connections
- 30 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Services. Showing 25 of them; the rest are in namespace-graph.json in this report's bundle.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldApiKeysController→BTCPayServer.Services.PermissionServiceBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Services.UriResolverBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Services.LightningHistogramServiceBTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.InvoiceActivatorBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Services.LanguageServiceBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Services.LightningHistogramServiceBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Services.BTCPayNetworkJsonSerializerSettingsBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Services.SettingsRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldServerInfoController→BTCPayServer.Services.BTCPayServerEnvironmentBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningNodeApiController→BTCPayServer.Services.LightningClientFactoryServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningNodeApiController→BTCPayServer.Services.LightningHistogramServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningNodeApiController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.DelayedTransactionBroadcasterBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.IFeeProviderFactoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.TransactionLinkProvidersBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Services.WalletRepositoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Services.CallbackGeneratorBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Services.PoliciesSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Services.UriResolver
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Services, so a change to BTCPayServer.Services can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Services.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→20 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Plugins.Emails.Services✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Plugins.Emails.Services.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Plugins.Emails.Services.EmailSenderFactory
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Plugins.Emails.Services, so a change to BTCPayServer.Plugins.Emails.Services can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Plugins.Emails.Services.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→23 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Payments✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Payments.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Payments.IPaymentLinkExtensionBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Payments.PaymentMethodIdBTCPayServer.Controllers.Greenfield.GreenfieldStorePaymentMethodsController→BTCPayServer.Payments.IPaymentMethodHandlerBTCPayServer.Controllers.Greenfield.GreenfieldStorePaymentMethodsController→BTCPayServer.Payments.PaymentMethodId
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Payments, so a change to BTCPayServer.Payments can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Payments.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→24 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Data✕
- Connections
- 23 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Data.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldApiKeysController→BTCPayServer.Data.APIKeyDataBTCPayServer.Controllers.Greenfield.GreenfieldApiKeysController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.Greenfield.GreenfieldAppsController→BTCPayServer.Data.AppDataBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Data.PullPaymentDataBTCPayServer.Controllers.Greenfield.GreenfieldNotificationsController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.Greenfield.GreenfieldPaymentRequestsController→BTCPayServer.Data.PaymentRequestDataBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Data.ApplicationDbContextFactoryBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Data.PayoutDataBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.Data.PullPaymentDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedLightningPayoutProcessorsController→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedOnChainPayoutProcessorsController→BTCPayServer.Data.PayoutProcessorDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningAddressesController→BTCPayServer.Data.LightningAddressDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Data.WalletObjectDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Data.WalletTransactionInfoBTCPayServer.Controllers.Greenfield.GreenfieldStorePaymentMethodsController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.Data.StoreInvitationExtendedRowBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Data.ApplicationUserBTCPayServer.Controllers.Greenfield.GreenfieldStoresController→BTCPayServer.Data.StoreDataBTCPayServer.Controllers.Greenfield.GreenfieldUsersController→BTCPayServer.Data.ApplicationUser
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Data, so a change to BTCPayServer.Data can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Data.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→26 BTCPayServer.Controllers.Greenfield uses BTCPayServer.PayoutProcessors✕
- Connections
- 5 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.PayoutProcessors.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldPayoutProcessorsController→BTCPayServer.PayoutProcessors.IPayoutProcessorFactoryBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedLightningPayoutProcessorsController→BTCPayServer.PayoutProcessors.PayoutProcessorServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedOnChainPayoutProcessorsController→BTCPayServer.PayoutProcessors.PayoutProcessorServiceBTCPayServer.Controllers.Greenfield.GreenfieldStorePayoutProcessorsController→BTCPayServer.PayoutProcessors.IPayoutProcessorFactoryBTCPayServer.Controllers.Greenfield.GreenfieldStorePayoutProcessorsController→BTCPayServer.PayoutProcessors.PayoutProcessorService
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.PayoutProcessors, so a change to BTCPayServer.PayoutProcessors can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.PayoutProcessors.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→31 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Controllers✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Controllers.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.Controllers.UIInvoiceControllerBTCPayServer.Controllers.Greenfield.GreenfieldPaymentRequestsController→BTCPayServer.Controllers.UIInvoiceControllerBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.Controllers.UIWalletsController
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Controllers, so a change to BTCPayServer.Controllers can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Controllers.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→32 BTCPayServer.Controllers.Greenfield uses BTCPayServer.Configuration✕
- Connections
- 3 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.Configuration.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInternalLightningNodeApiController→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningNodeApiController→BTCPayServer.Configuration.LightningNetworkOptionsBTCPayServer.Controllers.Greenfield.GreenfieldUsersController→BTCPayServer.Configuration.BTCPayServerOptions
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.Configuration, so a change to BTCPayServer.Configuration can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.Configuration.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→34 BTCPayServer.Controllers.Greenfield uses BTCPayServer✕
- Connections
- 20 pairs of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.Greenfield.GreenfieldInvoiceController→BTCPayServer.DefaultRulesCollectionBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.BTCPayNetworkBTCPayServer.Controllers.Greenfield.GreenfieldLightningNodeApiController→BTCPayServer.JsonHttpExceptionBTCPayServer.Controllers.Greenfield.GreenfieldPullPaymentController→BTCPayServer.BTCPayNetworkProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedLightningPayoutProcessorsController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedOnChainPayoutProcessorsController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.Greenfield.GreenfieldStoreLightningAddressesController→BTCPayServer.LightningAddressServiceBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.BTCPayNetworkBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.ExplorerClientProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.JsonHttpExceptionBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainPaymentMethodsController→BTCPayServer.WalletCreationPermissionsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.BTCPayNetworkBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.DerivationSchemeSettingsBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.ExplorerClientProviderBTCPayServer.Controllers.Greenfield.GreenfieldStoreOnChainWalletsController→BTCPayServer.WalletCreationPermissionsBTCPayServer.Controllers.Greenfield.GreenfieldStoreUsersController→BTCPayServer.EventAggregatorBTCPayServer.Controllers.Greenfield.GreenfieldUsersController→BTCPayServer.EventAggregator
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer, so a change to BTCPayServer can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
40→39 BTCPayServer.Controllers.Greenfield uses BTCPayServer.PayoutProcessors.Lightning✕
- Connections
- 1 pair of types, where a type in BTCPayServer.Controllers.Greenfield uses a type in BTCPayServer.PayoutProcessors.Lightning.
- The types involved
BTCPayServer.Controllers.Greenfield.GreenfieldStoreAutomatedLightningPayoutProcessorsController→BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutBlob
- Direction
- BTCPayServer.Controllers.Greenfield uses BTCPayServer.PayoutProcessors.Lightning, so a change to BTCPayServer.PayoutProcessors.Lightning can break BTCPayServer.Controllers.Greenfield, while a change to BTCPayServer.Controllers.Greenfield can't break BTCPayServer.PayoutProcessors.Lightning.
- Position
- Below the diagonal: BTCPayServer.Controllers.Greenfield uses a module listed above it, which is the healthy direction.
At a glance — Code Health
At a glance — Architecture
At a glance — Maturity
At a glance — Readiness
At a glance — Security
At a glance — Event-Driven
At a glance — Accessibility
At a glance — Performance
Security & Compliance — OWASP Top-10 mapping
| OWASP category | Findings | Severity |
|---|---|---|
| A05:2025 — Injection | 136 | High / Critical |
| A07:2025 — Authentication Failures | 11 | High / Critical |
| A03:2025 — Software Supply Chain Failures | 6 | Medium |
| A02:2025 — Security Misconfiguration | 5 | High / Critical |
| A01:2025 — Broken Access Control | 1 | Medium |
Roadmap
First, ensure all custom controls are fully keyboard accessible by adding proper roles, handlers, and valid hrefs to anchors. Next, immediately address the three leaked secrets in REDACTED, REDACTED, and REDACTED to secure sensitive data. Then, correct the inverted test pyramid to improve test reliability and coverage. Finally, reduce explicit technical debt by removing write-only private fields in key files and eliminating unnecessary NoWarn directives in project files.
| Do this | Helps | Effort | Dimension |
|---|---|---|---|
| Resolve the 3 Leaked secret finding(s) in REDACTED Scanning — start with REDACTED, REDACTED, REDACTED. | +3.1 pts | Low | REDACTED Scanning |
| Resolve the 1 Inverted test pyramid finding(s) in Test Distribution. | +3.0 pts | Low | Test Distribution |
| Resolve the 7 NoWarnInCsproj finding(s) in Explicit Debt — start with BTCPayServer.Tests.csproj (3), Common.csproj, BTCPayServer.PluginPacker.csproj. | +2.4 pts | Low | Explicit Debt |
| Resolve the 75 EmptyCatchBlock finding(s) in Explicit Debt — start with Extensions.cs (4), UIWalletsController.PSBT.cs (4), ConsoleLogger.cs (2). | +2.4 pts | Medium | Explicit Debt |
| Resolve the 45 WriteOnlyPrivateField finding(s) in Explicit Debt — start with MigrationStartupTask.cs (4), InvoiceWatcher.cs (3), LocalizerFactory.cs (3). | +2.4 pts | Medium | Explicit Debt |
| Make custom controls keyboard-operable (role + tabindex + key handler), drop positive tabindex, and give anchors a real href. | +3.2 pts | Medium | Keyboard semantics |
| Enforce accessibility in the test suite you already have: assert the accessibility invariants over the HTML your app renders — parse the rendered output in an existing test, or drive a real browser from one — and gate that test in CI so a regression blocks the merge. | +2.2 pts | Medium | A11y enforcement |
| Keep a visible focus style (don't remove the outline without a replacement), guard animation with prefers-reduced-motion, and raise low-contrast colour pairs to at least 4.5:1. | +1.7 pts | Medium | Visual & motion safety |
File quality
| File | Score | Band | Worst signal |
|---|---|---|---|
| REDACTED | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Controllers/UIInvoiceController.UI.cs | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| REDACTED | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Hosting/MigrationStartupTask.cs | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Extensions.cs | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| REDACTED | 1.0 | Slop | Explicit Debt: EmptyCatchBlock |
| REDACTED | 1.1 | Slop | Explicit Debt: WriteOnlyPrivateField |
| BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs | 2.0 | Slop | Explicit Debt: WriteOnlyPrivateField |
| BTCPayServer/DerivationSchemeParser.cs | 2.1 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/HostedServices/DbMigrationsHostedService.cs | 2.1 | Slop | Explicit Debt: EmptyCatchBlock |
| REDACTED | 2.5 | Slop | Explicit Debt: FileScopedPragmaDisable |
| BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs | 2.6 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/HostedServices/InvoiceWatcher.cs | 2.7 | Slop | Explicit Debt: EmptyCatchBlock |
| REDACTED | 3.3 | Slop | Explicit Debt: WriteOnlyPrivateField |
| REDACTED | 3.3 | Slop | IaC & Container Security: High IaC: REDACTED |
| BTCPayServer/Services/Invoices/InvoiceEntity.cs | 3.4 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Plugins/PluginManager.cs | 3.4 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs | 3.5 | Slop | Explicit Debt: EmptyCatchBlock |
| BTCPayServer/Payments/Lightning/LightningListener.cs | 3.6 | Slop | Explicit Debt: EmptyCatchBlock |
How the grades work
A definite problem that already costs you something and drags the score down: a missing authorisation check, a dependency with a known exploit, a build that does not reproduce. Failure here tends to cause failures elsewhere.
Likely wrong, but not failing yet. It degrades the codebase over a longer horizon and can cause failures elsewhere — not urgent this week, not something to carry for two years either.
Recorded, with no effect on how the codebase functions. Present so the survey is complete, not because it needs doing.
Something this survey could not settle from the outside, and which could be critical or serious. Either a control was required and no positive evidence of it exists in the repository — a backup job that nothing shows was ever restored from proves nothing about restores — or our own analysis could not run over that part of the tree. This is not a clean result. These are excluded from the score rather than awarded a pass, so the number on the cover neither rewards nor penalises them: if you act on this survey without resolving them, you carry that risk yourself. Each one is named under Limitations.
Methodology & how to trust this report
Watchdog is a deep, periodic assessment — run each sprint, monthly, or quarterly, taking the time to go wider and deeper than a quick check and surfacing in one coherent report what you'd otherwise piece together from a dozen separate tools. It scores deterministically: the same commit yields the same score, every run. 91 of 96 evaluated dimensions are computed purely by tools and static analysis (confidence 1.0); 5 documentation/naming judgement(s) are LLM-assisted and labelled advisory. Overall confidence is 0.9 — the weighted average across measured dimensions; it falls as more of the score leans on LLM-assisted judgement and rises when it's fully tool-backed.
What we checked — 96 dimensions across the health lenses
- Can you open the finding? Real findings cite a repo-relative file and line you can open at the cited line — never an absolute scratch path. Here, 1418 of 1452 do; the remainder are repo-wide signals — a dimension-level measurement, not a single line.
- Is there a tool behind the number? Every score below names the method that produced it — Roslyn, git, a scanner, or (for a handful of documentation/naming dimensions) an LLM labelled sampled · advisory — not a narrative.
- Does re-running give the same result? Run it again on the same commit and the score — and this report, byte for byte — is identical. A report whose numbers move between runs is describing the run, not the code.
Tools & methods
| Method | Backs | Version | Evaluator |
|---|---|---|---|
| Roslyn static analysis | Complexity, cohesion, coupling, dead code, API surface, layering | 5.3.0 | ✓ deterministic |
| Native secret scanner | Hardcoded secrets / credentials | 1.0.0 | ✓ deterministic |
| Watchdog duplication detector (in-process) | Code duplication | 1.0.0 | ✓ deterministic |
| Coverage (coverlet / dotnet-coverage) | Line & branch coverage | 10.0.400 | ✓ deterministic |
| NuGet / dotnet | Outdated, vulnerable & deprecated dependencies | 10.0.400 | ✓ deterministic |
| git / LibGit2Sharp | Churn hotspots, knowledge concentration, history | 2.43.0 · 0.31.0 | ✓ deterministic |
| gitleaks · semgrep · trivy · checkov | Secrets in history, SAST, CVEs, IaC & container, PII / GDPR | 1.86.0 · 0.69.3 · 3.2.533 | ✓ deterministic |
| LLM (sampled · advisory) | Documentation quality, ADR conformance, naming — sampled over a bounded sample; advisory, never a deterministic measurement | Local LLM | ◐ LLM · sampled · advisory |
Run transparency — what happened this run
- D8 Code Coverage — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. The test suite couldn't be built/run in-image and no coverage report is committed, so line coverage was not measured — and it is EXCLUDED from the score rather than scored on a LoC-ratio proxy. No coverage collector was found in your CI either, so there is no existing report to hand us. You can widen what we reach: optional: add a coverage collector to your test run and commit (or publish) its Cobertura/OpenCover/lcov output anywhere in the repo, or make the suite runnable in-image, and real coverage will be measured.
- D11 Test Reliability — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Test reliability NOT MEASURED: the test run produced no results for any test tier, so no test ever ran and flakiness could not be exercised. The cause could not be attributed, so it is excluded from the score rather than read as an absence of tests.
- D22 Internal API Consistency — not measured this run — This is a true statement about the repository that carries nothing for its owner to act on, so it is reported here rather than as a defect in their code. The loaded project set declares no packable project and no `.Contracts` project, so there is no intentionally-exposed surface for API consistency to be judged over.
- D23 Boundary Type-Coupling — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Large codebase (106,281 production LoC in the .NET projects) with no declared bounded contexts — cross-boundary type coupling is unassessed Bounded contexts cannot be inferred from a codebase that is not physically organised by them (D-321), so with none declared there are no boundaries for the coupling pass to measure across. You can widen what we reach: name this codebase's bounded contexts (≥2 module groups, e.g. per subsystem) so cross-boundary type coupling can be assessed. Declare them in `.codehealth/config.yaml` at the repository root (create it if absent), mapping each context name to the module-path or namespace prefixes that belong to it — e.g. `architecture:` → `contexts:` → `Billing: ["src/billing", "Acme.Billing"]`, `Catalog: ["src/catalog", "Acme.Catalog"]`.
- D32 Data Compliance (PII/GDPR) — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. `BTCPayServer.Abstractions/Contracts/BasePluginDbContext.cs`, `BTCPayServer.Abstractions/Contracts/VersionCondition.cs`, `BTCPayServer.Abstractions/Models/LayoutModel.cs`, `BTCPayServer.Abstractions/Security/PolicyRequirement.cs`, `BTCPayServer.Abstractions/TagHelpers/PermissionTagHelper.cs`, … (+171 more) produced a parse error, so every rule in this engine's `gdpr.yml` was absent there. That absence is NOT a clean result: these rules detect personal data crossing a boundary into a log sink, a URL or browser storage, and a file that was never parsed cannot report any of the three. The rest of the tree analysed normally and its rows above stand; only these files are unaccounted for. You can widen what we reach: fix the syntax error (or exclude the file deliberately) and re-scan to cover it.
- AC2 Forms & labels — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 126 further occurrence(s) are not listed individually; the score already reflects all 166.
- AC3 Page structure — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 23 further occurrence(s) are not listed individually; the score already reflects all 63.
- AC6 Visual & motion safety — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 14 further occurrence(s) are not listed individually; the score already reflects all 54.
- AXR1 Runtime accessibility — not measured this run — Watchdog could not measure this here. That is a gap on our side — a collector, parser or image we have not built yet — and it is neither a defect in this repository nor evidence that the check would have passed. Render strategy: boot via REDACTED (REDACTED). docker build failed (exit 1) — DEPRECATED: The legacy builder is deprecated and will be removed in a future release. Install the buildx component to build images with BuildKit: https://docs.docker.com/go/bui…; runtime evidence skipped.
- IC1 Incompleteness & stubs — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 13 further occurrence(s) are not listed individually; the score already reflects all 53.
- X2 Cancellation propagation — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 901 further occurrence(s) are not listed individually; the score already reflects all 941.
- X3 Exception handling — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 52 further occurrence(s) are not listed individually; the score already reflects all 92.
- X4 Structured logging — measured, with a gap in what it reached — Watchdog measured this, but not all of it. What it did not reach is a gap on our side — a collector, parser or image we have not built yet — so the numbers on that dimension cover less than the repository, and the part left out is not evidence that it would have passed. 24 further occurrence(s) are not listed individually; the score already reflects all 64.
Limitations & what we did not check
Watchdog assesses the repository exactly as committed, and only the repository. By design it does not reach outside the source tree: the live cloud account, the running CI/CD pipeline, the host's branch-protection and approval rules, the production configuration, or a restore actually exercised against a backup are all out of scope. That boundary is a feature, not a gap — a repo-relative, deterministic scan re-runs identically on any commit and every finding opens at a real file and line, where a live audit can neither be reproduced nor traced. The visible consequence is that controls which leave no in-repo evidence are reported as "not evidenced" and excluded from the score rather than awarded a number a static scan cannot justify.
Per-dimension blind spots
- D1 Cyclomatic Complexity: Cyclomatic complexity counts branches statically — it cannot tell an essential decision tree from accidental tangle, nor see complexity that lives in data or configuration (large switch-case token tables, DSL lexers/parsers, data-as-code rule tables) rather than control flow: a tokenizer's many single-character cases read as high complexity though each branch is trivial.
- D2 Cognitive Complexity: Cognitive-complexity heuristics approximate how hard code is to follow; genuine domain difficulty and well-named intent that eases reading are not captured.
- D3 God Classes: "God class" is sized by members and responsibilities visible in the type — a deliberately broad facade over a coherent subsystem can read the same as an accidental grab-bag. For front-end JS the file-length check is cohesion-aware (a single-responsibility module — one class/IIFE — earns a 3× threshold), but cohesion is approximated from top-level declarations, not true dependency structure.
- D4 Code Duplication: Duplication is token-similarity — an in-process token-stream comparison over sliding windows, with type-aware normalization — so it finds copy-paste, not semantic duplication expressed differently. Committed machine-written code (scaffolded migrations, designer/codegen output, protobuf/OpenAPI stubs, model snapshots) is EXCLUDED — its repetition is the tool's, not the team's — so the score reflects hand-written duplication only.
- D5 Coupling: Coupling is measured between projects/assemblies — runtime coupling through DI, reflection, messaging or shared databases is invisible to a static reference graph.
- D6 Cohesion (LCOM4): LCOM4 cohesion is syntactic — it infers connectivity from which methods touch which fields/methods by name, not from real runtime behaviour or intent.
- D9 Test Distribution: The test-pyramid shape is inferred from project/folder naming and references, with a single test host bucketed per-file by its path tier and content signals — a suite that names tiers unconventionally and gives no per-file signal can still be mis-bucketed.
- D10 Test Quality: Assertion density is structural — it cannot tell a meaningful behavioural assertion from a trivial one, only that an assertion is present.
- D12 Dependency Hygiene: Dependency health reads manifests and lockfiles — a vulnerability in a vendored/copied dependency, or risk from how a dependency is actually used, is outside this view.
- D13 REDACTED Scanning: REDACTED detection is signature- and entropy-based on the current tree — a secret that does not match a known pattern, or one already rotated, will not be flagged (a clean scan is "nothing matched", not "no secrets exist").
- D14 License Compliance: License compatibility is checked against declared package metadata and a policy — mislabelled or missing license metadata, and obligations that depend on how you distribute, are not resolved here.
- D15 Churn × Complexity Hotspots: Churn hotspots come from git history — a freshly imported or squashed repository has no churn signal, and recent rewrites can mask a historically risky file.
- D16 Bus Factor: Bus-factor is a time-decayed model of commit attribution (who has recently, repeatedly worked a file), not comprehension — pairing, review and reading-without-committing spread knowledge it can't see; bot commits and shared accounts still distort it.
- D17 Explicit Debt: Acknowledged-debt signals (TODO/FIXME, suppressions, dead code) are textual — undocumented debt that nobody marked, and debt that lives in design rather than annotations, is invisible. Committed machine-written code (scaffolded migrations, designer/codegen output, generated stubs) is excluded — it is never the team's dead code to delete.
- D18 Solution Shape: Build integrity reflects whether the solution compiled in this environment — a build that needs a private feed, a specific SDK, or a generated file absent from the repo can read as broken when it is merely unreproducible here.
- D19 Documentation Quality: Documentation quality is judged by an LLM over a bounded sample of docs — it reads what is written, not whether the docs match the running system, and it is advisory, not a measurement. Its critique rows are drawn from a closed category vocabulary and each row means the same thing in every run, so two scans can be compared row by row; the SET that fires is still a sample, and does not repeat exactly. Measured on one frozen input, six scans at one engine SHA: 2-5 critique rows per scan, 8 distinct rows across the six, 3 of those 8 seen in only one scan. So a D19 row is evidence about the documentation, but a COUNT of D19 rows is not a quantity — never read a change in it as an improvement or a regression.
- D20 ADR Quality: ADR quality is an LLM read of the decision records present — it cannot know about decisions made and never recorded, and its verdict is sampled and advisory.
- D21 Naming Consistency: Naming quality is an LLM judgement over a bounded sample — it assesses clarity/consistency of the names it sees, not domain-correctness, and is advisory.
- D24 Comment Value: Comment value (WHY vs WHAT) is an LLM judgement over a bounded sample — it is advisory and cannot weigh a comment against the precise code change it was written to explain.
- D26 Project Cohesion: Project focus is sized from members/namespaces per project — a project that is broad by deliberate design reads the same as one that has sprawled.
- D27 Navigability: Indirection/navigability is structural — it measures hops to follow a call, not whether that indirection buys real flexibility or just ceremony.
- D28 Secrets (history): Secret-history scanning sweeps the git log for known patterns — a secret that predates the available history, or never matched a signature, is not found (clean means "nothing matched in the history we can see").
- D29 Static Analysis (SAST): SAST findings are pattern-based (semgrep) — it finds classes of bug it has rules for; logic flaws, auth/authorization gaps and issues needing runtime context are out of reach (and clean means "no rule matched").
- D30 Dependency Vulnerabilities: CVE matching depends on accurate package/version metadata and on the advisory databases — a vulnerability with no published advisory, or in code not declared as a dependency, is not seen. Coverage needs a RESOLVED graph: an unpinned requirements.txt, or a pom without a resolved build, yields partial coverage rather than a clean verdict. An ecosystem the analyzer cannot scan is reported as unmeasured, never as clean.
- D31 IaC & Container Security: IaC scanning checks Dockerfiles/Terraform/Kubernetes against best-practice rules — it cannot see the live cloud account, runtime configuration, or drift between the committed config and what is actually deployed.
- D32 Data Compliance (PII/GDPR): PII/GDPR signals are heuristic pattern matches in code — they flag likely handling concerns, not legal compliance, and cannot trace where data actually flows at runtime.
- D34 Knowledge Freshness: Freshness is decayed commit RECENCY, not comprehension — code read often but rarely committed reads as orphaned, and stable code that genuinely needs no changes is penalised the same as forgotten code; bot/squash commits distort it like the bus factor.
- D35 Change Coupling: Change coupling is co-change in COMMITS — files split across separate commits, or coupled only through a shared config/build step, read as uncoupled, and a sweeping commit (rename/format) is excluded so it doesn't couple everything. It shows that files change together, not WHY: a high coupling can be a healthy cohesive pair as readily as a hidden leak.
- D44 Platform End-of-Life: The support table is FROZEN, so it goes out of date by losing RECALL: a release that ended support after the table was written is missed until the table is refreshed, and this dimension reading 10 is not evidence that a platform is current. Only platforms the repository DECLARES in a place this pass reads are seen — a runtime named only in a REDACTED (D31's subject), in a CI workflow (D29's), or in a file this pass does not parse (go.mod, a Gemfile ruby directive) is invisible here, which is why a repository declaring none of them abstains rather than scoring. Only frameworks with a PUBLISHED support policy are tracked: React, Flask and Express publish none, so their age cannot be judged and their absence from a report is not a statement that they are supported.
- AC1 Text alternatives: Alt-text is detected structurally — the scan sees that an alternative EXISTS, not whether it meaningfully describes the image, and decorative-vs-missing is judged by attribute shape; runtime-injected images and a non-role=img decorative svg are out of scope. This is accessibility readiness, never a WCAG conformance claim.
- AC2 Forms & labels: Label association is read from static markup — a label wired up at runtime (JS-set aria-labelledby, framework-injected ids) reads as missing, a present label says nothing about whether its text is correct. A known UI-library field component (e.g. a JSX <TextField>) is now checked conservatively — flagged only when it carries NO label/aria-label/aria-labelledby/id/name — but wrapper/context-labelled libraries (Chakra/Radix FormControl+FormLabel) aren't statically visible (possible false positive) and non-JSX lowercased components are still skipped. A click handler on a plain element is now asked for a name too (it is a control the author declared), but the subtree test that answers it is deliberately generous: any DYNAMIC text expression in the subtree counts as a name, so an icon chosen by a ternary ({cond ? <IconA/> : <IconB/>}) reads as named, and a glyph component from a library the icon-import list does not know still names its parent. A clean result is "no unlabelled control found", not a labelling proof.
- AC3 Page structure: Page structure is read from the static markup tree — landmarks, headings and lang injected at runtime aren't seen, heading ORDER is checked structurally (not against the rendered visual hierarchy), and lang/title/main fire only on full documents, never partials, and the data-table check sees header-cell presence (a <th> exists), not whether each header correctly associates with its cells. Static readiness, not conformance.
- AC4 Keyboard semantics: Keyboard semantics are inferred from markup attributes — interactivity wired purely in script, focus managed at runtime, and component-level handlers are invisible. A clean result means "no static keyboard-trap shape", not a keyboard-operability proof.
- AC5 ARIA correctness: ARIA correctness is checked against the static role/attribute shape — roles/attributes set dynamically aren't seen, a valid role says nothing about whether it matches the element's real behaviour, and required-state checks are suppressed when a JSX spread could supply them. The two-branch toggle check (a control whose state is conveyed only by which of two mutually exclusive branches renders) reads CONDITIONALS THAT ARE ATTRIBUTES — Vue v-if/v-else/v-show and Alpine x-if/x-show — so the same toggle written as a Svelte {#if} block or a JSX ternary is control flow the markup model never projects as a branch and is not seen at all.
- AC6 Visual & motion safety: Contrast and motion safety are PARTIAL by construction — literal colours (hex/rgb/hsl/named) in inline styles, in-repo <style> blocks, in-repo .css files, var() tokens, Tailwind neutral utilities and CSS-in-JS top-level declarations are read (same-rule/same-element colour+background pairs only); computed/runtime/theme colour, external-CDN stylesheets, CSS-in-JS dynamic (${…}) and nested-selector colours, cross-element pairs and image contrast stay out of reach, so a clean result is bounded by what the static CSS itself shows.
- AC7 A11y enforcement: Enforcement is scored from in-repo config/CI evidence only — an a11y gate enforced in external tooling with no in-repo trace can't be credited, and a configured linter is presence, not proof the rules actually run or block a merge.
- AX10 Code composition: Role is inferred from namespace/folder convention, not semantics — a domain concept living in a folder named "Services" reads as application, and the split is lines-of-code, not business value. The business-logic-share score is a SOFT, FLOORED signal: it contributes to the Architecture lens but is floored at the Critical gate, so an infrastructure-heavy design (a gateway, an ETL, a driver) is legitimately low without being nuked to zero.
- C3 Audit Trail: This control is scored from in-repo evidence only — a working control configured outside the repository leaves no signal a static scan can credit.
- C4 Data Retention: This control is scored from in-repo evidence only — its real-world effectiveness, exercised only at runtime, is outside a static scan.
- ED5 Idempotency: Idempotency is judged from the handler body's visible writes and guards — a guard enforced by a database unique constraint, a broker's exactly-once delivery, or a domain method whose no-op-when-applied logic the scan can't follow may read as at-risk; the at-risk candidates are confirmed by a SAMPLED LLM verdict (advisory, not exhaustive) and degrade to heuristic-only when no model is configured. It flags the at-least-once double-apply SHAPE, not a runtime proof of a duplicate effect.
- M4 Documentation accuracy: Onboarding quality is an LLM read of the docs/setup present — it cannot run the onboarding or measure how long a real new joiner takes; the verdict is sampled and advisory.
- P4 Deployment & Rollback: Approval/branch-protection rules live in repository settings the scan cannot see — only their in-repo evidence (config files, workflows) is checked, so a control enforced purely in the host's settings reads as "not evidenced".
- P6 Release Hygiene: Rollback/observability controls are inferred from repo artefacts (pipelines, dashboards-as-code) — controls configured in external tooling, with no in-repo trace, cannot be credited.
The LLM boundary
Dimensions
D1 · Cyclomatic Complexity
140 method(s) exceeded the cyclomatic complexity threshold of 15; the worst was initGlobalSearch at 92. A further 7 method(s) were over the threshold but excluded as flat dispatchers (a long switch/match over independent cases: many branches, almost no nesting), the largest being Extensions.IsPublicAddress at 45 — they are counted neither in the figure above nor in this dimension's score. 3 files carry no cyclomatic complexity row at all for this reason — every one of their over-threshold methods was excluded, so the exclusion is disclosed nowhere in the file itself: BTCPayServer/SearchString.cs (SearchString.GetDateRangeDate at 27), BTCPayServer/wwwroot/payment-request/app.js (app.document.addEventListener("DOMContentLoaded") at 24), BTCPayServer.Common/Shims.cs (AnsiLogConsole.GetForegroundColorEscapeCode at 16). They are named here because the per-file figures other dimensions report are taken BEFORE this exclusion, so such a file can show a high maximum complexity elsewhere in this report and nothing here, with nothing to reconcile the two.
What to do
- Bring the 8 bodies over 60 down to 60 or less in Cyclomatic Complexity — start with initGlobalSearch (cyclomatic 92), global-search.initGlobalSearch (cyclomatic 89), InvoiceData.TryMigrate (cyclomatic 80). — This score is capped by its worst body, so a finding fixed alone moves it by almost nothing — the next one down takes its place. Refactoring these 8 together lifts Cyclomatic Complexity from 6.1 to about 6.5/10, projected with the scoring formula itself and assuming each lands exactly at 60; a cleaner split scores higher.
- Enforce Cyclomatic Complexity in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D2 · Cognitive Complexity
196 method(s) exceeded the cognitive complexity threshold of 15; the worst was InvoiceData.TryMigrate at 119.
What to do
- Bring the 16 bodies over 60 down to 60 or less in Cognitive Complexity — start with InvoiceData.TryMigrate (cognitive 119), PayJoinEndpointController.Submit (cognitive 109), initGlobalSearch (cognitive 97). — This score is capped by its worst body, so a finding fixed alone moves it by almost nothing — the next one down takes its place. Refactoring these 16 together lifts Cognitive Complexity from 5.0 to about 6.0/10, projected with the scoring formula itself and assuming each lands exactly at 60; a cleaner split scores higher.
- Enforce Cognitive Complexity in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D3 · God Classes
74 god class(es) detected.
What to do
- Resolve the 20 MethodTooLong finding(s) in God Classes — start with UIWalletsController.cs (2), UIInvoiceController.UI.cs (2), UIWalletsController.PSBT.cs (2). — One of this dimension's main actionable groups (20 warning-level).
- Resolve the 20 FileTooLong finding(s) in God Classes — start with UIWalletsController.cs, UIInvoiceController.UI.cs, PullPaymentHostedService.cs. — One of this dimension's main actionable groups (20 warning-level).
- Resolve the 13 ClassTooLong finding(s) in God Classes — start with REDACTED, MigrationStartupTask.cs, GreenfieldStoreOnChainWalletsController.cs. — One of this dimension's main actionable groups (13 warning-level).
- Enforce God Classes in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D4 · Code Duplication
46 duplicated block group(s) detected.
What to do
- Resolve the 6 Duplicated block (10 lines × 2) finding(s) in Code Duplication — start with BitcoinLikePayoutHandler.cs, LnurlAuthService.cs, UIFormsController.cs. — One of this dimension's main actionable groups (6 warning-level).
- Resolve the 5 Duplicated block (7 lines × 2) finding(s) in Code Duplication — start with REDACTED, StoreRepository.cs, UIStoresController.Roles.cs. — One of this dimension's main actionable groups (5 warning-level).
- Resolve the 5 Duplicated block (6 lines × 2) finding(s) in Code Duplication — start with GreenfieldStoreOnChainWalletsController.cs (2), UIPluginManagerController.cs, PaymentData.Migration.cs. — One of this dimension's main actionable groups (5 warning-level).
- Enforce Code Duplication in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Verified — provenance only; does not change the score.
D5 · Coupling
10 projects, 0 dependency cycle(s), 0 unstable depended-on project(s).
What to do
- Resolve the 1 Off the main sequence finding(s) in Coupling — start with BTCPayServer.Client.csproj. — One of this dimension's main actionable groups (1 warning-level).
- Enforce Coupling in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D6 · Cohesion (LCOM4)
3 of 304 classes have LCOM4 above 3.
What to do
- Resolve the 3 Low cohesion finding(s) in Cohesion (LCOM4) — start with UIStoresController.cs, REDACTED, PullPaymentHostedService.cs. — One of this dimension's main actionable groups (3 warning-level).
- Enforce Cohesion (LCOM4) in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Verified — provenance only; does not change the score.
D9 · Test Distribution
417 test methods: 0 unit, 0 integration, 0 BDD, 417 e2e.
What to do
- Resolve the 1 Inverted test pyramid finding(s) in Test Distribution. — One of this dimension's main actionable groups (1 recommendation-level).
D10 · Test Quality
1 skipped, 2 zero-assertion, 2 depending on a live external host, no mocking-framework packages referenced (hand-written doubles or no mocking) across 417 tests.
What to do
- Resolve the 2 No assertions finding(s) in Test Quality — start with DatabaseTests.cs, MultisigTests.cs. — One of this dimension's main actionable groups (2 warning-level).
- Resolve the 2 Depends on a live external host finding(s) in Test Quality — start with ThirdPartyTests.cs, REDACTED. — One of this dimension's main actionable groups (2 warning-level).
- Resolve the 1 Skipped test finding(s) in Test Quality — start with ThirdPartyTests.cs. — One of this dimension's main actionable groups (1 warning-level).
- Enforce Test Quality in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D12 · Dependency Hygiene
6 outdated, 0 vulnerable, 0 deprecated packages.
D13 · REDACTED Scanning
3 secret(s) detected.
What to do
- Resolve the 3 Leaked secret finding(s) in REDACTED Scanning — start with REDACTED, REDACTED, REDACTED. — One of this dimension's main actionable groups (3 issue-level).
- Enforce REDACTED Scanning in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D14 · License Compliance
0 of 257 packages use a banned license. ★ DEPTH: this repository's MSBuild projects declare 48 direct `PackageReference`(s), and 202 further package(s) were reached beyond them by closing the graph over nuget.org's own nuspec dependency graph — so a banned licence pulled in only by a dependency's OWN dependencies is inside this verdict. A package whose licence nuget.org could not be asked for is not graded, and version ranges are taken at their lower bound, so this is the closure as that graph states it rather than a restored consumer's exact resolution.
D15 · Churn × Complexity Hotspots
Top hotspots: BTCPayServer/Controllers/UIInvoiceController.UI.cs (15×44=660); REDACTED (7×67=469); BTCPayServer/Hosting/BTCPayServerServices.cs (13×19=247)
What to do
- Resolve the 28 Hotspot finding(s) in Churn × Complexity Hotspots — start with UIInvoiceController.UI.cs, REDACTED, BTCPayServerServices.cs. — One of this dimension's main actionable groups (28 warning-level).
D16 · Bus Factor
73 source file(s) have their living knowledge concentrated in one author (≥90% of recent, decayed contribution). The largest is BTCPayServer/Extensions.cs. Counted over 410 of the 1177 production source files in this repository: 763 are under the ~2,400-byte size floor this dimension measures over, and the remaining 4 have no attributable history left to measure.
What to do
- Resolve the 1 Off-boarding risk finding(s) in Bus Factor. — One of this dimension's main actionable groups (1 recommendation-level).
- Resolve the 1 Further sole-owners (lower concentration) finding(s) in Bus Factor. — One of this dimension's main actionable groups (1 recommendation-level).
D17 · Explicit Debt
243 deducted debt markers + 76 dead symbols across 106281 LoC in the .NET projects (1.8/KLoC) → score 6.3.
What to do
- Resolve the 75 EmptyCatchBlock finding(s) in Explicit Debt — start with Extensions.cs (4), UIWalletsController.PSBT.cs (4), ConsoleLogger.cs (2). — One of this dimension's main actionable groups (75 issue-level).
- Resolve the 45 WriteOnlyPrivateField finding(s) in Explicit Debt — start with MigrationStartupTask.cs (4), InvoiceWatcher.cs (3), LocalizerFactory.cs (3). — One of this dimension's main actionable groups (45 issue-level).
- Resolve the 7 NoWarnInCsproj finding(s) in Explicit Debt — start with BTCPayServer.Tests.csproj (3), Common.csproj, BTCPayServer.PluginPacker.csproj. — One of this dimension's main actionable groups (7 issue-level).
- Enforce Explicit Debt in CI to reach Verified (currently Documented). — Hardens enforcement from Documented toward Prevented — provenance only; does not change the score.
D18 · Solution Shape
8 projects, 1276 source files, 140474 hand-written lines of code (106281 production / 34193 test — the split is derived per file: test is what its project, its own path, or a compile-guarded region marks as test, and a file carrying no test signal counts as production), plus 6033 generated (machine-written code — designer, scaffolded and tool-emitted files — excluded from quality), 11 inter-project edges.
D19 · Documentation Quality
The repository's README files are clear and complete for the directory they document (self-hosted BTCPay Server), with a strong overview plus links to audience-specific docs. The architecture/Docs markdown set is well-organized and extensive, covering every documented project. XML-doc coverage is low (<3%), reflecting the documentation quality of the source rather than the repository's own structure. The repository's documentation is comprehensive and well-structured: the README files (each directory's own) are excellent at describing what they contain and how to use them, with a strong coding conventions document covering formatting, exception handling, PR-style descriptions, BEM selectors, Razor localization, and a Greenfield API maintenance guide that explains controller placement, authentication scopes, serialization, and OpenAPI. The maintainers/local-development.md guide is an authoritative build/run/run-with-HTTPS/altcoins setup plus testing commands, while the translations guide covers language packs, translation creation, and the host-integration discovery contract. A full architecture/design docs set (23 markdown files) would ideally explain how each of these tiers interacts, but they are not visible in this summary. The visible content is clear, complete, and well-organized. The Greenfield API documentation is clear and complete for its readers — the READMEs cover authentication, endpoint implementation, compatibility rules, examples, and invoice metadata with well-structured headings. The architecture/Docs markdown files (23) provide deeper coverage of the system's design, which would be ideal for an enterprise project but are not shown in this summary. Coverage figures are below 5% for BTCPayServer.Common, Data, Client, and Abstractions namespaces, so those gaps lie outside the visible documentation.
D20 · ADR Quality
No architecture decision records were found.
What to do
- Resolve the 1 No ADRs found finding(s) in ADR Quality. — One of this dimension's main actionable groups (1 recommendation-level).
D21 · Naming Consistency
0 naming inconsistencies across 200 sampled symbols.
D24 · Comment Value
157 valuable / 2 redundant across 200 sampled comments; 2 shown with locations.
D26 · Project Cohesion
1 of 10 projects flagged as possibly oversized/incoherent.
What to do
- Resolve the 1 Projects may be oversized for their cohesion finding(s) in Project Cohesion. — One of this dimension's main actionable groups (1 recommendation-level).
D27 · Navigability
79 % of calls cross a namespace and 3 % go through an interface, but 28 % of collaborators are co-located — so following a call takes several hops. Baseline: large — vertical-slice locality expected.
What to do
- Resolve the 1 Scattered collaborators finding(s) in Navigability. — One of this dimension's main actionable groups (1 recommendation-level).
- Resolve the 1 Pass-through layer finding(s) in Navigability — start with PluginServiceCollection.cs. — One of this dimension's main actionable groups (1 recommendation-level).
D28 · Secrets (history)
7 finding(s): 0 critical, 7 high, 0 medium, 0 low. Remediation for historically-committed secrets is credential rotation — they remain in history regardless of later deletion.
What to do
- Resolve the 5 REDACTED finding(s) in Secrets (history) — start with REDACTED (3), REDACTED, REDACTED. — One of this dimension's main actionable groups (5 issue-level).
- Resolve the 2 High secret finding(s) in Secrets (history) — start with REDACTED, REDACTED. — One of this dimension's main actionable groups (2 issue-level).
- Resolve the 1 Rotate the exposed credentials finding(s) in Secrets (history). — One of this dimension's main actionable groups (1 recommendation-level).
D29 · Static Analysis (SAST)
136 finding(s): 0 critical, 23 high, 113 medium, 0 low. 18 unpinned-GitHub-Actions row(s) are reported here but scored by D36 (supply-chain provenance), which measures that posture as `pinned_actions` — one pinning decision is charged once, not once per lens. semgrep hit a parse error in 218 file(s) — `.github/scripts/check-btcpay-plugin-compat.sh` (line 193, line 194), `BTCPayServer.Abstractions/Contracts/BasePluginDbContext.cs` (line 13), `BTCPayServer.Abstractions/Contracts/VersionCondition.cs` (lines 6–97, line 138, line 141), `BTCPayServer.Abstractions/Models/LayoutModel.cs` (line 15), `BTCPayServer.Abstractions/Security/PolicyRequirement.cs` (line 8), … (+213 more) — so no absence of findings in the named regions is evidence of anything; rows reported elsewhere in those files are real. Fix the syntax error (or exclude the file deliberately) and re-scan to cover them. In 211 of those file(s) — `BTCPayServer.Abstractions/Contracts/BasePluginDbContext.cs`, `BTCPayServer.Abstractions/Contracts/VersionCondition.cs`, `BTCPayServer.Abstractions/Models/LayoutModel.cs`, `BTCPayServer.Abstractions/Security/PolicyRequirement.cs`, `BTCPayServer.Abstractions/TagHelpers/PermissionTagHelper.cs`, … (+206 more) — the break is a C# primary constructor, which semgrep's grammar cannot parse and which hides the type from every rule scoped to it; those files were re-scanned from a shadow copy with the constructor's parameter list blanked (line and column preserving), which restores the type to the rules, and 16 additional row(s) came from that pass. Only the header's own parameter list is unread in them. In 8 of those file(s) — `BTCPayServer.Tests/LanguageServiceTests.cs`, `BTCPayServer.Tests/MultisigTests.cs`, `BTCPayServer.Tests/POSTests.cs`, `BTCPayServer.Tests/PluginManagerPlaywrightTests.cs`, `BTCPayServer.Tests/SubscriptionTests.cs`, … (+3 more) — the break is at a TYPE DECLARATION (a C# primary constructor semgrep's grammar cannot parse), so the loss is wider than the named lines: rules scoped to that type see no type to scope to and are blind over its whole body, while rules matching statements keep working there. Absence of a type-scoped finding in those types is not evidence of anything.
What to do
- Resolve the 2 REDACTED finding(s) in Static Analysis (SAST) — start with REDACTED (2). — One of this dimension's main actionable groups (2 issue-level).
- Resolve the 1 REDACTED finding(s) in Static Analysis (SAST) — start with REDACTED. — One of this dimension's main actionable groups (1 issue-level).
- No action in Static Analysis (SAST) — all 18 REDACTED finding(s) are reported here at file:line but scored by D36 (supply-chain provenance), so none is charged to this dimension. — One of this dimension's main actionable groups (18 issue-level, 0 of them charged here).
D30 · Dependency Vulnerabilities
No known-vulnerable dependencies in any ecosystem this repository declares.
D31 · IaC & Container Security
5 finding(s): 0 critical, 1 high, 4 medium, 0 low.
What to do
- Resolve the 1 High IaC finding(s) in IaC & Container Security — start with REDACTED. — One of this dimension's main actionable groups (1 issue-level).
- Resolve the 4 Medium IaC finding(s) in IaC & Container Security — start with REDACTED (4). — One of this dimension's main actionable groups (4 warning-level).
D32 · Data Compliance (PII/GDPR)
1 finding(s): 0 critical, 0 high, 1 medium, 0 low. semgrep could not parse 176 file(s) — `BTCPayServer.Abstractions/Contracts/BasePluginDbContext.cs`, `BTCPayServer.Abstractions/Contracts/VersionCondition.cs`, `BTCPayServer.Abstractions/Models/LayoutModel.cs`, `BTCPayServer.Abstractions/Security/PolicyRequirement.cs`, `BTCPayServer.Abstractions/TagHelpers/PermissionTagHelper.cs`, … (+171 more) — so the PII/GDPR sweep did not cover the unparsed regions of them; rows reported elsewhere in those files are real.
What to do
- Resolve the 1 REDACTED finding(s) in Data Compliance (PII/GDPR) — start with REDACTED. — One of this dimension's main actionable groups (1 warning-level).
D34 · Knowledge Freshness
13 of 414 significant source file(s) are orphaned — their living knowledge has decayed to nothing, so no one currently understands them. The largest is BTCPayServer/Services/Reporting/PaymentRequestsReportProvider.cs. Counted over 414 of the 1177 production source files in this repository: the rest are under the ~2,400-byte size floor this dimension measures over.
D35 · Change Coupling
Strongest change-coupling: BitcoinLikePaymentData.cs↔LightningLikePaymentData.cs 70%; LightningLikePaymentData.cs↔InvoiceEntity.cs 70%; BitcoinLikePaymentData.cs↔InvoiceEntity.cs 63%
What to do
- Resolve the 11 Change coupling finding(s) in Change Coupling — start with BitcoinLikePaymentData.cs (2), LightningLikePaymentData.cs, REDACTED. — One of this dimension's main actionable groups (11 warning-level).
- Resolve the 1 Change-coupling hub finding(s) in Change Coupling — start with UIInvoiceController.UI.cs. — One of this dimension's main actionable groups (1 warning-level).
D36 · Supply-chain Provenance & Signing
0/4 supply-chain integrity signals present (provenance, signing, SBOM, pinned actions).
What to do
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing. — One of this dimension's main actionable groups (1 warning-level).
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing. — One of this dimension's main actionable groups (1 warning-level).
- Resolve the 1 REDACTED finding(s) in Supply-chain Provenance & Signing. — One of this dimension's main actionable groups (1 recommendation-level).
D37 · Vulnerability-disclosure Policy
A vulnerability-disclosure policy (SECURITY.md) is published with a reporting contact.
D39 · IL Efficiency
35 of 8357 first-party methods have an oversized IL body.
D44 · Platform End-of-Life
0 end-of-life runtime(s) and 0 end-of-life framework(s), read from 3 platform declaration(s) and 0 dependency declaration(s). This dimension reads what the repository says about ITSELF — a pinned target framework, a version file, a capped requires-python, a Rust toolchain pin, a framework major a constraint cannot move off. A FLOOR is deliberately never charged: `requires-python = ">=3.8"` states what the package SUPPORTS, not what it runs on, and a well-maintained library declares exactly that while running its own CI on a current release. The end-of-life facts are FROZEN and dated, so this dimension needs no network and answers identically inside a closed scan fence; as the table ages it loses recall and never precision, because a statement about support that ended in the past cannot become false. The OS layer of a container image is D31's question and the toolchain a CI workflow installs is D29's; this row is neither.
Frontend & cross-cutting dimensions
AC1 · Text alternatives
- An svg presented as an image needs a name — add a <title> child or an aria-label/aria-labelledby. (×4) — BTCPayServer/Blazor/Icon.razor:0, BTCPayServer/Components/Icon/Default.cshtml:0, BTCPayServer/Components/MainLogo/Default.cshtml:0, …
What to do
- Add a text alternative — alt on images (alt="" for purely decorative ones), a title or aria-label on meaningful svg, an aria-label or inner fallback content on canvas, and a captions <track> on video.
AC2 · Forms & labels
- This control has no associated label. Add a <label for> / wrapping <label> / aria-label / aria-labelledby so assistive tech can name it. (×9) — BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:9, BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml:43, BTCPayServer/Plugins/Crowdfund/Views/UpdateCrowdfund.cshtml:182, …
- This <div> carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to <button type="button"> — the right fix for its keyboard operability — does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label. (×10) — BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:10, BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:19, BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:22, …
- This control has only a placeholder — a placeholder is not a label (it vanishes on input and many AT ignore it). Add a <label for>, a wrapping <label>, or aria-label. (×6) — BTCPayServer/Components/LabelManager/Default.cshtml:39, BTCPayServer/Components/SearchStringInput/Default.cshtml:4, BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml:35, …
- A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can't say where it goes. Add visible text or an aria-label. (×6) — BTCPayServer/Components/StoreSelector/Default.cshtml:25, BTCPayServer/Components/StoreSelector/Default.cshtml:29, REDACTED:42, …
- A button with no text and no aria-label has no accessible name. Add visible text or an aria-label (an icon-only button still needs one). (×6) — REDACTED:34, BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml:17, BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:28, …
- This <label> has no for and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association — it is the TARGET of one, so a control still has to point at it. Give the label for="<the control's id>", move the control inside the label, or point the control's aria-labelledby at this label's id. (×3) — BTCPayServer/Plugins/Multisig/VaultBridge/Elements/MultisigXPubSelect.razor:12, BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:264, BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:275
What to do
- Give every control a programmatic label (a <label for> / wrapping <label> / aria-label) and every button text — a placeholder is not a label.
AC3 · Page structure
- Skipping heading levels breaks the document outline assistive tech relies on. Don't jump levels — increase by at most one. (×27) — BTCPayServer/Plugins/Bitpay/Views/ListTokens.cshtml:44, BTCPayServer/Plugins/Bitpay/Views/ShowToken.cshtml:10, BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:90, …
- A <table> with data cells but no <th> gives assistive technology no way to associate cells with their headers. Mark the header row/column cells as <th> (with a scope). (×2) — BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:116, BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:185
- No <main> (or role="main") means no "skip to content" target and a weaker landmark map. Wrap the primary content in <main>. (×6) — BTCPayServer/Plugins/PointOfSale/Views/Public/_Layout.cshtml:37, BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckout.cshtml:16, BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckoutDefaultRedirect.cshtml:11, …
- An empty heading appears in the document outline announced with no text. Give the heading text, or remove it if it's decorative. (×2) — BTCPayServer/Views/Shared/_Footer.cshtml:56, BTCPayServer/Views/UIInvoice/Checkout.cshtml:54
- The page declares no language, so assistive tech can't pick the right pronunciation. Add lang (e.g. lang="en"). (×2) — BTCPayServer/Views/UIHome/SwaggerDocs.cshtml:8, BTCPayServer/Views/UIHome/SwaggerDraftDocs.cshtml:8
- A document must expose only one main landmark. Multiple visible <main> (or role="main") elements confuse the landmark map and the "skip to content" target. Keep one; remove or hide the rest. — BTCPayServer/Views/UIInvoice/Checkout.cshtml:19
What to do
- Declare <html lang>, a document <title> and a <main> landmark, keep headings in order, leave zoom enabled, title iframes and drop meta-refresh.
AC4 · Keyboard semantics
- A click handler on a plain element isn't keyboard-operable. Use a <button>, or add role + tabindex="0" + a key handler. (×13) — BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:10, BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:19, BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:22, …
- The repo's own CSS styles .dropdown-toggle with `cursor: pointer`, so this <span> is a control — but it has no role, no tabindex="0" and no key handler, so it can only be reached with a mouse. Use a <button>, or add role + tabindex="0" + a key handler. (×6) — BTCPayServer/Components/InvoiceStatus/Default.cshtml:19, BTCPayServer/Plugins/Subscriptions/Views/Components/SubscriberStatus/Default.cshtml:25, BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:110, …
- The repo's own CSS styles .btn with `cursor: pointer`, so this <span> is a control — but it has no role, no tabindex="0" and no key handler, so it can only be reached with a mouse. Use a <button>, or add role + tabindex="0" + a key handler. — BTCPayServer/Plugins/Crowdfund/Views/Public/ContributeForm.cshtml:14
- This <div role="dialog"> is a modal dialog, but nothing moves focus into it when it opens and nothing keeps focus inside it while it is open, so a keyboard or screen-reader user keeps acting on the content behind it (WCAG 2.4.3). Use a native <dialog> opened with showModal(), a dialog component that traps focus, or move focus to the dialog on open, trap Tab inside it (or make the page behind inert) and return focus to the control that opened it on close. — BTCPayServer/Plugins/Maintenance/Components/MaintenanceCommands.razor:61
- An <a> with no href, role or tabindex isn't focusable or keyboard-activatable. Give it a real href, or use a <button> for an action. (×3) — BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml:95, BTCPayServer/Plugins/Subscriptions/Views/UIOffering/CreateOffering.cshtml:15, BTCPayServer/Views/UIFido2/Create.cshtml:49
- The repo's own CSS styles .form-control with `cursor: pointer`, so this <span> is a control — but it has no role, no tabindex="0" and no key handler, so it can only be reached with a mouse. Use a <button>, or add role + tabindex="0" + a key handler. — BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:427
- The repo's own CSS styles .cursor-pointer with `cursor: pointer`, so this <span> is a control — but it has no role, no tabindex="0" and no key handler, so it can only be reached with a mouse. Use a <button>, or add role + tabindex="0" + a key handler. (×3) — REDACTED:30, REDACTED:86, REDACTED:136
What to do
- Make custom controls keyboard-operable (role + tabindex + key handler), drop positive tabindex, and give anchors a real href.
AC5 · ARIA correctness
- A plain <span> has the implicit role "generic", which supports no ARIA states, so this aria-expanded is dropped and assistive tech is never told the state at all. Put aria-expanded on the element that owns the behaviour (the button or control the user operates), or give this <span> a role that supports aria-expanded. (×6) — BTCPayServer/Components/InvoiceStatus/Default.cshtml:19, BTCPayServer/Plugins/Subscriptions/Views/Components/SubscriberStatus/Default.cshtml:25, BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:110, …
What to do
- Use valid, non-abstract roles, supply the ARIA state each role requires, and never put aria-hidden on a focusable element.
AC6 · Visual & motion safety
- `.success-icon` moves (`animation: pulse 2s infinite`) and nothing reads prefers-reduced-motion for it — no @media (prefers-reduced-motion) rule for this element, no reset this project loads — so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce. — BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckoutDefaultRedirect.cshtml:49
- `#RecentTransactionsToggle` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. — BTCPayServer/wwwroot/pos/cart.css:53
- `#globalNav .globalSearch-input:focus` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. — BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.css:68
- `#mainMenuHead .mainMenuButton` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/layout.css:46, BTCPayServer/wwwroot/main/rtl/layout.rtl.css:46
- `#globalNav .globalNav-btn` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/layout.css:163, BTCPayServer/wwwroot/main/rtl/layout.rtl.css:163
- `#mainNav` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/layout.css:717, BTCPayServer/wwwroot/main/rtl/layout.rtl.css:759
- `.ts-wrapper.form-control .ts-control` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/site.css:911, BTCPayServer/wwwroot/main/rtl/site.rtl.css:911
- `.form-control-plaintext:focus` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2144, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2142
- `.form-range:focus` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2447, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2445
- `.btn-check:focus-visible + .btn` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2995, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2993
- `.modal` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:5543, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:5541
- `.modal-content` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:5596, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:5594
- `.carousel-control-prev:focus` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6190, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6172
- `.offcanvas-sm` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6366, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6348
- `.offcanvas-md` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6438, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6420
- `.offcanvas-lg` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6510, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6492
- `.offcanvas-xl` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6582, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6564
- `.offcanvas-xxl` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6654, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6636
- `.offcanvas` sets the outline to none/0 and no visible :focus / :focus-visible style for that element replaces it in this stylesheet, so a keyboard user cannot see where focus is. Draw a focus ring (outline, box-shadow or border) under :focus-visible. (×2) — BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6725, BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:6707
- `#RecentTransactionsRefresh[disabled] .icon` moves (`animation: 1.25s linear infinite spinner-border`) and nothing reads prefers-reduced-motion for it — no @media (prefers-reduced-motion) rule for this element, no reset this project loads — so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce. — BTCPayServer/wwwroot/pos/common.css:28
- `#globalNav .globalSearch-shell.is-loading .globalSearch-bar::after` moves (`animation: global-search-spin .8s linear infinite`) and nothing reads prefers-reduced-motion for it — no @media (prefers-reduced-motion) rule for this element, no reset this project loads — so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce. — BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.css:116
- `[aria-expanded] > .icon-caret-down` moves (`transition: transform 0.2s ease-in-out`) and nothing reads prefers-reduced-motion for it — no @media (prefers-reduced-motion) rule for this element, no reset this project loads — so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce. (×2) — BTCPayServer/wwwroot/main/site.css:130, BTCPayServer/wwwroot/main/rtl/site.rtl.css:130
- `#wizard-navbar a::after` moves (`transition: background-color .2s, transform .2s`) and nothing reads prefers-reduced-motion for it — no @media (prefers-reduced-motion) rule for this element, no reset this project loads — so a motion-sensitive user cannot turn it off (WCAG 2.3.3). Declare it under @media (prefers-reduced-motion: no-preference), or neutralise it under reduce. — BTCPayServer/wwwroot/main/wizard.css:37
What to do
- Keep a visible focus style (don't remove the outline without a replacement), guard animation with prefers-reduced-motion, and raise low-contrast colour pairs to at least 4.5:1.
AC7 · A11y enforcement
- No accessibility enforcement found — no automated accessibility check runs over the HTML your app renders. Assert the accessibility invariants over that HTML in the test suite you already have (parse the output and assert, or drive a browser), and gate that test in CI so a regression blocks the merge. What was searched, so you can tell an absence from a miss: the 298 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository's test and CI files — matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here.
What to do
- Enforce accessibility in the test suite you already have: assert the accessibility invariants over the HTML your app renders — parse the rendered output in an existing test, or drive a real browser from one — and gate that test in CI so a regression blocks the merge.
AX1 · Captive dependencies
- `PaymentRequestService` is registered as a SINGLETON but its constructor takes `DisplayFormatter displayFormatter`, which is registered as Transient. The singleton captures one instance of the transient dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `DisplayFormatter` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/PaymentRequest/PaymentRequestService.cs:29
- `PullPaymentHostedService` is registered as a SINGLETON but its constructor takes `DisplayFormatter displayFormatter`, which is registered as Transient. The singleton captures one instance of the transient dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `DisplayFormatter` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/HostedServices/PullPaymentHostedService.cs:320
- `CrowdfundAppType` is registered as a SINGLETON but its constructor takes `DisplayFormatter displayFormatter`, which is registered as Transient. The singleton captures one instance of the transient dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `DisplayFormatter` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/Plugins/Crowdfund/CrowdfundPlugin.cs:63
- `CrowdfundAppType` is registered as a SINGLETON but its constructor takes `IHttpContextAccessor httpContextAccessor`, which is registered as Scoped. The singleton captures one instance of the scoped dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `IHttpContextAccessor` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/Plugins/Crowdfund/CrowdfundPlugin.cs:64
- `EmailsTranslationProvider` is registered as a SINGLETON but its constructor takes `EmailTriggerViewModels viewModels`, which is registered as Transient. The singleton captures one instance of the transient dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `EmailTriggerViewModels` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/Plugins/Emails/EmailsTranslationProvider.cs:11
- `PointOfSaleAppType` is registered as a SINGLETON but its constructor takes `DisplayFormatter displayFormatter`, which is registered as Transient. The singleton captures one instance of the transient dependency forever — defeating its lifetime (a per-request DbContext shared across all requests is a classic data-corruption/threading bug). Make the singleton resolve `DisplayFormatter` per-use (inject `IServiceScopeFactory` or a factory func), or align the lifetimes. — BTCPayServer/Plugins/PointOfSale/PointOfSalePlugin.cs:57
What to do
- Don't inject scoped/transient services into singletons; resolve them per-use via IServiceScopeFactory or a factory delegate, or align the lifetimes.
AX10 · Code composition
What to do
- The domain core is a small share of production code, but most of the rest matched no layer vocabulary at all — so this is not yet an anemic-domain finding. The namespace/path convention could not place that code, which makes the composition above a statement about the naming, not about the design. Name the layers (or check that the repository's conventions differ from the ones this check knows) before reading a thin domain into it.
AX2 · Stateful singletons
- `SelectedChains` is a singleton (one shared instance) but mutates instance state outside any lock (chains; e.g. `chains` at line 49). — BTCPayServer.Common/SelectedChains.cs:8
- `Logs` is a singleton (one shared instance) but mutates instance state outside any lock (Configuration, PayServer, Events; e.g. `Configuration` at line 19). — BTCPayServer.Common/Logging/Logs.cs:7
- `SettingsAccessor` is a singleton (one shared instance) but mutates instance state outside any lock (_settings; e.g. `_settings` at line 30). — BTCPayServer/Services/ISettingsAccessor.cs:17
- `TorServices` is a singleton (one shared instance) but mutates instance state outside any lock (firstRun, Services; e.g. `firstRun` at line 34). — BTCPayServer/Services/TorServices.cs:15
- `BTCPayServerOptions` is a singleton (one shared instance) but mutates instance state outside any lock (NetworkType, DockerDeployment, TorrcFile, TorServices, SocksEndpoint, UpdateUrl; e.g. `NetworkType` at line 59). — BTCPayServer/Configuration/BTCPayServerOptions.cs:13
- `NBXplorerListener` is a singleton (one shared instance) but mutates instance state outside any lock (_PollInterval; e.g. `_PollInterval` at line 75). — BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:28
- `LightningListener` is a singleton (one shared instance) but mutates instance state outside any lock (needCheckOfflinePayments, _PollInterval; e.g. `needCheckOfflinePayments` at line 90). — BTCPayServer/Payments/Lightning/LightningListener.cs:31
- `RatesHostedService` is a singleton (one shared instance) but mutates instance state outside any lock (_lastCacheDate; e.g. `_lastCacheDate` at line 99). — BTCPayServer/HostedServices/RatesHostedService.cs:18
- `CurrencyNameTable` is a singleton (one shared instance) but mutates instance state outside any lock (_Currencies; e.g. `_Currencies` at line 92). — BTCPayServer.Rating/CurrencyNameTable.cs:64
- `DelayedTransactionBroadcaster` is a singleton (one shared instance) but mutates instance state outside any lock (disabled; e.g. `disabled` at line 136). — BTCPayServer/Services/DelayedTransactionBroadcaster.cs:15
- `ResultItemViewModel` is a singleton (one shared instance) but mutates instance state outside any lock (Aliases; e.g. `Aliases` at line 53). — BTCPayServer/Plugins/GlobalSearch/Views/GlobalSearchViewModel.cs:26
- `ActionResultItemViewModel` is a singleton (one shared instance) but mutates instance state outside any lock (Aliases; e.g. `Aliases` at line 30). — BTCPayServer/Plugins/GlobalSearch/StaticSearchResultProvider.cs:14
- `CheckHostCommandsHostedService` is a singleton (one shared instance) but mutates instance state outside any lock (_signalRegistration; e.g. `_signalRegistration` at line 31). — BTCPayServer/Plugins/Maintenance/CheckHostCommandsHostedService.cs:14
- `LocalizerService` is a singleton (one shared instance) but mutates instance state outside any lock (_LoadedTranslations; e.g. `_LoadedTranslations` at line 44). — BTCPayServer/Plugins/Translations/LocalizerService.cs:23
What to do
- Keep singletons stateless or back their state with thread-safe types (Concurrent*/Immutable*); otherwise concurrent callers race.
AX3 · Project dependency cycles
- The namespaces BTCPayServer.Abstractions.Contracts ↔ BTCPayServer.Abstractions.Models depend on each other. The lightest dependency in the cycle is BTCPayServer.Abstractions.Contracts → BTCPayServer.Abstractions.Models (BTCPayServer.Abstractions.Contracts.BaseDbContextFactory → BTCPayServer.Abstractions.Models.DatabaseOptions, 2 type pair(s)); cut that one first, e.g. by moving the shared type to a namespace both can use or inverting it behind an interface. — BTCPayServer.Abstractions/Contracts/BaseDbContextFactory.cs:3
- The namespaces BTCPayServer.Client ↔ BTCPayServer.Client.Models depend on each other. The lightest dependency in the cycle is BTCPayServer.Client.Models → BTCPayServer.Client (BTCPayServer.Client.Models.ApiKeyData → BTCPayServer.Client.Permission, 2 type pair(s)); cut that one first, e.g. by moving the shared type to a namespace both can use or inverting it behind an interface. — BTCPayServer.Client/Models/ApiKeyData.cs:7
- The namespaces (global) ↔ BTCPayServer ↔ BTCPayServer.Common ↔ BTCPayServer.Components.AppSales ↔ BTCPayServer.Components.LabelSelector ↔ BTCPayServer.Configuration ↔ BTCPayServer.Controllers ↔ BTCPayServer.Controllers.GreenField ↔ BTCPayServer.Data ↔ BTCPayServer.Data.Subscriptions ↔ BTCPayServer.Events ↔ BTCPayServer.Fido2 ↔ BTCPayServer.Fido2.Models ↔ BTCPayServer.Forms ↔ BTCPayServer.Forms.Models ↔ BTCPayServer.HostedServices ↔ BTCPayServer.Logging ↔ BTCPayServer.Models ↔ BTCPayServer.Models.AccountViewModels ↔ BTCPayServer.Models.AppViewModels ↔ BTCPayServer.Models.InvoicingModels ↔ BTCPayServer.Models.ManageViewModels ↔ BTCPayServer.Models.NotificationViewModels ↔ BTCPayServer.Models.PaymentRequestViewModels ↔ BTCPayServer.Models.ServerViewModels ↔ BTCPayServer.Models.StoreReportsViewModels ↔ BTCPayServer.Models.StoreViewModels ↔ BTCPayServer.PaymentRequest ↔ BTCPayServer.Payments ↔ BTCPayServer.Payments.Bitcoin ↔ BTCPayServer.Payments.Lightning ↔ BTCPayServer.Payments.PayJoin ↔ BTCPayServer.PayoutProcessors ↔ BTCPayServer.Payouts ↔ BTCPayServer.Plugins ↔ BTCPayServer.Plugins.Crowdfund ↔ BTCPayServer.Plugins.Crowdfund.Controllers ↔ BTCPayServer.Plugins.Crowdfund.Models ↔ BTCPayServer.Plugins.Emails ↔ BTCPayServer.Plugins.Emails.HostedServices ↔ BTCPayServer.Plugins.Emails.Services ↔ BTCPayServer.Plugins.Emails.Views ↔ BTCPayServer.Plugins.GlobalSearch ↔ BTCPayServer.Plugins.Impersonation ↔ BTCPayServer.Plugins.Maintenance ↔ BTCPayServer.Plugins.Monetization ↔ BTCPayServer.Plugins.PointOfSale ↔ BTCPayServer.Plugins.Subscriptions ↔ BTCPayServer.Plugins.Translations ↔ BTCPayServer.Plugins.Wallets ↔ BTCPayServer.Plugins.Wallets.Views.ViewModels ↔ BTCPayServer.Plugins.Webhooks ↔ BTCPayServer.Plugins.Webhooks.Views ↔ BTCPayServer.Rating ↔ BTCPayServer.Security ↔ BTCPayServer.Security.Greenfield ↔ BTCPayServer.Services ↔ BTCPayServer.Services.Apps ↔ BTCPayServer.Services.Invoices ↔ BTCPayServer.Services.Labels ↔ BTCPayServer.Services.Notifications ↔ BTCPayServer.Services.PaymentRequests ↔ BTCPayServer.Services.Rates ↔ BTCPayServer.Services.Reporting ↔ BTCPayServer.Services.Stores ↔ BTCPayServer.Services.WalletFileParsing ↔ BTCPayServer.Services.Wallets ↔ BTCPayServer.Storage.Services ↔ BTCPayServer.Storage.Services.Providers ↔ BTCPayServer.Views.UIStoreMembership depend on each other. The lightest dependency in the cycle is (global) → BTCPayServer.Events (BitcoinLikePayoutHandler → BTCPayServer.Events.NewOnChainTransactionEvent, 1 type pair(s)); cut that one first, e.g. by moving the shared type to a namespace both can use or inverting it behind an interface. — BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:11
- The namespaces BTCPayServer.Data.Payouts.LightningLike ↔ BTCPayServer.PayoutProcessors.Lightning depend on each other. The lightest dependency in the cycle is BTCPayServer.Data.Payouts.LightningLike → BTCPayServer.PayoutProcessors.Lightning (BTCPayServer.Data.Payouts.LightningLike.UILightningLikePayoutController → BTCPayServer.PayoutProcessors.Lightning.LightningAutomatedPayoutSenderFactory, 1 type pair(s)); cut that one first, e.g. by moving the shared type to a namespace both can use or inverting it behind an interface. — BTCPayServer/Data/Payouts/LightningLike/UILightningLikePayoutController.cs:12
What to do
- Break namespace cycles inside a project by moving the shared type to a namespace both sides can use, or by inverting the back edge behind an interface.
AX5 · Architecture & structure
AX6 · Interface segregation
AX8 · Test isolation
C1 · Data Protection
- No in-app HTTPS enforcement, but ForwardedHeaders / 127.0.0.1 binding indicates a reverse-proxy topology — adding UseHttpsRedirection in the app would be wrong in this layout. Verify the reverse proxy enforces TLS. — BTCPayServer/Hosting/Startup.cs:332
What to do
- Strengthen data-at-rest protection: vault your keys (Azure Key Vault / AWS KMS / IDataProtector key ring) and encrypt the most sensitive columns (EF HasConversion encryption or provider-native column encryption) — partial coverage still leaves gaps.
C2 · Access Controls
C3 · Audit Trail
- An audit mechanism is present, but the trail is not yet complete — missing: an immutable audit-log / audit-trail type to write to, [Audited] per-entity coverage.
What to do
- Back the audit convention with a structural mechanism: an EF SaveChanges interceptor (or equivalent) writing every sensitive change to an immutable audit log, and apply [Audited] to the entities that need a who-changed-what trail.
C4 · Data Retention
- A retention mechanism is present, but the data-lifecycle is not yet complete — missing: a documented retention period / data-expiry.
What to do
- Complete the data-lifecycle story: an expiry limit (a declared maximum age for the stored data — a retention-age setting, or a store-level TTL where your storage offers one), a scheduled purge/cleanup job that enforces it, and a documented retention period covering the personal data.
ED1 · Handler temporal coupling
ED4 · Outbox / dual-write
- `BitcoinLikePayoutHandler.UpdatePayoutsInProgress` writes to the database AND publishes to the message bus in the same flow, with no outbox referenced in this path. These two writes aren't atomic — a crash between them either loses the message (DB committed, publish failed) or emits a phantom event (publish succeeded, DB rolled back). Use the transactional outbox pattern — write the message to an outbox table in the SAME transaction as the state change, and dispatch it from there afterwards — or your platform's equivalent (a broker transaction, or an outbox library from your own ecosystem). — BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:330
- `BitcoinLikePayoutHandler.UpdatePayoutsFromTransaction` writes to the database AND publishes to the message bus in the same flow, with no outbox referenced in this path. These two writes aren't atomic — a crash between them either loses the message (DB committed, publish failed) or emits a phantom event (publish succeeded, DB rolled back). Use the transactional outbox pattern — write the message to an outbox table in the SAME transaction as the state change, and dispatch it from there afterwards — or your platform's equivalent (a broker transaction, or an outbox library from your own ecosystem). — BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:377
What to do
- Adopt the transactional outbox pattern so DB writes and message publishes commit atomically — no lost or phantom events on a crash.
ED5 · Idempotency
GD1 · Unfinished & placeholder code
- A shipped member still throws NotImplementedException — generated scaffolding that was never completed. Implement it or remove the dead surface. (×2) — BTCPayServer/PayoutProcessors/BaseAutomatedPayoutProcessor.cs:96, BTCPayServer/Plugins/Subscriptions/SubscriptionsPlugin.cs:279
- A placeholder string ("{ "... on every payment": "", "... o…") is still in shipped code — typical of generated boilerplate that was never filled in. — BTCPayServer/Plugins/Translations/Translations.Default.cs:12
What to do
- Finish or delete NotImplementedException stubs and replace placeholder literals before shipping.
IC1 · Incompleteness & stubs
- `GetInvoice` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:128
- `GetPaymentRequest` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs:61
- `EditPullPayment` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — REDACTED:116
- `GenerateAsync` looks like it should compute a result but its body just returns a constant — a placeholder return that was never filled in. — BTCPayServer/Fido2/Fido2TokenProvider.cs:10
- `ValidateAsync` looks like it should compute a result but its body just returns a constant — a placeholder return that was never filled in. — BTCPayServer/Fido2/Fido2TokenProvider.cs:13
- The first 2 statements of the `if` and of the `else` are identical, so they run on both paths regardless of the condition. Lift them above the `if` — leaving them duplicated inside makes the branches read as though they handled this differently. (×2) — BTCPayServer/HostedServices/PullPaymentHostedService.cs:765, BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs:104
- `Match` looks like it should compute a result but its body just returns a constant — a placeholder return that was never filled in. — BTCPayServer/Payments/IPaymentFilter.cs:39
- Both arms of `ChainName == ChainName.Mainnet ? … : …` are `"https://dogechain.info/tx/{0}"`, so no input can make the condition matter. Implement the distinction that was intended, or drop the condition. — BTCPayServer/Plugins/Altcoins/AltcoinsPlugin.Dogecoin.cs:29
- `Execute` takes parameters but its body is empty — it accepts inputs and does nothing. Either implement it or remove it. (×2) — BTCPayServer/Plugins/PluginManager/PluginService.cs:260, BTCPayServer/Plugins/PluginManager/PluginService.cs:264
- `SetDefaultSettings` is a shipped member whose whole body throws NotImplementedException — scaffolding that was never completed. Implement it or remove the dead surface. — BTCPayServer/Plugins/Subscriptions/SubscriptionsPlugin.cs:279
- `GenerateWalletConfirm` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:429
- `ReplaceWallet` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:667
- `ConfirmReplaceWallet` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:686
- `DeleteWallet` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:704
- `CancelPendingTransaction` is declared `async` but never awaits anything, so it runs synchronously while pretending to be asynchronous. Drop `async` or do the real async work. — BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:101
- A line of code has been commented out rather than removed — dead weight that rots and confuses. Delete it (version control remembers). (×14) — BTCPayServer.Common/Logging/ConsoleLogger.cs:189, BTCPayServer.Data/ApplicationDbContext.cs:83, BTCPayServer.Data/ApplicationDbContext.cs:88, …
- A test is skipped ("Fail on CI") — coverage that looks present but never runs in any gate. If it's an opt-in suite, document how it runs; otherwise re-enable or delete it. — BTCPayServer.Tests/ThirdPartyTests.cs:75
- A placeholder e-mail address ("store@example.com") is still in shipped code — its domain is reserved for documentation, so anything sent here is undeliverable by construction. Replace it with the real address, or take it from configuration. (×2) — BTCPayServer/Plugins/Emails/Controllers/UIEmailControllerBase.cs:94, BTCPayServer/Plugins/Emails/Controllers/UIEmailControllerBase.cs:95
- A placeholder value ("The name of the user (eg. John Doe)") is still in shipped code — sample/mock data that was never replaced with the real thing. (×2) — BTCPayServer/Plugins/Emails/EmailsPlugin.cs:222, BTCPayServer/Plugins/Emails/StoreMailTriggers.cs:25
- A placeholder value ("The formatted mailbox address to use whe…") is still in shipped code — sample/mock data that was never replaced with the real thing. (×4) — BTCPayServer/Plugins/Emails/EmailsPlugin.cs:224, BTCPayServer/Plugins/Emails/StoreMailTriggers.cs:27, BTCPayServer/Plugins/Multisig/MultisigEmailTriggers.cs:35, …
What to do
- Finish or delete the unfinished stubs (NotImplementedException / empty / constant-returning bodies) — they are dead surface that looks live.
- Clear the softer debt: remove commented-out code and dead branches, re-enable or delete skipped tests, and replace blanket warning suppressions with targeted ones.
M1 · Documentation (README)
What to do
- Add a build/run (quick start) section to the root README — the first thing a newcomer needs.
- Explain in the README how to run the tests. Add a section called Testing to the README in the repository's top folder, saying how to run the test suite.
- Add an 'Architecture' / 'How it works' section to the root README — the high-level shape.
- Add a README to the 7 of 9 project(s) that lack one — worth up to 1.6 pts.
M2 · Architecture documentation
- No Architecture Decision Records found — no conventional ADR directory, no numbered `NNNN-title` documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer.
What to do
- Record your significant design decisions. Write one short document per decision, giving its date, the situation, the decision and its consequences, and keep them together with your other design documents. A docs/adr folder with each file named by number and title is the easiest place to find them.
M3 · Folder & project structure
- Production code isn't grouped under a src/ folder — it's spread across several top-level directories, so there's no one place that says 'this is the product'.
What to do
- Group production code under src/ (or split deliberately, e.g. backend/ + frontend/) so production and tooling code aren't mixed at the root.
M4 · Documentation accuracy
- docs/operators/README.md documents the environment variable `BTCPAY_SSRFEXCEPTIONS`, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents' own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong. — docs/operators/README.md:87
- docs/operators/host-integration.md documents the environment variable `BTCPAY_BTCPAYHOSTEXECUTABLE`, but no code, script or configuration file names it. Checked without a model against the repository: its files and folders, the scripts and dependencies of every package.json, the projects, namespaces, package references and target frameworks of the .NET build, the SDK and Node pins, and the identifiers of every file that is not a document; the documents' own text never counts. A footprint generated at build time, read only by a platform, or living outside this repository is not seen, and this row is then wrong. — docs/operators/host-integration.md:11
What to do
- Reconcile the README with reality: docs/operators/README.md documents the environment variable `BTCPAY_SSRFEXCEPTIONS`, but no code, script or configuration file names it; docs/operators/host-integration.md documents the environment variable `BTCPAY_BTCPAYHOSTEXECUTABLE`, but no code, script or configuration file names it.
P1 · CI/CD gates
P10 · Library API & versioning
P2 · Observability
- `/root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs` reports through `Console.Write…` at line 106 although other files in its project log through a logger. Console lines carry no level, category or structured properties and never reach the log pipeline or its exporters. — root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs:106
- `/root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs` reports through `Console.Write…` at line 132 although other files in its project log through a logger. Console lines carry no level, category or structured properties and never reach the log pipeline or its exporters. — root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs:132
What to do
- Replace `Console.Write…` in service code with the project's injected `ILogger<T>` (message templates with named properties), so delivery outcomes and failures reach the log pipeline with a level and a category.
- Consider OpenTelemetry tracing/metrics and a health-check endpoint for operability.
P3 · Security & performance tooling
- `REDACTED` run(s) a static-analysis scan, but no workflow that runs one is triggered by a pull request (or a merge queue, or an unfiltered push) — the scan fires on a schedule or a manual dispatch only. A vulnerable change therefore merges clean and is reported on the next scheduled run, by which time it is on the default branch and the only remedy is a follow-up fix. Add the pull-request trigger to the workflow that runs the scan so the finding arrives before the merge rather than after it.
What to do
- Trigger your SAST workflow on pull requests — a scan that only runs on a cron reports history, it does not gate.
- Enable Dependabot/Renovate or a dependency-review gate.
- Add gitleaks/trufflehog in CI to block PRs that introduce committed secrets.
P4 · Deployment & Rollback
- Deployment automation exists but no readiness/liveness probes, rolling-update strategy, lifecycle hooks or migration job were evidenced — a bad release is harder to detect and reverse.
What to do
- Add readiness/liveness probes and a rolling-update (or blue/green) strategy so a bad release is caught and rolled back automatically.
- Add an approval/environment gate (required reviewers / protection rules) before production promotion.
P6 · Release Hygiene
P7 · Outbound HTTP resilience
- `new HttpClient()` builds an outbound HTTP client and nothing bounds it: no timeout is set on it and no retry or resilience policy wraps its calls in the type that owns it. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). (×19) — BTCPayServer.Client/BTCPayServerClient.cs:31, BTCPayServer.Client/BTCPayServerClient.cs:38, BTCPayServer.Client/BTCPayServerClient.cs:47, …
- `services.AddHttpClient()` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:104
- `services.AddHttpClient(LightningClientFactoryService.NamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:135
- `services.AddHttpClient(LightningClientFactoryService.SafeNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:137
- `services.AddHttpClient(LightningClientFactoryService.OnionNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:141
- `services.AddHttpClient(LightningLikePayoutHandler.LightningLikePayoutHandlerO...` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:400
- `services.AddHttpClient(LightningLikePayoutHandler.LightningLikePayoutHandlerC...` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:402
- `services.AddHttpClient(nameof(KrakenExchangeRateProvider))` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Hosting/BTCPayServerServices.cs:768
- `services.AddHttpClient(PayjoinServerCommunicator.PayjoinOnionNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Payments/PayJoin/PayJoinExtensions.cs:20
- `services.AddHttpClient(PayjoinServerCommunicator.PayjoinClearnetNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Payments/PayJoin/PayJoinExtensions.cs:22
- `services.AddHttpClient(BitpayIPNSender.NamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Plugins/Bitpay/BitpayPlugin.cs:47
- `services.AddHttpClient<PluginBuilderClient>((provider, httpClient) => Configu...` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Plugins/PluginManager/PluginManagerPlugin.cs:23
- `services.AddHttpClient(WebhookSender.OnionNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Plugins/Webhooks/WebhooksPlugin.cs:40
- `services.AddHttpClient(WebhookSender.ClearnetNamedClient)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Plugins/Webhooks/WebhooksPlugin.cs:47
- `services.AddHttpClient(clientName)` registers an outbound HTTP client with no resilience handler, retry policy or timeout of its own in its builder chain. A slow or failing dependency will hold this service's request, thread or connection — and cascade — until the call gives up on its own (100 s for HttpClient's default). — BTCPayServer/Plugins/Webhooks/WebhooksPlugin.cs:53
What to do
- Add `AddStandardResilienceHandler()` (or a Polly policy and an explicit timeout) to each client registration flagged here, so a flaky dependency can't take the app down.
P8 · Schema migrations
- This repository evolves its schema with versioned migrations, but `EnsureCreated()` here builds a schema straight from the model instead — with no migrations-history row, so a database it creates can't be upgraded by `Migrate()` afterwards and the two paths can disagree about the shape. Apply the migrations here (`Migrate()` / a migrations bundle) rather than creating the schema. (×2) — BTCPayServer/HostedServices/TransactionLabelMarkerHostedService.cs:167, BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs:107
What to do
- Replace each EnsureCreated() in production code with the migrations the rest of the repository already uses (`Database.Migrate()` or a migrations bundle), so every database gets its schema from the one versioned path.
PF1 · Benchmark discipline
- No benchmark suite was found by the two searches this check runs. FIRST, a BenchmarkDotNet package reference in any project file — every project the workspace loaded, plus a walk of project files on disk that never loaded, because a benchmark suite is exactly the project a partial load drops. SECOND, a script harness: a file whose name contains `benchmark` and ends `.py`, `.sh`, `.ps1`, `.bash`, `.rb`, `.js` or `.mjs`, credited ONLY when this repository's CI text also mentions benchmarks — a harness no pipeline runs is read as a fixture, deliberately. Neither search can see a benchmark suite in another ecosystem's idiom (a Go `testing.B` file, a JMH or criterion project, a pytest-benchmark run), so this is 'no benchmark found by those two searches', not a verdict that the repository has none. Where code is performance-sensitive, a benchmark guards against silent regressions — but it's a bonus here, not a deduction.
What to do
- Add a benchmarking harness for the hot paths and run it in CI to catch regressions (for .NET, a BenchmarkDotNet project with [MemoryDiagnoser] to track allocations).
PF2 · Allocation hygiene
What to do
- Raise allocation-aware density on the hot paths — currently 13 use(s) across 110,123 production line(s) (~0.1/1k). More Span/Memory, pooling (ArrayPool/ObjectPool), stackalloc and ValueTask on the allocation-heavy paths climbs this toward 10.
PF3 · Async & latency hygiene
- 2 blocking call(s) on async work (.Wait()/.GetAwaiter().GetResult()) — these waste a thread and can deadlock wherever a synchronization context is in play (a UI thread, or a caller that has one).
- `.GetAwaiter().GetResult()` blocks this thread until the async work completes — it wastes a thread-pool thread for as long as the work runs and can deadlock wherever a synchronization context is in play (a UI thread, or a caller that has one). (×2) — BTCPayServer/Plugins/Bitpay/Controllers/BitpayRateController.cs:155, BTCPayServer.Rating/CurrencyPair.cs:16
What to do
- Make the call chain async end-to-end and await it — never block on a Task with .Wait()/.GetAwaiter().GetResult().
S1 · Web-Security Posture
- `ServerCertificateValidationCallback` is assigned a callback that returns `true` unconditionally, so every TLS peer certificate is accepted — including one an attacker presents. Chain, expiry, revocation and hostname are all skipped, so an attacker on the network path can present any certificate and read or rewrite the traffic — the connection is encrypted to the attacker, not to the intended host. Delete the override and let the platform validate. If a specific self-signed or internally-issued certificate genuinely has to be trusted, pin THAT one — compare the presented certificate's public key or thumbprint against the expected value and return `false` for everything else — and scope it to the single handler that talks to that host rather than to the whole process. If the override exists only to get past a development certificate, gate it on a build configuration or an explicit opt-in setting so it cannot ship. — BTCPayServer/Plugins/Emails/Services/EmailSettings.cs:110
- Set: Content-Security-Policy, Referrer-Policy, X-Content-Type-Options, X-Frame-Options. Missing: Strict-Transport-Security — the four headers that carry the points of this card's security-headers term (Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options), 0.5 each. (−0.5 on this card.) — BTCPayServer/Filters/ContentSecurityPolicyAttribute.cs:114
What to do
- Stop accepting every TLS certificate: remove the always-true validation callback so the platform verifies the chain, hostname and expiry. If one self-signed certificate must be trusted, pin it by public key or thumbprint on the single handler that needs it and reject all others — never process-wide.
- Add Strict-Transport-Security beside the headers already set; Content-Security-Policy is the one that pays for itself first, then Strict-Transport-Security, then nosniff and a frame policy.
X1 · Async correctness
- Reading `.Result` of a task that has not completed blocks this thread until it does — the same block as `.Wait()`: under a synchronization context (Blazor, a UI thread, classic ASP.NET) it deadlocks, and on the thread pool it parks a thread for as long as the work runs. `await` the task instead (make the caller `async`); where a synchronous entry point must stay, keep the block in ONE documented bridge with a timeout. (×8) — BTCPayServer/Components/StoreLightningServices/StoreLightningServices.cs:65, BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs:165, BTCPayServer/Controllers/UIStoresController.LightningLike.cs:65, …
- Blocking on a Task with `.Wait()`/`.GetAwaiter().GetResult()` can deadlock (and wastes a thread). Prefer awaiting it: make the caller `async` and `await` instead. Where a synchronous entry point must stay — a public sync API you cannot break, or a process entry point that must not return until the work finishes — the block belongs in ONE documented bridge and never inside code that is already async; and where it already is that bridge, give the wait a TIMEOUT so a hung task fails the call instead of hanging the process. — BTCPayServer.Rating/CurrencyPair.cs:16
- `.Wait(…)` blocks this thread until the task completes or the bound expires — sync-over-async: it can deadlock under a synchronization context and it parks a thread while it waits. `await` the task (with `.WaitAsync(timeout, token)` where the bound matters). — BTCPayServer.Common/Logging/ConsoleLogger.cs:411
What to do
- Sync-over-async (deadlock risk) through `.Result`
X12 · Unreachable branch
X13 · Undrained process stream
X14 · Bypassable address classification
X15 · Unvalidated length from an untrusted reader
X16 · Unfloored truncation loop
X17 · Uncapped recursion over a caller-supplied document
- `SetValues` is public, takes a document from its caller (line 253) and hands it to `SetValues`, which calls itself at line 269 with a child of the node it was given — and nowhere in `SetValues` is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the tree it is handed, so the nesting of the caller's document — not this code — decides how deep the stack goes. A document nested past the stack that remains raises `StackOverflowException`, which .NET neither lets you catch nor unwinds: the process is torn down where it stands, taking every other request in flight with it, and no `try`/`catch` around `SetValues` can intervene. Thread a depth argument through `SetValues` and reject the document past a fixed maximum, or rewrite the descent with an explicit stack. — BTCPayServer/Plugins/Forms/FormDataService.cs:269
- `GetPaths` is public, takes a document from its caller (line 59) and hands it to `GetAvailablePaths`, which calls itself at line 93 with a child of the node it was given (and at line 105, line 115) — and nowhere in `GetAvailablePaths` is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the tree it is handed, so the nesting of the caller's document — not this code — decides how deep the stack goes. A document nested past the stack that remains raises `StackOverflowException`, which .NET neither lets you catch nor unwinds: the process is torn down where it stands, taking every other request in flight with it, and no `try`/`catch` around `GetPaths` can intervene. Thread a depth argument through `GetAvailablePaths` and reject the document past a fixed maximum, or rewrite the descent with an explicit stack. — BTCPayServer.Common/TextTemplate.cs:93
- `Render` is public, takes a document from its caller (line 29) and hands it to `ToLowerCase`, which calls itself at line 123 with a child of the node it was given (and at line 129, line 138) — and nowhere in `ToLowerCase` is there a depth parameter, a descent counter, or any other cap. The walk therefore spends one stack frame per LEVEL of the tree it is handed, so the nesting of the caller's document — not this code — decides how deep the stack goes. A document nested past the stack that remains raises `StackOverflowException`, which .NET neither lets you catch nor unwinds: the process is torn down where it stands, taking every other request in flight with it, and no `try`/`catch` around `Render` can intervene. Thread a depth argument through `ToLowerCase` and reject the document past a fixed maximum, or rewrite the descent with an explicit stack. — BTCPayServer.Common/TextTemplate.cs:123
What to do
- Each finding names the externally-callable member that accepts the document and the self-call that descends, and states that no depth parameter or counter exists anywhere in the walk. Confirm from the two, then thread a depth argument through the walk and reject documents past a fixed maximum, or rewrite it with an explicit stack.
X18 · Disposal-pattern correctness
- `qrCode` is a `PngByteQRCode`, which implements `IDisposable`, and it is created here (line 16). Every use of it in `Invoke` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var qrCode = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer/Components/QRCode/QRCode.cs:16
- `cts` is a `CancellationTokenSource`, which implements `IDisposable`, and it is created here (line 181). Every use of it in `Process` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var cts = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer/PayoutProcessors/OnChain/OnChainAutomatedPayoutProcessor.cs:181
- `ctx` is never created by `SubscriptionContext` — every assignment to it takes a constructor parameter — yet this type disposes it here (line 122). Its declared type `ApplicationDbContext` is an interface, so the instance came from whoever resolved it, and that owner decides when it ends. Disposing it from here reaches outside this object's lifetime: a dependency shared with the rest of the process is torn down when THIS instance goes away, and the real owner's later `Dispose()` runs a second time on an object already disposed. Drop the call — a type disposes what it constructed, and only that. If this dependency genuinely is exclusive to this instance, construct it here (or take an owned factory) so the ownership is stated in the code rather than assumed. — BTCPayServer/Plugins/Subscriptions/SubscriptionContext.cs:122
- `jsonw` is a `JsonTextWriter`, which implements `IDisposable`, and it is created here (line 60). Every use of it in `ProcessBip329` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var jsonw = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer/Services/Wallets/Export/TransactionsExport.cs:60
- `writer` is a `StreamWriter`, which implements `IDisposable`, and it is created here (line 14). Every use of it in `Zip` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var writer = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer.Common/ZipUtils.cs:14
- `reader` is a `StreamReader`, which implements `IDisposable`, and it is created here (line 25). Every use of it in `Unzip` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var reader = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer.Common/ZipUtils.cs:25
- `reader` is a `StreamReader`, which implements `IDisposable`, and it is created here (line 114). Every use of it in `Unzip` reads a member through it — it is never returned, never stored, never handed to anything else, and never disposed — so this method both creates the value and is the last thing that can release it, and does not. Nothing announces the leak: the object holds its resource until finalization if its type has a finalizer, and until the process ends if it does not, so the cost accumulates once per CALL rather than showing up as a failure. Declare it with `using` (`using var reader = …;`), which releases it at the end of the scope on every path including a throw. — BTCPayServer.Data/Data/MigrationExtensions.cs:114
What to do
- Each finding names the value and the span that decides who owns it — the `new` that created it, or the constructor parameter that handed it over. Confirm ownership from that span, then make the disposal match it: release what this type created, leave what it was injected with to whoever created THAT, and drop a finalizer whose type holds nothing unmanaged to release.
X19 · Unrestored process-global state
X2 · Cancellation propagation
- Only 450/1385 async methods accept a CancellationToken, so in-flight work can't be stopped early when the caller gives up — whatever ends it in your host (shutdown signal, timeout, abandoned request, user cancel). Thread a token through the call chain and honour it at each await and loop; where a method genuinely cannot be interrupted, omitting it is a deliberate choice — judge against your hosting model.
- No CancellationToken parameter — this work can't be stopped early once started. (×34) — BTCPayServer/BufferizedFormFile.cs:32, BTCPayServer/Components/AppSales/AppSales.cs:24, BTCPayServer/Components/AppTopItems/AppTopItems.cs:19, …
- No CancellationToken parameter — the body observes an ambient token instead (a field or a context object), so the work does stop on cancellation, but a caller cannot cancel this call independently of the owner that created that token. (×5) — BTCPayServer/Components/MainNav/MainNav.cs:31, BTCPayServer/Components/StoreLightningBalance/StoreLightningBalance.cs:34, BTCPayServer/Components/StoreRecentTransactions/StoreRecentTransactions.cs:39, …
What to do
- Thread a CancellationToken through async methods so work stops promptly on cancellation.
X20 · Mistyped argument guard
X21 · Side-effecting pattern guard
X22 · Contradicted release guard
X23 · Unguarded diagnostic materialisation
X24 · Document value interpolated into markup unescaped
- `relative` is text this program did not author, and it is written into a quoted attribute value through `new HtmlString(…)` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. (×3) — BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:178, BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:187, BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:196
- `_jsonHelper.Serialize(model)` is text this program did not author, and it is written into the text of an element through `Html.Raw` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer.Abstractions/Services/Safe.cs:42
- `RawMeta(inputHtml, out _)` is text this program did not author, and it is written into the text of an element through `Html.Raw` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer.Abstractions/Services/Safe.cs:45
- `html` is text this program did not author, and it is written into the text of an element through `SetHtmlContent` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer.Abstractions/TagHelpers/PermissionedFormTagHelper.cs:38
- `$"var {VarName} = {_safe.Json(Model)};"` is text this program did not author, and it is written into the text of an element through `SetHtmlContent` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer.Abstractions/TagHelpers/SrvModel.cs:29
- `stringValue` is text this program did not author, and it is written into the text of an element through `new HtmlString(…)` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer.Abstractions/TagHelpers/UrlResolutionTagHelper2.cs:169
- `Html` is text this program did not author, and it is written into the text of an element through Blazor's `MarkupString` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. (×2) — BTCPayServer/Blazor/VaultBridge/Elements/Feedback.razor:12, BTCPayServer/Blazor/VaultBridge/Elements/Warning.razor:9
- `b64` is text this program did not author, and it is written into a URL attribute through `new HtmlString(…)` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/Components/QRCode/QRCode.cs:20
- `message` is text this program did not author, and it is written into the text of an element through an HTML e-mail body with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/Plugins/Emails/Services/EmailSettings.cs:83
- `encoder.Encode(appUrl)` is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through a `StringBuilder` building markup with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here — a `javascript:` URL contains nothing it changes; allow only http(s) or a relative path. (×2) — REDACTED:656, REDACTED:669
- `c.Code` is text this program did not author, and it is written into a quoted attribute value through `AppendHtml` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/TagHelpers/CurrenciesSuggestionsTagHelper.cs:37
- `_safe.Raw(newContent.Value)` is text this program did not author, and it is written into the text of an element through `SetHtmlContent` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/TagHelpers/TranslateTagHelper.cs:58
- `$"<h{Model.Level + 3} class=\"mb-3 fw-semibold\">"` is text this program did not author, and it is written into the text of an element through Razor's `Html.Raw` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. (×2) — REDACTED:25, REDACTED:39
- `$"</h{Model.Level + 3}>"` is text this program did not author, and it is written into the text of an element through Razor's `Html.Raw` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. (×2) — REDACTED:27, REDACTED:41
- `el.innerHTML.replace('#actions-copy','#checkmark')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/js/copy-to-clipboard.js:8
- `el.innerHTML.replace('#checkmark','#actions-copy')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/js/copy-to-clipboard.js:23
- `el.dataset.clipboardInitial` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/js/copy-to-clipboard.js:25
- `aHTML.join('')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — REDACTED:253
- `$a.innerHTML.replace(/#actions-sort-(asc|desc)"/,'#actions-sort"')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/js/store-reports.js:22
- `$button.innerHTML.replace('#actions-show','#actions-hide')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/main/site.js:464
- `$button.innerHTML.replace('#actions-hide','#actions-show')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/main/site.js:467
- `newState` is text this program did not author, and it is written into a quoted attribute value through `outerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/main/site.js:484
- `content.innerHTML` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/main/site.js:702
- `getStyles('template-paybutton-styles')` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/paybutton/paybutton.js:105
- `esc(srvModel.urlRoot)` is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here — a `javascript:` URL contains nothing it changes; allow only http(s) or a relative path. — BTCPayServer/wwwroot/paybutton/paybutton.js:107
- `snippet` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — BTCPayServer/wwwroot/paybutton/paybutton.js:174
- `html` is text this program did not author, and it is written into the text of an element through `innerHTML` with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework's escaping output, or sanitise it if it must stay markup. — REDACTED:177
What to do
- Each finding names the expression, the attribute it lands in and the line. Confirm the value's origin from the read this analyzer traced, then escape it at the sink or validate it against the shape the attribute accepts before interpolating.
X25 · Inert configuration knob
X26 · Unsynchronised callback handoff
X27 · Collection changed while being enumerated
X28 · Index access outside its own emptiness guard
X29 · Per-element action decided by a fixed element
X3 · Exception handling
- An empty catch block silently discards the error — failures vanish with no log and no rethrow. Log it, handle it, or don't catch it. (×35) — BTCPayServer/Components/MainNav/MainNav.cs:73, BTCPayServer/Configuration/DefaultConfiguration.cs:97, BTCPayServer/Controllers/Macaroons.cs:45, …
- `catch` does nothing with the exception it caught — the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch. Log it through whatever this codebase already uses to report problems, or let it propagate; if one specific failure genuinely cannot matter, catch exactly that exception type and say why in a comment on the catch. (×3) — BTCPayServer/Components/StoreLightningBalance/StoreLightningBalance.cs:81, BTCPayServer/DerivationSchemeParser.cs:320, BTCPayServer/Extensions.cs:651
- `catch (Exception)` does nothing with the exception it caught — the body neither logs it, rethrows it, nor even names it, so the failure is discarded as completely as by an empty catch. Log it through whatever this codebase already uses to report problems, or let it propagate; if one specific failure genuinely cannot matter, catch exactly that exception type and say why in a comment on the catch. (×2) — BTCPayServer/Controllers/UIInvoiceController.UI.cs:186, BTCPayServer/Payments/Lightning/LightningPendingPayoutListener.cs:109
What to do
- Swallowed exception (empty catch)
X30 · Support guard that admits what it rejects
X32 · Type resolved by simple name across every loaded assembly
X4 · Structured logging
- Logging an interpolated string (`$"..."`) collapses the event to plain text — you lose the named, queryable properties structured logging exists for. Use a message template with placeholders: `LogInformation("User {UserId} did {Action}", id, action)`. If these calls go through a logging wrapper that only accepts a pre-formatted string, give the wrapper a template+args overload that forwards to the underlying logger, then migrate call sites to it. (×40) — BTCPayServer/Configuration/BTCPayServerOptions.cs:61, BTCPayServer/Configuration/BTCPayServerOptions.cs:108, BTCPayServer/Configuration/BTCPayServerOptions.cs:109, …
What to do
- Interpolated log message defeats structured logging
X5 · Nullable reference types
- This method contradicts itself about `approvePayoutRequest`: line 639 writes `approvePayoutRequest?.Revision`, which says `approvePayoutRequest` can be null, but line 642 then dereferences it directly as `approvePayoutRequest.Revision` with no null test between them and no guard around it. If the `?.` is right, that dereference throws NullReferenceException on the input it was written for; if `approvePayoutRequest` truly cannot be null here, the `?.` is misleading. Settle it one way — test `approvePayoutRequest` once before the first use and handle the null case, or drop the `?.` — rather than leaving the two readings side by side. — REDACTED:642
- This method contradicts itself about `app`: line 275 writes `app?.StoreData`, which says `app` can be null, but line 285 then dereferences it directly as `app.AppType` with no null test between them and no guard around it. If the `?.` is right, that dereference throws NullReferenceException on the input it was written for; if `app` truly cannot be null here, the `?.` is misleading. Settle it one way — test `app` once before the first use and handle the null case, or drop the `?.` — rather than leaving the two readings side by side. — REDACTED:285
- This method contradicts itself about `result`: line 359 writes `result?.GetBlob`, which says `result` can be null, but line 395 then dereferences it directly as `result.SetBlob` with no null test between them and no guard around it. If the `?.` is right, that dereference throws NullReferenceException on the input it was written for; if `result` truly cannot be null here, the `?.` is misleading. Settle it one way — test `result` once before the first use and handle the null case, or drop the `?.` — rather than leaving the two readings side by side. — REDACTED:395
- This method contradicts itself about `chosen`: line 426 writes `chosen?.Value`, which says `chosen` can be null, but line 426 then dereferences it directly as `chosen.Value` with no null test between them and no guard around it. If the `?.` is right, that dereference throws NullReferenceException on the input it was written for; if `chosen` truly cannot be null here, the `?.` is misleading. Settle it one way — test `chosen` once before the first use and handle the null case, or drop the `?.` — rather than leaving the two readings side by side. — BTCPayServer/Controllers/UIStoresController.Settings.cs:426
- This method contradicts itself about `store`: line 76 writes `store?.GetStoreBlob`, which says `store` can be null, but line 80 then dereferences it directly as `store.SetStoreBlob` with no null test between them and no guard around it. If the `?.` is right, that dereference throws NullReferenceException on the input it was written for; if `store` truly cannot be null here, the `?.` is misleading. Settle it one way — test `store` once before the first use and handle the null case, or drop the `?.` — rather than leaving the two readings side by side. — BTCPayServer/Plugins/Emails/Controllers/UIStoresEmailController.cs:80
- This method contradicts itself about `infrastructure`: line 13 assigns it with `as IInfrastructure<IServiceProvider>`, which hands back null rather than throwing when the value is not a `IInfrastructure<IServiceProvider>`, but line 14 then dereferences it directly as `infrastructure.Instance` with no null test between them and no guard around it. If the `as` is right, that dereference throws NullReferenceException on the input it was written for — and the NullReferenceException names neither the cast nor the type that failed. Settle it one way — test `infrastructure` once before the first use and handle the null case, or cast with `(IInfrastructure<IServiceProvider>)` so the failure is reported where it happens — rather than leaving the two readings side by side. — BTCPayServer.Data/ApplicationDbContextExtensions.cs:14
- 0/7 NRT-eligible project(s) enable <Nullable>enable</Nullable> (projects targeting a pre-C#-8 framework are excluded — NRTs aren't available there). NRTs catch a whole class of null-deref bugs at compile time.
- ~0.7 `!` suppressions per 1k syntax nodes — 202 suppression(s) across the 295665 syntax node(s) in code where nullable warnings are ENABLED, which is the only code a `!` can suppress anything in (a `!` under `#nullable disable` is inert and is not counted, and its file's nodes are not in the denominator). Each one tells the compiler to trust you about null, suppressing the very safety NRTs provide.
What to do
- Where a method uses `?.` on a symbol and then dereferences it directly, settle the question once: test it before the first use and handle null, or drop the `?.`.
- Enable <Nullable>enable</Nullable> across all projects and resolve warnings rather than suppressing with `!`.
WCAG coverage — what static analysis assessed
| Dimension | WCAG 2.2 A/AA criteria | Coverage |
|---|---|---|
| AC1 · Text alternatives | 1.1.1, 1.2.2, 1.2.5 | Partial signal |
| AC2 · Forms & labels | 1.3.1, 3.3.2, 4.1.2 | Partial signal |
| AC3 · Page structure | 1.4.4, 2.2.1, 2.4.1, 2.4.2, 3.1.1, 4.1.2 | Partial signal |
| AC4 · Keyboard semantics | 2.1.1, 2.4.3 | Partial signal |
| AC5 · ARIA correctness | 4.1.2 | Partial signal |
| AC6 · Visual & motion safety | 1.4.3, 2.4.7 | Partial — literal CSS only |
| AC7 · A11y enforcement | enforcement — no page criterion | Enforcement posture (process) |
Reference — by lens
| Lens | Score | Rating | Impact |
|---|---|---|---|
| Code Health | 45% | Weak — gated by X4, X5 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Architecture | 74% | Adequate — gated by D27 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Maturity | 60% | Adequate — gated by M2 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Readiness | 44% | Weak — gated by D9, D13, P3, P7, P8 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Security | 68% | Adequate — gated by D28, D29, D36 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Event-Driven | 82% | Strong | Strongest area. |
| Accessibility | 40% | Weak — gated by AC4 | Capped at Fair by a Critical contributor — resolve it before relying on this lens. |
| Performance | 63% | Adequate | Acceptable, with room to improve. |
Unscored — 4 check(s) recorded observations but carry no score
- P12 CI test-gate honesty — 1 observation(s) recorded · Reported, not scored — this card publishes what the CI gate does with the test inventory rather than grading it. The findings above are its output.
- SC1 Supply-chain hygiene — 1 observation(s) recorded · Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X10 Duplicated predicate — 11 observation(s) recorded · Advisory — this card reports evidence and never carries a score.
- X7 Silent fallback defaults — 18 observation(s) recorded · Advisory — this card reports evidence and never carries a score.
Not evidenced — 2 control(s) we could not find positive evidence for
- C5 Data-Subject Rights — Repo shows no corroborated data-subject-rights mechanism (erasure / export-portability / consent) tied to a subject id or GDPR vocabulary — absence of evidence is not evidence of a working control. Implement erasure, data export/portability and consent tracking over the subject's records.
- P5 DR & Backup — not evidenced — repo shows no backup/RTO/RPO controls; absence of evidence is not evidence of a working control
Not included — 23 check(s) not relevant to this codebase
- AX4 Dependency direction — not applicable to a CQRS architecture (the inward-dependency rule is for layered/clean styles)
- AX7 Slice cohesion — not applicable — not a vertical-slice architecture
- AX9 CQS / query purity — no CQRS query handlers detected — query purity is not applicable to this codebase
- AXB2 Runtime readiness — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- AXR1 Runtime accessibility — docker build failed (exit 1) — DEPRECATED: The legacy builder is deprecated and will be removed in a future release. Install the buildx component to build images with BuildKit: https://docs.docker.com/go/bui…; runtime evidence skipped This is a statement about this run, not a statement about your application: nothing here says the surface is inaccessible, only that it was never rendered.
- D11 Test Reliability — Test reliability not measured — no test run produced results
- D22 Internal API Consistency — No intentionally-exposed public API to evaluate for consistency.
- D23 Boundary Type-Coupling — Cross-context type coupling could not be assessed — this codebase's bounded contexts are neither declared nor inferable.
- D25 ADR Conformance — no ADRs to check
- D40 Network Egress Confinement — No Kubernetes/orchestration workloads found in the repository manifests; network egress policy is a cluster-native control that may live at the platform/firewall layer, so there is nothing to assess here.
- D41 Kernel & Syscall Confinement — No Kubernetes/orchestration workloads found in the repository manifests; seccomp/AppArmor/SELinux confinement is a workload-level control, so there is nothing to assess here.
- D42 Runtime Threat Enforcement — No Kubernetes/orchestration workloads found in the repository manifests; runtime threat-detection and admission-control policy are cluster-level controls, so there is nothing to assess here.
- D43 Malicious Dependencies — Not scored — no dependency manifest in a supported ecosystem was read for this repository. A gap in the analyzer's language coverage, NOT a finding that the repository is free of vulnerable dependencies (a Python pyproject.toml/requirements.txt (pip/uv/Poetry), a Swift Package.swift/Package.resolved, a Cargo manifest, a Go module (go.mod/go.sum), a Gradle version catalogue, a Maven POM, an sbt build (build.sbt), composer.json, package.json, a Dart pubspec.yaml, an Elixir mix.exs/mix.lock (Hex), a rebar.config / erlang.mk DEPS (Hex), a Ruby Gemfile/Gemfile.lock or .gemspec (Bundler/RubyGems) — not scanned yet).
- D7 Architectural Integrity — no checkable ADRs and no dependency cycles — architectural integrity not assessed
- D8 Code Coverage — Coverage not measured
- DM1 Domain Modelling — not scored — this repository shows only 1 of the 3 signals this lens looks for (12 value object(s))
- ED2 Event/command shape — no command-shaped messages detected — single-handler-per-command check not applicable
- ED3 Event naming — no domain or integration events detected — event-naming check not applicable
- ES1 Event Sourcing — not scored — this repository shows none of the 3 signals this lens looks for
- P9 Domain vs controller coverage — no coverage report found on disk — produce a coverage report in a standard format (Cobertura — `dotnet test --collect:"XPlat Code Coverage"` with a `coverlet.collector` PackageReference) and commit it — a hosted scan measures a clone of the repository, so a report that exists only in a working tree, a CI runner's or your own, never reaches it; the artefact is commonly gitignored, so `git add -f` that one file (or un-ignore its path) and commit it alongside the code it measures, or wire coverage collection into CI, to enable this cross-layer check
- X6 Hand-rolled structured-format parsing — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X8 JS interop contract — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
- X9 Subsumed condition operand — Advisory — this card reports evidence and never carries a score, so there is nothing missing here.
Appendix A — Findings (grouped)
Critical — 253 finding(s)
- EmptyCatchBlock BTCPayServer.Client/JsonConverters/SaneOutpointJsonConverter.cs:30
- EmptyCatchBlock BTCPayServer.Common/Logging/ConsoleLogger.cs:371
- EmptyCatchBlock BTCPayServer.Common/Logging/ConsoleLogger.cs:414
- EmptyCatchBlock BTCPayServer.Common/MultiProcessingQueue.cs:103
- EmptyCatchBlock BTCPayServer.Rating/CurrencyNameTable.cs:158
- EmptyCatchBlock BTCPayServer.Rating/Providers/BackgroundFetcherRateProvider.cs:193
- EmptyCatchBlock BTCPayServer/Components/MainNav/MainNav.cs:73
- EmptyCatchBlock BTCPayServer/Configuration/DefaultConfiguration.cs:97
- EmptyCatchBlock BTCPayServer/Controllers/Macaroons.cs:45
- EmptyCatchBlock BTCPayServer/Controllers/UIInvoiceController.UI.cs:1071
- EmptyCatchBlock BTCPayServer/Controllers/UIInvoiceController.UI.cs:1093
- EmptyCatchBlock BTCPayServer/Controllers/UIPublicLightningNodeInfoController.cs:56
- EmptyCatchBlock REDACTED:675
- EmptyCatchBlock BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs:97
- EmptyCatchBlock BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs:173
- EmptyCatchBlock BTCPayServer/DerivationSchemeParser.cs:274
- EmptyCatchBlock BTCPayServer/Extensions.cs:600
- EmptyCatchBlock BTCPayServer/Extensions.cs:601
- EmptyCatchBlock BTCPayServer/Extensions.cs:658
- EmptyCatchBlock BTCPayServer/Extensions.cs:861
- EmptyCatchBlock BTCPayServer/Extensions/UserExtensions.cs:19
- EmptyCatchBlock BTCPayServer/Fido2/Fido2Service.cs:179
- EmptyCatchBlock BTCPayServer/HostedServices/BackgroundJobSchedulerHostedService.cs:118
- EmptyCatchBlock BTCPayServer/HostedServices/DbMigrationsHostedService.cs:155
- EmptyCatchBlock BTCPayServer/HostedServices/InvoiceWatcher.cs:219
- WriteOnlyPrivateField BTCPayServer.Rating/Providers/HttpClientRequestMaker.cs:95
- WriteOnlyPrivateField BTCPayServer.Rating/RateRules.cs:592
- WriteOnlyPrivateField BTCPayServer.Rating/Services/RateProviderFactory.cs:64
- WriteOnlyPrivateField BTCPayServer/Storage/Services/FileService.cs:30
- WriteOnlyPrivateField BTCPayServer.Tests/LightningDTester.cs:9
- WriteOnlyPrivateField BTCPayServer.Tests/TestAccount.cs:456
- WriteOnlyPrivateField BTCPayServer/Components/StoreNumbers/StoreNumbers.cs:16
- WriteOnlyPrivateField BTCPayServer/Components/WalletNav/WalletNav.cs:20
- WriteOnlyPrivateField BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:35
- WriteOnlyPrivateField BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:43
- WriteOnlyPrivateField BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:41
- WriteOnlyPrivateField BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:42
- WriteOnlyPrivateField BTCPayServer/Controllers/LnurlAuthService.cs:28
- WriteOnlyPrivateField REDACTED:62
- WriteOnlyPrivateField BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs:33
- WriteOnlyPrivateField BTCPayServer/Hosting/BlockExplorerLinkStartupTask.cs:11
- WriteOnlyPrivateField BTCPayServer/PaymentRequest/PaymentRequestService.cs:18
- WriteOnlyPrivateField BTCPayServer/Services/InvoiceActivator.cs:17
- WriteOnlyPrivateField BTCPayServer/Services/Reporting/PaymentsReportProvider.cs:13
- WriteOnlyPrivateField BTCPayServer/Data/Payouts/LightningLike/UILightningLikePayoutController.cs:36
- WriteOnlyPrivateField BTCPayServer/HostedServices/AppInventoryUpdaterHostedService.cs:14
- WriteOnlyPrivateField BTCPayServer/HostedServices/GithubVersionFetcher.cs:46
- WriteOnlyPrivateField BTCPayServer/HostedServices/InvoiceWatcher.cs:50
- WriteOnlyPrivateField BTCPayServer/HostedServices/InvoiceWatcher.cs:52
- WriteOnlyPrivateField BTCPayServer/HostedServices/InvoiceWatcher.cs:53
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- <input> without a programmatic label BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:9
- <input> without a programmatic label BTCPayServer/Components/LabelManager/Default.cshtml:39
- <input> without a programmatic label BTCPayServer/Components/SearchStringInput/Default.cshtml:4
- <input> without a programmatic label BTCPayServer/Plugins/DynamicDNS/Views/DynamicDnsService.cshtml:35
- <input> without a programmatic label BTCPayServer/Plugins/Multisig/VaultBridge/Elements/MultisigXPubSelect.razor:13
- <input> without a programmatic label BTCPayServer/Plugins/Multisig/Views/SetupMultisigStatus.cshtml:33
- <input> without a programmatic label REDACTED:306
- <input> without a programmatic label BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:34
- <input> without a programmatic label BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:132
- <input> without a programmatic label BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:151
- <input> without a programmatic label BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:162
- <input> without a programmatic label BTCPayServer/Plugins/PointOfSale/Views/Public/MinimalLight.cshtml:6
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:10
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:19
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:22
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:25
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:30
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:33
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:36
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:41
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:44
- Click handler on a non-interactive <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:47
- Click handler on a non-interactive <div> BTCPayServer/Views/UIInvoice/Checkout.cshtml:116
- Click handler on a non-interactive <div> BTCPayServer/Views/UIInvoice/Checkout.cshtml:155
- Clickable element isn't keyboard-operable BTCPayServer/Components/InvoiceStatus/Default.cshtml:19
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Crowdfund/Views/Public/ContributeForm.cshtml:14
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/Components/SubscriberStatus/Default.cshtml:25
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:110
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:234
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:255
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:427
- Clickable element isn't keyboard-operable BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:441
- Clickable element isn't keyboard-operable REDACTED:30
- Clickable element isn't keyboard-operable REDACTED:86
- Clickable element isn't keyboard-operable REDACTED:136
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:10
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:19
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:22
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:25
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:30
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:33
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:36
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:41
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:44
- Custom control with no accessible name on <div> BTCPayServer/Blazor/VaultBridge/Elements/PinInput.razor:47
- NoWarnInCsproj — 13 warning codes suppressed in one element Build/Common.csproj:4
- NoWarnInCsproj — 6 warning codes suppressed in one element BTCPayServer.PluginPacker/BTCPayServer.PluginPacker.csproj:25
- NoWarnInCsproj — 6 warning codes suppressed in one element BTCPayServer.Client/BTCPayServer.Client.csproj:26
- NoWarnInCsproj — 6 warning codes suppressed in one element BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj:21
- NoWarnInCsproj BTCPayServer.Tests/BTCPayServer.Tests.csproj:4
- NoWarnInCsproj BTCPayServer.Tests/BTCPayServer.Tests.csproj:4
- NoWarnInCsproj BTCPayServer.Tests/BTCPayServer.Tests.csproj:4
- Link with no accessible name BTCPayServer/Components/StoreSelector/Default.cshtml:25
- Link with no accessible name BTCPayServer/Components/StoreSelector/Default.cshtml:29
- Link with no accessible name REDACTED:42
- Link with no accessible name REDACTED:48
- Link with no accessible name BTCPayServer/Plugins/Multisig/Views/MultisigConfirm.cshtml:7
- Link with no accessible name BTCPayServer/Plugins/Multisig/Views/SetupMultisig.cshtml:7
- <button> with no accessible text REDACTED:34
- <button> with no accessible text BTCPayServer/Plugins/Bitpay/Views/RequestPairing.cshtml:17
- <button> with no accessible text BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:28
- <button> with no accessible text BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:129
- <button> with no accessible text BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:133
- <button> with no accessible text BTCPayServer/Plugins/PointOfSale/Views/Public/VueLight.cshtml:100
- aria-expanded on a <span> with no role to carry it BTCPayServer/Components/InvoiceStatus/Default.cshtml:19
- aria-expanded on a <span> with no role to carry it BTCPayServer/Plugins/Subscriptions/Views/Components/SubscriberStatus/Default.cshtml:25
- aria-expanded on a <span> with no role to carry it BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:110
- aria-expanded on a <span> with no role to carry it BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:234
- aria-expanded on a <span> with no role to carry it BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:255
- aria-expanded on a <span> with no role to carry it BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:441
- Captive dependency: singleton PaymentRequestService captures transient DisplayFormatter BTCPayServer/PaymentRequest/PaymentRequestService.cs:29
- Captive dependency: singleton PullPaymentHostedService captures transient DisplayFormatter BTCPayServer/HostedServices/PullPaymentHostedService.cs:320
- Captive dependency: singleton CrowdfundAppType captures transient DisplayFormatter BTCPayServer/Plugins/Crowdfund/CrowdfundPlugin.cs:63
- Captive dependency: singleton CrowdfundAppType captures scoped IHttpContextAccessor BTCPayServer/Plugins/Crowdfund/CrowdfundPlugin.cs:64
- Captive dependency: singleton EmailsTranslationProvider captures transient EmailTriggerViewModels BTCPayServer/Plugins/Emails/EmailsTranslationProvider.cs:11
- Captive dependency: singleton PointOfSaleAppType captures transient DisplayFormatter BTCPayServer/Plugins/PointOfSale/PointOfSalePlugin.cs:57
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- <svg role="img"> without an accessible name BTCPayServer/Blazor/Icon.razor
- <svg role="img"> without an accessible name BTCPayServer/Components/Icon/Default.cshtml
- <svg role="img"> without an accessible name BTCPayServer/Components/MainLogo/Default.cshtml
- <svg role="img"> without an accessible name BTCPayServer/Views/Shared/_StoreFooterLogo.cshtml
- Namespace dependency cycle BTCPayServer.Abstractions/Contracts/BaseDbContextFactory.cs:3
- Namespace dependency cycle BTCPayServer.Client/Models/ApiKeyData.cs:7
- Namespace dependency cycle BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:11
- Namespace dependency cycle BTCPayServer/Data/Payouts/LightningLike/UILightningLikePayoutController.cs:12
- <select> without a programmatic label BTCPayServer/Plugins/Bitpay/Views/CreateToken.cshtml:43
- <select> without a programmatic label BTCPayServer/Plugins/Crowdfund/Views/UpdateCrowdfund.cshtml:182
- <select> without a programmatic label BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:218
- <label> that labels no control BTCPayServer/Plugins/Multisig/VaultBridge/Elements/MultisigXPubSelect.razor:12
- <label> that labels no control BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:264
- <label> that labels no control BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:275
- REDACTED
- REDACTED
- REDACTED
- FileScopedPragmaDisable BTCPayServer.Tests/BitpayTests.cs:129
- FileScopedPragmaDisable REDACTED:1010
- FileScopedPragmaDisable REDACTED:2608
- <html> without a lang BTCPayServer/Views/UIHome/SwaggerDocs.cshtml:8
- <html> without a lang BTCPayServer/Views/UIHome/SwaggerDraftDocs.cshtml:8
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Dual write (no outbox): BitcoinLikePayoutHandler.UpdatePayoutsInProgress BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:330
- Dual write (no outbox): BitcoinLikePayoutHandler.UpdatePayoutsFromTransaction BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:377
- Click handler on a non-interactive <li> BTCPayServer/Plugins/Wallets/Views/UIWallets/CoinSelection.cshtml:73
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- TLS certificate validation disabled BTCPayServer/Plugins/Emails/Services/EmailSettings.cs:110
Serious — 1026 finding(s)
- Dead code: SearchTermRouteKey BTCPayServer/Components/DateRangeSelector/DateRangeSelector.cs:26
- Dead code: GetPayoutSpecificActions BTCPayServer/Data/Payouts/IPayoutHandler.cs:42
- Dead code: GetEnabledPaymentMethods REDACTED:28
- Dead code: IsLightningEnabled REDACTED:143
- Dead code: IsLNUrlEnabled REDACTED:148
- Dead code: ParseOutputDescriptor BTCPayServer/DerivationSchemeParser.cs:25
- Dead code: ItemCombinations BTCPayServer/DerivationSchemeParser.cs:388
- Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs:72
- Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs:87
- Dead code: GetSigningAccountKeySettings BTCPayServer/DerivationSchemeSettings.cs:91
- Dead code: GetSigningAccountKeySettingsOrDefault BTCPayServer/DerivationSchemeSettings.cs:95
- Dead code: IsFullySetup BTCPayServer/DerivationSchemeSettings.cs:158
- Dead code: Private BTCPayServer/Extensions.cs:1083
- Dead code: Private BTCPayServer/Extensions.cs:1084
- Dead code: GetAdjustedForegroundForBackground BTCPayServer/Extensions/ColorExtensions.cs:31
- Dead code: EnsureLocal BTCPayServer/Extensions/UrlHelperExtensions.cs:22
- Dead code: IndexLink BTCPayServer/Extensions/UrlHelperExtensions.cs:132
- Dead code: Fido2AuthenticationViewModel BTCPayServer/Fido2/Models/Fido2AuthenticationViewModel.cs:6
- Dead code: GetMigrationState BTCPayServer/Hosting/MigrationStartupTask.cs:399
- Dead code: UpdateSequenceInvoiceSearch BTCPayServer/Hosting/MigrationStartupTask.cs:406
- Dead code: DateTimeMilliJsonConverter BTCPayServer/JsonConverters/DateTimeMilliJsonConverter.cs:7
- Dead code: AuthorizeViewModel BTCPayServer/Models/Authorization/AuthorizeViewModel.cs:7
- Dead code: AddressModel BTCPayServer/Models/InvoicingModels/InvoiceDetailsModel.cs:58
- Dead code: RemoveLoginViewModel BTCPayServer/Models/ManageViewModels/RemoveLoginViewModel.cs:3
- Dead code: PaymentViewModel BTCPayServer/Models/StoreViewModels/PaymentViewModel.cs:7
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Swallowed exception (empty catch) BTCPayServer/Components/MainNav/MainNav.cs:73
- Swallowed exception (empty catch) BTCPayServer/Configuration/DefaultConfiguration.cs:97
- Swallowed exception (empty catch) BTCPayServer/Controllers/Macaroons.cs:45
- Swallowed exception (empty catch) BTCPayServer/Controllers/UIInvoiceController.UI.cs:1071
- Swallowed exception (empty catch) BTCPayServer/Controllers/UIInvoiceController.UI.cs:1093
- Swallowed exception (empty catch) BTCPayServer/Controllers/UIPublicLightningNodeInfoController.cs:56
- Swallowed exception (empty catch) REDACTED:675
- Swallowed exception (empty catch) BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs:97
- Swallowed exception (empty catch) BTCPayServer/Data/Payouts/LightningLike/LightningLikePayoutHandler.cs:173
- Swallowed exception (empty catch) BTCPayServer/DerivationSchemeParser.cs:274
- Swallowed exception (empty catch) BTCPayServer/Extensions.cs:600
- Swallowed exception (empty catch) BTCPayServer/Extensions.cs:601
- Swallowed exception (empty catch) BTCPayServer/Extensions.cs:658
- Swallowed exception (empty catch) BTCPayServer/Extensions.cs:861
- Swallowed exception (empty catch) BTCPayServer/Extensions/UserExtensions.cs:19
- Swallowed exception (empty catch) BTCPayServer/Fido2/Fido2Service.cs:179
- Swallowed exception (empty catch) BTCPayServer/HostedServices/BackgroundJobSchedulerHostedService.cs:118
- Swallowed exception (empty catch) BTCPayServer/HostedServices/DbMigrationsHostedService.cs:155
- Swallowed exception (empty catch) BTCPayServer/HostedServices/InvoiceWatcher.cs:219
- Swallowed exception (empty catch) BTCPayServer/HostedServices/InvoiceWatcher.cs:332
- Swallowed exception (empty catch) BTCPayServer/HostedServices/NBXplorerWaiter.cs:135
- Swallowed exception (empty catch) BTCPayServer/HostedServices/NBXplorerWaiter.cs:214
- Swallowed exception (empty catch) BTCPayServer/HostedServices/PeriodicTaskLauncherHostedService.cs:61
- Swallowed exception (empty catch) BTCPayServer/HostedServices/PeriodicTaskLauncherHostedService.cs:77
- Swallowed exception (empty catch) BTCPayServer/HostedServices/RatesHostedService.cs:94
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/pos/cart.css:53
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.css:68
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/layout.css:46
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/layout.css:163
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/layout.css:717
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/site.css:911
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/rtl/layout.rtl.css:46
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/rtl/layout.rtl.css:163
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/rtl/layout.rtl.css:759
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/rtl/site.rtl.css:911
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2144
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2447
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:2995
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:5543
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:5596
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6190
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6366
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6438
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6510
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6582
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6654
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.css:6725
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2142
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2445
- Focus outline removed in CSS without a :focus replacement BTCPayServer/wwwroot/main/bootstrap/bootstrap.rtl.css:2993
- Async method without CancellationToken: Bufferize BTCPayServer/BufferizedFormFile.cs:32
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/AppSales/AppSales.cs:24
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/AppTopItems/AppTopItems.cs:19
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/GlobalNav/GlobalNav.cs:17
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/StoreLightningServices/StoreLightningServices.cs:28
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/StoreNumbers/StoreNumbers.cs:30
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/StoreRecentInvoices/StoreRecentInvoices.cs:13
- Async method without CancellationToken: InvokeAsync BTCPayServer/Components/StoreSelector/StoreSelector.cs:16
- Async method without CancellationToken: Expand BTCPayServer/Configuration/ExternalConnectionString.cs:34
- Async method without CancellationToken: GetLink BTCPayServer/Configuration/ExternalService.cs:118
- Async method without CancellationToken: GetKey BTCPayServer/Controllers/GreenField/GreenfieldApiKeysController.cs:28
- Async method without CancellationToken: CreateUserAPIKey BTCPayServer/Controllers/GreenField/GreenfieldApiKeysController.cs:47
- Async method without CancellationToken: RevokeAPIKey BTCPayServer/Controllers/GreenField/GreenfieldApiKeysController.cs:106
- Async method without CancellationToken: CreateCrowdfundApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:60
- Async method without CancellationToken: CreatePointOfSaleApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:91
- Async method without CancellationToken: UpdatePointOfSaleApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:122
- Async method without CancellationToken: GetAllApps BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:162
- Async method without CancellationToken: GetAllApps BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:171
- Async method without CancellationToken: GetApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:180
- Async method without CancellationToken: GetPosApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:193
- Async method without CancellationToken: UpdateCrowdfundApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:201
- Async method without CancellationToken: GetCrowdfundApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:227
- Async method without CancellationToken: DeleteApp BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:235
- Async method without CancellationToken: GetAppSales BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:247
- Async method without CancellationToken: GetAppTopItems BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:258
- Outbound HTTP without resilience BTCPayServer.Client/BTCPayServerClient.cs:31
- Outbound HTTP without resilience BTCPayServer.Client/BTCPayServerClient.cs:38
- Outbound HTTP without resilience BTCPayServer.Client/BTCPayServerClient.cs:47
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BTCTurkRateProvider.cs:24
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BareBitcoinRateProvider.cs:17
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitbankRateProvider.cs:19
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitcoinKenyaRateProvider.cs:18
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitflyerRateProvider.cs:15
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitmyntRateProvider.cs:17
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitnobRateProvider.cs:16
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BitpayRateProvider.cs:15
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/BudaRateProvider.cs:14
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/ByllsRateProvider.cs:14
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/CoinmateRateProvider.cs:16
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/FreeCurrencyRatesRateProvider.cs:16
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/HitBTCRateProvider.cs:13
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/NotbankExchangeRateProvider.cs:20
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/RipioExchangeProvider.cs:17
- Outbound HTTP without resilience BTCPayServer.Rating/Providers/YadioRateProvider.cs:16
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:104
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:135
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:137
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:141
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:400
- Outbound HTTP without resilience BTCPayServer/Hosting/BTCPayServerServices.cs:402
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:178
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:187
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:196
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/Services/Safe.cs:42
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/Services/Safe.cs:45
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/TagHelpers/PermissionedFormTagHelper.cs:38
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/TagHelpers/SrvModel.cs:29
- Untrusted text written into markup unescaped BTCPayServer.Abstractions/TagHelpers/UrlResolutionTagHelper2.cs:169
- Untrusted text written into markup unescaped BTCPayServer/Blazor/VaultBridge/Elements/Feedback.razor:12
- Untrusted text written into markup unescaped BTCPayServer/Blazor/VaultBridge/Elements/Warning.razor:9
- Untrusted text written into markup unescaped BTCPayServer/Components/QRCode/QRCode.cs:20
- Untrusted text written into markup unescaped BTCPayServer/Plugins/Emails/Services/EmailSettings.cs:83
- Untrusted text written into markup unescaped REDACTED:656
- Untrusted text written into markup unescaped REDACTED:669
- Untrusted text written into markup unescaped BTCPayServer/TagHelpers/CurrenciesSuggestionsTagHelper.cs:37
- Untrusted text written into markup unescaped BTCPayServer/TagHelpers/TranslateTagHelper.cs:58
- Untrusted text written into markup unescaped REDACTED:25
- Untrusted text written into markup unescaped REDACTED:27
- Untrusted text written into markup unescaped REDACTED:39
- Untrusted text written into markup unescaped REDACTED:41
- Untrusted text written into markup unescaped BTCPayServer/wwwroot/js/copy-to-clipboard.js:8
- Untrusted text written into markup unescaped BTCPayServer/wwwroot/js/copy-to-clipboard.js:23
- Untrusted text written into markup unescaped BTCPayServer/wwwroot/js/copy-to-clipboard.js:25
- Untrusted text written into markup unescaped REDACTED:253
- Untrusted text written into markup unescaped BTCPayServer/wwwroot/js/store-reports.js:22
- Hotspot: BTCPayServer/Controllers/UIInvoiceController.UI.cs BTCPayServer/Controllers/UIInvoiceController.UI.cs:773
- Hotspot: REDACTED REDACTED:195
- Hotspot: BTCPayServer/Hosting/BTCPayServerServices.cs BTCPayServer/Hosting/BTCPayServerServices.cs:87
- Hotspot: BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:321
- Hotspot: BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:328
- Hotspot: BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js:6
- Hotspot: BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:447
- Hotspot: REDACTED REDACTED:131
- Hotspot: BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs:265
- Hotspot: BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs:155
- Hotspot: BTCPayServer/Extensions.cs BTCPayServer/Extensions.cs:286
- Hotspot: BTCPayServer/wwwroot/crowdfund/app.js BTCPayServer/wwwroot/crowdfund/app.js:4
- Hotspot: BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:182
- Hotspot: REDACTED REDACTED:517
- Hotspot: REDACTED REDACTED:53
- Hotspot: BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs:233
- Hotspot: BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs:50
- Hotspot: BTCPayServer/Controllers/UIStoresController.Settings.cs BTCPayServer/Controllers/UIStoresController.Settings.cs:266
- Hotspot: BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:156
- Hotspot: BTCPayServer/Controllers/UIManageController.APIKeys.cs BTCPayServer/Controllers/UIManageController.APIKeys.cs:178
- Hotspot: BTCPayServer/Configuration/BTCPayServerOptions.cs BTCPayServer/Configuration/BTCPayServerOptions.cs:57
- Hotspot: BTCPayServer/Controllers/UIInvoiceController.cs BTCPayServer/Controllers/UIInvoiceController.cs:207
- Hotspot: BTCPayServer/Services/Labels/LabelService.cs BTCPayServer/Services/Labels/LabelService.cs:25
- Hotspot: BTCPayServer/Controllers/GreenField/GreenfieldStoreUsersController.cs BTCPayServer/Controllers/GreenField/GreenfieldStoreUsersController.cs:200
- Hotspot: BTCPayServer/Plugins/PluginManager.cs BTCPayServer/Plugins/PluginManager.cs:193
- TodoComment BTCPayServer.Client/Models/WebhookEventType.cs:3
- TodoComment BTCPayServer.Tests/BitpayTests.cs:151
- TodoComment BTCPayServer.Tests/BitpayTests.cs:163
- TodoComment BTCPayServer.Tests/PlaywrightTests.cs:2228
- TodoComment BTCPayServer.Tests/ServerTester.cs:80
- TodoComment BTCPayServer.Tests/ThirdPartyTests.cs:126
- TodoComment BTCPayServer.Tests/WebhooksTests.cs:432
- TodoComment BTCPayServer.Tests/WebhooksTests.cs:442
- TodoComment BTCPayServer/Controllers/UIInvoiceController.UI.cs:298
- TodoComment BTCPayServer/Controllers/UIInvoiceController.UI.cs:556
- TodoComment BTCPayServer/Controllers/UIInvoiceController.UI.cs:388
- TodoComment BTCPayServer/Controllers/UIInvoiceController.UI.cs:514
- TodoComment BTCPayServer/Controllers/UIInvoiceController.UI.cs:755
- TodoComment REDACTED:298
- TodoComment BTCPayServer/HostedServices/DbMigrationsHostedService.cs:323
- TodoComment BTCPayServer/Plugins/Emails/Controllers/UIEmailRuleControllerBase.cs:153
- TodoComment BTCPayServer/Plugins/Subscriptions/SubscriberWebhookProvider.cs:36
- TodoComment BTCPayServer/Security/BuiltInPermissionHandler.cs:23
- TodoComment BTCPayServer/Security/SetContextFilter.cs:52
- TodoComment BTCPayServer/Services/BTCPayNetworkJsonSerializerSettings.cs:40
- TodoComment BTCPayServer/Services/Fees/FeeProviderFactory.cs:34
- TodoComment BTCPayServer/Services/LightningHistogramService.cs:27
- MethodTooLong: BTCPayServerServices.AddBTCPayServer BTCPayServer/Hosting/BTCPayServerServices.cs:87
- MethodTooLong: PayJoinEndpointController.Submit REDACTED:131
- MethodTooLong: UIWalletsController.WalletSend BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1189
- MethodTooLong: UIPointOfSaleController.ViewPointOfSale REDACTED:195
- MethodTooLong: GreenfieldStoreOnChainWalletsController.CreateOnChainTransaction BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:344
- MethodTooLong: UIWalletsController.WalletBumpFee BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:182
- MethodTooLong: UIInvoiceController.GetCheckoutModel BTCPayServer/Controllers/UIInvoiceController.UI.cs:773
- MethodTooLong: UIInvoiceController.Refund BTCPayServer/Controllers/UIInvoiceController.UI.cs:334
- MethodTooLong: UIStorePullPaymentsController.PayoutsPost BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs:297
- MethodTooLong: PluginManager.AddPlugins BTCPayServer/Plugins/PluginManager.cs:193
- MethodTooLong: GreenfieldInvoiceController.RefundInvoice BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:328
- MethodTooLong: UIServerMonetizationController.Monetization BTCPayServer/Plugins/Monetization/Controllers/UIServerMonetizationController.cs:147
- MethodTooLong: UIWalletsController.WalletPSBTReady BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:447
- MethodTooLong: UIWalletsController.FetchTransactionDetails BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:256
- MethodTooLong: Startup.ConfigureServices BTCPayServer/Hosting/Startup.cs:91
- MethodTooLong: UILNURLController.GetLNURLForInvoice REDACTED:742
- MethodTooLong: PaymentData.TryMigrate BTCPayServer.Data/Data/PaymentData.Migration.cs:15
- MethodTooLong: PullPaymentHostedService.HandleCreatePayout BTCPayServer/HostedServices/PullPaymentHostedService.cs:633
- MethodTooLong: DbMigrationsHostedService.MigratedTransactionLabels BTCPayServer/HostedServices/DbMigrationsHostedService.cs:100
- MethodTooLong: UICrowdfundController.ContributeToCrowdfund REDACTED:91
- FileTooLong: Controllers/UIWalletsController.cs BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs
- FileTooLong: Controllers/UIInvoiceController.UI.cs BTCPayServer/Controllers/UIInvoiceController.UI.cs
- FileTooLong: HostedServices/PullPaymentHostedService.cs BTCPayServer/HostedServices/PullPaymentHostedService.cs
- FileTooLong: REDACTED REDACTED
- FileTooLong: BTCPayServer/Extensions.cs BTCPayServer/Extensions.cs
- FileTooLong: Invoices/InvoiceEntity.cs BTCPayServer/Services/Invoices/InvoiceEntity.cs
- FileTooLong: Hosting/MigrationStartupTask.cs BTCPayServer/Hosting/MigrationStartupTask.cs
- FileTooLong: REDACTED REDACTED
- FileTooLong: Invoices/InvoiceRepository.cs BTCPayServer/Services/Invoices/InvoiceRepository.cs
- FileTooLong: Controllers/GreenfieldStoreOnChainWalletsController.cs BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs
- FileTooLong: Stores/StoreRepository.cs BTCPayServer/Services/Stores/StoreRepository.cs
- FileTooLong: REDACTED REDACTED
- FileTooLong: Plugins/PluginManager.cs BTCPayServer/Plugins/PluginManager.cs
- FileTooLong: REDACTED REDACTED
- FileTooLong: main/site.js BTCPayServer/wwwroot/main/site.js
- FileTooLong: Controllers/UIStoreOnChainWalletsController.cs BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs
- FileTooLong: Services/WalletRepository.cs BTCPayServer/Services/WalletRepository.cs
- FileTooLong: REDACTED REDACTED
- FileTooLong: GreenField/GreenfieldInvoiceController.cs BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- FileTooLong: REDACTED REDACTED
- Stateful singleton: SelectedChains BTCPayServer.Common/SelectedChains.cs:8
- Stateful singleton: Logs BTCPayServer.Common/Logging/Logs.cs:7
- Stateful singleton: SettingsAccessor BTCPayServer/Services/ISettingsAccessor.cs:17
- Stateful singleton: TorServices BTCPayServer/Services/TorServices.cs:15
- Stateful singleton: BTCPayServerOptions BTCPayServer/Configuration/BTCPayServerOptions.cs:13
- Stateful singleton: NBXplorerListener BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:28
- Stateful singleton: LightningListener BTCPayServer/Payments/Lightning/LightningListener.cs:31
- Stateful singleton: RatesHostedService BTCPayServer/HostedServices/RatesHostedService.cs:18
- Stateful singleton: CurrencyNameTable BTCPayServer.Rating/CurrencyNameTable.cs:64
- Stateful singleton: DelayedTransactionBroadcaster BTCPayServer/Services/DelayedTransactionBroadcaster.cs:15
- Stateful singleton: ResultItemViewModel BTCPayServer/Plugins/GlobalSearch/Views/GlobalSearchViewModel.cs:26
- Stateful singleton: ActionResultItemViewModel BTCPayServer/Plugins/GlobalSearch/StaticSearchResultProvider.cs:14
- Stateful singleton: CheckHostCommandsHostedService BTCPayServer/Plugins/Maintenance/CheckHostCommandsHostedService.cs:14
- Stateful singleton: LocalizerService BTCPayServer/Plugins/Translations/LocalizerService.cs:23
- ClassTooLong: UILNURLController REDACTED
- ClassTooLong: MigrationStartupTask BTCPayServer/Hosting/MigrationStartupTask.cs
- ClassTooLong: GreenfieldStoreOnChainWalletsController BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs
- ClassTooLong: UIPointOfSaleController REDACTED
- ClassTooLong: PullPaymentHostedService BTCPayServer/HostedServices/PullPaymentHostedService.cs
- ClassTooLong: UIStoreOnChainWalletsController BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs
- ClassTooLong: GreenfieldPullPaymentController REDACTED
- ClassTooLong: GreenfieldInvoiceController BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs
- ClassTooLong: UIOfferingController REDACTED
- ClassTooLong: GreenfieldOfferingController BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs
- ClassTooLong: UIPluginManagerController BTCPayServer/Plugins/PluginManager/Controllers/UIPluginManagerController.cs
- ClassTooLong: SubscriptionHostedService BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs
- ClassTooLong: UIStorePullPaymentsController BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs
- TooManyMethods: BTCPayServerClient REDACTED
- TooManyMethods: UIWalletsController BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs
- TooManyMethods: StoreRepository BTCPayServer/Services/Stores/StoreRepository.cs
- TooManyMethods: UIServerController REDACTED
- TooManyMethods: UIStoresController BTCPayServer/Controllers/UIStoresController.LightningLike.cs
- TooManyMethods: InvoiceRepository BTCPayServer/Services/Invoices/InvoiceRepository.cs
- TooManyMethods: WalletRepository BTCPayServer/Services/WalletRepository.cs
- TooManyMethods: UIInvoiceController BTCPayServer/Controllers/UIInvoiceController.UI.cs
- TooManyMethods: UIManageController BTCPayServer/Controllers/UIManageController.APIKeys.cs
- TooManyMethods: PluginManager BTCPayServer/Plugins/PluginManager.cs
- TooManyMethods: AppService BTCPayServer/Services/Apps/AppService.cs
- TooManyMethods: UIAccountController REDACTED
- Change coupling: BitcoinLikePaymentData.cs ↔ LightningLikePaymentData.cs BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentData.cs:1
- Change coupling: LightningLikePaymentData.cs ↔ InvoiceEntity.cs BTCPayServer/Payments/Lightning/LightningLikePaymentData.cs:1
- Change coupling: BitcoinLikePaymentData.cs ↔ InvoiceEntity.cs BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentData.cs:1
- Change coupling: REDACTED ↔ ServerNavPages.cs REDACTED:1
- Change coupling: REDACTED ↔ REDACTED REDACTED:1
- Change coupling: common.js ↔ REDACTED BTCPayServer/wwwroot/pos/common.js:1
- Change coupling: UIServerController.Users.cs ↔ UserEventTriggerHostedService.cs BTCPayServer/Controllers/UIServerController.Users.cs:1
- Change coupling: GreenfieldStoreOnChainPaymentMethodsController.WalletGeneration.cs ↔ GreenfieldStoreOnChainWalletsController.cs BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainPaymentMethodsController.WalletGeneration.cs:1
- Change coupling: BTCPayServerServices.cs ↔ UserEventTriggerHostedService.cs BTCPayServer/Hosting/BTCPayServerServices.cs:1
- Change coupling: PayButtonViewModel.cs ↔ paybutton.js BTCPayServer/Plugins/PayButton/Models/PayButtonViewModel.cs:1
- Change coupling: ViewPointOfSaleViewModel.cs ↔ PointOfSaleSettings.cs BTCPayServer/Plugins/PointOfSale/Models/ViewPointOfSaleViewModel.cs:1
- CommentedOutCode BTCPayServer.Tests/GreenfieldAPITests.cs:1113
- CommentedOutCode BTCPayServer/Hosting/BTCPayServerServices.cs:803
- CommentedOutCode BTCPayServer.Tests/LightningTests.cs:253
- CommentedOutCode BTCPayServer.Tests/PayJoinTests.cs:1093
- CommentedOutCode BTCPayServer.Tests/ThirdPartyTests.cs:519
- CommentedOutCode BTCPayServer.Tests/ThirdPartyTests.cs:548
- CommentedOutCode BTCPayServer.Tests/UtilitiesTests.cs:65
- CommentedOutCode BTCPayServer.Tests/UtilitiesTests.cs:119
- CommentedOutCode BTCPayServer.Tests/UtilitiesTests.cs:90
- FunctionTooLong: global-search.initGlobalSearch BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js:6
- FunctionTooLong: checkout.initApp REDACTED:99
- FunctionTooLong: template-editor.document.addEventListener("DOMContentLoaded") BTCPayServer/wwwroot/js/template-editor.js:1
- FunctionTooLong: site.document.addEventListener("DOMContentLoaded") BTCPayServer/wwwroot/main/site.js:336
- FunctionTooLong: form-editor.document.addEventListener("DOMContentLoaded") BTCPayServer/wwwroot/js/form-editor.js:1
- FunctionTooLong: site.initLabelManager BTCPayServer/wwwroot/main/site.js:16
- FunctionTooLong: fireworks.document.addEventListener("DOMContentLoaded") BTCPayServer/wwwroot/crowdfund/services/fireworks.js:1
- FunctionTooLong: keypad.document.addEventListener("DOMContentLoaded") REDACTED:1
- FunctionTooLong: paybutton.inputChanges BTCPayServer/wwwroot/paybutton/paybutton.js:61
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/Bitpay/Views/ShowToken.cshtml:10
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/Monetization/Views/Monetization.cshtml:75
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/Monetization/Views/Monetization.cshtml:136
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/Monetization/Views/Monetization.cshtml:166
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/PayButton/Views/Enable.cshtml:19
- Heading level jumps from h2 to h5 BTCPayServer/Plugins/PayButton/Views/PayButton.cshtml:191
- Heading level jumps from h2 to h5 REDACTED:256
- Heading level jumps from h2 to h5 BTCPayServer/Views/UIHome/Home.cshtml:21
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Fake-async — async method never awaits BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:128
- Fake-async — async method never awaits BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs:61
- Fake-async — async method never awaits REDACTED:116
- Fake-async — async method never awaits BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:429
- Fake-async — async method never awaits BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:667
- Fake-async — async method never awaits BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:686
- Fake-async — async method never awaits BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:704
- Fake-async — async method never awaits BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:101
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Components/StoreLightningServices/StoreLightningServices.cs:65
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs:165
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Controllers/UIStoresController.LightningLike.cs:65
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Extensions.cs:678
- Sync-over-async (deadlock risk) through `.Result` REDACTED:347
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1051
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Plugins/Webhooks/Controllers/UIStoreWebhooksController.cs:54
- Sync-over-async (deadlock risk) through `.Result` BTCPayServer/Services/Notifications/NotificationSender.cs:66
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Bitpay/Views/ListTokens.cshtml:44
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:139
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:151
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:159
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:169
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:176
- Heading level jumps from h3 to h5 BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckout.cshtml:199
- ObsoleteWithCallers BTCPayServer.Data/Data/IHasBlob.cs:20
- ObsoleteWithCallers BTCPayServer.Data/Data/InvoiceData.cs:21
- ObsoleteWithCallers BTCPayServer.Data/Data/NotificationData.cs:21
- ObsoleteWithCallers BTCPayServer.Data/Data/PaymentData.cs:25
- ObsoleteWithCallers BTCPayServer.Data/Data/PaymentRequestData.cs:32
- ObsoleteWithCallers BTCPayServer.Data/Data/PayoutProcessorData.cs:22
- ObsoleteWithCallers BTCPayServer.Data/Data/WebhookData.cs:14
- Heading level jumps from h1 to h4 BTCPayServer/Plugins/Multisig/Views/SetupMultisig.cshtml:40
- Heading level jumps from h1 to h4 BTCPayServer/Plugins/Wallets/Views/UIStoreOnChainWallets/GenerateWalletOptions.cshtml:24
- Heading level jumps from h1 to h4 BTCPayServer/Plugins/Wallets/Views/UIStoreOnChainWallets/ImportWalletOptions.cshtml:36
- Heading level jumps from h1 to h4 BTCPayServer/Plugins/Wallets/Views/UIStoreOnChainWallets/SetupWallet.cshtml:18
- Heading level jumps from h1 to h4 BTCPayServer/Plugins/Wallets/Views/UIWallets/WalletSigningOptions.cshtml:33
- Heading level jumps from h1 to h4 REDACTED:66
- Page without a main landmark BTCPayServer/Plugins/PointOfSale/Views/Public/_Layout.cshtml:37
- Page without a main landmark BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckout.cshtml:16
- Page without a main landmark BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckoutDefaultRedirect.cshtml:11
- Page without a main landmark REDACTED:41
- Page without a main landmark BTCPayServer/Views/Shared/PostRedirect.cshtml:6
- Page without a main landmark BTCPayServer/Views/Shared/_LayoutSimple.cshtml:6
- Animation without a prefers-reduced-motion guard BTCPayServer/Plugins/Subscriptions/Views/UIPlanCheckout/PlanCheckoutDefaultRedirect.cshtml:49
- Animation without a prefers-reduced-motion guard BTCPayServer/wwwroot/pos/common.css:28
- Animation without a prefers-reduced-motion guard BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.css:116
- Animation without a prefers-reduced-motion guard BTCPayServer/wwwroot/main/site.css:130
- Animation without a prefers-reduced-motion guard BTCPayServer/wwwroot/main/wizard.css:37
- Animation without a prefers-reduced-motion guard BTCPayServer/wwwroot/main/rtl/site.rtl.css:130
- HackComment BTCPayServer.Tests/AltcoinTests/AltcoinTests.cs:693
- HackComment BTCPayServer.Tests/AltcoinTests/AltcoinTests.cs:696
- HackComment REDACTED:1097
- HackComment BTCPayServer/Hosting/Startup.cs:313
- HackComment BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:515
- HackComment BTCPayServer/Program.cs:33
- Duplicated block (10 lines × 2) BTCPayServer/Data/Payouts/BitcoinLike/BitcoinLikePayoutHandler.cs:220
- Duplicated block (10 lines × 2) BTCPayServer/Controllers/LnurlAuthService.cs:83
- Duplicated block (10 lines × 2) BTCPayServer/Plugins/Forms/UIFormsController.cs:143
- Duplicated block (10 lines × 2) REDACTED:484
- Duplicated block (10 lines × 2) BTCPayServer/Services/LightningHistogramService.cs:13
- Duplicated block (10 lines × 2) BTCPayServer/Models/ManageViewModels/ChangePasswordViewModel.cs:12
- Disposable created and abandoned in the method that made it BTCPayServer/Components/QRCode/QRCode.cs:16
- Disposable created and abandoned in the method that made it BTCPayServer/PayoutProcessors/OnChain/OnChainAutomatedPayoutProcessor.cs:181
- Disposable created and abandoned in the method that made it BTCPayServer/Services/Wallets/Export/TransactionsExport.cs:60
- Disposable created and abandoned in the method that made it BTCPayServer.Common/ZipUtils.cs:14
- Disposable created and abandoned in the method that made it BTCPayServer.Common/ZipUtils.cs:25
- Disposable created and abandoned in the method that made it BTCPayServer.Data/Data/MigrationExtensions.cs:114
- Symbol treated as nullable, then dereferenced unguarded REDACTED:642
- Symbol treated as nullable, then dereferenced unguarded REDACTED:285
- Symbol treated as nullable, then dereferenced unguarded REDACTED:395
- Symbol treated as nullable, then dereferenced unguarded BTCPayServer/Controllers/UIStoresController.Settings.cs:426
- Symbol treated as nullable, then dereferenced unguarded BTCPayServer/Plugins/Emails/Controllers/UIStoresEmailController.cs:80
- Symbol treated as nullable, then dereferenced unguarded BTCPayServer.Data/ApplicationDbContextExtensions.cs:14
- BarePragmaDisable BTCPayServer.Data/Data/InvoiceData.Migration.cs:46
- BarePragmaDisable BTCPayServer.Data/Data/PaymentData.Migration.cs:17
- BarePragmaDisable BTCPayServer/HostedServices/DbMigrationsHostedService.cs:60
- BarePragmaDisable BTCPayServer/Payments/Bitcoin/BitcoinPaymentMethodBitpayAPIExtension.cs:55
- BarePragmaDisable BTCPayServer/Components/StoreSelector/Default.cshtml:6
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Duplicated block (7 lines × 2) REDACTED:437
- Duplicated block (7 lines × 2) BTCPayServer/Services/Stores/StoreRepository.cs:647
- Duplicated block (7 lines × 2) BTCPayServer/Controllers/UIStoresController.Roles.cs:126
- Duplicated block (7 lines × 2) REDACTED:65
- Duplicated block (7 lines × 2) REDACTED:573
- Duplicated block (6 lines × 2) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:781
- Duplicated block (6 lines × 2) BTCPayServer/Plugins/PluginManager/Controllers/UIPluginManagerController.cs:664
- Duplicated block (6 lines × 2) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:319
- Duplicated block (6 lines × 2) BTCPayServer.Data/Data/PaymentData.Migration.cs:196
- Duplicated block (6 lines × 2) BTCPayServer.Common/ZipUtils.cs:23
- Duplicated block (5 lines × 2) BTCPayServer/HostedServices/PendingTransactionService.cs:306
- Duplicated block (5 lines × 2) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:168
- Duplicated block (5 lines × 2) BTCPayServer/Plugins/PointOfSale/Views/Public/Static.cshtml:11
- Duplicated block (5 lines × 2) BTCPayServer.Abstractions/Extensions/ViewsRazor.cs:183
- Duplicated block (5 lines × 2) BTCPayServer/Plugins/Subscriptions/SubscriptionsPlugin.cs:266
- Swallowed exception (caught, then discarded) BTCPayServer/Components/StoreLightningBalance/StoreLightningBalance.cs:81
- Swallowed exception (caught, then discarded) BTCPayServer/Controllers/UIInvoiceController.UI.cs:186
- Swallowed exception (caught, then discarded) BTCPayServer/DerivationSchemeParser.cs:320
- Swallowed exception (caught, then discarded) BTCPayServer/Extensions.cs:651
- Swallowed exception (caught, then discarded) BTCPayServer/Payments/Lightning/LightningPendingPayoutListener.cs:109
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Duplicated block (14 lines × 2) BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:148
- Duplicated block (14 lines × 2) BTCPayServer/Plugins/Crowdfund/Models/UpdateCrowdfundViewModel.cs:15
- Duplicated block (14 lines × 2) BTCPayServer/DerivationSchemeParser.cs:161
- Duplicated block (14 lines × 2) REDACTED:168
- Duplicated block (9 lines × 2) BTCPayServer/Controllers/UIServerController.Users.cs:501
- Duplicated block (9 lines × 2) BTCPayServer/Plugins/Translations/Controllers/UITranslationController.cs:269
- Duplicated block (9 lines × 2) BTCPayServer.Data/Data/MigrationExtensions.cs:134
- Duplicated block (9 lines × 2) BTCPayServer/Plugins/DynamicDNS/Controllers/UIDynamicDnsController.cs:66
- Heading level jumps from h4 to h6 REDACTED:302
- Heading level jumps from h4 to h6 BTCPayServer/Plugins/Subscriptions/Views/UIOffering/Offering.cshtml:49
- Heading level jumps from h4 to h6 REDACTED:400
- Anchor without href BTCPayServer/Plugins/Subscriptions/Views/UIOffering/ConfigureOffering.cshtml:95
- Anchor without href BTCPayServer/Plugins/Subscriptions/Views/UIOffering/CreateOffering.cshtml:15
- Anchor without href BTCPayServer/Views/UIFido2/Create.cshtml:49
- (anonymous)::calculation (cognitive 37) REDACTED:33
- (anonymous)::updateComputed (cognitive 29) BTCPayServer/wwwroot/crowdfund/app.js:147
- (anonymous)::keyPressed (cognitive 22) REDACTED:106
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Duplicated block (13 lines × 2) BTCPayServer/PayoutProcessors/Lightning/UILightningAutomatedPayoutProcessorsController.cs:85
- Duplicated block (13 lines × 2) BTCPayServer/Controllers/UIManageController.cs:191
- Duplicated block (13 lines × 2) BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedLightningPayoutProcessorsController.cs:78
- Duplicated block (11 lines × 2) BTCPayServer.Abstractions/Contracts/VersionCondition.cs:16
- Duplicated block (11 lines × 2) BTCPayServer/Controllers/UIUserStoresController.cs:194
- Duplicated block (11 lines × 2) BTCPayServer/Controllers/GreenField/GreenfieldStoreAutomatedLightningPayoutProcessorsController.cs:41
- Low cohesion: UIStoresController (LCOM4 8) BTCPayServer/Controllers/UIStoresController.cs:31
- Low cohesion: UIHomeController (LCOM4 4) REDACTED:29
- Low cohesion: PullPaymentHostedService (LCOM4 4) BTCPayServer/HostedServices/PullPaymentHostedService.cs:34
- Hollow method — returns a constant without doing the work BTCPayServer/Fido2/Fido2TokenProvider.cs:10
- Hollow method — returns a constant without doing the work BTCPayServer/Fido2/Fido2TokenProvider.cs:13
- Hollow method — returns a constant without doing the work BTCPayServer/Payments/IPaymentFilter.cs:39
- Sync-over-async blocking
- Sync-over-async blocking BTCPayServer/Plugins/Bitpay/Controllers/BitpayRateController.cs:155
- Sync-over-async blocking BTCPayServer.Rating/CurrencyPair.cs:16
- Recursive walk over a caller-supplied document has no depth cap BTCPayServer/Plugins/Forms/FormDataService.cs:269
- Recursive walk over a caller-supplied document has no depth cap BTCPayServer.Common/TextTemplate.cs:93
- Recursive walk over a caller-supplied document has no depth cap BTCPayServer.Common/TextTemplate.cs:123
- Data table has no header cells BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:116
- Data table has no header cells BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:185
- (anonymous)::calculation (cyclomatic 24) REDACTED:33
- (anonymous)::updateComputed (cyclomatic 18) BTCPayServer/wwwroot/crowdfund/app.js:147
- UISubscriberPortalController.SubscriberPortal (cyclomatic 22) REDACTED:36
- UISubscriberPortalController.SubscriberPortal (cyclomatic 22) REDACTED:168
- No assertions: CanConcurrentlyModifyWalletObject BTCPayServer.Tests/DatabaseTests.cs:24
- No assertions: SignTestPSBT BTCPayServer.Tests/MultisigTests.cs:34
- Depends on a live external host: CheckJsContent BTCPayServer.Tests/ThirdPartyTests.cs:470
- Depends on a live external host: CanUseTorClient REDACTED:330
- (anonymous) (cognitive 22) BTCPayServer/wwwroot/js/form-editor.js:1
- (anonymous) (cognitive 22) BTCPayServer/wwwroot/crowdfund/services/fireworks.js:1
- Duplicated block (8 lines × 2) REDACTED:272
- Duplicated block (8 lines × 2) REDACTED:456
- Unfinished stub — throws NotImplementedException BTCPayServer/PayoutProcessors/BaseAutomatedPayoutProcessor.cs:96
- Unfinished stub — throws NotImplementedException BTCPayServer/Plugins/Subscriptions/SubscriptionsPlugin.cs:279
- Both branches open with the same statements — the condition does not decide them BTCPayServer/HostedServices/PullPaymentHostedService.cs:765
- Both branches open with the same statements — the condition does not decide them BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs:104
- Empty method body — does nothing with its inputs BTCPayServer/Plugins/PluginManager/PluginService.cs:260
- Empty method body — does nothing with its inputs BTCPayServer/Plugins/PluginManager/PluginService.cs:264
- Schema created with EnsureCreated() outside the migrations BTCPayServer/HostedServices/TransactionLabelMarkerHostedService.cs:167
- Schema created with EnsureCreated() outside the migrations BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs:107
- Heading level jumps from h3 to h6 BTCPayServer/Plugins/Crowdfund/Views/Public/ViewCrowdfund.cshtml:90
- Heading level jumps from h1 to h6 BTCPayServer/Plugins/PointOfSale/Views/Public/Cart.cshtml:120
- Empty <h6> heading BTCPayServer/Views/Shared/_Footer.cshtml:56
- More than one main landmark BTCPayServer/Views/UIInvoice/Checkout.cshtml:19
- Empty <h2> heading BTCPayServer/Views/UIInvoice/Checkout.cshtml:54
- Heading level jumps from h2 to h6 BTCPayServer/Views/UIInvoice/Checkout.cshtml:89
- Modal dialog does not manage focus BTCPayServer/Plugins/Maintenance/Components/MaintenanceCommands.razor:61
- Accessibility enforcement below the top rung
- initGlobalSearch (cyclomatic 92) BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js:6
- InvoiceData.TryMigrate (cyclomatic 80) BTCPayServer.Data/Data/InvoiceData.Migration.cs:47
- PayJoinEndpointController.Submit (cyclomatic 79) REDACTED:131
- UIPointOfSaleController.ViewPointOfSale (cyclomatic 67) REDACTED:195
- initApp (cyclomatic 67) REDACTED:99
- UIWalletsController.WalletSend (cyclomatic 64) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1189
- GreenfieldStoreOnChainWalletsController.CreateOnChainTransaction (cyclomatic 54) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:344
- keypad.document.addEventListener("DOMContentLoaded") (cyclomatic 50) REDACTED:1
- paybutton.inputChanges (cyclomatic 49) BTCPayServer/wwwroot/paybutton/paybutton.js:61
- app.document.addEventListener("DOMContentLoaded") (cyclomatic 48) BTCPayServer/wwwroot/crowdfund/app.js:4
- GreenfieldInvoiceController.RefundInvoice (cyclomatic 46) BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:328
- UIWalletsController.WalletBumpFee (cyclomatic 46) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:182
- site.document.addEventListener("DOMContentLoaded") (cyclomatic 45) BTCPayServer/wwwroot/main/site.js:336
- (anonymous) (cyclomatic 45) BTCPayServer/wwwroot/main/site.js:336
- UIInvoiceController.GetCheckoutModel (cyclomatic 44) BTCPayServer/Controllers/UIInvoiceController.UI.cs:773
- GreenfieldStoresController.Validate (cyclomatic 43) BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:321
- getLostPoint (cyclomatic 42) REDACTED:124
- GreenfieldUsersController.UpdateCurrentUser (cyclomatic 38) BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs:155
- GreenfieldUsersController.CreateUser (cyclomatic 36) BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs:326
- template-editor.document.addEventListener("DOMContentLoaded") (cyclomatic 36) BTCPayServer/wwwroot/js/template-editor.js:1
- (anonymous) (cyclomatic 36) BTCPayServer/wwwroot/js/template-editor.js:1
- UIReportsController.GenerateData (cyclomatic 35) BTCPayServer/Controllers/UIReportsController.CheatMode.cs:32
- UILNURLController.GetLNURLForInvoice (cyclomatic 34) REDACTED:742
- NFCController.SubmitLNURLWithdrawForInvoice (cyclomatic 34) REDACTED:53
- UIWalletsController.FetchTransactionDetails (cyclomatic 33) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:256
- LabelService.CreateTransactionTagModels (cyclomatic 33) BTCPayServer/Services/Labels/LabelService.cs:25
- UIInvoiceController.Refund (cyclomatic 32) BTCPayServer/Controllers/UIInvoiceController.UI.cs:334
- UIWalletsController.WalletPSBTReady (cyclomatic 32) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:447
- UIServerController.Branding (cyclomatic 31) REDACTED:743
- UIServerController.User (cyclomatic 31) BTCPayServer/Controllers/UIServerController.Users.cs:112
- UIOfferingController.SubscriberSuspend (cyclomatic 31) REDACTED:107
- InvoiceRepository.GetInvoiceQuery (cyclomatic 31) BTCPayServer/Services/Invoices/InvoiceRepository.cs:718
- UIStoresController.CheckoutAppearance (cyclomatic 30) BTCPayServer/Controllers/UIStoresController.Settings.cs:266
- NBXplorerListener.UpdatePaymentStates (cyclomatic 30) BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:243
- UICrowdfundController.ContributeToCrowdfund (cyclomatic 30) REDACTED:91
- MonetizationHostedService.ProcessEvent (cyclomatic 30) BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs:50
- initLabelManager (cyclomatic 30) BTCPayServer/wwwroot/main/site.js:16
- UILNURLController.GetLNURLForPullPayment (cyclomatic 28) REDACTED:110
- InvoiceWatcher.UpdateInvoice (cyclomatic 28) BTCPayServer/HostedServices/InvoiceWatcher.cs:78
- TransactionLabelMarkerHostedService.ProcessEvent (cyclomatic 28) BTCPayServer/HostedServices/TransactionLabelMarkerHostedService.cs:38
- BitpayEndpointSelectorPolicy.IsBitpayAPI (cyclomatic 28) BTCPayServer/Plugins/Bitpay/BitpayEndpointSelectorPolicy.cs:31
- UICrowdfundController.UpdateCrowdfund (cyclomatic 28) REDACTED:410
- UIWalletsController.WalletTransactions (cyclomatic 28) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:713
- ExternalConnectionString.Expand (cyclomatic 27) BTCPayServer/Configuration/ExternalConnectionString.cs:34
- PullPaymentHostedService.HandleCreatePayout (cyclomatic 27) BTCPayServer/HostedServices/PullPaymentHostedService.cs:633
- MigrationStartupTask.ExecuteAsync (cyclomatic 27) BTCPayServer/Hosting/MigrationStartupTask.cs:86
- UIStoreOnChainWalletsController.UpdateWalletSettings (cyclomatic 27) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:515
- PluginManager.AddPlugins (cyclomatic 26) BTCPayServer/Plugins/PluginManager.cs:193
- SubscriptionHostedService.ProcessEvent (cyclomatic 25) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:53
- WalletRepository.GetWalletObjects (cyclomatic 25) BTCPayServer/Services/WalletRepository.cs:87
- GreenfieldLightningNodeApiController.PayInvoice (cyclomatic 24) BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs:233
- GreenfieldPullPaymentController.RegisterBoltcard (cyclomatic 24) REDACTED:182
- UIStorePullPaymentsController.PayoutsPost (cyclomatic 24) BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs:297
- DbMigrationsHostedService.MigratedTransactionLabels (cyclomatic 24) BTCPayServer/HostedServices/DbMigrationsHostedService.cs:100
- MigrationStartupTask.ParsePOSYML (cyclomatic 24) BTCPayServer/Hosting/MigrationStartupTask.cs:442
- SubscriptionHostedService.ProcessSubscriptionPayment (cyclomatic 24) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:445
- PaymentRequestRepository.FindPaymentRequests (cyclomatic 24) BTCPayServer/Services/PaymentRequests/PaymentRequestRepository.cs:142
- PaymentData.TryMigrate (cyclomatic 24) BTCPayServer.Data/Data/PaymentData.Migration.cs:15
- (anonymous) (cyclomatic 24) BTCPayServer/wwwroot/payment-request/app.js:4
- UIStoresController.GeneralSettings (cyclomatic 23) BTCPayServer/Controllers/UIStoresController.Settings.cs:56
- UIOfferingController.Offering (cyclomatic 23) REDACTED:324
- UIPullPaymentController.ClaimPullPayment (cyclomatic 22) REDACTED:169
- LightningLikePaymentHandler.ValidatePaymentMethodConfig (cyclomatic 22) BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs:265
- LightningPendingPayoutListener.Act (cyclomatic 22) BTCPayServer/Payments/Lightning/LightningPendingPayoutListener.cs:53
- LightningAutomatedPayoutProcessor.TrypayBolt (cyclomatic 22) BTCPayServer/PayoutProcessors/Lightning/LightningAutomatedPayoutProcessor.cs:188
- GreenfieldOfferingController.CreatePlanCheckout (cyclomatic 22) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:492
- GreenfieldPullPaymentController.CreatePullPayment (cyclomatic 21) REDACTED:80
- GreenfieldReportsController.StoreReports (cyclomatic 21) BTCPayServer/Controllers/GreenField/GreenfieldReportsController.cs:40
- UIAccountController.Login (cyclomatic 21) REDACTED:135
- UIServerController.Service (cyclomatic 21) REDACTED:374
- NBXplorerListener.Listen (cyclomatic 21) BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:113
- UIServerMonetizationController.Monetization (cyclomatic 21) BTCPayServer/Plugins/Monetization/Controllers/UIServerMonetizationController.cs:147
- SubscriptionHostedService.UpdateSubscriptionStates (cyclomatic 21) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:274
- UIStoreOnChainWalletsController.UpdateWalletCore (cyclomatic 21) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:135
- SetContextFilter.OnActionExecutionAsync (cyclomatic 21) BTCPayServer/Security/SetContextFilter.cs:25
- form-editor.document.addEventListener("DOMContentLoaded") (cyclomatic 21) BTCPayServer/wwwroot/js/form-editor.js:1
- (anonymous) (cyclomatic 21) BTCPayServer/wwwroot/js/form-editor.js:1
- GreenfieldInvoiceController.CreateInvoice (cyclomatic 20) BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:169
- GreenfieldPaymentRequestsController.CreateOrUpdatePaymentRequest (cyclomatic 20) BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs:147
- UIManageController.Index (cyclomatic 20) BTCPayServer/Controllers/UIManageController.cs:137
- ContentSecurityPolicyAttribute.OnActionExecuting (cyclomatic 20) BTCPayServer/Filters/ContentSecurityPolicyAttribute.cs:46
- NBXplorerWaiter.StepAsync (cyclomatic 20) BTCPayServer/HostedServices/NBXplorerWaiter.cs:138
- BitcoinCheckoutModelExtension.ModifyCheckoutModel (cyclomatic 20) BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs:44
- (anonymous) (cyclomatic 20) REDACTED:273
- HWIController.Run (cyclomatic 19) BTCPayServer/Blazor/VaultBridge/HWIController.cs:37
- BTCPayServerServices.AddBTCPayServer (cyclomatic 19) BTCPayServer/Hosting/BTCPayServerServices.cs:87
- OnChainAutomatedPayoutProcessor.Process (cyclomatic 19) BTCPayServer/PayoutProcessors/OnChain/OnChainAutomatedPayoutProcessor.cs:72
- UIOfferingController.AddPlan (cyclomatic 19) REDACTED:621
- SqlStoreScopeProvider.GetStoreId (cyclomatic 19) BTCPayServer/Security/BuiltInPermissionScopeProvider.cs:39
- SSRFAllowedDestination.Parse (cyclomatic 19) BTCPayServer/SSRFAllowedDestination.cs:28
- fireworks.document.addEventListener("DOMContentLoaded") (cyclomatic 19) BTCPayServer/wwwroot/crowdfund/services/fireworks.js:1
- setupPositionProbePattern (cyclomatic 19) REDACTED:91
- (anonymous) (cyclomatic 19) BTCPayServer/wwwroot/crowdfund/services/fireworks.js:1
- GreenfieldPullPaymentController.CreatePayoutThroughStore (cyclomatic 18) REDACTED:480
- UILNURLController.GetLNURLForApp (cyclomatic 18) REDACTED:270
- UIManageController.AuthorizeAPIKey (cyclomatic 18) BTCPayServer/Controllers/UIManageController.APIKeys.cs:178
- UIPaymentRequestController.EditPaymentRequest (cyclomatic 18) REDACTED:235
- UIPaymentRequestController.PayPaymentRequest (cyclomatic 18) REDACTED:413
- Extensions.TryParseLegacy (cyclomatic 18) BTCPayServer/Extensions.cs:286
- PullPaymentHostedService.GetPayouts (cyclomatic 18) BTCPayServer/HostedServices/PullPaymentHostedService.cs:190
- UIWalletsController.WalletActions (cyclomatic 18) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1995
- BuiltInPermissionHandler.HandleAsync (cyclomatic 18) BTCPayServer/Security/BuiltInPermissionHandler.cs:27
- BTCPayWallet.FetchTransactionHistory (cyclomatic 18) BTCPayServer/Services/Wallets/BTCPayWallet.cs:254
- BTCPayWallet.GetBumpableTransactions (cyclomatic 18) BTCPayServer/Services/Wallets/BTCPayWallet.cs:324
- NumericStringJsonConverter.ReadJson (cyclomatic 18) BTCPayServer.Client/JsonConverters/NumericStringJsonConverter.cs:18
- BTCPayServerOptions.LoadArgs (cyclomatic 17) BTCPayServer/Configuration/BTCPayServerOptions.cs:57
- GreenfieldAppsController.ValidateCrowdfundAppRequest (cyclomatic 17) BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:537
- UIInvoiceController.CreateInvoiceCoreRaw (cyclomatic 17) BTCPayServer/Controllers/UIInvoiceController.cs:207
- UIServerController.LndServices (cyclomatic 17) REDACTED:517
- UIStoresController.Rates (cyclomatic 17) BTCPayServer/Controllers/UIStoresController.Rates.cs:30
- UIStoresController.StoreUsers (cyclomatic 17) BTCPayServer/Controllers/UIStoresController.Users.cs:32
- BitcoinLikePaymentHandler.ConfigurePrompt (cyclomatic 17) BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs:134
- UIStoreOnChainWalletsController.GenerateWallet (cyclomatic 17) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:306
- getLengthInBits (cyclomatic 17) REDACTED:124
- ExternalConnectionString.TryParse (cyclomatic 16) BTCPayServer/Configuration/ExternalConnectionString.cs:153
- GreenfieldStoreUsersController.GetStoreUserRequest (cyclomatic 16) BTCPayServer/Controllers/GreenField/GreenfieldStoreUsersController.cs:200
- UIManageController.CheckForMatchingApiKey (cyclomatic 16) BTCPayServer/Controllers/UIManageController.APIKeys.cs:315
- UIManageController.AdjustVMForAuthorization (cyclomatic 16) BTCPayServer/Controllers/UIManageController.APIKeys.cs:374
- Extensions.TryParseXpub (cyclomatic 16) BTCPayServer/Extensions.cs:153
- Extensions.IsSafeLightningConnectionString (cyclomatic 16) BTCPayServer/Extensions.cs:401
- FileTypeDetector.IsFileType (cyclomatic 16) BTCPayServer/FileTypeDetector.cs:73
- CrowdfundAppType.GetInfo (cyclomatic 16) BTCPayServer/Plugins/Crowdfund/CrowdfundPlugin.cs:121
- PluginManager.ExecuteCommand (cyclomatic 16) BTCPayServer/Plugins/PluginManager.cs:530
- GreenfieldOfferingController.CreateOfferingPlan (cyclomatic 16) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:156
- UIWalletsController.MatchesWalletTransactionFilter (cyclomatic 16) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:649
- UIWalletsController.SignWithSeed (cyclomatic 16) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1740
- InvoicesReportProvider.FlattenFields (cyclomatic 16) BTCPayServer/Services/Reporting/InvoicesReportProvider.cs:232
- OnChainWalletReportProvider.Query (cyclomatic 16) BTCPayServer/Services/Reporting/OnChainWalletReportProvider.cs:60
- wallet-transactions-columns.wire (cyclomatic 16) REDACTED:193
- site.initGlobalNavTooltips (cyclomatic 16) BTCPayServer/wwwroot/main/site.js:261
- Skipped test: CanQueryMempoolFeeProvider BTCPayServer.Tests/ThirdPartyTests.cs:75
- BarePragmaDisable repeated across 10 files BTCPayServer.Data/Data/AddressInvoiceData.cs:19
- BareSuppressMessage BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:252
- InvoiceData.TryMigrate (cognitive 119) BTCPayServer.Data/Data/InvoiceData.Migration.cs:47
- PayJoinEndpointController.Submit (cognitive 109) REDACTED:131
- initGlobalSearch (cognitive 97) BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js:6
- UIWalletsController.WalletSend (cognitive 94) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1189
- getLostPoint (cognitive 84) REDACTED:124
- UIPointOfSaleController.ViewPointOfSale (cognitive 74) REDACTED:195
- initApp (cognitive 74) REDACTED:99
- DbMigrationsHostedService.MigratedTransactionLabels (cognitive 73) BTCPayServer/HostedServices/DbMigrationsHostedService.cs:100
- inputChanges (cognitive 72) BTCPayServer/wwwroot/paybutton/paybutton.js:61
- keypad.document.addEventListener("DOMContentLoaded") (cognitive 69) REDACTED:1
- GreenfieldStoreOnChainWalletsController.CreateOnChainTransaction (cognitive 68) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:344
- TransactionLabelMarkerHostedService.ProcessEvent (cognitive 66) BTCPayServer/HostedServices/TransactionLabelMarkerHostedService.cs:38
- UILNURLController.GetLNURLForInvoice (cognitive 62) REDACTED:742
- site.document.addEventListener("DOMContentLoaded") (cognitive 60) BTCPayServer/wwwroot/main/site.js:336
- (anonymous) (cognitive 60) BTCPayServer/wwwroot/main/site.js:336
- UIWalletsController.WalletBumpFee (cognitive 55) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:182
- MonetizationHostedService.ProcessEvent (cognitive 54) BTCPayServer/Plugins/Monetization/MonetizationHostedService.cs:50
- UIWalletsController.FetchTransactionDetails (cognitive 54) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:256
- GreenfieldInvoiceController.RefundInvoice (cognitive 53) BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:328
- LabelService.CreateTransactionTagModels (cognitive 53) BTCPayServer/Services/Labels/LabelService.cs:25
- NBXplorerListener.UpdatePaymentStates (cognitive 52) BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:243
- LightningPendingPayoutListener.Act (cognitive 52) BTCPayServer/Payments/Lightning/LightningPendingPayoutListener.cs:53
- UIWalletsController.WalletTransactions (cognitive 52) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:713
- NBXplorerListener.Listen (cognitive 51) BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:113
- GreenfieldUsersController.UpdateCurrentUser (cognitive 49) BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs:155
- UIServerController.Branding (cognitive 49) REDACTED:743
- GreenfieldStoresController.Validate (cognitive 48) BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs:321
- UIInvoiceController.Refund (cognitive 48) BTCPayServer/Controllers/UIInvoiceController.UI.cs:334
- NFCController.SubmitLNURLWithdrawForInvoice (cognitive 48) REDACTED:53
- ExternalConnectionString.Expand (cognitive 47) BTCPayServer/Configuration/ExternalConnectionString.cs:34
- UIStoresController.CheckoutAppearance (cognitive 47) BTCPayServer/Controllers/UIStoresController.Settings.cs:266
- SubscriptionHostedService.ProcessEvent (cognitive 47) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:53
- GreenfieldUsersController.CreateUser (cognitive 45) BTCPayServer/Controllers/GreenField/GreenfieldUsersController.cs:326
- InvoiceWatcher.UpdateInvoice (cognitive 45) BTCPayServer/HostedServices/InvoiceWatcher.cs:78
- UICrowdfundController.ContributeToCrowdfund (cognitive 44) REDACTED:91
- UIInvoiceController.GetCheckoutModel (cognitive 43) BTCPayServer/Controllers/UIInvoiceController.UI.cs:773
- MigrationStartupTask.ParsePOSYML (cognitive 43) BTCPayServer/Hosting/MigrationStartupTask.cs:442
- (anonymous) (cognitive 43) BTCPayServer/wwwroot/js/template-editor.js:1
- UIStoresController.StoreUsers (cognitive 42) BTCPayServer/Controllers/UIStoresController.Users.cs:32
- PluginManager.AddPlugins (cognitive 42) BTCPayServer/Plugins/PluginManager.cs:193
- SubscriptionHostedService.UpdateSubscriptionStates (cognitive 42) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:274
- UIStoreOnChainWalletsController.UpdateWalletSettings (cognitive 42) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:515
- SqlStoreScopeProvider.GetStoreId (cognitive 42) BTCPayServer/Security/BuiltInPermissionScopeProvider.cs:39
- template-editor.document.addEventListener("DOMContentLoaded") (cognitive 42) BTCPayServer/wwwroot/js/template-editor.js:1
- UIWalletsController.WalletPSBTReady (cognitive 41) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:447
- UIOfferingController.SubscriberSuspend (cognitive 40) REDACTED:107
- MigrationStartupTask.TransitionInternalNodeConnectionString (cognitive 39) BTCPayServer/Hosting/MigrationStartupTask.cs:821
- InvoiceRepository.GetInvoiceQuery (cognitive 37) BTCPayServer/Services/Invoices/InvoiceRepository.cs:718
- WalletRepository.GetWalletObjects (cognitive 37) BTCPayServer/Services/WalletRepository.cs:87
- UIStoresController.Rates (cognitive 36) BTCPayServer/Controllers/UIStoresController.Rates.cs:30
- UIServerMonetizationController.Monetization (cognitive 36) BTCPayServer/Plugins/Monetization/Controllers/UIServerMonetizationController.cs:147
- SetContextFilter.OnActionExecutionAsync (cognitive 36) BTCPayServer/Security/SetContextFilter.cs:25
- UIStorePullPaymentsController.PayoutsPost (cognitive 35) BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs:297
- FileTypeDetector.IsFileType (cognitive 35) BTCPayServer/FileTypeDetector.cs:73
- UIStoreOnChainWalletsController.UpdateWalletCore (cognitive 35) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:135
- BTCPayWallet.FetchTransactionHistory (cognitive 35) BTCPayServer/Services/Wallets/BTCPayWallet.cs:254
- UIServerController.User (cognitive 34) BTCPayServer/Controllers/UIServerController.Users.cs:112
- OnChainWalletReportProvider.Query (cognitive 34) BTCPayServer/Services/Reporting/OnChainWalletReportProvider.cs:60
- initLabelManager (cognitive 34) BTCPayServer/wwwroot/main/site.js:16
- PullPaymentHostedService.HandleCreatePayout (cognitive 33) BTCPayServer/HostedServices/PullPaymentHostedService.cs:633
- LightningListener.CreateNewLNInvoiceForBTCPayInvoice (cognitive 33) BTCPayServer/Payments/Lightning/LightningListener.cs:290
- PaymentData.TryMigrate (cognitive 32) BTCPayServer.Data/Data/PaymentData.Migration.cs:15
- GreenfieldPaymentRequestsController.CreateOrUpdatePaymentRequest (cognitive 31) BTCPayServer/Controllers/GreenField/GreenfieldPaymentRequestsController.cs:147
- GreenfieldPullPaymentController.RegisterBoltcard (cognitive 31) REDACTED:182
- UIReportsController.GenerateData (cognitive 31) BTCPayServer/Controllers/UIReportsController.CheatMode.cs:32
- BTCPayServerServices.AddBTCPayServer (cognitive 31) BTCPayServer/Hosting/BTCPayServerServices.cs:87
- LightningListener.CheckingInvoice (cognitive 31) BTCPayServer/Payments/Lightning/LightningListener.cs:72
- OnChainAutomatedPayoutProcessor.Process (cognitive 31) BTCPayServer/PayoutProcessors/OnChain/OnChainAutomatedPayoutProcessor.cs:72
- PluginManager.ExecuteCommand (cognitive 31) BTCPayServer/Plugins/PluginManager.cs:530
- datatable.groupBy (cognitive 31) REDACTED:3
- mapData (cognitive 31) REDACTED:100
- UIStoresController.GeneralSettings (cognitive 30) BTCPayServer/Controllers/UIStoresController.Settings.cs:56
- LightningLikePaymentHandler.ValidatePaymentMethodConfig (cognitive 30) BTCPayServer/Payments/Lightning/LightningLikePaymentHandler.cs:265
- SubscriptionHostedService.ProcessSubscriptionPayment (cognitive 30) BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:445
- (anonymous) (cognitive 30) BTCPayServer/wwwroot/payment-request/app.js:4
- BitcoinCheckoutModelExtension.ModifyCheckoutModel (cognitive 29) BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs:44
- UIOfferingController.Offering (cognitive 29) REDACTED:324
- UISubscriberPortalController.SubscriberPortal (cognitive 29) REDACTED:168
- InvoicesReportProvider.FlattenFields (cognitive 29) BTCPayServer/Services/Reporting/InvoicesReportProvider.cs:232
- SSRFAllowedDestination.Parse (cognitive 29) BTCPayServer/SSRFAllowedDestination.cs:28
- (anonymous) (cognitive 29) REDACTED:273
- GreenfieldPullPaymentController.CreatePullPayment (cognitive 28) REDACTED:80
- MigrationStartupTask.ExecuteAsync (cognitive 28) BTCPayServer/Hosting/MigrationStartupTask.cs:86
- UICrowdfundController.UpdateCrowdfund (cognitive 28) REDACTED:410
- BuiltInPermissionHandler.HandleAsync (cognitive 28) BTCPayServer/Security/BuiltInPermissionHandler.cs:27
- BTCPayServerOptions.LoadArgs (cognitive 27) BTCPayServer/Configuration/BTCPayServerOptions.cs:57
- UILNURLController.EditLightningAddress (cognitive 27) REDACTED:952
- UIManageController.Index (cognitive 27) BTCPayServer/Controllers/UIManageController.cs:137
- UILNURLController.GetLNURLForPullPayment (cognitive 26) REDACTED:110
- UIManageController.CheckForMatchingApiKey (cognitive 26) BTCPayServer/Controllers/UIManageController.APIKeys.cs:315
- NBXplorerWaiter.StepAsync (cognitive 26) BTCPayServer/HostedServices/NBXplorerWaiter.cs:138
- GreenfieldPullPaymentController.CreatePayoutThroughStore (cognitive 25) REDACTED:480
- UIManageController.AuthorizeAPIKey (cognitive 25) BTCPayServer/Controllers/UIManageController.APIKeys.cs:178
- UIManageController.AdjustVMForAuthorization (cognitive 25) BTCPayServer/Controllers/UIManageController.APIKeys.cs:374
- UIPullPaymentController.ClaimPullPayment (cognitive 25) REDACTED:169
- UIServerController.Policies (cognitive 25) REDACTED:179
- PullPaymentHostedService.GetPayouts (cognitive 25) BTCPayServer/HostedServices/PullPaymentHostedService.cs:190
- GreenfieldStoreOnChainWalletsController.ShowOnChainWalletTransactions (cognitive 25) BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:167
- UIInvoiceController.CreateInvoiceCoreRaw (cognitive 24) BTCPayServer/Controllers/UIInvoiceController.cs:207
- DerivationSchemeParser.Parse (cognitive 24) BTCPayServer/DerivationSchemeParser.cs:258
- PaymentRequestRepository.FindPaymentRequests (cognitive 24) BTCPayServer/Services/PaymentRequests/PaymentRequestRepository.cs:142
- GreenfieldInvoiceController.CreateInvoice (cognitive 23) BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:169
- UIAccountController.Login (cognitive 23) REDACTED:135
- ContentSecurityPolicyAttribute.OnActionExecuting (cognitive 23) BTCPayServer/Filters/ContentSecurityPolicyAttribute.cs:46
- LightningAutomatedPayoutProcessor.TrypayBolt (cognitive 23) BTCPayServer/PayoutProcessors/Lightning/LightningAutomatedPayoutProcessor.cs:188
- UIPlanCheckoutController.PlanCheckout (cognitive 23) REDACTED:75
- FlattenExpressionRewriter.VisitIdentifierName (cognitive 23) BTCPayServer.Rating/RateRules.cs:462
- UIPaymentRequestController.PayPaymentRequest (cognitive 22) REDACTED:413
- Extensions.TryParseLegacy (cognitive 22) BTCPayServer/Extensions.cs:286
- EventHostedServiceBase.ProcessEvents (cognitive 22) BTCPayServer/HostedServices/EventHostedServiceBase.cs:37
- InvoiceWatcher.StartLoop (cognitive 22) BTCPayServer/HostedServices/InvoiceWatcher.cs:275
- NBXplorerListener.FindPaymentViaPolling (cognitive 22) BTCPayServer/Payments/Bitcoin/NBXplorerListener.cs:381
- BitpayEndpointSelectorPolicy.IsBitpayAPI (cognitive 22) BTCPayServer/Plugins/Bitpay/BitpayEndpointSelectorPolicy.cs:31
- StoreEmailRuleProcessorSender.ProcessEvent (cognitive 22) REDACTED:61
- FormDataService.GenerateInvoiceParametersFromForm (cognitive 22) BTCPayServer/Plugins/Forms/FormDataService.cs:167
- NumericStringJsonConverter.ReadJson (cognitive 22) BTCPayServer.Client/JsonConverters/NumericStringJsonConverter.cs:18
- PermissionTagHelper.ProcessAsync (cognitive 22) BTCPayServer.Abstractions/TagHelpers/PermissionTagHelper.cs:20
- UrlResolutionTagHelper2.ProcessUrlAttribute (cognitive 22) BTCPayServer.Abstractions/TagHelpers/UrlResolutionTagHelper2.cs:114
- form-editor.document.addEventListener("DOMContentLoaded") (cognitive 22) BTCPayServer/wwwroot/js/form-editor.js:1
- UIInvoiceController.InvoiceReceipt (cognitive 21) BTCPayServer/Controllers/UIInvoiceController.UI.cs:197
- Extensions.TryParseXpub (cognitive 21) BTCPayServer/Extensions.cs:153
- InvoiceCreationContext.FetchingRates (cognitive 21) BTCPayServer/Payments/IPaymentMethodHandler.cs:200
- GreenfieldOfferingController.CreatePlanCheckout (cognitive 21) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:492
- BTCPayWallet.GetBumpableTransactions (cognitive 21) BTCPayServer/Services/Wallets/BTCPayWallet.cs:324
- site.initGlobalNavTooltips (cognitive 21) BTCPayServer/wwwroot/main/site.js:261
- setupPositionAdjustPattern (cognitive 21) REDACTED:96
- createBytes (cognitive 21) REDACTED:115
- GreenfieldLightningNodeApiController.PayInvoice (cognitive 20) BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.cs:233
- GreenfieldStoreUsersController.GetStoreUserRequest (cognitive 20) BTCPayServer/Controllers/GreenField/GreenfieldStoreUsersController.cs:200
- UIInvoiceController.MassAction (cognitive 20) BTCPayServer/Controllers/UIInvoiceController.UI.cs:651
- PendingTransactionService.ProcessEvent (cognitive 20) BTCPayServer/HostedServices/PendingTransactionService.cs:37
- BitcoinLikePaymentHandler.ConfigurePrompt (cognitive 20) BTCPayServer/Payments/Bitcoin/BitcoinLikePaymentHandler.cs:134
- PosReceiptData.UpdateTotals (cognitive 20) BTCPayServer/Services/Invoices/PosReceiptData.cs:23
- HWIController.Run (cognitive 19) BTCPayServer/Blazor/VaultBridge/HWIController.cs:37
- GreenfieldAppsController.ValidateCrowdfundAppRequest (cognitive 19) BTCPayServer/Controllers/GreenField/GreenfieldAppsController.cs:537
- GreenfieldReportsController.StoreReports (cognitive 19) BTCPayServer/Controllers/GreenField/GreenfieldReportsController.cs:40
- GreenfieldStoreRateConfigurationController.ValidateAndSanitizeConfiguration (cognitive 19) BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs:178
- UIEmailControllerBase.EmailSettingsCore (cognitive 19) BTCPayServer/Plugins/Emails/Controllers/UIEmailControllerBase.cs:41
- GreenfieldOfferingController.CreateOfferingPlan (cognitive 19) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:156
- WalletSearchResultProvider.ProvideAsync (cognitive 19) BTCPayServer/Plugins/Wallets/WalletSearchResultProvider.cs:25
- setupPositionProbePattern (cognitive 19) REDACTED:91
- UIPaymentRequestController.EditPaymentRequest (cognitive 18) REDACTED:235
- WalletTransactionInfo.LegacyLabels.get (cognitive 18) BTCPayServer/Data/WalletTransactionInfo.cs:36
- GreenfieldOfferingController.UpdateOfferingPlan (cognitive 18) BTCPayServer/Plugins/Subscriptions/Controllers/GreenfieldOfferingController.cs:226
- LoadTranslationsStartupTask.ExecuteAsync (cognitive 18) BTCPayServer/Plugins/Translations/LoadTranslationsStartupTask.cs:33
- UIStoreOnChainWalletsController.GenerateWallet (cognitive 18) BTCPayServer/Plugins/Wallets/Controllers/UIStoreOnChainWalletsController.cs:306
- PaymentRequestsReportProvider.Query (cognitive 18) BTCPayServer/Services/Reporting/PaymentRequestsReportProvider.cs:67
- TextTemplate.GetAvailablePaths (cognitive 18) BTCPayServer.Common/TextTemplate.cs:84
- MigrationExtensions.GetProperty (cognitive 18) BTCPayServer.Data/Data/MigrationExtensions.cs:44
- BTCPayServerClient.HandleResponse (cognitive 18) BTCPayServer.Client/BTCPayServerClient.cs:50
- app.document.addEventListener("DOMContentLoaded") (cognitive 18) BTCPayServer/wwwroot/crowdfund/app.js:4
- datatable.makeTree (cognitive 18) REDACTED:118
- MainNav.InvokeAsync (cognitive 17) BTCPayServer/Components/MainNav/MainNav.cs:31
- ConfigurationExtensions.GetOrDefault (cognitive 17) BTCPayServer/Configuration/ConfigurationExtensions.cs:11
- ExternalConnectionString.TryParse (cognitive 17) BTCPayServer/Configuration/ExternalConnectionString.cs:153
- UIPaymentRequestController.ViewPaymentRequestForm (cognitive 17) REDACTED:352
- UIStorePullPaymentsController.Payouts (cognitive 17) BTCPayServer/Controllers/UIStorePullPaymentsController.PullPayments.cs:521
- Extensions.IsPublicAddress (cognitive 17) BTCPayServer/Extensions.cs:734
- DbMigrationsHostedService.GetBlobInfo (cognitive 17) BTCPayServer/HostedServices/DbMigrationsHostedService.cs:68
- InvoiceBlobMigratorHostedService.ProcessEntities (cognitive 17) BTCPayServer/HostedServices/InvoiceBlobMigratorHostedService.cs:42
- LightningAutomatedPayoutProcessor.HandlePayout (cognitive 17) BTCPayServer/PayoutProcessors/Lightning/LightningAutomatedPayoutProcessor.cs:66
- BitpayAccessTokenController.Tokens (cognitive 17) REDACTED:28
- MonetizationLoginExtension.Check (cognitive 17) BTCPayServer/Plugins/Monetization/MonetizationLoginExtension.cs:16
- UIPluginManagerController.CreateInstalledPluginCardViewModel (cognitive 17) BTCPayServer/Plugins/PluginManager/Controllers/UIPluginManagerController.cs:460
- UISubscriberPortalController.SubscriberPortal (cognitive 17) REDACTED:36
- UIWalletsController.SignWithSeed (cognitive 17) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1740
- UIWalletsController.WalletActions (cognitive 17) BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1995
- BasicAuthenticationHandler.HandleAuthenticateAsync (cognitive 17) BTCPayServer/Security/GreenField/BasicAuthenticationHandler.cs:34
- InvoiceActivator.ActivateInvoicePaymentMethod (cognitive 17) BTCPayServer/Services/InvoiceActivator.cs:37
- ProductsReportProvider.Query (cognitive 17) BTCPayServer/Services/Reporting/ProductsReportProvider.cs:27
- wallet-transactions-columns.wire (cognitive 17) REDACTED:193
- UIInvoiceController.Invoice (cognitive 16) BTCPayServer/Controllers/UIInvoiceController.UI.cs:100
- UIServerController.CreateUser (cognitive 16) BTCPayServer/Controllers/UIServerController.Users.cs:269
- PullPaymentHostedService.Loop (cognitive 16) BTCPayServer/HostedServices/PullPaymentHostedService.cs:383
- PullPaymentHostedService.HandleCancel (cognitive 16) BTCPayServer/HostedServices/PullPaymentHostedService.cs:806
- PayJoinEndpointController.SelectUTXO (cognitive 16) REDACTED:622
- BitpayAuthorizationHandler.HandleRequirementAsync (cognitive 16) BTCPayServer/Plugins/Bitpay/Security/BitpayAuthorizationHandler.cs:19
- UIPluginManagerController.GetRequiredPluginIdentifiers (cognitive 16) BTCPayServer/Plugins/PluginManager/Controllers/UIPluginManagerController.cs:352
- UIOfferingController.AddPlan (cognitive 16) REDACTED:621
- UISubscriberPortalController.MoveTime (cognitive 16) REDACTED:264
- UITranslationController.EditTranslation (cognitive 16) BTCPayServer/Plugins/Translations/Controllers/UITranslationController.cs:146
- PaymentsReportProvider.Query (cognitive 16) BTCPayServer/Services/Reporting/PaymentsReportProvider.cs:93
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- Change-coupling hub: UIInvoiceController.UI.cs → CheckoutAppearanceViewModel.cs, BitcoinLikePaymentData.cs, BitpayCreateInvoiceRequest.cs BTCPayServer/Controllers/UIInvoiceController.UI.cs
- REDACTED
- REDACTED
- Duplicated block (22 lines × 2) BTCPayServer/PayoutProcessors/Lightning/UILightningAutomatedPayoutProcessorsController.cs:41
- Duplicated block (17 lines × 2) BTCPayServer/Models/StoreViewModels/GeneralSettingsViewModel.cs:42
- Duplicated block (18 lines × 2) BTCPayServer/Controllers/GreenField/GreenfieldStoreRatesConfigurationController.cs:131
- Duplicated block (19 lines × 2) BTCPayServer/Controllers/UIServerController.Roles.cs:24
- Duplicated block (14–15 lines × 2) BTCPayServer/Models/AccountViewModels/RegisterViewModel.cs:6
- Duplicated block (11–13 lines × 2) BTCPayServer/Controllers/UIInvoiceController.UI.cs:384
- Duplicated block (12 lines × 2) BTCPayServer/Controllers/GreenField/GreenfieldInvoiceController.cs:509
- Duplicated block (11–12 lines × 2) BTCPayServer.Data/Data/InvoiceData.Migration.cs:48
- Duplicated block (9 lines × 3) BTCPayServer/Controllers/UIServerController.Users.cs:480
- Off the main sequence: BTCPayServer.Client BTCPayServer.Client/BTCPayServer.Client.csproj:1
- Both branches are identical — the condition decides nothing BTCPayServer/Plugins/Altcoins/AltcoinsPlugin.Dogecoin.cs:29
- Unfinished stub — throws NotImplementedException BTCPayServer/Plugins/Subscriptions/SubscriptionsPlugin.cs:279
- SAST runs, but gates no merge
- NuGet dependencies are not locked
- Sync-over-async (deadlock risk) BTCPayServer.Rating/CurrencyPair.cs:16
- Sync-over-async (deadlock risk) through `.Wait(…)` BTCPayServer.Common/Logging/ConsoleLogger.cs:411
- Disposes a dependency it does not own BTCPayServer/Plugins/Subscriptions/SubscriptionContext.cs:122
Minor — 160 finding(s)
- Interpolated log message defeats structured logging BTCPayServer/Configuration/BTCPayServerOptions.cs:61
- Interpolated log message defeats structured logging BTCPayServer/Configuration/BTCPayServerOptions.cs:108
- Interpolated log message defeats structured logging BTCPayServer/Configuration/BTCPayServerOptions.cs:109
- Interpolated log message defeats structured logging BTCPayServer/ExplorerClientProvider.cs:50
- Interpolated log message defeats structured logging BTCPayServer/ExplorerClientProvider.cs:51
- Interpolated log message defeats structured logging BTCPayServer/ExplorerClientProvider.cs:69
- Interpolated log message defeats structured logging BTCPayServer/ExplorerClientProvider.cs:75
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/BaseAsyncService.cs:36
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/BaseAsyncService.cs:62
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/BaseAsyncService.cs:81
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/BlobMigratorHostedService.cs:55
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/DbMigrationsHostedService.cs:126
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/DbMigrationsHostedService.cs:295
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/DbMigrationsHostedService.cs:298
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/DbPeriodicTask.cs:49
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/DbPeriodicTask.cs:54
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/EventHostedServiceBase.cs:75
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/InvoiceWatcher.cs:187
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/InvoiceWatcher.cs:313
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/NBXplorerWaiter.cs:115
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/NBXplorerWaiter.cs:130
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/NBXplorerWaiter.cs:206
- Interpolated log message defeats structured logging BTCPayServer/HostedServices/PeriodicTaskLauncherHostedService.cs:55
- Interpolated log message defeats structured logging BTCPayServer/Hosting/BTCPayServerServices.cs:242
- Interpolated log message defeats structured logging BTCPayServer/Hosting/BTCPayServerServices.cs:265
- ObsoleteWithoutCallers BTCPayServer.Data/Data/PairingCodeData.cs:9
- ObsoleteWithoutCallers REDACTED:2300
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeParser.cs:25
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeSettings.cs:50
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeSettings.cs:72
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeSettings.cs:87
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeSettings.cs:91
- ObsoleteWithoutCallers BTCPayServer/DerivationSchemeSettings.cs:95
- ObsoleteWithoutCallers BTCPayServer/Extensions.cs:398
- ObsoleteWithoutCallers BTCPayServer/Filters/XFrameOptionsAttribute.cs:13
- ObsoleteWithoutCallers BTCPayServer/Hosting/BTCPayServerServices.cs:914
- ObsoleteWithoutCallers BTCPayServer/Plugins/GlobalSearch/StaticSearchResultProvider.cs:25
- ObsoleteWithoutCallers BTCPayServer/Plugins/GlobalSearch/Views/GlobalSearchViewModel.cs:48
- ObsoleteWithoutCallers BTCPayServer/SearchString.cs:62
- ObsoleteWithoutCallers BTCPayServer/SearchString.cs:87
- ObsoleteWithoutCallers BTCPayServer/Security/SecurityExtensions.cs:9
- ObsoleteWithoutCallers BTCPayServer/Services/Invoices/InvoiceRepository.cs:536
- ObsoleteWithoutCallers BTCPayServer/Services/Invoices/InvoiceRepository.cs:685
- ObsoleteWithoutCallers BTCPayServer/Services/UserService.cs:241
- ObsoleteWithoutCallers BTCPayServer/Views/UIStores/StoreNavPages.cs:27
- Commented-out code BTCPayServer.Common/Logging/ConsoleLogger.cs:189
- Commented-out code BTCPayServer.Data/ApplicationDbContext.cs:83
- Commented-out code BTCPayServer.Data/ApplicationDbContext.cs:88
- Commented-out code BTCPayServer.Data/ApplicationDbContext.cs:91
- Commented-out code BTCPayServer.Data/ApplicationDbContext.cs:95
- Commented-out code BTCPayServer.Data/ApplicationDbContext.cs:107
- Commented-out code BTCPayServer/Fido2/Fido2Service.cs:69
- Commented-out code BTCPayServer/Hosting/BTCPayServerServices.cs:803
- Commented-out code BTCPayServer/Hosting/BTCPayServerServices.cs:804
- Commented-out code BTCPayServer/Hosting/BTCPayServerServices.cs:805
- Commented-out code BTCPayServer/JsonConverters/PaymentMethodIdJsonConverter.cs:20
- Commented-out code BTCPayServer/JsonConverters/PayoutMethodIdJsonConverter.cs:20
- Commented-out code BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:518
- Commented-out code BTCPayServer/Plugins/Subscriptions/SubscriptionHostedService.cs:519
- Silent fallback default in catch BTCPayServer/Controllers/LnurlAuthService.cs:75
- Silent fallback default in catch BTCPayServer/IHasAdditionalData.cs:25
- Silent fallback default in catch BTCPayServer/Payments/LNURLPay/LNURLPayPaymentLinkExtension.cs:45
- Silent fallback default in catch BTCPayServer/Plugins/Dotnet/Loader/RuntimeConfigExtensions.cs:125
- Silent fallback default in catch REDACTED:136
- Silent fallback default in catch BTCPayServer/Plugins/PluginManager.cs:837
- Silent fallback default in catch BTCPayServer/Plugins/Translations/LanguagePackUpdateService.cs:150
- Silent fallback default in catch BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1975
- Silent fallback default in catch BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.cs:1989
- Silent fallback default in catch BTCPayServer/Security/GreenField/APIKeyRepository.cs:48
- Silent fallback default in catch BTCPayServer/Security/GreenField/APIKeyRepository.cs:60
- Silent fallback default in catch BTCPayServer/Services/Stores/StoreRepository.cs:349
- Silent fallback default in catch BTCPayServer/SSRFAllowedDestination.cs:101
- Silent fallback default in catch BTCPayServer/wwwroot/plugins/GlobalSearch/global-search.js:465
- Orphaned file BTCPayServer/Services/Reporting/PaymentRequestsReportProvider.cs:1
- Orphaned file BTCPayServer.Client/BTCPayServerClient.Lightning.Store.cs:1
- Orphaned file BTCPayServer.Client/BTCPayServerClient.Lightning.Internal.cs:1
- Orphaned file BTCPayServer.Client/BTCPayServerClient.Apps.cs:1
- Orphaned file BTCPayServer/Services/Wallets/Export/TransactionsExport.cs:1
- Orphaned file BTCPayServer/Components/StoreLightningBalance/StoreLightningBalance.cs:1
- Orphaned file BTCPayServer.Abstractions/Extensions/HttpRequestExtensions.cs:1
- Orphaned file BTCPayServer/Extensions/ColorExtensions.cs:1
- Orphaned file BTCPayServer/Components/StoreLightningServices/StoreLightningServices.cs:1
- Orphaned file BTCPayServer.Client/BTCPayServerClient.OnChainWallet.Objects.cs:1
- Orphaned file BTCPayServer.Client/BTCPayServerClient.Users.cs:1
- Orphaned file BTCPayServer/Controllers/GreenField/GreenfieldFilesController.cs:1
- Orphaned file BTCPayServer/Services/DisplayFormatter.cs:1
- Duplicated predicate BTCPayServer/Controllers/UIStoresController.Labels.cs:30
- Duplicated predicate BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs:55
- Duplicated predicate REDACTED:837
- Duplicated predicate BTCPayServer/Controllers/GreenField/GreenfieldServerEmailController.cs:50
- Duplicated predicate BTCPayServer/ModelBinders/DateTimeOffsetModelBinder.cs:13
- Duplicated predicate BTCPayServer/Plugins/Wallets/Views/ViewModels/TransactionTagModel.cs:25
- Duplicated predicate BTCPayServer/Controllers/UIManageController.cs:208
- Duplicated predicate BTCPayServer/Plugins/Webhooks/TriggerProviders/PaymentRequestTriggerProvider.cs:71
- Duplicated predicate BTCPayServer/Controllers/LnurlAuthService.cs:85
- Duplicated predicate BTCPayServer/wwwroot/js/form-editor.js:225
- Duplicated predicate BTCPayServer/Plugins/Wallets/Controllers/GreenfieldStoreOnChainWalletsController.cs:580
- Placeholder data left in code BTCPayServer/Plugins/Emails/Controllers/UIEmailControllerBase.cs:94
- Placeholder data left in code BTCPayServer/Plugins/Emails/Controllers/UIEmailControllerBase.cs:95
- Placeholder data left in code BTCPayServer/Plugins/Emails/EmailsPlugin.cs:222
- Placeholder data left in code BTCPayServer/Plugins/Emails/EmailsPlugin.cs:224
- Placeholder data left in code BTCPayServer/Plugins/Emails/StoreMailTriggers.cs:25
- Placeholder data left in code BTCPayServer/Plugins/Emails/StoreMailTriggers.cs:27
- Placeholder data left in code BTCPayServer/Plugins/Multisig/MultisigEmailTriggers.cs:35
- Placeholder data left in code BTCPayServer/Plugins/Multisig/MultisigEmailTriggers.cs:42
- Documentation: no installation or build instructions docs/README.md
- Documentation: no usage examples docs/README.md
- Documentation: written for insiders docs/maintainers/local-development.md
- Silent fallback default on unknown code BTCPayServer/Plugins/Multisig/Models/MultisigSetupData.cs:38
- Silent fallback default on unknown code REDACTED:120
- Silent fallback default on unknown code BTCPayServer/Plugins/Wallets/Controllers/UIWalletsController.PSBT.cs:158
- redundant comment BTCPayServer.Abstractions/Contracts/IBTCPayServerPlugin.cs:34
- redundant comment BTCPayServer/Storage/Services/FileService.cs:154
- README/code drift docs/operators/README.md:87
- README/code drift docs/operators/host-integration.md:11
- Console output used as the logging channel root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs:106
- Console output used as the logging channel root/.nuget/packages/jetbrains.annotations.sources/2026.2.0/contentFiles/cs/any/JetBrains.Annotations/Annotations.Internal.cs:132
- Partial audit-trail evidence
- Partial data-retention evidence
- Off-boarding risk: anonymized user #1
- Further sole-owners (lower concentration)
- No ADRs found
- Projects may be oversized for their cohesion
- Scattered collaborators
- Pass-through layer BTCPayServer/Plugins/PluginServiceCollection.cs:8
- REDACTED
- Orphaned files with no living knowledge
- REDACTED
- REDACTED
- REDACTED
- REDACTED
- IL efficiency: 35 authored method(s) exceed the IL budget BTCPayServer.Data/Data/InvoiceData.Migration.cs:49
- Inverted test pyramid
- Placeholder literal left in code BTCPayServer/Plugins/Translations/Translations.Default.cs:12
- Disabled test BTCPayServer.Tests/ThirdPartyTests.cs:75
- No ADRs
- No src/ separation
- Sleep-based test synchronization
- No rollback/health safety
- No performance benchmarks
- Security headers incomplete BTCPayServer/Filters/ContentSecurityPolicyAttribute.cs:114
- Not all async methods take a CancellationToken
- Nullable reference types not enabled everywhere
- Null-forgiving operator (`!`) suppressions reduce the NRT score
- Silent fallback default on parse failure BTCPayServer/DefaultRules.cs:72
Minor — 13 finding(s)
- Outdated: Fido2
- Outdated: Fido2.AspNet
- Outdated: QRCoder
- Outdated: Microsoft.Playwright
- Outdated: Microsoft.Testing.Extensions.GitHubActionsReport
- Outdated: xunit.v3
- XML-doc coverage: BTCPayServer BTCPayServer/BTCPayServer.csproj
- XML-doc coverage: BTCPayServer.Rating BTCPayServer.Rating/BTCPayServer.Rating.csproj
- XML-doc coverage: BTCPayServer.Common BTCPayServer.Common/BTCPayServer.Common.csproj
- XML-doc coverage: BTCPayServer.Data BTCPayServer.Data/BTCPayServer.Data.csproj
- XML-doc coverage: BTCPayServer.Client BTCPayServer.Client/BTCPayServer.Client.csproj
- XML-doc coverage: BTCPayServer.Abstractions BTCPayServer.Abstractions/BTCPayServer.Abstractions.csproj
- Off the main sequence: BTCPayServer.Common BTCPayServer.Common/BTCPayServer.Common.csproj:1
Appendix B — Reproduction & audit trail
| Dimension | Tool | Version | Command | Findings | Raw output |
|---|---|---|---|---|---|
| D28 · Secrets (history) | gitleaks | — | gitleaks detect --no-banner --config /opt/gitleaks-rules/watchdog-gitleaks.toml --report-format json --report-path /tmp/watchdog-gitleaks-285e94c61fa346ada61918ec69012b74/history.json --exit-code 0 --source . | 7 | artifacts/raw/gitleaks-history.json |
| D28 · Secrets (history) | gitleaks | — | gitleaks detect --no-git --no-banner --config /opt/gitleaks-rules/watchdog-gitleaks.toml --report-format json --report-path /tmp/watchdog-gitleaks-285e94c61fa346ada61918ec69012b74/tree.json --exit-code 0 --source . | 1 | artifacts/raw/gitleaks-tree.json |
| D29 · Static Analysis (SAST) | semgrep | — | semgrep --config /opt/semgrep-rules/security-audit.yml --config /opt/semgrep-rules/owasp-top-ten.yml --config /opt/semgrep-rules/watchdog-sast.yml --json --quiet --timeout 10 --timeout-threshold 3 --metrics off . | 136 | artifacts/raw/semgrep.json |
| D30 · Dependency Vulnerabilities | dotnet | — | dotnet list btcpayserver.sln package --vulnerable --include-transitive --format json | 0 | artifacts/raw/dotnet-vulnerable.json |
| D31 · IaC & Container Security | trivy | — | trivy config --format json --quiet . | 5 | artifacts/raw/trivy-config.json |
| D32 · Data Compliance (PII/GDPR) | semgrep | — | semgrep --config /opt/semgrep-rules/gdpr.yml --json --quiet --timeout 10 --timeout-threshold 3 --metrics off . | 1 | artifacts/raw/semgrep-gdpr.json |
| D40 · Network Egress Confinement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; network egress policy is a cluster-native control that may live at the platform/firewall layer, so there is nothing to assess here. | 0 | — |
| D41 · Kernel & Syscall Confinement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; seccomp/AppArmor/SELinux confinement is a workload-level control, so there is nothing to assess here. | 0 | — |
| D42 · Runtime Threat Enforcement | runtime-hardening | — | runtime-hardening: not applicable — No Kubernetes/orchestration workloads found in the repository manifests; runtime threat-detection and admission-control policy are cluster-level controls, so there is nothing to assess here. | 0 | — |
| D43 · Malicious Dependencies | none (no readable dependency manifest) | — | none (no readable dependency manifest): not applicable — Not scored — no dependency manifest in a supported ecosystem was read for this repository. A gap in the analyzer's language coverage, NOT a finding that the repository is free of vulnerable dependencies (a Python pyproject.toml/requirements.txt (pip/uv/Poetry), a Swift Package.swift/Package.resolved, a Cargo manifest, a Go module (go.mod/go.sum), a Gradle version catalogue, a Maven POM, an sbt build (build.sbt), composer.json, package.json, a Dart pubspec.yaml, an Elixir mix.exs/mix.lock (Hex), a rebar.config / erlang.mk DEPS (Hex), a Ruby Gemfile/Gemfile.lock or .gemspec (Bundler/RubyGems) — not scanned yet). | 0 | — |
Appendix C — Personal-data map
Email — 53 field(s)
- ApplicationUserData.Email BTCPayServer.Client/Models/ApplicationUserData.cs:18
- CreateApplicationUserRequest.Email BTCPayServer.Client/Models/CreateApplicationUserRequest.cs:18
- PaymentRequestBaseData.Email BTCPayServer.Client/Models/PaymentRequestBaseData.cs:39
- SendEmailRequest.Email BTCPayServer.Client/Models/SendEmailRequest.cs:6
- StoreUserData.Email BTCPayServer.Client/Models/StoreData.cs:19
- StoreInvitationData.UserEmail BTCPayServer.Client/Models/StoreData.cs:56
- CreatePlanCheckoutRequest.NewSubscriberEmail BTCPayServer.Client/Models/Subscriptions/CreatePlanCheckoutRequest.cs:32
- UpdateApplicationUserRequest.Email BTCPayServer.Client/Models/UpdateApplicationUserRequest.cs:18
- ApplicationDbContext.EmailRules BTCPayServer.Data/ApplicationDbContext.cs:67
- CustomerData.Email BTCPayServer.Data/Data/CustomerData.cs:67
- CustomerData.NotificationEmail BTCPayServer.Data/Data/CustomerData.cs:70
- StoreInvitationExtendedRow.UserEmail BTCPayServer.Data/Data/StoreInvitation.cs:27
- PlanCheckoutData.NewSubscriberEmail BTCPayServer.Data/Data/Subscriptions/PlanCheckoutData.cs:56
- ResetUserPasswordFromAdmin.Email BTCPayServer/Controllers/UIServerController.Users.cs:478
- RegisterFromAdminViewModel.Email BTCPayServer/Controllers/UIServerController.Users.cs:496
- PaymentRequestBlob.Email BTCPayServer/Data/PaymentRequestBlob.cs:8
- PullPaymentView.Email BTCPayServer/Data/PullPayments/PullPaymentBlob.cs:34
- StoreBlob.EmailSettings BTCPayServer/Data/StoreBlob.cs:206
- Registered.ConfirmationEmailLink BTCPayServer/Events/UserEvent.cs:31
- ForgotPasswordViewModel.Email BTCPayServer/Models/AccountViewModels/ForgotPasswordViewModel.cs:10
- LoginViewModel.Email BTCPayServer/Models/AccountViewModels/LoginViewModel.cs:9
- RegisterViewModel.Email BTCPayServer/Models/AccountViewModels/RegisterViewModel.cs:10
- SetPasswordViewModel.Email BTCPayServer/Models/AccountViewModels/SetPasswordViewModel.cs:10
- CreateInvoiceModel.BuyerEmail BTCPayServer/Models/InvoicingModels/CreateInvoiceModel.cs:52
- IndexViewModel.Email BTCPayServer/Models/ManageViewModels/IndexViewModel.cs:12
- UpdatePaymentRequestViewModel.Email BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs:92
- ViewPaymentRequestViewModel.Email BTCPayServer/Models/PaymentRequestViewModels/ListPaymentRequestsViewModel.cs:145
- UserViewModel.Email BTCPayServer/Models/ServerViewModels/UsersViewModel.cs:17
- StoreInvitationSentViewModel.Email BTCPayServer/Models/StoreViewModels/StoreInvitationSentViewModel.cs:8
- StoreInvitationViewModel.InvitedEmail BTCPayServer/Models/StoreViewModels/StoreInvitationViewModel.cs:18
- StoreUserViewModel.Email BTCPayServer/Models/StoreViewModels/StoreUsersViewModel.cs:13
- StoreUsersViewModel.Email BTCPayServer/Models/StoreViewModels/StoreUsersViewModel.cs:37
- WalletSettingsAccountKeyViewModel.SignerEmail BTCPayServer/Models/StoreViewModels/WalletSettingsViewModel.cs:55
- ViewPullPaymentModel.Email BTCPayServer/Models/ViewPullPaymentModel.cs:76
- BitpayCreateInvoiceRequest.BuyerEmail BTCPayServer/Plugins/Bitpay/Models/BitpayCreateInvoiceRequest.cs:14
- ContributeToCrowdfund.Email BTCPayServer/Plugins/Crowdfund/Models/ViewCrowdfundViewModel.cs:78
- EmailsRuleControllerContext.EmailSettingsLink BTCPayServer/Plugins/Emails/Controllers/UIEmailRuleControllerBase.cs:30
- EmailTriggerViewModel.DefaultEmail BTCPayServer/Plugins/Emails/Views/EmailTriggerViewModel.cs:28
- EmailsViewModel.TestEmail BTCPayServer/Plugins/Emails/Views/EmailsViewModel.cs:20
- MultisigSignerInfo.Email BTCPayServer/Plugins/Multisig/Events/MultisigEvents.cs:8
Phone — 3 field(s)
- BitpayCreateInvoiceRequest.BuyerPhone BTCPayServer/Plugins/Bitpay/Models/BitpayCreateInvoiceRequest.cs:42
- InvoiceMetadata.BuyerPhone BTCPayServer/Services/Invoices/InvoiceEntity.cs:120
- BuyerInformation.BuyerPhone BTCPayServer/Services/Invoices/InvoiceEntity.cs:262