cml_chain_wasm/builders/
redeemer_builder.rs

1use super::{
2    certificate_builder::CertificateBuilderResult, input_builder::InputBuilderResult,
3    mint_builder::MintBuilderResult, proposal_builder::ProposalBuilderResult,
4    vote_builder::VoteBuilderResult, withdrawal_builder::WithdrawalBuilderResult,
5};
6use crate::plutus::{ExUnits, LegacyRedeemer, PlutusData, RedeemerTag, Redeemers};
7use cml_core_wasm::impl_wasm_conversions;
8use wasm_bindgen::prelude::{wasm_bindgen, JsError};
9
10#[wasm_bindgen]
11#[derive(Clone, Copy, PartialOrd, Ord, Debug, PartialEq, Eq, Hash)]
12pub struct RedeemerWitnessKey(cml_chain::builders::redeemer_builder::RedeemerWitnessKey);
13
14impl_wasm_conversions!(
15    cml_chain::builders::redeemer_builder::RedeemerWitnessKey,
16    RedeemerWitnessKey
17);
18
19#[wasm_bindgen]
20impl RedeemerWitnessKey {
21    pub fn new(tag: RedeemerTag, index: u64) -> Self {
22        cml_chain::builders::redeemer_builder::RedeemerWitnessKey::new(tag, index).into()
23    }
24
25    pub fn from_redeemer(redeemer: &LegacyRedeemer) -> Self {
26        cml_chain::builders::redeemer_builder::RedeemerWitnessKey::from(redeemer.as_ref()).into()
27    }
28}
29
30/// Redeemer without the tag of index
31/// This allows builder code to return partial redeemers
32/// and then later have them placed in the right context
33#[wasm_bindgen]
34#[derive(Clone, Debug)]
35pub struct UntaggedRedeemer(cml_chain::builders::redeemer_builder::UntaggedRedeemer);
36
37impl_wasm_conversions!(
38    cml_chain::builders::redeemer_builder::UntaggedRedeemer,
39    UntaggedRedeemer
40);
41
42#[wasm_bindgen]
43impl UntaggedRedeemer {
44    pub fn new(data: &PlutusData, ex_units: &ExUnits) -> Self {
45        cml_chain::builders::redeemer_builder::UntaggedRedeemer::new(
46            data.clone().into(),
47            ex_units.clone().into(),
48        )
49        .into()
50    }
51}
52
53/// In order to calculate the index from the sorted set, "add_*" methods in this builder
54/// must be called along with the "add_*" methods in transaction builder.
55#[wasm_bindgen]
56#[derive(Clone, Default, Debug)]
57pub struct RedeemerSetBuilder(cml_chain::builders::redeemer_builder::RedeemerSetBuilder);
58
59impl_wasm_conversions!(
60    cml_chain::builders::redeemer_builder::RedeemerSetBuilder,
61    RedeemerSetBuilder
62);
63
64#[wasm_bindgen]
65impl RedeemerSetBuilder {
66    pub fn new() -> Self {
67        Self::default()
68    }
69
70    pub fn is_empty(&self) -> bool {
71        self.0.is_empty()
72    }
73
74    /// note: will override existing value if called twice with the same key
75    pub fn update_ex_units(&mut self, key: &RedeemerWitnessKey, ex_units: &ExUnits) {
76        self.0
77            .update_ex_units((*key).into(), ex_units.clone().into());
78    }
79
80    pub fn add_spend(&mut self, result: &InputBuilderResult) {
81        self.0.add_spend(result.as_ref());
82    }
83
84    pub fn add_mint(&mut self, result: &MintBuilderResult) {
85        self.0.add_mint(result.as_ref());
86    }
87
88    pub fn add_reward(&mut self, result: &WithdrawalBuilderResult) {
89        self.0.add_reward(result.as_ref());
90    }
91
92    pub fn add_cert(&mut self, result: &CertificateBuilderResult) {
93        self.0.add_cert(result.as_ref());
94    }
95
96    pub fn add_proposal(&mut self, result: &ProposalBuilderResult) {
97        self.0.add_proposal(result.as_ref());
98    }
99
100    pub fn add_vote(&mut self, result: &VoteBuilderResult) {
101        self.0.add_vote(result.as_ref());
102    }
103
104    pub fn build(&self, default_to_dummy_exunits: bool) -> Result<Redeemers, JsError> {
105        self.0
106            .build(default_to_dummy_exunits)
107            .map(Into::into)
108            .map_err(Into::into)
109    }
110}