{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}

-- | This module exports implementations of many of the functions outlined in the Alonzo specification.
--     The link to source of the specification
--       https://github.com/intersectmbo/cardano-ledger/tree/master/eras/alonzo/formal-spec
--     The most recent version of the document can be found here:
--       https://github.com/intersectmbo/cardano-ledger/releases/latest/download/alonzo-ledger.pdf
--     The functions can be found in Figures in that document, and sections of this code refer to those figures.
module Cardano.Ledger.Alonzo.Tx (
  -- Figure 1
  CostModel,
  getLanguageView,
  -- Figure 2
  Data,
  DataHash,
  IsValid (..),
  hashData,
  nonNativeLanguages,
  hashScriptIntegrity,
  EraIndependentScriptIntegrity,
  ScriptIntegrity (ScriptIntegrity),
  ScriptIntegrityHash,
  -- Figure 3
  AlonzoTx (AlonzoTx, atBody, atWits, atIsValid, atAuxData),
  Tx (..),
  AlonzoEraTx (..),
  mkBasicAlonzoTx,
  bodyAlonzoTxL,
  witsAlonzoTxL,
  auxDataAlonzoTxL,
  sizeAlonzoTxF,
  isValidAlonzoTxL,
  txrdmrs,
  TxBody (AlonzoTxBody),
  -- Figure 4
  totExUnits,
  alonzoMinFeeTx,
  --  Figure 5
  Shelley.txouts,
  -- Other
  toCBORForSizeComputation,
  toCBORForMempoolSubmission,
  alonzoTxEqRaw,
  mkScriptIntegrity,
) where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Era (AlonzoEra)
import Cardano.Ledger.Alonzo.PParams (
  AlonzoEraPParams,
  LangDepView (..),
  encodeLangViews,
  getLanguageView,
  ppPricesL,
 )
import Cardano.Ledger.Alonzo.Scripts (
  AlonzoEraScript (..),
  CostModel,
  ExUnits (..),
  plutusScriptLanguage,
  txscriptfee,
 )
import Cardano.Ledger.Alonzo.TxBody (
  AlonzoEraTxBody (..),
  ScriptIntegrityHash,
  TxBody (AlonzoTxBody),
 )
import Cardano.Ledger.Alonzo.TxWits (
  AlonzoEraTxWits (..),
  AlonzoTxWits (..),
  Redeemers (..),
  TxDats (..),
  txrdmrs,
  unRedeemersL,
  unTxDatsL,
 )
import Cardano.Ledger.BaseTypes (integralToBounded)
import Cardano.Ledger.Binary (
  Annotator,
  DecCBOR (..),
  EncCBOR (encCBOR),
  Encoding,
  ToCBOR (..),
  decodeNullStrictMaybe,
  encodeListLen,
  encodeNullStrictMaybe,
  serialize,
  serialize',
 )
import Cardano.Ledger.Binary.Coders
import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Core
import Cardano.Ledger.Mary (Tx (..))
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Plutus.Data (Data, hashData)
import Cardano.Ledger.Plutus.Language (nonNativeLanguages)
import Cardano.Ledger.Shelley.Tx (shelleyTxEqRaw)
import Cardano.Ledger.State (EraUTxO, ScriptsProvided (..))
import qualified Cardano.Ledger.State as Shelley
import Cardano.Ledger.Val (Val ((<+>), (<×>)))
import Control.DeepSeq (NFData (..), deepseq)
import Control.Monad.Trans.Fail.String (errorFail)
import Data.Aeson (ToJSON (..))
import qualified Data.ByteString.Lazy as LBS
import Data.Int (Int64)
import qualified Data.Map.Strict as Map
import Data.Maybe (mapMaybe)
import Data.Maybe.Strict (StrictMaybe (..))
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Typeable (Typeable)
import Data.Word (Word32)
import GHC.Generics (Generic)
import GHC.Stack (HasCallStack)
import Lens.Micro hiding (set)
import NoThunks.Class (InspectHeap (..), NoThunks)

-- ===================================================

-- | Tag indicating whether non-native scripts in this transaction are expected
-- to validate. This is added by the block creator when constructing the block.
newtype IsValid = IsValid Bool
  deriving (IsValid -> IsValid -> Bool
(IsValid -> IsValid -> Bool)
-> (IsValid -> IsValid -> Bool) -> Eq IsValid
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IsValid -> IsValid -> Bool
== :: IsValid -> IsValid -> Bool
$c/= :: IsValid -> IsValid -> Bool
/= :: IsValid -> IsValid -> Bool
Eq, Int -> IsValid -> ShowS
[IsValid] -> ShowS
IsValid -> String
(Int -> IsValid -> ShowS)
-> (IsValid -> String) -> ([IsValid] -> ShowS) -> Show IsValid
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IsValid -> ShowS
showsPrec :: Int -> IsValid -> ShowS
$cshow :: IsValid -> String
show :: IsValid -> String
$cshowList :: [IsValid] -> ShowS
showList :: [IsValid] -> ShowS
Show, (forall x. IsValid -> Rep IsValid x)
-> (forall x. Rep IsValid x -> IsValid) -> Generic IsValid
forall x. Rep IsValid x -> IsValid
forall x. IsValid -> Rep IsValid x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. IsValid -> Rep IsValid x
from :: forall x. IsValid -> Rep IsValid x
$cto :: forall x. Rep IsValid x -> IsValid
to :: forall x. Rep IsValid x -> IsValid
Generic)
  deriving newtype (Context -> IsValid -> IO (Maybe ThunkInfo)
Proxy IsValid -> String
(Context -> IsValid -> IO (Maybe ThunkInfo))
-> (Context -> IsValid -> IO (Maybe ThunkInfo))
-> (Proxy IsValid -> String)
-> NoThunks IsValid
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> IsValid -> IO (Maybe ThunkInfo)
noThunks :: Context -> IsValid -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> IsValid -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> IsValid -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy IsValid -> String
showTypeOf :: Proxy IsValid -> String
NoThunks, IsValid -> ()
(IsValid -> ()) -> NFData IsValid
forall a. (a -> ()) -> NFData a
$crnf :: IsValid -> ()
rnf :: IsValid -> ()
NFData, Typeable IsValid
Typeable IsValid =>
(IsValid -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy IsValid -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [IsValid] -> Size)
-> ToCBOR IsValid
IsValid -> Encoding
(forall t. ToCBOR t => Proxy t -> Size) -> Proxy [IsValid] -> Size
(forall t. ToCBOR t => Proxy t -> Size) -> Proxy IsValid -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> ToCBOR a
$ctoCBOR :: IsValid -> Encoding
toCBOR :: IsValid -> Encoding
$cencodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size) -> Proxy IsValid -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size) -> Proxy IsValid -> Size
$cencodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size) -> Proxy [IsValid] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size) -> Proxy [IsValid] -> Size
ToCBOR, IsValid -> Encoding
(IsValid -> Encoding) -> EncCBOR IsValid
forall a. (a -> Encoding) -> EncCBOR a
$cencCBOR :: IsValid -> Encoding
encCBOR :: IsValid -> Encoding
EncCBOR, Typeable IsValid
Typeable IsValid =>
(forall s. Decoder s IsValid)
-> (forall s. Proxy IsValid -> Decoder s ())
-> (Proxy IsValid -> Text)
-> DecCBOR IsValid
Proxy IsValid -> Text
forall s. Decoder s IsValid
forall a.
Typeable a =>
(forall s. Decoder s a)
-> (forall s. Proxy a -> Decoder s ())
-> (Proxy a -> Text)
-> DecCBOR a
forall s. Proxy IsValid -> Decoder s ()
$cdecCBOR :: forall s. Decoder s IsValid
decCBOR :: forall s. Decoder s IsValid
$cdropCBOR :: forall s. Proxy IsValid -> Decoder s ()
dropCBOR :: forall s. Proxy IsValid -> Decoder s ()
$clabel :: Proxy IsValid -> Text
label :: Proxy IsValid -> Text
DecCBOR, [IsValid] -> Value
[IsValid] -> Encoding
IsValid -> Bool
IsValid -> Value
IsValid -> Encoding
(IsValid -> Value)
-> (IsValid -> Encoding)
-> ([IsValid] -> Value)
-> ([IsValid] -> Encoding)
-> (IsValid -> Bool)
-> ToJSON IsValid
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: IsValid -> Value
toJSON :: IsValid -> Value
$ctoEncoding :: IsValid -> Encoding
toEncoding :: IsValid -> Encoding
$ctoJSONList :: [IsValid] -> Value
toJSONList :: [IsValid] -> Value
$ctoEncodingList :: [IsValid] -> Encoding
toEncodingList :: [IsValid] -> Encoding
$comitField :: IsValid -> Bool
omitField :: IsValid -> Bool
ToJSON)

data AlonzoTx l era where
  AlonzoTx ::
    { forall era. AlonzoTx TopTx era -> TxBody TopTx era
atBody :: !(TxBody TopTx era)
    , forall era. AlonzoTx TopTx era -> TxWits era
atWits :: !(TxWits era)
    , forall era. AlonzoTx TopTx era -> IsValid
atIsValid :: !IsValid
    , forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atAuxData :: !(StrictMaybe (TxAuxData era))
    } ->
    AlonzoTx TopTx era

instance HasEraTxLevel Tx AlonzoEra where
  toSTxLevel :: forall (l :: TxLevel). Tx l AlonzoEra -> STxLevel l AlonzoEra
toSTxLevel (MkAlonzoTx AlonzoTx {}) = forall era. STxTopLevel TopTx era
STopTxOnly @AlonzoEra

instance EraTx AlonzoEra where
  newtype Tx l AlonzoEra = MkAlonzoTx {forall (l :: TxLevel). Tx l AlonzoEra -> AlonzoTx l AlonzoEra
unAlonzoTx :: AlonzoTx l AlonzoEra}
    deriving newtype (Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
(Tx l AlonzoEra -> Tx l AlonzoEra -> Bool)
-> (Tx l AlonzoEra -> Tx l AlonzoEra -> Bool)
-> Eq (Tx l AlonzoEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (l :: TxLevel). Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
$c== :: forall (l :: TxLevel). Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
== :: Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
$c/= :: forall (l :: TxLevel). Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
/= :: Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
Eq, Tx l AlonzoEra -> ()
(Tx l AlonzoEra -> ()) -> NFData (Tx l AlonzoEra)
forall a. (a -> ()) -> NFData a
forall (l :: TxLevel). Tx l AlonzoEra -> ()
$crnf :: forall (l :: TxLevel). Tx l AlonzoEra -> ()
rnf :: Tx l AlonzoEra -> ()
NFData, Tx l AlonzoEra -> Encoding
(Tx l AlonzoEra -> Encoding) -> EncCBOR (Tx l AlonzoEra)
forall a. (a -> Encoding) -> EncCBOR a
forall (l :: TxLevel). Tx l AlonzoEra -> Encoding
$cencCBOR :: forall (l :: TxLevel). Tx l AlonzoEra -> Encoding
encCBOR :: Tx l AlonzoEra -> Encoding
EncCBOR, Typeable (Tx l AlonzoEra)
Typeable (Tx l AlonzoEra) =>
(Tx l AlonzoEra -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (Tx l AlonzoEra) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [Tx l AlonzoEra] -> Size)
-> ToCBOR (Tx l AlonzoEra)
Tx l AlonzoEra -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l AlonzoEra] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l AlonzoEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> ToCBOR a
forall (l :: TxLevel). Typeable l => Typeable (Tx l AlonzoEra)
forall (l :: TxLevel). Typeable l => Tx l AlonzoEra -> Encoding
forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l AlonzoEra] -> Size
forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l AlonzoEra) -> Size
$ctoCBOR :: forall (l :: TxLevel). Typeable l => Tx l AlonzoEra -> Encoding
toCBOR :: Tx l AlonzoEra -> Encoding
$cencodedSizeExpr :: forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l AlonzoEra) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l AlonzoEra) -> Size
$cencodedListSizeExpr :: forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l AlonzoEra] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l AlonzoEra] -> Size
ToCBOR, Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
Proxy (Tx l AlonzoEra) -> String
(Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo))
-> (Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo))
-> (Proxy (Tx l AlonzoEra) -> String)
-> NoThunks (Tx l AlonzoEra)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
forall (l :: TxLevel).
Typeable l =>
Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
forall (l :: TxLevel).
Typeable l =>
Proxy (Tx l AlonzoEra) -> String
$cnoThunks :: forall (l :: TxLevel).
Typeable l =>
Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (l :: TxLevel).
Typeable l =>
Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> Tx l AlonzoEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (l :: TxLevel).
Typeable l =>
Proxy (Tx l AlonzoEra) -> String
showTypeOf :: Proxy (Tx l AlonzoEra) -> String
NoThunks, Int -> Tx l AlonzoEra -> ShowS
[Tx l AlonzoEra] -> ShowS
Tx l AlonzoEra -> String
(Int -> Tx l AlonzoEra -> ShowS)
-> (Tx l AlonzoEra -> String)
-> ([Tx l AlonzoEra] -> ShowS)
-> Show (Tx l AlonzoEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (l :: TxLevel). Int -> Tx l AlonzoEra -> ShowS
forall (l :: TxLevel). [Tx l AlonzoEra] -> ShowS
forall (l :: TxLevel). Tx l AlonzoEra -> String
$cshowsPrec :: forall (l :: TxLevel). Int -> Tx l AlonzoEra -> ShowS
showsPrec :: Int -> Tx l AlonzoEra -> ShowS
$cshow :: forall (l :: TxLevel). Tx l AlonzoEra -> String
show :: Tx l AlonzoEra -> String
$cshowList :: forall (l :: TxLevel). [Tx l AlonzoEra] -> ShowS
showList :: [Tx l AlonzoEra] -> ShowS
Show)
    deriving ((forall x. Tx l AlonzoEra -> Rep (Tx l AlonzoEra) x)
-> (forall x. Rep (Tx l AlonzoEra) x -> Tx l AlonzoEra)
-> Generic (Tx l AlonzoEra)
forall x. Rep (Tx l AlonzoEra) x -> Tx l AlonzoEra
forall x. Tx l AlonzoEra -> Rep (Tx l AlonzoEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (l :: TxLevel) x. Rep (Tx l AlonzoEra) x -> Tx l AlonzoEra
forall (l :: TxLevel) x. Tx l AlonzoEra -> Rep (Tx l AlonzoEra) x
$cfrom :: forall (l :: TxLevel) x. Tx l AlonzoEra -> Rep (Tx l AlonzoEra) x
from :: forall x. Tx l AlonzoEra -> Rep (Tx l AlonzoEra) x
$cto :: forall (l :: TxLevel) x. Rep (Tx l AlonzoEra) x -> Tx l AlonzoEra
to :: forall x. Rep (Tx l AlonzoEra) x -> Tx l AlonzoEra
Generic)

  mkBasicTx :: forall (l :: TxLevel). TxBody l AlonzoEra -> Tx l AlonzoEra
mkBasicTx = AlonzoTx l AlonzoEra -> Tx l AlonzoEra
forall (l :: TxLevel). AlonzoTx l AlonzoEra -> Tx l AlonzoEra
MkAlonzoTx (AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
-> (TxBody l AlonzoEra -> AlonzoTx l AlonzoEra)
-> TxBody l AlonzoEra
-> Tx l AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody l AlonzoEra -> AlonzoTx l AlonzoEra
forall era (l :: TxLevel).
(EraTx era, STxLevel l era ~ STxTopLevel l era) =>
TxBody l era -> AlonzoTx l era
mkBasicAlonzoTx

  bodyTxL :: forall (l :: TxLevel). Lens' (Tx l AlonzoEra) (TxBody l AlonzoEra)
bodyTxL = (AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL ((AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
 -> Tx l AlonzoEra -> f (Tx l AlonzoEra))
-> ((TxBody l AlonzoEra -> f (TxBody l AlonzoEra))
    -> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> (TxBody l AlonzoEra -> f (TxBody l AlonzoEra))
-> Tx l AlonzoEra
-> f (Tx l AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody l AlonzoEra -> f (TxBody l AlonzoEra))
-> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxBody l era -> f (TxBody l era))
-> AlonzoTx l era -> f (AlonzoTx l era)
bodyAlonzoTxL
  {-# INLINE bodyTxL #-}

  witsTxL :: forall (l :: TxLevel). Lens' (Tx l AlonzoEra) (TxWits AlonzoEra)
witsTxL = (AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL ((AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
 -> Tx l AlonzoEra -> f (Tx l AlonzoEra))
-> ((AlonzoTxWits AlonzoEra -> f (AlonzoTxWits AlonzoEra))
    -> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> (AlonzoTxWits AlonzoEra -> f (AlonzoTxWits AlonzoEra))
-> Tx l AlonzoEra
-> f (Tx l AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits AlonzoEra -> f (TxWits AlonzoEra))
-> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra)
(AlonzoTxWits AlonzoEra -> f (AlonzoTxWits AlonzoEra))
-> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> AlonzoTx l era -> f (AlonzoTx l era)
witsAlonzoTxL
  {-# INLINE witsTxL #-}

  auxDataTxL :: forall (l :: TxLevel).
Lens' (Tx l AlonzoEra) (StrictMaybe (TxAuxData AlonzoEra))
auxDataTxL = (AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL ((AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
 -> Tx l AlonzoEra -> f (Tx l AlonzoEra))
-> ((StrictMaybe (AlonzoTxAuxData AlonzoEra)
     -> f (StrictMaybe (AlonzoTxAuxData AlonzoEra)))
    -> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> (StrictMaybe (AlonzoTxAuxData AlonzoEra)
    -> f (StrictMaybe (AlonzoTxAuxData AlonzoEra)))
-> Tx l AlonzoEra
-> f (Tx l AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxAuxData AlonzoEra)
 -> f (StrictMaybe (TxAuxData AlonzoEra)))
-> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra)
(StrictMaybe (AlonzoTxAuxData AlonzoEra)
 -> f (StrictMaybe (AlonzoTxAuxData AlonzoEra)))
-> AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> AlonzoTx l era -> f (AlonzoTx l era)
auxDataAlonzoTxL
  {-# INLINE auxDataTxL #-}

  sizeTxF :: forall (l :: TxLevel).
HasCallStack =>
SimpleGetter (Tx l AlonzoEra) Word32
sizeTxF = (AlonzoTx l AlonzoEra -> Const r (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> Const r (Tx l AlonzoEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL ((AlonzoTx l AlonzoEra -> Const r (AlonzoTx l AlonzoEra))
 -> Tx l AlonzoEra -> Const r (Tx l AlonzoEra))
-> ((Word32 -> Const r Word32)
    -> AlonzoTx l AlonzoEra -> Const r (AlonzoTx l AlonzoEra))
-> (Word32 -> Const r Word32)
-> Tx l AlonzoEra
-> Const r (Tx l AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32 -> Const r Word32)
-> AlonzoTx l AlonzoEra -> Const r (AlonzoTx l AlonzoEra)
SimpleGetter (AlonzoTx l AlonzoEra) Word32
forall era (l :: TxLevel).
(HasCallStack, EraTx era) =>
SimpleGetter (AlonzoTx l era) Word32
sizeAlonzoTxF
  {-# INLINE sizeTxF #-}

  validateNativeScript :: forall (l :: TxLevel).
Tx l AlonzoEra -> NativeScript AlonzoEra -> Bool
validateNativeScript = Tx l AlonzoEra -> NativeScript AlonzoEra -> Bool
forall era (t :: TxLevel).
(EraTx era, AllegraEraTxBody era, AllegraEraScript era,
 NativeScript era ~ Timelock era) =>
Tx t era -> NativeScript era -> Bool
validateTimelock
  {-# INLINE validateNativeScript #-}

  getMinFeeTx :: forall (l :: TxLevel).
PParams AlonzoEra -> Tx l AlonzoEra -> Int -> Coin
getMinFeeTx PParams AlonzoEra
pp Tx l AlonzoEra
tx Int
_ = PParams AlonzoEra -> Tx l AlonzoEra -> Coin
forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx l era -> Coin
alonzoMinFeeTx PParams AlonzoEra
pp Tx l AlonzoEra
tx
  {-# INLINE getMinFeeTx #-}

alonzoTxEqRaw ::
  ( AlonzoEraTx era
  , STxLevel l era ~ STxTopLevel l era
  ) =>
  Tx l era -> Tx l era -> Bool
alonzoTxEqRaw :: forall era (l :: TxLevel).
(AlonzoEraTx era, STxLevel l era ~ STxTopLevel l era) =>
Tx l era -> Tx l era -> Bool
alonzoTxEqRaw Tx l era
tx1 Tx l era
tx2 =
  Tx l era -> (Tx TopTx era -> Bool) -> Bool
forall (t :: TxLevel -> * -> *) era (l :: TxLevel) a.
(HasEraTxLevel t era, STxLevel l era ~ STxTopLevel l era) =>
t l era -> (t TopTx era -> a) -> a
withTopTxLevelOnly Tx l era
tx1 ((Tx TopTx era -> Bool) -> Bool) -> (Tx TopTx era -> Bool) -> Bool
forall a b. (a -> b) -> a -> b
$ \Tx TopTx era
tx1' ->
    Tx l era -> (Tx TopTx era -> Bool) -> Bool
forall (t :: TxLevel -> * -> *) era (l :: TxLevel) a.
(HasEraTxLevel t era, STxLevel l era ~ STxTopLevel l era) =>
t l era -> (t TopTx era -> a) -> a
withTopTxLevelOnly Tx l era
tx2 ((Tx TopTx era -> Bool) -> Bool) -> (Tx TopTx era -> Bool) -> Bool
forall a b. (a -> b) -> a -> b
$ \Tx TopTx era
tx2' ->
      Tx l era -> Tx l era -> Bool
forall era (l :: TxLevel).
EraTx era =>
Tx l era -> Tx l era -> Bool
shelleyTxEqRaw Tx l era
tx1 Tx l era
tx2 Bool -> Bool -> Bool
&& (Tx TopTx era
tx1' Tx TopTx era -> Getting IsValid (Tx TopTx era) IsValid -> IsValid
forall s a. s -> Getting a s a -> a
^. Getting IsValid (Tx TopTx era) IsValid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL IsValid -> IsValid -> Bool
forall a. Eq a => a -> a -> Bool
== Tx TopTx era
tx2' Tx TopTx era -> Getting IsValid (Tx TopTx era) IsValid -> IsValid
forall s a. s -> Getting a s a -> a
^. Getting IsValid (Tx TopTx era) IsValid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL)

instance EqRaw (Tx l AlonzoEra) where
  eqRaw :: Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
eqRaw = Tx l AlonzoEra -> Tx l AlonzoEra -> Bool
forall era (l :: TxLevel).
(AlonzoEraTx era, STxLevel l era ~ STxTopLevel l era) =>
Tx l era -> Tx l era -> Bool
alonzoTxEqRaw

alonzoTxL :: Lens' (Tx l AlonzoEra) (AlonzoTx l AlonzoEra)
alonzoTxL :: forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL = (Tx l AlonzoEra -> AlonzoTx l AlonzoEra)
-> (Tx l AlonzoEra -> AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
-> Lens
     (Tx l AlonzoEra)
     (Tx l AlonzoEra)
     (AlonzoTx l AlonzoEra)
     (AlonzoTx l AlonzoEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx l AlonzoEra -> AlonzoTx l AlonzoEra
forall (l :: TxLevel). Tx l AlonzoEra -> AlonzoTx l AlonzoEra
unAlonzoTx ((Tx l AlonzoEra -> AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
 -> Lens
      (Tx l AlonzoEra)
      (Tx l AlonzoEra)
      (AlonzoTx l AlonzoEra)
      (AlonzoTx l AlonzoEra))
-> (Tx l AlonzoEra -> AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
-> Lens
     (Tx l AlonzoEra)
     (Tx l AlonzoEra)
     (AlonzoTx l AlonzoEra)
     (AlonzoTx l AlonzoEra)
forall a b. (a -> b) -> a -> b
$ (AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
-> Tx l AlonzoEra -> AlonzoTx l AlonzoEra -> Tx l AlonzoEra
forall a b. a -> b -> a
const AlonzoTx l AlonzoEra -> Tx l AlonzoEra
forall (l :: TxLevel). AlonzoTx l AlonzoEra -> Tx l AlonzoEra
MkAlonzoTx

class
  (EraTx era, AlonzoEraTxBody era, AlonzoEraTxWits era, AlonzoEraScript era) =>
  AlonzoEraTx era
  where
  isValidTxL :: Lens' (Tx TopTx era) IsValid

instance Typeable l => DecCBOR (Annotator (Tx l AlonzoEra)) where
  decCBOR :: forall s. Decoder s (Annotator (Tx l AlonzoEra))
decCBOR = (AlonzoTx l AlonzoEra -> Tx l AlonzoEra)
-> Annotator (AlonzoTx l AlonzoEra) -> Annotator (Tx l AlonzoEra)
forall a b. (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AlonzoTx l AlonzoEra -> Tx l AlonzoEra
forall (l :: TxLevel). AlonzoTx l AlonzoEra -> Tx l AlonzoEra
MkAlonzoTx (Annotator (AlonzoTx l AlonzoEra) -> Annotator (Tx l AlonzoEra))
-> Decoder s (Annotator (AlonzoTx l AlonzoEra))
-> Decoder s (Annotator (Tx l AlonzoEra))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (AlonzoTx l AlonzoEra))
forall s. Decoder s (Annotator (AlonzoTx l AlonzoEra))
forall a s. DecCBOR a => Decoder s a
decCBOR

instance AlonzoEraTx AlonzoEra where
  isValidTxL :: Lens' (Tx TopTx AlonzoEra) IsValid
isValidTxL = (AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra))
-> Tx TopTx AlonzoEra -> f (Tx TopTx AlonzoEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l AlonzoEra -> f (AlonzoTx l AlonzoEra))
-> Tx l AlonzoEra -> f (Tx l AlonzoEra)
alonzoTxL ((AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra))
 -> Tx TopTx AlonzoEra -> f (Tx TopTx AlonzoEra))
-> ((IsValid -> f IsValid)
    -> AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra))
-> (IsValid -> f IsValid)
-> Tx TopTx AlonzoEra
-> f (Tx TopTx AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsValid -> f IsValid)
-> AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsValid -> f IsValid) -> AlonzoTx l era -> f (AlonzoTx l era)
isValidAlonzoTxL
  {-# INLINE isValidTxL #-}

mkBasicAlonzoTx ::
  ( EraTx era
  , STxLevel l era ~ STxTopLevel l era
  ) =>
  TxBody l era -> AlonzoTx l era
mkBasicAlonzoTx :: forall era (l :: TxLevel).
(EraTx era, STxLevel l era ~ STxTopLevel l era) =>
TxBody l era -> AlonzoTx l era
mkBasicAlonzoTx TxBody l era
txBody =
  case TxBody l era -> STxLevel l era
forall (l :: TxLevel). TxBody l era -> STxLevel l era
forall (t :: TxLevel -> * -> *) era (l :: TxLevel).
HasEraTxLevel t era =>
t l era -> STxLevel l era
toSTxLevel TxBody l era
txBody of
    STxLevel l era
STxTopLevel l era
STopTxOnly ->
      TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx TxBody l era
TxBody TopTx era
txBody TxWits era
forall a. Monoid a => a
mempty (Bool -> IsValid
IsValid Bool
True) StrictMaybe (TxAuxData era)
forall a. StrictMaybe a
SNothing

-- | `TxBody` setter and getter for `AlonzoTx`.
bodyAlonzoTxL :: Lens' (AlonzoTx l era) (TxBody l era)
bodyAlonzoTxL :: forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxBody l era -> f (TxBody l era))
-> AlonzoTx l era -> f (AlonzoTx l era)
bodyAlonzoTxL =
  (AlonzoTx l era -> TxBody l era)
-> (AlonzoTx l era -> TxBody l era -> AlonzoTx l era)
-> Lens
     (AlonzoTx l era) (AlonzoTx l era) (TxBody l era) (TxBody l era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\AlonzoTx {TxBody TopTx era
atBody :: forall era. AlonzoTx TopTx era -> TxBody TopTx era
atBody :: TxBody TopTx era
atBody} -> TxBody l era
TxBody TopTx era
atBody) ((AlonzoTx l era -> TxBody l era -> AlonzoTx l era)
 -> Lens
      (AlonzoTx l era) (AlonzoTx l era) (TxBody l era) (TxBody l era))
-> (AlonzoTx l era -> TxBody l era -> AlonzoTx l era)
-> Lens
     (AlonzoTx l era) (AlonzoTx l era) (TxBody l era) (TxBody l era)
forall a b. (a -> b) -> a -> b
$ \AlonzoTx l era
tx TxBody l era
txBody ->
    case AlonzoTx l era
tx of
      AlonzoTx {} -> AlonzoTx l era
tx {atBody = txBody}
{-# INLINEABLE bodyAlonzoTxL #-}

-- | `TxWits` setter and getter for `AlonzoTx`.
witsAlonzoTxL :: Lens' (AlonzoTx l era) (TxWits era)
witsAlonzoTxL :: forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> AlonzoTx l era -> f (AlonzoTx l era)
witsAlonzoTxL =
  (AlonzoTx l era -> TxWits era)
-> (AlonzoTx l era -> TxWits era -> AlonzoTx l era)
-> Lens (AlonzoTx l era) (AlonzoTx l era) (TxWits era) (TxWits era)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\AlonzoTx {TxWits era
atWits :: forall era. AlonzoTx TopTx era -> TxWits era
atWits :: TxWits era
atWits} -> TxWits era
atWits) ((AlonzoTx l era -> TxWits era -> AlonzoTx l era)
 -> Lens
      (AlonzoTx l era) (AlonzoTx l era) (TxWits era) (TxWits era))
-> (AlonzoTx l era -> TxWits era -> AlonzoTx l era)
-> Lens (AlonzoTx l era) (AlonzoTx l era) (TxWits era) (TxWits era)
forall a b. (a -> b) -> a -> b
$ \AlonzoTx l era
tx TxWits era
txWits ->
    case AlonzoTx l era
tx of
      AlonzoTx {} -> AlonzoTx l era
tx {atWits = txWits}
{-# INLINEABLE witsAlonzoTxL #-}

-- | `TxAuxData` setter and getter for `AlonzoTx`.
auxDataAlonzoTxL :: Lens' (AlonzoTx l era) (StrictMaybe (TxAuxData era))
auxDataAlonzoTxL :: forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> AlonzoTx l era -> f (AlonzoTx l era)
auxDataAlonzoTxL =
  (AlonzoTx l era -> StrictMaybe (TxAuxData era))
-> (AlonzoTx l era
    -> StrictMaybe (TxAuxData era) -> AlonzoTx l era)
-> Lens
     (AlonzoTx l era)
     (AlonzoTx l era)
     (StrictMaybe (TxAuxData era))
     (StrictMaybe (TxAuxData era))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\AlonzoTx {StrictMaybe (TxAuxData era)
atAuxData :: forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atAuxData :: StrictMaybe (TxAuxData era)
atAuxData} -> StrictMaybe (TxAuxData era)
atAuxData) ((AlonzoTx l era -> StrictMaybe (TxAuxData era) -> AlonzoTx l era)
 -> Lens
      (AlonzoTx l era)
      (AlonzoTx l era)
      (StrictMaybe (TxAuxData era))
      (StrictMaybe (TxAuxData era)))
-> (AlonzoTx l era
    -> StrictMaybe (TxAuxData era) -> AlonzoTx l era)
-> Lens
     (AlonzoTx l era)
     (AlonzoTx l era)
     (StrictMaybe (TxAuxData era))
     (StrictMaybe (TxAuxData era))
forall a b. (a -> b) -> a -> b
$ \AlonzoTx l era
tx StrictMaybe (TxAuxData era)
txAuxData ->
    case AlonzoTx l era
tx of
      AlonzoTx {} -> AlonzoTx l era
tx {atAuxData = txAuxData}
{-# INLINEABLE auxDataAlonzoTxL #-}

-- | txsize computes the length of the serialised bytes (for estimations)
sizeAlonzoTxF :: forall era l. (HasCallStack, EraTx era) => SimpleGetter (AlonzoTx l era) Word32
sizeAlonzoTxF :: forall era (l :: TxLevel).
(HasCallStack, EraTx era) =>
SimpleGetter (AlonzoTx l era) Word32
sizeAlonzoTxF =
  (AlonzoTx l era -> Word32) -> SimpleGetter (AlonzoTx l era) Word32
forall s a. (s -> a) -> SimpleGetter s a
to ((AlonzoTx l era -> Word32)
 -> SimpleGetter (AlonzoTx l era) Word32)
-> (AlonzoTx l era -> Word32)
-> SimpleGetter (AlonzoTx l era) Word32
forall a b. (a -> b) -> a -> b
$
    Fail Word32 -> Word32
forall a. HasCallStack => Fail a -> a
errorFail
      (Fail Word32 -> Word32)
-> (AlonzoTx l era -> Fail Word32) -> AlonzoTx l era -> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall i b (m :: * -> *).
(Integral i, Integral b, Bounded b, MonadFail m) =>
i -> m b
integralToBounded @Int64 @Word32
      (Int64 -> Fail Word32)
-> (AlonzoTx l era -> Int64) -> AlonzoTx l era -> Fail Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Int64
LBS.length
      (ByteString -> Int64)
-> (AlonzoTx l era -> ByteString) -> AlonzoTx l era -> Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize (forall era. Era era => Version
eraProtVerLow @era)
      (Encoding -> ByteString)
-> (AlonzoTx l era -> Encoding) -> AlonzoTx l era -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AlonzoTx l era -> Encoding
forall (l :: TxLevel) era.
(EncCBOR (TxBody l era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
AlonzoTx l era -> Encoding
toCBORForSizeComputation
{-# INLINEABLE sizeAlonzoTxF #-}

isValidAlonzoTxL :: Lens' (AlonzoTx l era) IsValid
isValidAlonzoTxL :: forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsValid -> f IsValid) -> AlonzoTx l era -> f (AlonzoTx l era)
isValidAlonzoTxL =
  (AlonzoTx l era -> IsValid)
-> (AlonzoTx l era -> IsValid -> AlonzoTx l era)
-> Lens (AlonzoTx l era) (AlonzoTx l era) IsValid IsValid
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (\AlonzoTx {IsValid
atIsValid :: forall era. AlonzoTx TopTx era -> IsValid
atIsValid :: IsValid
atIsValid} -> IsValid
atIsValid) ((AlonzoTx l era -> IsValid -> AlonzoTx l era)
 -> Lens (AlonzoTx l era) (AlonzoTx l era) IsValid IsValid)
-> (AlonzoTx l era -> IsValid -> AlonzoTx l era)
-> Lens (AlonzoTx l era) (AlonzoTx l era) IsValid IsValid
forall a b. (a -> b) -> a -> b
$ \AlonzoTx l era
tx IsValid
txIsValid ->
    case AlonzoTx l era
tx of
      AlonzoTx {} -> AlonzoTx l era
tx {atIsValid = txIsValid}
{-# INLINEABLE isValidAlonzoTxL #-}

deriving instance
  (Era era, Eq (TxBody l era), Eq (TxWits era), Eq (TxAuxData era)) => Eq (AlonzoTx l era)

deriving instance
  (Era era, Show (TxBody l era), Show (TxAuxData era), Show (Script era), Show (TxWits era)) =>
  Show (AlonzoTx l era)

deriving via
  InspectHeap (AlonzoTx l era)
  instance
    (Typeable era, Typeable l) => NoThunks (AlonzoTx l era)

instance
  ( Era era
  , NFData (TxWits era)
  , NFData (TxAuxData era)
  , NFData (TxBody l era)
  ) =>
  NFData (AlonzoTx l era)
  where
  rnf :: AlonzoTx l era -> ()
rnf AlonzoTx {StrictMaybe (TxAuxData era)
TxBody TopTx era
TxWits era
IsValid
atBody :: forall era. AlonzoTx TopTx era -> TxBody TopTx era
atWits :: forall era. AlonzoTx TopTx era -> TxWits era
atIsValid :: forall era. AlonzoTx TopTx era -> IsValid
atAuxData :: forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atBody :: TxBody TopTx era
atWits :: TxWits era
atIsValid :: IsValid
atAuxData :: StrictMaybe (TxAuxData era)
..} =
    TxBody TopTx era
atBody TxBody TopTx era -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
      TxWits era
atWits TxWits era -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
        StrictMaybe (TxAuxData era)
atAuxData StrictMaybe (TxAuxData era) -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
          IsValid -> ()
forall a. NFData a => a -> ()
rnf IsValid
atIsValid

-- | A ScriptIntegrityHash is the hash of three things.  The first two come
-- from the witnesses and the last comes from the Protocol Parameters.
data ScriptIntegrity era
  = ScriptIntegrity
      !(Redeemers era) -- From the witnesses
      !(TxDats era)
      !(Set LangDepView) -- From the Protocol parameters
  deriving (ScriptIntegrity era -> ScriptIntegrity era -> Bool
(ScriptIntegrity era -> ScriptIntegrity era -> Bool)
-> (ScriptIntegrity era -> ScriptIntegrity era -> Bool)
-> Eq (ScriptIntegrity era)
forall era.
AlonzoEraScript era =>
ScriptIntegrity era -> ScriptIntegrity era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era.
AlonzoEraScript era =>
ScriptIntegrity era -> ScriptIntegrity era -> Bool
== :: ScriptIntegrity era -> ScriptIntegrity era -> Bool
$c/= :: forall era.
AlonzoEraScript era =>
ScriptIntegrity era -> ScriptIntegrity era -> Bool
/= :: ScriptIntegrity era -> ScriptIntegrity era -> Bool
Eq, (forall x. ScriptIntegrity era -> Rep (ScriptIntegrity era) x)
-> (forall x. Rep (ScriptIntegrity era) x -> ScriptIntegrity era)
-> Generic (ScriptIntegrity era)
forall x. Rep (ScriptIntegrity era) x -> ScriptIntegrity era
forall x. ScriptIntegrity era -> Rep (ScriptIntegrity era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (ScriptIntegrity era) x -> ScriptIntegrity era
forall era x. ScriptIntegrity era -> Rep (ScriptIntegrity era) x
$cfrom :: forall era x. ScriptIntegrity era -> Rep (ScriptIntegrity era) x
from :: forall x. ScriptIntegrity era -> Rep (ScriptIntegrity era) x
$cto :: forall era x. Rep (ScriptIntegrity era) x -> ScriptIntegrity era
to :: forall x. Rep (ScriptIntegrity era) x -> ScriptIntegrity era
Generic)

deriving instance AlonzoEraScript era => Show (ScriptIntegrity era)

deriving instance AlonzoEraScript era => NoThunks (ScriptIntegrity era)

-- ScriptIntegrity is not transmitted over the network. The bytes are independently
-- reconstructed by all nodes. There are no original bytes to preserve.
-- Instead, we must use a reproducable serialization
instance Era era => SafeToHash (ScriptIntegrity era) where
  originalBytes :: ScriptIntegrity era -> ByteString
originalBytes (ScriptIntegrity Redeemers era
m TxDats era
d Set LangDepView
l) =
    let dBytes :: ByteString
dBytes = if Map DataHash (Data era) -> Bool
forall a. Map DataHash a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (TxDats era
d TxDats era
-> Getting
     (Map DataHash (Data era)) (TxDats era) (Map DataHash (Data era))
-> Map DataHash (Data era)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map DataHash (Data era)) (TxDats era) (Map DataHash (Data era))
forall era. Era era => Lens' (TxDats era) (Map DataHash (Data era))
Lens' (TxDats era) (Map DataHash (Data era))
unTxDatsL) then ByteString
forall a. Monoid a => a
mempty else TxDats era -> ByteString
forall t. SafeToHash t => t -> ByteString
originalBytes TxDats era
d
        lBytes :: ByteString
lBytes = Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize' (forall era. Era era => Version
eraProtVerLow @era) (Set LangDepView -> Encoding
encodeLangViews Set LangDepView
l)
     in Redeemers era -> ByteString
forall t. SafeToHash t => t -> ByteString
originalBytes Redeemers era
m ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
dBytes ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
lBytes

instance
  Era era =>
  HashAnnotated (ScriptIntegrity era) EraIndependentScriptIntegrity

hashScriptIntegrity :: Era era => ScriptIntegrity era -> ScriptIntegrityHash
hashScriptIntegrity :: forall era.
Era era =>
ScriptIntegrity era -> SafeHash EraIndependentScriptIntegrity
hashScriptIntegrity = ScriptIntegrity era -> SafeHash EraIndependentScriptIntegrity
forall x i. HashAnnotated x i => x -> SafeHash i
hashAnnotated

mkScriptIntegrity ::
  ( AlonzoEraPParams era
  , AlonzoEraTxWits era
  , EraUTxO era
  ) =>
  PParams era ->
  Tx l era ->
  ScriptsProvided era ->
  Set ScriptHash ->
  StrictMaybe (ScriptIntegrity era)
mkScriptIntegrity :: forall era (l :: TxLevel).
(AlonzoEraPParams era, AlonzoEraTxWits era, EraUTxO era) =>
PParams era
-> Tx l era
-> ScriptsProvided era
-> Set ScriptHash
-> StrictMaybe (ScriptIntegrity era)
mkScriptIntegrity PParams era
pp Tx l era
tx (ScriptsProvided Map ScriptHash (Script era)
scriptsProvided) Set ScriptHash
scriptsNeeded
  | Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> Bool
forall a. Map (PlutusPurpose AsIx era) a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Redeemers era
txRedeemers Redeemers era
-> Getting
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
     (Redeemers era)
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
  (Redeemers era)
  (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
forall era.
AlonzoEraScript era =>
Lens'
  (Redeemers era) (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
Lens'
  (Redeemers era) (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
unRedeemersL)
  , Set LangDepView -> Bool
forall a. Set a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Set LangDepView
langViews
  , Map DataHash (Data era) -> Bool
forall a. Map DataHash a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (TxDats era
txDats TxDats era
-> Getting
     (Map DataHash (Data era)) (TxDats era) (Map DataHash (Data era))
-> Map DataHash (Data era)
forall s a. s -> Getting a s a -> a
^. Getting
  (Map DataHash (Data era)) (TxDats era) (Map DataHash (Data era))
forall era. Era era => Lens' (TxDats era) (Map DataHash (Data era))
Lens' (TxDats era) (Map DataHash (Data era))
unTxDatsL) =
      StrictMaybe (ScriptIntegrity era)
forall a. StrictMaybe a
SNothing
  | Bool
otherwise = ScriptIntegrity era -> StrictMaybe (ScriptIntegrity era)
forall a. a -> StrictMaybe a
SJust (ScriptIntegrity era -> StrictMaybe (ScriptIntegrity era))
-> ScriptIntegrity era -> StrictMaybe (ScriptIntegrity era)
forall a b. (a -> b) -> a -> b
$ Redeemers era
-> TxDats era -> Set LangDepView -> ScriptIntegrity era
forall era.
Redeemers era
-> TxDats era -> Set LangDepView -> ScriptIntegrity era
ScriptIntegrity Redeemers era
txRedeemers TxDats era
txDats Set LangDepView
langViews
  where
    scriptsUsed :: [Script era]
scriptsUsed = Map ScriptHash (Script era) -> [Script era]
forall k a. Map k a -> [a]
Map.elems (Map ScriptHash (Script era) -> [Script era])
-> Map ScriptHash (Script era) -> [Script era]
forall a b. (a -> b) -> a -> b
$ Map ScriptHash (Script era)
-> Set ScriptHash -> Map ScriptHash (Script era)
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.restrictKeys Map ScriptHash (Script era)
scriptsProvided Set ScriptHash
scriptsNeeded
    langs :: Set Language
langs = [Language] -> Set Language
forall a. Ord a => [a] -> Set a
Set.fromList ([Language] -> Set Language) -> [Language] -> Set Language
forall a b. (a -> b) -> a -> b
$ PlutusScript era -> Language
forall era. AlonzoEraScript era => PlutusScript era -> Language
plutusScriptLanguage (PlutusScript era -> Language) -> [PlutusScript era] -> [Language]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Script era -> Maybe (PlutusScript era))
-> [Script era] -> [PlutusScript era]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Script era -> Maybe (PlutusScript era)
forall era.
AlonzoEraScript era =>
Script era -> Maybe (PlutusScript era)
toPlutusScript [Script era]
scriptsUsed
    langViews :: Set LangDepView
langViews = (Language -> LangDepView) -> Set Language -> Set LangDepView
forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (PParams era -> Language -> LangDepView
forall era.
AlonzoEraPParams era =>
PParams era -> Language -> LangDepView
getLanguageView PParams era
pp) Set Language
langs
    txWits :: TxWits era
txWits = Tx l era
tx Tx l era
-> Getting (TxWits era) (Tx l era) (TxWits era) -> TxWits era
forall s a. s -> Getting a s a -> a
^. Getting (TxWits era) (Tx l era) (TxWits era)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxWits era)
forall (l :: TxLevel). Lens' (Tx l era) (TxWits era)
witsTxL
    txRedeemers :: Redeemers era
txRedeemers = TxWits era
txWits TxWits era
-> Getting (Redeemers era) (TxWits era) (Redeemers era)
-> Redeemers era
forall s a. s -> Getting a s a -> a
^. Getting (Redeemers era) (TxWits era) (Redeemers era)
forall era.
AlonzoEraTxWits era =>
Lens' (TxWits era) (Redeemers era)
Lens' (TxWits era) (Redeemers era)
rdmrsTxWitsL
    txDats :: TxDats era
txDats = TxWits era
txWits TxWits era
-> Getting (TxDats era) (TxWits era) (TxDats era) -> TxDats era
forall s a. s -> Getting a s a -> a
^. Getting (TxDats era) (TxWits era) (TxDats era)
forall era. AlonzoEraTxWits era => Lens' (TxWits era) (TxDats era)
Lens' (TxWits era) (TxDats era)
datsTxWitsL

-- ===============================================================
-- From the specification, Figure 4 "Functions related to fees"
-- ===============================================================

-- | This ensures that the size of transactions from Mary is unchanged.
-- The individual components all store their bytes; the only work we do in this
-- function is concatenating
toCBORForSizeComputation ::
  ( EncCBOR (TxBody l era)
  , EncCBOR (TxWits era)
  , EncCBOR (TxAuxData era)
  ) =>
  AlonzoTx l era ->
  Encoding
toCBORForSizeComputation :: forall (l :: TxLevel) era.
(EncCBOR (TxBody l era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
AlonzoTx l era -> Encoding
toCBORForSizeComputation AlonzoTx {TxBody TopTx era
atBody :: forall era. AlonzoTx TopTx era -> TxBody TopTx era
atBody :: TxBody TopTx era
atBody, TxWits era
atWits :: forall era. AlonzoTx TopTx era -> TxWits era
atWits :: TxWits era
atWits, StrictMaybe (TxAuxData era)
atAuxData :: forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atAuxData :: StrictMaybe (TxAuxData era)
atAuxData} =
  Word -> Encoding
encodeListLen Word
3
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> TxBody TopTx era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR TxBody TopTx era
atBody
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> TxWits era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR TxWits era
atWits
    Encoding -> Encoding -> Encoding
forall a. Semigroup a => a -> a -> a
<> (TxAuxData era -> Encoding)
-> StrictMaybe (TxAuxData era) -> Encoding
forall a. (a -> Encoding) -> StrictMaybe a -> Encoding
encodeNullStrictMaybe TxAuxData era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR StrictMaybe (TxAuxData era)
atAuxData

alonzoMinFeeTx ::
  ( EraTx era
  , AlonzoEraTxWits era
  , AlonzoEraPParams era
  ) =>
  PParams era ->
  Tx l era ->
  Coin
alonzoMinFeeTx :: forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx l era -> Coin
alonzoMinFeeTx PParams era
pp Tx l era
tx =
  (Tx l era
tx Tx l era -> Getting Word32 (Tx l era) Word32 -> Word32
forall s a. s -> Getting a s a -> a
^. Getting Word32 (Tx l era) Word32
forall era (l :: TxLevel).
(EraTx era, HasCallStack) =>
SimpleGetter (Tx l era) Word32
SimpleGetter (Tx l era) Word32
forall (l :: TxLevel).
HasCallStack =>
SimpleGetter (Tx l era) Word32
sizeTxF Word32 -> Coin -> Coin
forall i. Integral i => i -> Coin -> Coin
forall t i. (Val t, Integral i) => i -> t -> t
<×> PParams era
pp PParams era -> Getting Coin (PParams era) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (PParams era) Coin
forall era.
(EraPParams era, HasCallStack) =>
Lens' (PParams era) Coin
Lens' (PParams era) Coin
ppMinFeeAL)
    Coin -> Coin -> Coin
forall t. Val t => t -> t -> t
<+> (PParams era
pp PParams era -> Getting Coin (PParams era) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (PParams era) Coin
forall era.
(EraPParams era, HasCallStack) =>
Lens' (PParams era) Coin
Lens' (PParams era) Coin
ppMinFeeBL)
    Coin -> Coin -> Coin
forall t. Val t => t -> t -> t
<+> Prices -> ExUnits -> Coin
txscriptfee (PParams era
pp PParams era -> Getting Prices (PParams era) Prices -> Prices
forall s a. s -> Getting a s a -> a
^. Getting Prices (PParams era) Prices
forall era. AlonzoEraPParams era => Lens' (PParams era) Prices
Lens' (PParams era) Prices
ppPricesL) ExUnits
allExunits
  where
    allExunits :: ExUnits
allExunits = Tx l era -> ExUnits
forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era) =>
Tx l era -> ExUnits
totExUnits Tx l era
tx

totExUnits ::
  (EraTx era, AlonzoEraTxWits era) =>
  Tx l era ->
  ExUnits
totExUnits :: forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era) =>
Tx l era -> ExUnits
totExUnits Tx l era
tx = ((Data era, ExUnits) -> ExUnits)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> ExUnits
forall m a.
Monoid m =>
(a -> m) -> Map (PlutusPurpose AsIx era) a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Data era, ExUnits) -> ExUnits
forall a b. (a, b) -> b
snd (Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> ExUnits)
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits) -> ExUnits
forall a b. (a -> b) -> a -> b
$ Tx l era
tx Tx l era
-> Getting
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
     (Tx l era)
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
-> Map (PlutusPurpose AsIx era) (Data era, ExUnits)
forall s a. s -> Getting a s a -> a
^. (TxWits era
 -> Const
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era))
-> Tx l era
-> Const
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Tx l era)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxWits era)
forall (l :: TxLevel). Lens' (Tx l era) (TxWits era)
witsTxL ((TxWits era
  -> Const
       (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era))
 -> Tx l era
 -> Const
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Tx l era))
-> ((Map (PlutusPurpose AsIx era) (Data era, ExUnits)
     -> Const
          (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
          (Map (PlutusPurpose AsIx era) (Data era, ExUnits)))
    -> TxWits era
    -> Const
         (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era))
-> Getting
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
     (Tx l era)
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Redeemers era
 -> Const
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Redeemers era))
-> TxWits era
-> Const
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era)
forall era.
AlonzoEraTxWits era =>
Lens' (TxWits era) (Redeemers era)
Lens' (TxWits era) (Redeemers era)
rdmrsTxWitsL ((Redeemers era
  -> Const
       (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Redeemers era))
 -> TxWits era
 -> Const
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era))
-> ((Map (PlutusPurpose AsIx era) (Data era, ExUnits)
     -> Const
          (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
          (Map (PlutusPurpose AsIx era) (Data era, ExUnits)))
    -> Redeemers era
    -> Const
         (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Redeemers era))
-> (Map (PlutusPurpose AsIx era) (Data era, ExUnits)
    -> Const
         (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
         (Map (PlutusPurpose AsIx era) (Data era, ExUnits)))
-> TxWits era
-> Const
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (TxWits era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Map (PlutusPurpose AsIx era) (Data era, ExUnits)
 -> Const
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
      (Map (PlutusPurpose AsIx era) (Data era, ExUnits)))
-> Redeemers era
-> Const
     (Map (PlutusPurpose AsIx era) (Data era, ExUnits)) (Redeemers era)
forall era.
AlonzoEraScript era =>
Lens'
  (Redeemers era) (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
Lens'
  (Redeemers era) (Map (PlutusPurpose AsIx era) (Data era, ExUnits))
unRedeemersL

--------------------------------------------------------------------------------
-- Serialisation
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
-- Mempool Serialisation
--
-- We do not store the Tx bytes for the following reasons:
-- - A Tx serialised in this way never forms part of any hashed structure, hence
--   we do not worry about the serialisation changing and thus seeing a new
--   hash.
-- - The three principal components of this Tx already store their own bytes;
--   here we simply concatenate them. The final component, `IsValid`, is
--   just a flag and very cheap to serialise.
--------------------------------------------------------------------------------

-- | Encode to CBOR for the purposes of transmission from node to node, or from
-- wallet to node.
--
-- Note that this serialisation is neither the serialisation used on-chain
-- (where Txs are deconstructed using segwit), nor the serialisation used for
-- computing the transaction size (which omits the `IsValid` field for
-- compatibility with Mary - see 'toCBORForSizeComputation').
toCBORForMempoolSubmission ::
  ( EncCBOR (TxBody l era)
  , EncCBOR (TxWits era)
  , EncCBOR (TxAuxData era)
  ) =>
  AlonzoTx l era ->
  Encoding
toCBORForMempoolSubmission :: forall (l :: TxLevel) era.
(EncCBOR (TxBody l era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
AlonzoTx l era -> Encoding
toCBORForMempoolSubmission
  AlonzoTx {TxBody TopTx era
atBody :: forall era. AlonzoTx TopTx era -> TxBody TopTx era
atBody :: TxBody TopTx era
atBody, TxWits era
atWits :: forall era. AlonzoTx TopTx era -> TxWits era
atWits :: TxWits era
atWits, StrictMaybe (TxAuxData era)
atAuxData :: forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atAuxData :: StrictMaybe (TxAuxData era)
atAuxData, IsValid
atIsValid :: forall era. AlonzoTx TopTx era -> IsValid
atIsValid :: IsValid
atIsValid} =
    Encode (Closed Dense) (AlonzoTx TopTx era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode (Closed Dense) (AlonzoTx TopTx era) -> Encoding)
-> Encode (Closed Dense) (AlonzoTx TopTx era) -> Encoding
forall a b. (a -> b) -> a -> b
$
      (TxBody TopTx era
 -> TxWits era
 -> IsValid
 -> StrictMaybe (TxAuxData era)
 -> AlonzoTx TopTx era)
-> Encode
     (Closed Dense)
     (TxBody TopTx era
      -> TxWits era
      -> IsValid
      -> StrictMaybe (TxAuxData era)
      -> AlonzoTx TopTx era)
forall t. t -> Encode (Closed Dense) t
Rec TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx
        Encode
  (Closed Dense)
  (TxBody TopTx era
   -> TxWits era
   -> IsValid
   -> StrictMaybe (TxAuxData era)
   -> AlonzoTx TopTx era)
-> Encode (Closed Dense) (TxBody TopTx era)
-> Encode
     (Closed Dense)
     (TxWits era
      -> IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> TxBody TopTx era -> Encode (Closed Dense) (TxBody TopTx era)
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To TxBody TopTx era
atBody
        Encode
  (Closed Dense)
  (TxWits era
   -> IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Encode (Closed Dense) (TxWits era)
-> Encode
     (Closed Dense)
     (IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> TxWits era -> Encode (Closed Dense) (TxWits era)
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To TxWits era
atWits
        Encode
  (Closed Dense)
  (IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Encode (Closed Dense) IsValid
-> Encode
     (Closed Dense) (StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> IsValid -> Encode (Closed Dense) IsValid
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To IsValid
atIsValid
        Encode
  (Closed Dense) (StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Encode (Closed Dense) (StrictMaybe (TxAuxData era))
-> Encode (Closed Dense) (AlonzoTx TopTx era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> (StrictMaybe (TxAuxData era) -> Encoding)
-> StrictMaybe (TxAuxData era)
-> Encode (Closed Dense) (StrictMaybe (TxAuxData era))
forall t. (t -> Encoding) -> t -> Encode (Closed Dense) t
E ((TxAuxData era -> Encoding)
-> StrictMaybe (TxAuxData era) -> Encoding
forall a. (a -> Encoding) -> StrictMaybe a -> Encoding
encodeNullStrictMaybe TxAuxData era -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR) StrictMaybe (TxAuxData era)
atAuxData

instance
  ( Era era
  , EncCBOR (TxBody l era)
  , EncCBOR (TxAuxData era)
  , EncCBOR (TxWits era)
  ) =>
  EncCBOR (AlonzoTx l era)
  where
  encCBOR :: AlonzoTx l era -> Encoding
encCBOR = AlonzoTx l era -> Encoding
forall (l :: TxLevel) era.
(EncCBOR (TxBody l era), EncCBOR (TxWits era),
 EncCBOR (TxAuxData era)) =>
AlonzoTx l era -> Encoding
toCBORForMempoolSubmission

instance
  ( Era era
  , EncCBOR (TxBody l era)
  , EncCBOR (TxAuxData era)
  , EncCBOR (TxWits era)
  , Typeable l
  ) =>
  ToCBOR (AlonzoTx l era)
  where
  toCBOR :: AlonzoTx l era -> Encoding
toCBOR = forall era t. (Era era, EncCBOR t) => t -> Encoding
toEraCBOR @era

instance
  ( Typeable l
  , Era era
  , Typeable (TxBody l era)
  , Typeable (TxWits era)
  , Typeable (TxAuxData era)
  , DecCBOR (Annotator (TxBody l era))
  , DecCBOR (Annotator (TxWits era))
  , DecCBOR (Annotator (TxAuxData era))
  ) =>
  DecCBOR (Annotator (AlonzoTx l era))
  where
  decCBOR :: forall s. Decoder s (Annotator (AlonzoTx l era))
decCBOR =
    forall (l :: TxLevel) era a (m :: * -> *).
(Typeable l, Era era, MonadFail m) =>
(STxTopLevel l era -> m a) -> m a
withSTxTopLevelM @l @era ((STxTopLevel l era -> Decoder s (Annotator (AlonzoTx l era)))
 -> Decoder s (Annotator (AlonzoTx l era)))
-> (STxTopLevel l era -> Decoder s (Annotator (AlonzoTx l era)))
-> Decoder s (Annotator (AlonzoTx l era))
forall a b. (a -> b) -> a -> b
$ \case
      STxTopLevel l era
STopTxOnly ->
        Decode (Closed Dense) (Annotator (AlonzoTx l era))
-> Decoder s (Annotator (AlonzoTx l era))
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode (Closed Dense) (Annotator (AlonzoTx l era))
 -> Decoder s (Annotator (AlonzoTx l era)))
-> Decode (Closed Dense) (Annotator (AlonzoTx l era))
-> Decoder s (Annotator (AlonzoTx l era))
forall a b. (a -> b) -> a -> b
$
          Decode
  (Closed Dense)
  (TxBody TopTx era
   -> TxWits era
   -> IsValid
   -> StrictMaybe (TxAuxData era)
   -> AlonzoTx l era)
-> Decode
     (Closed Dense)
     (Annotator
        (TxBody TopTx era
         -> TxWits era
         -> IsValid
         -> StrictMaybe (TxAuxData era)
         -> AlonzoTx l era))
forall t1 (w :: Wrapped).
Typeable t1 =>
Decode w t1 -> Decode w (Annotator t1)
Ann ((TxBody TopTx era
 -> TxWits era
 -> IsValid
 -> StrictMaybe (TxAuxData era)
 -> AlonzoTx l era)
-> Decode
     (Closed Dense)
     (TxBody TopTx era
      -> TxWits era
      -> IsValid
      -> StrictMaybe (TxAuxData era)
      -> AlonzoTx l era)
forall t. t -> Decode (Closed Dense) t
RecD TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx l era
TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx)
            Decode
  (Closed Dense)
  (Annotator
     (TxBody TopTx era
      -> TxWits era
      -> IsValid
      -> StrictMaybe (TxAuxData era)
      -> AlonzoTx l era))
-> Decode (Closed (ZonkAny 2)) (Annotator (TxBody TopTx era))
-> Decode
     (Closed Dense)
     (Annotator
        (TxWits era
         -> IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx l era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode (Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! Decode (Closed (ZonkAny 2)) (Annotator (TxBody TopTx era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
            Decode
  (Closed Dense)
  (Annotator
     (TxWits era
      -> IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx l era))
-> Decode (Closed (ZonkAny 1)) (Annotator (TxWits era))
-> Decode
     (Closed Dense)
     (Annotator
        (IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx l era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode (Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! Decode (Closed (ZonkAny 1)) (Annotator (TxWits era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
            Decode
  (Closed Dense)
  (Annotator
     (IsValid -> StrictMaybe (TxAuxData era) -> AlonzoTx l era))
-> Decode (Closed (ZonkAny 0)) (Annotator IsValid)
-> Decode
     (Closed Dense)
     (Annotator (StrictMaybe (TxAuxData era) -> AlonzoTx l era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode (Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! Decode (Closed (ZonkAny 0)) IsValid
-> Decode (Closed (ZonkAny 0)) (Annotator IsValid)
forall t1 (w :: Wrapped).
Typeable t1 =>
Decode w t1 -> Decode w (Annotator t1)
Ann Decode (Closed (ZonkAny 0)) IsValid
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
            Decode
  (Closed Dense)
  (Annotator (StrictMaybe (TxAuxData era) -> AlonzoTx l era))
-> Decode (Closed Dense) (Annotator (StrictMaybe (TxAuxData era)))
-> Decode (Closed Dense) (Annotator (AlonzoTx l era))
forall a t (w1 :: Wrapped) (d :: Density).
(Typeable a, Typeable t) =>
Decode w1 (Annotator (a -> t))
-> Decode (Closed d) (Annotator a) -> Decode w1 (Annotator t)
<*! (forall s. Decoder s (Annotator (StrictMaybe (TxAuxData era))))
-> Decode (Closed Dense) (Annotator (StrictMaybe (TxAuxData era)))
forall t. (forall s. Decoder s t) -> Decode (Closed Dense) t
D (StrictMaybe (Annotator (TxAuxData era))
-> Annotator (StrictMaybe (TxAuxData era))
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a.
Monad m =>
StrictMaybe (m a) -> m (StrictMaybe a)
sequence (StrictMaybe (Annotator (TxAuxData era))
 -> Annotator (StrictMaybe (TxAuxData era)))
-> Decoder s (StrictMaybe (Annotator (TxAuxData era)))
-> Decoder s (Annotator (StrictMaybe (TxAuxData era)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (Annotator (TxAuxData era))
-> Decoder s (StrictMaybe (Annotator (TxAuxData era)))
forall s a. Decoder s a -> Decoder s (StrictMaybe a)
decodeNullStrictMaybe Decoder s (Annotator (TxAuxData era))
forall s. Decoder s (Annotator (TxAuxData era))
forall a s. DecCBOR a => Decoder s a
decCBOR)
  {-# INLINE decCBOR #-}