Skip to content

Commit

Permalink
Make script invalid flag an assertion. This means if --script-invalid…
Browse files Browse the repository at this point in the history
… is specified, the build transaction will fail if the scripts are valid.
  • Loading branch information
newhoggy committed Aug 18, 2021
1 parent 4829c36 commit bfff3c8
Showing 1 changed file with 25 additions and 10 deletions.
35 changes: 25 additions & 10 deletions cardano-api/src/Cardano/Api/Fees.hs
Original file line number Diff line number Diff line change
Expand Up @@ -647,6 +647,9 @@ data TxBodyErrorAutoBalance =
-- | One or more of the scripts fails to execute correctly.
| TxBodyScriptExecutionError [(ScriptWitnessIndex, ScriptExecutionError)]

-- | One or more of the scripts were expected to fail validation, but none did.
| TxBodyScriptBadScriptValidity

-- | The balance of the non-ada assets is not zero. The 'Value' here is
-- that residual non-zero balance. The 'makeTransactionBodyAutoBalance'
-- function only automatically balances ada, not other assets.
Expand Down Expand Up @@ -706,6 +709,9 @@ instance Error TxBodyErrorAutoBalance where
++ " failed with " ++ displayError failure
| (index, failure) <- failures ]

displayError TxBodyScriptBadScriptValidity =
"One or more of the scripts were expected to fail validation, but none did."

displayError (TxBodyErrorAssetBalanceWrong _value) =
"The transaction does not correctly balance in its non-ada assets. "
++ "The balance between inputs and outputs should sum to zero. "
Expand Down Expand Up @@ -751,19 +757,28 @@ handleExUnitsErrors ::
-> Map ScriptWitnessIndex ScriptExecutionError
-> Map ScriptWitnessIndex ExecutionUnits
-> Either TxBodyErrorAutoBalance (Map ScriptWitnessIndex ExecutionUnits)
handleExUnitsErrors scriptValidity failures exUnitsMap =
if null relevantFailures
handleExUnitsErrors ScriptValid failuresMap exUnitsMap =
if null failures
then Right exUnitsMap
else Left (TxBodyScriptExecutionError relevantFailures)
where relevantFailures :: [(ScriptWitnessIndex, ScriptExecutionError)]
relevantFailures = filter byScriptValidity (Map.toList failures)
byScriptValidity :: (ScriptWitnessIndex, ScriptExecutionError) -> Bool
byScriptValidity (_, e) = case scriptValidity of
ScriptValid -> True
ScriptInvalid -> case e of
ScriptErrorEvaluationFailed _ -> False
else Left (TxBodyScriptExecutionError failures)
where failures :: [(ScriptWitnessIndex, ScriptExecutionError)]
failures = Map.toList failuresMap
handleExUnitsErrors ScriptInvalid failuresMap exUnitsMap =
if null scriptFailures
then Left TxBodyScriptBadScriptValidity
else if null nonScriptFailures
then Right exUnitsMap
else Left (TxBodyScriptExecutionError nonScriptFailures)
where nonScriptFailures :: [(ScriptWitnessIndex, ScriptExecutionError)]
nonScriptFailures = filter (not . isScriptErrorEvaluationFailed) (Map.toList failuresMap)
scriptFailures :: [(ScriptWitnessIndex, ScriptExecutionError)]
scriptFailures = filter isScriptErrorEvaluationFailed (Map.toList failuresMap)
isScriptErrorEvaluationFailed :: (ScriptWitnessIndex, ScriptExecutionError) -> Bool
isScriptErrorEvaluationFailed (_, e) = case e of
ScriptErrorEvaluationFailed _ -> True
_ -> True


-- | This is much like 'makeTransactionBody' but with greater automation to
-- calculate suitable values for several things.
--
Expand Down

0 comments on commit bfff3c8

Please sign in to comment.