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

module Cardano.Ledger.Babbage.Tx (
  AlonzoTx (..),
  TxBody (..),
  module X,
) where

import Cardano.Ledger.Allegra.Tx (validateTimelock)
import Cardano.Ledger.Alonzo.Tx as X
import Cardano.Ledger.Alonzo.TxSeq (
  AlonzoTxSeq (AlonzoTxSeq, txSeqTxns),
  hashAlonzoTxSeq,
 )
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.Core

instance EraTx BabbageEra where
  type Tx BabbageEra = AlonzoTx BabbageEra
  mkBasicTx :: TxBody BabbageEra -> Tx BabbageEra
mkBasicTx = TxBody BabbageEra -> Tx BabbageEra
TxBody BabbageEra -> AlonzoTx BabbageEra
forall era. Monoid (TxWits era) => TxBody era -> AlonzoTx era
mkBasicAlonzoTx

  bodyTxL :: Lens' (Tx BabbageEra) (TxBody BabbageEra)
bodyTxL = (TxBody BabbageEra -> f (TxBody BabbageEra))
-> Tx BabbageEra -> f (Tx BabbageEra)
(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 = (TxWits BabbageEra -> f (TxWits BabbageEra))
-> Tx BabbageEra -> f (Tx BabbageEra)
(TxWits BabbageEra -> f (TxWits 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 = (StrictMaybe (TxAuxData BabbageEra)
 -> f (StrictMaybe (TxAuxData BabbageEra)))
-> Tx BabbageEra -> f (Tx BabbageEra)
(StrictMaybe (TxAuxData BabbageEra)
 -> f (StrictMaybe (TxAuxData 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 = (Integer -> Const r Integer)
-> Tx BabbageEra -> Const r (Tx BabbageEra)
Getting r (AlonzoTx BabbageEra) Integer
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 AlonzoEraTx BabbageEra where
  isValidTxL :: Lens' (Tx BabbageEra) IsValid
isValidTxL = (IsValid -> f IsValid) -> Tx BabbageEra -> f (Tx BabbageEra)
(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 EraSegWits BabbageEra where
  type TxSeq BabbageEra = AlonzoTxSeq BabbageEra
  fromTxSeq :: TxSeq BabbageEra -> StrictSeq (Tx BabbageEra)
fromTxSeq = TxSeq BabbageEra -> StrictSeq (Tx BabbageEra)
AlonzoTxSeq BabbageEra -> StrictSeq (Tx BabbageEra)
forall era. AlonzoTxSeq era -> StrictSeq (Tx era)
txSeqTxns
  toTxSeq :: StrictSeq (Tx BabbageEra) -> TxSeq BabbageEra
toTxSeq = StrictSeq (Tx BabbageEra) -> TxSeq BabbageEra
StrictSeq (Tx BabbageEra) -> AlonzoTxSeq BabbageEra
forall era.
(AlonzoEraTx era, SafeToHash (TxWits era)) =>
StrictSeq (Tx era) -> AlonzoTxSeq era
AlonzoTxSeq
  hashTxSeq :: TxSeq BabbageEra -> Hash HASH EraIndependentBlockBody
hashTxSeq = TxSeq BabbageEra -> Hash HASH EraIndependentBlockBody
AlonzoTxSeq BabbageEra -> Hash HASH EraIndependentBlockBody
forall era. AlonzoTxSeq era -> Hash HASH EraIndependentBlockBody
hashAlonzoTxSeq
  numSegComponents :: Word64
numSegComponents = Word64
4