whisky_csl/utils/
phase_two.rs

1use 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// fn trim_cost_modes(cost_mdls: Option<&CostModels>) -> Option<CostModels> {
59//     match cost_mdls {
60//         None => None,
61//         Some(mdls) => {
62//             Some(CostModels {
63//                 plutus_v1: mdls.plutus_v1.clone(),
64//                 plutus_v2: mdls.plutus_v2.clone(),
65//                 plutus_v3: match &mdls.plutus_v3 {
66//                     None => None,
67//                     Some(mdls_vec) => Some(mdls_vec[0..251].to_vec())
68//                 }
69//             })
70//         }
71//     }
72// }