diff --git a/cardano-cli/cardano-cli.cabal b/cardano-cli/cardano-cli.cabal index 291ef254ac..f07084495b 100644 --- a/cardano-cli/cardano-cli.cabal +++ b/cardano-cli/cardano-cli.cabal @@ -121,6 +121,8 @@ library Cardano.CLI.EraBased.Script.Certificate.Types Cardano.CLI.EraBased.Script.Mint.Read Cardano.CLI.EraBased.Script.Mint.Types + Cardano.CLI.EraBased.Script.Proposal.Read + Cardano.CLI.EraBased.Script.Proposal.Types Cardano.CLI.EraBased.Script.Read.Common Cardano.CLI.EraBased.Script.Spend.Read Cardano.CLI.EraBased.Script.Spend.Types diff --git a/cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs b/cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs index 3b488ee088..c083dda7bb 100644 --- a/cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs +++ b/cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs @@ -24,6 +24,7 @@ import Cardano.CLI.EraBased.Options.Common hiding (pRefScriptFp, pTxOu import Cardano.CLI.EraBased.Run.Transaction import Cardano.CLI.EraBased.Script.Certificate.Read import Cardano.CLI.EraBased.Script.Certificate.Types +import Cardano.CLI.EraBased.Script.Proposal.Types import Cardano.CLI.EraBased.Script.Types import Cardano.CLI.EraBased.Script.Vote.Types (CliVoteScriptRequirements, VoteScriptWitness (..)) @@ -182,7 +183,7 @@ data CompatibleTransactionCmds era [TxIn] [TxOutAnyEra] !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))) - !(Maybe (Featured ConwayEraOnwards era [(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))])) + !(Maybe (Featured ConwayEraOnwards era [(ProposalFile In, Maybe CliProposalScriptRequirements)])) ![(VoteFile In, Maybe CliVoteScriptRequirements)] [WitnessSigningData] -- ^ Signing keys @@ -354,7 +355,7 @@ readUpdateProposalFile (Featured sToB (Just updateProposalFile)) = do TxUpdateProposal _ proposal -> return $ ProtocolUpdate sToB proposal readProposalProcedureFile - :: Featured ConwayEraOnwards era [(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] + :: Featured ConwayEraOnwards era [(ProposalFile In, Maybe CliProposalScriptRequirements)] -> ExceptT CompatibleTransactionError IO (AnyProtocolUpdate era) readProposalProcedureFile (Featured cEraOnwards []) = let sbe = convert cEraOnwards @@ -367,4 +368,5 @@ readProposalProcedureFile (Featured cEraOnwards proposals) = do return $ conwayEraOnwardsConstraints cEraOnwards $ ProposalProcedures cEraOnwards $ - mkTxProposalProcedures [(govProp, mScriptWit) | (Proposal govProp, mScriptWit) <- props] + mkTxProposalProcedures + [(govProp, pswScriptWitness <$> mScriptWit) | (Proposal govProp, mScriptWit) <- props] diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs b/cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs index 7633bbd528..88beeb5a96 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs @@ -27,6 +27,7 @@ import Cardano.Api.Shelley import Cardano.CLI.EraBased.Script.Certificate.Types (CliCertificateScriptRequirements) import Cardano.CLI.EraBased.Script.Mint.Types +import Cardano.CLI.EraBased.Script.Proposal.Types (CliProposalScriptRequirements) import Cardano.CLI.EraBased.Script.Spend.Types (CliSpendScriptRequirements) import Cardano.CLI.EraBased.Script.Vote.Types import Cardano.CLI.Orphans () @@ -84,7 +85,7 @@ data TransactionBuildRawCmdArgs era = TransactionBuildRawCmdArgs , mProtocolParamsFile :: !(Maybe ProtocolParamsFile) , mUpdateProprosalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))) , voteFiles :: ![(VoteFile In, Maybe CliVoteScriptRequirements)] - , proposalFiles :: ![(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] + , proposalFiles :: ![(ProposalFile In, Maybe CliProposalScriptRequirements)] , currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)) , txBodyOutFile :: !(TxBodyFile Out) } @@ -130,7 +131,7 @@ data TransactionBuildCmdArgs era = TransactionBuildCmdArgs , metadataFiles :: ![MetadataFile] , mUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))) , voteFiles :: ![(VoteFile In, Maybe CliVoteScriptRequirements)] - , proposalFiles :: ![(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] + , proposalFiles :: ![(ProposalFile In, Maybe CliProposalScriptRequirements)] , treasuryDonation :: !(Maybe TxTreasuryDonation) , buildOutputOptions :: !TxBuildOutputOptions } @@ -180,7 +181,7 @@ data TransactionBuildEstimateCmdArgs era = TransactionBuildEstimateCmdArgs , metadataFiles :: ![MetadataFile] , mUpdateProposalFile :: !(Maybe (Featured ShelleyToBabbageEra era (Maybe UpdateProposalFile))) , voteFiles :: ![(VoteFile In, Maybe CliVoteScriptRequirements)] - , proposalFiles :: ![(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] + , proposalFiles :: ![(ProposalFile In, Maybe CliProposalScriptRequirements)] , currentTreasuryValueAndDonation :: !(Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)) , txBodyOutFile :: !(TxBodyFile Out) } diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs b/cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs index 014d5ed47c..b543cc72ae 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs @@ -21,6 +21,8 @@ import Cardano.CLI.Environment (EnvCli (..), envCliAnyEon) import Cardano.CLI.EraBased.Script.Certificate.Types (CliCertificateScriptRequirements) import qualified Cardano.CLI.EraBased.Script.Certificate.Types as Certifying import Cardano.CLI.EraBased.Script.Mint.Types +import Cardano.CLI.EraBased.Script.Proposal.Types (CliProposalScriptRequirements) +import qualified Cardano.CLI.EraBased.Script.Proposal.Types as Proposing import Cardano.CLI.EraBased.Script.Spend.Types (CliSpendScriptRequirements) import qualified Cardano.CLI.EraBased.Script.Spend.Types as PlutusSpend import Cardano.CLI.EraBased.Script.Vote.Types (CliVoteScriptRequirements) @@ -1302,7 +1304,7 @@ pVoteFile balExUnits = "vote" Nothing "a vote" - <|> pVoteReferencePlutusScriptWitness "vote-" balExUnits + <|> pVoteReferencePlutusScriptWitness "vote" balExUnits pVoteScriptWitness :: BalanceTxExecUnits -> String -> Maybe String -> String -> Parser CliVoteScriptRequirements @@ -1324,19 +1326,20 @@ pVoteScriptWitness bExecUnits scriptFlagPrefix scriptFlagPrefixDeprecated help = pVoteReferencePlutusScriptWitness :: String -> BalanceTxExecUnits -> Parser CliVoteScriptRequirements pVoteReferencePlutusScriptWitness prefix autoBalanceExecUnits = - Voting.createPlutusReferenceScriptFromCliArgs - <$> pReferenceTxIn prefix "plutus" - <*> plutusP prefix PlutusScriptV3 "v3" - <*> pScriptRedeemerOrFile (prefix ++ "reference-tx-in") - <*> ( case autoBalanceExecUnits of - AutoBalance -> pure (ExecutionUnits 0 0) - ManualBalance -> pExecutionUnits $ prefix ++ "reference-tx-in" - ) + let appendedPrefix = prefix ++ "-" + in Voting.createPlutusReferenceScriptFromCliArgs + <$> pReferenceTxIn appendedPrefix "plutus" + <*> plutusP appendedPrefix PlutusScriptV3 "v3" + <*> pScriptRedeemerOrFile (appendedPrefix ++ "reference-tx-in") + <*> ( case autoBalanceExecUnits of + AutoBalance -> pure (ExecutionUnits 0 0) + ManualBalance -> pExecutionUnits $ appendedPrefix ++ "reference-tx-in" + ) pProposalFiles :: ShelleyBasedEra era -> BalanceTxExecUnits - -> Parser [(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] + -> Parser [(ProposalFile In, Maybe CliProposalScriptRequirements)] pProposalFiles sbe balExUnits = caseShelleyToBabbageOrConwayEraOnwards (const $ pure []) @@ -1345,22 +1348,51 @@ pProposalFiles sbe balExUnits = pProposalFile :: BalanceTxExecUnits - -> Parser (ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake)) + -> Parser (ProposalFile In, Maybe CliProposalScriptRequirements) pProposalFile balExUnits = (,) <$> pFileInDirection "proposal-file" "Filepath of the proposal." <*> optional (pProposingScriptOrReferenceScriptWitness balExUnits) where pProposingScriptOrReferenceScriptWitness - :: BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxStake) + :: BalanceTxExecUnits -> Parser CliProposalScriptRequirements pProposingScriptOrReferenceScriptWitness bExUnits = - pScriptWitnessFiles - WitCtxStake + pProposalScriptWitness bExUnits "proposal" Nothing "a proposal" - <|> pPlutusStakeReferenceScriptWitnessFilesVotingProposing "proposal-" balExUnits + <|> pProposalReferencePlutusScriptWitness "proposal" balExUnits + +pProposalScriptWitness + :: BalanceTxExecUnits -> String -> Maybe String -> String -> Parser CliProposalScriptRequirements +pProposalScriptWitness bExecUnits scriptFlagPrefix scriptFlagPrefixDeprecated help = + Proposing.createSimpleOrPlutusScriptFromCliArgs + <$> pScriptFor + (scriptFlagPrefix ++ "-script-file") + ((++ "-script-file") <$> scriptFlagPrefixDeprecated) + ("The file containing the script to witness " ++ help) + <*> optional + ( (,) + <$> pScriptRedeemerOrFile scriptFlagPrefix + <*> ( case bExecUnits of + AutoBalance -> pure (ExecutionUnits 0 0) + ManualBalance -> pExecutionUnits scriptFlagPrefix + ) + ) + +pProposalReferencePlutusScriptWitness + :: String -> BalanceTxExecUnits -> Parser CliProposalScriptRequirements +pProposalReferencePlutusScriptWitness prefix autoBalanceExecUnits = + let appendedPrefix = prefix ++ "-" + in Proposing.createPlutusReferenceScriptFromCliArgs + <$> pReferenceTxIn appendedPrefix "plutus" + <*> plutusP appendedPrefix PlutusScriptV3 "v3" + <*> pScriptRedeemerOrFile (appendedPrefix ++ "reference-tx-in") + <*> ( case autoBalanceExecUnits of + AutoBalance -> pure (ExecutionUnits 0 0) + ManualBalance -> pExecutionUnits $ appendedPrefix ++ "reference-tx-in" + ) pCurrentTreasuryValueAndDonation :: ShelleyBasedEra era -> Parser (Maybe (TxCurrentTreasuryValue, TxTreasuryDonation)) @@ -1527,7 +1559,7 @@ pCertificateFile balanceExecUnits = "certificate" Nothing "the use of the certificate." - <|> pCertificateReferencePlutusScriptWitness "certificate-" bExecUnits + <|> pCertificateReferencePlutusScriptWitness "certificate" bExecUnits helpText = mconcat @@ -1556,14 +1588,15 @@ pCertificatePlutusScriptWitness bExecUnits scriptFlagPrefix scriptFlagPrefixDepr pCertificateReferencePlutusScriptWitness :: String -> BalanceTxExecUnits -> Parser CliCertificateScriptRequirements pCertificateReferencePlutusScriptWitness prefix autoBalanceExecUnits = - Certifying.createPlutusReferenceScriptFromCliArgs - <$> pReferenceTxIn prefix "plutus" - <*> pPlutusScriptLanguage prefix - <*> pScriptRedeemerOrFile (prefix ++ "reference-tx-in") - <*> ( case autoBalanceExecUnits of - AutoBalance -> pure (ExecutionUnits 0 0) - ManualBalance -> pExecutionUnits $ prefix ++ "reference-tx-in" - ) + let appendedPrefix = prefix ++ "-" + in Certifying.createPlutusReferenceScriptFromCliArgs + <$> pReferenceTxIn appendedPrefix "plutus" + <*> pPlutusScriptLanguage appendedPrefix + <*> pScriptRedeemerOrFile (appendedPrefix ++ "reference-tx-in") + <*> ( case autoBalanceExecUnits of + AutoBalance -> pure (ExecutionUnits 0 0) + ManualBalance -> pExecutionUnits $ appendedPrefix ++ "reference-tx-in" + ) pPoolMetadataFile :: Parser (StakePoolMetadataFile In) pPoolMetadataFile = @@ -1633,7 +1666,7 @@ pWithdrawal balance = "withdrawal" Nothing "the withdrawal of rewards." - <|> pPlutusStakeReferenceScriptWitnessFiles "withdrawal-" balance + <|> pPlutusStakeReferenceScriptWitnessFiles "withdrawal" balance helpText = mconcat @@ -1667,15 +1700,16 @@ pPlutusStakeReferenceScriptWitnessFiles -> BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxStake) pPlutusStakeReferenceScriptWitnessFiles prefix autoBalanceExecUnits = - PlutusReferenceScriptWitnessFiles - <$> pReferenceTxIn prefix "plutus" - <*> pPlutusScriptLanguage prefix - <*> pure NoScriptDatumOrFileForStake - <*> pScriptRedeemerOrFile (prefix ++ "reference-tx-in") - <*> ( case autoBalanceExecUnits of - AutoBalance -> pure (ExecutionUnits 0 0) - ManualBalance -> pExecutionUnits $ prefix ++ "reference-tx-in" - ) + let appendedPrefix = prefix ++ "-" + in PlutusReferenceScriptWitnessFiles + <$> pReferenceTxIn appendedPrefix "plutus" + <*> pPlutusScriptLanguage appendedPrefix + <*> pure NoScriptDatumOrFileForStake + <*> pScriptRedeemerOrFile (appendedPrefix ++ "reference-tx-in") + <*> ( case autoBalanceExecUnits of + AutoBalance -> pure (ExecutionUnits 0 0) + ManualBalance -> pExecutionUnits $ appendedPrefix ++ "reference-tx-in" + ) pPlutusScriptLanguage :: String -> Parser AnyPlutusScriptVersion pPlutusScriptLanguage prefix = plutusP prefix PlutusScriptV2 "v2" <|> plutusP prefix PlutusScriptV3 "v3" diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Run/Transaction.hs b/cardano-cli/src/Cardano/CLI/EraBased/Run/Transaction.hs index 166cad5669..032b075af7 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Run/Transaction.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Run/Transaction.hs @@ -51,6 +51,7 @@ import Cardano.CLI.EraBased.Script.Certificate.Read import Cardano.CLI.EraBased.Script.Certificate.Types (CertificateScriptWitness (..)) import Cardano.CLI.EraBased.Script.Mint.Read import Cardano.CLI.EraBased.Script.Mint.Types +import Cardano.CLI.EraBased.Script.Proposal.Types (ProposalScriptWitness (..)) import Cardano.CLI.EraBased.Script.Read.Common import Cardano.CLI.EraBased.Script.Spend.Read import Cardano.CLI.EraBased.Script.Spend.Types (SpendScriptWitness (..)) @@ -263,7 +264,7 @@ runTransactionBuildCmd (mapMaybe snd certsAndMaybeScriptWits) withdrawalsAndMaybeScriptWits (mapMaybe snd votingProceduresAndMaybeScriptWits) - proposals + (mapMaybe snd proposals) readOnlyReferenceInputs let inputsThatRequireWitnessing = [input | (input, _) <- txins] @@ -780,7 +781,7 @@ runTxBuildRaw -> Maybe (LedgerProtocolParameters era) -> TxUpdateProposal era -> [(VotingProcedures era, Maybe (VoteScriptWitness era))] - -> [(Proposal era, Maybe (ScriptWitness WitCtxStake era))] + -> [(Proposal era, Maybe (ProposalScriptWitness era))] -> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation) -> Either TxCmdError (TxBody era) runTxBuildRaw @@ -868,7 +869,7 @@ constructTxBodyContent -> TxMetadataInEra era -> TxUpdateProposal era -> [(VotingProcedures era, Maybe (VoteScriptWitness era))] - -> [(Proposal era, Maybe (ScriptWitness WitCtxStake era))] + -> [(Proposal era, Maybe (ProposalScriptWitness era))] -> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation) -- ^ The current treasury value and the donation. This is a stop gap as the -- semantics of the donation and treasury value depend on the script languages @@ -905,7 +906,7 @@ constructTxBodyContent (mapMaybe snd certsAndMaybeScriptWits) withdrawals (mapMaybe snd votingProcedures) - proposals + (mapMaybe snd proposals) readOnlyRefIns validatedCollateralTxIns <- validateTxInsCollateral sbe txinsc @@ -927,7 +928,10 @@ constructTxBodyContent mkTxVotingProcedures [(v, vswScriptWitness <$> mSwit) | (v, mSwit) <- votingProcedures] let txProposals = forShelleyBasedEraInEonMaybe sbe $ \w -> do let txp :: TxProposalProcedures BuildTx era - txp = conwayEraOnwardsConstraints w $ mkTxProposalProcedures $ map (first unProposal) proposals + txp = + conwayEraOnwardsConstraints w $ + mkTxProposalProcedures $ + [(unProposal prop, pswScriptWitness <$> mSwit) | (prop, mSwit) <- proposals] Featured w txp validatedCurrentTreasuryValue <- first @@ -1010,7 +1014,7 @@ runTxBuild -> TxUpdateProposal era -> Maybe Word -> [(VotingProcedures era, Maybe (VoteScriptWitness era))] - -> [(Proposal era, Maybe (ScriptWitness WitCtxStake era))] + -> [(Proposal era, Maybe (ProposalScriptWitness era))] -> Maybe (TxCurrentTreasuryValue, TxTreasuryDonation) -- ^ The current treasury value and the donation. -> ExceptT TxCmdError IO (BalancedTxBody era) @@ -1052,7 +1056,7 @@ runTxBuild (mapMaybe snd certsAndMaybeScriptWits) withdrawals (mapMaybe snd votingProcedures) - proposals + (mapMaybe snd proposals) readOnlyRefIns let allTxInputs = inputsThatRequireWitnessing ++ allReferenceInputs ++ txinsc @@ -1196,7 +1200,7 @@ getAllReferenceInputs -> [ScriptWitness WitCtxStake era] -> [(StakeAddress, Lovelace, Maybe (ScriptWitness WitCtxStake era))] -> [VoteScriptWitness era] - -> [(Proposal era, Maybe (ScriptWitness WitCtxStake era))] + -> [ProposalScriptWitness era] -> [TxIn] -- ^ Read only reference inputs -> [TxIn] @@ -1213,7 +1217,7 @@ getAllReferenceInputs certsWitByRefInputs = map getScriptWitnessReferenceInput certScriptWitnesses withdrawalsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, _, Just sWit) <- withdrawals] votesWitByRefInputs = map (getScriptWitnessReferenceInput . vswScriptWitness) votingProceduresAndMaybeScriptWits - propsWitByRefInputs = [getScriptWitnessReferenceInput sWit | (_, Just sWit) <- propProceduresAnMaybeScriptWits] + propsWitByRefInputs = map (getScriptWitnessReferenceInput . pswScriptWitness) propProceduresAnMaybeScriptWits concatMap catMaybes diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Read.hs b/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Read.hs new file mode 100644 index 0000000000..bdd1ee9309 --- /dev/null +++ b/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Read.hs @@ -0,0 +1,120 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE GADTs #-} + +module Cardano.CLI.EraBased.Script.Proposal.Read + ( readProposalScriptWitness + ) +where + +import Cardano.Api +import Cardano.Api.Shelley + +import Cardano.CLI.EraBased.Script.Proposal.Types +import Cardano.CLI.EraBased.Script.Read.Common +import Cardano.CLI.EraBased.Script.Types +import Cardano.CLI.Types.Common + +readProposalScriptWitness + :: MonadIOTransError (FileError CliScriptWitnessError) t m + => ConwayEraOnwards era + -> (ProposalFile In, Maybe CliProposalScriptRequirements) + -> t m (Proposal era, Maybe (ProposalScriptWitness era)) +readProposalScriptWitness w (propFp, Nothing) = do + proposal <- + conwayEraOnwardsConstraints w $ + modifyError (fmap TextEnvelopeError) $ + hoistIOEither $ + readFileTextEnvelope AsProposal propFp + return (proposal, Nothing) +readProposalScriptWitness w (propFp, Just certScriptReq) = do + let sbe = convert w + proposal <- + conwayEraOnwardsConstraints w $ + modifyError (fmap TextEnvelopeError) $ + hoistIOEither $ + readFileTextEnvelope AsProposal propFp + case certScriptReq of + OnDiskSimpleScript scriptFp -> do + let sFp = unFile scriptFp + s <- + modifyError (fmap SimpleScriptWitnessDecodeError) $ + readFileSimpleScript sFp + case s of + SimpleScript ss -> do + return + ( proposal + , Just $ + ProposalScriptWitness + ( SimpleScriptWitness (sbeToSimpleScriptLanguageInEra sbe) $ + SScript ss + ) + ) + OnDiskPlutusScript (OnDiskPlutusScriptCliArgs scriptFp redeemerFile execUnits) -> do + let plutusScriptFp = unFile scriptFp + plutusScript <- + modifyError (fmap PlutusScriptWitnessDecodeError) $ + readFilePlutusScript plutusScriptFp + redeemer <- + modifyError (FileError plutusScriptFp . PlutusScriptWitnessRedeemerError) $ + readScriptDataOrFile redeemerFile + case plutusScript of + AnyPlutusScript lang script -> do + let pScript = PScript script + sLangSupported <- + modifyError (FileError plutusScriptFp) + $ hoistMaybe + ( PlutusScriptWitnessLanguageNotSupportedInEra + (AnyPlutusScriptVersion lang) + (shelleyBasedEraConstraints sbe $ AnyShelleyBasedEra sbe) + ) + $ scriptLanguageSupportedInEra sbe + $ PlutusScriptLanguage lang + return + ( proposal + , Just $ + ProposalScriptWitness $ + PlutusScriptWitness + sLangSupported + lang + pScript + NoScriptDatumForStake + redeemer + execUnits + ) + OnDiskPlutusRefScript (PlutusRefScriptCliArgs refTxIn anyPlutusScriptVersion redeemerFile execUnits) -> do + case anyPlutusScriptVersion of + AnyPlutusScriptVersion lang -> do + let pScript = PReferenceScript refTxIn + redeemer <- + -- TODO: Implement a new error type to capture this. FileError is not representative of cases + -- where we do not have access to the script. + modifyError + ( FileError "Reference script filepath not available" + . PlutusScriptWitnessRedeemerError + ) + $ readScriptDataOrFile redeemerFile + sLangSupported <- + -- TODO: Implement a new error type to capture this. FileError is not representative of cases + -- where we do not have access to the script. + modifyError (FileError "Reference script filepath not available") + $ hoistMaybe + ( PlutusScriptWitnessLanguageNotSupportedInEra + (AnyPlutusScriptVersion lang) + (shelleyBasedEraConstraints sbe $ AnyShelleyBasedEra sbe) + ) + $ scriptLanguageSupportedInEra sbe + $ PlutusScriptLanguage lang + + return + ( proposal + , Just $ + ProposalScriptWitness $ + PlutusScriptWitness + sLangSupported + lang + pScript + NoScriptDatumForStake + redeemer + execUnits + ) diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Types.hs b/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Types.hs new file mode 100644 index 0000000000..93009b1e7c --- /dev/null +++ b/cardano-cli/src/Cardano/CLI/EraBased/Script/Proposal/Types.hs @@ -0,0 +1,63 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE GADTs #-} + +module Cardano.CLI.EraBased.Script.Proposal.Types + ( CliProposalScriptRequirements (..) + , PlutusRefScriptCliArgs (..) + , PlutusScriptCliArgs (..) + , ProposalScriptWitness (..) + , createSimpleOrPlutusScriptFromCliArgs + , createPlutusReferenceScriptFromCliArgs + ) +where + +import Cardano.Api + +import Cardano.CLI.Types.Common (ScriptDataOrFile) + +newtype ProposalScriptWitness era + = ProposalScriptWitness {pswScriptWitness :: ScriptWitness WitCtxStake era} + deriving Show + +data CliProposalScriptRequirements + = OnDiskPlutusScript PlutusScriptCliArgs + | OnDiskSimpleScript (File ScriptInAnyLang In) + | OnDiskPlutusRefScript PlutusRefScriptCliArgs + deriving Show + +data PlutusScriptCliArgs + = OnDiskPlutusScriptCliArgs + (File ScriptInAnyLang In) + ScriptDataOrFile + -- ^ Redeemer + ExecutionUnits + deriving Show + +createSimpleOrPlutusScriptFromCliArgs + :: File ScriptInAnyLang In + -> Maybe (ScriptDataOrFile, ExecutionUnits) + -> CliProposalScriptRequirements +createSimpleOrPlutusScriptFromCliArgs scriptFp (Just (redeemer, execUnits)) = + OnDiskPlutusScript $ OnDiskPlutusScriptCliArgs scriptFp redeemer execUnits +createSimpleOrPlutusScriptFromCliArgs scriptFp Nothing = + OnDiskSimpleScript scriptFp + +data PlutusRefScriptCliArgs + = PlutusRefScriptCliArgs + TxIn + -- ^ TxIn with reference script + AnyPlutusScriptVersion + ScriptDataOrFile + -- ^ Redeemer + ExecutionUnits + deriving Show + +createPlutusReferenceScriptFromCliArgs + :: TxIn + -> AnyPlutusScriptVersion + -> ScriptDataOrFile + -> ExecutionUnits + -> CliProposalScriptRequirements +createPlutusReferenceScriptFromCliArgs txIn version redeemer execUnits = + OnDiskPlutusRefScript $ PlutusRefScriptCliArgs txIn version redeemer execUnits diff --git a/cardano-cli/src/Cardano/CLI/Read.hs b/cardano-cli/src/Cardano/CLI/Read.hs index dc7148dab0..ecaad26b35 100644 --- a/cardano-cli/src/Cardano/CLI/Read.hs +++ b/cardano-cli/src/Cardano/CLI/Read.hs @@ -103,6 +103,9 @@ import qualified Cardano.Api.Ledger as L import Cardano.Api.Shelley as Api import qualified Cardano.Binary as CBOR +import Cardano.CLI.EraBased.Script.Proposal.Read +import Cardano.CLI.EraBased.Script.Proposal.Types (CliProposalScriptRequirements, + ProposalScriptWitness) import Cardano.CLI.EraBased.Script.Read.Common import Cardano.CLI.EraBased.Script.Types import Cardano.CLI.EraBased.Script.Vote.Read @@ -854,16 +857,14 @@ data ConstitutionError deriving Show data ProposalError - = ProposalErrorFile (FileError TextEnvelopeError) + = ProposalErrorFile (FileError CliScriptWitnessError) | ProposalNotSupportedInEra AnyCardanoEra - | ProposalNotUnicodeError Text.UnicodeException - | ProposalErrorScriptWitness ScriptWitnessError deriving Show readTxGovernanceActions :: ShelleyBasedEra era - -> [(ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))] - -> IO (Either ProposalError [(Proposal era, Maybe (ScriptWitness WitCtxStake era))]) + -> [(ProposalFile In, Maybe CliProposalScriptRequirements)] + -> IO (Either ProposalError [(Proposal era, Maybe (ProposalScriptWitness era))]) readTxGovernanceActions _ [] = return $ Right [] readTxGovernanceActions era files = runExceptT $ do w <- @@ -877,21 +878,12 @@ readTxGovernanceActions era files = runExceptT $ do readProposal :: ConwayEraOnwards era - -> (ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake)) - -> IO (Either ProposalError (Proposal era, Maybe (ScriptWitness WitCtxStake era))) + -> (ProposalFile In, Maybe CliProposalScriptRequirements) + -> IO (Either ProposalError (Proposal era, Maybe (ProposalScriptWitness era))) readProposal w (fp, mScriptWit) = do - prop <- - conwayEraOnwardsConstraints w $ - first ProposalErrorFile <$> readFileTextEnvelope AsProposal fp - case mScriptWit of - Nothing -> pure $ (,Nothing) <$> prop - sWitFile -> do - let sbe = convert w - runExceptT $ do - sWit <- - firstExceptT ProposalErrorScriptWitness $ - mapM (readScriptWitness sbe) sWitFile - hoistEither $ (,sWit) <$> prop + runExceptT $ + firstExceptT ProposalErrorFile $ + readProposalScriptWitness w (fp, mScriptWit) constitutionHashSourceToHash :: ()