whisky_pallas/wrapper/witness_set/
redeemer.rs

1use pallas::ledger::primitives::{conway::Redeemer as PallasRedeemer, Fragment};
2use whisky_common::WError;
3
4use crate::wrapper::witness_set::plutus_data::PlutusData;
5
6#[derive(Debug, Clone, PartialEq, Hash, Eq)]
7pub enum RedeemerTag {
8    Spend,
9    Mint,
10    Cert,
11    Reward,
12    Vote,
13    Propose,
14}
15
16#[derive(Debug, Clone, PartialEq)]
17pub struct ExUnits {
18    pub mem: u64,
19    pub steps: u64,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq)]
23pub struct Redeemer {
24    pub inner: PallasRedeemer,
25}
26
27impl Redeemer {
28    pub fn new(
29        tag: RedeemerTag,
30        index: u32,
31        data: PlutusData,
32        ex_units: ExUnits,
33    ) -> Result<Self, WError> {
34        let pallas_tag = match tag {
35            RedeemerTag::Spend => pallas::ledger::primitives::conway::RedeemerTag::Spend,
36            RedeemerTag::Mint => pallas::ledger::primitives::conway::RedeemerTag::Mint,
37            RedeemerTag::Cert => pallas::ledger::primitives::conway::RedeemerTag::Cert,
38            RedeemerTag::Reward => pallas::ledger::primitives::conway::RedeemerTag::Reward,
39            RedeemerTag::Vote => pallas::ledger::primitives::conway::RedeemerTag::Vote,
40            RedeemerTag::Propose => pallas::ledger::primitives::conway::RedeemerTag::Propose,
41        };
42        let inner = PallasRedeemer {
43            tag: pallas_tag,
44            index,
45            data: data.inner,
46            ex_units: pallas::ledger::primitives::conway::ExUnits {
47                mem: ex_units.mem,
48                steps: ex_units.steps,
49            },
50        };
51        Ok(Self { inner })
52    }
53
54    pub fn encode(&self) -> Result<String, WError> {
55        self.inner
56            .encode_fragment()
57            .map(|bytes| hex::encode(bytes))
58            .map_err(|_| {
59                WError::new(
60                    "WhiskyPallas - Encoding redeemer:",
61                    "Failed to encode fragment",
62                )
63            })
64    }
65
66    pub fn decode_bytes(bytes: &[u8]) -> Result<Self, WError> {
67        let inner = PallasRedeemer::decode_fragment(&bytes).map_err(|e| {
68            WError::new(
69                "WhiskyPallas - Decoding redeemer:",
70                &format!("Fragment decode error: {}", e.to_string()),
71            )
72        })?;
73        Ok(Self { inner })
74    }
75}