whisky_csl/utils/
value.rs1use 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}