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

module Test.Cardano.Ledger.Dijkstra.Binary.Golden (
  spec,
  module Test.Cardano.Ledger.Conway.Binary.Golden,
) where

import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusTxInfo, SupportedLanguage (..))
import Cardano.Ledger.Alonzo.Scripts (plutusScriptBinary)
import Cardano.Ledger.Alonzo.TxWits (Redeemers)
import Cardano.Ledger.BaseTypes (Version)
import Cardano.Ledger.Binary (Annotator, DecoderError (..), DeserialiseFailure (..), Tokens (..))
import qualified Cardano.Ledger.Binary as Binary
import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Dijkstra.Core
import Cardano.Ledger.Dijkstra.TxBody
import Cardano.Ledger.Plutus (SLanguage (..))
import Cardano.Ledger.TxIn (TxIn (..))
import Data.Data (Proxy (..))
import qualified Data.OMap.Strict as OMap
import qualified Data.Set as Set
import Lens.Micro
import Test.Cardano.Ledger.Alonzo.Arbitrary (alwaysSucceedsLang)
import Test.Cardano.Ledger.Binary.Plain.Golden (Enc (..))
import Test.Cardano.Ledger.Common (Spec, describe, it)
import Test.Cardano.Ledger.Conway.Binary.Golden hiding (spec)
import Test.Cardano.Ledger.Core.KeyPair (mkKeyPair, mkWitnessVKey)
import Test.Cardano.Ledger.Core.Utils (mkDummySafeHash)
import Test.Cardano.Ledger.Dijkstra.Era (DijkstraEraTest)
import Test.Cardano.Ledger.Imp.Common (forEachEraVersion)

spec :: forall era. DijkstraEraTest era => Spec
spec :: forall era. DijkstraEraTest era => Spec
spec = String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Golden" (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
$ \Version
version -> do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Redeemers" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. DijkstraEraTest era => Version -> Spec
goldenListRedeemersDisallowed @era Version
version
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TxCert" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. ConwayEraTest era => Version -> Spec
conwayDecodeDuplicateDelegCertFails @era Version
version
  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
$ do
    forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateVKeyWitsDisallowed @era Version
version
    forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateNativeScriptsDisallowed @era Version
version
    forall era (l :: Language).
(DijkstraEraTest era, EraPlutusTxInfo l era) =>
Version -> SLanguage l -> Spec
goldenDuplicatePlutusScriptsDisallowed @era Version
version SLanguage 'PlutusV1
SPlutusV1
    forall era (l :: Language).
(DijkstraEraTest era, EraPlutusTxInfo l era) =>
Version -> SLanguage l -> Spec
goldenDuplicatePlutusScriptsDisallowed @era Version
version SLanguage 'PlutusV2
SPlutusV2
    forall era (l :: Language).
(DijkstraEraTest era, EraPlutusTxInfo l era) =>
Version -> SLanguage l -> Spec
goldenDuplicatePlutusScriptsDisallowed @era Version
version SLanguage 'PlutusV3
SPlutusV3
    forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicatePlutusDataDisallowed @era Version
version
    forall era. DijkstraEraTest era => Version -> Spec
goldenEmptyFields @era Version
version
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Subtransactions" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. DijkstraEraTest era => Spec
goldenSubTransactions @era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"IsValid flag" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. DijkstraEraTest era => Spec
goldenIsValidFlag @era

goldenEmptyFields :: forall era. DijkstraEraTest era => Version -> Spec
goldenEmptyFields :: forall era. DijkstraEraTest era => Version -> Spec
goldenEmptyFields Version
version =
  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
    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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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
2 String
"List encoding of redeemers not supported starting with PV 12"
      String -> Expectation -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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 -> SpecWith (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]

witsDuplicateVKeyWits :: Enc
witsDuplicateVKeyWits :: Enc
witsDuplicateVKeyWits =
  [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
    , forall a. ToCBOR a => a -> Enc
E @Int Int
0
    , [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
TkTag Word
258
        , (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
        , WitVKey Witness -> Enc
forall a. ToCBOR a => a -> Enc
E WitVKey Witness
vkeywit
        , WitVKey Witness -> Enc
forall a. ToCBOR a => a -> Enc
E WitVKey Witness
vkeywit
        ]
    ]
  where
    vkeywit :: WitVKey Witness
vkeywit = SafeHash EraIndependentTxBody
-> KeyPair (ZonkAny 0) -> WitVKey Witness
forall (kr :: KeyRole).
SafeHash EraIndependentTxBody -> KeyPair kr -> WitVKey Witness
mkWitnessVKey (Int -> SafeHash EraIndependentTxBody
forall a. Int -> SafeHash a
mkDummySafeHash Int
0) (Int -> KeyPair (ZonkAny 0)
forall (r :: KeyRole). Int -> KeyPair r
mkKeyPair Int
0)

witsDuplicateNativeScripts :: Enc
witsDuplicateNativeScripts :: Enc
witsDuplicateNativeScripts =
  [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
    , forall a. ToCBOR a => a -> Enc
E @Int Int
1
    , [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
TkTag Word
258
        , (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
        , Enc
nativeScript
        , Enc
nativeScript
        ]
    ]
  where
    nativeScript :: Enc
nativeScript = [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
1, (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
0]

witsDuplicatePlutus ::
  forall era l.
  EraPlutusTxInfo l era =>
  SLanguage l -> Enc
witsDuplicatePlutus :: forall era (l :: Language).
EraPlutusTxInfo l era =>
SLanguage l -> Enc
witsDuplicatePlutus SLanguage l
slang =
  [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
    , forall a. ToCBOR a => a -> Enc
E @Int (Int -> Enc) -> Int -> Enc
forall a b. (a -> b) -> a -> b
$ case SLanguage l
slang of
        SLanguage l
SPlutusV1 -> Int
3
        SLanguage l
SPlutusV2 -> Int
6
        SLanguage l
SPlutusV3 -> Int
7
        -- TODO add PlutusV4 support once the CDDL for TxWits is updated to include V4 scripts
        SLanguage l
l -> String -> Int
forall a. HasCallStack => String -> a
error (String -> Int) -> String -> Int
forall a b. (a -> b) -> a -> b
$ String
"Unsupported plutus version: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> SLanguage l -> String
forall a. Show a => a -> String
show SLanguage l
l
    , [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
TkTag Word
258
        , (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
        , Enc
plutus
        , Enc
plutus
        ]
    ]
  where
    plutus :: Enc
plutus = PlutusBinary -> Enc
forall a. ToCBOR a => a -> Enc
E (PlutusBinary -> Enc)
-> (PlutusScript era -> PlutusBinary) -> PlutusScript era -> Enc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PlutusScript era -> PlutusBinary
forall era. AlonzoEraScript era => PlutusScript era -> PlutusBinary
plutusScriptBinary (PlutusScript era -> Enc) -> PlutusScript era -> Enc
forall a b. (a -> b) -> a -> b
$ forall era. SupportedLanguage era -> Natural -> PlutusScript era
alwaysSucceedsLang @era (SLanguage l -> SupportedLanguage era
forall (l :: Language) era.
EraPlutusTxInfo l era =>
SLanguage l -> SupportedLanguage era
SupportedLanguage SLanguage l
slang) Natural
0

witsDuplicatePlutusData :: Enc
witsDuplicatePlutusData :: Enc
witsDuplicatePlutusData =
  [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
    , forall a. ToCBOR a => a -> Enc
E @Int Int
4
    , [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
TkTag Word
258
        , (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
        , Enc
dat
        , Enc
dat
        ]
    ]
  where
    dat :: Enc
dat = forall a. ToCBOR a => a -> Enc
E @Int Int
0

goldenListRedeemersDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenListRedeemersDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenListRedeemersDisallowed Version
version =
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding Redeemers encoded as a list fails" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(Redeemers era)
      Version
version
      Enc
listRedeemersEnc
      ( Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
          Text
"Annotator (MemoBytes (RedeemersRaw DijkstraEra))"
          (ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure ByteOffset
0 String
"List encoding of redeemers not supported starting with PV 12")
      )

goldenDuplicateVKeyWitsDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateVKeyWitsDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateVKeyWitsDisallowed Version
version =
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding a TxWits with duplicate VKeyWits fails" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxWits era)
      Version
version
      Enc
witsDuplicateVKeyWits
      (Text -> Text -> DecoderError
DecoderErrorCustom Text
"Annotator" Text
"Duplicates found, expected no duplicates")

goldenDuplicateNativeScriptsDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateNativeScriptsDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicateNativeScriptsDisallowed Version
version =
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding a TxWits with duplicate native scripts fails" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxWits era)
      Version
version
      Enc
witsDuplicateNativeScripts
      ( Text -> Text -> DecoderError
DecoderErrorCustom
          Text
"Annotator"
          Text
"Duplicates found, expected no duplicates"
      )

goldenDuplicatePlutusScriptsDisallowed ::
  forall era l.
  ( DijkstraEraTest era
  , EraPlutusTxInfo l era
  ) =>
  Version -> SLanguage l -> Spec
goldenDuplicatePlutusScriptsDisallowed :: forall era (l :: Language).
(DijkstraEraTest era, EraPlutusTxInfo l era) =>
Version -> SLanguage l -> Spec
goldenDuplicatePlutusScriptsDisallowed Version
version SLanguage l
slang =
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it (String
"Decoding a TxWits with duplicate " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> SLanguage l -> String
forall a. Show a => a -> String
show SLanguage l
slang String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" scripts fails") (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxWits era)
      Version
version
      (forall era (l :: Language).
EraPlutusTxInfo l era =>
SLanguage l -> Enc
witsDuplicatePlutus @era SLanguage l
slang)
      ( Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
          Text
"Annotator (MemoBytes (AlonzoTxWitsRaw DijkstraEra))"
          ( ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure
              ByteOffset
22
              String
"Final number of elements: 1 does not match the total count that was decoded: 2"
          )
      )

goldenDuplicatePlutusDataDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicatePlutusDataDisallowed :: forall era. DijkstraEraTest era => Version -> Spec
goldenDuplicatePlutusDataDisallowed Version
version =
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Decoding a TxWits with duplicate plutus data fails" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxWits era)
      Version
version
      Enc
witsDuplicatePlutusData
      ( Text -> Text -> DecoderError
DecoderErrorCustom
          Text
"Annotator"
          Text
"Duplicates found, expected no duplicates"
      )

goldenSubTransactions :: forall era. DijkstraEraTest era => Spec
goldenSubTransactions :: forall era. DijkstraEraTest era => Spec
goldenSubTransactions = do
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"TxBody with subtransactions decoded as expected" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (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 @(TxBody TopTx era)
      (forall era. Era era => Version
eraProtVerLow @era)
      Enc
txBodySubTransactionsEnc
      ( forall era (l :: TxLevel).
(EraTxBody era, Typeable l) =>
TxBody l era
mkBasicTxBody @era @TopTx
          TxBody TopTx era
-> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era
forall a b. a -> (a -> b) -> b
& (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)))
 -> TxBody TopTx era -> Identity (TxBody TopTx era))
-> OMap TxId (Tx SubTx era) -> TxBody TopTx era -> TxBody TopTx era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Tx SubTx era -> OMap TxId (Tx SubTx era)
forall k v. HasOKey k v => v -> OMap k v
OMap.singleton
              (forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era
mkBasicTx @era @SubTx (forall era (l :: TxLevel).
(EraTxBody era, Typeable l) =>
TxBody l era
mkBasicTxBody @era @SubTx))
      )
      TxBody TopTx era -> TxBody TopTx era
forall a. a -> a
id
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Subtransactions have to be non-empty if the field is present" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxBody TopTx era)
      Version
version
      Enc
txBodyEmptySubTransactionsEnc
      ( Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
          Text
"Annotator (MemoBytes (DijkstraTxBodyRaw TopTx DijkstraEra))"
          (ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure ByteOffset
12 String
"Empty list found, expected non-empty")
      )
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Subtransactions have to be distinct" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(TxBody TopTx era)
      Version
version
      Enc
txBodyDuplicateSubTransactionsEnc
      (Text -> Text -> DecoderError
DecoderErrorCustom Text
"Annotator" Text
"Duplicates found, expected no duplicates")
  where
    version :: Version
version = forall era. Era era => Version
eraProtVerLow @era
    txBodyEnc :: Enc
txBodyEnc =
      [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
4
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
0, Version -> Set TxIn -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version (Set TxIn -> Enc) -> Set TxIn -> Enc
forall a b. (a -> b) -> a -> b
$ forall a. Set a
Set.empty @TxIn]
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
1, Version -> [TxOut era] -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version ([TxOut era] -> Enc) -> [TxOut era] -> Enc
forall a b. (a -> b) -> a -> b
$ [] @(TxOut era)]
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
2, Coin -> Enc
forall a. ToCBOR a => a -> Enc
E (Coin -> Enc) -> Coin -> Enc
forall a b. (a -> b) -> a -> b
$ Integer -> Coin
Coin Integer
0]
        ]
    txBodySubTransactionsEnc :: Enc
txBodySubTransactionsEnc =
      Enc
txBodyEnc Enc -> Enc -> Enc
forall a. Semigroup a => a -> a -> a
<> [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
23, (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
1), Enc
subTxEnc]
    txBodyEmptySubTransactionsEnc :: Enc
txBodyEmptySubTransactionsEnc =
      Enc
txBodyEnc Enc -> Enc -> Enc
forall a. Semigroup a => a -> a -> a
<> [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
23, (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
0)]
    txBodyDuplicateSubTransactionsEnc :: Enc
txBodyDuplicateSubTransactionsEnc =
      Enc
txBodyEnc Enc -> Enc -> Enc
forall a. Semigroup a => a -> a -> a
<> [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
23, (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkListLen Word
2), Enc
subTxEnc, Enc
subTxEnc]
    subTxEnc :: Enc
subTxEnc =
      [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
TkListLen Word
3
        , [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
2
            , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
0, Version -> Set TxIn -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version (Set TxIn -> Enc) -> Set TxIn -> Enc
forall a b. (a -> b) -> a -> b
$ forall a. Set a
Set.empty @TxIn]
            , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
1, Version -> [TxOut era] -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version ([TxOut era] -> Enc) -> [TxOut era] -> Enc
forall a b. (a -> b) -> a -> b
$ [] @(TxOut era)]
            ]
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkMapLen Word
0)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkNull
        ]

goldenIsValidFlag :: forall era. DijkstraEraTest era => Spec
goldenIsValidFlag :: forall era. DijkstraEraTest era => Spec
goldenIsValidFlag = do
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Deserialize transactions with missing `isValid` flag" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (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 @(Tx TopTx era)
      Version
version
      Enc
txWithoutFlagEnc
      Tx TopTx era
basicValidTx
      Tx TopTx era -> Tx TopTx era
forall a. a -> a
id
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Deserialize transactions with `isValid` flag set to true" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (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 @(Tx TopTx era)
      Version
version
      Enc
txWithFlagTrueEnc
      Tx TopTx era
basicValidTx
      Tx TopTx era -> Tx TopTx era
forall a. a -> a
id
  String -> Expectation -> SpecWith (Arg Expectation)
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Fail to deserialize transactions with `isValid` flag set to false" (Expectation -> SpecWith (Arg Expectation))
-> Expectation -> SpecWith (Arg Expectation)
forall a b. (a -> b) -> a -> b
$
    forall a.
(ToExpr a, DecCBOR (Annotator a), HasCallStack) =>
Version -> Enc -> DecoderError -> Expectation
expectDecoderFailureAnn @(Tx TopTx era)
      Version
version
      Enc
txWithFlagFalseEnc
      ( Text -> DeserialiseFailure -> DecoderError
DecoderErrorDeserialiseFailure
          Text
"Annotator (Tx TopTx DijkstraEra)"
          (ByteOffset -> String -> DeserialiseFailure
DeserialiseFailure ByteOffset
13 String
"value `false` not allowed for `isValid`")
      )
  where
    version :: Version
version = forall era. Era era => Version
eraProtVerLow @era
    basicValidTx :: Tx TopTx era
basicValidTx = forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era
mkBasicTx @era @TopTx (forall era (l :: TxLevel).
(EraTxBody era, Typeable l) =>
TxBody l era
mkBasicTxBody @era @TopTx) Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era
forall a b. a -> (a -> b) -> b
& (IsValid -> Identity IsValid)
-> Tx TopTx era -> Identity (Tx TopTx era)
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL ((IsValid -> Identity IsValid)
 -> Tx TopTx era -> Identity (Tx TopTx era))
-> IsValid -> Tx TopTx era -> Tx TopTx era
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> IsValid
IsValid Bool
True
    txWithoutFlagEnc :: Enc
txWithoutFlagEnc =
      [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
TkListLen Word
3
        , Enc
txBodyEnc
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkMapLen Word
0)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkNull
        ]
    txWithFlagTrueEnc :: Enc
txWithFlagTrueEnc =
      [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
TkListLen Word
4
        , Enc
txBodyEnc
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkMapLen Word
0)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Bool -> Tokens -> Tokens
TkBool Bool
True)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkNull
        ]
    txWithFlagFalseEnc :: Enc
txWithFlagFalseEnc =
      [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
TkListLen Word
4
        , Enc
txBodyEnc
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Word -> Tokens -> Tokens
TkMapLen Word
0)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E (Bool -> Tokens -> Tokens
TkBool Bool
False)
        , (Tokens -> Tokens) -> Enc
forall a. ToCBOR a => a -> Enc
E Tokens -> Tokens
TkNull
        ]
    txBodyEnc :: Enc
txBodyEnc =
      [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
3
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
0, Version -> Set TxIn -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version (Set TxIn -> Enc) -> Set TxIn -> Enc
forall a b. (a -> b) -> a -> b
$ forall a. Set a
Set.empty @TxIn]
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
1, Version -> [TxOut era] -> Enc
forall a. EncCBOR a => Version -> a -> Enc
Ev Version
version ([TxOut era] -> Enc) -> [TxOut era] -> Enc
forall a b. (a -> b) -> a -> b
$ [] @(TxOut era)]
        , [Enc] -> Enc
Em [forall a. ToCBOR a => a -> Enc
E @Int Int
2, Coin -> Enc
forall a. ToCBOR a => a -> Enc
E (Coin -> Enc) -> Coin -> Enc
forall a b. (a -> b) -> a -> b
$ Integer -> Coin
Coin Integer
0]
        ]