{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.CLI.Compatible.StakeAddress.Run
  ( runCompatibleStakeAddressCmds
  )
where

import Cardano.Api hiding (makeStakeAddressRegistrationCertificate)
import Cardano.Api.Compatible.Certificate
import Cardano.Api.Experimental qualified as Exp
import Cardano.Api.Ledger qualified as L

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.Compatible.StakeAddress.Command
import Cardano.CLI.Read
import Cardano.CLI.Type.Key

runCompatibleStakeAddressCmds
  :: ()
  => CompatibleStakeAddressCmds era
  -> CIO e ()
runCompatibleStakeAddressCmds :: forall era e. CompatibleStakeAddressCmds era -> CIO e ()
runCompatibleStakeAddressCmds = \case
  CompatibleStakeAddressRegistrationCertificateCmd ShelleyBasedEra era
sbe StakeIdentifier
stakeIdentifier Maybe Coin
mDeposit File () 'Out
outputFp ->
    ShelleyBasedEra era
-> StakeIdentifier -> Maybe Coin -> File () 'Out -> CIO e ()
forall era e.
ShelleyBasedEra era
-> StakeIdentifier -> Maybe Coin -> File () 'Out -> CIO e ()
runStakeAddressRegistrationCertificateCmd ShelleyBasedEra era
sbe StakeIdentifier
stakeIdentifier Maybe Coin
mDeposit File () 'Out
outputFp
  CompatibleStakeAddressStakeDelegationCertificateCmd
    ShelleyBasedEra era
sbe
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
stkPoolVerKeyHashOrFp
    File () 'Out
outputFp ->
      ShelleyBasedEra era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
forall era e.
ShelleyBasedEra era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
runStakeAddressStakeDelegationCertificateCmd ShelleyBasedEra era
sbe StakeIdentifier
stakeIdentifier StakePoolKeyHashSource
stkPoolVerKeyHashOrFp File () 'Out
outputFp

runStakeAddressRegistrationCertificateCmd
  :: ()
  => forall era e
   . ShelleyBasedEra era
  -> StakeIdentifier
  -> Maybe L.Coin
  -- ^ Deposit required in conway era
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationCertificateCmd :: forall era e.
ShelleyBasedEra era
-> StakeIdentifier -> Maybe Coin -> File () 'Out -> CIO e ()
runStakeAddressRegistrationCertificateCmd ShelleyBasedEra era
sbe StakeIdentifier
stakeIdentifier Maybe Coin
mDeposit File () 'Out
oFp = do
  StakeCredential
stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeIdentifier
  Certificate (ShelleyLedgerEra era)
regCert <- ShelleyBasedEra era
-> StakeCredential
-> Maybe Coin
-> CIO e (Certificate (ShelleyLedgerEra era))
forall era e.
ShelleyBasedEra era
-> StakeCredential
-> Maybe Coin
-> CIO e (Certificate (ShelleyLedgerEra era))
createRegCert ShelleyBasedEra era
sbe StakeCredential
stakeCred Maybe Coin
mDeposit
  forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
IO (Either e a) -> m a
fromEitherIOCli @(FileError ())
    (IO (Either (FileError ()) ()) -> RIO e ())
-> IO (Either (FileError ()) ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ File () 'Out -> ByteString -> IO (Either (FileError ()) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile
      File () 'Out
oFp
    (ByteString -> IO (Either (FileError ()) ()))
-> ByteString -> IO (Either (FileError ()) ())
forall a b. (a -> b) -> a -> b
$ ShelleyBasedEra era
-> (ShelleyBasedEraConstraints era => ByteString) -> ByteString
forall era a.
ShelleyBasedEra era -> (ShelleyBasedEraConstraints era => a) -> a
shelleyBasedEraConstraints ShelleyBasedEra era
sbe
    ((ShelleyBasedEraConstraints era => ByteString) -> ByteString)
-> (ShelleyBasedEraConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$ Maybe TextEnvelopeDescr
-> Certificate (ShelleyLedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
regCertDesc) Certificate (ShelleyLedgerEra era)
regCert
 where
  regCertDesc :: TextEnvelopeDescr
  regCertDesc :: TextEnvelopeDescr
regCertDesc = TextEnvelopeDescr
"Stake Address Registration Certificate"

  createRegCert
    :: ShelleyBasedEra era
    -> StakeCredential
    -> Maybe L.Coin
    -> CIO e (Exp.Certificate (ShelleyLedgerEra era))
  createRegCert :: forall era e.
ShelleyBasedEra era
-> StakeCredential
-> Maybe Coin
-> CIO e (Certificate (ShelleyLedgerEra era))
createRegCert ShelleyBasedEra era
sbe' StakeCredential
sCred Maybe Coin
mDep =
    case ShelleyBasedEra era
sbe' of
      ShelleyBasedEra era
ShelleyBasedEraShelley ->
        Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements ShelleyEra
-> Certificate (ShelleyLedgerEra ShelleyEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate StakeCredential
StakeRegistrationRequirements ShelleyEra
sCred
      ShelleyBasedEra era
ShelleyBasedEraAllegra ->
        Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements AllegraEra
-> Certificate (ShelleyLedgerEra AllegraEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate StakeCredential
StakeRegistrationRequirements AllegraEra
sCred
      ShelleyBasedEra era
ShelleyBasedEraMary ->
        Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements MaryEra
-> Certificate (ShelleyLedgerEra MaryEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate StakeCredential
StakeRegistrationRequirements MaryEra
sCred
      ShelleyBasedEra era
ShelleyBasedEraAlonzo ->
        Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements AlonzoEra
-> Certificate (ShelleyLedgerEra AlonzoEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate StakeCredential
StakeRegistrationRequirements AlonzoEra
sCred
      ShelleyBasedEra era
ShelleyBasedEraBabbage ->
        Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements BabbageEra
-> Certificate (ShelleyLedgerEra BabbageEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate StakeCredential
StakeRegistrationRequirements BabbageEra
sCred
      ShelleyBasedEra era
ShelleyBasedEraConway ->
        case Maybe Coin
mDep of
          Maybe Coin
Nothing ->
            forall e (m :: * -> *) a.
(HasCallStack, Show e, Typeable e, Error e, MonadIO m) =>
e -> m a
throwCliError @String String
"Deposit required for stake address registration certificate in Conway era"
          Just Coin
dep ->
            Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements ConwayEra
-> Certificate (ShelleyLedgerEra ConwayEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate (StakeRegistrationRequirements ConwayEra
 -> Certificate (ShelleyLedgerEra ConwayEra))
-> StakeRegistrationRequirements ConwayEra
-> Certificate (ShelleyLedgerEra ConwayEra)
forall a b. (a -> b) -> a -> b
$ StakeCredential -> Coin -> StakeCredentialAndDeposit
StakeCredentialAndDeposit StakeCredential
sCred Coin
dep
      ShelleyBasedEra era
ShelleyBasedEraDijkstra ->
        case Maybe Coin
mDep of
          Maybe Coin
Nothing ->
            forall e (m :: * -> *) a.
(HasCallStack, Show e, Typeable e, Error e, MonadIO m) =>
e -> m a
throwCliError @String String
"Deposit required for stake address registration certificate in Dijkstra era"
          Just Coin
dep ->
            Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a. a -> RIO e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Certificate (ShelleyLedgerEra era)
 -> RIO e (Certificate (ShelleyLedgerEra era)))
-> Certificate (ShelleyLedgerEra era)
-> RIO e (Certificate (ShelleyLedgerEra era))
forall a b. (a -> b) -> a -> b
$ StakeRegistrationRequirements DijkstraEra
-> Certificate (ShelleyLedgerEra DijkstraEra)
forall era.
IsShelleyBasedEra era =>
StakeRegistrationRequirements era
-> Certificate (ShelleyLedgerEra era)
makeStakeAddressRegistrationCertificate (StakeRegistrationRequirements DijkstraEra
 -> Certificate (ShelleyLedgerEra DijkstraEra))
-> StakeRegistrationRequirements DijkstraEra
-> Certificate (ShelleyLedgerEra DijkstraEra)
forall a b. (a -> b) -> a -> b
$ StakeCredential -> Coin -> StakeCredentialAndDeposit
StakeCredentialAndDeposit StakeCredential
sCred Coin
dep

runStakeAddressStakeDelegationCertificateCmd
  :: ()
  => ShelleyBasedEra era
  -> StakeIdentifier
  -- ^ Delegator stake verification key, verification key file or script file.
  -> StakePoolKeyHashSource
  -- ^ Delegatee stake pool verification key or verification key file or
  -- verification key hash.
  -> File () Out
  -> CIO e ()
runStakeAddressStakeDelegationCertificateCmd :: forall era e.
ShelleyBasedEra era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
runStakeAddressStakeDelegationCertificateCmd ShelleyBasedEra era
sbe StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile File () 'Out
outFp =
  ShelleyBasedEra era
-> (ShelleyBasedEraConstraints era => RIO e ()) -> RIO e ()
forall era a.
ShelleyBasedEra era -> (ShelleyBasedEraConstraints era => a) -> a
shelleyBasedEraConstraints ShelleyBasedEra era
sbe ((ShelleyBasedEraConstraints era => RIO e ()) -> RIO e ())
-> (ShelleyBasedEraConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ do
    Hash StakePoolKey
poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

    StakeCredential
stakeCred <- StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

    let certificate :: Certificate (ShelleyLedgerEra era)
certificate =
          ShelleyBasedEra era
-> StakeCredential
-> Hash StakePoolKey
-> Certificate (ShelleyLedgerEra era)
forall era.
ShelleyBasedEra era
-> StakeCredential
-> Hash StakePoolKey
-> Certificate (ShelleyLedgerEra era)
createStakeDelegationCertificate ShelleyBasedEra era
sbe StakeCredential
stakeCred Hash StakePoolKey
poolStakeVKeyHash

    forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
IO (Either e a) -> m a
fromEitherIOCli @(FileError ()) (IO (Either (FileError ()) ()) -> RIO e ())
-> IO (Either (FileError ()) ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$
      File () 'Out -> ByteString -> IO (Either (FileError ()) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile File () 'Out
outFp (ByteString -> IO (Either (FileError ()) ()))
-> ByteString -> IO (Either (FileError ()) ())
forall a b. (a -> b) -> a -> b
$
        Maybe TextEnvelopeDescr
-> Certificate (ShelleyLedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake Delegation Certificate") Certificate (ShelleyLedgerEra era)
certificate

createStakeDelegationCertificate
  :: ShelleyBasedEra era
  -> StakeCredential
  -> Hash StakePoolKey
  -> Exp.Certificate (ShelleyLedgerEra era)
createStakeDelegationCertificate :: forall era.
ShelleyBasedEra era
-> StakeCredential
-> Hash StakePoolKey
-> Certificate (ShelleyLedgerEra era)
createStakeDelegationCertificate ShelleyBasedEra era
sbe StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash = do
  case ShelleyBasedEra era
sbe of
    ShelleyBasedEra era
ShelleyBasedEraShelley ->
      StakeCredential -> Hash StakePoolKey -> Certificate ShelleyEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ShelleyEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraAllegra ->
      StakeCredential -> Hash StakePoolKey -> Certificate AllegraEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ShelleyEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraMary ->
      StakeCredential -> Hash StakePoolKey -> Certificate MaryEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ShelleyEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraAlonzo ->
      StakeCredential -> Hash StakePoolKey -> Certificate AlonzoEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ShelleyEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraBabbage ->
      StakeCredential -> Hash StakePoolKey -> Certificate BabbageEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ShelleyEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraConway ->
      StakeCredential -> Hash StakePoolKey -> Certificate ConwayEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ConwayEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
conwayOnwards StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
    ShelleyBasedEra era
ShelleyBasedEraDijkstra ->
      StakeCredential -> Hash StakePoolKey -> Certificate DijkstraEra
forall {era}.
(Assert
   (OrdCond
      (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False)
   (TypeError ...),
 Assert
   (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False)
   (TypeError ...),
 ConwayEraTxCert era) =>
StakeCredential -> Hash StakePoolKey -> Certificate era
conwayOnwards StakeCredential
stakeCredential Hash StakePoolKey
stakePoolHash
 where
  shelleyToBabbage :: StakeCredential -> Hash StakePoolKey -> Certificate era
shelleyToBabbage StakeCredential
scred Hash StakePoolKey
sPoolHash =
    TxCert era -> Certificate era
forall era. EraTxCert era => TxCert era -> Certificate era
Exp.Certificate (TxCert era -> Certificate era) -> TxCert era -> Certificate era
forall a b. (a -> b) -> a -> b
$
      StakeCredential -> KeyHash 'StakePool -> TxCert era
forall era.
ShelleyEraTxCert era =>
StakeCredential -> KeyHash 'StakePool -> TxCert era
L.mkDelegStakeTxCert (StakeCredential -> StakeCredential
toShelleyStakeCredential StakeCredential
scred) (Hash StakePoolKey -> KeyHash 'StakePool
toLedgerHash Hash StakePoolKey
sPoolHash)
  conwayOnwards :: StakeCredential -> Hash StakePoolKey -> Certificate era
conwayOnwards StakeCredential
scred Hash StakePoolKey
sPoolHash =
    TxCert era -> Certificate era
forall era. EraTxCert era => TxCert era -> Certificate era
Exp.Certificate (TxCert era -> Certificate era) -> TxCert era -> Certificate era
forall a b. (a -> b) -> a -> b
$
      StakeCredential -> Delegatee -> TxCert era
forall era.
ConwayEraTxCert era =>
StakeCredential -> Delegatee -> TxCert era
L.mkDelegTxCert
        (StakeCredential -> StakeCredential
toShelleyStakeCredential StakeCredential
scred)
        (KeyHash 'StakePool -> Delegatee
L.DelegStake (Hash StakePoolKey -> KeyHash 'StakePool
toLedgerHash Hash StakePoolKey
sPoolHash))
  toLedgerHash :: Hash StakePoolKey -> L.KeyHash L.StakePool
  toLedgerHash :: Hash StakePoolKey -> KeyHash 'StakePool
toLedgerHash (StakePoolKeyHash KeyHash 'StakePool
poolStakeVKeyHash) = KeyHash 'StakePool
poolStakeVKeyHash