Skip to content

Commit

Permalink
Merge pull request #1025 from IntersectMBO/jordan/remove-use-of-Scrip…
Browse files Browse the repository at this point in the history
…tWitnessFiles-in-spending-scripts

Remove use of `ScriptWitnessFiles` in spending scripts
  • Loading branch information
Jimbo4350 authored Jan 22, 2025
2 parents 4729a76 + dd329fa commit 002c340
Show file tree
Hide file tree
Showing 13 changed files with 439 additions and 150 deletions.
3 changes: 3 additions & 0 deletions cardano-cli/cardano-cli.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ library
Cardano.CLI.EraBased.Run.Transaction
Cardano.CLI.EraBased.Script.Mint.Read
Cardano.CLI.EraBased.Script.Mint.Types
Cardano.CLI.EraBased.Script.Spend.Read
Cardano.CLI.EraBased.Script.Spend.Types
Cardano.CLI.EraBased.Script.Types
Cardano.CLI.EraBased.Transaction.HashCheck
Cardano.CLI.Helpers
Cardano.CLI.IO.Lazy
Expand Down
4 changes: 2 additions & 2 deletions cardano-cli/src/Cardano/CLI/Compatible/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@ pCompatibleSignedTransaction env sbe =
<$> many pTxInOnly
<*> many (pTxOutEraAware sbe)
<*> pFeatured (toCardanoEra sbe) (optional pUpdateProposalFile)
<*> pFeatured (toCardanoEra sbe) (many (pProposalFile sbe ManualBalance))
<*> pFeatured (toCardanoEra sbe) (many (pProposalFile ManualBalance))
<*> pVoteFiles sbe ManualBalance
<*> many pWitnessSigningData
<*> optional (pNetworkId env)
<*> pTxFee
<*> many (pCertificateFile sbe ManualBalance)
<*> many (pCertificateFile ManualBalance)
<*> pOutputFile

pTxInOnly :: Parser TxIn
Expand Down
7 changes: 4 additions & 3 deletions cardano-cli/src/Cardano/CLI/EraBased/Commands/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import Cardano.Api.Ledger (Coin)
import Cardano.Api.Shelley

import Cardano.CLI.EraBased.Script.Mint.Types
import Cardano.CLI.EraBased.Script.Spend.Types (CliSpendScriptRequirements)
import Cardano.CLI.Types.Common
import Cardano.CLI.Types.Governance

Expand All @@ -49,7 +50,7 @@ data TransactionBuildRawCmdArgs era = TransactionBuildRawCmdArgs
{ eon :: !(ShelleyBasedEra era)
, mScriptValidity :: !(Maybe ScriptValidity)
-- ^ Mark script as expected to pass or fail validation
, txIns :: ![(TxIn, Maybe (ScriptWitnessFiles WitCtxTxIn))]
, txIns :: ![(TxIn, Maybe CliSpendScriptRequirements)]
-- ^ Transaction inputs with optional spending scripts
, readOnlyRefIns :: ![TxIn]
-- ^ Read only reference inputs
Expand Down Expand Up @@ -96,7 +97,7 @@ data TransactionBuildCmdArgs era = TransactionBuildCmdArgs
-- ^ Mark script as expected to pass or fail validation
, mOverrideWitnesses :: !(Maybe Word)
-- ^ Override the required number of tx witnesses
, txins :: ![(TxIn, Maybe (ScriptWitnessFiles WitCtxTxIn))]
, txins :: ![(TxIn, Maybe CliSpendScriptRequirements)]
-- ^ Transaction inputs with optional spending scripts
, readOnlyReferenceInputs :: ![TxIn]
-- ^ Read only reference inputs
Expand Down Expand Up @@ -144,7 +145,7 @@ data TransactionBuildEstimateCmdArgs era = TransactionBuildEstimateCmdArgs
, mByronWitnesses :: !(Maybe Int)
, protocolParamsFile :: !ProtocolParamsFile
, totalUTxOValue :: !Value
, txins :: ![(TxIn, Maybe (ScriptWitnessFiles WitCtxTxIn))]
, txins :: ![(TxIn, Maybe CliSpendScriptRequirements)]
-- ^ Transaction inputs with optional spending scripts
, readOnlyReferenceInputs :: ![TxIn]
-- ^ Read only reference inputs
Expand Down
195 changes: 117 additions & 78 deletions cardano-cli/src/Cardano/CLI/EraBased/Options/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import Cardano.Api.Shelley

import Cardano.CLI.Environment (EnvCli (..), envCliAnyEon)
import Cardano.CLI.EraBased.Script.Mint.Types
import Cardano.CLI.EraBased.Script.Spend.Types (CliSpendScriptRequirements)
import qualified Cardano.CLI.EraBased.Script.Spend.Types as PlutusSpend
import Cardano.CLI.Parser
import Cardano.CLI.Read
import Cardano.CLI.Types.Common
Expand Down Expand Up @@ -1029,38 +1031,71 @@ pPlutusMintScriptWitnessData _sbe _witctx autoBalanceExecUnits =
)
)

pSimpleScriptOrPlutusSpendingScriptWitness
:: ShelleyBasedEra era
-> BalanceTxExecUnits
-> String
-- ^ Script flag prefix
-> Maybe String
-- ^ Potential deprecated script flag prefix
-> String
-- ^ Help text
-> Parser CliSpendScriptRequirements
pSimpleScriptOrPlutusSpendingScriptWitness sbe autoBalanceExecUnits scriptFlagPrefix scriptFlagPrefixDeprecated help =
PlutusSpend.createSimpleOrPlutusScriptFromCliArgs
<$> pScriptFor
(scriptFlagPrefix ++ "-script-file")
((++ "-script-file") <$> scriptFlagPrefixDeprecated)
("The file containing the script to witness " ++ help)
<*> optional
( (,,)
<$> pScriptDatumOrFileSpendingCip69 sbe scriptFlagPrefix
<*> pScriptRedeemerOrFile scriptFlagPrefix
<*> ( case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits scriptFlagPrefix
)
)

pScriptWitnessFiles
:: forall witctx era
. ShelleyBasedEra era
-> WitCtx witctx
:: forall witctx
. WitCtx witctx
-> BalanceTxExecUnits
-- ^ Use the @execution-units@ flag.
-> String
-- ^ Script flag prefix
-> Maybe String
-> String
-> Parser (ScriptWitnessFiles witctx)
pScriptWitnessFiles sbe witctx autoBalanceExecUnits scriptFlagPrefix scriptFlagPrefixDeprecated help =
pScriptWitnessFiles witctx autoBalanceExecUnits scriptFlagPrefix scriptFlagPrefixDeprecated help =
toScriptWitnessFiles
<$> pScriptFor
(scriptFlagPrefix ++ "-script-file")
((++ "-script-file") <$> scriptFlagPrefixDeprecated)
("The file containing the script to witness " ++ help)
<*> optional
( (,,)
<$> cip69Modification sbe
<$> pure (excludeTxInScriptWitnesses witctx)
<*> pScriptRedeemerOrFile scriptFlagPrefix
<*> ( case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits scriptFlagPrefix
)
)
where
cip69Modification :: ShelleyBasedEra era -> Parser (ScriptDatumOrFile witctx)
cip69Modification =
caseShelleyToBabbageOrConwayEraOnwards
(const $ pScriptDatumOrFile scriptFlagPrefix witctx)
(const $ pScriptDatumOrFileCip69 scriptFlagPrefix witctx)
excludeTxInScriptWitnesses :: WitCtx witctx -> ScriptDatumOrFile witctx
excludeTxInScriptWitnesses WitCtxStake = NoScriptDatumOrFileForStake
excludeTxInScriptWitnesses WitCtxMint =
error $
mconcat
[ "pScriptWitnessFiles.excludeTxInScriptWitnesses: Should be impossible as "
, "mint script witnesses are handled by the pMintMultiAsset parser."
]
excludeTxInScriptWitnesses WitCtxTxIn =
error $
mconcat
[ "pScriptWitnessFiles.excludeTxInScriptWitnesses: Should be impossible as "
, "tx in script witnesses are handled by the pSimpleScriptOrPlutusSpendingScriptWitness parser."
]

toScriptWitnessFiles
:: ScriptFile
Expand Down Expand Up @@ -1138,6 +1173,42 @@ pScriptDatumOrFile scriptFlagPrefix witctx =
, Opt.help "Inline datum present at transaction input."
]

pScriptDatumOrFileSpendingCip69
:: ShelleyBasedEra era -> String -> Parser PlutusSpend.ScriptDatumOrFileSpending
pScriptDatumOrFileSpendingCip69 sbe scriptFlagPrefix =
caseShelleyToBabbageOrConwayEraOnwards
(const datumMandatory)
(const datumOptional)
sbe
where
datumMandatory =
asum
[ PlutusSpend.PotentialDatum . Just
<$> datumParser
, pInlineDatumPresent
]

datumOptional =
asum
[ PlutusSpend.PotentialDatum
<$> optional datumParser
, pInlineDatumPresent
]

datumParser =
pScriptDataOrFile
(scriptFlagPrefix ++ "-datum")
"The script datum."
"The script datum file."

pInlineDatumPresent :: Parser PlutusSpend.ScriptDatumOrFileSpending
pInlineDatumPresent =
flag' PlutusSpend.InlineDatum $
mconcat
[ long (scriptFlagPrefix ++ "-inline-datum-present")
, Opt.help "Inline datum present at transaction input."
]

pScriptDataOrFile
:: String
-- ^ data flag prefix
Expand Down Expand Up @@ -1208,14 +1279,13 @@ pVoteFiles
pVoteFiles sbe bExUnits =
caseShelleyToBabbageOrConwayEraOnwards
(const $ pure [])
(const . many $ pVoteFile sbe bExUnits)
(const . many $ pVoteFile bExUnits)
sbe

pVoteFile
:: ShelleyBasedEra era
-> BalanceTxExecUnits
:: BalanceTxExecUnits
-> Parser (VoteFile In, Maybe (ScriptWitnessFiles WitCtxStake))
pVoteFile sbe balExUnits =
pVoteFile balExUnits =
(,)
<$> pFileInDirection "vote-file" "Filepath of the vote."
<*> optional (pVoteScriptOrReferenceScriptWitness balExUnits)
Expand All @@ -1224,7 +1294,6 @@ pVoteFile sbe balExUnits =
:: BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxStake)
pVoteScriptOrReferenceScriptWitness bExUnits =
pScriptWitnessFiles
sbe
WitCtxStake
bExUnits
"vote"
Expand All @@ -1239,14 +1308,13 @@ pProposalFiles
pProposalFiles sbe balExUnits =
caseShelleyToBabbageOrConwayEraOnwards
(const $ pure [])
(const $ many (pProposalFile sbe balExUnits))
(const $ many (pProposalFile balExUnits))
sbe

pProposalFile
:: ShelleyBasedEra era
-> BalanceTxExecUnits
:: BalanceTxExecUnits
-> Parser (ProposalFile In, Maybe (ScriptWitnessFiles WitCtxStake))
pProposalFile sbe balExUnits =
pProposalFile balExUnits =
(,)
<$> pFileInDirection "proposal-file" "Filepath of the proposal."
<*> optional (pProposingScriptOrReferenceScriptWitness balExUnits)
Expand All @@ -1255,7 +1323,6 @@ pProposalFile sbe balExUnits =
:: BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxStake)
pProposingScriptOrReferenceScriptWitness bExUnits =
pScriptWitnessFiles
sbe
WitCtxStake
bExUnits
"proposal"
Expand Down Expand Up @@ -1408,10 +1475,9 @@ pTxBuildOutputOptions =
"Where to write the script cost information."

pCertificateFile
:: ShelleyBasedEra era
-> BalanceTxExecUnits
:: BalanceTxExecUnits
-> Parser (CertificateFile, Maybe (ScriptWitnessFiles WitCtxStake))
pCertificateFile sbe balanceExecUnits =
pCertificateFile balanceExecUnits =
(,)
<$> ( fmap CertificateFile $
asum
Expand All @@ -1425,7 +1491,6 @@ pCertificateFile sbe balanceExecUnits =
:: BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxStake)
pCertifyingScriptOrReferenceScriptWit bExecUnits =
pScriptWitnessFiles
sbe
WitCtxStake
balanceExecUnits
"certificate"
Expand Down Expand Up @@ -1484,14 +1549,13 @@ pMetadataFile =
]

pWithdrawal
:: ShelleyBasedEra era
-> BalanceTxExecUnits
:: BalanceTxExecUnits
-> Parser
( StakeAddress
, Lovelace
, Maybe (ScriptWitnessFiles WitCtxStake)
)
pWithdrawal sbe balance =
pWithdrawal balance =
(\(stakeAddr, lovelace) maybeScriptFp -> (stakeAddr, lovelace, maybeScriptFp))
<$> Opt.option
(readerFromParsecParser parseWithdrawal)
Expand All @@ -1504,7 +1568,6 @@ pWithdrawal sbe balance =
pWithdrawalScriptOrReferenceScriptWit :: Parser (ScriptWitnessFiles WitCtxStake)
pWithdrawalScriptOrReferenceScriptWit =
pScriptWitnessFiles
sbe
WitCtxStake
balance
"withdrawal"
Expand All @@ -1527,7 +1590,6 @@ pWithdrawal sbe balance =
pPlutusStakeReferenceScriptWitnessFilesVotingProposing
:: String
-> BalanceTxExecUnits
-- ^ Use the @execution-units@ flag.
-> Parser (ScriptWitnessFiles WitCtxStake)
pPlutusStakeReferenceScriptWitnessFilesVotingProposing prefix autoBalanceExecUnits =
PlutusReferenceScriptWitnessFiles
Expand All @@ -1543,7 +1605,6 @@ pPlutusStakeReferenceScriptWitnessFilesVotingProposing prefix autoBalanceExecUni
pPlutusStakeReferenceScriptWitnessFiles
:: String
-> BalanceTxExecUnits
-- ^ Use the @execution-units@ flag.
-> Parser (ScriptWitnessFiles WitCtxStake)
pPlutusStakeReferenceScriptWitnessFiles prefix autoBalanceExecUnits =
PlutusReferenceScriptWitnessFiles
Expand Down Expand Up @@ -1935,7 +1996,7 @@ pTxSubmitFile = parseFilePath "tx-file" "Filepath of the transaction you intend
pTxIn
:: ShelleyBasedEra era
-> BalanceTxExecUnits
-> Parser (TxIn, Maybe (ScriptWitnessFiles WitCtxTxIn))
-> Parser (TxIn, Maybe PlutusSpend.CliSpendScriptRequirements)
pTxIn sbe balance =
(,)
<$> Opt.option
Expand All @@ -1944,57 +2005,35 @@ pTxIn sbe balance =
<> Opt.metavar "TX-IN"
<> Opt.help "TxId#TxIx"
)
<*> optional
( pPlutusReferenceScriptWitness sbe balance
<|> pSimpleReferenceSpendingScriptWitess
<|> pEmbeddedPlutusScriptWitness
)
<*> ( optional
( pPlutusReferenceSpendScriptWitness balance
<|> pSimpleReferenceSpendingScriptWitess
<|> pOnDiskSimpleOrPlutusScriptWitness
)
)
where
pSimpleReferenceSpendingScriptWitess :: Parser (ScriptWitnessFiles WitCtxTxIn)
pSimpleReferenceSpendingScriptWitess :: Parser CliSpendScriptRequirements
pSimpleReferenceSpendingScriptWitess =
createSimpleReferenceScriptWitnessFiles
PlutusSpend.createSimpleReferenceScriptFromCliArgs
<$> pReferenceTxIn "simple-script-" "simple"
where
createSimpleReferenceScriptWitnessFiles
:: TxIn
-> ScriptWitnessFiles WitCtxTxIn
createSimpleReferenceScriptWitnessFiles refTxIn =
let simpleLang = AnyScriptLanguage SimpleScriptLanguage
in SimpleReferenceScriptWitnessFiles refTxIn simpleLang

pPlutusReferenceScriptWitness
:: ShelleyBasedEra era -> BalanceTxExecUnits -> Parser (ScriptWitnessFiles WitCtxTxIn)
pPlutusReferenceScriptWitness sbe' autoBalanceExecUnits =
caseShelleyToBabbageOrConwayEraOnwards
( const $
PlutusReferenceScriptWitnessFiles
<$> pReferenceTxIn "spending-" "plutus"
<*> pPlutusScriptLanguage "spending-"
<*> pScriptDatumOrFile "spending-reference-tx-in" WitCtxTxIn
<*> pScriptRedeemerOrFile "spending-reference-tx-in"
<*> ( case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits "spending-reference-tx-in"
)
)
( const $
PlutusReferenceScriptWitnessFiles
<$> pReferenceTxIn "spending-" "plutus"
<*> pPlutusScriptLanguage "spending-"
<*> pScriptDatumOrFileCip69 "spending-reference-tx-in" WitCtxTxIn
<*> pScriptRedeemerOrFile "spending-reference-tx-in"
<*> ( case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits "spending-reference-tx-in"
)
)
sbe'

pEmbeddedPlutusScriptWitness :: Parser (ScriptWitnessFiles WitCtxTxIn)
pEmbeddedPlutusScriptWitness =
pScriptWitnessFiles
pPlutusReferenceSpendScriptWitness
:: BalanceTxExecUnits -> Parser CliSpendScriptRequirements
pPlutusReferenceSpendScriptWitness autoBalanceExecUnits =
PlutusSpend.createPlutusReferenceScriptFromCliArgs
<$> pReferenceTxIn "spending-" "plutus"
<*> pPlutusScriptLanguage "spending-"
<*> pScriptDatumOrFileSpendingCip69 sbe "spending-reference-tx-in"
<*> pScriptRedeemerOrFile "spending-reference-tx-in"
<*> ( case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits "spending-reference-tx-in"
)

pOnDiskSimpleOrPlutusScriptWitness :: Parser CliSpendScriptRequirements
pOnDiskSimpleOrPlutusScriptWitness =
pSimpleScriptOrPlutusSpendingScriptWitness
sbe
WitCtxTxIn
balance
"tx-in"
(Just "txin")
Expand Down
Loading

0 comments on commit 002c340

Please sign in to comment.