{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} module Test.Cardano.Ledger.Dijkstra.Imp.SubDelegSpec (spec) where import Cardano.Ledger.BaseTypes import Cardano.Ledger.Coin (Coin (..)) import Cardano.Ledger.Conway.Rules (ConwayDelegPredFailure (..)) import Cardano.Ledger.Conway.TxCert (Delegatee (..)) import Cardano.Ledger.Credential (Credential (..)) import Cardano.Ledger.Dijkstra.Core import Cardano.Ledger.Dijkstra.Rules (DijkstraSubDelegPredFailure (..)) import Cardano.Ledger.Dijkstra.State import Cardano.Ledger.Plutus (SLanguage (..), hashPlutusScript) import Cardano.Ledger.Shelley.LedgerState ( curPParamsEpochStateL, nesEsL, ) import Cardano.Ledger.Shelley.Rules (AccountAlreadyRegistered (..)) import Cardano.Ledger.Val (Val (..)) import Lens.Micro ((&), (.~)) import Test.Cardano.Ledger.Common ( Positive (..), SpecWith, describe, it, ) import Test.Cardano.Ledger.Dijkstra.ImpTest import Test.Cardano.Ledger.Imp.Common (arbitrary) import Test.Cardano.Ledger.Plutus.Examples (evenRedeemerNoDatum) spec :: forall era. DijkstraEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. DijkstraEraImp 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 "SUBDELEG" (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 -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Register stake credential" (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 "With incorrect deposit" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do expectedDeposit <- 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. (EraPParams era, HasCallStack) => Lens' (PParams era) Coin Lens' (PParams era) Coin ppKeyDepositL Positive n <- arbitrary let wrongDeposit = Coin expectedDeposit Coin -> Coin -> Coin forall t. Val t => t -> t -> t <+> Integer -> Coin Coin Integer n freshKeyHash >>= \KeyHash Staking kh -> do Tx TopTx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpM (LedgerSpec era) () forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitFailingTx ( [Tx SubTx era] -> Tx TopTx era forall era. DijkstraEraImp era => [Tx SubTx era] -> Tx TopTx era mkTopTxWithSubTxs [ TxBody SubTx era -> Tx SubTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody SubTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx SubTx era -> (Tx SubTx era -> Tx SubTx era) -> Tx SubTx era forall a b. a -> (a -> b) -> b & (TxBody SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx 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 SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx SubTx era -> Identity (Tx SubTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx 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 SubTx era -> Identity (Tx SubTx era)) -> StrictSeq (TxCert era) -> Tx SubTx era -> Tx SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Credential Staking -> Coin -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Coin -> TxCert era RegDepositTxCert (KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj KeyHash Staking kh) Coin wrongDeposit] ] ) [ DijkstraSubDelegPredFailure era -> Item (NonEmpty (EraRuleFailure "LEDGER" era)) DijkstraSubDelegPredFailure era -> EraRuleFailure "LEDGER" era forall (rule :: Symbol) (t :: * -> *) era. InjectRuleFailure rule t era => t era -> EraRuleFailure rule era injectFailure (DijkstraSubDelegPredFailure era -> Item (NonEmpty (EraRuleFailure "LEDGER" era))) -> (ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era) -> ConwayDelegPredFailure era -> Item (NonEmpty (EraRuleFailure "LEDGER" era)) forall b c a. (b -> c) -> (a -> b) -> a -> c . ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era forall era. ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era DijkstraSubDelegPredFailure (ConwayDelegPredFailure era -> Item (NonEmpty (EraRuleFailure "LEDGER" era))) -> ConwayDelegPredFailure era -> Item (NonEmpty (EraRuleFailure "LEDGER" era)) forall a b. (a -> b) -> a -> b $ Mismatch RelEQ Coin -> ConwayDelegPredFailure era forall era. Mismatch RelEQ Coin -> ConwayDelegPredFailure era DepositIncorrectDELEG Mismatch { mismatchSupplied :: Coin mismatchSupplied = Coin wrongDeposit , mismatchExpected :: Coin mismatchExpected = Coin expectedDeposit } ] Credential Staking -> ImpM (LedgerSpec era) () forall era. (HasCallStack, ShelleyEraImp era) => Credential Staking -> ImpTestM era () expectStakeCredNotRegistered (KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj KeyHash Staking kh) String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Fails when the credential is 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 cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash regTxCert <- genRegTxCert cred submitTx_ $ mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [regTxCert] ] expectStakeCredRegistered cred regTxCert2 <- genRegTxCert cred submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [regTxCert2] ] ) [ injectFailure . DijkstraSubDelegPredFailure . DelegAccountAlreadyRegistered $ AccountAlreadyRegistered cred ] String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Unregister stake credentials" (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 "Fails when the credential is not 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 cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash expectedDeposit <- getsNES $ nesEsL . curPParamsEpochStateL . ppKeyDepositL submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [UnRegDepositTxCert cred expectedDeposit] ] ) [injectFailure . DijkstraSubDelegPredFailure $ StakeKeyNotRegisteredDELEG cred] String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Fails when the account has a non-zero balance" (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, HasCallStack) => Lens' (PParams era) Coin Lens' (PParams era) Coin ppGovActionDepositL ((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 3 cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash regTxCert <- genRegTxCert cred submitTx_ $ mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [regTxCert] ] submitAndExpireProposalToMakeReward cred balance <- getBalance cred unRegTxCert <- genUnRegTxCert cred submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [unRegTxCert] ] ) [ injectFailure . DijkstraSubDelegPredFailure $ StakeKeyHasNonZeroAccountBalanceDELEG balance ] expectStakeCredRegistered cred String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "With incorrect refund" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do expectedDeposit <- 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. (EraPParams era, HasCallStack) => Lens' (PParams era) Coin Lens' (PParams era) Coin ppKeyDepositL let cred = ScriptHash -> Credential kr forall (kr :: KeyRole). ScriptHash -> Credential kr ScriptHashObj (ScriptHash -> Credential kr) -> ScriptHash -> Credential kr forall a b. (a -> b) -> a -> b $ Plutus 'PlutusV4 -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus 'PlutusV4 -> ScriptHash) -> Plutus 'PlutusV4 -> ScriptHash forall a b. (a -> b) -> a -> b $ SLanguage 'PlutusV4 -> Plutus 'PlutusV4 forall (l :: Language). SLanguage l -> Plutus l evenRedeemerNoDatum SLanguage 'PlutusV4 SPlutusV4 impAnn "Register stake credential" $ submitTx_ $ mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [RegDepositTxCert cred expectedDeposit] ] Positive n <- arbitrary let wrongDeposit = Coin expectedDeposit Coin -> Coin -> Coin forall t. Val t => t -> t -> t <+> Integer -> Coin Coin Integer n submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [UnRegDepositTxCert cred wrongDeposit] ] ) [ injectFailure . DijkstraSubDelegPredFailure $ RefundIncorrectDELEG Mismatch { mismatchSupplied = wrongDeposit , mismatchExpected = expectedDeposit } ] expectStakeCredRegistered cred String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Delegate stake" (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 "Delegate to unregistered pool" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash regTxCert <- genRegTxCert cred submitTx_ $ mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [regTxCert] ] poolKh <- freshKeyHash submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [DelegTxCert cred (DelegStake poolKh)] ] ) [injectFailure . DijkstraSubDelegPredFailure $ DelegateeStakePoolNotRegisteredDELEG poolKh] expectNotDelegatedToAnyPool cred String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Delegate vote" (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 "Delegate vote of registered stake credentials to unregistered 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 AccountAddress _ (AccountId cred) <- ImpTestM era AccountAddress forall era. (HasCallStack, ShelleyEraImp era) => ImpTestM era AccountAddress registerAccountAddress drepCred <- KeyHashObj <$> freshKeyHash let tx = [Tx SubTx era] -> Tx TopTx era forall era. DijkstraEraImp era => [Tx SubTx era] -> Tx TopTx era mkTopTxWithSubTxs [ TxBody SubTx era -> Tx SubTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody SubTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx SubTx era -> (Tx SubTx era -> Tx SubTx era) -> Tx SubTx era forall a b. a -> (a -> b) -> b & (TxBody SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx 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 SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx SubTx era -> Identity (Tx SubTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx 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 SubTx era -> Identity (Tx SubTx era)) -> StrictSeq (TxCert era) -> Tx SubTx era -> Tx SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Credential Staking -> Delegatee -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Delegatee -> TxCert era DelegTxCert Credential Staking cred (DRep -> Delegatee DelegVote (Credential DRepRole -> DRep DRepCredential Credential DRepRole drepCred))] ] submitFailingTx tx [injectFailure . DijkstraSubDelegPredFailure $ DelegateeDRepNotRegisteredDELEG drepCred] expectNotDelegatedVote cred String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Delegate vote of unregistered stake credentials" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash drepCred <- KeyHashObj <$> registerDRep submitFailingTx ( mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [DelegTxCert cred (DelegVote (DRepCredential drepCred))] ] ) [injectFailure . DijkstraSubDelegPredFailure $ StakeKeyNotRegisteredDELEG cred] expectStakeCredNotRegistered cred String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Delegate both stake and vote" (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 "Fails to delegate to unregistered delegatees" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do cred <- KeyHash Staking -> Credential Staking forall (kr :: KeyRole). KeyHash kr -> Credential kr KeyHashObj (KeyHash Staking -> Credential Staking) -> ImpM (LedgerSpec era) (KeyHash Staking) -> ImpM (LedgerSpec era) (Credential Staking) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> ImpM (LedgerSpec era) (KeyHash Staking) forall (r :: KeyRole) s g (m :: * -> *). (HasKeyPairs s, MonadState s m, HasStatefulGen g m) => m (KeyHash r) freshKeyHash regTxCert <- genRegTxCert cred submitTx_ $ mkTopTxWithSubTxs [ mkBasicTx mkBasicTxBody & bodyTxL . certsTxBodyL .~ [regTxCert] ] poolKh <- freshKeyHash drepCred <- KeyHashObj <$> freshKeyHash let tx = [Tx SubTx era] -> Tx TopTx era forall era. DijkstraEraImp era => [Tx SubTx era] -> Tx TopTx era mkTopTxWithSubTxs [ TxBody SubTx era -> Tx SubTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx TxBody SubTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx SubTx era -> (Tx SubTx era -> Tx SubTx era) -> Tx SubTx era forall a b. a -> (a -> b) -> b & (TxBody SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx 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 SubTx era -> Identity (TxBody SubTx era)) -> Tx SubTx era -> Identity (Tx SubTx era)) -> ((StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> Tx SubTx era -> Identity (Tx SubTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (StrictSeq (TxCert era) -> Identity (StrictSeq (TxCert era))) -> TxBody SubTx era -> Identity (TxBody SubTx 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 SubTx era -> Identity (Tx SubTx era)) -> StrictSeq (TxCert era) -> Tx SubTx era -> Tx SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Credential Staking -> Delegatee -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Delegatee -> TxCert era DelegTxCert Credential Staking cred (KeyHash StakePool -> DRep -> Delegatee DelegStakeVote KeyHash StakePool poolKh (Credential DRepRole -> DRep DRepCredential Credential DRepRole drepCred))] ] poolFailure = DijkstraSubDelegPredFailure era -> EraRuleFailure "LEDGER" era forall (rule :: Symbol) (t :: * -> *) era. InjectRuleFailure rule t era => t era -> EraRuleFailure rule era injectFailure (DijkstraSubDelegPredFailure era -> EraRuleFailure "LEDGER" era) -> (ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era) -> ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era forall b c a. (b -> c) -> (a -> b) -> a -> c . ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era forall era. ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era DijkstraSubDelegPredFailure (ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era) -> ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era forall a b. (a -> b) -> a -> b $ KeyHash StakePool -> ConwayDelegPredFailure era forall era. KeyHash StakePool -> ConwayDelegPredFailure era DelegateeStakePoolNotRegisteredDELEG KeyHash StakePool poolKh drepFailure = DijkstraSubDelegPredFailure era -> EraRuleFailure "LEDGER" era forall (rule :: Symbol) (t :: * -> *) era. InjectRuleFailure rule t era => t era -> EraRuleFailure rule era injectFailure (DijkstraSubDelegPredFailure era -> EraRuleFailure "LEDGER" era) -> (ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era) -> ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era forall b c a. (b -> c) -> (a -> b) -> a -> c . ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era forall era. ConwayDelegPredFailure era -> DijkstraSubDelegPredFailure era DijkstraSubDelegPredFailure (ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era) -> ConwayDelegPredFailure era -> EraRuleFailure "LEDGER" era forall a b. (a -> b) -> a -> b $ Credential DRepRole -> ConwayDelegPredFailure era forall era. Credential DRepRole -> ConwayDelegPredFailure era DelegateeDRepNotRegisteredDELEG Credential DRepRole drepCred submitFailingTx tx [poolFailure, drepFailure] expectNotDelegatedToAnyPool cred