From c2c95f79bfedae3889f220824b91a6844971e773 Mon Sep 17 00:00:00 2001 From: Konstantinos Lambrou-Latreille Date: Tue, 5 May 2026 09:09:34 -0400 Subject: [PATCH] Make ZeroTreasuryWithdrawals a permanent check in gov state transation rule In `conwayGovTransition`, we remove the condition on `hardforkConwayBootstrapPhase` for checking `ZeroTreasuryWithdrawals`. We then replayed the preview, preprod and mainnet public chains with this change which guarentees there were no empty treasury withdrawals pre-Conway era. --- eras/conway/impl/CHANGELOG.md | 1 + .../impl/src/Cardano/Ledger/Conway/Rules/Gov.hs | 5 ++--- .../Test/Cardano/Ledger/Conway/Imp/GovSpec.hs | 13 ++++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/eras/conway/impl/CHANGELOG.md b/eras/conway/impl/CHANGELOG.md index 1e2085fc3e3..533b736a124 100644 --- a/eras/conway/impl/CHANGELOG.md +++ b/eras/conway/impl/CHANGELOG.md @@ -38,6 +38,7 @@ - `ConwayUtxowPredFailure` * Remove `NoThunks` instance for `ConwayContextError` * Make `ConwayContextError` constructors lazy +* Make `ZeroTreasuryWithdrawals` a permanent check for all eras (not just post-Babbage). ### `testlib` diff --git a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Gov.hs b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Gov.hs index 1be51dcb52f..057f5f19cc3 100644 --- a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Gov.hs +++ b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Gov.hs @@ -546,9 +546,8 @@ conwayGovTransition = do -- Guardrails script hash check runTest $ checkGuardrailsScriptHash @era constitutionPolicy proposalPolicy - unless (hardforkConwayBootstrapPhase $ pp ^. ppProtocolVersionL) $ - -- The sum of all withdrawals must be positive - F.fold wdrls /= mempty ?! (injectFailure . ZeroTreasuryWithdrawals) pProcGovAction + -- The sum of all withdrawals must be positive + F.fold wdrls /= mempty ?! (injectFailure . ZeroTreasuryWithdrawals) pProcGovAction UpdateCommittee _mPrevGovActionId membersToRemove membersToAdd _qrm -> do let conflicting = Set.intersection (Map.keysSet membersToAdd) membersToRemove in failOnNonEmptySet conflicting (injectFailure . ConflictingCommitteeUpdate) diff --git a/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/GovSpec.hs b/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/GovSpec.hs index f8ae1970dfb..2c1fc2545e5 100644 --- a/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/GovSpec.hs +++ b/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/GovSpec.hs @@ -1105,28 +1105,31 @@ withdrawalsSpec = } it "Fails for empty withdrawals" $ do - mkTreasuryWithdrawalsGovAction [] >>= expectZeroTreasuryFailurePostBootstrap + mkTreasuryWithdrawalsGovAction [] >>= expectZeroTreasuryFailure accountAddress1 <- registerAccountAddress - mkTreasuryWithdrawalsGovAction [(accountAddress1, zero)] >>= expectZeroTreasuryFailurePostBootstrap + mkTreasuryWithdrawalsGovAction [(accountAddress1, zero)] >>= expectZeroTreasuryFailure accountAddress2 <- registerAccountAddress let withdrawals = [(accountAddress1, zero), (accountAddress2, zero)] - mkTreasuryWithdrawalsGovAction withdrawals >>= expectZeroTreasuryFailurePostBootstrap + mkTreasuryWithdrawalsGovAction withdrawals >>= expectZeroTreasuryFailure wdrls <- mkTreasuryWithdrawalsGovAction $ withdrawals ++ [(accountAddress2, Coin 100_000)] proposal <- mkProposal wdrls submitBootstrapAwareFailingProposal_ proposal $ FailBootstrap [disallowedProposalFailure proposal] where - expectZeroTreasuryFailurePostBootstrap wdrls = do + expectZeroTreasuryFailure wdrls = do proposal <- mkProposal wdrls void $ submitBootstrapAwareFailingProposal proposal $ FailBootstrapAndPostBootstrap $ FailBoth - { bootstrapFailures = [disallowedProposalFailure proposal] + { bootstrapFailures = + [ disallowedProposalFailure proposal + , injectFailure $ ZeroTreasuryWithdrawals wdrls + ] , postBootstrapFailures = [injectFailure $ ZeroTreasuryWithdrawals wdrls] }