cml_chain_wasm/builders/
output_builder.rs

1use wasm_bindgen::{prelude::wasm_bindgen, JsError};
2
3use cml_core_wasm::impl_wasm_conversions;
4
5use crate::{
6    address::Address,
7    assets::{Coin, MultiAsset, Value},
8    plutus::PlutusData,
9    transaction::{DatumOption, ScriptRef, TransactionOutput},
10};
11
12/// We introduce a builder-pattern format for creating transaction outputs
13/// This is because:
14/// 1. Some fields (i.e. data hash) are optional, and we can't easily expose Option<> in WASM
15/// 2. Some fields like amounts have many ways it could be set (some depending on other field values being known)
16/// 3. Easier to adapt as the output format gets more complicated in future Cardano releases
17#[derive(Clone, Debug, Default)]
18#[wasm_bindgen]
19pub struct TransactionOutputBuilder(cml_chain::builders::output_builder::TransactionOutputBuilder);
20
21#[wasm_bindgen]
22impl TransactionOutputBuilder {
23    pub fn new() -> Self {
24        cml_chain::builders::output_builder::TransactionOutputBuilder::new().into()
25    }
26
27    pub fn with_address(&self, address: &Address) -> Self {
28        self.0.clone().with_address(address.clone().into()).into()
29    }
30
31    /// A communication datum is one where the data hash is used in the tx output
32    /// Yet the full datum is included in the witness of the same transaction
33    pub fn with_communication_data(&self, datum: &PlutusData) -> Self {
34        self.0
35            .clone()
36            .with_communication_data(datum.clone().into())
37            .into()
38    }
39    pub fn with_data(&self, datum: &DatumOption) -> Self {
40        self.0.clone().with_data(datum.clone().into()).into()
41    }
42
43    pub fn with_reference_script(&self, script_ref: &ScriptRef) -> Self {
44        self.0
45            .clone()
46            .with_reference_script(script_ref.clone().into())
47            .into()
48    }
49
50    pub fn next(&self) -> Result<TransactionOutputAmountBuilder, JsError> {
51        self.0.clone().next().map(Into::into).map_err(Into::into)
52    }
53}
54
55impl_wasm_conversions!(
56    cml_chain::builders::output_builder::TransactionOutputBuilder,
57    TransactionOutputBuilder
58);
59
60#[wasm_bindgen]
61#[derive(Clone, Debug)]
62pub struct TransactionOutputAmountBuilder(
63    cml_chain::builders::output_builder::TransactionOutputAmountBuilder,
64);
65
66#[wasm_bindgen]
67impl TransactionOutputAmountBuilder {
68    pub fn with_value(&self, amount: &Value) -> Self {
69        self.0
70            .clone()
71            .with_value::<cml_chain::Value>(amount.clone().into())
72            .into()
73    }
74
75    pub fn with_asset_and_min_required_coin(
76        &self,
77        multiasset: &MultiAsset,
78        coins_per_utxo_byte: Coin,
79    ) -> Result<TransactionOutputAmountBuilder, JsError> {
80        self.0
81            .clone()
82            .with_asset_and_min_required_coin(multiasset.clone().into(), coins_per_utxo_byte)
83            .map(Into::into)
84            .map_err(Into::into)
85    }
86
87    pub fn build(&self) -> Result<SingleOutputBuilderResult, JsError> {
88        self.0.clone().build().map(Into::into).map_err(Into::into)
89    }
90}
91
92impl_wasm_conversions!(
93    cml_chain::builders::output_builder::TransactionOutputAmountBuilder,
94    TransactionOutputAmountBuilder
95);
96
97#[wasm_bindgen]
98#[derive(Clone, Debug)]
99pub struct SingleOutputBuilderResult(
100    cml_chain::builders::output_builder::SingleOutputBuilderResult,
101);
102
103#[wasm_bindgen]
104impl SingleOutputBuilderResult {
105    pub fn new(output: &TransactionOutput) -> SingleOutputBuilderResult {
106        cml_chain::builders::output_builder::SingleOutputBuilderResult::new(output.clone().into())
107            .into()
108    }
109
110    pub fn output(&self) -> TransactionOutput {
111        self.0.output.clone().into()
112    }
113
114    pub fn communication_datum(&self) -> Option<PlutusData> {
115        self.0.communication_datum.clone().map(Into::into)
116    }
117}
118
119impl_wasm_conversions!(
120    cml_chain::builders::output_builder::SingleOutputBuilderResult,
121    SingleOutputBuilderResult
122);