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

module Cardano.Ledger.Dijkstra.TxOut () where

import Cardano.Ledger.Alonzo.Core (AlonzoEraTxOut (..))
import Cardano.Ledger.Babbage (BabbageTxOut)
import Cardano.Ledger.Babbage.TxBody (BabbageTxOut (..))
import Cardano.Ledger.Babbage.TxOut (
  BabbageEraTxOut (..),
  addrEitherBabbageTxOutL,
  babbageMinUTxOValue,
  dataBabbageTxOutL,
  dataHashBabbageTxOutL,
  datumBabbageTxOutL,
  getDatumBabbageTxOut,
  referenceScriptBabbageTxOutL,
  valueEitherBabbageTxOutL,
 )
import Cardano.Ledger.Conway.TxBody (upgradeBabbageTxOut)
import Cardano.Ledger.Core (EraTxOut (..))
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.Scripts ()
import Cardano.Ledger.Plutus (Datum (..))
import Data.Maybe.Strict (StrictMaybe (..))
import Lens.Micro (to)

instance EraTxOut DijkstraEra where
  type TxOut DijkstraEra = BabbageTxOut DijkstraEra

  mkBasicTxOut :: HasCallStack => Addr -> Value DijkstraEra -> TxOut DijkstraEra
mkBasicTxOut Addr
addr Value DijkstraEra
vl = Addr
-> Value DijkstraEra
-> Datum DijkstraEra
-> StrictMaybe (Script DijkstraEra)
-> BabbageTxOut DijkstraEra
forall era.
(Era era, Val (Value era), HasCallStack) =>
Addr
-> Value era
-> Datum era
-> StrictMaybe (Script era)
-> BabbageTxOut era
BabbageTxOut Addr
addr Value DijkstraEra
vl Datum DijkstraEra
forall era. Datum era
NoDatum StrictMaybe (Script DijkstraEra)
StrictMaybe (AlonzoScript DijkstraEra)
forall a. StrictMaybe a
SNothing

  upgradeTxOut :: EraTxOut (PreviousEra DijkstraEra) =>
TxOut (PreviousEra DijkstraEra) -> TxOut DijkstraEra
upgradeTxOut = TxOut (PreviousEra DijkstraEra) -> TxOut DijkstraEra
BabbageTxOut (PreviousEra DijkstraEra) -> BabbageTxOut DijkstraEra
forall era.
(Value era ~ Value (PreviousEra era), EraScript (PreviousEra era),
 EraScript era) =>
BabbageTxOut (PreviousEra era) -> BabbageTxOut era
upgradeBabbageTxOut

  addrEitherTxOutL :: Lens' (TxOut DijkstraEra) (Either Addr CompactAddr)
addrEitherTxOutL = (Either Addr CompactAddr -> f (Either Addr CompactAddr))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(Either Addr CompactAddr -> f (Either Addr CompactAddr))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era.
EraTxOut era =>
Lens' (BabbageTxOut era) (Either Addr CompactAddr)
Lens' (BabbageTxOut DijkstraEra) (Either Addr CompactAddr)
addrEitherBabbageTxOutL
  {-# INLINE addrEitherTxOutL #-}

  valueEitherTxOutL :: Lens'
  (TxOut DijkstraEra)
  (Either (Value DijkstraEra) (CompactForm (Value DijkstraEra)))
valueEitherTxOutL = (Either (Value DijkstraEra) (CompactForm (Value DijkstraEra))
 -> f (Either
         (Value DijkstraEra) (CompactForm (Value DijkstraEra))))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(Either (Value DijkstraEra) (CompactForm (Value DijkstraEra))
 -> f (Either
         (Value DijkstraEra) (CompactForm (Value DijkstraEra))))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era.
EraTxOut era =>
Lens'
  (BabbageTxOut era) (Either (Value era) (CompactForm (Value era)))
Lens'
  (BabbageTxOut DijkstraEra)
  (Either (Value DijkstraEra) (CompactForm (Value DijkstraEra)))
valueEitherBabbageTxOutL
  {-# INLINE valueEitherTxOutL #-}

  getMinCoinSizedTxOut :: PParams DijkstraEra -> Sized (TxOut DijkstraEra) -> Coin
getMinCoinSizedTxOut = PParams DijkstraEra -> Sized (TxOut DijkstraEra) -> Coin
PParams DijkstraEra -> Sized (BabbageTxOut DijkstraEra) -> Coin
forall era a.
BabbageEraPParams era =>
PParams era -> Sized a -> Coin
babbageMinUTxOValue

instance AlonzoEraTxOut DijkstraEra where
  dataHashTxOutL :: Lens' (TxOut DijkstraEra) (StrictMaybe DataHash)
dataHashTxOutL = (StrictMaybe DataHash -> f (StrictMaybe DataHash))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(StrictMaybe DataHash -> f (StrictMaybe DataHash))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era.
EraTxOut era =>
Lens' (BabbageTxOut era) (StrictMaybe DataHash)
Lens' (BabbageTxOut DijkstraEra) (StrictMaybe DataHash)
dataHashBabbageTxOutL
  {-# INLINE dataHashTxOutL #-}

  datumTxOutF :: SimpleGetter (TxOut DijkstraEra) (Datum DijkstraEra)
datumTxOutF = (BabbageTxOut DijkstraEra -> Datum DijkstraEra)
-> SimpleGetter (BabbageTxOut DijkstraEra) (Datum DijkstraEra)
forall s a. (s -> a) -> SimpleGetter s a
to BabbageTxOut DijkstraEra -> Datum DijkstraEra
forall era. BabbageTxOut era -> Datum era
getDatumBabbageTxOut
  {-# INLINE datumTxOutF #-}

instance BabbageEraTxOut DijkstraEra where
  dataTxOutL :: Lens' (TxOut DijkstraEra) (StrictMaybe (Data DijkstraEra))
dataTxOutL = (StrictMaybe (Data DijkstraEra)
 -> f (StrictMaybe (Data DijkstraEra)))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(StrictMaybe (Data DijkstraEra)
 -> f (StrictMaybe (Data DijkstraEra)))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era.
EraTxOut era =>
Lens' (BabbageTxOut era) (StrictMaybe (Data era))
Lens' (BabbageTxOut DijkstraEra) (StrictMaybe (Data DijkstraEra))
dataBabbageTxOutL
  {-# INLINE dataTxOutL #-}

  datumTxOutL :: Lens' (TxOut DijkstraEra) (Datum DijkstraEra)
datumTxOutL = (Datum DijkstraEra -> f (Datum DijkstraEra))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(Datum DijkstraEra -> f (Datum DijkstraEra))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era. EraTxOut era => Lens' (BabbageTxOut era) (Datum era)
Lens' (BabbageTxOut DijkstraEra) (Datum DijkstraEra)
datumBabbageTxOutL
  {-# INLINE datumTxOutL #-}

  referenceScriptTxOutL :: Lens' (TxOut DijkstraEra) (StrictMaybe (Script DijkstraEra))
referenceScriptTxOutL = (StrictMaybe (Script DijkstraEra)
 -> f (StrictMaybe (Script DijkstraEra)))
-> TxOut DijkstraEra -> f (TxOut DijkstraEra)
(StrictMaybe (Script DijkstraEra)
 -> f (StrictMaybe (Script DijkstraEra)))
-> BabbageTxOut DijkstraEra -> f (BabbageTxOut DijkstraEra)
forall era.
EraTxOut era =>
Lens' (BabbageTxOut era) (StrictMaybe (Script era))
Lens' (BabbageTxOut DijkstraEra) (StrictMaybe (Script DijkstraEra))
referenceScriptBabbageTxOutL
  {-# INLINE referenceScriptTxOutL #-}