whisky_csl/tx_parser/
mints.rs1use 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 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}