{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Mary.Tx (
  validateTimelock,
  Tx (..),
) where

import Cardano.Ledger.Allegra.Tx (Tx (..), validateTimelock)
import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR, ToCBOR)
import Cardano.Ledger.Core (EraTx (..))
import Cardano.Ledger.Mary.Era (MaryEra)
import Cardano.Ledger.Mary.PParams ()
import Cardano.Ledger.Mary.TxAuxData ()
import Cardano.Ledger.Mary.TxBody ()
import Cardano.Ledger.Mary.TxWits ()
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Cardano.Ledger.Shelley.Tx (
  ShelleyTx (..),
  auxDataShelleyTxL,
  bodyShelleyTxL,
  mkBasicShelleyTx,
  shelleyMinFeeTx,
  shelleyTxEqRaw,
  sizeShelleyTxF,
  witsShelleyTxL,
 )
import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import Lens.Micro (Lens', lens)
import NoThunks.Class (NoThunks)

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

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

  mkBasicTx :: TxBody MaryEra -> Tx MaryEra
mkBasicTx = ShelleyTx MaryEra -> Tx MaryEra
MkMaryTx (ShelleyTx MaryEra -> Tx MaryEra)
-> (TxBody MaryEra -> ShelleyTx MaryEra)
-> TxBody MaryEra
-> Tx MaryEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody MaryEra -> ShelleyTx MaryEra
forall era. EraTx era => TxBody era -> ShelleyTx era
mkBasicShelleyTx

  bodyTxL :: Lens' (Tx MaryEra) (TxBody MaryEra)
bodyTxL = (ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> Tx MaryEra -> f (Tx MaryEra)
Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL ((ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
 -> Tx MaryEra -> f (Tx MaryEra))
-> ((TxBody MaryEra -> f (TxBody MaryEra))
    -> ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> (TxBody MaryEra -> f (TxBody MaryEra))
-> Tx MaryEra
-> f (Tx MaryEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxBody MaryEra -> f (TxBody MaryEra))
-> ShelleyTx MaryEra -> f (ShelleyTx MaryEra)
forall era (f :: * -> *).
Functor f =>
(TxBody era -> f (TxBody era))
-> ShelleyTx era -> f (ShelleyTx era)
bodyShelleyTxL
  {-# INLINE bodyTxL #-}

  witsTxL :: Lens' (Tx MaryEra) (TxWits MaryEra)
witsTxL = (ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> Tx MaryEra -> f (Tx MaryEra)
Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL ((ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
 -> Tx MaryEra -> f (Tx MaryEra))
-> ((ShelleyTxWits MaryEra -> f (ShelleyTxWits MaryEra))
    -> ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> (ShelleyTxWits MaryEra -> f (ShelleyTxWits MaryEra))
-> Tx MaryEra
-> f (Tx MaryEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxWits MaryEra -> f (TxWits MaryEra))
-> ShelleyTx MaryEra -> f (ShelleyTx MaryEra)
(ShelleyTxWits MaryEra -> f (ShelleyTxWits MaryEra))
-> ShelleyTx MaryEra -> f (ShelleyTx MaryEra)
forall era (f :: * -> *).
Functor f =>
(TxWits era -> f (TxWits era))
-> ShelleyTx era -> f (ShelleyTx era)
witsShelleyTxL
  {-# INLINE witsTxL #-}

  auxDataTxL :: Lens' (Tx MaryEra) (StrictMaybe (TxAuxData MaryEra))
auxDataTxL = (ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> Tx MaryEra -> f (Tx MaryEra)
Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL ((ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
 -> Tx MaryEra -> f (Tx MaryEra))
-> ((StrictMaybe (AllegraTxAuxData MaryEra)
     -> f (StrictMaybe (AllegraTxAuxData MaryEra)))
    -> ShelleyTx MaryEra -> f (ShelleyTx MaryEra))
-> (StrictMaybe (AllegraTxAuxData MaryEra)
    -> f (StrictMaybe (AllegraTxAuxData MaryEra)))
-> Tx MaryEra
-> f (Tx MaryEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe (AllegraTxAuxData MaryEra)
 -> f (StrictMaybe (AllegraTxAuxData MaryEra)))
-> ShelleyTx MaryEra -> f (ShelleyTx MaryEra)
(StrictMaybe (TxAuxData MaryEra)
 -> f (StrictMaybe (TxAuxData MaryEra)))
-> ShelleyTx MaryEra -> f (ShelleyTx MaryEra)
forall era (f :: * -> *).
Functor f =>
(StrictMaybe (TxAuxData era) -> f (StrictMaybe (TxAuxData era)))
-> ShelleyTx era -> f (ShelleyTx era)
auxDataShelleyTxL
  {-# INLINE auxDataTxL #-}

  sizeTxF :: SimpleGetter (Tx MaryEra) Integer
sizeTxF = (ShelleyTx MaryEra -> Const r (ShelleyTx MaryEra))
-> Tx MaryEra -> Const r (Tx MaryEra)
Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL ((ShelleyTx MaryEra -> Const r (ShelleyTx MaryEra))
 -> Tx MaryEra -> Const r (Tx MaryEra))
-> ((Integer -> Const r Integer)
    -> ShelleyTx MaryEra -> Const r (ShelleyTx MaryEra))
-> (Integer -> Const r Integer)
-> Tx MaryEra
-> Const r (Tx MaryEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Const r Integer)
-> ShelleyTx MaryEra -> Const r (ShelleyTx MaryEra)
forall era. EraTx era => SimpleGetter (ShelleyTx era) Integer
SimpleGetter (ShelleyTx MaryEra) Integer
sizeShelleyTxF
  {-# INLINE sizeTxF #-}

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

  getMinFeeTx :: PParams MaryEra -> Tx MaryEra -> Int -> Coin
getMinFeeTx PParams MaryEra
pp Tx MaryEra
tx Int
_ = PParams MaryEra -> Tx MaryEra -> Coin
forall era. EraTx era => PParams era -> Tx era -> Coin
shelleyMinFeeTx PParams MaryEra
pp Tx MaryEra
tx

instance EqRaw (Tx MaryEra) where
  eqRaw :: Tx MaryEra -> Tx MaryEra -> Bool
eqRaw = Tx MaryEra -> Tx MaryEra -> Bool
forall era. EraTx era => Tx era -> Tx era -> Bool
shelleyTxEqRaw

maryTxL :: Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL :: Lens' (Tx MaryEra) (ShelleyTx MaryEra)
maryTxL = (Tx MaryEra -> ShelleyTx MaryEra)
-> (Tx MaryEra -> ShelleyTx MaryEra -> Tx MaryEra)
-> Lens' (Tx MaryEra) (ShelleyTx MaryEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx MaryEra -> ShelleyTx MaryEra
unMaryTx (\Tx MaryEra
x ShelleyTx MaryEra
y -> Tx MaryEra
x {unMaryTx = y})

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