1
1
module Evaluate where
2
2
3
3
import Codec.Serialise (deserialise )
4
+ import Control.Monad (when )
4
5
import Control.Monad.IO.Unlift (MonadUnliftIO )
5
6
import Control.Monad.Trans.Except (runExceptT )
6
7
import Control.Monad.Trans.Writer (WriterT (runWriterT ))
@@ -9,20 +10,25 @@ import Data.ByteString.Short qualified as BSS
9
10
import Database qualified as Db
10
11
import Database.PostgreSQL.Simple qualified as Postgres
11
12
import Database.Schema (ScriptEvaluationRecord' (.. ))
13
+ import Ouroboros.Consensus.Block (BlockNo )
12
14
import PlutusLedgerApi.Common (
13
15
Data ,
14
16
EvaluationContext (.. ),
15
17
ExBudget (.. ),
16
18
MajorProtocolVersion ,
17
19
PlutusLedgerLanguage (.. ),
18
20
ScriptForEvaluation ,
21
+ ScriptNamedDeBruijn (.. ),
19
22
VerboseMode (Quiet ),
20
23
deserialiseScript ,
24
+ deserialisedScript ,
21
25
evaluateScriptRestricting ,
22
26
)
23
27
import PlutusLedgerApi.V1 qualified as V1
24
28
import PlutusLedgerApi.V2 qualified as V2
25
29
import PlutusLedgerApi.V3 qualified as V3
30
+ import System.Exit (exitFailure )
31
+ import Text.PrettyBy qualified as Pretty
26
32
27
33
data ScriptEvaluationInput = MkScriptEvaluationInput
28
34
{ seiPlutusLedgerLanguage :: PlutusLedgerLanguage
@@ -31,6 +37,8 @@ data ScriptEvaluationInput = MkScriptEvaluationInput
31
37
, seiData :: [Data ]
32
38
, seiScript :: ScriptForEvaluation
33
39
, seiExBudget :: ExBudget
40
+ , seiEvaluationSuccess :: Bool
41
+ , seiBlock :: BlockNo
34
42
}
35
43
36
44
evaluateScripts
@@ -79,6 +87,8 @@ inputFromRecord MkScriptEvaluationRecord'{..} = do
79
87
. maybe id (:) seDatum
80
88
$ maybe id (:) seRedeemer [seScriptContext]
81
89
, seiExBudget = ExBudget seExecBudgetCpu seExecBudgetMem
90
+ , seiEvaluationSuccess = seEvaluatedSuccessfully
91
+ , seiBlock = seBlockNo
82
92
}
83
93
84
94
onScriptEvaluationInput :: ScriptEvaluationInput -> ExBudget -> IO ExBudget
@@ -94,15 +104,43 @@ onScriptEvaluationInput MkScriptEvaluationInput{..} budget = do
94
104
seiScript
95
105
seiData
96
106
97
- putStrLn " "
107
+ let evaluationSuccess =
108
+ either (const False ) (const True ) evaluationResult
109
+
110
+ print seiBlock
111
+
112
+ when (evaluationSuccess /= seiEvaluationSuccess) do
113
+ putStrLn $
114
+ " Script evaluation result ("
115
+ ++ show evaluationSuccess
116
+ ++ " ) does not match the expected result ("
117
+ ++ show seiEvaluationSuccess
118
+ ++ " ): "
119
+ let ScriptNamedDeBruijn uplc = deserialisedScript seiScript
120
+ in putStrLn $ Pretty. display uplc
121
+
98
122
case evaluationResult of
99
- Left err -> do
123
+ Left err ->
100
124
putStrLn $ " Script evaluation was not successful: " <> show err
101
125
Right (ExBudget cpu mem) -> do
102
- putStrLn " Script evaluation was successful."
103
- putStrLn
104
- let ExBudget cpu' mem' = seiExBudget
105
- in " Expected: " <> show cpu' <> " , " <> show mem'
106
- putStrLn $ " Consumed: " <> show cpu <> " , " <> show mem
126
+ let ExBudget cpu' mem' = seiExBudget
127
+ if cpu > cpu' || mem > mem'
128
+ then do
129
+ putStrLn " Budget exceeded!"
130
+ putStrLn $ " Paid for: " <> show cpu' <> " , " <> show mem'
131
+ putStrLn $ " Consumed: " <> show cpu <> " , " <> show mem
132
+ exitFailure
133
+ else
134
+ if cpu == cpu' && mem == mem'
135
+ then do
136
+ putStrLn $
137
+ " Budget matches exactly: "
138
+ <> show cpu
139
+ <> " , "
140
+ <> show mem
141
+ else do
142
+ putStrLn " Budget is sufficient:"
143
+ putStrLn $ " Paid for: " <> show cpu' <> " , " <> show mem'
144
+ putStrLn $ " Consumed: " <> show cpu <> " , " <> show mem
107
145
108
146
pure budget
0 commit comments