diff --git a/crates/uplc/src/machine/cek.rs b/crates/uplc/src/machine/cek.rs index 9c744325..976f8568 100644 --- a/crates/uplc/src/machine/cek.rs +++ b/crates/uplc/src/machine/cek.rs @@ -23,6 +23,7 @@ use super::{ pub struct Machine<'a, B: BuiltinCostModel> { pub(super) arena: &'a Arena, + initial_budget: ExBudget, ex_budget: ExBudget, unbudgeted_steps: [u8; 10], pub(super) costs: CostModel, @@ -42,6 +43,7 @@ impl<'a, B: BuiltinCostModel> Machine<'a, B> { ) -> Self { Machine { arena, + initial_budget, ex_budget: initial_budget, unbudgeted_steps: [0; 10], costs, @@ -54,6 +56,7 @@ impl<'a, B: BuiltinCostModel> Machine<'a, B> { pub fn info(self) -> MachineInfo { MachineInfo { + remaining_budget: self.initial_budget - self.ex_budget, consumed_budget: self.ex_budget, logs: self.logs, } diff --git a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v1.rs b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v1.rs index e8bd83d4..f8ae8203 100644 --- a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v1.rs +++ b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v1.rs @@ -376,8 +376,8 @@ impl BuiltinCostModel for BuiltinCostsV1 { divide_integer: TwoArgumentsCosting::new( TwoArgumentsCosting::subtracted_sizes( cost_map["divide_integer-mem-arguments-intercept"], - cost_map["divide_integer-mem-arguments-minimum"], cost_map["divide_integer-mem-arguments-slope"], + cost_map["divide_integer-mem-arguments-minimum"], ), TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes( cost_map["divide_integer-cpu-arguments-constant"], diff --git a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v2.rs b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v2.rs index 7dcbdaa8..75c3345a 100644 --- a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v2.rs +++ b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v2.rs @@ -390,8 +390,8 @@ impl BuiltinCostModel for BuiltinCostsV2 { divide_integer: TwoArgumentsCosting::new( TwoArgumentsCosting::subtracted_sizes( cost_map["divide_integer-mem-arguments-intercept"], - cost_map["divide_integer-mem-arguments-minimum"], cost_map["divide_integer-mem-arguments-slope"], + cost_map["divide_integer-mem-arguments-minimum"], ), TwoArgumentsCosting::const_above_diagonal_into_multiplied_sizes( cost_map["divide_integer-cpu-arguments-constant"], diff --git a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v3.rs b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v3.rs index 1848cb12..73d9cfa1 100644 --- a/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v3.rs +++ b/crates/uplc/src/machine/cost_model/builtin_costs/builtin_costs_v3.rs @@ -643,8 +643,8 @@ impl BuiltinCostModel for BuiltinCostsV3 { divide_integer: TwoArgumentsCosting::new( TwoArgumentsCosting::subtracted_sizes( cost_map["divide_integer-mem-arguments-intercept"], - cost_map["divide_integer-mem-arguments-minimum"], cost_map["divide_integer-mem-arguments-slope"], + cost_map["divide_integer-mem-arguments-minimum"], ), TwoArgumentsCosting::above_and_below_diagonal_into_quadratic_x_and_y( cost_map["divide_integer-cpu-arguments-minimum"], diff --git a/crates/uplc/src/machine/cost_model/cost_map.rs b/crates/uplc/src/machine/cost_model/cost_map.rs index 5825e4d1..96a8e651 100644 --- a/crates/uplc/src/machine/cost_model/cost_map.rs +++ b/crates/uplc/src/machine/cost_model/cost_map.rs @@ -610,7 +610,10 @@ impl CostMap { "byteStringToInteger-mem-arguments-slope", ]; - if values.len() == 297 { + // Newer parameter vectors may append extra entries after the known + // bitwise/ripemd V3 costs. As long as we have at least that prefix, + // keep mapping the known keys instead of silently dropping them. + if values.len() >= 297 { base_keys.extend([ "andByteString-cpu-arguments-intercept", "andByteString-cpu-arguments-slope1", diff --git a/crates/uplc/src/machine/info.rs b/crates/uplc/src/machine/info.rs index 4c227f64..b523f66f 100644 --- a/crates/uplc/src/machine/info.rs +++ b/crates/uplc/src/machine/info.rs @@ -2,6 +2,7 @@ use super::ExBudget; #[derive(Debug)] pub struct MachineInfo { + pub remaining_budget: ExBudget, pub consumed_budget: ExBudget, pub logs: Vec, } diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index f5dca7ae..067fae78 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -2581,7 +2581,7 @@ impl<'a, B: BuiltinCostModel> Machine<'a, B> { .costs .builtin_costs .get_cost( - DefaultFunction::OrByteString, + DefaultFunction::XorByteString, &[ cost_model::BOOL_EX_MEM, cost_model::byte_string_ex_mem(left_bytes), diff --git a/crates/uplc/src/program.rs b/crates/uplc/src/program.rs index f7101c59..76256b82 100644 --- a/crates/uplc/src/program.rs +++ b/crates/uplc/src/program.rs @@ -91,8 +91,7 @@ where *self.version, ); let term = machine.run(self.term); - let mut info = machine.info(); - info.consumed_budget = initial_budget - info.consumed_budget; + let info = machine.info(); EvalResult { term, info } } diff --git a/crates/uplc/tests/conformance.rs b/crates/uplc/tests/conformance.rs index d9faa148..b39fc0ee 100644 --- a/crates/uplc/tests/conformance.rs +++ b/crates/uplc/tests/conformance.rs @@ -27,12 +27,12 @@ fn run_conformance(file_contents: &str, expected_output: &str, expected_budget: pretty_assertions::assert_eq!(expected.term, term); - let consumed_budget = format!( + let remaining_budget = format!( "({{cpu: {}\n| mem: {}}})", - info.consumed_budget.cpu, info.consumed_budget.mem + info.remaining_budget.cpu, info.remaining_budget.mem ); - pretty_assertions::assert_eq!(consumed_budget, expected_budget); + pretty_assertions::assert_eq!(remaining_budget, expected_budget); } include!(concat!(env!("OUT_DIR"), "/generated_tests.rs")); diff --git a/crates/uplc/tests/conformance_flat.rs b/crates/uplc/tests/conformance_flat.rs index f7cd178c..1db0da41 100644 --- a/crates/uplc/tests/conformance_flat.rs +++ b/crates/uplc/tests/conformance_flat.rs @@ -110,7 +110,7 @@ fn run_conformance(fixture_json: &str) { let encoded = flat::encode(result_program).expect("encoder failed on eval result"); assert_eq!(hex::encode(&expected_bytes), hex::encode(&encoded)); - assert_eq!(result.info.consumed_budget, *budget); + assert_eq!(result.info.remaining_budget, *budget); } include!(concat!(env!("OUT_DIR"), "/generated_flat_tests.rs"));