module Cardano.CLI.Shelley.Run.StakeAddress
  ( ShelleyStakeAddressCmdError
  , renderShelleyStakeAddressCmdError
  , runStakeAddressCmd
  ) where

import           Cardano.Prelude

import qualified Data.ByteString.Char8 as BS
import qualified Data.Text as Text
import qualified Data.Text.IO as Text

import           Control.Monad.Trans.Except.Extra (firstExceptT, newExceptT)

import           Cardano.Api.TextView (TextViewDescription (..))
import           Cardano.Api.Typed

import           Cardano.CLI.Shelley.Key (InputDecodeError, VerificationKeyOrFile,
                     VerificationKeyOrHashOrFile, readVerificationKeyOrFile,
                     readVerificationKeyOrHashOrFile)
import           Cardano.CLI.Shelley.Parsers
import           Cardano.CLI.Types

data ShelleyStakeAddressCmdError
  = ShelleyStakeAddressCmdStakeAddressKeyPairError
      !Text
      -- ^ bech32 private key
      !Text
      -- ^ bech32 public key
  | ShelleyStakeAddressCmdReadKeyFileError !(FileError InputDecodeError)
  | ShelleyStakeAddressCmdWriteFileError !(FileError ())
  deriving Int -> ShelleyStakeAddressCmdError -> ShowS
[ShelleyStakeAddressCmdError] -> ShowS
ShelleyStakeAddressCmdError -> String
(Int -> ShelleyStakeAddressCmdError -> ShowS)
-> (ShelleyStakeAddressCmdError -> String)
-> ([ShelleyStakeAddressCmdError] -> ShowS)
-> Show ShelleyStakeAddressCmdError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ShelleyStakeAddressCmdError] -> ShowS
$cshowList :: [ShelleyStakeAddressCmdError] -> ShowS
show :: ShelleyStakeAddressCmdError -> String
$cshow :: ShelleyStakeAddressCmdError -> String
showsPrec :: Int -> ShelleyStakeAddressCmdError -> ShowS
$cshowsPrec :: Int -> ShelleyStakeAddressCmdError -> ShowS
Show

renderShelleyStakeAddressCmdError :: ShelleyStakeAddressCmdError -> Text
renderShelleyStakeAddressCmdError :: ShelleyStakeAddressCmdError -> Text
renderShelleyStakeAddressCmdError ShelleyStakeAddressCmdError
err =
  case ShelleyStakeAddressCmdError
err of
    ShelleyStakeAddressCmdStakeAddressKeyPairError Text
bech32PrivKey Text
bech32PubKey ->
      Text
"Error while deriving the shelley verification key from bech32 private Key: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
bech32PrivKey Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
      Text
" Corresponding bech32 public key: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
bech32PubKey
    ShelleyStakeAddressCmdReadKeyFileError FileError InputDecodeError
fileErr -> String -> Text
Text.pack (FileError InputDecodeError -> String
forall e. Error e => e -> String
displayError FileError InputDecodeError
fileErr)
    ShelleyStakeAddressCmdWriteFileError FileError ()
fileErr -> String -> Text
Text.pack (FileError () -> String
forall e. Error e => e -> String
displayError FileError ()
fileErr)


runStakeAddressCmd :: StakeAddressCmd -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressCmd :: StakeAddressCmd -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressCmd (StakeAddressKeyGen VerificationKeyFile
vk SigningKeyFile
sk) = VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyGen VerificationKeyFile
vk SigningKeyFile
sk
runStakeAddressCmd (StakeAddressKeyHash VerificationKeyOrFile StakeKey
vk Maybe OutputFile
mOutputFp) = VerificationKeyOrFile StakeKey
-> Maybe OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyHash VerificationKeyOrFile StakeKey
vk Maybe OutputFile
mOutputFp
runStakeAddressCmd (StakeAddressBuild VerificationKeyOrFile StakeKey
vk NetworkId
nw Maybe OutputFile
mOutputFp) = VerificationKeyOrFile StakeKey
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressBuild VerificationKeyOrFile StakeKey
vk NetworkId
nw Maybe OutputFile
mOutputFp
runStakeAddressCmd (StakeKeyRegistrationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp OutputFile
outputFp) =
  VerificationKeyOrFile StakeKey
-> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyRegistrationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp OutputFile
outputFp
runStakeAddressCmd (StakeKeyDelegationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp VerificationKeyOrHashOrFile StakePoolKey
stkPoolVerKeyHashOrFp OutputFile
outputFp) =
  VerificationKeyOrFile StakeKey
-> VerificationKeyOrHashOrFile StakePoolKey
-> OutputFile
-> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDelegationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp VerificationKeyOrHashOrFile StakePoolKey
stkPoolVerKeyHashOrFp OutputFile
outputFp
runStakeAddressCmd (StakeKeyDeRegistrationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp OutputFile
outputFp) =
  VerificationKeyOrFile StakeKey
-> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDeRegistrationCert VerificationKeyOrFile StakeKey
stkKeyVerKeyOrFp OutputFile
outputFp


--
-- Stake address command implementations
--

runStakeAddressKeyGen :: VerificationKeyFile -> SigningKeyFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyGen :: VerificationKeyFile
-> SigningKeyFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyGen (VerificationKeyFile String
vkFp) (SigningKeyFile String
skFp) = do
    SigningKey StakeKey
skey <- IO (SigningKey StakeKey)
-> ExceptT ShelleyStakeAddressCmdError IO (SigningKey StakeKey)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (SigningKey StakeKey)
 -> ExceptT ShelleyStakeAddressCmdError IO (SigningKey StakeKey))
-> IO (SigningKey StakeKey)
-> ExceptT ShelleyStakeAddressCmdError IO (SigningKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey -> IO (SigningKey StakeKey)
forall keyrole.
Key keyrole =>
AsType keyrole -> IO (SigningKey keyrole)
generateSigningKey AsType StakeKey
AsStakeKey
    let vkey :: VerificationKey StakeKey
vkey = SigningKey StakeKey -> VerificationKey StakeKey
forall keyrole.
Key keyrole =>
SigningKey keyrole -> VerificationKey keyrole
getVerificationKey SigningKey StakeKey
skey
    (FileError () -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdWriteFileError
      (ExceptT (FileError ()) IO ()
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO (Either (FileError ()) ())
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> SigningKey StakeKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
skFp (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
skeyDesc) SigningKey StakeKey
skey
    (FileError () -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdWriteFileError
      (ExceptT (FileError ()) IO ()
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO (Either (FileError ()) ())
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> VerificationKey StakeKey
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
vkFp (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
vkeyDesc) VerificationKey StakeKey
vkey
  where
    skeyDesc, vkeyDesc :: TextViewDescription
    skeyDesc :: TextEnvelopeDescr
skeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Stake Signing Key"
    vkeyDesc :: TextEnvelopeDescr
vkeyDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Stake Verification Key"

runStakeAddressKeyHash
  :: VerificationKeyOrFile StakeKey
  -> Maybe OutputFile
  -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyHash :: VerificationKeyOrFile StakeKey
-> Maybe OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressKeyHash VerificationKeyOrFile StakeKey
stakeVerKeyOrFile Maybe OutputFile
mOutputFp = do
  VerificationKey StakeKey
vkey <- (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
    (ExceptT (FileError InputDecodeError) IO (VerificationKey StakeKey)
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> (IO
      (Either (FileError InputDecodeError) (VerificationKey StakeKey))
    -> ExceptT
         (FileError InputDecodeError) IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
    (IO
   (Either (FileError InputDecodeError) (VerificationKey StakeKey))
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey
-> VerificationKeyOrFile StakeKey
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
forall keyrole.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrFile keyrole
-> IO
     (Either (FileError InputDecodeError) (VerificationKey keyrole))
readVerificationKeyOrFile AsType StakeKey
AsStakeKey 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 OutputFile
mOutputFp of
    Just (OutputFile String
fpath) -> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String -> ByteString -> IO ()
BS.writeFile String
fpath ByteString
hexKeyHash
    Maybe OutputFile
Nothing -> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ ByteString -> IO ()
BS.putStrLn ByteString
hexKeyHash

runStakeAddressBuild :: VerificationKeyOrFile StakeKey -> NetworkId -> Maybe OutputFile
                     -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressBuild :: VerificationKeyOrFile StakeKey
-> NetworkId
-> Maybe OutputFile
-> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeAddressBuild VerificationKeyOrFile StakeKey
stakeVerKeyOrFile NetworkId
network Maybe OutputFile
mOutputFp = do
    VerificationKey StakeKey
stakeVerKey <- (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
      (ExceptT (FileError InputDecodeError) IO (VerificationKey StakeKey)
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> (IO
      (Either (FileError InputDecodeError) (VerificationKey StakeKey))
    -> ExceptT
         (FileError InputDecodeError) IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO
   (Either (FileError InputDecodeError) (VerificationKey StakeKey))
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey
-> VerificationKeyOrFile StakeKey
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
forall keyrole.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrFile keyrole
-> IO
     (Either (FileError InputDecodeError) (VerificationKey keyrole))
readVerificationKeyOrFile AsType StakeKey
AsStakeKey VerificationKeyOrFile StakeKey
stakeVerKeyOrFile

    let stakeCred :: StakeCredential
stakeCred = Hash StakeKey -> StakeCredential
StakeCredentialByKey (VerificationKey StakeKey -> Hash StakeKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey StakeKey
stakeVerKey)
        stakeAddr :: StakeAddress
stakeAddr = NetworkId -> StakeCredential -> StakeAddress
makeStakeAddress NetworkId
network StakeCredential
stakeCred
        stakeAddrText :: Text
stakeAddrText = StakeAddress -> Text
forall addr. SerialiseAddress addr => addr -> Text
serialiseAddress StakeAddress
stakeAddr

    case Maybe OutputFile
mOutputFp of
      Just (OutputFile String
fpath) -> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String -> Text -> IO ()
Text.writeFile String
fpath Text
stakeAddrText
      Maybe OutputFile
Nothing -> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO () -> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ Text -> IO ()
Text.putStrLn Text
stakeAddrText


runStakeKeyRegistrationCert
  :: VerificationKeyOrFile StakeKey
  -> OutputFile
  -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyRegistrationCert :: VerificationKeyOrFile StakeKey
-> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyRegistrationCert VerificationKeyOrFile StakeKey
stakeVerKeyOrFile (OutputFile String
oFp) = do
    VerificationKey StakeKey
stakeVerKey <- (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
      (ExceptT (FileError InputDecodeError) IO (VerificationKey StakeKey)
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> (IO
      (Either (FileError InputDecodeError) (VerificationKey StakeKey))
    -> ExceptT
         (FileError InputDecodeError) IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO
   (Either (FileError InputDecodeError) (VerificationKey StakeKey))
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey
-> VerificationKeyOrFile StakeKey
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
forall keyrole.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrFile keyrole
-> IO
     (Either (FileError InputDecodeError) (VerificationKey keyrole))
readVerificationKeyOrFile AsType StakeKey
AsStakeKey VerificationKeyOrFile StakeKey
stakeVerKeyOrFile
    let stakeCred :: StakeCredential
stakeCred = Hash StakeKey -> StakeCredential
StakeCredentialByKey (VerificationKey StakeKey -> Hash StakeKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey StakeKey
stakeVerKey)
        regCert :: Certificate
regCert = StakeCredential -> Certificate
makeStakeAddressRegistrationCertificate StakeCredential
stakeCred
    (FileError () -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdWriteFileError
      (ExceptT (FileError ()) IO ()
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO (Either (FileError ()) ())
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> Certificate
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
oFp (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
regCertDesc) Certificate
regCert
  where
    regCertDesc :: TextViewDescription
    regCertDesc :: TextEnvelopeDescr
regCertDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Stake Address Registration Certificate"


runStakeKeyDelegationCert
  :: VerificationKeyOrFile StakeKey
  -- ^ Delegator stake verification key or verification key file.
  -> VerificationKeyOrHashOrFile StakePoolKey
  -- ^ Delegatee stake pool verification key or verification key file or
  -- verification key hash.
  -> OutputFile
  -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDelegationCert :: VerificationKeyOrFile StakeKey
-> VerificationKeyOrHashOrFile StakePoolKey
-> OutputFile
-> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDelegationCert VerificationKeyOrFile StakeKey
stakeVerKeyOrFile VerificationKeyOrHashOrFile StakePoolKey
poolVKeyOrHashOrFile (OutputFile String
outFp) = do
    VerificationKey StakeKey
stakeVkey <- (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
      (ExceptT (FileError InputDecodeError) IO (VerificationKey StakeKey)
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> (IO
      (Either (FileError InputDecodeError) (VerificationKey StakeKey))
    -> ExceptT
         (FileError InputDecodeError) IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO
   (Either (FileError InputDecodeError) (VerificationKey StakeKey))
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey
-> VerificationKeyOrFile StakeKey
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
forall keyrole.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrFile keyrole
-> IO
     (Either (FileError InputDecodeError) (VerificationKey keyrole))
readVerificationKeyOrFile AsType StakeKey
AsStakeKey VerificationKeyOrFile StakeKey
stakeVerKeyOrFile

    Hash StakePoolKey
poolStakeVKeyHash <-
      (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError InputDecodeError) IO (Hash StakePoolKey)
-> ExceptT ShelleyStakeAddressCmdError IO (Hash StakePoolKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT
        FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
        (IO (Either (FileError InputDecodeError) (Hash StakePoolKey))
-> ExceptT (FileError InputDecodeError) IO (Hash StakePoolKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT (IO (Either (FileError InputDecodeError) (Hash StakePoolKey))
 -> ExceptT (FileError InputDecodeError) IO (Hash StakePoolKey))
-> IO (Either (FileError InputDecodeError) (Hash StakePoolKey))
-> ExceptT (FileError InputDecodeError) IO (Hash StakePoolKey)
forall a b. (a -> b) -> a -> b
$ AsType StakePoolKey
-> VerificationKeyOrHashOrFile StakePoolKey
-> IO (Either (FileError InputDecodeError) (Hash StakePoolKey))
forall keyrole.
(Key keyrole, SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrHashOrFile keyrole
-> IO (Either (FileError InputDecodeError) (Hash keyrole))
readVerificationKeyOrHashOrFile AsType StakePoolKey
AsStakePoolKey VerificationKeyOrHashOrFile StakePoolKey
poolVKeyOrHashOrFile)

    let stakeCred :: StakeCredential
stakeCred = Hash StakeKey -> StakeCredential
StakeCredentialByKey (VerificationKey StakeKey -> Hash StakeKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey StakeKey
stakeVkey)
        delegCert :: Certificate
delegCert = StakeCredential -> Hash StakePoolKey -> Certificate
makeStakeAddressDelegationCertificate
                      StakeCredential
stakeCred
                      Hash StakePoolKey
poolStakeVKeyHash
    (FileError () -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdWriteFileError
      (ExceptT (FileError ()) IO ()
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO (Either (FileError ()) ())
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> Certificate
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
outFp (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
delegCertDesc) Certificate
delegCert
  where
    delegCertDesc :: TextViewDescription
    delegCertDesc :: TextEnvelopeDescr
delegCertDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Stake Address Delegation Certificate"


runStakeKeyDeRegistrationCert
  :: VerificationKeyOrFile StakeKey
  -> OutputFile
  -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDeRegistrationCert :: VerificationKeyOrFile StakeKey
-> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO ()
runStakeKeyDeRegistrationCert VerificationKeyOrFile StakeKey
stakeVerKeyOrFile (OutputFile String
oFp) = do
    VerificationKey StakeKey
stakeVkey <- (FileError InputDecodeError -> ShelleyStakeAddressCmdError)
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError InputDecodeError -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdReadKeyFileError
      (ExceptT (FileError InputDecodeError) IO (VerificationKey StakeKey)
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> (IO
      (Either (FileError InputDecodeError) (VerificationKey StakeKey))
    -> ExceptT
         (FileError InputDecodeError) IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     (FileError InputDecodeError) IO (VerificationKey StakeKey)
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO
   (Either (FileError InputDecodeError) (VerificationKey StakeKey))
 -> ExceptT
      ShelleyStakeAddressCmdError IO (VerificationKey StakeKey))
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
-> ExceptT
     ShelleyStakeAddressCmdError IO (VerificationKey StakeKey)
forall a b. (a -> b) -> a -> b
$ AsType StakeKey
-> VerificationKeyOrFile StakeKey
-> IO
     (Either (FileError InputDecodeError) (VerificationKey StakeKey))
forall keyrole.
(HasTextEnvelope (VerificationKey keyrole),
 SerialiseAsBech32 (VerificationKey keyrole)) =>
AsType keyrole
-> VerificationKeyOrFile keyrole
-> IO
     (Either (FileError InputDecodeError) (VerificationKey keyrole))
readVerificationKeyOrFile AsType StakeKey
AsStakeKey VerificationKeyOrFile StakeKey
stakeVerKeyOrFile
    let stakeCred :: StakeCredential
stakeCred = Hash StakeKey -> StakeCredential
StakeCredentialByKey (VerificationKey StakeKey -> Hash StakeKey
forall keyrole.
Key keyrole =>
VerificationKey keyrole -> Hash keyrole
verificationKeyHash VerificationKey StakeKey
stakeVkey)
        deRegCert :: Certificate
deRegCert = StakeCredential -> Certificate
makeStakeAddressDeregistrationCertificate StakeCredential
stakeCred
    (FileError () -> ShelleyStakeAddressCmdError)
-> ExceptT (FileError ()) IO ()
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT FileError () -> ShelleyStakeAddressCmdError
ShelleyStakeAddressCmdWriteFileError
      (ExceptT (FileError ()) IO ()
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> (IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. IO (Either (FileError ()) ()) -> ExceptT (FileError ()) IO ()
forall (m :: * -> *) x a. m (Either x a) -> ExceptT x m a
newExceptT
      (IO (Either (FileError ()) ())
 -> ExceptT ShelleyStakeAddressCmdError IO ())
-> IO (Either (FileError ()) ())
-> ExceptT ShelleyStakeAddressCmdError IO ()
forall a b. (a -> b) -> a -> b
$ String
-> Maybe TextEnvelopeDescr
-> Certificate
-> IO (Either (FileError ()) ())
forall a.
HasTextEnvelope a =>
String
-> Maybe TextEnvelopeDescr -> a -> IO (Either (FileError ()) ())
writeFileTextEnvelope String
oFp (TextEnvelopeDescr -> Maybe TextEnvelopeDescr
forall a. a -> Maybe a
Just TextEnvelopeDescr
deregCertDesc) Certificate
deRegCert
  where
    deregCertDesc :: TextViewDescription
    deregCertDesc :: TextEnvelopeDescr
deregCertDesc = ByteString -> TextEnvelopeDescr
TextViewDescription ByteString
"Stake Address Deregistration Certificate"