whisky_pallas/wrapper/witness_set/
plutus_script.rs1use 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}