{-# 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
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.Error.StakeAddressRegistrationError
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 Maybe (Featured ConwayEraOnwards era Coin)
mDeposit 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
$
      StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
forall era e.
IsEra era =>
StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationCertificateCmd StakeIdentifier
stakeIdentifier Maybe (Featured ConwayEraOnwards era 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
    ConwayEraOnwards era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
stakePoolVerificationKeyHashSource
    VoteDelegationTarget
voteDelegationTarget
    File () 'Out
outputFp ->
      ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressStakeAndVoteDelegationCertificateCmd
        ConwayEraOnwards era
w
        StakeIdentifier
stakeIdentifier
        StakePoolKeyHashSource
stakePoolVerificationKeyHashSource
        VoteDelegationTarget
voteDelegationTarget
        File () 'Out
outputFp
  StakeAddressVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeIdentifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outputFp ->
    ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeIdentifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outputFp
  StakeAddressDeregistrationCertificateCmd Era era
era StakeIdentifier
stakeIdentifier Maybe (Featured ConwayEraOnwards era Coin)
mDeposit File () 'Out
outputFp ->
    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
$
      StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
forall era e.
IsEra era =>
StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
runStakeAddressDeregistrationCertificateCmd StakeIdentifier
stakeIdentifier Maybe (Featured ConwayEraOnwards era Coin)
mDeposit File () 'Out
outputFp
  StakeAddressRegistrationAndDelegationCertificateCmd
    ConwayEraOnwards era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
poolVKeyOrHashOrFile
    Coin
deposit
    File () 'Out
outFp ->
      ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd
        ConwayEraOnwards era
w
        StakeIdentifier
stakeIdentifier
        StakePoolKeyHashSource
poolVKeyOrHashOrFile
        Coin
deposit
        File () 'Out
outFp
  StakeAddressRegistrationAndVoteDelegationCertificateCmd
    ConwayEraOnwards era
w
    StakeIdentifier
stakeIdentifier
    VoteDelegationTarget
voteDelegationTarget
    Coin
keydeposit
    File () 'Out
outFp ->
      ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd
        ConwayEraOnwards era
w
        StakeIdentifier
stakeIdentifier
        VoteDelegationTarget
voteDelegationTarget
        Coin
keydeposit
        File () 'Out
outFp
  StakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
    ConwayEraOnwards era
w
    StakeIdentifier
stakeIdentifier
    StakePoolKeyHashSource
poolVKeyOrHashOrFile
    VoteDelegationTarget
voteDelegationTarget
    Coin
keydeposit
    File () 'Out
outFp ->
      ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
        ConwayEraOnwards 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.IsEra era
  => StakeIdentifier
  -> Maybe (Featured ConwayEraOnwards era Lovelace)
  -- ^ Deposit required in conway era
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationCertificateCmd :: forall era e.
IsEra era =>
StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationCertificateCmd StakeIdentifier
stakeIdentifier Maybe (Featured ConwayEraOnwards era Coin)
mDeposit File () 'Out
oFp = do
  let sbe :: ShelleyBasedEra era
sbe = Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert (Era era -> ShelleyBasedEra era) -> Era era -> ShelleyBasedEra era
forall a b. (a -> b) -> a -> b
$ forall era. IsEra era => Era era
Exp.useEra @era
  StakeCredential
stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeIdentifier

  StakeAddressRequirements era
req <-
    Either StakeAddressRegistrationError (StakeAddressRequirements era)
-> RIO e (StakeAddressRequirements era)
forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
Either e a -> m a
fromEitherCli (Either
   StakeAddressRegistrationError (StakeAddressRequirements era)
 -> RIO e (StakeAddressRequirements era))
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
-> RIO e (StakeAddressRequirements era)
forall a b. (a -> b) -> a -> b
$
      StakeCredential
-> Maybe (Featured ConwayEraOnwards era Coin)
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
forall era.
IsEra era =>
StakeCredential
-> Maybe (Featured ConwayEraOnwards era Coin)
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
createRegistrationCertRequirements StakeCredential
stakeCred Maybe (Featured ConwayEraOnwards era Coin)
mDeposit

  let regCert :: Certificate era
regCert = StakeAddressRequirements era -> Certificate era
forall era. StakeAddressRequirements era -> Certificate era
makeStakeAddressRegistrationCertificate StakeAddressRequirements era
req

  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 era -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
regCertDesc) Certificate era
regCert
 where
  regCertDesc :: TextEnvelopeDescr
  regCertDesc :: TextEnvelopeDescr
regCertDesc = TextEnvelopeDescr
"Stake Address Registration Certificate"

createRegistrationCertRequirements
  :: Exp.IsEra era
  => StakeCredential
  -> Maybe (Featured ConwayEraOnwards era Lovelace)
  -- ^ Deposit required in conway era
  -> Either StakeAddressRegistrationError (StakeAddressRequirements era)
createRegistrationCertRequirements :: forall era.
IsEra era =>
StakeCredential
-> Maybe (Featured ConwayEraOnwards era Coin)
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
createRegistrationCertRequirements StakeCredential
stakeCred Maybe (Featured ConwayEraOnwards era Coin)
mDeposit =
  do
    case Maybe (Featured ConwayEraOnwards era Coin)
mDeposit of
      Maybe (Featured ConwayEraOnwards era Coin)
Nothing ->
        -- This case is made impossible by the parser, that distinguishes between Conway
        -- and pre-Conway.
        StakeAddressRegistrationError
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
forall a.
StakeAddressRegistrationError
-> Either StakeAddressRegistrationError a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError StakeAddressRegistrationError
StakeAddressRegistrationDepositRequired
      Just (Featured ConwayEraOnwards era
_ Coin
dep) ->
        StakeAddressRequirements era
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
forall a. a -> Either StakeAddressRegistrationError a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (StakeAddressRequirements era
 -> Either
      StakeAddressRegistrationError (StakeAddressRequirements era))
-> StakeAddressRequirements era
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
forall a b. (a -> b) -> a -> b
$ ConwayEraOnwards era
-> Coin -> StakeCredential -> StakeAddressRequirements era
forall era.
ConwayEraOnwards era
-> Coin -> StakeCredential -> StakeAddressRequirements era
StakeAddrRegistrationConway (Era era -> ConwayEraOnwards era
forall era. Era era -> ConwayEraOnwards era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra) Coin
dep StakeCredential
stakeCred

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 era
certificate :: Certificate era = StakeCredential -> Hash StakePoolKey -> Certificate era
forall era.
IsEra era =>
StakeCredential -> Hash StakePoolKey -> Certificate 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 era -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Stake Delegation Certificate") Certificate era
certificate

runStakeAddressStakeAndVoteDelegationCertificateCmd
  :: ()
  => ConwayEraOnwards 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.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressStakeAndVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile VoteDelegationTarget
voteDelegationTarget File () 'Out
outFp =
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ())
-> (ConwayEraOnwardsConstraints 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
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

    let certificate :: Certificate era
certificate =
          ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall era.
Typeable era =>
ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
ConwayCertificate ConwayEraOnwards era
w (ConwayTxCert (ShelleyLedgerEra era) -> Certificate era)
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall a b. (a -> b) -> a -> b
$
            StakeCredential -> Delegatee -> TxCert (ShelleyLedgerEra 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
$
        Maybe TextEnvelopeDescr -> Certificate 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 era
certificate

runStakeAddressVoteDelegationCertificateCmd
  :: ()
  => ConwayEraOnwards 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.
ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> File () 'Out
-> CIO e ()
runStakeAddressVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeVerifier VoteDelegationTarget
voteDelegationTarget File () 'Out
outFp =
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ())
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ 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 :: Certificate era
certificate =
          ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall era.
Typeable era =>
ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
ConwayCertificate ConwayEraOnwards era
w (ConwayTxCert (ShelleyLedgerEra era) -> Certificate era)
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall a b. (a -> b) -> a -> b
$
            StakeCredential -> Delegatee -> TxCert (ShelleyLedgerEra 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
$ Maybe TextEnvelopeDescr -> Certificate era -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (forall a. a -> Maybe a
Just @TextEnvelopeDescr TextEnvelopeDescr
"Vote Delegation Certificate") Certificate era
certificate

createStakeDelegationCertificate
  :: forall era
   . Exp.IsEra era
  => StakeCredential
  -> Hash StakePoolKey
  -> Certificate era
createStakeDelegationCertificate :: forall era.
IsEra era =>
StakeCredential -> Hash StakePoolKey -> Certificate era
createStakeDelegationCertificate StakeCredential
stakeCredential (StakePoolKeyHash KeyHash 'StakePool
poolStakeVKeyHash) = do
  let w :: ConwayEraOnwards era
w = Era era -> ConwayEraOnwards era
forall era. Era era -> ConwayEraOnwards era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert (Era era -> ConwayEraOnwards era)
-> Era era -> ConwayEraOnwards era
forall a b. (a -> b) -> a -> b
$ forall era. IsEra era => Era era
Exp.useEra @era
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => Certificate era)
-> Certificate era
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => Certificate era)
 -> Certificate era)
-> (ConwayEraOnwardsConstraints era => Certificate era)
-> Certificate era
forall a b. (a -> b) -> a -> b
$
    ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall era.
Typeable era =>
ConwayEraOnwards era
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
ConwayCertificate (Era era -> ConwayEraOnwards era
forall era. Era era -> ConwayEraOnwards era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert Era era
forall era. IsEra era => Era era
Exp.useEra) (ConwayTxCert (ShelleyLedgerEra era) -> Certificate era)
-> ConwayTxCert (ShelleyLedgerEra era) -> Certificate era
forall a b. (a -> b) -> a -> b
$
      StakeCredential -> Delegatee -> TxCert (ShelleyLedgerEra 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.IsEra era
  => StakeIdentifier
  -> Maybe (Featured ConwayEraOnwards era Lovelace)
  -- ^ Deposit required in conway era
  -> File () Out
  -> CIO e ()
runStakeAddressDeregistrationCertificateCmd :: forall era e.
IsEra era =>
StakeIdentifier
-> Maybe (Featured ConwayEraOnwards era Coin)
-> File () 'Out
-> CIO e ()
runStakeAddressDeregistrationCertificateCmd StakeIdentifier
stakeVerifier Maybe (Featured ConwayEraOnwards era Coin)
mDeposit File () 'Out
oFp = do
  let sbe :: ShelleyBasedEra era
sbe = Era era -> ShelleyBasedEra era
forall era. Era era -> ShelleyBasedEra era
forall a (f :: a -> *) (g :: a -> *) (era :: a).
Convert f g =>
f era -> g era
convert (Era era -> ShelleyBasedEra era) -> Era era -> ShelleyBasedEra era
forall a b. (a -> b) -> a -> b
$ forall era. IsEra era => Era era
Exp.useEra @era
  StakeCredential
stakeCred <-
    StakeIdentifier -> CIO e StakeCredential
forall e. StakeIdentifier -> CIO e StakeCredential
getStakeCredentialFromIdentifier StakeIdentifier
stakeVerifier

  StakeAddressRequirements era
req <-
    Either StakeAddressRegistrationError (StakeAddressRequirements era)
-> RIO e (StakeAddressRequirements era)
forall e (m :: * -> *) a.
(HasCallStack, MonadIO m, Show e, Typeable e, Error e) =>
Either e a -> m a
fromEitherCli (Either
   StakeAddressRegistrationError (StakeAddressRequirements era)
 -> RIO e (StakeAddressRequirements era))
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
-> RIO e (StakeAddressRequirements era)
forall a b. (a -> b) -> a -> b
$
      StakeCredential
-> Maybe (Featured ConwayEraOnwards era Coin)
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
forall era.
IsEra era =>
StakeCredential
-> Maybe (Featured ConwayEraOnwards era Coin)
-> Either
     StakeAddressRegistrationError (StakeAddressRequirements era)
createRegistrationCertRequirements StakeCredential
stakeCred Maybe (Featured ConwayEraOnwards era Coin)
mDeposit

  let deRegCert :: Certificate era
deRegCert = StakeAddressRequirements era -> Certificate era
forall era. StakeAddressRequirements era -> Certificate era
makeStakeAddressUnregistrationCertificate StakeAddressRequirements era
req

  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 era -> ByteString
forall a.
HasTextEnvelope a =>
Maybe TextEnvelopeDescr -> a -> ByteString
textEnvelopeToJSON (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
deregCertDesc) Certificate era
deRegCert
 where
  deregCertDesc :: TextEnvelopeDescr
  deregCertDesc :: TextEnvelopeDescr
deregCertDesc = TextEnvelopeDescr
"Stake Address Deregistration Certificate"

runStakeAddressRegistrationAndDelegationCertificateCmd
  :: ()
  => ConwayEraOnwards era
  -> StakeIdentifier
  -> StakePoolKeyHashSource
  -- ^ Delegatee stake pool verification key or verification key file or id
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd :: forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile Coin
deposit File () 'Out
outFp =
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ())
-> (ConwayEraOnwardsConstraints 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

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

    let certificate :: Certificate era
certificate = ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
forall era.
ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
makeStakeAddressAndDRepDelegationCertificate ConwayEraOnwards era
w StakeCredential
stakeCred Delegatee
delegatee Coin
deposit

    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 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 era
certificate

runStakeAddressRegistrationAndVoteDelegationCertificateCmd
  :: ()
  => ConwayEraOnwards era
  -> StakeIdentifier
  -> VoteDelegationTarget
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd :: forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationAndVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeVerifier VoteDelegationTarget
voteDelegationTarget Coin
keydeposit File () 'Out
outFp =
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ())
-> (ConwayEraOnwardsConstraints 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 era
certificate = ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
forall era.
ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
makeStakeAddressAndDRepDelegationCertificate ConwayEraOnwards era
w StakeCredential
stakeCred Delegatee
delegatee Coin
keydeposit

    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 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 era
certificate

runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd
  :: ()
  => ConwayEraOnwards era
  -> StakeIdentifier
  -> StakePoolKeyHashSource
  -> VoteDelegationTarget
  -> Lovelace
  -> File () Out
  -> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd :: forall era e.
ConwayEraOnwards era
-> StakeIdentifier
-> StakePoolKeyHashSource
-> VoteDelegationTarget
-> Coin
-> File () 'Out
-> CIO e ()
runStakeAddressRegistrationStakeAndVoteDelegationCertificateCmd ConwayEraOnwards era
w StakeIdentifier
stakeVerifier StakePoolKeyHashSource
poolVKeyOrHashOrFile VoteDelegationTarget
voteDelegationTarget Coin
keydeposit File () 'Out
outFp =
  ConwayEraOnwards era
-> (ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ()
forall era a.
ConwayEraOnwards era -> (ConwayEraOnwardsConstraints era => a) -> a
conwayEraOnwardsConstraints ConwayEraOnwards era
w ((ConwayEraOnwardsConstraints era => RIO e ()) -> RIO e ())
-> (ConwayEraOnwardsConstraints 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 era
certificate = ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
forall era.
ConwayEraOnwards era
-> StakeCredential -> Delegatee -> Coin -> Certificate era
makeStakeAddressAndDRepDelegationCertificate ConwayEraOnwards era
w StakeCredential
stakeCred Delegatee
delegatee Coin
keydeposit

    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 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 era
certificate