whisky_csl/utils/
script.rs

1use cardano_serialization_lib::{self as csl};
2use whisky_common::*;
3
4pub fn get_native_script_hash(script: &str) -> Result<String, WError> {
5    let script_hash = csl::NativeScript::from_hex(script)
6        .map_err(WError::from_err(
7            "get_native_script_hash - invalid native script hex",
8        ))?
9        .hash()
10        .to_hex();
11    Ok(script_hash)
12}
13
14pub fn get_script_hash(script: &str, version: LanguageVersion) -> Result<String, WError> {
15    let language_version = match version {
16        LanguageVersion::V1 => csl::Language::new_plutus_v1(),
17        LanguageVersion::V2 => csl::Language::new_plutus_v2(),
18        LanguageVersion::V3 => csl::Language::new_plutus_v3(),
19    };
20    let script_hash = csl::PlutusScript::from_hex_with_version(script, &language_version)
21        .map_err(WError::from_err("get_script_hash - invalid script hex"))?
22        .hash()
23        .to_hex();
24    Ok(script_hash)
25}
26
27pub fn to_csl_script_source(
28    script_source: ScriptSource,
29) -> Result<csl::PlutusScriptSource, WError> {
30    match script_source {
31        ScriptSource::InlineScriptSource(script) => {
32            let language_version: csl::Language = match script.language_version {
33                LanguageVersion::V1 => csl::Language::new_plutus_v1(),
34                LanguageVersion::V2 => csl::Language::new_plutus_v2(),
35                LanguageVersion::V3 => csl::Language::new_plutus_v3(),
36            };
37            Ok(csl::PlutusScriptSource::new_ref_input(
38                &csl::ScriptHash::from_hex(&script.script_hash).map_err(WError::from_err(
39                    "to_csl_script_source - invalid script hash",
40                ))?,
41                &csl::TransactionInput::new(
42                    &csl::TransactionHash::from_hex(&script.ref_tx_in.tx_hash).map_err(
43                        WError::from_err("to_csl_script_source - invalid transaction hash"),
44                    )?,
45                    script.ref_tx_in.tx_index,
46                ),
47                &language_version,
48                script.script_size,
49            ))
50        }
51        ScriptSource::ProvidedScriptSource(script) => {
52            let language_version: csl::Language = match script.language_version {
53                LanguageVersion::V1 => csl::Language::new_plutus_v1(),
54                LanguageVersion::V2 => csl::Language::new_plutus_v2(),
55                LanguageVersion::V3 => csl::Language::new_plutus_v3(),
56            };
57            Ok(csl::PlutusScriptSource::new(
58                &csl::PlutusScript::from_hex_with_version(
59                    script.script_cbor.as_str(),
60                    &language_version,
61                )
62                .map_err(WError::from_err(
63                    "to_csl_script_source - invalid script cbor",
64                ))?,
65            ))
66        }
67    }
68}
69
70pub fn to_csl_simple_script_source(
71    simple_script_source: SimpleScriptSource,
72) -> Result<csl::NativeScriptSource, WError> {
73    match simple_script_source {
74        SimpleScriptSource::ProvidedSimpleScriptSource(script) => Ok(csl::NativeScriptSource::new(
75            &csl::NativeScript::from_hex(&script.script_cbor).map_err(WError::from_err(
76                "to_csl_simple_script_source - invalid script cbor",
77            ))?,
78        )),
79
80        SimpleScriptSource::InlineSimpleScriptSource(script) => {
81            Ok(csl::NativeScriptSource::new_ref_input(
82                &csl::ScriptHash::from_hex(&script.simple_script_hash).map_err(
83                    WError::from_err("to_csl_simple_script_source - invalid script hash"),
84                )?,
85                &csl::TransactionInput::new(
86                    &csl::TransactionHash::from_hex(&script.ref_tx_in.tx_hash).map_err(
87                        WError::from_err("to_csl_simple_script_source - invalid transaction hash"),
88                    )?,
89                    script.ref_tx_in.tx_index,
90                ),
91                script.script_size,
92            ))
93        }
94    }
95}