whisky_pallas/wrapper/witness_set/
plutus_script.rs

1use std::str::FromStr;
2
3use pallas::codec::utils::Bytes;
4use pallas::ledger::primitives::conway::PlutusScript as PallasPlutusScript;
5use pallas::ledger::primitives::Fragment;
6use pallas::ledger::traverse::ComputeHash;
7use whisky_common::WError;
8
9#[derive(Debug, PartialEq, Eq, Clone)]
10pub struct PlutusScript<const VERSION: usize> {
11    pub inner: PallasPlutusScript<VERSION>,
12}
13
14impl<const VERSION: usize> PlutusScript<VERSION> {
15    pub fn new(script: String) -> Result<Self, WError> {
16        let inner = PallasPlutusScript::<VERSION>(Bytes::from_str(&script).map_err(|e| {
17            WError::new(
18                "WhiskyPallas - Creating Plutus script:",
19                &format!("Invalid Plutus script: {}", e.to_string()),
20            )
21        })?);
22
23        Ok(Self { inner })
24    }
25
26    pub fn encode(&self) -> Result<String, WError> {
27        self.inner
28            .encode_fragment()
29            .map(|bytes| hex::encode(bytes))
30            .map_err(|_| {
31                WError::new(
32                    "WhiskyPallas - Encoding Plutus script:",
33                    "Failed to encode fragment",
34                )
35            })
36    }
37
38    pub fn decode_bytes(bytes: &[u8]) -> Result<Self, WError> {
39        let inner = PallasPlutusScript::<VERSION>::decode_fragment(&bytes).map_err(|e| {
40            WError::new(
41                "WhiskyPallas - Decoding Plutus script:",
42                &format!("Fragment decode error: {}", e.to_string()),
43            )
44        })?;
45        Ok(Self { inner })
46    }
47
48    pub fn hash(&self) -> String {
49        self.inner.compute_hash().to_string()
50    }
51}