From 206875b13348088128203470140d63d21024f52b Mon Sep 17 00:00:00 2001 From: Kukks Date: Tue, 14 Nov 2023 15:56:58 +0100 Subject: [PATCH] upd --- .../BTCPayCoinjoinCoinSelector.cs | 4 +++- .../BTCPayWallet.cs | 11 ++++++++--- .../Smartifier.cs | 18 ++++++++++++++++-- .../Shared/Wabisabi/WabisabiDashboard.cshtml | 7 ++++--- .../Shared/Wabisabi/WabisabiWalletSend.cshtml | 8 ++------ submodules/walletwasabi | 2 +- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs index 4f7f79a..ef3ae94 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayCoinjoinCoinSelector.cs @@ -104,7 +104,9 @@ public class BTCPayCoinjoinCoinSelector : IRoundCoinSelector utxoSelectionParameters); var fullyPrivate = remainingCoins.All(coin => coin.CoinColor(_wallet.AnonScoreTarget) == AnonsetType.Green); var coinjoiningOnlyForPayments = fullyPrivate && remainingPendingPayments.Any(); - if (fullyPrivate && !coinjoiningOnlyForPayments) + var isMixingToOther = !_wallet.WabisabiStoreSettings.PlebMode && + !string.IsNullOrEmpty(_wallet.WabisabiStoreSettings.MixToOtherWallet); + if (fullyPrivate && !coinjoiningOnlyForPayments && !isMixingToOther) { var rand = Random.Shared.Next(1, 1001); if (rand > _wallet.WabisabiStoreSettings.ExtraJoinProbability) diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs index faa8857..b2eced9 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/BTCPayWallet.cs @@ -378,7 +378,8 @@ public class BTCPayWallet : IWallet, IDestinationProvider continue; } - scriptInfos.Add((txout, ExplorerClient.GetKeyInformationAsync(BlockchainAnalyzer.StdDenoms.Contains(txout.TxOut.Value)?utxoDerivationScheme:DerivationScheme, script.ScriptPubKey))); + var privateEnough = result.Coins.All(c => c.AnonymitySet >= WabisabiStoreSettings.AnonymitySetTarget ); + scriptInfos.Add((txout, ExplorerClient.GetKeyInformationAsync(BlockchainAnalyzer.StdDenoms.Contains(txout.TxOut.Value)&& privateEnough?utxoDerivationScheme:DerivationScheme, script.ScriptPubKey))); } await Task.WhenAll(scriptInfos.Select(t => t.Item2)); @@ -441,6 +442,10 @@ public class BTCPayWallet : IWallet, IDestinationProvider Outpoint = new OutPoint(result.UnsignedCoinJoin, pair.Key.N).ToString() })).ToArray() }; + foreach (var smartTxWalletOutput in smartTx.WalletOutputs) + { + Smartifier.SetIsSufficientlyDistancedFromExternalKeys(smartTxWalletOutput, cjData); + } var attachments = new List() { @@ -585,9 +590,9 @@ public class BTCPayWallet : IWallet, IDestinationProvider // Logger.LogTrace($"unlocked utxos: {string.Join(',', unlocked)}"); // } -public async Task> GetNextDestinationsAsync(int count, bool mixedOutputs) +public async Task> GetNextDestinationsAsync(int count, bool mixedOutputs, bool privateEnough) { - if (!WabisabiStoreSettings.PlebMode && !string.IsNullOrEmpty(WabisabiStoreSettings.MixToOtherWallet) && mixedOutputs) + if (!WabisabiStoreSettings.PlebMode && !string.IsNullOrEmpty(WabisabiStoreSettings.MixToOtherWallet) && mixedOutputs && privateEnough) { try { diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs b/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs index e4ba195..83ef360 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Smartifier.cs @@ -13,6 +13,7 @@ using NBitcoin; using NBXplorer; using NBXplorer.DerivationStrategy; using NBXplorer.Models; +using WalletWasabi.Blockchain.Analysis; using WalletWasabi.Blockchain.Analysis.Clustering; using WalletWasabi.Blockchain.Keys; using WalletWasabi.Blockchain.TransactionOutputs; @@ -85,6 +86,7 @@ public class Smartifier public async Task GetTransactionInfo(uint256 hash) { + return await GetOrCreate(TransactionInformations , hash, () => _explorerClient.GetTransactionAsync(DerivationScheme, hash), _logger); } @@ -199,20 +201,32 @@ public class Smartifier hdPubKey.SetAnonymitySet(labels.anonset); var c = new SmartCoin(tx, coin.OutPoint.N, hdPubKey); - c.IsSufficientlyDistancedFromExternalKeys = labels.coinjoinData is not null; + if (labels.coinjoinData is not null) + { + + SetIsSufficientlyDistancedFromExternalKeys(c, labels.coinjoinData); + } c.PropertyChanged += CoinPropertyChanged; return c; }); - utxoLabels.TryGetValue(coin.OutPoint, out var labels); smartCoin.HdPubKey.SetLabel(new LabelsArray(labels.labels ?? new HashSet())); smartCoin.HdPubKey.SetKeyState(current == 1 ? KeyState.Clean : KeyState.Used); smartCoin.HdPubKey.SetAnonymitySet(labels.anonset); + if (labels.coinjoinData is not null) + { + SetIsSufficientlyDistancedFromExternalKeys(smartCoin, labels.coinjoinData); + } tx.TryAddWalletOutput(smartCoin); } } + public static void SetIsSufficientlyDistancedFromExternalKeys(SmartCoin c, BTCPayWallet.CoinjoinData coinjoinData) + { + c.IsSufficientlyDistancedFromExternalKeys = coinjoinData.CoinsIn.All(dataCoin => dataCoin.AnonymitySet >1); + } + private void CoinPropertyChanged(object sender, PropertyChangedEventArgs e) { if (sender is SmartCoin smartCoin && e.PropertyName == nameof(SmartCoin.CoinJoinInProgress)) diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml index 4906e25..52fcfff 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiDashboard.cshtml @@ -158,7 +158,8 @@ const config = { `${coin.score.toFixed(2)} anonset`, `${coin.confirmed ? "confirmed" : "unconfirmed"}`, coin.isPrivate ? "private" : "not private", - ...(coin.coinjoinInProgress ? ["mixing"] : []) + ...(coin.coinjoinInProgress ? ["mixing"] : []), + ...(!coin.isPrivate && coin.score >= data.targetScore? ["Coin too close to entry to deem private just yet"] : []) ]; }, title: function (context) { @@ -215,8 +216,8 @@ const config = { const totalPrivateValueSum = data.coins.filter(coin => coin.isPrivate).reduce((sum, coin) => sum + coin.value, 0); if (totalPrivateSum > 0) lineTexts.push(`${totalPrivateSum} coins(${totalPrivateValueSum.toFixed(8)}BTC) private`); - const totalNonPrivateSum = data.coins.filter(coin => !coin.isPrivate && !coin.coinjoinInProgress).length; - const totalNonPrivateValueSum = data.coins.filter(coin => !coin.isPrivate && !coin.coinjoinInProgress).reduce((sum, coin) => sum + coin.value, 0); + const totalNonPrivateSum = data.coins.filter(coin => !coin.isPrivate).length; + const totalNonPrivateValueSum = data.coins.filter(coin => !coin.isPrivate).reduce((sum, coin) => sum + coin.value, 0); if (totalNonPrivateSum > 0) lineTexts.push(`${totalNonPrivateSum} coins(${totalNonPrivateValueSum.toFixed(8)}BTC) semi/not private`); const totalInProgressSum = data.coins.filter(coin => coin.coinjoinInProgress).length; diff --git a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiWalletSend.cshtml b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiWalletSend.cshtml index 5997a23..b8c4206 100644 --- a/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiWalletSend.cshtml +++ b/Plugins/BTCPayServer.Plugins.Wabisabi/Views/Shared/Wabisabi/WabisabiWalletSend.cshtml @@ -1,17 +1,13 @@ -@using BTCPayServer.Security + @using NBitcoin @using BTCPayServer.Abstractions.Contracts @using BTCPayServer.Plugins.Wabisabi @using WalletWasabi.Blockchain.Analysis @model BTCPayServer.Models.WalletViewModels.WalletSendModel -@inject ContentSecurityPolicies contentSecurityPolicies @inject WalletProvider _walletProvider @inject IScopeProvider ScopeProvider @{ - var nonce = RandomUtils.GetUInt256().ToString().Substring(0, 32); - contentSecurityPolicies.Add("script-src", $"'nonce-{nonce}'"); - contentSecurityPolicies.AllowUnsafeHashes(); var storeId = ScopeProvider.GetCurrentStoreId(); var w = await _walletProvider.GetWalletAsync(storeId); } @@ -40,7 +36,7 @@ -