{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Test.Cardano.Ledger.Conway.Imp.GovCertSpec (spec) where import Cardano.Ledger.BaseTypes (EpochInterval (..), Mismatch (..)) import Cardano.Ledger.Coin (Coin (..)) import Cardano.Ledger.Conway.Core import Cardano.Ledger.Conway.Governance (Vote (..), Voter (..)) import Cardano.Ledger.Conway.Rules (ConwayGovCertPredFailure (..), ConwayGovPredFailure (..)) import Cardano.Ledger.Credential (Credential (..)) import Cardano.Ledger.Shelley.LedgerState (curPParamsEpochStateL, nesEsL) import Cardano.Ledger.Val (Val (..)) import Data.Maybe.Strict (StrictMaybe (..)) import qualified Data.Sequence.Strict as SSeq import qualified Data.Set as Set import Lens.Micro ((&), (.~)) import Test.Cardano.Ledger.Conway.Arbitrary () import Test.Cardano.Ledger.Conway.ImpTest import Test.Cardano.Ledger.Core.Rational (IsRatio (..)) import Test.Cardano.Ledger.Imp.Common spec :: forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec = String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "GOVCERT" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Resigning proposed CC key" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do ccColdCred <- KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) -> ImpM (LedgerSpec era) (Credential ColdCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash proposal <- mkUpdateCommitteeProposal Nothing mempty [(ccColdCred, EpochInterval 1234)] (1 %! 2) mbGovId <- submitBootstrapAwareFailingProposal proposal $ FailBootstrap [injectFailure $ DisallowedProposalDuringBootstrap proposal] forM_ mbGovId $ \GovActionId _ -> Tx TopTx era -> ImpM (LedgerSpec era) () forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> ImpTestM era () submitTx_ ( TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era) forall era (l :: TxLevel). EraTx era => Lens' (Tx l era) (TxBody l era) forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era) bodyTxL ((TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxCert era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxCert era)) certsTxBodyL ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> StrictSeq (TxCert era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential ColdCommitteeRole -> StrictMaybe Anchor -> TxCert era forall era. ConwayEraTxCert era => Credential ColdCommitteeRole -> StrictMaybe Anchor -> TxCert era ResignCommitteeColdTxCert Credential ColdCommitteeRole ccColdCred StrictMaybe Anchor forall a. StrictMaybe a SNothing) ) String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "succeeds for" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "registering and unregistering a DRep" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ (Coin -> Identity Coin) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL ((Coin -> Identity Coin) -> PParams era -> Identity (PParams era)) -> Coin -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 100 drepCred <- KeyHash DRepRole -> Credential DRepRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash DRepRole -> Credential DRepRole) -> ImpM (LedgerSpec era) (KeyHash DRepRole) -> ImpM (LedgerSpec era) (Credential DRepRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash DRepRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash drepDeposit <- getsNES $ nesEsL . curPParamsEpochStateL . ppDRepDepositL submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (RegDRepTxCert drepCred drepDeposit SNothing) submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (UnRegDRepTxCert drepCred drepDeposit) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "resigning a non-CC key" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do someCred <- KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) -> ImpM (LedgerSpec era) (Credential ColdCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash submitFailingTx ( mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (ResignCommitteeColdTxCert someCred SNothing) ) (pure (injectFailure $ ConwayCommitteeIsUnknown someCred)) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "re-registering a CC hot key" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) -> ImpM (LedgerSpec era) () forall (f :: * -> *) a. Functor f => f a -> f () void ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) forall era. (HasCallStack, ConwayEraImp era) => ImpTestM era (NonEmpty (Credential HotCommitteeRole)) registerInitialCommittee initialCommittee <- ImpTestM era (Set (Credential ColdCommitteeRole)) forall era. ConwayEraImp era => ImpTestM era (Set (Credential ColdCommitteeRole)) getCommitteeMembers forM_ initialCommittee $ \Credential ColdCommitteeRole kh -> Int -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall (m :: * -> *) a. Applicative m => Int -> m a -> m () replicateM_ Int 10 (ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) ()) -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ do ccHotCred <- KeyHash HotCommitteeRole -> Credential HotCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash HotCommitteeRole -> Credential HotCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash HotCommitteeRole) -> ImpM (LedgerSpec era) (Credential HotCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash HotCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (AuthCommitteeHotKeyTxCert kh ccHotCred) String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "fails for" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "invalid deposit provided with DRep registration cert" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ (Coin -> Identity Coin) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL ((Coin -> Identity Coin) -> PParams era -> Identity (PParams era)) -> Coin -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 100 expectedDRepDeposit <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin) -> SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall a b. (a -> b) -> a -> b $ (EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era) forall era (f :: * -> *). Functor f => (EpochState era -> f (EpochState era)) -> NewEpochState era -> f (NewEpochState era) nesEsL ((EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era)) -> ((Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era)) -> (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era) forall era. EraGov era => Lens' (EpochState era) (PParams era) Lens' (EpochState era) (PParams era) curPParamsEpochStateL ((PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era)) -> ((Coin -> Const r Coin) -> PParams era -> Const r (PParams era)) -> (Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Coin -> Const r Coin) -> PParams era -> Const r (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL let providedDRepDeposit = Coin expectedDRepDeposit Coin -> Coin -> Coin forall t. Val t => t -> t -> t <+> Integer -> Coin Coin Integer 10 khDRep <- freshKeyHash submitFailingTx ( mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (RegDRepTxCert (KeyHashObj khDRep) providedDRepDeposit SNothing) ) ( pure . injectFailure $ ConwayDRepIncorrectDeposit $ Mismatch { mismatchSupplied = providedDRepDeposit , mismatchExpected = expectedDRepDeposit } ) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "invalid refund provided with DRep deregistration cert" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ (Coin -> Identity Coin) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL ((Coin -> Identity Coin) -> PParams era -> Identity (PParams era)) -> Coin -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 100 drepDeposit <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin) -> SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall a b. (a -> b) -> a -> b $ (EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era) forall era (f :: * -> *). Functor f => (EpochState era -> f (EpochState era)) -> NewEpochState era -> f (NewEpochState era) nesEsL ((EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era)) -> ((Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era)) -> (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era) forall era. EraGov era => Lens' (EpochState era) (PParams era) Lens' (EpochState era) (PParams era) curPParamsEpochStateL ((PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era)) -> ((Coin -> Const r Coin) -> PParams era -> Const r (PParams era)) -> (Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Coin -> Const r Coin) -> PParams era -> Const r (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL let refund = Coin drepDeposit Coin -> Coin -> Coin forall t. Val t => t -> t -> t <+> Integer -> Coin Coin Integer 10 drepCred <- KeyHashObj <$> freshKeyHash submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (RegDRepTxCert drepCred drepDeposit SNothing) submitFailingTx ( mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (UnRegDRepTxCert drepCred refund) ) ( pure . injectFailure $ ConwayDRepIncorrectRefund $ Mismatch { mismatchSupplied = refund , mismatchExpected = drepDeposit } ) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "DRep already registered" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ (Coin -> Identity Coin) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL ((Coin -> Identity Coin) -> PParams era -> Identity (PParams era)) -> Coin -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 100 drepDeposit <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin) -> SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall a b. (a -> b) -> a -> b $ (EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era) forall era (f :: * -> *). Functor f => (EpochState era -> f (EpochState era)) -> NewEpochState era -> f (NewEpochState era) nesEsL ((EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era)) -> ((Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era)) -> (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era) forall era. EraGov era => Lens' (EpochState era) (PParams era) Lens' (EpochState era) (PParams era) curPParamsEpochStateL ((PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era)) -> ((Coin -> Const r Coin) -> PParams era -> Const r (PParams era)) -> (Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Coin -> Const r Coin) -> PParams era -> Const r (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL drepCred <- KeyHashObj <$> freshKeyHash let regTx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era) forall era (l :: TxLevel). EraTx era => Lens' (Tx l era) (TxBody l era) forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era) bodyTxL ((TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxCert era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxCert era)) certsTxBodyL ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> StrictSeq (TxCert era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential DRepRole -> Coin -> StrictMaybe Anchor -> TxCert era forall era. ConwayEraTxCert era => Credential DRepRole -> Coin -> StrictMaybe Anchor -> TxCert era RegDRepTxCert Credential DRepRole drepCred Coin drepDeposit StrictMaybe Anchor forall a. StrictMaybe a SNothing) submitTx_ regTx submitFailingTx regTx (pure . injectFailure $ ConwayDRepAlreadyRegistered drepCred) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "unregistering a nonexistent DRep" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ (Coin -> Identity Coin) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL ((Coin -> Identity Coin) -> PParams era -> Identity (PParams era)) -> Coin -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 100 drepDeposit <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin) -> SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall a b. (a -> b) -> a -> b $ (EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era) forall era (f :: * -> *). Functor f => (EpochState era -> f (EpochState era)) -> NewEpochState era -> f (NewEpochState era) nesEsL ((EpochState era -> Const r (EpochState era)) -> NewEpochState era -> Const r (NewEpochState era)) -> ((Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era)) -> (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era) forall era. EraGov era => Lens' (EpochState era) (PParams era) Lens' (EpochState era) (PParams era) curPParamsEpochStateL ((PParams era -> Const r (PParams era)) -> EpochState era -> Const r (EpochState era)) -> ((Coin -> Const r Coin) -> PParams era -> Const r (PParams era)) -> (Coin -> Const r Coin) -> EpochState era -> Const r (EpochState era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Coin -> Const r Coin) -> PParams era -> Const r (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Coin Lens' (PParams era) Coin ppDRepDepositL drepCred <- KeyHashObj <$> freshKeyHash submitFailingTx ( mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (UnRegDRepTxCert drepCred drepDeposit) ) (pure . injectFailure $ ConwayDRepNotRegistered drepCred) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "registering a resigned CC member hotkey" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) -> ImpM (LedgerSpec era) () forall (f :: * -> *) a. Functor f => f a -> f () void ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) forall era. (HasCallStack, ConwayEraImp era) => ImpTestM era (NonEmpty (Credential HotCommitteeRole)) registerInitialCommittee initialCommittee <- ImpTestM era (Set (Credential ColdCommitteeRole)) forall era. ConwayEraImp era => ImpTestM era (Set (Credential ColdCommitteeRole)) getCommitteeMembers forM_ initialCommittee $ \Credential ColdCommitteeRole ccCred -> do ccHotCred <- KeyHash HotCommitteeRole -> Credential HotCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash HotCommitteeRole -> Credential HotCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash HotCommitteeRole) -> ImpM (LedgerSpec era) (Credential HotCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash HotCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash let registerHotKeyTx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era) forall era (l :: TxLevel). EraTx era => Lens' (Tx l era) (TxBody l era) forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era) bodyTxL ((TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxCert era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxCert era)) certsTxBodyL ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> StrictSeq (TxCert era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential ColdCommitteeRole -> Credential HotCommitteeRole -> TxCert era forall era. ConwayEraTxCert era => Credential ColdCommitteeRole -> Credential HotCommitteeRole -> TxCert era AuthCommitteeHotKeyTxCert Credential ColdCommitteeRole ccCred Credential HotCommitteeRole ccHotCred) submitTx_ registerHotKeyTx submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ SSeq.singleton (ResignCommitteeColdTxCert ccCred SNothing) submitFailingTx registerHotKeyTx (pure . injectFailure $ ConwayCommitteeHasPreviouslyResigned ccCred) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "resigning a nonexistent CC member hotkey" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) -> ImpM (LedgerSpec era) () forall (f :: * -> *) a. Functor f => f a -> f () void ImpM (LedgerSpec era) (NonEmpty (Credential HotCommitteeRole)) forall era. (HasCallStack, ConwayEraImp era) => ImpTestM era (NonEmpty (Credential HotCommitteeRole)) registerInitialCommittee nonExistentColdKey <- KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) -> ImpM (LedgerSpec era) (Credential ColdCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash let failingTx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era) forall era (l :: TxLevel). EraTx era => Lens' (Tx l era) (TxBody l era) forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era) bodyTxL ((TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxCert era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxCert era)) certsTxBodyL ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> StrictSeq (TxCert era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential ColdCommitteeRole -> StrictMaybe Anchor -> TxCert era forall era. ConwayEraTxCert era => Credential ColdCommitteeRole -> StrictMaybe Anchor -> TxCert era ResignCommitteeColdTxCert Credential ColdCommitteeRole nonExistentColdKey StrictMaybe Anchor forall a. StrictMaybe a SNothing) submitFailingTx failingTx [ injectFailure $ ConwayCommitteeIsUnknown nonExistentColdKey ] String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Potential future committee members" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do let setupGovEnv :: ImpM (LedgerSpec era) (Credential DRepRole, KeyHash StakePool) setupGovEnv = do (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => (PParams era -> PParams era) -> ImpTestM era () modifyPParams ((PParams era -> PParams era) -> ImpM (LedgerSpec era) ()) -> (PParams era -> PParams era) -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ \PParams era pp -> PParams era pp PParams era -> (PParams era -> PParams era) -> PParams era forall a b. a -> (a -> b) -> b & (Word16 -> Identity Word16) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) Word16 Lens' (PParams era) Word16 ppCommitteeMinSizeL ((Word16 -> Identity Word16) -> PParams era -> Identity (PParams era)) -> Word16 -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Word16 1 PParams era -> (PParams era -> PParams era) -> PParams era forall a b. a -> (a -> b) -> b & (EpochInterval -> Identity EpochInterval) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) EpochInterval Lens' (PParams era) EpochInterval ppCommitteeMaxTermLengthL ((EpochInterval -> Identity EpochInterval) -> PParams era -> Identity (PParams era)) -> EpochInterval -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Word32 -> EpochInterval EpochInterval Word32 30 PParams era -> (PParams era -> PParams era) -> PParams era forall a b. a -> (a -> b) -> b & (EpochInterval -> Identity EpochInterval) -> PParams era -> Identity (PParams era) forall era. ConwayEraPParams era => Lens' (PParams era) EpochInterval Lens' (PParams era) EpochInterval ppGovActionLifetimeL ((EpochInterval -> Identity EpochInterval) -> PParams era -> Identity (PParams era)) -> EpochInterval -> PParams era -> PParams era forall s t a b. ASetter s t a b -> b -> s -> t .~ Word32 -> EpochInterval EpochInterval Word32 30 ImpM (LedgerSpec era) () forall era. ShelleyEraImp era => ImpTestM era () disableTreasuryExpansion Coin -> ImpM (LedgerSpec era) () forall era. ConwayEraImp era => Coin -> ImpTestM era () donateToTreasury (Coin -> ImpM (LedgerSpec era) ()) -> Coin -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ Integer -> Coin Coin Integer 1_000 (drep, _, _) <- Integer -> ImpTestM era (Credential DRepRole, Credential Staking, KeyPair Payment) forall era. ConwayEraImp era => Integer -> ImpTestM era (Credential DRepRole, Credential Staking, KeyPair Payment) setupSingleDRep Integer 1_000_000_000 (spo, _, _) <- setupPoolWithStake $ Coin 1_000_000_000 pure (drep, spo) proposeWithdrawalAndMember :: Credential DRepRole -> ImpM (LedgerSpec era) (GovActionId, Set (Credential ColdCommitteeRole), Credential ColdCommitteeRole, GovActionId) proposeWithdrawalAndMember Credential DRepRole drep = do accountAddr <- ImpTestM era AccountAddress forall era. (HasCallStack, ShelleyEraImp era) => ImpTestM era AccountAddress registerAccountAddress gaiWithdrawal <- submitTreasuryWithdrawals [(accountAddr, Coin 1)] submitYesVote_ (DRepVoter drep) gaiWithdrawal initialMembers <- getCommitteeMembers proposedMember <- KeyHashObj <$> freshKeyHash gaiUpdateCommittee <- submitUpdateCommittee Nothing initialMembers [(proposedMember, EpochInterval 20)] (1 %! 2) pure (gaiWithdrawal, initialMembers, proposedMember, gaiUpdateCommittee) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "can authorize a hot key, but an unknown cold credential cannot" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall era. EraGov era => ImpTestM era () -> ImpTestM era () whenPostBootstrap (ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) ()) -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ do unknownColdCred <- KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash ColdCommitteeRole -> Credential ColdCommitteeRole) -> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) -> ImpM (LedgerSpec era) (Credential ColdCommitteeRole) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash ColdCommitteeRole) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash unknownHotCred <- KeyHashObj <$> freshKeyHash let tx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era) forall era (l :: TxLevel). EraTx era => Lens' (Tx l era) (TxBody l era) forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era) bodyTxL ((TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxCert era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxCert era)) certsTxBodyL ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> StrictSeq (TxCert era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential ColdCommitteeRole -> Credential HotCommitteeRole -> TxCert era forall era. ConwayEraTxCert era => Credential ColdCommitteeRole -> Credential HotCommitteeRole -> TxCert era AuthCommitteeHotKeyTxCert Credential ColdCommitteeRole unknownColdCred Credential HotCommitteeRole unknownHotCred) submitFailingTx tx [injectFailure $ ConwayCommitteeIsUnknown unknownColdCred] void $ submitUpdateCommittee Nothing mempty [(unknownColdCred, EpochInterval 20)] (1 %! 2) submitTx_ tx String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "at protocol version 10, the vote is counted once the committee update is enacted" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ forall (v :: Natural) era. (EraGov era, KnownNat v, MinVersion <= v, v <= MaxVersion) => ImpTestM era () -> ImpTestM era () whenMajorVersion @10 (ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) ()) -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ do (drep, spo) <- ImpM (LedgerSpec era) (Credential DRepRole, KeyHash StakePool) setupGovEnv (gaiWithdrawal, initialMembers, proposedMember, gaiUpdateCommittee) <- proposeWithdrawalAndMember drep submitYesVote_ (DRepVoter drep) gaiUpdateCommittee submitYesVote_ (StakePoolVoter spo) gaiUpdateCommittee passEpoch expectMembers initialMembers proposedMemberHotKey <- registerCommitteeHotKey proposedMember submitYesVote_ (CommitteeVoter proposedMemberHotKey) gaiWithdrawal isCommitteeAccepted gaiWithdrawal `shouldReturn` False passEpoch expectMembers $ Set.singleton proposedMember ccShouldNotBeExpired proposedMember isCommitteeAccepted gaiWithdrawal `shouldReturn` True passNEpochs 2 expectMissingGovActionId gaiUpdateCommittee expectMissingGovActionId gaiWithdrawal String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "at protocol version 10, the vote is discarded when the committee update is rejected" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ forall (v :: Natural) era. (EraGov era, KnownNat v, MinVersion <= v, v <= MaxVersion) => ImpTestM era () -> ImpTestM era () whenMajorVersion @10 (ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) ()) -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ do (drep, spo) <- ImpM (LedgerSpec era) (Credential DRepRole, KeyHash StakePool) setupGovEnv (gaiWithdrawal, initialMembers, proposedMember, gaiUpdateCommittee) <- proposeWithdrawalAndMember drep submitVote_ VoteNo (DRepVoter drep) gaiUpdateCommittee submitVote_ VoteNo (StakePoolVoter spo) gaiUpdateCommittee passEpoch expectMembers initialMembers proposedMemberHotKey <- registerCommitteeHotKey proposedMember submitYesVote_ (CommitteeVoter proposedMemberHotKey) gaiWithdrawal isCommitteeAccepted gaiWithdrawal `shouldReturn` False passNEpochs 2 expectPresentGovActionId gaiUpdateCommittee expectCommitteeMemberAbsence proposedMember isCommitteeAccepted gaiWithdrawal `shouldReturn` False expectPresentGovActionId gaiWithdrawal String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "from protocol version 11, cannot vote until elected" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ forall (v :: Natural) era. (EraGov era, KnownNat v, MinVersion <= v, v <= MaxVersion) => ImpTestM era () -> ImpTestM era () whenMajorVersionAtLeast @11 (ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) ()) -> ImpM (LedgerSpec era) () -> ImpM (LedgerSpec era) () forall a b. (a -> b) -> a -> b $ do accountAddr <- ImpTestM era AccountAddress forall era. (HasCallStack, ShelleyEraImp era) => ImpTestM era AccountAddress registerAccountAddress gaiWithdrawal <- submitTreasuryWithdrawals [(accountAddr, Coin 1)] proposedMember <- KeyHashObj <$> freshKeyHash void $ submitUpdateCommittee Nothing mempty [(proposedMember, EpochInterval 20)] (1 %! 2) proposedMemberHotKey <- registerCommitteeHotKey proposedMember submitFailingVote (CommitteeVoter proposedMemberHotKey) gaiWithdrawal [injectFailure $ UnelectedCommitteeVoters [proposedMemberHotKey]] passNEpochs . fromIntegral =<< choose (1, 5 :: Int) submitFailingVote (CommitteeVoter proposedMemberHotKey) gaiWithdrawal [ injectFailure $ UnelectedCommitteeVoters [proposedMemberHotKey] , injectFailure $ VotersDoNotExist [CommitteeVoter proposedMemberHotKey] ]