From 358575dada69fb37279e26b2e0cf11fc48870548 Mon Sep 17 00:00:00 2001 From: teodanciu Date: Tue, 13 Aug 2024 21:42:51 +0100 Subject: [PATCH] Adjust drep expiry set on registration to subtract the added number of dormant epochs from the total --- .../Cardano/Ledger/Conway/Rules/GovCert.hs | 27 +++++++++++++++++- .../Cardano/Ledger/Api/State/Imp/QuerySpec.hs | 28 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/GovCert.hs b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/GovCert.hs index e3d9a03bbdc..a7374806d88 100644 --- a/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/GovCert.hs +++ b/eras/conway/impl/src/Cardano/Ledger/Conway/Rules/GovCert.hs @@ -53,6 +53,7 @@ import Cardano.Ledger.Credential (Credential) import Cardano.Ledger.Crypto (Crypto) import Cardano.Ledger.DRep (DRepState (..), drepAnchorL, drepDepositL, drepExpiryL) import Cardano.Ledger.Keys (KeyRole (ColdCommitteeRole, DRepRole)) +import qualified Cardano.Ledger.Shelley.HardForks as HF (bootstrapPhase) import Cardano.Slotting.Slot (EpochInterval, binOpEpochNo) import Control.DeepSeq (NFData) import Control.State.Transition.Extended ( @@ -235,7 +236,15 @@ conwayGovCertTransition = do { vsDReps = Map.insert cred - (DRepState (addEpochInterval cgceCurrentEpoch ppDRepActivity) mAnchor ppDRepDeposit) + ( DRepState + ( computeDRepExpiryVersioned + cgcePParams + cgceCurrentEpoch + (vState ^. vsNumDormantEpochsL) + ) + mAnchor + ppDRepDeposit + ) vsDReps } ConwayUnRegDRep cred refund -> do @@ -274,6 +283,22 @@ conwayGovCertTransition = do UpdateCommittee _ _ newMembers _ -> Map.member coldCred newMembers _ -> False +computeDRepExpiryVersioned :: + ConwayEraPParams era => + PParams era -> + -- | Current epoch + EpochNo -> + -- | The count of the dormant epochs + EpochNo -> + EpochNo +computeDRepExpiryVersioned pp currentEpoch numDormantEpochs + -- Starting with version 10, we correctly take into account the number of dormant epochs + -- when registering a drep + | HF.bootstrapPhase (pp ^. ppProtocolVersionL) = + addEpochInterval currentEpoch (pp ^. ppDRepActivityL) + | otherwise = + computeDRepExpiry (pp ^. ppDRepActivityL) currentEpoch numDormantEpochs + computeDRepExpiry :: -- | DRepActivity PParam EpochInterval -> diff --git a/libs/cardano-ledger-api/test/Test/Cardano/Ledger/Api/State/Imp/QuerySpec.hs b/libs/cardano-ledger-api/test/Test/Cardano/Ledger/Api/State/Imp/QuerySpec.hs index ffc767651ad..79dc7cc977f 100644 --- a/libs/cardano-ledger-api/test/Test/Cardano/Ledger/Api/State/Imp/QuerySpec.hs +++ b/libs/cardano-ledger-api/test/Test/Cardano/Ledger/Api/State/Imp/QuerySpec.hs @@ -28,6 +28,7 @@ import Cardano.Ledger.Core import Cardano.Ledger.Credential (Credential (KeyHashObj)) import Cardano.Ledger.DRep import Cardano.Ledger.Keys (KeyRole (..)) +import qualified Cardano.Ledger.Shelley.HardForks as HF import Cardano.Ledger.Shelley.LedgerState import Data.Default (def) import Data.Foldable (Foldable (..)) @@ -70,6 +71,33 @@ spec = do expectActualDRepExpiry drep $ addEpochInterval curEpochNo $ EpochInterval (drepActivity + fromIntegral n) + + it "dRep registered when there are dormant epochs" $ do + let drepActivity = 3 + modifyPParams $ ppDRepActivityL .~ EpochInterval drepActivity + let n = 2 + passNEpochs n + expectNumDormantEpochs $ EpochNo (fromIntegral n) + (drep, _, _) <- setupSingleDRep 1_000_000 + + let expectedExpiry = do + epochNo <- getsNES nesELL + let tot = addEpochInterval epochNo (EpochInterval drepActivity) + pv <- getProtVer + pure $ + if HF.bootstrapPhase pv + then binOpEpochNo (+) tot (fromIntegral n) + else tot + + expectedExpiry >>= expectActualDRepExpiry drep + + nes <- getsNES id + void $ submitParameterChange SNothing $ def & ppuMinFeeAL .~ SJust (Coin 3000) + + expectedExpiry >>= expectDRepExpiry drep + drepState <- drepStateFromQuery drep nes + expectedExpiry >>= shouldBe (drepState ^. drepExpiryL) + it "proposals are made and numDormantEpochs are added" $ do curEpochNo <- getsNES nesELL let drepActivity = 3