diff --git a/cardano-cli/cardano-cli.cabal b/cardano-cli/cardano-cli.cabal index 03549054a7..d69d4ffb31 100644 --- a/cardano-cli/cardano-cli.cabal +++ b/cardano-cli/cardano-cli.cabal @@ -136,6 +136,7 @@ library , cryptonite , deepseq , directory + , either , filepath , formatting , io-classes diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs index 0686838411..e3167c9646 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Commands.hs @@ -1,5 +1,9 @@ {-# LANGUAGE DataKinds #-} +{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} -- | Shelley CLI command types @@ -23,9 +27,13 @@ module Cardano.CLI.Shelley.Commands , GovernanceActionId (..) , GovernanceActionReceipt (..) , GovernanceActionQueryResult (..) + , GovernanceActionInfoMetadata(..) + , GovernanceActionInfoMetadataUrl(..) , GenesisCmd (..) , TextViewCmd (..) , renderShelleyCommand + , AsType(..) + , Hash(..) -- * CLI flag types , AddressKeyType (..) @@ -51,7 +59,6 @@ module Cardano.CLI.Shelley.Commands , BlockId (..) , WitnessSigningData (..) , ColdVerificationKeyOrFile (..) - , GovernanceActionInfoResource(..) ) where import Cardano.Api.Shelley @@ -61,11 +68,17 @@ import Cardano.CLI.Shelley.Key (PaymentVerifier, PoolDelegationTarget, StakeVerifier, VerificationKeyOrFile, VerificationKeyOrHashOrFile, VerificationKeyTextOrFile) import Cardano.CLI.Types +import qualified Cardano.Crypto.Hash.Class as Crypto +import Cardano.Ledger.Crypto (StandardCrypto) +import qualified Cardano.Ledger.Keys as Shelley import Cardano.Ledger.Shelley.TxBody (MIRPot) import Prelude +import Data.ByteString (ByteString) +import Data.Either.Combinators (maybeToRight) import Data.Text (Text) + -- -- Shelley CLI command data types -- @@ -434,14 +447,33 @@ renderQueryCmd cmd = TxMempoolQueryNextTx -> "next-tx" TxMempoolQueryInfo -> "info" +newtype GovernanceActionInfoMetadataUrl = GovernanceActionInfoMetadataUrl Text + deriving newtype (Eq, Show) + +newtype GovernanceActionInfoMetadata = + GovernanceActionInfoMetadata + { unGovernanceActionInfoMetadata :: ByteString + } deriving (Eq, Show) + +newtype instance Hash GovernanceActionInfoMetadata = + GovernanceActionInfoMetadataHash (Shelley.Hash StandardCrypto ByteString) + deriving (Eq, Show) + +instance HasTypeProxy GovernanceActionInfoMetadata where + data AsType GovernanceActionInfoMetadata = AsGovernanceActionInfoMetadata + proxyToAsType _ = AsGovernanceActionInfoMetadata + +instance SerialiseAsRawBytes (Hash GovernanceActionInfoMetadata) where + serialiseToRawBytes (GovernanceActionInfoMetadataHash h) = Crypto.hashToBytes h + + deserialiseFromRawBytes (AsHash AsGovernanceActionInfoMetadata) bs = + maybeToRight (SerialiseAsRawBytesError "Unable to deserialise Hash GovernanceActionInfoMetadata") $ + GovernanceActionInfoMetadataHash <$> Crypto.hashFromBytes bs + data GovernanceAction = GovernanceActionOfInfo - GovernanceActionInfoResource - deriving Show - -data GovernanceActionInfoResource - = GovernanceActionInfoResourceOfFile (File () In) - | GovernanceActionInfoResourceOfUrl (File () In) + GovernanceActionInfoMetadataUrl + (Hash GovernanceActionInfoMetadata) deriving Show data Vote = VoteYes | VoteNo | VoteAbstain deriving Show diff --git a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs index 14dc707328..71536259a6 100644 --- a/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs +++ b/cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs @@ -1228,32 +1228,36 @@ pGovernanceActionCmd envCli = pGovernanceActionOfInfo :: Parser GovernanceAction pGovernanceActionOfInfo = GovernanceActionOfInfo - <$> pGovernanceActionInfoResource + <$> pGovernanceActionInfoMetadataUrl + <*> pGovernanceActionInfoMetadataHash - pGovernanceActionInfoResource :: Parser GovernanceActionInfoResource - pGovernanceActionInfoResource = - asum - [ pGovernanceActionInfoResourceOfUrl - , pGovernanceActionInfoResourceOfFile - ] + -- GovernanceActionOfInfo + -- GovernanceInfoActionMetadataUrl + -- (Hash GovernanceInfoActionMetadata) - pGovernanceActionInfoResourceOfUrl :: Parser GovernanceActionInfoResource - pGovernanceActionInfoResourceOfUrl = - fmap GovernanceActionInfoResourceOfUrl $ Opt.strOption $ mconcat + pGovernanceActionInfoMetadataUrl :: Parser GovernanceActionInfoMetadataUrl + pGovernanceActionInfoMetadataUrl = + fmap GovernanceActionInfoMetadataUrl $ Opt.strOption $ mconcat [ Opt.long "metadata-url" , Opt.metavar "URL" , Opt.help "The metadata url." , Opt.completer (Opt.bashCompleter "url") ] - pGovernanceActionInfoResourceOfFile :: Parser GovernanceActionInfoResource - pGovernanceActionInfoResourceOfFile = - fmap GovernanceActionInfoResourceOfFile $ Opt.strOption $ mconcat - [ Opt.long "metadata-file" - , Opt.metavar "FILE" - , Opt.help "The metadata file." - , Opt.completer (Opt.bashCompleter "file") - ] + pGovernanceActionInfoMetadataHash :: Parser (Hash GovernanceActionInfoMetadata) + pGovernanceActionInfoMetadataHash = + Opt.option + (Opt.eitherReader metadataHash) + ( Opt.long "metadata-hash" + <> Opt.metavar "HASH" + <> Opt.help "Pool metadata hash." + ) + where + metadataHash :: String -> Either String (Hash GovernanceActionInfoMetadata) + metadataHash = + first displayError + . deserialiseFromRawBytesHex (AsHash AsGovernanceActionInfoMetadata) + . BSC.pack pActionView :: Parser GovernanceActionCmd pActionView = diff --git a/cardano-cli/test/cardano-cli-golden/files/golden/help.cli b/cardano-cli/test/cardano-cli-golden/files/golden/help.cli index dbc871fdf2..fb9e6cd854 100644 --- a/cardano-cli/test/cardano-cli-golden/files/golden/help.cli +++ b/cardano-cli/test/cardano-cli-golden/files/golden/help.cli @@ -76,12 +76,8 @@ Usage: cardano-cli governance action (create-info | view | query) Commands related to governance actions -Usage: cardano-cli governance action create-info - ( --stake-verification-key STRING - | --stake-verification-key-file FILE - | --stake-script-file FILE - ) - (--metadata-url URL | --metadata-file FILE) +Usage: cardano-cli governance action create-info --metadata-url URL + --metadata-hash HASH --out-file FILE Create an info action diff --git a/cardano-cli/test/cardano-cli-golden/files/golden/help/governance_action_create-info.cli b/cardano-cli/test/cardano-cli-golden/files/golden/help/governance_action_create-info.cli index c885140ea4..91efec8cd2 100644 --- a/cardano-cli/test/cardano-cli-golden/files/golden/help/governance_action_create-info.cli +++ b/cardano-cli/test/cardano-cli-golden/files/golden/help/governance_action_create-info.cli @@ -1,20 +1,11 @@ -Usage: cardano-cli governance action create-info - ( --stake-verification-key STRING - | --stake-verification-key-file FILE - | --stake-script-file FILE - ) - (--metadata-url URL | --metadata-file FILE) +Usage: cardano-cli governance action create-info --metadata-url URL + --metadata-hash HASH --out-file FILE Create an info action Available options: - --stake-verification-key STRING - Stake verification key (Bech32 or hex-encoded). - --stake-verification-key-file FILE - Filepath of the staking verification key. - --stake-script-file FILE Filepath of the staking script. --metadata-url URL The metadata url. - --metadata-file FILE The metadata file. + --metadata-hash HASH Pool metadata hash. --out-file FILE The output file. -h,--help Show this help text