{-# 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.Core (EraScript (..), EraTxOut (..))
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.Scripts ()
import Cardano.Ledger.Plutus (Datum (..), translateDatum)
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 (BabbageTxOut Addr
addr Value ConwayEra
value Datum ConwayEra
d StrictMaybe (Script ConwayEra)
s) =
    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 ConwayEra
Value DijkstraEra
value (Datum ConwayEra -> Datum DijkstraEra
forall era1 era2. Datum era1 -> Datum era2
translateDatum Datum ConwayEra
d) (Script (PreviousEra DijkstraEra) -> Script DijkstraEra
Script (PreviousEra DijkstraEra) -> AlonzoScript DijkstraEra
forall era.
(EraScript era, EraScript (PreviousEra era)) =>
Script (PreviousEra era) -> Script era
upgradeScript (Script (PreviousEra DijkstraEra) -> AlonzoScript DijkstraEra)
-> StrictMaybe (Script (PreviousEra DijkstraEra))
-> StrictMaybe (AlonzoScript DijkstraEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StrictMaybe (Script (PreviousEra DijkstraEra))
StrictMaybe (Script ConwayEra)
s)

  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 #-}