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