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

module Cardano.Ledger.Dijkstra.Tx (Tx (..)) where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Tx (
  AlonzoEraTx,
  AlonzoTx (..),
  alonzoTxEqRaw,
  auxDataAlonzoTxL,
  bodyAlonzoTxL,
  isValidAlonzoTxL,
  mkBasicAlonzoTx,
  sizeAlonzoTxF,
  witsAlonzoTxL,
 )
import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR, ToCBOR)
import Cardano.Ledger.Conway.Tx (AlonzoEraTx (..), Tx (..), getConwayMinFeeTx)
import Cardano.Ledger.Core (EraTx (..))
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.TxAuxData ()
import Cardano.Ledger.Dijkstra.TxBody ()
import Cardano.Ledger.Dijkstra.TxWits ()
import Cardano.Ledger.MemoBytes (EqRaw (..))
import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import Lens.Micro (Lens', lens)
import NoThunks.Class (NoThunks)

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

  mkBasicTx :: TxBody DijkstraEra -> Tx DijkstraEra
mkBasicTx = AlonzoTx DijkstraEra -> Tx DijkstraEra
MkDijkstraTx (AlonzoTx DijkstraEra -> Tx DijkstraEra)
-> (TxBody DijkstraEra -> AlonzoTx DijkstraEra)
-> TxBody DijkstraEra
-> Tx DijkstraEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxBody DijkstraEra -> AlonzoTx DijkstraEra
forall era. Monoid (TxWits era) => TxBody era -> AlonzoTx era
mkBasicAlonzoTx

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

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

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

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

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

  getMinFeeTx :: PParams DijkstraEra -> Tx DijkstraEra -> Int -> Coin
getMinFeeTx = PParams DijkstraEra -> Tx DijkstraEra -> Int -> Coin
forall era.
(EraTx era, AlonzoEraTxWits era, ConwayEraPParams era) =>
PParams era -> Tx era -> Int -> Coin
getConwayMinFeeTx

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

dijkstraTxL :: Lens' (Tx DijkstraEra) (AlonzoTx DijkstraEra)
dijkstraTxL :: Lens' (Tx DijkstraEra) (AlonzoTx DijkstraEra)
dijkstraTxL = (Tx DijkstraEra -> AlonzoTx DijkstraEra)
-> (Tx DijkstraEra -> AlonzoTx DijkstraEra -> Tx DijkstraEra)
-> Lens' (Tx DijkstraEra) (AlonzoTx DijkstraEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Tx DijkstraEra -> AlonzoTx DijkstraEra
unDijkstraTx (\Tx DijkstraEra
x AlonzoTx DijkstraEra
y -> Tx DijkstraEra
x {unDijkstraTx = y})

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

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