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

module Cardano.Ledger.Alonzo.TxCert () where

import Cardano.Ledger.Alonzo.Era (AlonzoEra)
import Cardano.Ledger.Alonzo.PParams ()
import Cardano.Ledger.Shelley.TxCert

instance EraTxCert AlonzoEra where
  type TxCert AlonzoEra = ShelleyTxCert AlonzoEra

  upgradeTxCert :: EraTxCert (PreviousEra AlonzoEra) =>
TxCert (PreviousEra AlonzoEra)
-> Either (TxCertUpgradeError AlonzoEra) (TxCert AlonzoEra)
upgradeTxCert = ShelleyTxCert AlonzoEra -> Either Void (ShelleyTxCert AlonzoEra)
forall a b. b -> Either a b
Right (ShelleyTxCert AlonzoEra -> Either Void (ShelleyTxCert AlonzoEra))
-> (ShelleyTxCert MaryEra -> ShelleyTxCert AlonzoEra)
-> ShelleyTxCert MaryEra
-> Either Void (ShelleyTxCert AlonzoEra)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyTxCert MaryEra -> ShelleyTxCert AlonzoEra
forall era1 era2. ShelleyTxCert era1 -> ShelleyTxCert era2
upgradeShelleyTxCert

  getVKeyWitnessTxCert :: TxCert AlonzoEra -> Maybe (KeyHash Witness)
getVKeyWitnessTxCert = TxCert AlonzoEra -> Maybe (KeyHash Witness)
ShelleyTxCert AlonzoEra -> Maybe (KeyHash Witness)
forall era. ShelleyTxCert era -> Maybe (KeyHash Witness)
getVKeyWitnessShelleyTxCert

  getScriptWitnessTxCert :: TxCert AlonzoEra -> Maybe ScriptHash
getScriptWitnessTxCert = TxCert AlonzoEra -> Maybe ScriptHash
ShelleyTxCert AlonzoEra -> Maybe ScriptHash
forall era. ShelleyTxCert era -> Maybe ScriptHash
getScriptWitnessShelleyTxCert

  mkRegPoolTxCert :: StakePoolParams -> TxCert AlonzoEra
mkRegPoolTxCert = PoolCert -> ShelleyTxCert AlonzoEra
forall era. PoolCert -> ShelleyTxCert era
ShelleyTxCertPool (PoolCert -> ShelleyTxCert AlonzoEra)
-> (StakePoolParams -> PoolCert)
-> StakePoolParams
-> ShelleyTxCert AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StakePoolParams -> PoolCert
RegPool

  getRegPoolTxCert :: TxCert AlonzoEra -> Maybe StakePoolParams
getRegPoolTxCert (ShelleyTxCertPool (RegPool StakePoolParams
poolParams)) = StakePoolParams -> Maybe StakePoolParams
forall a. a -> Maybe a
Just StakePoolParams
poolParams
  getRegPoolTxCert TxCert AlonzoEra
_ = Maybe StakePoolParams
forall a. Maybe a
Nothing

  mkRetirePoolTxCert :: KeyHash StakePool -> EpochNo -> TxCert AlonzoEra
mkRetirePoolTxCert KeyHash StakePool
poolId EpochNo
epochNo = PoolCert -> ShelleyTxCert AlonzoEra
forall era. PoolCert -> ShelleyTxCert era
ShelleyTxCertPool (PoolCert -> ShelleyTxCert AlonzoEra)
-> PoolCert -> ShelleyTxCert AlonzoEra
forall a b. (a -> b) -> a -> b
$ KeyHash StakePool -> EpochNo -> PoolCert
RetirePool KeyHash StakePool
poolId EpochNo
epochNo

  getRetirePoolTxCert :: TxCert AlonzoEra -> Maybe (KeyHash StakePool, EpochNo)
getRetirePoolTxCert (ShelleyTxCertPool (RetirePool KeyHash StakePool
poolId EpochNo
epochNo)) = (KeyHash StakePool, EpochNo) -> Maybe (KeyHash StakePool, EpochNo)
forall a. a -> Maybe a
Just (KeyHash StakePool
poolId, EpochNo
epochNo)
  getRetirePoolTxCert TxCert AlonzoEra
_ = Maybe (KeyHash StakePool, EpochNo)
forall a. Maybe a
Nothing

  lookupRegStakeTxCert :: TxCert AlonzoEra -> Maybe (Credential Staking)
lookupRegStakeTxCert = \case
    RegTxCert Credential Staking
c -> Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
    TxCert AlonzoEra
_ -> Maybe (Credential Staking)
forall a. Maybe a
Nothing
  lookupUnRegStakeTxCert :: TxCert AlonzoEra -> Maybe (Credential Staking)
lookupUnRegStakeTxCert = \case
    UnRegTxCert Credential Staking
c -> Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
    TxCert AlonzoEra
_ -> Maybe (Credential Staking)
forall a. Maybe a
Nothing

  getTotalDepositsTxCerts :: forall (f :: * -> *).
Foldable f =>
PParams AlonzoEra
-> (KeyHash StakePool -> Bool) -> f (TxCert AlonzoEra) -> Coin
getTotalDepositsTxCerts = PParams AlonzoEra
-> (KeyHash StakePool -> Bool) -> f (TxCert AlonzoEra) -> Coin
forall era (f :: * -> *).
(EraPParams era, Foldable f, EraTxCert era) =>
PParams era
-> (KeyHash StakePool -> Bool) -> f (TxCert era) -> Coin
shelleyTotalDepositsTxCerts

  getTotalRefundsTxCerts :: forall (f :: * -> *).
Foldable f =>
PParams AlonzoEra
-> (Credential Staking -> Maybe Coin)
-> (Credential DRepRole -> Maybe Coin)
-> f (TxCert AlonzoEra)
-> Coin
getTotalRefundsTxCerts PParams AlonzoEra
pp Credential Staking -> Maybe Coin
lookupStakeDeposit Credential DRepRole -> Maybe Coin
_ = PParams AlonzoEra
-> (Credential Staking -> Maybe Coin)
-> f (TxCert AlonzoEra)
-> Coin
forall era (f :: * -> *).
(EraPParams era, Foldable f, EraTxCert era) =>
PParams era
-> (Credential Staking -> Maybe Coin) -> f (TxCert era) -> Coin
shelleyTotalRefundsTxCerts PParams AlonzoEra
pp Credential Staking -> Maybe Coin
lookupStakeDeposit

instance ShelleyEraTxCert AlonzoEra where
  mkRegTxCert :: Credential Staking -> TxCert AlonzoEra
mkRegTxCert = ShelleyDelegCert -> ShelleyTxCert AlonzoEra
forall era. ShelleyDelegCert -> ShelleyTxCert era
ShelleyTxCertDelegCert (ShelleyDelegCert -> ShelleyTxCert AlonzoEra)
-> (Credential Staking -> ShelleyDelegCert)
-> Credential Staking
-> ShelleyTxCert AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Credential Staking -> ShelleyDelegCert
ShelleyRegCert

  getRegTxCert :: TxCert AlonzoEra -> Maybe (Credential Staking)
getRegTxCert (ShelleyTxCertDelegCert (ShelleyRegCert Credential Staking
c)) = Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
  getRegTxCert TxCert AlonzoEra
_ = Maybe (Credential Staking)
forall a. Maybe a
Nothing

  mkUnRegTxCert :: Credential Staking -> TxCert AlonzoEra
mkUnRegTxCert = ShelleyDelegCert -> ShelleyTxCert AlonzoEra
forall era. ShelleyDelegCert -> ShelleyTxCert era
ShelleyTxCertDelegCert (ShelleyDelegCert -> ShelleyTxCert AlonzoEra)
-> (Credential Staking -> ShelleyDelegCert)
-> Credential Staking
-> ShelleyTxCert AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Credential Staking -> ShelleyDelegCert
ShelleyUnRegCert

  getUnRegTxCert :: TxCert AlonzoEra -> Maybe (Credential Staking)
getUnRegTxCert (ShelleyTxCertDelegCert (ShelleyUnRegCert Credential Staking
c)) = Credential Staking -> Maybe (Credential Staking)
forall a. a -> Maybe a
Just Credential Staking
c
  getUnRegTxCert TxCert AlonzoEra
_ = Maybe (Credential Staking)
forall a. Maybe a
Nothing

  mkDelegStakeTxCert :: Credential Staking -> KeyHash StakePool -> TxCert AlonzoEra
mkDelegStakeTxCert Credential Staking
c KeyHash StakePool
kh = ShelleyDelegCert -> ShelleyTxCert AlonzoEra
forall era. ShelleyDelegCert -> ShelleyTxCert era
ShelleyTxCertDelegCert (ShelleyDelegCert -> ShelleyTxCert AlonzoEra)
-> ShelleyDelegCert -> ShelleyTxCert AlonzoEra
forall a b. (a -> b) -> a -> b
$ Credential Staking -> KeyHash StakePool -> ShelleyDelegCert
ShelleyDelegCert Credential Staking
c KeyHash StakePool
kh

  getDelegStakeTxCert :: TxCert AlonzoEra -> Maybe (Credential Staking, KeyHash StakePool)
getDelegStakeTxCert (ShelleyTxCertDelegCert (ShelleyDelegCert Credential Staking
c KeyHash StakePool
kh)) = (Credential Staking, KeyHash StakePool)
-> Maybe (Credential Staking, KeyHash StakePool)
forall a. a -> Maybe a
Just (Credential Staking
c, KeyHash StakePool
kh)
  getDelegStakeTxCert TxCert AlonzoEra
_ = Maybe (Credential Staking, KeyHash StakePool)
forall a. Maybe a
Nothing

  mkGenesisDelegTxCert :: AtMostEra "Babbage" AlonzoEra =>
GenesisDelegCert -> TxCert AlonzoEra
mkGenesisDelegTxCert = GenesisDelegCert -> TxCert AlonzoEra
GenesisDelegCert -> ShelleyTxCert AlonzoEra
forall era. GenesisDelegCert -> ShelleyTxCert era
ShelleyTxCertGenesisDeleg

  getGenesisDelegTxCert :: AtMostEra "Babbage" AlonzoEra =>
TxCert AlonzoEra -> Maybe GenesisDelegCert
getGenesisDelegTxCert (ShelleyTxCertGenesisDeleg GenesisDelegCert
c) = GenesisDelegCert -> Maybe GenesisDelegCert
forall a. a -> Maybe a
Just GenesisDelegCert
c
  getGenesisDelegTxCert TxCert AlonzoEra
_ = Maybe GenesisDelegCert
forall a. Maybe a
Nothing

  mkMirTxCert :: AtMostEra "Babbage" AlonzoEra => MIRCert -> TxCert AlonzoEra
mkMirTxCert = MIRCert -> TxCert AlonzoEra
MIRCert -> ShelleyTxCert AlonzoEra
forall era. MIRCert -> ShelleyTxCert era
ShelleyTxCertMir

  getMirTxCert :: AtMostEra "Babbage" AlonzoEra => TxCert AlonzoEra -> Maybe MIRCert
getMirTxCert (ShelleyTxCertMir MIRCert
c) = MIRCert -> Maybe MIRCert
forall a. a -> Maybe a
Just MIRCert
c
  getMirTxCert TxCert AlonzoEra
_ = Maybe MIRCert
forall a. Maybe a
Nothing