{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-unused-foralls #-}

module Test.Cardano.Ledger.Conway.Binary.Golden (
  spec,
  listRedeemersEnc,
  goldenListRedeemers,
  goldenMapRedeemers,
  witsEmptyFieldWithSetTag,
  conwayDecodeDuplicateDelegCertFails,
  expectFailureOnTxWitsEmptyFieldWithTag,
  module Test.Cardano.Ledger.Alonzo.Binary.Golden,
) where

import Cardano.Ledger.Alonzo.Core (
  AsIx (..),
  EraTxWits (..),
  TxLevel (..),
  eraProtVerLow,
  pattern SpendingPurpose,
 )
import Cardano.Ledger.Alonzo.Scripts (ExUnits (..))
import Cardano.Ledger.Alonzo.TxWits (Redeemers (..), unRedeemers)
import Cardano.Ledger.Binary (
  Annotator,
  DecCBOR,
  DecoderError (..),
  DeserialiseFailure (..),
  Version,
 )
import qualified Cardano.Ledger.Binary as Binary
import Cardano.Ledger.Binary.Plain (Tokens (..))
import qualified Cardano.Ledger.Binary.Plain as Plain
import Cardano.Ledger.Conway.Core (
  EraTxBody (..),
 )
import Cardano.Ledger.Plutus (Data (..))
import qualified Data.Map as Map
import Data.Proxy (Proxy (..))
import Data.Void (Void)
import PlutusLedgerApi.Common (Data (..))
import Test.Cardano.Ledger.Alonzo.Binary.Golden hiding (spec)
import Test.Cardano.Ledger.Binary.Plain.Golden (Enc (..))
import Test.Cardano.Ledger.Common (
  Expectation,
  Spec,
  ToExpr,
  describe,
  expectLeft,
  expectRight,
  expectationFailure,
  it,
  shouldBe,
 )
import Test.Cardano.Ledger.Conway.Era (ConwayEraTest)
import Test.Cardano.Ledger.Imp.Common (forEachEraVersion)

-- | A simple redeemer encoded as a list
listRedeemersEnc :: Enc
listRedeemersEnc :: Enc
listRedeemersEnc =
  [Enc] -> Enc
forall a. Monoid a => [a] -> a
mconcat
    [ (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
1)
    , [Enc] -> Enc
forall a. Monoid a => [a] -> a
mconcat
        [ (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
4)
        , Int -> Enc
forall a. ToCBOR a => a -> Enc
E (Int
0 :: Int)
        , Int -> Enc
forall a. ToCBOR a => a -> Enc
E (Int
10 :: Int)
        , Int -> Enc
forall a. ToCBOR a => a -> Enc
E (Int
20 :: Int)
        , [Enc] -> Enc
forall a. Monoid a => [a] -> a
mconcat
            [ (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
2)
            , Int -> Enc
forall a. ToCBOR a => a -> Enc
E (Int
30 :: Int)
            , Int -> Enc
forall a. ToCBOR a => a -> Enc
E (Int
40 :: Int)
            ]
        ]
    ]

goldenListRedeemers :: forall era. ConwayEraTest era => Spec
goldenListRedeemers :: forall era. ConwayEraTest era => Spec
goldenListRedeemers =
  String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding Redeemers encoded as a list succeeds" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$
    forall a b.
(DecCBOR (Annotator a), Eq b, HasCallStack, Show b) =>
Version -> Enc -> a -> (a -> b) -> Expectation
expectDecoderResultOn @(Redeemers era)
      (forall era. Era era => Version
eraProtVerLow @era)
      Enc
listRedeemersEnc
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Redeemers era
forall era.
AlonzoEraScript era =>
Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Redeemers era
Redeemers (Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Redeemers era)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
-> Redeemers era
forall a b. (a -> b) -> a -> b
$ PlutusPurpose AsIx era
-> (Data era, ExUnits)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall k a. k -> a -> Map k a
Map.singleton (AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 TxIn -> PlutusPurpose f era
SpendingPurpose (AsIx Word32 TxIn -> PlutusPurpose AsIx era)
-> AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall a b. (a -> b) -> a -> b
$ Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
AsIx Word32
10) (Data -> Data era
forall era. Era era => Data -> Data era
Data (Data -> Data era) -> Data -> Data era
forall a b. (a -> b) -> a -> b
$ Integer -> Data
I Integer
20, Natural -> Natural -> ExUnits
ExUnits Natural
30 Natural
40))
      Redeemers era -> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall era.
Redeemers era -> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
unRedeemers

goldenMapRedeemers :: forall era. ConwayEraTest era => Version -> Spec
goldenMapRedeemers :: forall era. ConwayEraTest era => Version -> Spec
goldenMapRedeemers Version
version =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Redeemer maps" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
    ((String, Enc -> Either DecoderError (Redeemers era)) -> Spec)
-> [(String, Enc -> Either DecoderError (Redeemers era))] -> Spec
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_
      ( \(String
decoderName, Enc -> Either DecoderError (Redeemers era)
decodeRedeemers) ->
          String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
decoderName (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
            ((String, [Enc] -> Enc, ByteOffset, ByteOffset) -> Spec)
-> [(String, [Enc] -> Enc, ByteOffset, ByteOffset)] -> Spec
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((Enc -> Either DecoderError (Redeemers era))
-> (String, [Enc] -> Enc, ByteOffset, ByteOffset) -> Spec
forall {a}.
(a -> Either DecoderError (Redeemers era))
-> (String, [Enc] -> a, ByteOffset, ByteOffset) -> Spec
checkEncoding Enc -> Either DecoderError (Redeemers era)
decodeRedeemers) [(String, [Enc] -> Enc, ByteOffset, ByteOffset)]
encodings
      )
      [(String, Enc -> Either DecoderError (Redeemers era))]
decoders
  where
    decoders :: [(String, Enc -> Either DecoderError (Redeemers era))]
    decoders :: [(String, Enc -> Either DecoderError (Redeemers era))]
decoders =
      [ (String
"Annotator", forall a.
DecCBOR (Annotator a) =>
Version -> Enc -> Either DecoderError a
decodeEnc @(Redeemers era) Version
version)
      , (String
"Plain", forall a.
DecCBOR a =>
Version -> ByteString -> Either DecoderError a
Binary.decodeFull @(Redeemers era) Version
version (ByteString -> Either DecoderError (Redeemers era))
-> (Enc -> ByteString)
-> Enc
-> Either DecoderError (Redeemers era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Enc -> ByteString
forall a. ToCBOR a => a -> ByteString
Plain.serialize)
      ]
    encodings :: [(String, [Enc] -> Enc, ByteOffset, ByteOffset)]
encodings =
      [ (String
"Definite length", [Enc] -> Enc
definiteMap, ByteOffset
21, ByteOffset
1)
      , (String
"Indefinite length", [Enc] -> Enc
indefiniteMap, ByteOffset
22, ByteOffset
2)
      ]
    definiteMap :: [Enc] -> Enc
definiteMap [Enc]
entries =
      [Enc] -> Enc
Em [(Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkMapLen (Word -> Tokens -> Tokens) -> Word -> Tokens -> Tokens
forall a b. (a -> b) -> a -> b
$ Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word) -> Int -> Word
forall a b. (a -> b) -> a -> b
$ [Enc] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Enc]
entries, [Enc] -> Enc
Em [Enc]
entries]
    indefiniteMap :: [Enc] -> Enc
indefiniteMap [Enc]
entries =
      [Enc] -> Enc
Em [(Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkMapBegin, [Enc] -> Enc
Em [Enc]
entries, (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkBreak]

    entry :: Int -> Int -> Int -> Enc
    entry :: Int -> Int -> Int -> Enc
entry Int
dat Int
mem Int
steps =
      [Enc] -> Enc
Em
        [ [Enc] -> Enc
Em [(Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkListLen Word
2, forall a. ToCBOR a => a -> Enc
E @Int Int
0, forall a. ToCBOR a => a -> Enc
E @Int Int
10]
        , [Enc] -> Enc
Em [(Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkListLen Word
2, Int -> Enc
forall a. ToCBOR a => a -> Enc
E Int
dat, [Enc] -> Enc
Em [(Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkListLen Word
2, Int -> Enc
forall a. ToCBOR a => a -> Enc
E Int
mem, Int -> Enc
forall a. ToCBOR a => a -> Enc
E Int
steps]]
        ]
    firstEntry :: Enc
firstEntry = Int -> Int -> Int -> Enc
entry Int
20 Int
30 Int
40
    lastEntry :: Enc
lastEntry = Int -> Int -> Int -> Enc
entry Int
21 Int
31 Int
41
    firstExpected :: Map (PlutusPurpose AsIx era) (Data era, ExUnits)
firstExpected = PlutusPurpose AsIx era
-> (Data era, ExUnits)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall k a. k -> a -> Map k a
Map.singleton (AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 TxIn -> PlutusPurpose f era
SpendingPurpose (AsIx Word32 TxIn -> PlutusPurpose AsIx era)
-> AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall a b. (a -> b) -> a -> b
$ Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
AsIx Word32
10) (Data -> Data era
forall era. Era era => Data -> Data era
Data (Data -> Data era) -> Data -> Data era
forall a b. (a -> b) -> a -> b
$ Integer -> Data
I Integer
20, Natural -> Natural -> ExUnits
ExUnits Natural
30 Natural
40)
    lastExpected :: Map (PlutusPurpose AsIx era) (Data era, ExUnits)
lastExpected = PlutusPurpose AsIx era
-> (Data era, ExUnits)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall k a. k -> a -> Map k a
Map.singleton (AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall era (f :: * -> * -> *).
AlonzoEraScript era =>
f Word32 TxIn -> PlutusPurpose f era
SpendingPurpose (AsIx Word32 TxIn -> PlutusPurpose AsIx era)
-> AsIx Word32 TxIn -> PlutusPurpose AsIx era
forall a b. (a -> b) -> a -> b
$ Word32 -> AsIx Word32 TxIn
forall ix it. ix -> AsIx ix it
AsIx Word32
10) (Data -> Data era
forall era. Era era => Data -> Data era
Data (Data -> Data era) -> Data -> Data era
forall a b. (a -> b) -> a -> b
$ Integer -> Data
I Integer
21, Natural -> Natural -> ExUnits
ExUnits Natural
31 Natural
41)

    checkEncoding :: (a -> Either DecoderError (Redeemers era))
-> (String, [Enc] -> a, ByteOffset, ByteOffset) -> Spec
checkEncoding a -> Either DecoderError (Redeemers era)
decodeRedeemers (String
encodingName, [Enc] -> a
encodeMap, ByteOffset
duplicateOffset, ByteOffset
emptyOffset) =
      String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
encodingName (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
        String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding a single redeemer succeeds" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$
          a
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
expectSuccess ([Enc] -> a
encodeMap [Enc
firstEntry]) Map (PlutusPurpose AsIx era) (Data era, ExUnits)
firstExpected
        String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Duplicate keys with identical values follow the protocol version" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$
          [Enc]
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
checkDuplicate [Enc
firstEntry, Enc
firstEntry] Map (PlutusPurpose AsIx era) (Data era, ExUnits)
firstExpected
        String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Duplicate keys with different values follow the protocol version" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$
          [Enc]
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
checkDuplicate [Enc
firstEntry, Enc
lastEntry] Map (PlutusPurpose AsIx era) (Data era, ExUnits)
lastExpected
        String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding an empty redeemers map fails" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$
          Either DecoderError (Redeemers era)
-> DeserialiseFailure -> Expectation
forall {b}.
Show b =>
Either DecoderError b -> DeserialiseFailure -> Expectation
expectFailure
            (a -> Either DecoderError (Redeemers era)
decodeRedeemers (a -> Either DecoderError (Redeemers era))
-> a -> Either DecoderError (Redeemers era)
forall a b. (a -> b) -> a -> b
$ [Enc] -> a
encodeMap [])
            (ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure ByteOffset
emptyOffset String
"Expected redeemers map to be non-empty")
      where
        expectSuccess :: a
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
expectSuccess a
enc Map (PlutusPurpose AsIx era) (Data era, ExUnits)
expected = do
          redeemers <- Either DecoderError (Redeemers era) -> IO (Redeemers era)
forall a b. (HasCallStack, Show a) => Either a b -> IO b
expectRight (Either DecoderError (Redeemers era) -> IO (Redeemers era))
-> Either DecoderError (Redeemers era) -> IO (Redeemers era)
forall a b. (a -> b) -> a -> b
$ a -> Either DecoderError (Redeemers era)
decodeRedeemers a
enc
          shouldBe (unRedeemers redeemers) expected
        checkDuplicate :: [Enc]
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
checkDuplicate [Enc]
entries Map (PlutusPurpose AsIx era) (Data era, ExUnits)
expected
          | Version
version Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= forall (v :: Natural).
(KnownNat v, MinVersion <= v, v <= MaxVersion) =>
Version
Binary.natVersion @12 =
              Either DecoderError (Redeemers era)
-> DeserialiseFailure -> Expectation
forall {b}.
Show b =>
Either DecoderError b -> DeserialiseFailure -> Expectation
expectFailure
                (a -> Either DecoderError (Redeemers era)
decodeRedeemers (a -> Either DecoderError (Redeemers era))
-> a -> Either DecoderError (Redeemers era)
forall a b. (a -> b) -> a -> b
$ [Enc] -> a
encodeMap [Enc]
entries)
                ( ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure
                    ByteOffset
duplicateOffset
                    String
"Final number of elements: 1 does not match the total count that was decoded: 2"
                )
          | Bool
otherwise = a
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Expectation
expectSuccess ([Enc] -> a
encodeMap [Enc]
entries) Map (PlutusPurpose AsIx era) (Data era, ExUnits)
expected

    expectFailure :: Either DecoderError b -> DeserialiseFailure -> Expectation
expectFailure Either DecoderError b
result DeserialiseFailure
expected = do
      err <- Either DecoderError b -> IO DecoderError
forall b a. (HasCallStack, Show b) => Either a b -> IO a
expectLeft Either DecoderError b
result
      case err of
        DecoderErrorDeserialiseFailure Text
_ DeserialiseFailure
failure -> DeserialiseFailure -> DeserialiseFailure -> Expectation
forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation
shouldBe DeserialiseFailure
failure DeserialiseFailure
expected
        DecoderError
_ -> HasCallStack => String -> Expectation
String -> Expectation
expectationFailure (String -> Expectation) -> String -> Expectation
forall a b. (a -> b) -> a -> b
$ String
"Expected a deserialisation failure, got: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> DecoderError -> String
forall a. Show a => a -> String
show DecoderError
err

witsEmptyFieldWithSetTag :: Int -> Enc
witsEmptyFieldWithSetTag :: Int -> Enc
witsEmptyFieldWithSetTag Int
k =
  [Enc] -> Enc
forall a. Monoid a => [a] -> a
mconcat
    [ (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkMapLen Word
1
    , Int -> Enc
forall a. ToCBOR a => a -> Enc
E Int
k
    , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E ((Tokens -> Tokens) -> Enc) -> (Tokens -> Tokens) -> Enc
forall a b. (a -> b) -> a -> b
$ Word -> Tokens -> Tokens
TkTag Word
258
    , forall a. ToCBOR a => a -> Enc
E @[Void] []
    ]

expectFailureOnTxWitsEmptyFieldWithTag ::
  forall era.
  ( ToExpr (TxWits era)
  , DecCBOR (Annotator (TxWits era))
  ) =>
  Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag :: forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag Version
version Int
k =
  forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxWits era) Version
version (Int -> Enc
witsEmptyFieldWithSetTag Int
k)

conwayDecodeDuplicateDelegCertFails ::
  forall era. ConwayEraTest era => Version -> Spec
conwayDecodeDuplicateDelegCertFails :: forall era. ConwayEraTest era => Version -> Spec
conwayDecodeDuplicateDelegCertFails Version
version =
  String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding duplicate delegation certs fails" (Expectation -> SpecM (Arg Expectation) ())
-> Expectation -> SpecM (Arg Expectation) ()
forall a b. (a -> b) -> a -> b
$ do
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxBody TopTx era) Version
version (forall era. ShelleyEraTest era => Version -> Enc
duplicateDelegCertsTxBody @era Version
version) (DecoderError -> Expectation) -> DecoderError -> Expectation
forall a b. (a -> b) -> a -> b
$
      Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
        (Proxy (Annotator (TxBody TopTx era)) -> Text
forall a. DecCBOR a => Proxy a -> Text
Binary.label (Proxy (Annotator (TxBody TopTx era)) -> Text)
-> Proxy (Annotator (TxBody TopTx era)) -> Text
forall a b. (a -> b) -> a -> b
$ forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Annotator (TxBody TopTx era)))
        ( ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure
            ByteOffset
144
            String
"Final number of elements: 1 does not match the total count that was decoded: 2"
        )

spec :: forall era. ConwayEraTest era => Spec
spec :: forall era. ConwayEraTest era => Spec
spec = do
  forall era. (Era era, HasCallStack) => (Version -> Spec) -> Spec
forEachEraVersion @era ((Version -> Spec) -> Spec) -> (Version -> Spec) -> Spec
forall a b. (a -> b) -> a -> b
$ forall era. ConwayEraTest era => Version -> Spec
goldenMapRedeemers @era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TxWits" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Empty fields not allowed" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall era. (Era era, HasCallStack) => (Version -> Spec) -> Spec
forEachEraVersion @era ((Version -> Spec) -> Spec) -> (Version -> Spec) -> Spec
forall a b. (a -> b) -> a -> b
$ \Version
version -> do
        let
          decoderFailure :: ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
n String
msg =
            Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
              (Proxy (Annotator (TxWits era)) -> Text
forall a. DecCBOR a => Proxy a -> Text
Binary.label (Proxy (Annotator (TxWits era)) -> Text)
-> Proxy (Annotator (TxWits era)) -> Text
forall a b. (a -> b) -> a -> b
$ forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @(Annotator (TxWits era)))
              (ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure ByteOffset
n String
msg)
        String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Untagged" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"addrTxWits" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
0 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"nativeScripts" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
1 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"bootstrapWitness" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
2 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV1Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
3 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list of scripts is not allowed"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusData" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
4 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"redeemers" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
5 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV2Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
6 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list of scripts is not allowed"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV3Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
AlonzoEraTest era =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyField @era Version
version Int
7 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
4 String
"Empty list of scripts is not allowed"
        String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Tagged" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"addrTxWits" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
0 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"nativeScripts" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
1 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"bootstrapWitness" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
2 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV1Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
3 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list of scripts is not allowed"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusData" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
4 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list found, expected non-empty"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV2Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
6 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list of scripts is not allowed"
          String -> Expectation -> SpecM (Arg Expectation) ()
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"plutusV3Script" (Expectation -> Spec)
-> (DecoderError -> Expectation) -> DecoderError -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era.
(ToExpr (TxWits era), DecCBOR (Annotator (TxWits era))) =>
Version -> Int -> DecoderError -> Expectation
expectFailureOnTxWitsEmptyFieldWithTag @era Version
version Int
7 (DecoderError -> Spec) -> DecoderError -> Spec
forall a b. (a -> b) -> a -> b
$
            ByteOffset -> String -> DecoderError
decoderFailure ByteOffset
7 String
"Empty list of scripts is not allowed"
        forall era. AlonzoEraTest era => Version -> [Int] -> Spec
txWitsDecodingFailsOnInvalidField @era Version
version [Int
0 .. Int
7]
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TxCerts" (Spec -> Spec)
-> ((Version -> Spec) -> Spec) -> (Version -> Spec) -> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era. (Era era, HasCallStack) => (Version -> Spec) -> Spec
forEachEraVersion @era ((Version -> Spec) -> Spec) -> (Version -> Spec) -> Spec
forall a b. (a -> b) -> a -> b
$ forall era. ConwayEraTest era => Version -> Spec
conwayDecodeDuplicateDelegCertFails @era