From 412d61058ef156015948486a57515e8398eaf14f Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Wed, 23 Oct 2024 12:09:16 -0600 Subject: [PATCH 1/3] Adjust semantics of `ConwayWdrlNotDelegatedToDRep` Previous semantics did not allow to withdraw rewards and deregister in the same transaction, because deregistration would effectively clear out delegation to a DRep, thus preventing withdrawals --- eras/conway/impl/CHANGELOG.md | 4 ++++ .../src/Cardano/Ledger/Conway/Rules/Ledger.hs | 24 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/eras/conway/impl/CHANGELOG.md b/eras/conway/impl/CHANGELOG.md index 1117affb0a8..25f3f2e5fe3 100644 --- a/eras/conway/impl/CHANGELOG.md +++ b/eras/conway/impl/CHANGELOG.md @@ -1,5 +1,9 @@ # Version history for `cardano-ledger-conway` +## 1.17.2.0 + +* Change the state used for `ConwayWdrlNotDelegatedToDRep` predicate failure checking + ## 1.17.1.0 * Add `processDelegation` diff --git a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Ledger.hs b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Ledger.hs index 38104e0fac6..a254316d5ef 100644 --- a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Ledger.hs +++ b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/Ledger.hs @@ -417,17 +417,15 @@ ledgerTransition = do committee = govState ^. committeeGovStateL proposals = govState ^. proposalsGovStateL committeeProposals = proposalsWithPurpose grCommitteeL proposals - certStateAfterCERTS <- - trans @(EraRule "CERTS" era) $ - TRC - ( CertsEnv tx pp slot currentEpoch committee committeeProposals - , certState - , StrictSeq.fromStrict $ txBody ^. certsTxBodyL - ) - -- Starting with version 10, we don't allow withdrawals into RewardAcounts that are KeyHashes and not delegated to Dreps + -- Starting with version 10, we don't allow withdrawals into RewardAcounts that are + -- KeyHashes and not delegated to Dreps. + -- + -- We also need to make sure we are using the certState before certificates are applied, + -- because otherwise it would not be possible to unregister a reward account and withdraw + -- all funds from it in the same transaction. unless (HF.bootstrapPhase (pp ^. ppProtocolVersionL)) $ do - let dUnified = dsUnified $ certDState certStateAfterCERTS + let dUnified = dsUnified $ certDState certState wdrls = unWithdrawals $ tx ^. bodyTxL . withdrawalsTxBodyL delegatedAddrs = DRepUView dUnified wdrlsKeyHashes = @@ -437,6 +435,14 @@ ledgerTransition = do Set.filter (not . (`UMap.member` delegatedAddrs) . KeyHashObj) wdrlsKeyHashes failOnNonEmpty nonExistentDelegations ConwayWdrlNotDelegatedToDRep + certStateAfterCERTS <- + trans @(EraRule "CERTS" era) $ + TRC + ( CertsEnv tx pp slot currentEpoch committee committeeProposals + , certState + , StrictSeq.fromStrict $ txBody ^. certsTxBodyL + ) + -- Votes and proposals from signal tx let govSignal = GovSignal From d4f0d1be80c0aa162437a6eb30e23095c4864045 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Wed, 23 Oct 2024 13:00:58 -0600 Subject: [PATCH 2/3] Add a test case for recent changeof ConwayWdrlNotDelegatedToDRep semantics: #4715 --- .../Cardano/Ledger/Conway/Imp/LedgerSpec.hs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/LedgerSpec.hs b/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/LedgerSpec.hs index 96d15058ffe..4bc88d0a3a7 100644 --- a/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/LedgerSpec.hs +++ b/eras/conway/impl/testlib/Test/Cardano/Ledger/Conway/Imp/LedgerSpec.hs @@ -118,6 +118,31 @@ spec = do ifBootstrap (submitTx_ tx >> (lookupReward cred `shouldReturn` mempty)) $ do submitFailingTx tx [injectFailure $ ConwayWdrlNotDelegatedToDRep [kh]] + it "Withdraw and unregister staking credential in the same transaction" $ do + refund <- getsNES $ nesEsL . curPParamsEpochStateL . ppKeyDepositL + kh <- freshKeyHash + let cred = KeyHashObj kh + ra <- registerStakeCredential cred + Positive newDeposit <- arbitrary + modifyPParams $ \pp -> + pp + & ppGovActionLifetimeL .~ EpochInterval 2 + & ppKeyDepositL .~ Coin newDeposit + + submitAndExpireProposalToMakeReward cred + reward <- lookupReward cred + + (drep, _, _) <- setupSingleDRep 1_000_000 + + _ <- delegateToDRep cred (Coin 1_000_000) (DRepCredential drep) + + let tx = + mkBasicTx $ + mkBasicTxBody + & certsTxBodyL .~ [UnRegDepositTxCert cred refund] + & (withdrawalsTxBodyL .~ Withdrawals [(ra, reward)]) + submitTx_ tx + it "Withdraw from a key delegated to an expired DRep" $ do modifyPParams $ \pp -> pp From 0268e812b19f9d7a88859253b884dbe4d0bce1e6 Mon Sep 17 00:00:00 2001 From: Alexey Kuleshevich Date: Wed, 23 Oct 2024 14:54:53 -0600 Subject: [PATCH 3/3] Bump up the version to `cardano-ledger-conway-1.17.2.0` --- eras/conway/impl/cardano-ledger-conway.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eras/conway/impl/cardano-ledger-conway.cabal b/eras/conway/impl/cardano-ledger-conway.cabal index 9aa9899d0d8..df1eaaabee8 100644 --- a/eras/conway/impl/cardano-ledger-conway.cabal +++ b/eras/conway/impl/cardano-ledger-conway.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: cardano-ledger-conway -version: 1.17.1.0 +version: 1.17.2.0 license: Apache-2.0 maintainer: operations@iohk.io author: IOHK