{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Test.Cardano.Ledger.Dijkstra.Imp.CertSpec (spec) where import Cardano.Ledger.Conway.Governance (Voter (..)) import Cardano.Ledger.Credential (Credential (..)) import Cardano.Ledger.Dijkstra.Core import Cardano.Ledger.Dijkstra.TxBody (DijkstraEraTxBody (..)) import qualified Data.List.NonEmpty as NE import Data.Maybe.Strict (StrictMaybe (..)) import qualified Data.OMap.Strict as OMap import qualified Data.Sequence.Strict as SSeq import qualified Data.Set as Set import Lens.Micro ((&), (.~)) import Test.Cardano.Ledger.Dijkstra.ImpTest import Test.Cardano.Ledger.Imp.Common spec :: forall era. DijkstraEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. DijkstraEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec = do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) xit String "Subtransaction consumes correct refund after keyDeposit is changed" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do stakingCred <- 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 _ <- registerStakeCredential stakingCred initialKeyDeposit <- getsPParams ppKeyDepositL impAnn "Change key deposit" $ do (dRep, _, _) <- setupSingleDRep 100_000_000 ccHotCreds <- registerInitialCommittee let newKeyDeposit = Coin initialKeyDeposit Coin -> Coin -> Coin forall a. Semigroup a => a -> a -> a <> Coin initialKeyDeposit ppChangeId <- submitParameterChange SNothing $ emptyPParamsUpdate & ppuKeyDepositL .~ SJust newKeyDeposit submitYesVote_ (DRepVoter dRep) ppChangeId submitYesVoteCCs_ ccHotCreds ppChangeId getsPParams ppKeyDepositL `shouldReturn` initialKeyDeposit passNEpochs 2 getsPParams ppKeyDepositL `shouldReturn` newKeyDeposit impAnn "Unregister staking credential" $ do expectStakeCredRegistered stakingCred let deRegCert = Credential Staking -> Coin -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Coin -> TxCert era UnRegDepositTxCert Credential Staking stakingCred Coin initialKeyDeposit subTransaction = 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 .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton TxCert era deRegCert submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . subTransactionsTxBodyL .~ OMap.singleton subTransaction expectStakeCredNotRegistered stakingCred String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) xit String "Multiple subtransactions cannot get the same 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 stakingCred <- 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 _ <- registerStakeCredential stakingCred keyDeposit <- getsPParams ppKeyDepositL value1 <- arbitrary (_, addr1) <- freshKeyAddr input1 <- sendCoinTo addr1 value1 value2 <- arbitrary (_, addr2) <- freshKeyAddr input2 <- sendCoinTo addr2 value2 let subTx1 = 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)) -> ((Set TxIn -> Identity (Set TxIn)) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> (Set TxIn -> Identity (Set TxIn)) -> Tx SubTx era -> Identity (Tx SubTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Set TxIn -> Identity (Set TxIn)) -> TxBody SubTx era -> Identity (TxBody SubTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (Set TxIn) forall (l :: TxLevel). Lens' (TxBody l era) (Set TxIn) inputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> Tx SubTx era -> Identity (Tx SubTx era)) -> Set TxIn -> Tx SubTx era -> Tx SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxIn -> Set TxIn forall a. a -> Set a Set.singleton TxIn input1 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 .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential Staking -> Coin -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Coin -> TxCert era UnRegDepositTxCert Credential Staking stakingCred Coin keyDeposit) subTx2 = 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)) -> ((Set TxIn -> Identity (Set TxIn)) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> (Set TxIn -> Identity (Set TxIn)) -> Tx SubTx era -> Identity (Tx SubTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Set TxIn -> Identity (Set TxIn)) -> TxBody SubTx era -> Identity (TxBody SubTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (Set TxIn) forall (l :: TxLevel). Lens' (TxBody l era) (Set TxIn) inputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> Tx SubTx era -> Identity (Tx SubTx era)) -> Set TxIn -> Tx SubTx era -> Tx SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxIn -> Set TxIn forall a. a -> Set a Set.singleton TxIn input2 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 .~ TxCert era -> StrictSeq (TxCert era) forall a. a -> StrictSeq a SSeq.singleton (Credential Staking -> Coin -> TxCert era forall era. ConwayEraTxCert era => Credential Staking -> Coin -> TxCert era UnRegDepositTxCert Credential Staking stakingCred Coin keyDeposit) 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)) -> ((OMap TxId (Tx SubTx era) -> Identity (OMap TxId (Tx SubTx era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (OMap TxId (Tx SubTx era) -> Identity (OMap TxId (Tx SubTx era))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (OMap TxId (Tx SubTx era) -> Identity (OMap TxId (Tx SubTx era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era. DijkstraEraTxBody era => Lens' (TxBody TopTx era) (OMap TxId (Tx SubTx era)) Lens' (TxBody TopTx era) (OMap TxId (Tx SubTx era)) subTransactionsTxBodyL ((OMap TxId (Tx SubTx era) -> Identity (OMap TxId (Tx SubTx era))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> OMap TxId (Tx SubTx era) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Tx SubTx era] -> OMap TxId (Tx SubTx era) forall (f :: * -> *) k v. (Foldable f, HasOKey k v) => f v -> OMap k v OMap.fromFoldable [Tx SubTx era subTx1, Tx SubTx era subTx2] submitFailingTx tx . NE.singleton $ error "TODO: predicate failure not yet implemented"