whisky_pallas/wrapper/transaction_body/
script_ref.rs

1use std::str::FromStr;
2
3use pallas::{
4    codec::utils::{Bytes, KeepRaw},
5    ledger::primitives::{
6        conway::{NativeScript, ScriptRef as PallasScriptRef},
7        Fragment, PlutusScript,
8    },
9};
10use whisky_common::WError;
11
12#[derive(Debug, Clone)]
13pub enum ScriptRefKind {
14    NativeScript { native_script_hex: String },
15    PlutusV1Script { plutus_v1_script_hex: String },
16    PlutusV2Script { plutus_v2_script_hex: String },
17    PlutusV3Script { plutus_v3_script_hex: String },
18}
19
20#[derive(Debug, PartialEq, Clone)]
21pub struct ScriptRef<'a> {
22    pub inner: PallasScriptRef<'a>,
23}
24
25impl<'a> ScriptRef<'a> {
26    pub fn new(script_ref_kind: ScriptRefKind) -> Result<Self, WError> {
27        let pallas_script_ref = match script_ref_kind {
28            ScriptRefKind::NativeScript { native_script_hex } => {
29                let bytes = hex::decode(native_script_hex).map_err(|e| {
30                    WError::new(
31                        "WhiskyPallas - Creating script ref:",
32                        &format!("Hex decode error: {}", e),
33                    )
34                })?;
35                PallasScriptRef::NativeScript(KeepRaw::from(
36                    NativeScript::decode_fragment(&bytes).map_err(|e| {
37                        WError::new(
38                            "WhiskyPallas - Creating script ref:",
39                            &format!("Native script fragment decode error: {}", e),
40                        )
41                    })?,
42                ))
43            }
44            ScriptRefKind::PlutusV1Script {
45                plutus_v1_script_hex,
46            } => PallasScriptRef::PlutusV1Script(PlutusScript::<1>(
47                Bytes::from_str(&plutus_v1_script_hex).map_err(|e| {
48                    WError::new(
49                        "WhiskyPallas - Creating script ref:",
50                        &format!("Invalid Plutus V1 script bytes: {}", e),
51                    )
52                })?,
53            )),
54            ScriptRefKind::PlutusV2Script {
55                plutus_v2_script_hex,
56            } => PallasScriptRef::PlutusV2Script(PlutusScript::<2>(
57                Bytes::from_str(&plutus_v2_script_hex).map_err(|e| {
58                    WError::new(
59                        "WhiskyPallas - Creating script ref:",
60                        &format!("Invalid Plutus V2 script bytes: {}", e),
61                    )
62                })?,
63            )),
64            ScriptRefKind::PlutusV3Script {
65                plutus_v3_script_hex,
66            } => PallasScriptRef::PlutusV3Script(PlutusScript::<3>(
67                Bytes::from_str(&plutus_v3_script_hex).map_err(|e| {
68                    WError::new(
69                        "WhiskyPallas - Creating script ref:",
70                        &format!("Invalid Plutus V3 script bytes: {}", e),
71                    )
72                })?,
73            )),
74        };
75
76        Ok(Self {
77            inner: pallas_script_ref,
78        })
79    }
80
81    pub fn encode(&self) -> Result<String, WError> {
82        let encoded_fragment = self
83            .inner
84            .encode_fragment()
85            .map_err(|e| WError::new("ScriptRef - Fragment encode error", &e.to_string()))?;
86        Ok(hex::encode(encoded_fragment))
87    }
88
89    pub fn decode_bytes(bytes: &'a [u8]) -> Result<Self, WError> {
90        let pallas_script_ref = PallasScriptRef::decode_fragment(bytes)
91            .map_err(|e| WError::new("ScriptRef - Fragment decode error", &format!("{}", e)))?;
92        Ok(Self {
93            inner: pallas_script_ref,
94        })
95    }
96}