diff --git a/crates/aiken-lang/src/uplc.rs b/crates/aiken-lang/src/uplc.rs index ac61732e..be6e086e 100644 --- a/crates/aiken-lang/src/uplc.rs +++ b/crates/aiken-lang/src/uplc.rs @@ -4285,7 +4285,7 @@ impl<'a> CodeGenerator<'a> { program.try_into().unwrap(); let evaluated_term: Term = - eval_program.eval(ExBudget::default()).0.unwrap(); + eval_program.eval(ExBudget::default()).result().unwrap(); arg_stack.push(evaluated_term.try_into().unwrap()); anon_func = false; @@ -5416,7 +5416,7 @@ impl<'a> CodeGenerator<'a> { let eval_program: Program = program.try_into().unwrap(); let evaluated_term: Term = - eval_program.eval(ExBudget::default()).0.unwrap(); + eval_program.eval(ExBudget::default()).result().unwrap(); term = evaluated_term.try_into().unwrap(); } diff --git a/crates/aiken-project/src/error.rs b/crates/aiken-project/src/error.rs index edcf76ac..1df63f19 100644 --- a/crates/aiken-project/src/error.rs +++ b/crates/aiken-project/src/error.rs @@ -279,13 +279,13 @@ impl Diagnostic for Error { None => None, Some(hint) => { let budget = ExBudget { mem: i64::MAX, cpu: i64::MAX, }; - let left = pretty::boxed("left", &match hint.left.eval(budget) { - (Ok(term), _, _) => format!("{term}"), - (Err(err), _, _) => format!("{err}"), + let left = pretty::boxed("left", &match hint.left.eval(budget).result() { + Ok(term) => format!("{term}"), + Err(err) => format!("{err}"), }); - let right = pretty::boxed("right", &match hint.right.eval(budget) { - (Ok(term), _, _) => format!("{term}"), - (Err(err), _, _) => format!("{err}"), + let right = pretty::boxed("right", &match hint.right.eval(budget).result() { + Ok(term) => format!("{term}"), + Err(err) => format!("{err}"), }); let msg = match hint.bin_op { BinOp::And => Some(format!("{left}\n\nand\n\n{right}\n\nshould both be true.")), diff --git a/crates/aiken-project/src/lib.rs b/crates/aiken-project/src/lib.rs index 354263ad..ef1d7964 100644 --- a/crates/aiken-project/src/lib.rs +++ b/crates/aiken-project/src/lib.rs @@ -37,7 +37,7 @@ use std::{ }; use telemetry::EventListener; use uplc::{ - ast::{Constant, DeBruijn, Term}, + ast::{DeBruijn, Term}, machine::cost_model::ExBudget, }; @@ -726,22 +726,16 @@ where scripts .into_par_iter() - .map(|script| match script.program.eval(initial_budget) { - (Ok(result), remaining_budget, logs) => EvalInfo { - success: result != Term::Error - && result != Term::Constant(Constant::Bool(false).into()), + .map(|script| { + let mut eval_result = script.program.eval(initial_budget); + + EvalInfo { + success: !eval_result.failed(), script, - spent_budget: initial_budget - remaining_budget, - output: Some(result), - logs, - }, - (Err(..), remaining_budget, logs) => EvalInfo { - success: false, - script, - spent_budget: initial_budget - remaining_budget, - output: None, - logs, - }, + spent_budget: eval_result.cost(), + logs: eval_result.logs(), + output: eval_result.result().ok(), + } }) .collect() } diff --git a/crates/uplc/src/ast.rs b/crates/uplc/src/ast.rs index 118d8cbf..1570ae5f 100644 --- a/crates/uplc/src/ast.rs +++ b/crates/uplc/src/ast.rs @@ -24,6 +24,7 @@ use crate::{ flat::Binder, machine::{ cost_model::{initialize_cost_model, CostModel, ExBudget}, + eval_result::EvalResult, Machine, }, }; @@ -595,14 +596,7 @@ impl From> for Term { } impl Program { - pub fn eval( - &self, - initial_budget: ExBudget, - ) -> ( - Result, crate::machine::Error>, - ExBudget, - Vec, - ) { + pub fn eval(&self, initial_budget: ExBudget) -> EvalResult { let mut machine = Machine::new( Language::PlutusV2, CostModel::default(), @@ -612,22 +606,16 @@ impl Program { let term = machine.run(&self.term); - (term, machine.ex_budget, machine.logs) + EvalResult::new(term, machine.ex_budget, initial_budget, machine.logs) } /// Evaluate a Program as PlutusV1 - pub fn eval_v1( - &self, - ) -> ( - Result, crate::machine::Error>, - ExBudget, - Vec, - ) { + pub fn eval_v1(&self) -> EvalResult { let mut machine = Machine::new(Language::PlutusV1, CostModel::v1(), ExBudget::v1(), 200); let term = machine.run(&self.term); - (term, machine.ex_budget, machine.logs) + EvalResult::new(term, machine.ex_budget, ExBudget::v1(), machine.logs) } pub fn eval_as( @@ -635,11 +623,7 @@ impl Program { version: &Language, costs: &[i64], initial_budget: Option<&ExBudget>, - ) -> ( - Result, crate::machine::Error>, - ExBudget, - Vec, - ) { + ) -> EvalResult { let budget = match initial_budget { Some(b) => *b, None => ExBudget::default(), @@ -654,19 +638,12 @@ impl Program { let term = machine.run(&self.term); - (term, machine.ex_budget, machine.logs) + EvalResult::new(term, machine.ex_budget, budget, machine.logs) } } impl Program { - pub fn eval( - &self, - initial_budget: ExBudget, - ) -> ( - Result, crate::machine::Error>, - ExBudget, - Vec, - ) { + pub fn eval(&self, initial_budget: ExBudget) -> EvalResult { let program: Program = self.clone().into(); program.eval(initial_budget) diff --git a/crates/uplc/src/machine.rs b/crates/uplc/src/machine.rs index c4cb881e..221d74ad 100644 --- a/crates/uplc/src/machine.rs +++ b/crates/uplc/src/machine.rs @@ -8,6 +8,7 @@ use crate::{ pub mod cost_model; mod error; +pub mod eval_result; pub mod runtime; use cost_model::{ExBudget, StepKind}; @@ -785,9 +786,9 @@ mod tests { }, }; - let (eval_result, _, _) = program.eval(ExBudget::default()); + let eval_result = program.eval(ExBudget::default()); - let term = eval_result.unwrap(); + let term = eval_result.result().unwrap(); assert_eq!( term, @@ -834,10 +835,10 @@ mod tests { ]; for (fun, n, m, result) in test_data { - let (eval_result, _, _) = make_program(fun, n, m).eval(ExBudget::default()); + let eval_result = make_program(fun, n, m).eval(ExBudget::default()); assert_eq!( - eval_result.unwrap(), + eval_result.result().unwrap(), Term::Constant(Constant::Integer(result.into()).into()) ); } diff --git a/crates/uplc/src/tx/eval.rs b/crates/uplc/src/tx/eval.rs index b62bbaf1..92aff289 100644 --- a/crates/uplc/src/tx/eval.rs +++ b/crates/uplc/src/tx/eval.rs @@ -730,7 +730,7 @@ pub fn eval_redeemer( .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()); - let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { + let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt { let costs = if let Some(costs) = &cost_mdls.plutus_v1 { costs } else { @@ -742,9 +742,12 @@ pub fn eval_redeemer( program.eval_v1() }; - match result { + let cost = eval_result.cost(); + let logs = eval_result.logs(); + + match eval_result.result() { Ok(_) => (), - Err(err) => return Err(Error::Machine(err, budget, logs)), + Err(err) => return Err(Error::Machine(err, cost, logs)), } let new_redeemer = Redeemer { @@ -752,8 +755,8 @@ pub fn eval_redeemer( index: redeemer.index, data: redeemer.data.clone(), ex_units: ExUnits { - mem: (initial_budget.mem - budget.mem) as u32, - steps: (initial_budget.cpu - budget.cpu) as u64, + mem: cost.mem as u32, + steps: cost.cpu as u64, }, }; @@ -776,7 +779,7 @@ pub fn eval_redeemer( .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()); - let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { + let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt { let costs = if let Some(costs) = &cost_mdls.plutus_v2 { costs } else { @@ -788,9 +791,12 @@ pub fn eval_redeemer( program.eval(ExBudget::default()) }; - match result { + let cost = eval_result.cost(); + let logs = eval_result.logs(); + + match eval_result.result() { Ok(_) => (), - Err(err) => return Err(Error::Machine(err, budget, logs)), + Err(err) => return Err(Error::Machine(err, cost, logs)), } let new_redeemer = Redeemer { @@ -798,8 +804,8 @@ pub fn eval_redeemer( index: redeemer.index, data: redeemer.data.clone(), ex_units: ExUnits { - mem: (initial_budget.mem - budget.mem) as u32, - steps: (initial_budget.cpu - budget.cpu) as u64, + mem: cost.mem as u32, + steps: cost.cpu as u64, }, }; @@ -824,7 +830,7 @@ pub fn eval_redeemer( .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()); - let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { + let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt { let costs = if let Some(costs) = &cost_mdls.plutus_v1 { costs } else { @@ -836,9 +842,12 @@ pub fn eval_redeemer( program.eval_v1() }; - match result { + let cost = eval_result.cost(); + let logs = eval_result.logs(); + + match eval_result.result() { Ok(_) => (), - Err(err) => return Err(Error::Machine(err, budget, logs)), + Err(err) => return Err(Error::Machine(err, cost, logs)), } let new_redeemer = Redeemer { @@ -846,8 +855,8 @@ pub fn eval_redeemer( index: redeemer.index, data: redeemer.data.clone(), ex_units: ExUnits { - mem: (initial_budget.mem - budget.mem) as u32, - steps: (initial_budget.cpu - budget.cpu) as u64, + mem: cost.mem as u32, + steps: cost.cpu as u64, }, }; @@ -869,7 +878,7 @@ pub fn eval_redeemer( .apply_data(redeemer.data.clone()) .apply_data(script_context.to_plutus_data()); - let (result, budget, logs) = if let Some(cost_mdls) = cost_mdls_opt { + let mut eval_result = if let Some(cost_mdls) = cost_mdls_opt { let costs = if let Some(costs) = &cost_mdls.plutus_v2 { costs } else { @@ -881,9 +890,12 @@ pub fn eval_redeemer( program.eval(ExBudget::default()) }; - match result { + let cost = eval_result.cost(); + let logs = eval_result.logs(); + + match eval_result.result() { Ok(_) => (), - Err(err) => return Err(Error::Machine(err, budget, logs)), + Err(err) => return Err(Error::Machine(err, cost, logs)), } let new_redeemer = Redeemer { @@ -891,8 +903,8 @@ pub fn eval_redeemer( index: redeemer.index, data: redeemer.data.clone(), ex_units: ExUnits { - mem: (initial_budget.mem - budget.mem) as u32, - steps: (initial_budget.cpu - budget.cpu) as u64, + mem: cost.mem as u32, + steps: cost.cpu as u64, }, };