{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

module Cardano.CLI.EraBased.StakeAddress.Run
  ( runStakeAddressCmds
  , runStakeAddressBuildCmd
  , runStakeAddressKeyGenCmd
  , runStakeAddressKeyHashCmd
  , runStakeAddressStakeDelegationCertificateCmd
  , runStakeAddressDeregistrationCertificateCmd
  , runStakeAddressRegistrationCertificateCmd
  , runStakeAddressRegistrationAndDelegationCertificateCmd
  , runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
  )
where

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

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.EraBased.StakeAddress.Command
import Cardano.CLI.EraIndependent.Key.Run qualified as Key
import Cardano.CLI.Orphan ()
import Cardano.CLI.Read
import Cardano.CLI.Type.Common
import Cardano.CLI.Type.Governance
import Cardano.CLI.Type.Key

import RIO

import Data.ByteString.Char8 qualified as BS
import Data.Text.IO qualified as Text
import Vary (Vary)
import Vary qualified

runStakeAddressCmds
  :: ()
  => forall era e
   . StakeAddressCmds era
  -> CIO e ()
runStakeAddressCmds :: forall era e. StakeAddressCmds era -> CIO e ()
runStakeAddressCmds = \case
  StakeAddressKeyGenCmd Vary '[FormatBech32, FormatTextEnvelope]
fmt VerificationKeyFile 'Out
vk SigningKeyFile 'Out
sk ->
    RIO e (VerificationKey StakeKey, SigningKey StakeKey) -> RIO e ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (RIO e (VerificationKey StakeKey, SigningKey StakeKey) -> RIO e ())
-> RIO e (VerificationKey StakeKey, SigningKey StakeKey)
-> RIO e ()
forall a b. (a -> b) -> a -> b
$ Vary '[FormatBech32, FormatTextEnvelope]
-> VerificationKeyFile 'Out
-> SigningKeyFile 'Out
-> CIO e (VerificationKey StakeKey, SigningKey StakeKey)
forall e.
Vary '[FormatBech32, FormatTextEnvelope]
-> VerificationKeyFile 'Out
-> SigningKeyFile 'Out
-> CIO e (VerificationKey StakeKey, SigningKey StakeKey)
runStakeAddressKeyGenCmd Vary '[FormatBech32, FormatTextEnvelope]
fmt VerificationKeyFile 'Out
vk SigningKeyFile 'Out
sk
  StakeAddressKeyHashCmd VerificationKeyOrFile StakeKey
vk Maybe (File () 'Out)
mOutputFp ->
    VerificationKeyOrFile StakeKey -> Maybe (File () 'Out) -> CIO e ()
forall e.
VerificationKeyOrFile StakeKey -> Maybe (File () 'Out) -> CIO e ()
runStakeAddressKeyHashCmd VerificationKeyOrFile StakeKey
vk Maybe (File () 'Out)
mOutputFp
  StakeAddressBuildCmd StakeVerifier
stakeVerifier NetworkId
nw Maybe (File () 'Out)
mOutputFp ->
    StakeVerifier -> NetworkId -> Maybe (File () 'Out) -> CIO e ()
forall e.
StakeVerifier -> NetworkId -> Maybe (File () 'Out) -> CIO e ()
runStakeAddressBuildCmd StakeVerifier
stakeVerifier NetworkId
nw Maybe (File () 'Out)
mOutputFp
  StakeAddressRegistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Coin
mDeposit File () 'Out
outputFp ->
    Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
forall era e.
Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
runStakeAddressRegistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Coin
mDeposit File () 'Out
outputFp
  StakeAddressStakeDelegationCertificateCmd
    Era era
era
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
stkPoolVerKeyHashOrFp
    File () 'Out
outputFp ->
      Era era -> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall era a. Era era -> (EraCommonConstraints era => a) -> a
Exp.obtainCommonConstraints Era era
era ((EraCommonConstraints era => RIO e ()) -> RIO e ())
-> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$
        Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
forall era e.
IsEra era =>
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
runStakeAddressStakeDelegationCertificateCmd
          Era era
era
          StakeIdentifier
stakeIdentifier
          StakePoolKeyHashSource
stkPoolVerKeyHashOrFp
          File () 'Out
outputFp
  StakeAddressStakeAndVoteDelegationCertificateCmd
    Era era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
stakePoolVerificationKeyHashSource
    VoteDelegationTarget
voteDelegationTarget
    File () 'Out
outputFp ->
      Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressStakeAndVoteDelegationCertificateCmd
        Era era
w
        StakeIdentifier
stakeIdentifier
        StakePoolKeyHashSource
stakePoolVerificationKeyHashSource
        VoteDelegationTarget
voteDelegationTarget
        File () 'Out
outputFp
  StakeAddressVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeIdentifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outputFp ->
    Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
forall era e.
Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeIdentifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outputFp
  StakeAddressDeregistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Coin
deposit File () 'Out
outputFp ->
    Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
forall era e.
Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
runStakeAddressDeregistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Coin
deposit File () 'Out
outputFp
  StakeAddressRegistrationAndDelegationCertificateCmd
    Era era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
poolVKeyOrHashOrFile
    Coin
deposit
    File () 'Out
outFp ->
      Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd
        Era era
w
        StakeIdentifier
stakeIdentifier
        StakePoolKeyHashSource
poolVKeyOrHashOrFile
        Coin
deposit
        File () 'Out
outFp
  StakeAddressRegistrationAndVoteDelegationCertificateCmd
    Era era
w
    StakeIdentifier
stakeIdentifier
    VoteDelegationTarget
voteDelegationTarget
    Coin
keydeposit
    File () 'Out
outFp ->
      Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd
        Era era
w
        StakeIdentifier
stakeIdentifier
        VoteDelegationTarget
voteDelegationTarget
        Coin
keydeposit
        File () 'Out
outFp
  StakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
    Era era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
poolVKeyOrHashOrFile
    VoteDelegationTarget
voteDelegationTarget
    Coin
keydeposit
    File () 'Out
outFp ->
      Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
        Era era
w
        StakeIdentifier
stakeIdentifier
        StakePoolKeyHashSource
poolVKeyOrHashOrFile
        VoteDelegationTarget
voteDelegationTarget
        Coin
keydeposit
        File () 'Out
outFp

runStakeAddressKeyGenCmd
  :: Vary [FormatBech32, FormatTextEnvelope]
  -> VerificationKeyFile Out
  -> SigningKeyFile Out
  -> CIO e (VerificationKey StakeKey, SigningKey StakeKey)
runStakeAddressKeyGenCmd :: forall e.
Vary '[FormatBech32, FormatTextEnvelope]
-> VerificationKeyFile 'Out
-> SigningKeyFile 'Out
-> CIO e (VerificationKey StakeKey, SigningKey StakeKey)
runStakeAddressKeyGenCmd Vary '[FormatBech32, FormatTextEnvelope]
fmt VerificationKeyFile 'Out
vkFp SigningKeyFile 'Out
skFp = do
  let skeyDesc :: TextEnvelopeDescr
skeyDesc = TextEnvelopeDescr
"Stake Signing Key"

  skey <- AsType StakeKey -> RIO e (SigningKey StakeKey)
forall (m :: * -> *) keyrole.
(MonadIO m, Key keyrole) =>
AsType keyrole -> m (SigningKey keyrole)
generateSigningKey AsType StakeKey
AsStakeKey

  let vkey = SigningKey StakeKey -> VerificationKey StakeKey
forall keyrole.
(Key keyrole, HasTypeProxy keyrole) =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey StakeKey
skey

  void $
    fmt
      & ( id
            . Vary.on
              ( \FormatBech32
FormatBech32 ->
                  SigningKeyFile 'Out
-> Text -> RIO e (Either (FileError (ZonkAny 0)) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> Text -> m (Either (FileError e) ())
writeTextFile SigningKeyFile 'Out
skFp (Text -> RIO e (Either (FileError (ZonkAny 0)) ()))
-> Text -> RIO e (Either (FileError (ZonkAny 0)) ())
forall a b. (a -> b) -> a -> b
$ SigningKey StakeKey -> Text
forall a. SerialiseAsBech32 a => a -> Text
serialiseToBech32 SigningKey StakeKey
skey
              )
            . Vary.on
              ( \FormatTextEnvelope
FormatTextEnvelope ->
                  SigningKeyFile 'Out
-> ByteString -> RIO e (Either (FileError (ZonkAny 0)) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile SigningKeyFile 'Out
skFp (ByteString -> RIO e (Either (FileError (ZonkAny 0)) ()))
-> ByteString -> RIO e (Either (FileError (ZonkAny 0)) ())
forall a b. (a -> b) -> a -> b
$ Maybe TextEnvelopeDescr -> SigningKey StakeKey -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey StakeKey
skey
              )
            $ Vary.exhaustiveCase
        )

  void $
    fmt
      & ( id
            . Vary.on
              ( \FormatBech32
FormatBech32 ->
                  VerificationKeyFile 'Out
-> Text -> RIO e (Either (FileError (ZonkAny 1)) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> Text -> m (Either (FileError e) ())
writeTextFile VerificationKeyFile 'Out
vkFp (Text -> RIO e (Either (FileError (ZonkAny 1)) ()))
-> Text -> RIO e (Either (FileError (ZonkAny 1)) ())
forall a b. (a -> b) -> a -> b
$ VerificationKey StakeKey -> Text
forall a. SerialiseAsBech32 a => a -> Text
serialiseToBech32 VerificationKey StakeKey
vkey
              )
            . Vary.on
              ( \FormatTextEnvelope
FormatTextEnvelope ->
                  VerificationKeyFile 'Out
-> ByteString -> RIO e (Either (FileError (ZonkAny 1)) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile VerificationKeyFile 'Out
vkFp (ByteString -> RIO e (Either (FileError (ZonkAny 1)) ()))
-> ByteString -> RIO e (Either (FileError (ZonkAny 1)) ())
forall a b. (a -> b) -> a -> b
$ Maybe TextEnvelopeDescr -> VerificationKey StakeKey -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
Key.stakeVkeyDesc) VerificationKey StakeKey
vkey
              )
            $ Vary.exhaustiveCase
        )

  return (vkey, skey)

runStakeAddressKeyHashCmd
  :: ()
  => VerificationKeyOrFile StakeKey
  -> Maybe (File () Out)
  -> CIO e ()
runStakeAddressKeyHashCmd :: forall e.
VerificationKeyOrFile StakeKey -> Maybe (File () 'Out) -> CIO e ()
runStakeAddressKeyHashCmd VerificationKeyOrFile StakeKey
stakeVerKeyOrFile Maybe (File () 'Out)
mOutputFp = do
  vkey <-
    VerificationKeyOrFile StakeKey -> CIO e (VerificationKey StakeKey)
forall keyrole e.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
VerificationKeyOrFile keyrole -> CIO e (VerificationKey keyrole)
readVerificationKeyOrFile VerificationKeyOrFile StakeKey
stakeVerKeyOrFile

  let hexKeyHash = Hash StakeKey -> ByteString
forall a. SerialiseAsRawBytes a => a -> ByteString
serialiseToRawBytesHex (VerificationKey StakeKey -> Hash StakeKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey StakeKey
vkey)

  case mOutputFp of
    Just (File String
fpath) -> IO () -> RIO e ()
forall a. IO a -> RIO e a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> RIO e ()) -> IO () -> RIO e ()
forall a b. (a -> b) -> a -> b
$ String -> ByteString -> IO ()
BS.writeFile String
fpath ByteString
hexKeyHash
    Maybe (File () 'Out)
Nothing -> IO () -> RIO e ()
forall a. IO a -> RIO e a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> RIO e ()) -> IO () -> RIO e ()
forall a b. (a -> b) -> a -> b
$ ByteString -> IO ()
BS.putStrLn ByteString
hexKeyHash

runStakeAddressBuildCmd
  :: ()
  => StakeVerifier
  -> NetworkId
  -> Maybe (File () Out)
  -> CIO e ()
runStakeAddressBuildCmd :: forall e.
StakeVerifier -> NetworkId -> Maybe (File () 'Out) -> CIO e ()
runStakeAddressBuildCmd StakeVerifier
stakeVerifier NetworkId
network Maybe (File () 'Out)
mOutputFp = do
  stakeAddr <-
    NetworkId -> StakeVerifier -> CIO e StakeAddress
forall e. NetworkId -> StakeVerifier -> CIO e StakeAddress
getStakeAddressFromVerifier NetworkId
network StakeVerifier
stakeVerifier
  let stakeAddrText = StakeAddress -> Text
forall addr. SerialiseAddress addr => addr -> Text
serialiseAddress StakeAddress
stakeAddr
  liftIO $
    case mOutputFp of
      Just (File String
fpath) -> String -> Text -> IO ()
Text.writeFile String
fpath Text
stakeAddrText
      Maybe (File () 'Out)
Nothing -> Text -> IO ()
Text.putStrLn Text
stakeAddrText

runStakeAddressRegistrationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -> Lovelace
  -- ^ Deposit required in conway era
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationCertificateCmd :: forall era e.
Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
runStakeAddressRegistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Coin
deposit File () 'Out
oFp = do
  stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier
      StakeIdentifier
stakeIdentifier

  let regCert =
        Era era
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => Certificate (LedgerEra era))
 -> Certificate (LedgerEra era))
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall a b. (a -> b) -> a -> b
$
          StakeCredential -> Coin -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Coin -> Certificate (LedgerEra era)
Exp.makeStakeAddressRegistrationCertificate StakeCredential
stakeCred Coin
deposit
          :: Exp.Certificate (Exp.LedgerEra era)

  fromEitherIOCli @(FileError ()) $
    writeLazyByteStringFile oFp $
      obtainCommonConstraints era $
        textEnvelopeToJSON (Just regCertDesc) regCert
 where
  regCertDesc :: TextEnvelopeDescr
  regCertDesc :: TextEnvelopeDescr
regCertDesc = TextEnvelopeDescr
"Stake Address Registration Certificate"

runStakeAddressStakeDelegationCertificateCmd
  :: forall era e
   . Exp.IsEra era
  => Exp.Era 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.
IsEra era =>
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> File () 'Out
-> CIO e ()
runStakeAddressStakeDelegationCertificateCmd Era era
era StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile File () 'Out
outFp =
  Era era -> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => RIO e ()) -> RIO e ())
-> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ do
    poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

    stakeCred <-
      getStakeCredentialFromIdentifier stakeVerifier

    let certificate :: Exp.Certificate (Exp.LedgerEra era) = createStakeDelegationCertificate stakeCred poolStakeVKeyHash

    fromEitherIOCli @(FileError ()) $
      writeLazyByteStringFile outFp $
        textEnvelopeToJSON (Just @TextEnvelopeDescr "Stake Delegation Certificate") certificate

runStakeAddressStakeAndVoteDelegationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -- ^ Delegator stake verification key, verification key file or script file.
  -> StakePoolKeyHashSource
  -- ^ Delegatee stake pool verification key or verification key file or
  -> VoteDelegationTarget
  -- verification key hash.
  -> File () Out
  -> CIO e ()
runStakeAddressStakeAndVoteDelegationCertificateCmd :: forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressStakeAndVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile VoteDelegationTarget
voteDelegationTarget File () 'Out
outFp = do
  StakePoolKeyHash poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

  stakeCredential <-
    getStakeCredentialFromIdentifier stakeVerifier

  drep <-
    readVoteDelegationTarget voteDelegationTarget

  let delegatee = KeyHash 'StakePool -> DRep -> Delegatee
L.DelegStakeVote KeyHash 'StakePool
poolStakeVKeyHash DRep
drep

  certificate :: Exp.Certificate (Exp.LedgerEra era) <-
    return $
      obtainCommonConstraints w $
        Exp.Certificate $
          L.mkDelegTxCert (toShelleyStakeCredential stakeCredential) delegatee

  fromEitherIOCli @(FileError ()) $
    writeLazyByteStringFile outFp $
      obtainCommonConstraints w $
        textEnvelopeToJSON (Just @TextEnvelopeDescr "Stake and Vote Delegation Certificate") certificate

runStakeAddressVoteDelegationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -- ^ Delegatee stake pool verification key or verification key file or
  -> VoteDelegationTarget
  -- ^ Delegatee stake pool verification key or verification key file or verification key hash.
  -> File () Out
  -> CIO e ()
runStakeAddressVoteDelegationCertificateCmd :: forall era e.
Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeVerifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outFp = do
  stakeCredential <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

  drep <-
    readVoteDelegationTarget voteDelegationTarget

  let delegatee = DRep -> Delegatee
L.DelegVote DRep
drep

  let certificate :: Exp.Certificate (Exp.LedgerEra era) =
        obtainCommonConstraints w $
          Exp.Certificate $
            L.mkDelegTxCert (toShelleyStakeCredential stakeCredential) delegatee

  fromEitherIOCli @(FileError ())
    $ writeLazyByteStringFile
      outFp
    $ obtainCommonConstraints w
    $ textEnvelopeToJSON (Just @TextEnvelopeDescr "Vote Delegation Certificate") certificate

createStakeDelegationCertificate
  :: forall era
   . Exp.IsEra era
  => StakeCredential
  -> Hash StakePoolKey
  -> Exp.Certificate (Exp.LedgerEra era)
createStakeDelegationCertificate :: forall era.
IsEra era =>
StakeCredential -> Hash StakePoolKey -> Certificate (LedgerEra era)
createStakeDelegationCertificate StakeCredential
stakeCredential (StakePoolKeyHash KeyHash 'StakePool
poolStakeVKeyHash) = do
  let w :: Era era
w = Era era -> Era era
forall era. Era era -> Era era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert (Era era -> Era era) -> Era era -> Era era
forall a b. (a -> b) -> a -> b
$ forall era. IsEra era => Era era
Exp.useEra @era
  Era era
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
w ((EraCommonConstraints era => Certificate (LedgerEra era))
 -> Certificate (LedgerEra era))
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall a b. (a -> b) -> a -> b
$
    TxCert (LedgerEra era) -> Certificate (LedgerEra era)
forall era. EraTxCert era => TxCert era -> Certificate era
Exp.Certificate (TxCert (LedgerEra era) -> Certificate (LedgerEra era))
-> TxCert (LedgerEra era) -> Certificate (LedgerEra era)
forall a b. (a -> b) -> a -> b
$
      StakeCredential -> Delegatee -> TxCert (LedgerEra era)
forall era.
ConwayEraTxCert era =>
StakeCredential -> Delegatee -> TxCert era
L.mkDelegTxCert (StakeCredential -> StakeCredential
toShelleyStakeCredential StakeCredential
stakeCredential) (KeyHash 'StakePool -> Delegatee
L.DelegStake KeyHash 'StakePool
poolStakeVKeyHash)

runStakeAddressDeregistrationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -> Lovelace
  -- ^ Deposit required in conway era
  -> File () Out
  -> CIO e ()
runStakeAddressDeregistrationCertificateCmd :: forall era e.
Era era -> StakeIdentifier -> Coin -> File () 'Out -> CIO e ()
runStakeAddressDeregistrationCertificateCmd Era era
era StakeIdentifier
stakeVerifier Coin
deposit File () 'Out
oFp = do
  stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

  let deRegCert =
        Era era
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => Certificate (LedgerEra era))
 -> Certificate (LedgerEra era))
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall a b. (a -> b) -> a -> b
$
          StakeCredential -> Coin -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Coin -> Certificate (LedgerEra era)
Exp.makeStakeAddressUnregistrationCertificate StakeCredential
stakeCred Coin
deposit
          :: Exp.Certificate (Exp.LedgerEra era)

  fromEitherIOCli @(FileError ()) $
    writeLazyByteStringFile oFp $
      obtainCommonConstraints era $
        textEnvelopeToJSON (Just deregCertDesc) deRegCert
 where
  deregCertDesc :: TextEnvelopeDescr
  deregCertDesc :: TextEnvelopeDescr
deregCertDesc = TextEnvelopeDescr
"Stake Address Deregistration Certificate"

runStakeAddressRegistrationAndDelegationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -> StakePoolKeyHashSource
  -- ^ Delegatee stake pool verification key or verification key file or id
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd :: forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd Era era
era StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile Coin
deposit File () 'Out
outFp =
  do
    StakePoolKeyHash poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

    stakeCred <-
      getStakeCredentialFromIdentifier stakeVerifier

    let delegatee = KeyHash 'StakePool -> Delegatee
L.DelegStake KeyHash 'StakePool
poolStakeVKeyHash

    let certificate =
          Era era
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => Certificate (LedgerEra era))
 -> Certificate (LedgerEra era))
-> (EraCommonConstraints era => Certificate (LedgerEra era))
-> Certificate (LedgerEra era)
forall a b. (a -> b) -> a -> b
$
            StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
Exp.makeStakeAddressAndDRepDelegationCertificate StakeCredential
stakeCred Delegatee
delegatee Coin
deposit
            :: Exp.Certificate (Exp.LedgerEra era)

    fromEitherIOCli @(FileError ()) $
      writeLazyByteStringFile outFp $
        obtainCommonConstraints era $
          textEnvelopeToJSON
            (Just @TextEnvelopeDescr "Stake address registration and stake delegation certificate")
            certificate

runStakeAddressRegistrationAndVoteDelegationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -> VoteDelegationTarget
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd :: forall era e.
Era era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeVerifier VoteDelegationTarget
voteDelegationTarget Coin
keydeposit File () 'Out
outFp =
  Era era -> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
w ((EraCommonConstraints era => RIO e ()) -> RIO e ())
-> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ do
    stakeCred <-
      StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

    drep <-
      readVoteDelegationTarget voteDelegationTarget

    let delegatee = DRep -> Delegatee
L.DelegVote DRep
drep

    let certificate =
          StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
Exp.makeStakeAddressAndDRepDelegationCertificate StakeCredential
stakeCred Delegatee
delegatee Coin
keydeposit
            :: Exp.Certificate (Exp.LedgerEra era)

    fromEitherIOCli @(FileError ()) $
      writeLazyByteStringFile outFp $
        textEnvelopeToJSON
          (Just @TextEnvelopeDescr "Stake address registration and vote delegation certificate")
          certificate

runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
  :: forall era e
   . Exp.Era era
  -> StakeIdentifier
  -> StakePoolKeyHashSource
  -> VoteDelegationTarget
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd :: forall era e.
Era era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd Era era
w StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile VoteDelegationTarget
voteDelegationTarget Coin
keydeposit File () 'Out
outFp =
  Era era -> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
w ((EraCommonConstraints era => RIO e ()) -> RIO e ())
-> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ do
    StakePoolKeyHash poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

    stakeCred <-
      getStakeCredentialFromIdentifier stakeVerifier

    drep <-
      readVoteDelegationTarget voteDelegationTarget

    let delegatee = KeyHash 'StakePool -> DRep -> Delegatee
L.DelegStakeVote KeyHash 'StakePool
poolStakeVKeyHash DRep
drep

    let certificate =
          StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Delegatee -> Coin -> Certificate (LedgerEra era)
Exp.makeStakeAddressAndDRepDelegationCertificate StakeCredential
stakeCred Delegatee
delegatee Coin
keydeposit
            :: Exp.Certificate (Exp.LedgerEra era)

    fromEitherIOCli @(FileError ()) $
      writeLazyByteStringFile outFp $
        textEnvelopeToJSON
          (Just @TextEnvelopeDescr "Stake address registration and vote delegation certificate")
          certificate