From ea1deec79c1efc16171451e72e2817ce94c95cfb Mon Sep 17 00:00:00 2001 From: pasta Date: Thu, 13 Aug 2026 00:10:59 -0500 Subject: [PATCH] fix(coinjoin): snapshot collaterals before random fee charging --- src/coinjoin/server.cpp | 10 +++++++++- src/coinjoin/server.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/coinjoin/server.cpp b/src/coinjoin/server.cpp index 6d9a3ba16578..f4fd8254d89d 100644 --- a/src/coinjoin/server.cpp +++ b/src/coinjoin/server.cpp @@ -490,7 +490,15 @@ void CCoinJoinServer::ChargeFees() const */ void CCoinJoinServer::ChargeRandomFees() const { - for (const auto& txCollateral : vecSessionCollaterals) { + AssertLockNotHeld(cs_coinjoin); + + std::vector session_collaterals; + { + LOCK(cs_coinjoin); + session_collaterals = vecSessionCollaterals; + } + + for (const auto& txCollateral : session_collaterals) { if (GetRand(/*nMax=*/100) > 10) return; LogPrint(BCLog::COINJOIN, /* Continued */ "CCoinJoinServer::ChargeRandomFees -- charging random fees, txCollateral=%s", txCollateral->ToString()); diff --git a/src/coinjoin/server.h b/src/coinjoin/server.h index 0c11576118fd..49cb7a3002d7 100644 --- a/src/coinjoin/server.h +++ b/src/coinjoin/server.h @@ -60,7 +60,7 @@ class CCoinJoinServer : public CCoinJoinBaseSession, public NetHandler /// Charge fees to bad actors (Charge clients a fee if they're abusive) void ChargeFees() const EXCLUSIVE_LOCKS_REQUIRED(!cs_coinjoin); /// Rarely charge fees to pay miners - void ChargeRandomFees() const; + void ChargeRandomFees() const EXCLUSIVE_LOCKS_REQUIRED(!cs_coinjoin); /// Consume collateral in cases when peer misbehaved void ConsumeCollateral(const CTransactionRef& txref) const;