whisky_csl/utils/
phase_two.rs1use pallas_primitives::conway::{CostModels, MintedTx, Redeemer};
2use uplc::machine::cost_model::ExBudget;
3use uplc::tx::error::Error;
4use uplc::tx::{eval, iter_redeemers, DataLookupTable, ResolvedInput, SlotConfig};
5
6pub enum PhaseTwoEvalResult {
7 Success(Redeemer),
8 Error(Redeemer, Error),
9}
10
11pub fn eval_phase_two(
12 tx: &MintedTx,
13 utxos: &[ResolvedInput],
14 cost_mdls: Option<&CostModels>,
15 slot_config: &SlotConfig,
16) -> Result<Vec<PhaseTwoEvalResult>, Error> {
17 let redeemers = tx.transaction_witness_set.redeemer.as_ref();
18
19 let lookup_table = DataLookupTable::from_transaction(tx, utxos);
20
21 match redeemers {
22 Some(rs) => {
23 let mut results = Vec::new();
24 for (key, data, ex_units) in iter_redeemers(rs) {
25 let remaining_budget = ExBudget {
26 cpu: i64::MAX,
27 mem: i64::MAX,
28 };
29 let redeemer = Redeemer {
30 tag: key.tag,
31 index: key.index,
32 data: data.clone(),
33 ex_units,
34 };
35
36 let eval_result = eval::eval_redeemer(
37 tx,
38 utxos,
39 slot_config,
40 &redeemer,
41 &lookup_table,
42 cost_mdls,
43 &remaining_budget,
44 );
45
46 match eval_result {
47 Ok(redeemer) => results.push(PhaseTwoEvalResult::Success(redeemer)),
48 Err(error) => results.push(PhaseTwoEvalResult::Error(redeemer, error)),
49 }
50 }
51
52 Ok(results)
53 }
54 None => Ok(vec![]),
55 }
56}
57
58