{-# 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"

  SigningKey StakeKey
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 :: VerificationKey StakeKey
vkey = SigningKey StakeKey -> VerificationKey StakeKey
forall keyrole.
(Key keyrole, HasTypeProxy keyrole) =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey StakeKey
skey

  RIO e (Either (FileError Any) ()) -> RIO e ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (RIO e (Either (FileError Any) ()) -> RIO e ())
-> RIO e (Either (FileError Any) ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$
    Vary '[FormatBech32, FormatTextEnvelope]
fmt
      Vary '[FormatBech32, FormatTextEnvelope]
-> (Vary '[FormatBech32, FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> RIO e (Either (FileError Any) ())
forall a b. a -> (a -> b) -> b
& ( (Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a. a -> a
id
            ((Vary '[FormatBech32, FormatTextEnvelope]
  -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> ((Vary '[] -> RIO e (Either (FileError Any) ()))
    -> Vary '[FormatBech32, FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FormatBech32 -> RIO e (Either (FileError Any) ()))
-> (Vary '[FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b (l :: [*]).
(a -> b) -> (Vary l -> b) -> Vary (a : l) -> b
Vary.on
              ( \FormatBech32
FormatBech32 ->
                  SigningKeyFile 'Out -> Text -> RIO e (Either (FileError Any) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> Text -> m (Either (FileError e) ())
writeTextFile SigningKeyFile 'Out
skFp (Text -> RIO e (Either (FileError Any) ()))
-> Text -> RIO e (Either (FileError Any) ())
forall a b. (a -> b) -> a -> b
$ SigningKey StakeKey -> Text
forall a. SerialiseAsBech32 a => a -> Text
serialiseToBech32 SigningKey StakeKey
skey
              )
            ((Vary '[FormatTextEnvelope] -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> ((Vary '[] -> RIO e (Either (FileError Any) ()))
    -> Vary '[FormatTextEnvelope] -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FormatTextEnvelope -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b (l :: [*]).
(a -> b) -> (Vary l -> b) -> Vary (a : l) -> b
Vary.on
              ( \FormatTextEnvelope
FormatTextEnvelope ->
                  SigningKeyFile 'Out
-> ByteString -> RIO e (Either (FileError Any) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile SigningKeyFile 'Out
skFp (ByteString -> RIO e (Either (FileError Any) ()))
-> ByteString -> RIO e (Either (FileError Any) ())
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 '[] -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b. (a -> b) -> a -> b
$ Vary '[] -> RIO e (Either (FileError Any) ())
forall anything. Vary '[] -> anything
Vary.exhaustiveCase
        )

  RIO e (Either (FileError Any) ()) -> RIO e ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (RIO e (Either (FileError Any) ()) -> RIO e ())
-> RIO e (Either (FileError Any) ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$
    Vary '[FormatBech32, FormatTextEnvelope]
fmt
      Vary '[FormatBech32, FormatTextEnvelope]
-> (Vary '[FormatBech32, FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> RIO e (Either (FileError Any) ())
forall a b. a -> (a -> b) -> b
& ( (Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a. a -> a
id
            ((Vary '[FormatBech32, FormatTextEnvelope]
  -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> ((Vary '[] -> RIO e (Either (FileError Any) ()))
    -> Vary '[FormatBech32, FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FormatBech32 -> RIO e (Either (FileError Any) ()))
-> (Vary '[FormatTextEnvelope]
    -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b (l :: [*]).
(a -> b) -> (Vary l -> b) -> Vary (a : l) -> b
Vary.on
              ( \FormatBech32
FormatBech32 ->
                  VerificationKeyFile 'Out
-> Text -> RIO e (Either (FileError Any) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> Text -> m (Either (FileError e) ())
writeTextFile VerificationKeyFile 'Out
vkFp (Text -> RIO e (Either (FileError Any) ()))
-> Text -> RIO e (Either (FileError Any) ())
forall a b. (a -> b) -> a -> b
$ VerificationKey StakeKey -> Text
forall a. SerialiseAsBech32 a => a -> Text
serialiseToBech32 VerificationKey StakeKey
vkey
              )
            ((Vary '[FormatTextEnvelope] -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> ((Vary '[] -> RIO e (Either (FileError Any) ()))
    -> Vary '[FormatTextEnvelope] -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FormatTextEnvelope -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b (l :: [*]).
(a -> b) -> (Vary l -> b) -> Vary (a : l) -> b
Vary.on
              ( \FormatTextEnvelope
FormatTextEnvelope ->
                  VerificationKeyFile 'Out
-> ByteString -> RIO e (Either (FileError Any) ())
forall (m :: * -> *) content e.
MonadIO m =>
File content 'Out -> ByteString -> m (Either (FileError e) ())
writeLazyByteStringFile VerificationKeyFile 'Out
vkFp (ByteString -> RIO e (Either (FileError Any) ()))
-> ByteString -> RIO e (Either (FileError Any) ())
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 '[] -> RIO e (Either (FileError Any) ()))
 -> Vary '[FormatBech32, FormatTextEnvelope]
 -> RIO e (Either (FileError Any) ()))
-> (Vary '[] -> RIO e (Either (FileError Any) ()))
-> Vary '[FormatBech32, FormatTextEnvelope]
-> RIO e (Either (FileError Any) ())
forall a b. (a -> b) -> a -> b
$ Vary '[] -> RIO e (Either (FileError Any) ())
forall anything. Vary '[] -> anything
Vary.exhaustiveCase
        )

  (VerificationKey StakeKey, SigningKey StakeKey)
-> RIO e (VerificationKey StakeKey, SigningKey StakeKey)
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (VerificationKey StakeKey
vkey, SigningKey StakeKey
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
  VerificationKey StakeKey
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 :: ByteString
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 Maybe (File () 'Out)
mOutputFp of
    Just (File FilePath
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
$ FilePath -> ByteString -> IO ()
BS.writeFile FilePath
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
  StakeAddress
stakeAddr <-
    NetworkId -> StakeVerifier -> CIO e StakeAddress
forall e. NetworkId -> StakeVerifier -> CIO e StakeAddress
getStakeAddressFromVerifier NetworkId
network StakeVerifier
stakeVerifier
  let stakeAddrText :: Text
stakeAddrText = StakeAddress -> Text
forall addr. SerialiseAddress addr => addr -> Text
serialiseAddress StakeAddress
stakeAddr
  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
$
    case Maybe (File () 'Out)
mOutputFp of
      Just (File FilePath
fpath) -> FilePath -> Text -> IO ()
Text.writeFile FilePath
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
  StakeCredential
stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier
      StakeIdentifier
stakeIdentifier

  let regCert :: Certificate (LedgerEra era)
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)

  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
$
      Era era -> (EraCommonConstraints era => ByteString) -> ByteString
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => ByteString) -> ByteString)
-> (EraCommonConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$
        Maybe TextEnvelopeDescr
-> Certificate (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
regCertDesc) Certificate (LedgerEra era)
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
    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 (LedgerEra era)
certificate :: Exp.Certificate (Exp.LedgerEra era) = StakeCredential -> Hash StakePoolKey -> Certificate (LedgerEra era)
forall era.
IsEra era =>
StakeCredential -> Hash StakePoolKey -> Certificate (LedgerEra era)
createStakeDelegationCertificate 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 (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake Delegation Certificate") Certificate (LedgerEra era)
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 KeyHash 'StakePool
poolStakeVKeyHash <- StakePoolKeyHashSource -> RIO e (Hash StakePoolKey)
forall (m :: * -> *).
MonadIO m =>
StakePoolKeyHashSource -> m (Hash StakePoolKey)
getHashFromStakePoolKeyHashSource StakePoolKeyHashSource
poolVKeyOrHashOrFile

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

  DRep
drep <-
    VoteDelegationTarget -> CIO e DRep
forall e. VoteDelegationTarget -> CIO e DRep
readVoteDelegationTarget VoteDelegationTarget
voteDelegationTarget

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

  Certificate (LedgerEra era)
certificate :: Exp.Certificate (Exp.LedgerEra era) <-
    Certificate (LedgerEra era) -> RIO e (Certificate (LedgerEra era))
forall a. a -> RIO e a
forall (m :: * -> *) a. Monad m => a -> m a
return (Certificate (LedgerEra era)
 -> RIO e (Certificate (LedgerEra era)))
-> Certificate (LedgerEra era)
-> RIO e (Certificate (LedgerEra era))
forall a b. (a -> b) -> a -> b
$
      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) Delegatee
delegatee

  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
$
      Era era -> (EraCommonConstraints era => ByteString) -> ByteString
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
w ((EraCommonConstraints era => ByteString) -> ByteString)
-> (EraCommonConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$
        Maybe TextEnvelopeDescr
-> Certificate (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake and Vote Delegation Certificate") Certificate (LedgerEra era)
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
stakeCredential <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

  DRep
drep <-
    VoteDelegationTarget -> CIO e DRep
forall e. VoteDelegationTarget -> CIO e DRep
readVoteDelegationTarget VoteDelegationTarget
voteDelegationTarget

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

  let Certificate (LedgerEra era)
certificate :: Exp.Certificate (Exp.LedgerEra 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) Delegatee
delegatee

  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
$ Era era -> (EraCommonConstraints era => ByteString) -> ByteString
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
w
    ((EraCommonConstraints era => ByteString) -> ByteString)
-> (EraCommonConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$ Maybe TextEnvelopeDescr
-> Certificate (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Vote Delegation Certificate") Certificate (LedgerEra era)
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
  StakeCredential
stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

  let deRegCert :: Certificate (LedgerEra era)
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)

  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
$
      Era era -> (EraCommonConstraints era => ByteString) -> ByteString
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => ByteString) -> ByteString)
-> (EraCommonConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$
        Maybe TextEnvelopeDescr
-> Certificate (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
deregCertDesc) Certificate (LedgerEra era)
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 KeyHash 'StakePool
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 delegatee :: Delegatee
delegatee = KeyHash 'StakePool -> Delegatee
L.DelegStake KeyHash 'StakePool
poolStakeVKeyHash

    let certificate :: Certificate (LedgerEra era)
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)

    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
$
        Era era -> (EraCommonConstraints era => ByteString) -> ByteString
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => ByteString) -> ByteString)
-> (EraCommonConstraints era => ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$
          Maybe TextEnvelopeDescr
-> Certificate (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON
            (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake address registration and stake delegation certificate")
            Certificate (LedgerEra era)
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
    StakeCredential
stakeCred <-
      StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

    DRep
drep <-
      VoteDelegationTarget -> CIO e DRep
forall e. VoteDelegationTarget -> CIO e DRep
readVoteDelegationTarget VoteDelegationTarget
voteDelegationTarget

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

    let certificate :: Certificate (LedgerEra era)
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)

    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 (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON
          (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake address registration and vote delegation certificate")
          Certificate (LedgerEra era)
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 KeyHash 'StakePool
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

    DRep
drep <-
      VoteDelegationTarget -> CIO e DRep
forall e. VoteDelegationTarget -> CIO e DRep
readVoteDelegationTarget VoteDelegationTarget
voteDelegationTarget

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

    let certificate :: Certificate (LedgerEra era)
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)

    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 (LedgerEra era) -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON
          (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake address registration and vote delegation certificate")
          Certificate (LedgerEra era)
certificate