Skip to content

Render reference script hashes when using --calculate-plutus-script-cost option #4204

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions cardano-cli/src/Cardano/CLI/Shelley/Output.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import qualified Data.List as List
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Time.Clock (UTCTime)
import Data.Word

Expand Down Expand Up @@ -225,7 +226,7 @@ instance FromJSON QueryTipLocalStateOutput where

data ScriptCostOutput =
ScriptCostOutput
{ scScriptHash :: Maybe ScriptHash
{ scScriptHash :: ScriptHash
, scExecutionUnits :: ExecutionUnits
, scAda :: Lovelace
}
Expand All @@ -241,6 +242,8 @@ data PlutusScriptCostError
= PlutusScriptCostErrPlutusScriptNotFound ScriptWitnessIndex
| PlutusScriptCostErrExecError ScriptWitnessIndex (Maybe ScriptHash) ScriptExecutionError
| PlutusScriptCostErrRationalExceedsBound ExecutionUnitPrices ExecutionUnits
| PlutusScriptCostErrRefInputNoScript TxIn
| PlutusScriptCostErrRefInputNotInUTxO TxIn
deriving Show


Expand All @@ -253,9 +256,14 @@ instance Error PlutusScriptCostError where
displayError (PlutusScriptCostErrRationalExceedsBound eUnitPrices eUnits) =
"Either the execution unit prices: " <> show eUnitPrices <> " or the execution units: " <>
show eUnits <> " or both are either too precise or not within bounds"
displayError (PlutusScriptCostErrRefInputNoScript txin) =
"No reference script found at input: " <> Text.unpack (renderTxIn txin)
displayError (PlutusScriptCostErrRefInputNotInUTxO txin) =
"Reference input was not found in utxo: " <> Text.unpack (renderTxIn txin)

renderScriptCosts
:: ExecutionUnitPrices
:: UTxO era
-> ExecutionUnitPrices
-> [(ScriptWitnessIndex, AnyScriptWitness era)]
-- ^ Initial mapping of script witness index to actual script.
-- We need this in order to know which script corresponds to the
Expand All @@ -264,7 +272,7 @@ renderScriptCosts
-- ^ Post execution cost calculation mapping of script witness
-- index to execution units.
-> Either PlutusScriptCostError [ScriptCostOutput]
renderScriptCosts eUnitPrices scriptMapping executionCostMapping =
renderScriptCosts (UTxO utxo) eUnitPrices scriptMapping executionCostMapping =
sequenceA $ Map.foldlWithKey
(\accum sWitInd eExecUnits -> do
case List.lookup sWitInd scriptMapping of
Expand All @@ -276,25 +284,31 @@ renderScriptCosts eUnitPrices scriptMapping executionCostMapping =
Right execUnits ->
case calculateExecutionUnitsLovelace eUnitPrices execUnits of
Just llCost ->
Right (ScriptCostOutput (Just scriptHash) execUnits llCost)
Right (ScriptCostOutput scriptHash execUnits llCost)
: accum
Nothing ->
Left (PlutusScriptCostErrRationalExceedsBound eUnitPrices execUnits)
: accum
Left err -> Left (PlutusScriptCostErrExecError sWitInd (Just scriptHash) err) : accum
-- TODO: Create a new sum type to encapsulate the fact that we can also
-- have a txin and render the txin in the case of reference scripts.
Just (AnyScriptWitness (PlutusScriptWitness _ _ (PReferenceScript _refTxIn _) _ _ _)) ->
case eExecUnits of
Right execUnits ->
case calculateExecutionUnitsLovelace eUnitPrices execUnits of
Just llCost ->
Right (ScriptCostOutput Nothing execUnits llCost)
: accum
Nothing ->
Left (PlutusScriptCostErrRationalExceedsBound eUnitPrices execUnits)
: accum
Left err -> Left (PlutusScriptCostErrExecError sWitInd Nothing err) : accum
Just (AnyScriptWitness (PlutusScriptWitness _ _ (PReferenceScript refTxIn _) _ _ _)) ->
case Map.lookup refTxIn utxo of
Nothing -> Left (PlutusScriptCostErrRefInputNotInUTxO refTxIn) : accum
Just (TxOut _ _ _ refScript) ->
case refScript of
ReferenceScriptNone -> Left (PlutusScriptCostErrRefInputNoScript refTxIn) : accum
ReferenceScript _ (ScriptInAnyLang _ script) ->
case eExecUnits of
Right execUnits ->
case calculateExecutionUnitsLovelace eUnitPrices execUnits of
Just llCost ->
Right (ScriptCostOutput (hashScript script) execUnits llCost)
: accum
Nothing ->
Left (PlutusScriptCostErrRationalExceedsBound eUnitPrices execUnits)
: accum
Left err -> Left (PlutusScriptCostErrExecError sWitInd Nothing err) : accum


Nothing -> Left (PlutusScriptCostErrPlutusScriptNotFound sWitInd) : accum
Expand Down
1 change: 1 addition & 0 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ runTxBuild (AnyCardanoEra era) (AnyConsensusModeParams cModeParams) networkId mS
pparams utxo balancedTxBody
scriptCostOutput <- firstExceptT ShelleyTxCmdPlutusScriptCostErr $ hoistEither
$ renderScriptCosts
utxo
executionUnitPrices
(collectTxBodyScriptWitnesses txBodyContent)
scriptExecUnitsMap
Expand Down