cardano_sdk/cardano/
plutus_script.rs1use crate::{Hash, PlutusVersion, pallas};
6use std::fmt;
7
8#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
20pub struct PlutusScript(PlutusVersion, Vec<u8>);
21
22impl fmt::Display for PlutusScript {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 write!(f, "{}({})", self.0, <Hash<28>>::from(self))
25 }
26}
27
28impl PlutusScript {
31 pub fn new(version: PlutusVersion, script: Vec<u8>) -> Self {
35 Self(version, script)
36 }
37}
38
39impl PlutusScript {
42 pub fn version(&self) -> PlutusVersion {
43 self.0
44 }
45
46 pub fn script(&self) -> &[u8] {
47 &self.1
48 }
49
50 pub fn size(&self) -> u64 {
52 self.1.len() as u64
53 }
54}
55
56impl From<pallas::PlutusScript<1>> for PlutusScript {
59 fn from(plutus_script: pallas::PlutusScript<1>) -> Self {
60 Self(PlutusVersion::V1, plutus_script.0.to_vec())
61 }
62}
63
64impl From<pallas::PlutusScript<2>> for PlutusScript {
65 fn from(plutus_script: pallas::PlutusScript<2>) -> Self {
66 Self(PlutusVersion::V2, plutus_script.0.to_vec())
67 }
68}
69
70impl From<pallas::PlutusScript<3>> for PlutusScript {
71 fn from(plutus_script: pallas::PlutusScript<3>) -> Self {
72 Self(PlutusVersion::V3, plutus_script.0.to_vec())
73 }
74}
75
76impl From<&PlutusScript> for Hash<28> {
79 fn from(PlutusScript(version, script): &PlutusScript) -> Self {
80 let mut buffer: Vec<u8> = vec![u8::from(*version)];
81 buffer.extend_from_slice(script.as_slice());
82 Hash::from(pallas::Hasher::<224>::hash(&buffer))
83 }
84}
85
86pub struct PlutusVersionMismatch {
87 pub expected: PlutusVersion,
88 pub found: PlutusVersion,
89}
90
91impl From<PlutusScript> for pallas::ScriptRef {
92 fn from(PlutusScript(version, script): PlutusScript) -> Self {
93 match version {
94 PlutusVersion::V1 => pallas::ScriptRef::PlutusV1Script(pallas::PlutusScript::<1>(
95 pallas::Bytes::from(script),
96 )),
97 PlutusVersion::V2 => pallas::ScriptRef::PlutusV2Script(pallas::PlutusScript::<2>(
98 pallas::Bytes::from(script),
99 )),
100 PlutusVersion::V3 => pallas::ScriptRef::PlutusV3Script(pallas::PlutusScript::<3>(
101 pallas::Bytes::from(script),
102 )),
103 }
104 }
105}
106
107impl TryFrom<PlutusScript> for pallas::PlutusScript<1> {
108 type Error = PlutusVersionMismatch;
109
110 fn try_from(PlutusScript(version, script): PlutusScript) -> Result<Self, Self::Error> {
111 match version {
112 PlutusVersion::V1 => Ok(pallas::PlutusScript(pallas::Bytes::from(script))),
113 PlutusVersion::V2 | PlutusVersion::V3 => Err(PlutusVersionMismatch {
114 expected: PlutusVersion::V1,
115 found: version,
116 }),
117 }
118 }
119}
120
121impl TryFrom<PlutusScript> for pallas::PlutusScript<2> {
122 type Error = PlutusVersionMismatch;
123
124 fn try_from(PlutusScript(version, script): PlutusScript) -> Result<Self, Self::Error> {
125 match version {
126 PlutusVersion::V2 => Ok(pallas::PlutusScript(pallas::Bytes::from(script))),
127 PlutusVersion::V1 | PlutusVersion::V3 => Err(PlutusVersionMismatch {
128 expected: PlutusVersion::V2,
129 found: version,
130 }),
131 }
132 }
133}
134
135impl TryFrom<PlutusScript> for pallas::PlutusScript<3> {
136 type Error = PlutusVersionMismatch;
137
138 fn try_from(PlutusScript(version, script): PlutusScript) -> Result<Self, Self::Error> {
139 match version {
140 PlutusVersion::V3 => Ok(pallas::PlutusScript(pallas::Bytes::from(script))),
141 PlutusVersion::V1 | PlutusVersion::V2 => Err(PlutusVersionMismatch {
142 expected: PlutusVersion::V3,
143 found: version,
144 }),
145 }
146 }
147}