{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE ScopedTypeVariables #-} module Test.Cardano.Ledger.Dijkstra.Imp.SubLedgerSpec (spec) where import Cardano.Ledger.BaseTypes (Mismatch (..)) import Cardano.Ledger.Coin (Coin (..)) import Cardano.Ledger.Dijkstra.Core import Cardano.Ledger.Dijkstra.Rules (DijkstraSubLedgerPredFailure (..)) import Cardano.Ledger.State (treasuryL) 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 = String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "SUBLEDGER" (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 "SubTreasuryValueMismatch" (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 "a sub-transaction declares a treasury value other than the actual one" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do actualTreasury <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) SimpleGetter (NewEpochState era) Coin Lens' (NewEpochState era) Coin forall (t :: * -> *) era. CanSetChainAccountState t => Lens' (t era) Coin treasuryL let declaredTreasury = Coin actualTreasury Coin -> Coin -> Coin forall a. Semigroup a => a -> a -> a <> Integer -> Coin Coin Integer 1 submitFailingSubTx (declareTreasurySubTx declaredTreasury) [ injectFailure . SubTreasuryValueMismatch $ Mismatch { mismatchSupplied = declaredTreasury , mismatchExpected = actualTreasury } ] String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "every sub-transaction is checked against the same treasury value" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do actualTreasury <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) SimpleGetter (NewEpochState era) Coin Lens' (NewEpochState era) Coin forall (t :: * -> *) era. CanSetChainAccountState t => Lens' (t era) Coin treasuryL let declaredFirst = Coin actualTreasury Coin -> Coin -> Coin forall a. Semigroup a => a -> a -> a <> Integer -> Coin Coin Integer 1 declaredSecond = Coin actualTreasury Coin -> Coin -> Coin forall a. Semigroup a => a -> a -> a <> Integer -> Coin Coin Integer 2 submitFailingTx (mkTopTxWithSubTxs [declareTreasurySubTx declaredFirst, declareTreasurySubTx declaredSecond]) [ injectFailure . SubTreasuryValueMismatch $ Mismatch { mismatchSupplied = declaredFirst , mismatchExpected = actualTreasury } , injectFailure . SubTreasuryValueMismatch $ Mismatch { mismatchSupplied = declaredSecond , mismatchExpected = actualTreasury } ] String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Accepted at the boundary" (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 "a sub-transaction declares the actual treasury value" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do actualTreasury <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) SimpleGetter (NewEpochState era) Coin Lens' (NewEpochState era) Coin forall (t :: * -> *) era. CanSetChainAccountState t => Lens' (t era) Coin treasuryL submitTx_ . mkTopTxWithSubTxs $ [declareTreasurySubTx actualTreasury] String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "a treasury donation in an earlier sub-transaction does not change the value checked" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do actualTreasury <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) SimpleGetter (NewEpochState era) Coin Lens' (NewEpochState era) Coin forall (t :: * -> *) era. CanSetChainAccountState t => Lens' (t era) Coin treasuryL let donatingSubTx :: Tx SubTx era donatingSubTx = 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 -> Tx SubTx era) -> TxBody SubTx era -> Tx SubTx era forall a b. (a -> b) -> a -> b $ TxBody SubTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody SubTx era -> (TxBody SubTx era -> TxBody SubTx era) -> TxBody SubTx era forall a b. a -> (a -> b) -> b & (Coin -> Identity Coin) -> TxBody SubTx era -> Identity (TxBody SubTx era) forall era (l :: TxLevel). ConwayEraTxBody era => Lens' (TxBody l era) Coin forall (l :: TxLevel). Lens' (TxBody l era) Coin treasuryDonationTxBodyL ((Coin -> Identity Coin) -> TxBody SubTx era -> Identity (TxBody SubTx era)) -> Coin -> TxBody SubTx era -> TxBody SubTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ Integer -> Coin Coin Integer 1_000 submitTx_ . mkTopTxWithSubTxs $ [donatingSubTx, declareTreasurySubTx actualTreasury] String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "A phase-2 invalid top level transaction" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ String -> ImpM (LedgerSpec era) () -> SpecWith (ImpInit (LedgerSpec era)) forall era. ShelleyEraImp era => String -> ImpTestM era () -> SpecWith (ImpInit (LedgerSpec era)) disableInConformanceIt String "raises no SUBLEDGER failure" (ImpM (LedgerSpec era) () -> SpecWith (ImpInit (LedgerSpec era))) -> ImpM (LedgerSpec era) () -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do actualTreasury <- SimpleGetter (NewEpochState era) Coin -> ImpTestM era Coin forall era a. SimpleGetter (NewEpochState era) a -> ImpTestM era a getsNES (Coin -> Const r Coin) -> NewEpochState era -> Const r (NewEpochState era) SimpleGetter (NewEpochState era) Coin Lens' (NewEpochState era) Coin forall (t :: * -> *) era. CanSetChainAccountState t => Lens' (t era) Coin treasuryL topTx <- switchTxToPhase2InvalidLegacyMode . mkTopTxWithSubTxs $ [declareTreasurySubTx $ actualTreasury <> Coin 1] submitTx_ $ topTx & isPhase2ValidTxL .~ Phase2Invalid