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