{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# 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 GHC.Generics (Generic)
import Lens.Micro (Lens', lens)
import NoThunks.Class (NoThunks)

instance EraTx BabbageEra where
  newtype Tx BabbageEra = MkBabbageTx {Tx BabbageEra -> AlonzoTx BabbageEra
unBabbageTx :: AlonzoTx BabbageEra}
    deriving newtype (Tx BabbageEra -> Tx BabbageEra -> Bool
(Tx BabbageEra -> Tx BabbageEra -> Bool)
-> (Tx BabbageEra -> Tx BabbageEra -> Bool) -> Eq (Tx BabbageEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tx BabbageEra -> Tx BabbageEra -> Bool
== :: Tx BabbageEra -> Tx BabbageEra -> Bool
$c/= :: Tx BabbageEra -> Tx BabbageEra -> Bool
/= :: Tx BabbageEra -> Tx BabbageEra -> Bool
Eq, Tx BabbageEra -> ()
(Tx BabbageEra -> ()) -> NFData (Tx BabbageEra)
forall a. (a -> ()) -> NFData a
$crnf :: Tx BabbageEra -> ()
rnf :: Tx BabbageEra -> ()
NFData, Int -> Tx BabbageEra -> ShowS
[Tx BabbageEra] -> ShowS
Tx BabbageEra -> String
(Int -> Tx BabbageEra -> ShowS)
-> (Tx BabbageEra -> String)
-> ([Tx BabbageEra] -> ShowS)
-> Show (Tx BabbageEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tx BabbageEra -> ShowS
showsPrec :: Int -> Tx BabbageEra -> ShowS
$cshow :: Tx BabbageEra -> String
show :: Tx BabbageEra -> String
$cshowList :: [Tx BabbageEra] -> ShowS
showList :: [Tx BabbageEra] -> ShowS
Show, Context -> Tx BabbageEra -> IO (Maybe ThunkInfo)
Proxy (Tx BabbageEra) -> String
(Context -> Tx BabbageEra -> IO (Maybe ThunkInfo))
-> (Context -> Tx BabbageEra -> IO (Maybe ThunkInfo))
-> (Proxy (Tx BabbageEra) -> String)
-> NoThunks (Tx BabbageEra)
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> Tx BabbageEra -> IO (Maybe ThunkInfo)
noThunks :: Context -> Tx BabbageEra -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> Tx BabbageEra -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> Tx BabbageEra -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy (Tx BabbageEra) -> String
showTypeOf :: Proxy (Tx BabbageEra) -> String
NoThunks, Typeable (Tx BabbageEra)
Typeable (Tx BabbageEra) =>
(Tx BabbageEra -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (Tx BabbageEra) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [Tx BabbageEra] -> Size)
-> ToCBOR (Tx BabbageEra)
Tx BabbageEra -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx 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
$ctoCBOR :: Tx BabbageEra -> Encoding
toCBOR :: Tx BabbageEra -> Encoding
$cencodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx BabbageEra) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (Tx BabbageEra) -> Size
$cencodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
ToCBOR, Typeable (Tx BabbageEra)
Typeable (Tx BabbageEra) =>
(Tx BabbageEra -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy (Tx BabbageEra) -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size)
    -> Proxy [Tx BabbageEra] -> Size)
-> EncCBOR (Tx BabbageEra)
Tx BabbageEra -> Encoding
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
(forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx BabbageEra) -> Size
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. EncCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> EncCBOR a
$cencCBOR :: Tx BabbageEra -> Encoding
encCBOR :: Tx BabbageEra -> Encoding
$cencodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx BabbageEra) -> Size
encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy (Tx BabbageEra) -> Size
$cencodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
encodedListSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy [Tx BabbageEra] -> Size
EncCBOR)
    deriving ((forall x. Tx BabbageEra -> Rep (Tx BabbageEra) x)
-> (forall x. Rep (Tx BabbageEra) x -> Tx BabbageEra)
-> Generic (Tx BabbageEra)
forall x. Rep (Tx BabbageEra) x -> Tx BabbageEra
forall x. Tx BabbageEra -> Rep (Tx BabbageEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tx BabbageEra -> Rep (Tx BabbageEra) x
from :: forall x. Tx BabbageEra -> Rep (Tx BabbageEra) x
$cto :: forall x. Rep (Tx BabbageEra) x -> Tx BabbageEra
to :: forall x. Rep (Tx BabbageEra) x -> Tx BabbageEra
Generic)
  mkBasicTx :: TxBody BabbageEra -> Tx BabbageEra
mkBasicTx = AlonzoTx BabbageEra -> Tx BabbageEra
MkBabbageTx (AlonzoTx BabbageEra -> Tx BabbageEra)
-> (TxBody BabbageEra -> AlonzoTx BabbageEra)
-> TxBody BabbageEra
-> Tx BabbageEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody BabbageEra -> AlonzoTx BabbageEra
forall era. Monoid (TxWits era) => TxBody era -> AlonzoTx era
mkBasicAlonzoTx

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

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

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

  sizeTxF :: SimpleGetter (Tx BabbageEra) Integer
sizeTxF = (AlonzoTx BabbageEra -> Const r (AlonzoTx BabbageEra))
-> Tx BabbageEra -> Const r (Tx BabbageEra)
Lens' (Tx BabbageEra) (AlonzoTx BabbageEra)
babbageTxL ((AlonzoTx BabbageEra -> Const r (AlonzoTx BabbageEra))
 -> Tx BabbageEra -> Const r (Tx BabbageEra))
-> ((Integer -> Const r Integer)
    -> AlonzoTx BabbageEra -> Const r (AlonzoTx BabbageEra))
-> (Integer -> Const r Integer)
-> Tx BabbageEra
-> Const r (Tx BabbageEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Const r Integer)
-> AlonzoTx BabbageEra -> Const r (AlonzoTx BabbageEra)
forall era. EraTx era => SimpleGetter (AlonzoTx era) Integer
SimpleGetter (AlonzoTx BabbageEra) Integer
sizeAlonzoTxF
  {-# INLINE sizeTxF #-}

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

  getMinFeeTx :: PParams BabbageEra -> Tx BabbageEra -> Int -> Coin
getMinFeeTx PParams BabbageEra
pp Tx BabbageEra
tx Int
_ = PParams BabbageEra -> Tx BabbageEra -> Coin
forall era.
(EraTx era, AlonzoEraTxWits era, AlonzoEraPParams era) =>
PParams era -> Tx era -> Coin
alonzoMinFeeTx PParams BabbageEra
pp Tx BabbageEra
tx

instance EqRaw (Tx BabbageEra) where
  eqRaw :: Tx BabbageEra -> Tx BabbageEra -> Bool
eqRaw = Tx BabbageEra -> Tx BabbageEra -> Bool
forall era. AlonzoEraTx era => Tx era -> Tx era -> Bool
alonzoTxEqRaw

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

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

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