whisky_csl/tx_parser/
mints.rs

1use super::CSLParser;
2use crate::csl;
3use crate::tx_parser::context::{ParserContext, RedeemerIndex, Script};
4use whisky_common::{
5    MintItem, MintParameter, ScriptMint, ScriptSource, SimpleScriptMint, SimpleScriptSource, WError,
6};
7
8impl CSLParser {
9    pub fn get_mints(&self) -> &Vec<MintItem> {
10        &self.tx_body.mints
11    }
12
13    pub(super) fn extract_mints(&mut self) -> Result<(), WError> {
14        let mints = self.csl_tx_body.mint();
15        if mints.is_none() {
16            return Ok(());
17        }
18        let mints = mints.unwrap();
19        self.tx_body.mints = csl_mint_to_mint_item(&mints, &self.context)?;
20        Ok(())
21    }
22}
23
24pub fn csl_mint_to_mint_item(
25    mint: &csl::Mint,
26    context: &ParserContext,
27) -> Result<Vec<MintItem>, WError> {
28    let mut mint_items = Vec::new();
29    let mint_keys = mint.keys();
30    let mint_keys_len = mint_keys.len();
31    for i in 0..mint_keys_len {
32        let policy_id = mint_keys.get(i);
33        let policy_id_hex = policy_id.to_hex();
34        let multiple_asstes = mint.get(&policy_id).ok_or_else(|| {
35            WError::new(
36                "csl_mint_to_mint_item",
37                &format!("Failed to get assets for policy ID: {}", policy_id_hex),
38            )
39        })?;
40        let assets = multiple_asstes
41            .get(multiple_asstes.len() - 1)
42            .ok_or_else(|| {
43                WError::new(
44                    "csl_mint_to_mint_item",
45                    &format!("Failed to get assets for policy ID: {}", policy_id_hex),
46                )
47            })?;
48        let assets_len = assets.len();
49        let assets_names = assets.keys();
50
51        for j in 0..assets_len {
52            let asset_name = assets_names.get(j);
53            let asset_name_hex = hex::encode(asset_name.name());
54            let amount = assets
55                .get(&asset_name)
56                .ok_or_else(|| {
57                    WError::new(
58                        "csl_mint_to_mint_item",
59                        &format!("Failed to get amount for asset: {}", asset_name_hex),
60                    )
61                })?
62                .to_str()
63                .parse::<i128>()
64                .map_err(|e| {
65                    WError::new(
66                        "csl_mint_to_mint_item",
67                        &format!("Failed to parse amount: {}", e),
68                    )
69                })?;
70
71            // Get the script witness for this policy_id
72            let script = context.script_witness.scripts.get(&policy_id);
73            match script {
74                Some(Script::ProvidedNative(native_script)) => {
75                    mint_items.push(MintItem::SimpleScriptMint(SimpleScriptMint {
76                        mint: MintParameter {
77                            policy_id: policy_id_hex.clone(),
78                            asset_name: asset_name_hex.clone(),
79                            amount,
80                        },
81                        script_source: Some(SimpleScriptSource::ProvidedSimpleScriptSource(
82                            native_script.clone(),
83                        )),
84                    }));
85                }
86                Some(Script::ReferencedNative(inline_script)) => {
87                    mint_items.push(MintItem::SimpleScriptMint(SimpleScriptMint {
88                        mint: MintParameter {
89                            policy_id: policy_id_hex.clone(),
90                            asset_name: asset_name_hex.clone(),
91                            amount,
92                        },
93                        script_source: Some(SimpleScriptSource::InlineSimpleScriptSource(
94                            inline_script.clone(),
95                        )),
96                    }));
97                }
98                Some(Script::ProvidedPlutus(plutus_script)) => {
99                    let redeemer = context
100                        .script_witness
101                        .redeemers
102                        .get(&RedeemerIndex::Mint(i))
103                        .cloned();
104                    mint_items.push(MintItem::ScriptMint(ScriptMint {
105                        mint: MintParameter {
106                            policy_id: policy_id_hex.clone(),
107                            asset_name: asset_name_hex.clone(),
108                            amount,
109                        },
110                        script_source: Some(ScriptSource::ProvidedScriptSource(
111                            plutus_script.clone(),
112                        )),
113                        redeemer,
114                    }));
115                }
116                Some(Script::ReferencedPlutus(inline_script)) => {
117                    let redeemer = context
118                        .script_witness
119                        .redeemers
120                        .get(&RedeemerIndex::Mint(i))
121                        .cloned();
122                    mint_items.push(MintItem::ScriptMint(ScriptMint {
123                        mint: MintParameter {
124                            policy_id: policy_id_hex.clone(),
125                            asset_name: asset_name_hex.clone(),
126                            amount,
127                        },
128                        script_source: Some(ScriptSource::InlineScriptSource(
129                            inline_script.clone(),
130                        )),
131                        redeemer,
132                    }));
133                }
134                None => {
135                    mint_items.push(MintItem::SimpleScriptMint(SimpleScriptMint {
136                        mint: MintParameter {
137                            policy_id: policy_id_hex.clone(),
138                            asset_name: asset_name_hex.clone(),
139                            amount,
140                        },
141                        script_source: None,
142                    }));
143                }
144            }
145        }
146    }
147    Ok(mint_items)
148}