diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs index 094b4e1f919..c017a614309 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs @@ -51,8 +51,8 @@ import Cardano.Api.Shelley import Data.Text (Text) -import Cardano.CLI.Shelley.Key (PaymentVerifier, StakeVerifier, VerificationKeyOrFile, - VerificationKeyOrHashOrFile, VerificationKeyTextOrFile) +import Cardano.CLI.Shelley.Key (PaymentVerifier, StakeIdentifier, StakeVerifier, + VerificationKeyOrFile, VerificationKeyOrHashOrFile, VerificationKeyTextOrFile) import Cardano.CLI.Types import Cardano.Chain.Common (BlockCount) @@ -94,7 +94,7 @@ data AddressCmd | AddressKeyHash VerificationKeyTextOrFile (Maybe OutputFile) | AddressBuild PaymentVerifier - (Maybe StakeVerifier) + (Maybe StakeIdentifier) NetworkId (Maybe OutputFile) | AddressInfo Text (Maybe OutputFile) @@ -113,12 +113,12 @@ data StakeAddressCmd = StakeAddressKeyGen VerificationKeyFile SigningKeyFile | StakeAddressKeyHash (VerificationKeyOrFile StakeKey) (Maybe OutputFile) | StakeAddressBuild StakeVerifier NetworkId (Maybe OutputFile) - | StakeRegistrationCert StakeVerifier OutputFile + | StakeRegistrationCert StakeIdentifier OutputFile | StakeCredentialDelegationCert - StakeVerifier + StakeIdentifier (VerificationKeyOrHashOrFile StakePoolKey) OutputFile - | StakeCredentialDeRegistrationCert StakeVerifier OutputFile + | StakeCredentialDeRegistrationCert StakeIdentifier OutputFile deriving Show renderStakeAddressCmd :: StakeAddressCmd -> Text diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Key.hs b/cardano-cli/src/Cardano/CLI/Shelley/Key.hs index f5fdf0c8936..a72edf9c9aa 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Key.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Key.hs @@ -20,6 +20,7 @@ module Cardano.CLI.Shelley.Key , readVerificationKeyOrHashOrTextEnvFile , PaymentVerifier(..) + , StakeIdentifier(..) , StakeVerifier(..) , generateKeyPair @@ -102,7 +103,11 @@ data PaymentVerifier data StakeVerifier = StakeVerifierKey (VerificationKeyOrFile StakeKey) | StakeVerifierScriptFile ScriptFile - | StakeVerifierAddress StakeAddress + deriving (Eq, Show) + +data StakeIdentifier + = StakeIdentifierVerifier StakeVerifier + | StakeIdentifierAddress StakeAddress deriving (Eq, Show) -- | Either an unvalidated text representation of a verification key or a path diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs index 39d7f9c0edc..f98854e3c9b 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs @@ -58,8 +58,8 @@ import Cardano.Api.Shelley import Cardano.Chain.Common (BlockCount (BlockCount)) import Cardano.CLI.Shelley.Commands -import Cardano.CLI.Shelley.Key (PaymentVerifier (..), StakeVerifier (..), - VerificationKeyOrFile (..), VerificationKeyOrHashOrFile (..), +import Cardano.CLI.Shelley.Key (PaymentVerifier (..), StakeIdentifier (..), + StakeVerifier (..), VerificationKeyOrFile (..), VerificationKeyOrHashOrFile (..), VerificationKeyTextOrFile (..)) import Cardano.CLI.Types @@ -158,7 +158,7 @@ pAddressCmd = pAddressBuild :: Parser AddressCmd pAddressBuild = AddressBuild <$> pPaymentVerifier - <*> Opt.optional pStakeVerifier + <*> Opt.optional pStakeIdentifier <*> pNetworkId <*> pMaybeOutputFile @@ -172,13 +172,17 @@ pPaymentVerifier = pScriptFor "payment-script-file" Nothing "Filepath of the payment script." +pStakeIdentifier :: Parser StakeIdentifier +pStakeIdentifier = asum + [ StakeIdentifierVerifier <$> pStakeVerifier + , StakeIdentifierAddress <$> pStakeAddress + ] + pStakeVerifier :: Parser StakeVerifier -pStakeVerifier = - StakeVerifierKey <$> pStakeVerificationKeyOrFile - <|> StakeVerifierScriptFile <$> - pScriptFor "stake-script-file" Nothing - "Filepath of the staking script." - <|> StakeVerifierAddress <$> pStakeAddress +pStakeVerifier = asum + [ StakeVerifierKey <$> pStakeVerificationKeyOrFile + , StakeVerifierScriptFile <$> pScriptFor "stake-script-file" Nothing "Filepath of the staking script." + ] pPaymentVerificationKeyTextOrFile :: Parser VerificationKeyTextOrFile pPaymentVerificationKeyTextOrFile = @@ -385,25 +389,30 @@ pStakeAddressCmd = pStakeAddressKeyHash = StakeAddressKeyHash <$> pStakeVerificationKeyOrFile <*> pMaybeOutputFile pStakeAddressBuild :: Parser StakeAddressCmd - pStakeAddressBuild = StakeAddressBuild <$> pStakeVerifier - <*> pNetworkId - <*> pMaybeOutputFile + pStakeAddressBuild = + StakeAddressBuild + <$> pStakeVerifier + <*> pNetworkId + <*> pMaybeOutputFile pStakeAddressRegistrationCert :: Parser StakeAddressCmd - pStakeAddressRegistrationCert = StakeRegistrationCert - <$> pStakeVerifier - <*> pOutputFile + pStakeAddressRegistrationCert = + StakeRegistrationCert + <$> pStakeIdentifier + <*> pOutputFile pStakeAddressDeregistrationCert :: Parser StakeAddressCmd - pStakeAddressDeregistrationCert = StakeCredentialDeRegistrationCert - <$> pStakeVerifier - <*> pOutputFile + pStakeAddressDeregistrationCert = + StakeCredentialDeRegistrationCert + <$> pStakeIdentifier + <*> pOutputFile pStakeAddressDelegationCert :: Parser StakeAddressCmd - pStakeAddressDelegationCert = StakeCredentialDelegationCert - <$> pStakeVerifier - <*> pStakePoolVerificationKeyOrHashOrFile - <*> pOutputFile + pStakeAddressDelegationCert = + StakeCredentialDelegationCert + <$> pStakeIdentifier + <*> pStakePoolVerificationKeyOrHashOrFile + <*> pOutputFile pKeyCmd :: Parser KeyCmd pKeyCmd = diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Run/Address.hs b/cardano-cli/src/Cardano/CLI/Shelley/Run/Address.hs index 8a61c5a820a..b7563d11c80 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Run/Address.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Run/Address.hs @@ -22,10 +22,10 @@ import qualified Data.Text.IO as Text import Cardano.Api import Cardano.Api.Shelley -import Cardano.CLI.Shelley.Key (PaymentVerifier (..), StakeVerifier (..), - VerificationKeyTextOrFile, VerificationKeyTextOrFileError (..), generateKeyPair, - readVerificationKeyOrFile, readVerificationKeyTextOrFileAnyOf, - renderVerificationKeyTextOrFileError) +import Cardano.CLI.Shelley.Key (PaymentVerifier (..), StakeIdentifier (..), + StakeVerifier (..), VerificationKeyTextOrFile, + VerificationKeyTextOrFileError (..), generateKeyPair, readVerificationKeyOrFile, + readVerificationKeyTextOrFileAnyOf, renderVerificationKeyTextOrFileError) import Cardano.CLI.Shelley.Parsers (AddressCmd (..), AddressKeyType (..), OutputFile (..)) import Cardano.CLI.Shelley.Run.Address.Info (ShelleyAddressInfoError, runAddressInfo) import Cardano.CLI.Shelley.Run.Read @@ -114,7 +114,7 @@ runAddressKeyHash vkeyTextOrFile mOutputFp = do runAddressBuild :: PaymentVerifier - -> Maybe StakeVerifier + -> Maybe StakeIdentifier -> NetworkId -> Maybe OutputFile -> ExceptT ShelleyAddressCmdError IO () @@ -156,29 +156,31 @@ runAddressBuild paymentVerifier mbStakeVerifier nw mOutFp = do Nothing -> liftIO $ Text.putStr outText makeStakeAddressRef - :: StakeVerifier + :: StakeIdentifier -> ExceptT ShelleyAddressCmdError IO StakeAddressReference -makeStakeAddressRef stakeVerifier = case stakeVerifier of - StakeVerifierKey stkVkeyOrFile -> do - stakeVKey <- firstExceptT ShelleyAddressCmdReadKeyFileError $ - newExceptT $ readVerificationKeyOrFile AsStakeKey stkVkeyOrFile - - return . StakeAddressByValue . StakeCredentialByKey . verificationKeyHash $ stakeVKey - - StakeVerifierScriptFile (ScriptFile fp) -> do - ScriptInAnyLang _lang script <- - firstExceptT ShelleyAddressCmdReadScriptFileError $ - readFileScriptInAnyLang fp - - let stakeCred = StakeCredentialByScript (hashScript script) - return (StakeAddressByValue stakeCred) - - StakeVerifierAddress stakeAddr -> +makeStakeAddressRef stakeIdentifier = + case stakeIdentifier of + StakeIdentifierVerifier stakeVerifier -> + case stakeVerifier of + StakeVerifierKey stkVkeyOrFile -> do + stakeVKey <- firstExceptT ShelleyAddressCmdReadKeyFileError $ + newExceptT $ readVerificationKeyOrFile AsStakeKey stkVkeyOrFile + + return . StakeAddressByValue . StakeCredentialByKey . verificationKeyHash $ stakeVKey + + StakeVerifierScriptFile (ScriptFile fp) -> do + ScriptInAnyLang _lang script <- + firstExceptT ShelleyAddressCmdReadScriptFileError $ + readFileScriptInAnyLang fp + + let stakeCred = StakeCredentialByScript (hashScript script) + return (StakeAddressByValue stakeCred) + StakeIdentifierAddress stakeAddr -> pure $ StakeAddressByValue $ stakeAddressCredential stakeAddr buildShelleyAddress :: VerificationKey PaymentKey - -> Maybe StakeVerifier + -> Maybe StakeIdentifier -> NetworkId -> ExceptT ShelleyAddressCmdError IO (Address ShelleyAddr) buildShelleyAddress vkey mbStakeVerifier nw = diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Run/StakeAddress.hs b/cardano-cli/src/Cardano/CLI/Shelley/Run/StakeAddress.hs index fa435d6a923..9529c40285a 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Run/StakeAddress.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Run/StakeAddress.hs @@ -18,8 +18,8 @@ import qualified Data.Text.IO as Text import Cardano.Api import Cardano.Api.Shelley -import Cardano.CLI.Shelley.Key (StakeVerifier (..), VerificationKeyOrFile, - VerificationKeyOrHashOrFile, readVerificationKeyOrFile, +import Cardano.CLI.Shelley.Key (StakeIdentifier (..), StakeVerifier (..), + VerificationKeyOrFile, VerificationKeyOrHashOrFile, readVerificationKeyOrFile, readVerificationKeyOrHashOrFile) import Cardano.CLI.Shelley.Parsers import Cardano.CLI.Shelley.Run.Read @@ -43,12 +43,12 @@ runStakeAddressCmd (StakeAddressKeyGen vk sk) = runStakeAddressKeyGenToFile vk s runStakeAddressCmd (StakeAddressKeyHash vk mOutputFp) = runStakeAddressKeyHash vk mOutputFp runStakeAddressCmd (StakeAddressBuild stakeVerifier nw mOutputFp) = runStakeAddressBuild stakeVerifier nw mOutputFp -runStakeAddressCmd (StakeRegistrationCert stakeVerifier outputFp) = - runStakeCredentialRegistrationCert stakeVerifier outputFp -runStakeAddressCmd (StakeCredentialDelegationCert stakeVerifier stkPoolVerKeyHashOrFp outputFp) = - runStakeCredentialDelegationCert stakeVerifier stkPoolVerKeyHashOrFp outputFp -runStakeAddressCmd (StakeCredentialDeRegistrationCert stakeVerifier outputFp) = - runStakeCredentialDeRegistrationCert stakeVerifier outputFp +runStakeAddressCmd (StakeRegistrationCert stakeIdentifier outputFp) = + runStakeCredentialRegistrationCert stakeIdentifier outputFp +runStakeAddressCmd (StakeCredentialDelegationCert stakeIdentifier stkPoolVerKeyHashOrFp outputFp) = + runStakeCredentialDelegationCert stakeIdentifier stkPoolVerKeyHashOrFp outputFp +runStakeAddressCmd (StakeCredentialDeRegistrationCert stakeIdentifier outputFp) = + runStakeCredentialDeRegistrationCert stakeIdentifier outputFp -- @@ -101,11 +101,11 @@ runStakeAddressBuild stakeVerifier network mOutputFp = do runStakeCredentialRegistrationCert - :: StakeVerifier + :: StakeIdentifier -> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO () -runStakeCredentialRegistrationCert stakeVerifier (OutputFile oFp) = do - stakeCred <- getStakeCredentialFromVerifier stakeVerifier +runStakeCredentialRegistrationCert stakeIdentifier (OutputFile oFp) = do + stakeCred <- getStakeCredentialFromIdentifier stakeIdentifier writeRegistrationCert stakeCred where @@ -123,7 +123,7 @@ runStakeCredentialRegistrationCert stakeVerifier (OutputFile oFp) = do runStakeCredentialDelegationCert - :: StakeVerifier + :: StakeIdentifier -- ^ Delegator stake verification key, verification key file or script file. -> VerificationKeyOrHashOrFile StakePoolKey -- ^ Delegatee stake pool verification key or verification key file or @@ -135,7 +135,7 @@ runStakeCredentialDelegationCert stakeVerifier poolVKeyOrHashOrFile (OutputFile firstExceptT ShelleyStakeAddressCmdReadKeyFileError (newExceptT $ readVerificationKeyOrHashOrFile AsStakePoolKey poolVKeyOrHashOrFile) - stakeCred <- getStakeCredentialFromVerifier stakeVerifier + stakeCred <- getStakeCredentialFromIdentifier stakeVerifier writeDelegationCert stakeCred poolStakeVKeyHash where @@ -154,11 +154,11 @@ runStakeCredentialDelegationCert stakeVerifier poolVKeyOrHashOrFile (OutputFile runStakeCredentialDeRegistrationCert - :: StakeVerifier + :: StakeIdentifier -> OutputFile -> ExceptT ShelleyStakeAddressCmdError IO () runStakeCredentialDeRegistrationCert stakeVerifier (OutputFile oFp) = do - stakeCred <- getStakeCredentialFromVerifier stakeVerifier + stakeCred <- getStakeCredentialFromIdentifier stakeVerifier writeDeregistrationCert stakeCred where @@ -176,7 +176,8 @@ runStakeCredentialDeRegistrationCert stakeVerifier (OutputFile oFp) = do getStakeCredentialFromVerifier - :: StakeVerifier -> ExceptT ShelleyStakeAddressCmdError IO StakeCredential + :: StakeVerifier + -> ExceptT ShelleyStakeAddressCmdError IO StakeCredential getStakeCredentialFromVerifier = \case StakeVerifierScriptFile (ScriptFile sFile) -> do ScriptInAnyLang _ script <- @@ -191,13 +192,16 @@ getStakeCredentialFromVerifier = \case $ readVerificationKeyOrFile AsStakeKey stakeVerKeyOrFile pure $ StakeCredentialByKey $ verificationKeyHash stakeVerKey - StakeVerifierAddress stakeAddr -> pure $ stakeAddressCredential stakeAddr +getStakeCredentialFromIdentifier + :: StakeIdentifier + -> ExceptT ShelleyStakeAddressCmdError IO StakeCredential +getStakeCredentialFromIdentifier = \case + StakeIdentifierAddress stakeAddr -> pure $ stakeAddressCredential stakeAddr + StakeIdentifierVerifier stakeVerifier -> getStakeCredentialFromVerifier stakeVerifier getStakeAddressFromVerifier :: NetworkId -> StakeVerifier -> ExceptT ShelleyStakeAddressCmdError IO StakeAddress -getStakeAddressFromVerifier networkId = \case - StakeVerifierAddress stakeAddr -> pure stakeAddr - stakeVerifier -> - makeStakeAddress networkId <$> getStakeCredentialFromVerifier stakeVerifier +getStakeAddressFromVerifier networkId stakeVerifier = + makeStakeAddress networkId <$> getStakeCredentialFromVerifier stakeVerifier