1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::builders::witness_builder::{InputAggregateWitnessData, PartialPlutusWitness};

use super::witness_builder::{NativeScriptWitnessInfo, RequiredWitnessSet};

use cml_core::ordered_hash_map::OrderedHashMap;

use crate::{assets::AssetName, NativeScript, PolicyId, RequiredSigners};

#[derive(Clone)]
pub struct MintBuilderResult {
    pub policy_id: PolicyId,
    pub assets: OrderedHashMap<AssetName, i64>,
    pub aggregate_witness: Option<InputAggregateWitnessData>,
    pub required_wits: RequiredWitnessSet,
}

#[derive(Clone)]
pub struct SingleMintBuilder {
    assets: OrderedHashMap<AssetName, i64>,
}

impl SingleMintBuilder {
    pub fn new(assets: OrderedHashMap<AssetName, i64>) -> Self {
        Self { assets }
    }

    pub fn new_single_asset(asset: AssetName, amount: i64) -> Self {
        let mut assets = OrderedHashMap::new();
        assets.insert(asset, amount);
        Self { assets }
    }

    pub fn native_script(
        self,
        native_script: NativeScript,
        witness_info: NativeScriptWitnessInfo,
    ) -> MintBuilderResult {
        let mut required_wits = RequiredWitnessSet::default();
        let script_hash = native_script.hash();
        required_wits.add_script_hash(script_hash);

        MintBuilderResult {
            assets: self.assets,
            policy_id: script_hash,
            aggregate_witness: Some(InputAggregateWitnessData::NativeScript(
                native_script,
                witness_info,
            )),
            required_wits,
        }
    }

    pub fn plutus_script(
        self,
        partial_witness: PartialPlutusWitness,
        required_signers: RequiredSigners,
    ) -> MintBuilderResult {
        let mut required_wits = RequiredWitnessSet::default();

        let script_hash = partial_witness.script.hash();
        required_signers
            .iter()
            .for_each(|required_signer| required_wits.add_vkey_key_hash(*required_signer));
        required_wits.add_script_hash(script_hash);

        MintBuilderResult {
            assets: self.assets,
            policy_id: script_hash,
            aggregate_witness: Some(InputAggregateWitnessData::PlutusScript(
                partial_witness,
                required_signers,
                None,
            )),
            required_wits,
        }
    }
}