whisky_csl/utils/
aiken.rs1use 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(¶ms.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}