whisky_pallas/wrapper/transaction_body/
script_ref.rs1use 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}