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 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 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}