Introduce min and max anonset targets concept
MODIFY
WalletWasabi.Fluent.Desktop/Program.cs
WalletWasabi.Fluent.Desktop/Program.cs
@@ -145,7 +145,6 @@ namespace WalletWasabi.Fluent.Desktop
Config config = new(Path.Combine(dataDir, "Config.json"));
config.LoadOrCreateDefaultFile();
- config.CorrectMixUntilAnonymitySet();
return (uiConfig, config);
}

MODIFY
WalletWasabi.Fluent/Config.cs
WalletWasabi.Fluent/Config.cs
@@ -18,19 +18,16 @@ namespace WalletWasabi.Fluent
[JsonObject(MemberSerialization.OptIn)]
public class Config : ConfigBase
{
- public const int DefaultPrivacyLevelSome = 2;
- public const int DefaultPrivacyLevelFine = 21;
- public const int DefaultPrivacyLevelStrong = 50;
+ public const int DefaultMinAnonScoreTarget = 5;
+ public const int DefaultMaxAnonScoreTarget = 10;
+
public const int DefaultJsonRpcServerPort = 37128;
public static readonly Money DefaultDustThreshold = Money.Coins(Constants.DefaultDustThreshold);
private Uri _backendUri = null;
private Uri _fallbackBackendUri;
-
- private string _mixUntilAnonymitySet = WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelStrong.ToString();
- private int _privacyLevelSome;
- private int _privacyLevelFine;
- private int _privacyLevelStrong;
+ private int _minAnonScoreTarget;
+ private int _maxAnonScoreTarget;
public Config() : base()
{
@@ -38,7 +35,7 @@ namespace WalletWasabi.Fluent
public Config(string filePath) : base(filePath)
{
- ServiceConfiguration = new ServiceConfiguration(MixUntilAnonymitySet, PrivacyLevelSome, PrivacyLevelFine, PrivacyLevelStrong, GetBitcoinP2pEndPoint(), DustThreshold);
+ ServiceConfiguration = new ServiceConfiguration(MinAnonScoreTarget, MaxAnonScoreTarget, GetBitcoinP2pEndPoint(), DustThreshold);
}
[JsonProperty(PropertyName = "Network")]
@@ -115,74 +112,37 @@ namespace WalletWasabi.Fluent
"http://localhost:37128/"
};
- [DefaultValue(nameof(WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelStrong))]
- [JsonProperty(PropertyName = "MixUntilAnonymitySet", DefaultValueHandling = DefaultValueHandling.Populate)]
- public string MixUntilAnonymitySet
- {
- get => _mixUntilAnonymitySet;
- internal set
- {
- if (RaiseAndSetIfChanged(ref _mixUntilAnonymitySet, value))
- {
- if (ServiceConfiguration is { })
- {
- ServiceConfiguration.MixUntilAnonymitySet = value;
- }
- }
- }
- }
-
- public int MixUntilAnonymitySetValue => GetAnonymitySet(MixUntilAnonymitySet);
-
- [DefaultValue(DefaultPrivacyLevelSome)]
- [JsonProperty(PropertyName = "PrivacyLevelSome", DefaultValueHandling = DefaultValueHandling.Populate)]
- public int PrivacyLevelSome
- {
- get => _privacyLevelSome;
- internal set
- {
- if (_privacyLevelSome != value)
- {
- _privacyLevelSome = value;
- if (ServiceConfiguration is { })
- {
- ServiceConfiguration.PrivacyLevelSome = value;
- }
- }
- }
- }
-
- [DefaultValue(DefaultPrivacyLevelFine)]
- [JsonProperty(PropertyName = "PrivacyLevelFine", DefaultValueHandling = DefaultValueHandling.Populate)]
- public int PrivacyLevelFine
+ [DefaultValue(DefaultMinAnonScoreTarget)]
+ [JsonProperty(PropertyName = "MinAnonScoreTarget", DefaultValueHandling = DefaultValueHandling.Populate)]
+ public int MinAnonScoreTarget
{
- get => _privacyLevelFine;
+ get => _minAnonScoreTarget;
internal set
{
- if (_privacyLevelFine != value)
+ if (_minAnonScoreTarget != value)
{
- _privacyLevelFine = value;
+ _minAnonScoreTarget = value;
if (ServiceConfiguration is { })
{
- ServiceConfiguration.PrivacyLevelFine = value;
+ ServiceConfiguration.MinAnonScoreTarget = value;
}
}
}
}
- [DefaultValue(DefaultPrivacyLevelStrong)]
- [JsonProperty(PropertyName = "PrivacyLevelStrong", DefaultValueHandling = DefaultValueHandling.Populate)]
- public int PrivacyLevelStrong
+ [DefaultValue(DefaultMaxAnonScoreTarget)]
+ [JsonProperty(PropertyName = "MaxAnonScoreTarget", DefaultValueHandling = DefaultValueHandling.Populate)]
+ public int MaxAnonScoreTarget
{
- get => _privacyLevelStrong;
+ get => _maxAnonScoreTarget;
internal set
{
- if (_privacyLevelStrong != value)
+ if (_maxAnonScoreTarget != value)
{
- _privacyLevelStrong = value;
+ _maxAnonScoreTarget = value;
if (ServiceConfiguration is { })
{
- ServiceConfiguration.PrivacyLevelStrong = value;
+ ServiceConfiguration.MaxAnonScoreTarget = value;
}
}
}
@@ -298,71 +258,12 @@ namespace WalletWasabi.Fluent
{
base.LoadFile();
- ServiceConfiguration = new ServiceConfiguration(MixUntilAnonymitySet, PrivacyLevelSome, PrivacyLevelFine, PrivacyLevelStrong, GetBitcoinP2pEndPoint(), DustThreshold);
+ ServiceConfiguration = new ServiceConfiguration(MinAnonScoreTarget, MaxAnonScoreTarget, GetBitcoinP2pEndPoint(), DustThreshold);
// Just debug convenience.
_backendUri = GetCurrentBackendUri();
}
- private int CorrectMixUntilAnonymitySetValue()
- {
- try
- {
- if (int.TryParse(MixUntilAnonymitySet, out int mixUntilAnonymitySetValue))
- {
- if (mixUntilAnonymitySetValue <= PrivacyLevelSome)
- {
- MixUntilAnonymitySet = WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelSome.ToString();
- return PrivacyLevelSome;
- }
- else if (mixUntilAnonymitySetValue <= PrivacyLevelFine)
- {
- MixUntilAnonymitySet = WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelFine.ToString();
- return PrivacyLevelFine;
- }
- else
- {
- MixUntilAnonymitySet = WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelStrong.ToString();
- return PrivacyLevelStrong;
- }
- }
- else
- {
- MixUntilAnonymitySet = WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelStrong.ToString();
- return PrivacyLevelStrong;
- }
- }
- finally
- {
- ToFile();
- }
- }
-
- public void CorrectMixUntilAnonymitySet()
- {
- GetAnonymitySet(MixUntilAnonymitySet);
- }
-
- public int GetAnonymitySet(string mixUntilAnonymitySet)
- {
- if (mixUntilAnonymitySet == WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelSome.ToString())
- {
- return PrivacyLevelSome;
- }
- else if (mixUntilAnonymitySet == WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelFine.ToString())
- {
- return PrivacyLevelFine;
- }
- else if (mixUntilAnonymitySet == WalletWasabi.Models.MixUntilAnonymitySet.PrivacyLevelStrong.ToString())
- {
- return PrivacyLevelStrong;
- }
- else
- {
- return CorrectMixUntilAnonymitySetValue();
- }
- }
-
protected override bool TryEnsureBackwardsCompatibility(string jsonString)
{
try

MODIFY
WalletWasabi.Fluent/Helpers/CoinHelpers.cs
WalletWasabi.Fluent/Helpers/CoinHelpers.cs
@@ -7,7 +7,7 @@ namespace WalletWasabi.Fluent.Helpers
{
public static bool IsPrivate(this SmartCoin coin)
{
- var privateThreshold = Services.Config.MixUntilAnonymitySetValue;
+ var privateThreshold = Services.Config.MinAnonScoreTarget;
return coin.HdPubKey.AnonymitySet >= privateThreshold;
}

MODIFY
WalletWasabi.Fluent/ViewModels/Settings/PrivacySettingsTabViewModel.cs
WalletWasabi.Fluent/ViewModels/Settings/PrivacySettingsTabViewModel.cs
@@ -12,71 +12,47 @@ namespace WalletWasabi.Fluent.ViewModels.Settings
IconName = "settings_privacy_regular")]
public partial class PrivacySettingsTabViewModel : SettingsTabViewModelBase
{
- [AutoNotify] private int _minimalPrivacyLevel;
- [AutoNotify] private int _mediumPrivacyLevel;
- [AutoNotify] private int _strongPrivacyLevel;
+ [AutoNotify] private int _minAnonScoreTarget;
+ [AutoNotify] private int _maxAnonScoreTarget;
public PrivacySettingsTabViewModel()
{
- _minimalPrivacyLevel = Services.Config.PrivacyLevelSome;
- _mediumPrivacyLevel = Services.Config.PrivacyLevelFine;
- _strongPrivacyLevel = Services.Config.PrivacyLevelStrong;
+ _minAnonScoreTarget = Services.Config.MinAnonScoreTarget;
+ _maxAnonScoreTarget = Services.Config.MaxAnonScoreTarget;
this.WhenAnyValue(
- x => x.MinimalPrivacyLevel,
- x => x.MediumPrivacyLevel,
- x => x.StrongPrivacyLevel)
+ x => x.MinAnonScoreTarget,
+ x => x.MaxAnonScoreTarget)
.ObserveOn(RxApp.TaskpoolScheduler)
.Throttle(TimeSpan.FromMilliseconds(ThrottleTime))
.Skip(1)
.Subscribe(_ => Save());
- this.WhenAnyValue(x => x.MinimalPrivacyLevel)
+ this.WhenAnyValue(x => x.MinAnonScoreTarget)
.Subscribe(
x =>
{
- if (x >= MediumPrivacyLevel)
+ if (x >= MaxAnonScoreTarget)
{
- MediumPrivacyLevel = x + 1;
+ MaxAnonScoreTarget = x + 1;
}
});
- this.WhenAnyValue(x => x.MediumPrivacyLevel)
+ this.WhenAnyValue(x => x.MaxAnonScoreTarget)
.Subscribe(
x =>
{
- if (x >= StrongPrivacyLevel)
+ if (x <= MinAnonScoreTarget)
{
- StrongPrivacyLevel = x + 1;
- }
-
- if (x <= MinimalPrivacyLevel)
- {
- MinimalPrivacyLevel = x - 1;
- }
- });
-
- this.WhenAnyValue(x => x.StrongPrivacyLevel)
- .Subscribe(
- x =>
- {
- if (x <= MinimalPrivacyLevel)
- {
- MinimalPrivacyLevel = x - 1;
- }
-
- if (x <= MediumPrivacyLevel)
- {
- MediumPrivacyLevel = x - 1;
+ MinAnonScoreTarget = x - 1;
}
});
}
protected override void EditConfigOnSave(Config config)
{
- config.PrivacyLevelSome = MinimalPrivacyLevel;
- config.PrivacyLevelFine = MediumPrivacyLevel;
- config.PrivacyLevelStrong = StrongPrivacyLevel;
+ config.MinAnonScoreTarget = MinAnonScoreTarget;
+ config.MaxAnonScoreTarget = MaxAnonScoreTarget;
}
}
}

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/Home/Tiles/PrivacyControlTileViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/Home/Tiles/PrivacyControlTileViewModel.cs
@@ -90,7 +90,7 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Home.Tiles
private bool CanCoinJoin()
{
- var privateThreshold = _wallet.ServiceConfiguration.GetMixUntilAnonymitySetValue();
+ var privateThreshold = _wallet.ServiceConfiguration.MinAnonScoreTarget;
return _wallet.Coins.Any(x => x.HdPubKey.AnonymitySet < privateThreshold);
}
@@ -119,7 +119,7 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Home.Tiles
private void Update()
{
- var privateThreshold = _wallet.ServiceConfiguration.GetMixUntilAnonymitySetValue();
+ var privateThreshold = _wallet.ServiceConfiguration.MinAnonScoreTarget;
var privateAmount = _wallet.Coins.FilterBy(x => x.HdPubKey.AnonymitySet >= privateThreshold).TotalAmount();
var normalAmount = _wallet.Coins.FilterBy(x => x.HdPubKey.AnonymitySet < privateThreshold).TotalAmount();

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/Home/Tiles/WalletBalanceTileViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/Home/Tiles/WalletBalanceTileViewModel.cs
@@ -56,7 +56,7 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Home.Tiles
BalanceFiat = _wallet.Coins.TotalAmount().ToDecimal(MoneyUnit.BTC)
.GenerateFiatText(_wallet.Synchronizer.UsdExchangeRate, "USD");
- var privateThreshold = _wallet.ServiceConfiguration.GetMixUntilAnonymitySetValue();
+ var privateThreshold = _wallet.ServiceConfiguration.MinAnonScoreTarget;
var privateCoins = _wallet.Coins.FilterBy(x => x.HdPubKey.AnonymitySet >= privateThreshold);
var normalCoins = _wallet.Coins.FilterBy(x => x.HdPubKey.AnonymitySet < privateThreshold);
@@ -77,7 +77,6 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Home.Tiles
var recent = _history.FirstOrDefault();
if (recent is { })
{
-
var isIncoming = recent.IncomingAmount is { };
RecentTransactionName = isIncoming ? "Incoming" : "Outgoing";

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/Send/PrivacyControlViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/Send/PrivacyControlViewModel.cs
@@ -77,7 +77,7 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Send
if (!isInHistory)
{
- var pockets = _wallet.Coins.GetPockets(_wallet.ServiceConfiguration.GetMixUntilAnonymitySetValue()).Select(x => new PocketViewModel(x));
+ var pockets = _wallet.Coins.GetPockets(_wallet.ServiceConfiguration.MinAnonScoreTarget).Select(x => new PocketViewModel(x));
_pocketSource.AddRange(pockets);
}

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/Send/TransactionInfo.cs
WalletWasabi.Fluent/ViewModels/Wallets/Send/TransactionInfo.cs
@@ -16,7 +16,7 @@ namespace WalletWasabi.Fluent.ViewModels.Wallets.Send
public TransactionInfo()
{
- _privateCoinThreshold = Services.Config.MixUntilAnonymitySetValue;
+ _privateCoinThreshold = Services.Config.MinAnonScoreTarget;
this.WhenAnyValue(x => x.Amount)
.Subscribe(_ => OnAmountChanged());

MODIFY
WalletWasabi.Fluent/Views/Settings/PrivacySettingsTabView.axaml
WalletWasabi.Fluent/Views/Settings/PrivacySettingsTabView.axaml
<StackPanel Classes="settingsLayout">
<StackPanel Spacing="10">
- <TextBlock Text="Minimal Anonymity Level" />
+ <TextBlock Text="Minimum Anonymity Score Target" />
<DockPanel>
- <PathIcon ToolTip.Tip="Minimal" DockPanel.Dock="Left" Foreground="{StaticResource PrivacyLevelMinimalBrush}"
+ <PathIcon ToolTip.Tip="Min" DockPanel.Dock="Left" Foreground="{StaticResource PrivacyLevelMinimalBrush}"
Data="{StaticResource privacy_minimal}" />
- <TextBlock MinWidth="24" DockPanel.Dock="Right" Text="{Binding MinimalPrivacyLevel}" VerticalAlignment="Center" />
- <Slider Minimum="2" Maximum="98" Value="{Binding MinimalPrivacyLevel}" Margin="10 0" />
+ <TextBlock MinWidth="24" DockPanel.Dock="Right" Text="{Binding MinAnonScoreTarget}" VerticalAlignment="Center" />
+ <Slider Minimum="2" Maximum="98" Value="{Binding MinAnonScoreTarget}" Margin="10 0" />
</DockPanel>
</StackPanel>
<StackPanel Spacing="10">
- <TextBlock Text="Medium Anonymity Level" />
+ <TextBlock Text="Maximum Anonymity Score Target" />
<DockPanel>
- <PathIcon ToolTip.Tip="Medium" DockPanel.Dock="Left" Foreground="{StaticResource PrivacyLevelMediumBrush}"
+ <PathIcon ToolTip.Tip="Max" DockPanel.Dock="Left" Foreground="{StaticResource PrivacyLevelMediumBrush}"
Data="{StaticResource privacy_medium}" />
- <TextBlock MinWidth="24" DockPanel.Dock="Right" Text="{Binding MediumPrivacyLevel}" VerticalAlignment="Center" />
- <Slider Minimum="3" Maximum="99" Value="{Binding MediumPrivacyLevel}" Margin="10 0" />
- </DockPanel>
- </StackPanel>
-
- <StackPanel Spacing="10">
- <TextBlock Text="Strong Anonymity Level" />
- <DockPanel>
- <PathIcon ToolTip.Tip="Strong" DockPanel.Dock="Left" Foreground="{StaticResource PrivacyLevelStrongBrush}"
- Data="{StaticResource privacy_strong}" />
- <TextBlock MinWidth="24" DockPanel.Dock="Right" Text="{Binding StrongPrivacyLevel}" VerticalAlignment="Center" />
- <Slider Minimum="4" Value="{Binding StrongPrivacyLevel}" Margin="10 0" />
+ <TextBlock MinWidth="24" DockPanel.Dock="Right" Text="{Binding MaxAnonScoreTarget}" VerticalAlignment="Center" />
+ <Slider Minimum="3" Maximum="99" Value="{Binding MaxAnonScoreTarget}" Margin="10 0" />
</DockPanel>
</StackPanel>
</StackPanel>

MODIFY
WalletWasabi.Tests/IntegrationTests/P2pTests.cs
WalletWasabi.Tests/IntegrationTests/P2pTests.cs
@@ -98,7 +98,7 @@ namespace WalletWasabi.Tests.IntegrationTests
WasabiSynchronizer synchronizer = new(bitcoinStore, httpClientFactory);
var feeProvider = new HybridFeeProvider(synchronizer, null);
- ServiceConfiguration serviceConfig = new(MixUntilAnonymitySet.PrivacyLevelStrong.ToString(), 2, 21, 50, new IPEndPoint(IPAddress.Loopback, network.DefaultPort), Money.Coins(Constants.DefaultDustThreshold));
+ ServiceConfiguration serviceConfig = new(5, 10, new IPEndPoint(IPAddress.Loopback, network.DefaultPort), Money.Coins(Constants.DefaultDustThreshold));
CachedBlockProvider blockProvider = new(
new P2pBlockProvider(nodes, null, httpClientFactory, serviceConfig, network),
bitcoinStore.BlockRepository);
@@ -109,7 +109,7 @@ namespace WalletWasabi.Tests.IntegrationTests
keyManager,
synchronizer,
dataDir,
- new ServiceConfiguration(MixUntilAnonymitySet.PrivacyLevelStrong.ToString(), 2, 21, 50, new IPEndPoint(IPAddress.Loopback, network.DefaultPort), Money.Coins(Constants.DefaultDustThreshold)),
+ new ServiceConfiguration(5, 10, new IPEndPoint(IPAddress.Loopback, network.DefaultPort), Money.Coins(Constants.DefaultDustThreshold)),
feeProvider,
blockProvider);
Assert.True(Directory.Exists(blocks.BlocksFolderPath));

MODIFY
WalletWasabi.Tests/RegressionTests/Common.cs
WalletWasabi.Tests/RegressionTests/Common.cs
@@ -79,7 +79,7 @@ namespace WalletWasabi.Tests.RegressionTests
global.Coordinator.UtxoReferee.Clear();
var network = global.RpcClient.Network;
- var serviceConfiguration = new ServiceConfiguration(MixUntilAnonymitySet.PrivacyLevelSome.ToString(), 2, 21, 50, regTestFixture.BackendRegTestNode.P2pEndPoint, Money.Coins(WalletWasabi.Helpers.Constants.DefaultDustThreshold));
+ var serviceConfiguration = new ServiceConfiguration(5, 10, regTestFixture.BackendRegTestNode.P2pEndPoint, Money.Coins(WalletWasabi.Helpers.Constants.DefaultDustThreshold));
var dir = Helpers.Common.GetWorkDir(callerFilePath, callerMemberName);
await using var indexStore = new IndexStore(Path.Combine(dir, "indexStore"), network, new SmartHeaderChain());

MODIFY
WalletWasabi/Models/ServiceConfiguration.cs
WalletWasabi/Models/ServiceConfiguration.cs
@@ -7,42 +7,20 @@ namespace WalletWasabi.Models
public class ServiceConfiguration
{
public ServiceConfiguration(
- string mixUntilAnonymitySet,
- int privacyLevelSome,
- int privacyLevelFine,
- int privacyLevelStrong,
+ int minAnonScoreTarget,
+ int maxAnonScoreTarget,
EndPoint bitcoinCoreEndPoint,
Money dustThreshold)
{
- MixUntilAnonymitySet = Guard.NotNull(nameof(mixUntilAnonymitySet), mixUntilAnonymitySet);
- PrivacyLevelSome = Guard.NotNull(nameof(privacyLevelSome), privacyLevelSome);
- PrivacyLevelFine = Guard.NotNull(nameof(privacyLevelFine), privacyLevelFine);
- PrivacyLevelStrong = Guard.NotNull(nameof(privacyLevelStrong), privacyLevelStrong);
+ MinAnonScoreTarget = Guard.NotNull(nameof(minAnonScoreTarget), minAnonScoreTarget);
+ MaxAnonScoreTarget = Guard.NotNull(nameof(maxAnonScoreTarget), maxAnonScoreTarget);
BitcoinCoreEndPoint = Guard.NotNull(nameof(bitcoinCoreEndPoint), bitcoinCoreEndPoint);
DustThreshold = Guard.NotNull(nameof(dustThreshold), dustThreshold);
}
- public string MixUntilAnonymitySet { get; set; }
- public int PrivacyLevelSome { get; set; }
- public int PrivacyLevelFine { get; set; }
- public int PrivacyLevelStrong { get; set; }
+ public int MinAnonScoreTarget { get; set; }
+ public int MaxAnonScoreTarget { get; set; }
public EndPoint BitcoinCoreEndPoint { get; set; }
public Money DustThreshold { get; set; }
-
- public int GetMixUntilAnonymitySetValue()
- {
- if (MixUntilAnonymitySet == Models.MixUntilAnonymitySet.PrivacyLevelSome.ToString())
- {
- return PrivacyLevelSome;
- }
- else if (MixUntilAnonymitySet == Models.MixUntilAnonymitySet.PrivacyLevelFine.ToString())
- {
- return PrivacyLevelFine;
- }
- else
- {
- return PrivacyLevelStrong;
- }
- }
}
}

MODIFY
WalletWasabi/WabiSabi/Client/CoinJoinManager.cs
WalletWasabi/WabiSabi/Client/CoinJoinManager.cs
@@ -162,7 +162,7 @@ namespace WalletWasabi.WabiSabi.Client
return openedWallet.Coins
.Available()
.Confirmed()
- .Where(x => x.HdPubKey.AnonymitySet < ServiceConfiguration.GetMixUntilAnonymitySetValue())
+ .Where(x => x.HdPubKey.AnonymitySet < ServiceConfiguration.MaxAnonScoreTarget)
.Where(x => !CoinRefrigerator.IsFrozen(x));
}

MODIFY
WalletWasabi/Wallets/Wallet.cs
WalletWasabi/Wallets/Wallet.cs
@@ -138,7 +138,7 @@ namespace WalletWasabi.Wallets
ServiceConfiguration = Guard.NotNull(nameof(serviceConfiguration), serviceConfiguration);
FeeProvider = Guard.NotNull(nameof(feeProvider), feeProvider);
- TransactionProcessor = new TransactionProcessor(BitcoinStore.TransactionStore, KeyManager, ServiceConfiguration.DustThreshold, ServiceConfiguration.PrivacyLevelStrong);
+ TransactionProcessor = new TransactionProcessor(BitcoinStore.TransactionStore, KeyManager, ServiceConfiguration.DustThreshold, ServiceConfiguration.MinAnonScoreTarget);
Coins = TransactionProcessor.Coins;
TransactionProcessor.WalletRelevantTransactionProcessed += TransactionProcessor_WalletRelevantTransactionProcessedAsync;

Introduce min and max anonset targets concept