{-# 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 OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# LANGUAGE ViewPatterns #-}
{-# 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 (
  -- ** State Annotated
  AlonzoStAnnTx (..),
  -- Figure 1
  CostModel,
  getLanguageView,
  -- Figure 2
  Data,
  DataHash,
  IsPhase2Valid (..),
  hashData,
  nonNativeLanguages,
  hashScriptIntegrity,
  EraIndependentScriptIntegrity,
  ScriptIntegrity (ScriptIntegrity),
  ScriptIntegrityHash,
  -- Figure 3
  AlonzoTx (AlonzoTx, atBody, atWits, atIsPhase2Valid, atAuxData),
  Tx (..),
  AlonzoEraTx (..),
  mkBasicAlonzoTx,
  bodyAlonzoTxL,
  witsAlonzoTxL,
  auxDataAlonzoTxL,
  sizeAlonzoTxF,
  isPhase2ValidAlonzoTxL,
  txrdmrs,
  TxBody (AlonzoTxBody),
  -- Figure 4
  totExUnits,
  alonzoMinFeeTx,
  --  Figure 5
  Shelley.txouts,
  -- Other
  toCBORForSizeComputation,
  toCBORForMempoolSubmission,
  alonzoTxEqRaw,
  mkScriptIntegrity,

  -- * Deprecated
  IsValid,
  pattern IsValid,
  isValidAlonzoTxL,
  atIsValid,
) 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.Plutus.Context (CollectError, ContextError, SupportedPlutusRunnable)
import Cardano.Ledger.Alonzo.Scripts (
  AlonzoEraScript (..),
  CostModel,
  ExUnits (..),
  txscriptfee,
 )
import Cardano.Ledger.Alonzo.TxAuxData (AlonzoEraTxAuxData)
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 (..),
  TokenType (..),
  decodeNullStrictMaybe,
  encodeListLen,
  encodeNullStrictMaybe,
  peekTokenType,
  serialize,
  serialize',
 )
import Cardano.Ledger.Binary.Coders
import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Compactible (Compactible (fromCompact))
import Cardano.Ledger.Core
import Cardano.Ledger.Mary (Tx (..))
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Plutus (Data, Language, PlutusWithContext, hashData, nonNativeLanguages)
import Cardano.Ledger.Shelley.Tx (shelleyTxEqRaw)
import Cardano.Ledger.State (ScriptsNeeded, 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 (FromJSON (..), ToJSON (..))
import qualified Data.ByteString.Lazy as LBS
import Data.Int (Int64)
import Data.List.NonEmpty (NonEmpty)
import qualified Data.Map.Strict as Map
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 the non-native (phase-2) scripts in this transaction
-- are expected to validate. This is added by the block creator when constructing
-- the block.
data IsPhase2Valid
  = Phase2Invalid
  | Phase2Valid
  deriving stock (IsPhase2Valid -> IsPhase2Valid -> Bool
(IsPhase2Valid -> IsPhase2Valid -> Bool)
-> (IsPhase2Valid -> IsPhase2Valid -> Bool) -> Eq IsPhase2Valid
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IsPhase2Valid -> IsPhase2Valid -> Bool
== :: IsPhase2Valid -> IsPhase2Valid -> Bool
$c/= :: IsPhase2Valid -> IsPhase2Valid -> Bool
/= :: IsPhase2Valid -> IsPhase2Valid -> Bool
Eq, Int -> IsPhase2Valid -> ShowS
[IsPhase2Valid] -> ShowS
IsPhase2Valid -> String
(Int -> IsPhase2Valid -> ShowS)
-> (IsPhase2Valid -> String)
-> ([IsPhase2Valid] -> ShowS)
-> Show IsPhase2Valid
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IsPhase2Valid -> ShowS
showsPrec :: Int -> IsPhase2Valid -> ShowS
$cshow :: IsPhase2Valid -> String
show :: IsPhase2Valid -> String
$cshowList :: [IsPhase2Valid] -> ShowS
showList :: [IsPhase2Valid] -> ShowS
Show, (forall x. IsPhase2Valid -> Rep IsPhase2Valid x)
-> (forall x. Rep IsPhase2Valid x -> IsPhase2Valid)
-> Generic IsPhase2Valid
forall x. Rep IsPhase2Valid x -> IsPhase2Valid
forall x. IsPhase2Valid -> Rep IsPhase2Valid x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. IsPhase2Valid -> Rep IsPhase2Valid x
from :: forall x. IsPhase2Valid -> Rep IsPhase2Valid x
$cto :: forall x. Rep IsPhase2Valid x -> IsPhase2Valid
to :: forall x. Rep IsPhase2Valid x -> IsPhase2Valid
Generic)
  deriving anyclass (Context -> IsPhase2Valid -> IO (Maybe ThunkInfo)
Proxy IsPhase2Valid -> String
(Context -> IsPhase2Valid -> IO (Maybe ThunkInfo))
-> (Context -> IsPhase2Valid -> IO (Maybe ThunkInfo))
-> (Proxy IsPhase2Valid -> String)
-> NoThunks IsPhase2Valid
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> IsPhase2Valid -> IO (Maybe ThunkInfo)
noThunks :: Context -> IsPhase2Valid -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> IsPhase2Valid -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> IsPhase2Valid -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy IsPhase2Valid -> String
showTypeOf :: Proxy IsPhase2Valid -> String
NoThunks, IsPhase2Valid -> ()
(IsPhase2Valid -> ()) -> NFData IsPhase2Valid
forall a. (a -> ()) -> NFData a
$crnf :: IsPhase2Valid -> ()
rnf :: IsPhase2Valid -> ()
NFData)

instance Semigroup IsPhase2Valid where
  IsPhase2Valid
Phase2Valid <> :: IsPhase2Valid -> IsPhase2Valid -> IsPhase2Valid
<> IsPhase2Valid
x = IsPhase2Valid
x
  IsPhase2Valid
Phase2Invalid <> IsPhase2Valid
_ = IsPhase2Valid
Phase2Invalid

instance Monoid IsPhase2Valid where
  mempty :: IsPhase2Valid
mempty = IsPhase2Valid
Phase2Valid

isPhase2Valid :: IsPhase2Valid -> Bool
isPhase2Valid :: IsPhase2Valid -> Bool
isPhase2Valid = \case
  IsPhase2Valid
Phase2Invalid -> Bool
False
  IsPhase2Valid
Phase2Valid -> Bool
True

toIsPhase2Valid :: Bool -> IsPhase2Valid
toIsPhase2Valid :: Bool -> IsPhase2Valid
toIsPhase2Valid Bool
b = if Bool
b then IsPhase2Valid
Phase2Valid else IsPhase2Valid
Phase2Invalid

instance EncCBOR IsPhase2Valid where
  encCBOR :: IsPhase2Valid -> Encoding
encCBOR = Bool -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR (Bool -> Encoding)
-> (IsPhase2Valid -> Bool) -> IsPhase2Valid -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsPhase2Valid -> Bool
isPhase2Valid

instance DecCBOR IsPhase2Valid where
  decCBOR :: forall s. Decoder s IsPhase2Valid
decCBOR = Bool -> IsPhase2Valid
toIsPhase2Valid (Bool -> IsPhase2Valid)
-> Decoder s Bool -> Decoder s IsPhase2Valid
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Bool
forall s. Decoder s Bool
forall a s. DecCBOR a => Decoder s a
decCBOR

instance ToCBOR IsPhase2Valid where
  toCBOR :: IsPhase2Valid -> Encoding
toCBOR = Bool -> Encoding
forall a. ToCBOR a => a -> Encoding
toCBOR (Bool -> Encoding)
-> (IsPhase2Valid -> Bool) -> IsPhase2Valid -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsPhase2Valid -> Bool
isPhase2Valid

instance ToJSON IsPhase2Valid where
  toJSON :: IsPhase2Valid -> Value
toJSON = Bool -> Value
forall a. ToJSON a => a -> Value
toJSON (Bool -> Value)
-> (IsPhase2Valid -> Bool) -> IsPhase2Valid -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsPhase2Valid -> Bool
isPhase2Valid
  toEncoding :: IsPhase2Valid -> Encoding
toEncoding = Bool -> Encoding
forall a. ToJSON a => a -> Encoding
toEncoding (Bool -> Encoding)
-> (IsPhase2Valid -> Bool) -> IsPhase2Valid -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IsPhase2Valid -> Bool
isPhase2Valid

instance FromJSON IsPhase2Valid where
  parseJSON :: Value -> Parser IsPhase2Valid
parseJSON = (Bool -> IsPhase2Valid) -> Parser Bool -> Parser IsPhase2Valid
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool -> IsPhase2Valid
toIsPhase2Valid (Parser Bool -> Parser IsPhase2Valid)
-> (Value -> Parser Bool) -> Value -> Parser IsPhase2Valid
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser Bool
forall a. FromJSON a => Value -> Parser a
parseJSON

type IsValid = IsPhase2Valid

pattern IsValid :: Bool -> IsPhase2Valid
pattern $mIsValid :: forall {r}. IsPhase2Valid -> (Bool -> r) -> ((# #) -> r) -> r
$bIsValid :: Bool -> IsPhase2Valid
IsValid b <- (isPhase2Valid -> b)
  where
    IsValid = Bool -> IsPhase2Valid
toIsPhase2Valid

{-# COMPLETE IsValid #-}

{-# DEPRECATED IsValid "In favor of `IsPhase2Valid`" #-}

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 -> IsPhase2Valid
atIsPhase2Valid :: !IsPhase2Valid
    , 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)

  type StAnnTx l AlonzoEra = AlonzoStAnnTx l AlonzoEra

  type StAnnTxCache AlonzoEra = Map.Map ScriptHash (SupportedPlutusRunnable AlonzoEra)

  txStAnnTxG :: forall (l :: TxLevel).
SimpleGetter (StAnnTx l AlonzoEra) (Tx l AlonzoEra)
txStAnnTxG = (StAnnTx l AlonzoEra -> Tx l AlonzoEra)
-> SimpleGetter (StAnnTx l AlonzoEra) (Tx l AlonzoEra)
forall s a. (s -> a) -> SimpleGetter s a
to ((StAnnTx l AlonzoEra -> Tx l AlonzoEra)
 -> SimpleGetter (StAnnTx l AlonzoEra) (Tx l AlonzoEra))
-> (StAnnTx l AlonzoEra -> Tx l AlonzoEra)
-> SimpleGetter (StAnnTx l AlonzoEra) (Tx l AlonzoEra)
forall a b. (a -> b) -> a -> b
$ \AlonzoStAnnTx {Tx TopTx AlonzoEra
asatTx :: Tx TopTx AlonzoEra
asatTx :: forall era. AlonzoStAnnTx TopTx era -> Tx TopTx era
asatTx} -> Tx l AlonzoEra
Tx TopTx AlonzoEra
asatTx

  cacheStAnnTxG :: forall (l :: TxLevel).
SimpleGetter (StAnnTx l AlonzoEra) (StAnnTxCache AlonzoEra)
cacheStAnnTxG = (StAnnTx l AlonzoEra -> StAnnTxCache AlonzoEra)
-> SimpleGetter (StAnnTx l AlonzoEra) (StAnnTxCache AlonzoEra)
forall s a. (s -> a) -> SimpleGetter s a
to ((StAnnTx l AlonzoEra -> StAnnTxCache AlonzoEra)
 -> SimpleGetter (StAnnTx l AlonzoEra) (StAnnTxCache AlonzoEra))
-> (StAnnTx l AlonzoEra -> StAnnTxCache AlonzoEra)
-> SimpleGetter (StAnnTx l AlonzoEra) (StAnnTxCache AlonzoEra)
forall a b. (a -> b) -> a -> b
$ \AlonzoStAnnTx {Map ScriptHash (SupportedPlutusRunnable AlonzoEra)
asatPlutusRunnableCache :: Map ScriptHash (SupportedPlutusRunnable AlonzoEra)
asatPlutusRunnableCache :: forall era.
AlonzoStAnnTx TopTx era
-> Map ScriptHash (SupportedPlutusRunnable era)
asatPlutusRunnableCache} -> Map ScriptHash (SupportedPlutusRunnable AlonzoEra)
StAnnTxCache AlonzoEra
asatPlutusRunnableCache

  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 (l :: TxLevel) era (t :: 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 (l :: TxLevel) era (t :: 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 IsPhase2Valid (Tx TopTx era) IsPhase2Valid
-> IsPhase2Valid
forall s a. s -> Getting a s a -> a
^. Getting IsPhase2Valid (Tx TopTx era) IsPhase2Valid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsPhase2Valid
Lens' (Tx TopTx era) IsPhase2Valid
isPhase2ValidTxL IsPhase2Valid -> IsPhase2Valid -> Bool
forall a. Eq a => a -> a -> Bool
== Tx TopTx era
tx2' Tx TopTx era
-> Getting IsPhase2Valid (Tx TopTx era) IsPhase2Valid
-> IsPhase2Valid
forall s a. s -> Getting a s a -> a
^. Getting IsPhase2Valid (Tx TopTx era) IsPhase2Valid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsPhase2Valid
Lens' (Tx TopTx era) IsPhase2Valid
isPhase2ValidTxL)

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
  , AlonzoEraTxAuxData era
  ) =>
  AlonzoEraTx era
  where
  isPhase2ValidTxL :: Lens' (Tx TopTx era) IsPhase2Valid

  isValidTxL :: Lens' (Tx TopTx era) IsPhase2Valid
  isValidTxL = (IsPhase2Valid -> f IsPhase2Valid)
-> Tx TopTx era -> f (Tx TopTx era)
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsPhase2Valid
Lens' (Tx TopTx era) IsPhase2Valid
isPhase2ValidTxL

{-# DEPRECATED isValidTxL "In favor of `isPhase2ValidTxL`" #-}

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
  isPhase2ValidTxL :: Lens' (Tx TopTx AlonzoEra) IsPhase2Valid
isPhase2ValidTxL = (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))
-> ((IsPhase2Valid -> f IsPhase2Valid)
    -> AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra))
-> (IsPhase2Valid -> f IsPhase2Valid)
-> Tx TopTx AlonzoEra
-> f (Tx TopTx AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IsPhase2Valid -> f IsPhase2Valid)
-> AlonzoTx TopTx AlonzoEra -> f (AlonzoTx TopTx AlonzoEra)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsPhase2Valid -> f IsPhase2Valid)
-> AlonzoTx l era -> f (AlonzoTx l era)
isPhase2ValidAlonzoTxL
  {-# INLINE isPhase2ValidTxL #-}

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
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx TxBody l era
TxBody TopTx era
txBody TxWits era
forall a. Monoid a => a
mempty IsPhase2Valid
Phase2Valid 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 #-}

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

isValidAlonzoTxL :: Lens' (AlonzoTx l era) IsPhase2Valid
isValidAlonzoTxL :: forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsPhase2Valid -> f IsPhase2Valid)
-> AlonzoTx l era -> f (AlonzoTx l era)
isValidAlonzoTxL = (IsPhase2Valid -> f IsPhase2Valid)
-> AlonzoTx l era -> f (AlonzoTx l era)
forall (l :: TxLevel) era (f :: * -> *).
Functor f =>
(IsPhase2Valid -> f IsPhase2Valid)
-> AlonzoTx l era -> f (AlonzoTx l era)
isPhase2ValidAlonzoTxL
{-# DEPRECATED isValidAlonzoTxL "In favor of `isPhase2ValidAlonzoTxL`" #-}

atIsValid :: AlonzoTx TopTx era -> IsPhase2Valid
atIsValid :: forall era. AlonzoTx TopTx era -> IsPhase2Valid
atIsValid = AlonzoTx TopTx era -> IsPhase2Valid
forall era. AlonzoTx TopTx era -> IsPhase2Valid
atIsPhase2Valid
{-# DEPRECATED atIsValid "In favor of `atIsPhase2Valid`" #-}

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
IsPhase2Valid
atBody :: forall era. AlonzoTx TopTx era -> TxBody TopTx era
atWits :: forall era. AlonzoTx TopTx era -> TxWits era
atIsPhase2Valid :: forall era. AlonzoTx TopTx era -> IsPhase2Valid
atAuxData :: forall era. AlonzoTx TopTx era -> StrictMaybe (TxAuxData era)
atBody :: TxBody TopTx era
atWits :: TxWits era
atIsPhase2Valid :: IsPhase2Valid
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`
          IsPhase2Valid -> ()
forall a. NFData a => a -> ()
rnf IsPhase2Valid
atIsPhase2Valid

-- | 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 ::
  ( EraTx era
  , AlonzoEraPParams era
  , AlonzoEraTxWits era
  ) =>
  PParams era ->
  Tx l era ->
  Set Language ->
  StrictMaybe (ScriptIntegrity era)
mkScriptIntegrity :: forall era (l :: TxLevel).
(EraTx era, AlonzoEraPParams era, AlonzoEraTxWits era) =>
PParams era
-> Tx l era -> Set Language -> StrictMaybe (ScriptIntegrity era)
mkScriptIntegrity PParams era
pp Tx l era
tx Set Language
langs
  | 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
    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
<×> (CompactForm Coin -> Coin
forall a. Compactible a => CompactForm a -> a
fromCompact (CompactForm Coin -> Coin)
-> (CoinPerByte -> CompactForm Coin) -> CoinPerByte -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CoinPerByte -> CompactForm Coin
unCoinPerByte) (PParams era
pp PParams era
-> Getting CoinPerByte (PParams era) CoinPerByte -> CoinPerByte
forall s a. s -> Getting a s a -> a
^. Getting CoinPerByte (PParams era) CoinPerByte
forall era. EraPParams era => Lens' (PParams era) CoinPerByte
Lens' (PParams era) CoinPerByte
ppTxFeePerByteL))
    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
ppTxFeeFixedL)
    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, IsPhase2Valid
atIsPhase2Valid :: forall era. AlonzoTx TopTx era -> IsPhase2Valid
atIsPhase2Valid :: IsPhase2Valid
atIsPhase2Valid} =
    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
 -> IsPhase2Valid
 -> StrictMaybe (TxAuxData era)
 -> AlonzoTx TopTx era)
-> Encode
     (Closed Dense)
     (TxBody TopTx era
      -> TxWits era
      -> IsPhase2Valid
      -> StrictMaybe (TxAuxData era)
      -> AlonzoTx TopTx era)
forall t. t -> Encode (Closed Dense) t
Rec TxBody TopTx era
-> TxWits era
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx
        Encode
  (Closed Dense)
  (TxBody TopTx era
   -> TxWits era
   -> IsPhase2Valid
   -> StrictMaybe (TxAuxData era)
   -> AlonzoTx TopTx era)
-> Encode (Closed Dense) (TxBody TopTx era)
-> Encode
     (Closed Dense)
     (TxWits era
      -> IsPhase2Valid
      -> 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
   -> IsPhase2Valid
   -> StrictMaybe (TxAuxData era)
   -> AlonzoTx TopTx era)
-> Encode (Closed Dense) (TxWits era)
-> Encode
     (Closed Dense)
     (IsPhase2Valid
      -> 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)
  (IsPhase2Valid
   -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Encode (Closed Dense) IsPhase2Valid
-> 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
!> IsPhase2Valid -> Encode (Closed Dense) IsPhase2Valid
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To IsPhase2Valid
atIsPhase2Valid
        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 ->
        ((Int, Annotator (AlonzoTx l era)) -> Annotator (AlonzoTx l era))
-> Decoder s (Int, Annotator (AlonzoTx l era))
-> Decoder s (Annotator (AlonzoTx l era))
forall a b. (a -> b) -> Decoder s a -> Decoder s b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int, Annotator (AlonzoTx l era)) -> Annotator (AlonzoTx l era)
forall a b. (a, b) -> b
snd (Decoder s (Int, Annotator (AlonzoTx l era))
 -> Decoder s (Annotator (AlonzoTx l era)))
-> Decoder s (Int, Annotator (AlonzoTx l era))
-> Decoder s (Annotator (AlonzoTx l era))
forall a b. (a -> b) -> a -> b
$ Text
-> ((Int, Annotator (AlonzoTx l era)) -> Int)
-> Decoder s (Int, Annotator (AlonzoTx l era))
-> Decoder s (Int, Annotator (AlonzoTx l era))
forall a s. Text -> (a -> Int) -> Decoder s a -> Decoder s a
decodeRecordNamed Text
"AlonzoTx" (Int, Annotator (AlonzoTx l era)) -> Int
forall a b. (a, b) -> a
fst (Decoder s (Int, Annotator (AlonzoTx l era))
 -> Decoder s (Int, Annotator (AlonzoTx l era)))
-> Decoder s (Int, Annotator (AlonzoTx l era))
-> Decoder s (Int, Annotator (AlonzoTx l era))
forall a b. (a -> b) -> a -> b
$ do
          body <- Decoder s (Annotator (TxBody TopTx era))
forall s. Decoder s (Annotator (TxBody TopTx era))
forall a s. DecCBOR a => Decoder s a
decCBOR
          wits <- decCBOR
          (isValidFlagSupplied, isValid) <-
            peekTokenType >>= \case
              TokenType
TypeBool -> do
                isValid <- Decoder s IsPhase2Valid
forall s. Decoder s IsPhase2Valid
forall a s. DecCBOR a => Decoder s a
decCBOR
                pure (True, isValid)
              TokenType
_ -> (Bool, IsPhase2Valid) -> Decoder s (Bool, IsPhase2Valid)
forall a. a -> Decoder s a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool
False, Bool -> IsPhase2Valid
IsValid Bool
True)
          auxData <- decodeNullStrictMaybe decCBOR
          let
            tx = TxBody TopTx era
-> TxWits era
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
forall era.
TxBody TopTx era
-> TxWits era
-> IsPhase2Valid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx TopTx era
AlonzoTx (TxBody TopTx era
 -> TxWits era
 -> IsPhase2Valid
 -> StrictMaybe (TxAuxData era)
 -> AlonzoTx TopTx era)
-> Annotator (TxBody TopTx era)
-> Annotator
     (TxWits era
      -> IsPhase2Valid
      -> StrictMaybe (TxAuxData era)
      -> AlonzoTx TopTx era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Annotator (TxBody TopTx era)
body Annotator
  (TxWits era
   -> IsPhase2Valid
   -> StrictMaybe (TxAuxData era)
   -> AlonzoTx TopTx era)
-> Annotator (TxWits era)
-> Annotator
     (IsPhase2Valid
      -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
forall a b. Annotator (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Annotator (TxWits era)
wits Annotator
  (IsPhase2Valid
   -> StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Annotator IsPhase2Valid
-> Annotator (StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
forall a b. Annotator (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IsPhase2Valid -> Annotator IsPhase2Valid
forall a. a -> Annotator a
forall (f :: * -> *) a. Applicative f => a -> f a
pure IsPhase2Valid
isValid Annotator (StrictMaybe (TxAuxData era) -> AlonzoTx TopTx era)
-> Annotator (StrictMaybe (TxAuxData era))
-> Annotator (AlonzoTx TopTx era)
forall a b. Annotator (a -> b) -> Annotator a -> Annotator b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> 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))
auxData
          pure (if isValidFlagSupplied then 4 else 3, tx)
  {-# INLINE decCBOR #-}

data AlonzoStAnnTx l era where
  AlonzoStAnnTx ::
    { forall era. AlonzoStAnnTx TopTx era -> Tx TopTx era
asatTx :: !(Tx TopTx era)
    , forall era. AlonzoStAnnTx TopTx era -> ScriptsNeeded era
asatScriptsNeeded :: ScriptsNeeded era
    , forall era. AlonzoStAnnTx TopTx era -> ScriptsProvided era
asatScriptsProvided :: ScriptsProvided era
    , forall era. AlonzoStAnnTx TopTx era -> Set Language
asatPlutusLanguagesUsed :: Set Language
    , forall era.
AlonzoStAnnTx TopTx era
-> Map ScriptHash (SupportedPlutusRunnable era)
asatPlutusRunnableCache :: Map.Map ScriptHash (SupportedPlutusRunnable era)
    , forall era.
AlonzoStAnnTx TopTx era
-> Either (NonEmpty (CollectError era)) [PlutusWithContext]
asatPlutusScriptsWithContext :: Either (NonEmpty (CollectError era)) [PlutusWithContext]
    } ->
    AlonzoStAnnTx TopTx era

deriving instance
  ( AlonzoEraScript era
  , Eq (Tx l era)
  , Eq (ScriptsNeeded era)
  , Eq (ScriptsProvided era)
  , Eq (ContextError era)
  ) =>
  Eq (AlonzoStAnnTx l era)

deriving instance
  ( AlonzoEraScript era
  , Show (Tx l era)
  , Show (ScriptsNeeded era)
  , Show (ScriptsProvided era)
  , Show (ContextError era)
  ) =>
  Show (AlonzoStAnnTx l era)

instance
  (EraTxLevel era, STxLevel TopTx era ~ STxTopLevel TopTx era) =>
  HasEraTxLevel AlonzoStAnnTx era
  where
  toSTxLevel :: forall (l :: TxLevel). AlonzoStAnnTx l era -> STxLevel l era
toSTxLevel (AlonzoStAnnTx {}) = forall era. STxTopLevel TopTx era
STopTxOnly @era

instance
  ( AlonzoEraScript era
  , NFData (Tx l era)
  , NFData (ScriptsNeeded era)
  , NFData (ScriptsProvided era)
  , NFData (ContextError era)
  ) =>
  NFData (AlonzoStAnnTx l era)
  where
  rnf :: AlonzoStAnnTx l era -> ()
rnf stAnnTx :: AlonzoStAnnTx l era
stAnnTx@(AlonzoStAnnTx Tx TopTx era
_ ScriptsNeeded era
_ ScriptsProvided era
_ Set Language
_ Map ScriptHash (SupportedPlutusRunnable era)
_ Either (NonEmpty (CollectError era)) [PlutusWithContext]
_) =
    let AlonzoStAnnTx {Either (NonEmpty (CollectError era)) [PlutusWithContext]
Map ScriptHash (SupportedPlutusRunnable era)
Set Language
Tx TopTx era
ScriptsNeeded era
ScriptsProvided era
asatTx :: forall era. AlonzoStAnnTx TopTx era -> Tx TopTx era
asatPlutusRunnableCache :: forall era.
AlonzoStAnnTx TopTx era
-> Map ScriptHash (SupportedPlutusRunnable era)
asatScriptsNeeded :: forall era. AlonzoStAnnTx TopTx era -> ScriptsNeeded era
asatScriptsProvided :: forall era. AlonzoStAnnTx TopTx era -> ScriptsProvided era
asatPlutusLanguagesUsed :: forall era. AlonzoStAnnTx TopTx era -> Set Language
asatPlutusScriptsWithContext :: forall era.
AlonzoStAnnTx TopTx era
-> Either (NonEmpty (CollectError era)) [PlutusWithContext]
asatTx :: Tx TopTx era
asatScriptsNeeded :: ScriptsNeeded era
asatScriptsProvided :: ScriptsProvided era
asatPlutusLanguagesUsed :: Set Language
asatPlutusRunnableCache :: Map ScriptHash (SupportedPlutusRunnable era)
asatPlutusScriptsWithContext :: Either (NonEmpty (CollectError era)) [PlutusWithContext]
..} = AlonzoStAnnTx l era
stAnnTx
     in Tx TopTx era
asatTx Tx TopTx era -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
          ScriptsNeeded era
asatScriptsNeeded ScriptsNeeded era -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
            ScriptsProvided era
asatScriptsProvided ScriptsProvided era -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
              Map ScriptHash (SupportedPlutusRunnable era)
asatPlutusRunnableCache Map ScriptHash (SupportedPlutusRunnable era) -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
                Set Language
asatPlutusLanguagesUsed Set Language -> () -> ()
forall a b. NFData a => a -> b -> b
`deepseq`
                  Either (NonEmpty (CollectError era)) [PlutusWithContext] -> ()
forall a. NFData a => a -> ()
rnf Either (NonEmpty (CollectError era)) [PlutusWithContext]
asatPlutusScriptsWithContext