{-# 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 (..),
 )
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

  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

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