{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Dijkstra.Tx () where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Tx (
  AlonzoEraTx,
  AlonzoTx (..),
  auxDataAlonzoTxL,
  bodyAlonzoTxL,
  isValidAlonzoTxL,
  mkBasicAlonzoTx,
  sizeAlonzoTxF,
  witsAlonzoTxL,
 )
import Cardano.Ledger.Alonzo.TxSeq (AlonzoTxSeq (..), hashAlonzoTxSeq)
import Cardano.Ledger.Conway.Tx (AlonzoEraTx (..), getConwayMinFeeTx)
import Cardano.Ledger.Core (
  EraSegWits (..),
  EraTx (..),
  EraTxAuxData (..),
  EraTxBody (..),
  EraTxWits (..),
 )
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.TxAuxData ()
import Cardano.Ledger.Dijkstra.TxBody ()
import Cardano.Ledger.Dijkstra.TxWits ()

instance EraTx DijkstraEra where
  type Tx DijkstraEra = AlonzoTx DijkstraEra
  type TxUpgradeError DijkstraEra = TxBodyUpgradeError DijkstraEra

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

  bodyTxL :: Lens' (Tx DijkstraEra) (TxBody DijkstraEra)
bodyTxL = (TxBody DijkstraEra -> f (TxBody DijkstraEra))
-> Tx DijkstraEra -> f (Tx DijkstraEra)
(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 = (TxWits DijkstraEra -> f (TxWits DijkstraEra))
-> Tx DijkstraEra -> f (Tx DijkstraEra)
(TxWits DijkstraEra -> f (TxWits 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 = (StrictMaybe (TxAuxData DijkstraEra)
 -> f (StrictMaybe (TxAuxData DijkstraEra)))
-> Tx DijkstraEra -> f (Tx DijkstraEra)
(StrictMaybe (TxAuxData DijkstraEra)
 -> f (StrictMaybe (TxAuxData 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 = (Integer -> Const r Integer)
-> Tx DijkstraEra -> Const r (Tx DijkstraEra)
Getting r (AlonzoTx DijkstraEra) Integer
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

  upgradeTx :: EraTx (PreviousEra DijkstraEra) =>
Tx (PreviousEra DijkstraEra)
-> Either (TxUpgradeError DijkstraEra) (Tx DijkstraEra)
upgradeTx (AlonzoTx TxBody ConwayEra
b TxWits ConwayEra
w IsValid
valid StrictMaybe (TxAuxData ConwayEra)
aux) =
    TxBody DijkstraEra
-> TxWits DijkstraEra
-> IsValid
-> StrictMaybe (TxAuxData DijkstraEra)
-> AlonzoTx DijkstraEra
TxBody DijkstraEra
-> AlonzoTxWits DijkstraEra
-> IsValid
-> StrictMaybe (AlonzoTxAuxData DijkstraEra)
-> AlonzoTx DijkstraEra
forall era.
TxBody era
-> TxWits era
-> IsValid
-> StrictMaybe (TxAuxData era)
-> AlonzoTx era
AlonzoTx
      (TxBody DijkstraEra
 -> AlonzoTxWits DijkstraEra
 -> IsValid
 -> StrictMaybe (AlonzoTxAuxData DijkstraEra)
 -> AlonzoTx DijkstraEra)
-> Either Void (TxBody DijkstraEra)
-> Either
     Void
     (AlonzoTxWits DijkstraEra
      -> IsValid
      -> StrictMaybe (AlonzoTxAuxData DijkstraEra)
      -> AlonzoTx DijkstraEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TxBody (PreviousEra DijkstraEra)
-> Either (TxBodyUpgradeError DijkstraEra) (TxBody DijkstraEra)
forall era.
(EraTxBody era, EraTxBody (PreviousEra era)) =>
TxBody (PreviousEra era)
-> Either (TxBodyUpgradeError era) (TxBody era)
upgradeTxBody TxBody (PreviousEra DijkstraEra)
TxBody ConwayEra
b
      Either
  Void
  (AlonzoTxWits DijkstraEra
   -> IsValid
   -> StrictMaybe (AlonzoTxAuxData DijkstraEra)
   -> AlonzoTx DijkstraEra)
-> Either Void (AlonzoTxWits DijkstraEra)
-> Either
     Void
     (IsValid
      -> StrictMaybe (AlonzoTxAuxData DijkstraEra)
      -> AlonzoTx DijkstraEra)
forall a b. Either Void (a -> b) -> Either Void a -> Either Void b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AlonzoTxWits DijkstraEra -> Either Void (AlonzoTxWits DijkstraEra)
forall a. a -> Either Void a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TxWits (PreviousEra DijkstraEra) -> TxWits DijkstraEra
forall era.
(EraTxWits era, EraTxWits (PreviousEra era)) =>
TxWits (PreviousEra era) -> TxWits era
upgradeTxWits TxWits (PreviousEra DijkstraEra)
TxWits ConwayEra
w)
      Either
  Void
  (IsValid
   -> StrictMaybe (AlonzoTxAuxData DijkstraEra)
   -> AlonzoTx DijkstraEra)
-> Either Void IsValid
-> Either
     Void
     (StrictMaybe (AlonzoTxAuxData DijkstraEra) -> AlonzoTx DijkstraEra)
forall a b. Either Void (a -> b) -> Either Void a -> Either Void b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IsValid -> Either Void IsValid
forall a. a -> Either Void a
forall (f :: * -> *) a. Applicative f => a -> f a
pure IsValid
valid
      Either
  Void
  (StrictMaybe (AlonzoTxAuxData DijkstraEra) -> AlonzoTx DijkstraEra)
-> Either Void (StrictMaybe (AlonzoTxAuxData DijkstraEra))
-> Either Void (AlonzoTx DijkstraEra)
forall a b. Either Void (a -> b) -> Either Void a -> Either Void b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> StrictMaybe (AlonzoTxAuxData DijkstraEra)
-> Either Void (StrictMaybe (AlonzoTxAuxData DijkstraEra))
forall a. a -> Either Void a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((TxAuxData (PreviousEra DijkstraEra)
 -> AlonzoTxAuxData DijkstraEra)
-> StrictMaybe (TxAuxData (PreviousEra DijkstraEra))
-> StrictMaybe (AlonzoTxAuxData DijkstraEra)
forall a b. (a -> b) -> StrictMaybe a -> StrictMaybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TxAuxData (PreviousEra DijkstraEra) -> TxAuxData DijkstraEra
TxAuxData (PreviousEra DijkstraEra) -> AlonzoTxAuxData DijkstraEra
forall era.
(EraTxAuxData era, EraTxAuxData (PreviousEra era)) =>
TxAuxData (PreviousEra era) -> TxAuxData era
upgradeTxAuxData StrictMaybe (TxAuxData (PreviousEra DijkstraEra))
StrictMaybe (TxAuxData ConwayEra)
aux)

instance AlonzoEraTx DijkstraEra where
  isValidTxL :: Lens' (Tx DijkstraEra) IsValid
isValidTxL = (IsValid -> f IsValid) -> Tx DijkstraEra -> f (Tx DijkstraEra)
(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 EraSegWits DijkstraEra where
  type TxSeq DijkstraEra = AlonzoTxSeq DijkstraEra
  fromTxSeq :: TxSeq DijkstraEra -> StrictSeq (Tx DijkstraEra)
fromTxSeq = TxSeq DijkstraEra -> StrictSeq (Tx DijkstraEra)
AlonzoTxSeq DijkstraEra -> StrictSeq (Tx DijkstraEra)
forall era. AlonzoTxSeq era -> StrictSeq (Tx era)
txSeqTxns
  toTxSeq :: StrictSeq (Tx DijkstraEra) -> TxSeq DijkstraEra
toTxSeq = StrictSeq (Tx DijkstraEra) -> TxSeq DijkstraEra
StrictSeq (Tx DijkstraEra) -> AlonzoTxSeq DijkstraEra
forall era.
(AlonzoEraTx era, SafeToHash (TxWits era)) =>
StrictSeq (Tx era) -> AlonzoTxSeq era
AlonzoTxSeq
  hashTxSeq :: TxSeq DijkstraEra -> Hash HASH EraIndependentBlockBody
hashTxSeq = TxSeq DijkstraEra -> Hash HASH EraIndependentBlockBody
AlonzoTxSeq DijkstraEra -> Hash HASH EraIndependentBlockBody
forall era. AlonzoTxSeq era -> Hash HASH EraIndependentBlockBody
hashAlonzoTxSeq
  numSegComponents :: Word64
numSegComponents = Word64
4