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

module Cardano.Ledger.Allegra.TxOut () where

import Cardano.Ledger.Allegra.Era (AllegraEra)
import Cardano.Ledger.Allegra.PParams ()
import Cardano.Ledger.Core
import Cardano.Ledger.Shelley.TxOut (
  ShelleyTxOut (..),
  addrEitherShelleyTxOutL,
  valueEitherShelleyTxOutL,
 )
import Data.Coerce (coerce)
import Lens.Micro ((^.))

instance EraTxOut AllegraEra where
  type TxOut AllegraEra = ShelleyTxOut AllegraEra

  mkBasicTxOut :: HasCallStack => Addr -> Value AllegraEra -> TxOut AllegraEra
mkBasicTxOut = Addr -> Value AllegraEra -> TxOut AllegraEra
Addr -> Value AllegraEra -> ShelleyTxOut AllegraEra
forall era.
(HasCallStack, Era era, Val (Value era)) =>
Addr -> Value era -> ShelleyTxOut era
ShelleyTxOut

  upgradeTxOut :: EraTxOut (PreviousEra AllegraEra) =>
TxOut (PreviousEra AllegraEra) -> TxOut AllegraEra
upgradeTxOut (TxOutCompact CompactAddr
addr CompactForm (Value ShelleyEra)
cfval) = CompactAddr
-> CompactForm (Value AllegraEra) -> ShelleyTxOut AllegraEra
forall era.
CompactAddr -> CompactForm (Value era) -> ShelleyTxOut era
TxOutCompact (CompactAddr -> CompactAddr
forall a b. Coercible a b => a -> b
coerce CompactAddr
addr) CompactForm (Value ShelleyEra)
CompactForm (Value AllegraEra)
cfval

  addrEitherTxOutL :: Lens' (TxOut AllegraEra) (Either Addr CompactAddr)
addrEitherTxOutL = (Either Addr CompactAddr -> f (Either Addr CompactAddr))
-> TxOut AllegraEra -> f (TxOut AllegraEra)
(Either Addr CompactAddr -> f (Either Addr CompactAddr))
-> ShelleyTxOut AllegraEra -> f (ShelleyTxOut AllegraEra)
forall era (f :: * -> *).
Functor f =>
(Either Addr CompactAddr -> f (Either Addr CompactAddr))
-> ShelleyTxOut era -> f (ShelleyTxOut era)
addrEitherShelleyTxOutL
  {-# INLINE addrEitherTxOutL #-}

  valueEitherTxOutL :: Lens'
  (TxOut AllegraEra)
  (Either (Value AllegraEra) (CompactForm (Value AllegraEra)))
valueEitherTxOutL = (Either (Value AllegraEra) (CompactForm (Value AllegraEra))
 -> f (Either (Value AllegraEra) (CompactForm (Value AllegraEra))))
-> TxOut AllegraEra -> f (TxOut AllegraEra)
(Either (Value AllegraEra) (CompactForm (Value AllegraEra))
 -> f (Either (Value AllegraEra) (CompactForm (Value AllegraEra))))
-> ShelleyTxOut AllegraEra -> f (ShelleyTxOut AllegraEra)
forall era.
Val (Value era) =>
Lens'
  (ShelleyTxOut era) (Either (Value era) (CompactForm (Value era)))
Lens'
  (ShelleyTxOut AllegraEra)
  (Either (Value AllegraEra) (CompactForm (Value AllegraEra)))
valueEitherShelleyTxOutL
  {-# INLINE valueEitherTxOutL #-}

  getMinCoinTxOut :: PParams AllegraEra -> TxOut AllegraEra -> Coin
getMinCoinTxOut PParams AllegraEra
pp TxOut AllegraEra
_txOut = PParams AllegraEra
pp PParams AllegraEra
-> Getting Coin (PParams AllegraEra) Coin -> Coin
forall s a. s -> Getting a s a -> a
^. Getting Coin (PParams AllegraEra) Coin
forall era.
(EraPParams era, ProtVerAtMost era 4) =>
Lens' (PParams era) Coin
Lens' (PParams AllegraEra) Coin
ppMinUTxOValueL