whisky_csl/utils/
value.rs

1use cardano_serialization_lib::{self as csl};
2
3use super::{to_bignum, to_value};
4use whisky_common::*;
5
6pub fn get_min_utxo_value(output: &Output, coins_per_utxo_size: &u64) -> Result<String, WError> {
7    let mut tx_output_builder = csl::TransactionOutputBuilder::new().with_address(
8        &csl::Address::from_bech32(&output.address).map_err(WError::from_err(
9            "get_min_utxo_value - invalid address bech32",
10        ))?,
11    );
12    if let Some(datum) = &output.datum {
13        match datum {
14            Datum::Inline(str_data) => {
15                tx_output_builder = tx_output_builder.with_plutus_data(
16                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
17                        "get_min_utxo_value - invalid inline datum hex",
18                    ))?,
19                );
20            }
21            Datum::Hash(str_data) => {
22                tx_output_builder = tx_output_builder.with_data_hash(&csl::hash_plutus_data(
23                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
24                        "get_min_utxo_value - invalid hash datum hex",
25                    ))?,
26                ));
27            }
28            Datum::Embedded(str_data) => {
29                tx_output_builder = tx_output_builder.with_data_hash(&csl::hash_plutus_data(
30                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
31                        "get_min_utxo_value - invalid embedded datum hex",
32                    ))?,
33                ));
34            }
35        }
36    }
37    if let Some(output_script_source) = &output.reference_script {
38        match output_script_source {
39            OutputScriptSource::ProvidedSimpleScriptSource(simple_script) => {
40                tx_output_builder =
41                    tx_output_builder.with_script_ref(&csl::ScriptRef::new_native_script(
42                        &csl::NativeScript::from_hex(&simple_script.script_cbor).map_err(
43                            WError::from_err(
44                                "get_min_utxo_value - invalid provided simple script hex",
45                            ),
46                        )?,
47                    ));
48            }
49            OutputScriptSource::ProvidedScriptSource(script) => {
50                let version = match script.language_version {
51                    LanguageVersion::V1 => csl::Language::new_plutus_v1(),
52                    LanguageVersion::V2 => csl::Language::new_plutus_v2(),
53                    LanguageVersion::V3 => csl::Language::new_plutus_v3(),
54                };
55                tx_output_builder =
56                    tx_output_builder.with_script_ref(&csl::ScriptRef::new_plutus_script(
57                        &csl::PlutusScript::from_hex_with_version(&script.script_cbor, &version)
58                            .map_err(WError::from_err(
59                                "get_min_utxo_value - invalid provided script hex",
60                            ))?,
61                    ));
62            }
63        }
64    }
65    let multi_asset = match to_value(&output.amount)?.multiasset() {
66        Some(multi_asset) => multi_asset,
67        None => csl::MultiAsset::new(),
68    };
69    let final_output = tx_output_builder
70        .next()
71        .map_err(WError::from_err(
72            "get_min_utxo_value - invalid next output builder",
73        ))?
74        .with_asset_and_min_required_coin_by_utxo_cost(
75            &multi_asset,
76            &csl::DataCost::new_coins_per_byte(&to_bignum(*coins_per_utxo_size).map_err(
77                WError::add_err_trace("get_min_utxo_value - invalid coins per utxo size"),
78            )?),
79        )
80        .map_err(WError::from_err(
81            "get_min_utxo_value - invalid min required coin by utxo cost",
82        ))?
83        .build()
84        .map_err(WError::from_err(
85            "get_min_utxo_value - invalid build tx output",
86        ))?;
87    Ok(final_output.amount().coin().to_str())
88}