{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Babbage.Tx (
  AlonzoTx (..),
  TxBody (..),
  Tx (..),
  module X,
) where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Tx as X
import Cardano.Ledger.Babbage.Era (BabbageEra)
import Cardano.Ledger.Babbage.TxAuxData ()
import Cardano.Ledger.Babbage.TxBody (
  TxBody (..),
 )
import Cardano.Ledger.Babbage.TxWits ()
import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR, ToCBOR)
import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Control.DeepSeq (NFData)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Lens.Micro (Lens', lens)
import NoThunks.Class (NoThunks)

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

instance EraTx BabbageEra where
  newtype Tx l BabbageEra = MkBabbageTx {forall (l :: TxLevel). Tx l BabbageEra -> AlonzoTx l BabbageEra
unBabbageTx :: AlonzoTx l BabbageEra}
    deriving newtype (Tx l BabbageEra -> Tx l BabbageEra -> Bool
(Tx l BabbageEra -> Tx l BabbageEra -> Bool)
-> (Tx l BabbageEra -> Tx l BabbageEra -> Bool)
-> Eq (Tx l BabbageEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (l :: TxLevel). Tx l BabbageEra -> Tx l BabbageEra -> Bool
$c== :: forall (l :: TxLevel). Tx l BabbageEra -> Tx l BabbageEra -> Bool
== :: Tx l BabbageEra -> Tx l BabbageEra -> Bool
$c/= :: forall (l :: TxLevel). Tx l BabbageEra -> Tx l BabbageEra -> Bool
/= :: Tx l BabbageEra -> Tx l BabbageEra -> Bool
Eq, Tx l BabbageEra -> ()
(Tx l BabbageEra -> ()) -> NFData (Tx l BabbageEra)
forall a. (a -> ()) -> NFData a
forall (l :: TxLevel). Tx l BabbageEra -> ()
$crnf :: forall (l :: TxLevel). Tx l BabbageEra -> ()
rnf :: Tx l BabbageEra -> ()
NFData, Int -> Tx l BabbageEra -> ShowS
[Tx l BabbageEra] -> ShowS
Tx l BabbageEra -> String
(Int -> Tx l BabbageEra -> ShowS)
-> (Tx l BabbageEra -> String)
-> ([Tx l BabbageEra] -> ShowS)
-> Show (Tx l BabbageEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (l :: TxLevel). Int -> Tx l BabbageEra -> ShowS
forall (l :: TxLevel). [Tx l BabbageEra] -> ShowS
forall (l :: TxLevel). Tx l BabbageEra -> String
$cshowsPrec :: forall (l :: TxLevel). Int -> Tx l BabbageEra -> ShowS
showsPrec :: Int -> Tx l BabbageEra -> ShowS
$cshow :: forall (l :: TxLevel). Tx l BabbageEra -> String
show :: Tx l BabbageEra -> String
$cshowList :: forall (l :: TxLevel). [Tx l BabbageEra] -> ShowS
showList :: [Tx l BabbageEra] -> ShowS
Show, Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo)
Proxy (Tx l BabbageEra) -> String
(Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo))
-> (Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo))
-> (Proxy (Tx l BabbageEra) -> String)
-> NoThunks (Tx l BabbageEra)
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 BabbageEra -> IO (Maybe ThunkInfo)
forall (l :: TxLevel).
Typeable l =>
Proxy (Tx l BabbageEra) -> String
$cnoThunks :: forall (l :: TxLevel).
Typeable l =>
Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall (l :: TxLevel).
Typeable l =>
Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> Tx l BabbageEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: forall (l :: TxLevel).
Typeable l =>
Proxy (Tx l BabbageEra) -> String
showTypeOf :: Proxy (Tx l BabbageEra) -> String
NoThunks, Typeable (Tx l BabbageEra)
Typeable (Tx l BabbageEra) =>
(Tx l BabbageEra -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (Tx l BabbageEra) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [Tx l BabbageEra] -> Size)
-> ToCBOR (Tx l BabbageEra)
Tx l BabbageEra -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l BabbageEra] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l BabbageEra) -> 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 BabbageEra)
forall (l :: TxLevel). Typeable l => Tx l BabbageEra -> Encoding
forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l BabbageEra] -> Size
forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l BabbageEra) -> Size
$ctoCBOR :: forall (l :: TxLevel). Typeable l => Tx l BabbageEra -> Encoding
toCBOR :: Tx l BabbageEra -> Encoding
$cencodedSizeExpr :: forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l BabbageEra) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx l BabbageEra) -> Size
$cencodedListSizeExpr :: forall (l :: TxLevel).
Typeable l =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l BabbageEra] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx l BabbageEra] -> Size
ToCBOR, Tx l BabbageEra -> Encoding
(Tx l BabbageEra -> Encoding) -> EncCBOR (Tx l BabbageEra)
forall a. (a -> Encoding) -> EncCBOR a
forall (l :: TxLevel). Tx l BabbageEra -> Encoding
$cencCBOR :: forall (l :: TxLevel). Tx l BabbageEra -> Encoding
encCBOR :: Tx l BabbageEra -> Encoding
EncCBOR)
    deriving ((forall x. Tx l BabbageEra -> Rep (Tx l BabbageEra) x)
-> (forall x. Rep (Tx l BabbageEra) x -> Tx l BabbageEra)
-> Generic (Tx l BabbageEra)
forall x. Rep (Tx l BabbageEra) x -> Tx l BabbageEra
forall x. Tx l BabbageEra -> Rep (Tx l BabbageEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (l :: TxLevel) x. Rep (Tx l BabbageEra) x -> Tx l BabbageEra
forall (l :: TxLevel) x. Tx l BabbageEra -> Rep (Tx l BabbageEra) x
$cfrom :: forall (l :: TxLevel) x. Tx l BabbageEra -> Rep (Tx l BabbageEra) x
from :: forall x. Tx l BabbageEra -> Rep (Tx l BabbageEra) x
$cto :: forall (l :: TxLevel) x. Rep (Tx l BabbageEra) x -> Tx l BabbageEra
to :: forall x. Rep (Tx l BabbageEra) x -> Tx l BabbageEra
Generic)
  mkBasicTx :: forall (l :: TxLevel). TxBody l BabbageEra -> Tx l BabbageEra
mkBasicTx = AlonzoTx l BabbageEra -> Tx l BabbageEra
forall (l :: TxLevel). AlonzoTx l BabbageEra -> Tx l BabbageEra
MkBabbageTx (AlonzoTx l BabbageEra -> Tx l BabbageEra)
-> (TxBody l BabbageEra -> AlonzoTx l BabbageEra)
-> TxBody l BabbageEra
-> Tx l BabbageEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody l BabbageEra -> AlonzoTx l BabbageEra
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 BabbageEra) (TxBody l BabbageEra)
bodyTxL = (AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
babbageTxL ((AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
 -> Tx l BabbageEra -> f (Tx l BabbageEra))
-> ((TxBody l BabbageEra -> f (TxBody l BabbageEra))
    -> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> (TxBody l BabbageEra -> f (TxBody l BabbageEra))
-> Tx l BabbageEra
-> f (Tx l BabbageEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody l BabbageEra -> f (TxBody l BabbageEra))
-> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra)
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 BabbageEra) (TxWits BabbageEra)
witsTxL = (AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
babbageTxL ((AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
 -> Tx l BabbageEra -> f (Tx l BabbageEra))
-> ((AlonzoTxWits BabbageEra -> f (AlonzoTxWits BabbageEra))
    -> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> (AlonzoTxWits BabbageEra -> f (AlonzoTxWits BabbageEra))
-> Tx l BabbageEra
-> f (Tx l BabbageEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits BabbageEra -> f (TxWits BabbageEra))
-> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra)
(AlonzoTxWits BabbageEra -> f (AlonzoTxWits BabbageEra))
-> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra)
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 BabbageEra) (StrictMaybe (TxAuxData BabbageEra))
auxDataTxL = (AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
babbageTxL ((AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
 -> Tx l BabbageEra -> f (Tx l BabbageEra))
-> ((StrictMaybe (AlonzoTxAuxData BabbageEra)
     -> f (StrictMaybe (AlonzoTxAuxData BabbageEra)))
    -> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> (StrictMaybe (AlonzoTxAuxData BabbageEra)
    -> f (StrictMaybe (AlonzoTxAuxData BabbageEra)))
-> Tx l BabbageEra
-> f (Tx l BabbageEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (TxAuxData BabbageEra)
 -> f (StrictMaybe (TxAuxData BabbageEra)))
-> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra)
(StrictMaybe (AlonzoTxAuxData BabbageEra)
 -> f (StrictMaybe (AlonzoTxAuxData BabbageEra)))
-> AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra)
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 BabbageEra) Word32
sizeTxF = (AlonzoTx l BabbageEra -> Const r (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> Const r (Tx l BabbageEra)
forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
babbageTxL ((AlonzoTx l BabbageEra -> Const r (AlonzoTx l BabbageEra))
 -> Tx l BabbageEra -> Const r (Tx l BabbageEra))
-> ((Word32 -> Const r Word32)
    -> AlonzoTx l BabbageEra -> Const r (AlonzoTx l BabbageEra))
-> (Word32 -> Const r Word32)
-> Tx l BabbageEra
-> Const r (Tx l BabbageEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32 -> Const r Word32)
-> AlonzoTx l BabbageEra -> Const r (AlonzoTx l BabbageEra)
SimpleGetter (AlonzoTx l BabbageEra) Word32
forall era (l :: TxLevel).
(HasCallStack, EraTx era) =>
SimpleGetter (AlonzoTx l era) Word32
sizeAlonzoTxF
  {-# INLINE sizeTxF #-}

  validateNativeScript :: forall (l :: TxLevel).
Tx l BabbageEra -> NativeScript BabbageEra -> Bool
validateNativeScript = Tx l BabbageEra -> NativeScript BabbageEra -> 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 BabbageEra -> Tx l BabbageEra -> Int -> Coin
getMinFeeTx PParams BabbageEra
pp Tx l BabbageEra
tx Int
_ = PParams BabbageEra -> Tx l BabbageEra -> Coin
forall era (l :: TxLevel).
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx l era -> Coin
alonzoMinFeeTx PParams BabbageEra
pp Tx l BabbageEra
tx

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

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

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

babbageTxL :: Lens' (Tx l BabbageEra) (AlonzoTx l BabbageEra)
babbageTxL :: forall (l :: TxLevel) (f :: * -> *).
Functor f =>
(AlonzoTx l BabbageEra -> f (AlonzoTx l BabbageEra))
-> Tx l BabbageEra -> f (Tx l BabbageEra)
babbageTxL = (Tx l BabbageEra -> AlonzoTx l BabbageEra)
-> (Tx l BabbageEra -> AlonzoTx l BabbageEra -> Tx l BabbageEra)
-> Lens
     (Tx l BabbageEra)
     (Tx l BabbageEra)
     (AlonzoTx l BabbageEra)
     (AlonzoTx l BabbageEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx l BabbageEra -> AlonzoTx l BabbageEra
forall (l :: TxLevel). Tx l BabbageEra -> AlonzoTx l BabbageEra
unBabbageTx (\Tx l BabbageEra
x AlonzoTx l BabbageEra
y -> Tx l BabbageEra
x {unBabbageTx = y})