diff --git a/src/validation.cpp b/src/validation.cpp index fbb178b2eadb..1c20b724ca3e 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2302,19 +2302,17 @@ bool CChainState::ConnectBlock(const CBlock& block, CValidationState& state, CBl for (const auto& tx : block.vtx) { // skip txes that have no inputs if (tx->vin.empty()) continue; - llmq::CInstantSendLockPtr conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx); - if (!conflictLock) { - continue; - } - if (llmq::chainLocksHandler->HasChainLock(pindex->nHeight, pindex->GetBlockHash())) { - LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); - llmq::quorumInstantSendManager->RemoveConflictingLock(::SerializeHash(*conflictLock), *conflictLock); - assert(llmq::quorumInstantSendManager->GetConflictingLock(*tx) == nullptr); - } else { - // The node which relayed this should switch to correct chain. - // TODO: relay instantsend data/proof. - return state.DoS(10, error("ConnectBlock(DASH): transaction %s conflicts with transaction lock %s", tx->GetHash().ToString(), conflictLock->txid.ToString()), - REJECT_INVALID, "conflict-tx-lock"); + while (llmq::CInstantSendLockPtr conflictLock = llmq::quorumInstantSendManager->GetConflictingLock(*tx)) { + if (llmq::chainLocksHandler->HasChainLock(pindex->nHeight, pindex->GetBlockHash())) { + LogPrint(BCLog::ALL, "ConnectBlock(DASH): chain-locked transaction %s overrides islock %s\n", + tx->GetHash().ToString(), ::SerializeHash(*conflictLock).ToString()); + llmq::quorumInstantSendManager->RemoveConflictingLock(::SerializeHash(*conflictLock), *conflictLock); + } else { + // The node which relayed this should switch to correct chain. + // TODO: relay instantsend data/proof. + return state.DoS(10, error("ConnectBlock(DASH): transaction %s conflicts with transaction lock %s", + tx->GetHash().ToString(), conflictLock->txid.ToString()), REJECT_INVALID, "conflict-tx-lock"); + } } } }