{-# 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.Crypto (Crypto, StandardCrypto)
import Cardano.Ledger.Shelley.TxOut (
  ShelleyTxOut (..),
  addrEitherShelleyTxOutL,
  valueEitherShelleyTxOutL,
 )
import Data.Coerce (coerce)
import Lens.Micro ((^.))

instance Crypto c => EraTxOut (AllegraEra c) where
  {-# SPECIALIZE instance EraTxOut (AllegraEra StandardCrypto) #-}

  type TxOut (AllegraEra c) = ShelleyTxOut (AllegraEra c)

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

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

  addrEitherTxOutL :: Lens'
  (TxOut (AllegraEra c))
  (Either
     (Addr (EraCrypto (AllegraEra c)))
     (CompactAddr (EraCrypto (AllegraEra c))))
addrEitherTxOutL = forall era.
Lens'
  (ShelleyTxOut era)
  (Either (Addr (EraCrypto era)) (CompactAddr (EraCrypto era)))
addrEitherShelleyTxOutL
  {-# INLINE addrEitherTxOutL #-}

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

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