whisky_csl/utils/
aiken.rs

1use cardano_serialization_lib::{self as csl};
2
3use whisky_common::*;
4
5pub fn apply_double_cbor_encoding(script: &str) -> Result<String, WError> {
6    let bytes: Vec<u8> = hex_to_bytes(script).unwrap();
7
8    let single_encoded_script = csl::PlutusScript::from_bytes(bytes.clone()).map_err(
9        WError::from_err("apply_double_cbor_encoding - invalid script bytes"),
10    )?;
11
12    match csl::PlutusScript::from_bytes(single_encoded_script.bytes()) {
13        Ok(_) => Ok(script.to_string()),
14        Err(_) => {
15            let bytes = csl::PlutusScript::new(bytes).to_bytes();
16            let new_script = bytes_to_hex(&bytes);
17            Ok(new_script)
18        }
19    }
20}
21
22pub fn apply_params_to_script(
23    plutus_script: &str,
24    params_to_apply: &[&str],
25    param_type: BuilderDataType,
26) -> Result<String, WError> {
27    let double_encoded_script = apply_double_cbor_encoding(plutus_script).unwrap();
28    let plutus_script =
29        csl::PlutusScript::from_bytes(hex_to_bytes(&double_encoded_script).unwrap()).unwrap();
30    let mut plutus_list = csl::PlutusList::new();
31    for param in params_to_apply {
32        match param_type {
33            BuilderDataType::JSON => {
34                let plutus_data =
35                    csl::PlutusData::from_json(param, csl::PlutusDatumSchema::DetailedSchema)
36                        .unwrap();
37                plutus_list.add(&plutus_data);
38            }
39            BuilderDataType::CBOR => {
40                let plutus_data = csl::PlutusData::from_hex(param).unwrap();
41                plutus_list.add(&plutus_data);
42            }
43        }
44    }
45    let bytes = apply_params_to_plutus_script(&plutus_list, plutus_script)?.to_bytes();
46    Ok(bytes_to_hex(&bytes))
47}
48
49pub fn apply_params_to_plutus_script(
50    params: &csl::PlutusList,
51    plutus_script: csl::PlutusScript,
52) -> Result<csl::PlutusScript, WError> {
53    let bytes = uplc::tx::apply_params_to_script(&params.to_bytes(), &plutus_script.bytes())
54        .map_err(WError::from_err(
55            "apply_params_to_plutus_script - invalid script bytes",
56        ))?;
57    Ok(csl::PlutusScript::new(bytes))
58}