{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.Conway.Binary.Regression where

import Cardano.Ledger.BaseTypes (Inject (..), StrictMaybe (..), TxIx (..))
import Cardano.Ledger.Binary (
  EncCBOR (..),
  decCBOR,
  decodeFull,
  decodeFullAnnotatorFromHexText,
  mkVersion,
  serialize,
 )
import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Conway (ConwayEra)
import Cardano.Ledger.Conway.Core
import Cardano.Ledger.Conway.Rules (
  ConwayLedgerPredFailure (..),
  ConwayUtxoPredFailure (..),
  ConwayUtxowPredFailure (..),
 )
import Cardano.Ledger.Plutus.Language (SLanguage (..), hashPlutusScript)
import Cardano.Ledger.TxIn (TxIn (..))
import Control.Monad ((<=<))
import qualified Data.Sequence.Strict as SSeq
import qualified Data.Set as Set
import Lens.Micro ((%~), (&), (.~))
import Test.Cardano.Ledger.Conway.ImpTest
import Test.Cardano.Ledger.Imp.Common
import Test.Cardano.Ledger.Plutus.Examples (redeemerSameAsDatum)

spec ::
  forall era.
  EraTx era =>
  Spec
spec :: forall era. EraTx era => Spec
spec = String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Regression" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
  String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"DeserialiseFailure on resubmitting Conway Tx with invalid plutus script #4198" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ do
    IO () -> IO ()
forall a. IO a -> IO a
io (IO () -> IO ())
-> (Either DecoderError (Tx TopTx era) -> IO ())
-> Either DecoderError (Tx TopTx era)
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either DecoderError (Tx TopTx era) -> IO ()
forall a b (m :: * -> *).
(HasCallStack, Show a, NFData b, MonadIO m) =>
Either a b -> m ()
expectRightDeep_ (Either DecoderError (Tx TopTx era) -> IO ())
-> Either DecoderError (Tx TopTx era) -> IO ()
forall a b. (a -> b) -> a -> b
$
      forall a.
Version
-> Text
-> (forall s. Decoder s (Annotator a))
-> Text
-> Either DecoderError a
decodeFullAnnotatorFromHexText @(Tx TopTx era) (forall era. Era era => Version
eraProtVerLow @era) Text
"Unwitnessed Tx" Decoder s (Annotator (Tx TopTx era))
forall s. Decoder s (Annotator (Tx TopTx era))
forall a s. DecCBOR a => Decoder s a
decCBOR (Text -> Either DecoderError (Tx TopTx era))
-> Text -> Either DecoderError (Tx TopTx era)
forall a b. (a -> b) -> a -> b
$
        [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat
          [ Text
"84a700d9010282825820745f04573e7429be1404f9b936d208b81159f3fc4b300"
          , Text
"37b9d630187eec1875600825820745f04573e7429be1404f9b936d208b81159f3"
          , Text
"fc4b30037b9d630187eec18756020dd9010281825820745f04573e7429be1404f"
          , Text
"9b936d208b81159f3fc4b30037b9d630187eec1875601018282581d60fdfaa525"
          , Text
"1e9ed2186a52eeea05ac1d39834eeef09b3e41dc151577a01a001e848082581d6"
          , Text
"0fe920c980dbc1113a01db0156955479f3b91f6fb6a51bdc0c383c1b91a3b586d"
          , Text
"e61082581d60fe920c980dbc1113a01db0156955479f3b91f6fb6a51bdc0c383c"
          , Text
"1b91a001a65b0111a00041ed0021a0002bf350b5820878c73eb6ec7171b23396f"
          , Text
"71d7e5adee98b3f72cfc1c0662453ea724a4e27ad5a303d9010281581e581c010"
          , Text
"0003322323222235004007123500235300300149849848004800504d9010281d8"
          , Text
"799f182aff0581840000d8799f182aff820000f4f6"
          ]
    Either DecoderError (Tx TopTx era) -> IO ()
forall a b (m :: * -> *).
(HasCallStack, Show a, NFData b, MonadIO m) =>
Either a b -> m ()
expectRightDeep_ (Either DecoderError (Tx TopTx era) -> IO ())
-> Either DecoderError (Tx TopTx era) -> IO ()
forall a b. (a -> b) -> a -> b
$
      forall a.
Version
-> Text
-> (forall s. Decoder s (Annotator a))
-> Text
-> Either DecoderError a
decodeFullAnnotatorFromHexText @(Tx TopTx era) (forall era. Era era => Version
eraProtVerLow @era) Text
"Witnessed Tx" Decoder s (Annotator (Tx TopTx era))
forall s. Decoder s (Annotator (Tx TopTx era))
forall a s. DecCBOR a => Decoder s a
decCBOR (Text -> Either DecoderError (Tx TopTx era))
-> Text -> Either DecoderError (Tx TopTx era)
forall a b. (a -> b) -> a -> b
$
        [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat
          [ Text
"84a700d9010282825820745f04573e7429be1404f9b936d208b81159f3fc4b300"
          , Text
"37b9d630187eec1875600825820745f04573e7429be1404f9b936d208b81159f3"
          , Text
"fc4b30037b9d630187eec18756020dd9010281825820745f04573e7429be1404f"
          , Text
"9b936d208b81159f3fc4b30037b9d630187eec1875601018282581d60fdfaa525"
          , Text
"1e9ed2186a52eeea05ac1d39834eeef09b3e41dc151577a01a001e848082581d6"
          , Text
"0fe920c980dbc1113a01db0156955479f3b91f6fb6a51bdc0c383c1b91a3b586d"
          , Text
"e61082581d60fe920c980dbc1113a01db0156955479f3b91f6fb6a51bdc0c383c"
          , Text
"1b91a001a65b0111a00041ed0021a0002bf350b5820878c73eb6ec7171b23396f"
          , Text
"71d7e5adee98b3f72cfc1c0662453ea724a4e27ad5a400d9010282825820119ca"
          , Text
"69d7aadd28f1e182176cbaa35f4e08d580b79ee749103f4106768594343584057"
          , Text
"de8c067f7b806001e94f740c9c96c51f884e264dd0b2d0cff501ad67f1d269b7a"
          , Text
"7af5adf92148f4a10855fe3b2090bc88f045603cfe14c8a5f3fed6c4008038258"
          , Text
"20468ed75ae68f72233e33b0a869ae5f00cfabe477f186184782e5a1994d189a9"
          , Text
"b58408395b8e91540804ce1860272ac72b4ecc682f567a33c33da8e835d736f1f"
          , Text
"c039ff86ee5aae0ac0e9c9d50506132e209f62a02fe04906b66a3392d48d4d627"
          , Text
"d0403d9010281581e581c01000033223232222350040071235002353003001498"
          , Text
"49848004800504d9010281d8799f182aff0581840000d8799f182aff820000f4f6"
          ]
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"ImpTest" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
    forall t. ImpSpec t => SpecWith (ImpInit t) -> Spec
withImpInit @(LedgerSpec ConwayEra) (SpecWith (ImpInit (LedgerSpec ConwayEra)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec ConwayEra)) -> Spec
forall a b. (a -> b) -> a -> b
$
      String
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"InsufficientCollateral is not encoded with negative coin #4198" (ImpM (LedgerSpec ConwayEra) ()
 -> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ())))
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a b. (a -> b) -> a -> b
$ do
        collateralAddress <- ImpM (LedgerSpec ConwayEra) Addr
forall s (m :: * -> *) g.
(HasKeyPairs s, MonadState s m, HasStatefulGen g m, MonadGen m) =>
m Addr
freshKeyAddr_
        stakingKeyHash <- freshKeyHash @Staking
        let
          plutusVersion = SLanguage 'PlutusV2
SPlutusV2
          scriptHash = Plutus 'PlutusV2 -> ScriptHash
forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash
hashPlutusScript (Plutus 'PlutusV2 -> ScriptHash) -> Plutus 'PlutusV2 -> ScriptHash
forall a b. (a -> b) -> a -> b
$ SLanguage 'PlutusV2 -> Plutus 'PlutusV2
forall (l :: Language). SLanguage l -> Plutus l
redeemerSameAsDatum SLanguage 'PlutusV2
plutusVersion
          lockScriptAddress = ScriptHash -> KeyHash Staking -> Addr
forall p s.
(MakeCredential p Payment, MakeStakeReference s) =>
p -> s -> Addr
mkAddr ScriptHash
scriptHash KeyHash Staking
stakingKeyHash
        collateralReturnAddr <- freshKeyAddr_
        lockedTx <-
          submitTxAnn @ConwayEra "Script locked tx" $
            mkBasicTx mkBasicTxBody
              & bodyTxL . outputsTxBodyL
                .~ SSeq.fromList
                  [ mkBasicTxOut lockScriptAddress mempty
                  , mkBasicTxOut collateralAddress mempty
                  ]
              & bodyTxL . collateralReturnTxBodyL
                .~ SJust (mkBasicTxOut collateralReturnAddr . inject $ Coin 862000)
        let
          modifyRootCoin = (Coin -> Identity Coin)
-> TxOut ConwayEra -> Identity (TxOut ConwayEra)
forall era. (HasCallStack, EraTxOut era) => Lens' (TxOut era) Coin
Lens' (TxOut ConwayEra) Coin
coinTxOutL ((Coin -> Identity Coin)
 -> TxOut ConwayEra -> Identity (TxOut ConwayEra))
-> Coin -> TxOut ConwayEra -> TxOut ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Integer -> Coin
Coin Integer
989482376
          modifyRootTxOut (TxOut ConwayEra
x SSeq.:<| StrictSeq (TxOut ConwayEra)
SSeq.Empty) =
            TxOut ConwayEra -> TxOut ConwayEra
modifyRootCoin TxOut ConwayEra
x TxOut ConwayEra
-> StrictSeq (TxOut ConwayEra) -> StrictSeq (TxOut ConwayEra)
forall a. a -> StrictSeq a -> StrictSeq a
SSeq.:<| StrictSeq (TxOut ConwayEra)
forall a. StrictSeq a
SSeq.Empty
          modifyRootTxOut (TxOut ConwayEra
x SSeq.:<| StrictSeq (TxOut ConwayEra)
xs) = TxOut ConwayEra
x TxOut ConwayEra
-> StrictSeq (TxOut ConwayEra) -> StrictSeq (TxOut ConwayEra)
forall a. a -> StrictSeq a -> StrictSeq a
SSeq.:<| StrictSeq (TxOut ConwayEra) -> StrictSeq (TxOut ConwayEra)
modifyRootTxOut StrictSeq (TxOut ConwayEra)
xs
          modifyRootTxOut (StrictSeq (TxOut ConwayEra)
xs SSeq.:|> TxOut ConwayEra
x) = StrictSeq (TxOut ConwayEra)
xs StrictSeq (TxOut ConwayEra)
-> TxOut ConwayEra -> StrictSeq (TxOut ConwayEra)
forall a. StrictSeq a -> a -> StrictSeq a
SSeq.:|> TxOut ConwayEra -> TxOut ConwayEra
modifyRootCoin TxOut ConwayEra
x
          modifyRootTxOut StrictSeq (TxOut ConwayEra)
SSeq.Empty = StrictSeq (TxOut ConwayEra)
forall a. StrictSeq a
SSeq.Empty
          breakCollaterals Tx TopTx ConwayEra
tx =
            Tx TopTx ConwayEra -> ImpTestM ConwayEra (Tx TopTx ConwayEra)
forall a. a -> ImpM (LedgerSpec ConwayEra) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Tx TopTx ConwayEra -> ImpTestM ConwayEra (Tx TopTx ConwayEra))
-> Tx TopTx ConwayEra -> ImpTestM ConwayEra (Tx TopTx ConwayEra)
forall a b. (a -> b) -> a -> b
$
              Tx TopTx ConwayEra
tx
                Tx TopTx ConwayEra
-> (Tx TopTx ConwayEra -> Tx TopTx ConwayEra) -> Tx TopTx ConwayEra
forall a b. a -> (a -> b) -> b
& (TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxBody l ConwayEra)
bodyTxL ((TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> ((StrictMaybe (BabbageTxOut ConwayEra)
     -> Identity (StrictMaybe (BabbageTxOut ConwayEra)))
    -> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> (StrictMaybe (BabbageTxOut ConwayEra)
    -> Identity (StrictMaybe (BabbageTxOut ConwayEra)))
-> Tx TopTx ConwayEra
-> Identity (Tx TopTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxOut ConwayEra)
 -> Identity (StrictMaybe (TxOut ConwayEra)))
-> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra)
(StrictMaybe (BabbageTxOut ConwayEra)
 -> Identity (StrictMaybe (BabbageTxOut ConwayEra)))
-> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra)
forall era.
BabbageEraTxBody era =>
Lens' (TxBody TopTx era) (StrictMaybe (TxOut era))
Lens' (TxBody TopTx ConwayEra) (StrictMaybe (TxOut ConwayEra))
collateralReturnTxBodyL
                  ((StrictMaybe (BabbageTxOut ConwayEra)
  -> Identity (StrictMaybe (BabbageTxOut ConwayEra)))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> StrictMaybe (BabbageTxOut ConwayEra)
-> Tx TopTx ConwayEra
-> Tx TopTx ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ BabbageTxOut ConwayEra -> StrictMaybe (BabbageTxOut ConwayEra)
forall a. a -> StrictMaybe a
SJust (Addr -> Value ConwayEra -> TxOut ConwayEra
forall era.
(EraTxOut era, HasCallStack) =>
Addr -> Value era -> TxOut era
mkBasicTxOut Addr
collateralReturnAddr (Value ConwayEra -> BabbageTxOut ConwayEra)
-> (Coin -> Value ConwayEra) -> Coin -> BabbageTxOut ConwayEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Coin -> Value ConwayEra
forall t s. Inject t s => t -> s
inject (Coin -> BabbageTxOut ConwayEra) -> Coin -> BabbageTxOut ConwayEra
forall a b. (a -> b) -> a -> b
$ Integer -> Coin
Coin Integer
1_000_000_000)
                Tx TopTx ConwayEra
-> (Tx TopTx ConwayEra -> Tx TopTx ConwayEra) -> Tx TopTx ConwayEra
forall a b. a -> (a -> b) -> b
& (TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxBody l ConwayEra)
bodyTxL ((TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> ((Coin -> Identity Coin)
    -> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> (Coin -> Identity Coin)
-> Tx TopTx ConwayEra
-> Identity (Tx TopTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Coin -> Identity Coin)
-> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra)
forall era. EraTxBody era => Lens' (TxBody TopTx era) Coin
Lens' (TxBody TopTx ConwayEra) Coin
feeTxBodyL ((Coin -> Identity Coin)
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> Coin -> Tx TopTx ConwayEra -> Tx TopTx ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Integer -> Coin
Coin Integer
178349
                Tx TopTx ConwayEra
-> (Tx TopTx ConwayEra -> Tx TopTx ConwayEra) -> Tx TopTx ConwayEra
forall a b. a -> (a -> b) -> b
& (TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxBody l ConwayEra)
bodyTxL ((TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> ((StrictSeq (TxOut ConwayEra)
     -> Identity (StrictSeq (TxOut ConwayEra)))
    -> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra))
-> (StrictSeq (TxOut ConwayEra)
    -> Identity (StrictSeq (TxOut ConwayEra)))
-> Tx TopTx ConwayEra
-> Identity (Tx TopTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictSeq (TxOut ConwayEra)
 -> Identity (StrictSeq (TxOut ConwayEra)))
-> TxBody TopTx ConwayEra -> Identity (TxBody TopTx ConwayEra)
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (StrictSeq (TxOut era))
forall (l :: TxLevel).
Lens' (TxBody l ConwayEra) (StrictSeq (TxOut ConwayEra))
outputsTxBodyL ((StrictSeq (TxOut ConwayEra)
  -> Identity (StrictSeq (TxOut ConwayEra)))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> (StrictSeq (TxOut ConwayEra) -> StrictSeq (TxOut ConwayEra))
-> Tx TopTx ConwayEra
-> Tx TopTx ConwayEra
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ StrictSeq (TxOut ConwayEra) -> StrictSeq (TxOut ConwayEra)
modifyRootTxOut
                Tx TopTx ConwayEra
-> (Tx TopTx ConwayEra -> Tx TopTx ConwayEra) -> Tx TopTx ConwayEra
forall a b. a -> (a -> b) -> b
& (TxWits ConwayEra -> Identity (TxWits ConwayEra))
-> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra)
(AlonzoTxWits ConwayEra -> Identity (AlonzoTxWits ConwayEra))
-> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxWits era)
forall (l :: TxLevel). Lens' (Tx l ConwayEra) (TxWits ConwayEra)
witsTxL ((AlonzoTxWits ConwayEra -> Identity (AlonzoTxWits ConwayEra))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> ((Set (WitVKey Witness) -> Identity (Set (WitVKey Witness)))
    -> AlonzoTxWits ConwayEra -> Identity (AlonzoTxWits ConwayEra))
-> (Set (WitVKey Witness) -> Identity (Set (WitVKey Witness)))
-> Tx TopTx ConwayEra
-> Identity (Tx TopTx ConwayEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set (WitVKey Witness) -> Identity (Set (WitVKey Witness)))
-> TxWits ConwayEra -> Identity (TxWits ConwayEra)
(Set (WitVKey Witness) -> Identity (Set (WitVKey Witness)))
-> AlonzoTxWits ConwayEra -> Identity (AlonzoTxWits ConwayEra)
forall era.
EraTxWits era =>
Lens' (TxWits era) (Set (WitVKey Witness))
Lens' (TxWits ConwayEra) (Set (WitVKey Witness))
addrTxWitsL ((Set (WitVKey Witness) -> Identity (Set (WitVKey Witness)))
 -> Tx TopTx ConwayEra -> Identity (Tx TopTx ConwayEra))
-> Set (WitVKey Witness)
-> Tx TopTx ConwayEra
-> Tx TopTx ConwayEra
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Set (WitVKey Witness)
forall a. Monoid a => a
mempty
        res <-
          impAnn "Consume the script locked output" $
            withPostFixup (updateAddrTxWits <=< breakCollaterals) $ do
              trySubmitTx @ConwayEra $
                mkBasicTx mkBasicTxBody
                  & bodyTxL . inputsTxBodyL .~ Set.singleton (TxIn (txIdTx lockedTx) $ TxIx 0)
        (pFailure, _) <- impAnn "Expecting failure" $ expectLeftDeepExpr res
        let
          hasInsufficientCollateral
            (ConwayUtxowFailure (UtxoFailure (InsufficientCollateral DeltaCoin
_ Coin
_))) = Bool
True
          hasInsufficientCollateral ConwayLedgerPredFailure era
_ = Bool
False
        impAnn "Fails with InsufficientCollateral" $
          pFailure `shouldSatisfyExpr` any hasInsufficientCollateral
        let encoding = NonEmpty (ConwayLedgerPredFailure ConwayEra) -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR NonEmpty (ConwayLedgerPredFailure ConwayEra)
pFailure
        version <- mkVersion (11 :: Int)
        let
          bs = Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize Version
version Encoding
encoding
          decoded = Version
-> ByteString
-> Either
     DecoderError (NonEmpty (ConwayLedgerPredFailure ConwayEra))
forall a.
DecCBOR a =>
Version -> ByteString -> Either DecoderError a
decodeFull Version
version ByteString
bs
        impAnn "Expecting deserialization of predicate failure to succeed" $
          decoded `shouldBe` Right pFailure