cml_chain/builders/
mint_builder.rs

1use crate::builders::witness_builder::{InputAggregateWitnessData, PartialPlutusWitness};
2
3use super::witness_builder::{NativeScriptWitnessInfo, RequiredWitnessSet};
4
5use cml_core::ordered_hash_map::OrderedHashMap;
6
7use crate::{assets::AssetName, NativeScript, PolicyId, RequiredSigners};
8
9#[derive(Clone)]
10pub struct MintBuilderResult {
11    pub policy_id: PolicyId,
12    pub assets: OrderedHashMap<AssetName, i64>,
13    pub aggregate_witness: Option<InputAggregateWitnessData>,
14    pub required_wits: RequiredWitnessSet,
15}
16
17#[derive(Clone)]
18pub struct SingleMintBuilder {
19    assets: OrderedHashMap<AssetName, i64>,
20}
21
22impl SingleMintBuilder {
23    pub fn new(assets: OrderedHashMap<AssetName, i64>) -> Self {
24        Self { assets }
25    }
26
27    pub fn new_single_asset(asset: AssetName, amount: i64) -> Self {
28        let mut assets = OrderedHashMap::new();
29        assets.insert(asset, amount);
30        Self { assets }
31    }
32
33    pub fn native_script(
34        self,
35        native_script: NativeScript,
36        witness_info: NativeScriptWitnessInfo,
37    ) -> MintBuilderResult {
38        let mut required_wits = RequiredWitnessSet::default();
39        let script_hash = native_script.hash();
40        required_wits.add_script_hash(script_hash);
41
42        MintBuilderResult {
43            assets: self.assets,
44            policy_id: script_hash,
45            aggregate_witness: Some(InputAggregateWitnessData::NativeScript(
46                native_script,
47                witness_info,
48            )),
49            required_wits,
50        }
51    }
52
53    pub fn plutus_script(
54        self,
55        partial_witness: PartialPlutusWitness,
56        required_signers: RequiredSigners,
57    ) -> MintBuilderResult {
58        let mut required_wits = RequiredWitnessSet::default();
59
60        let script_hash = partial_witness.script.hash();
61        required_signers
62            .iter()
63            .for_each(|required_signer| required_wits.add_vkey_key_hash(*required_signer));
64        required_wits.add_script_hash(script_hash);
65
66        MintBuilderResult {
67            assets: self.assets,
68            policy_id: script_hash,
69            aggregate_witness: Some(InputAggregateWitnessData::PlutusScript(
70                partial_witness,
71                required_signers,
72                None,
73            )),
74            required_wits,
75        }
76    }
77}