whisky-csl 1.0.13

Wrapper around the cardano-serialization-lib for easier transaction building, heavily inspired by cardano-cli APIs
Documentation
use cardano_serialization_lib::{self as csl};

use super::{to_bignum, to_value};
use whisky_common::*;

pub fn get_min_utxo_value(output: &Output, coins_per_utxo_size: &u64) -> Result<String, WError> {
    let mut tx_output_builder = csl::TransactionOutputBuilder::new().with_address(
        &csl::Address::from_bech32(&output.address).map_err(WError::from_err(
            "get_min_utxo_value - invalid address bech32",
        ))?,
    );
    if let Some(datum) = &output.datum {
        match datum {
            Datum::Inline(str_data) => {
                tx_output_builder = tx_output_builder.with_plutus_data(
                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
                        "get_min_utxo_value - invalid inline datum hex",
                    ))?,
                );
            }
            Datum::Hash(str_data) => {
                tx_output_builder = tx_output_builder.with_data_hash(&csl::hash_plutus_data(
                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
                        "get_min_utxo_value - invalid hash datum hex",
                    ))?,
                ));
            }
            Datum::Embedded(str_data) => {
                tx_output_builder = tx_output_builder.with_data_hash(&csl::hash_plutus_data(
                    &csl::PlutusData::from_hex(str_data).map_err(WError::from_err(
                        "get_min_utxo_value - invalid embedded datum hex",
                    ))?,
                ));
            }
        }
    }
    if let Some(output_script_source) = &output.reference_script {
        match output_script_source {
            OutputScriptSource::ProvidedSimpleScriptSource(simple_script) => {
                tx_output_builder =
                    tx_output_builder.with_script_ref(&csl::ScriptRef::new_native_script(
                        &csl::NativeScript::from_hex(&simple_script.script_cbor).map_err(
                            WError::from_err(
                                "get_min_utxo_value - invalid provided simple script hex",
                            ),
                        )?,
                    ));
            }
            OutputScriptSource::ProvidedScriptSource(script) => {
                let version = match script.language_version {
                    LanguageVersion::V1 => csl::Language::new_plutus_v1(),
                    LanguageVersion::V2 => csl::Language::new_plutus_v2(),
                    LanguageVersion::V3 => csl::Language::new_plutus_v3(),
                };
                tx_output_builder =
                    tx_output_builder.with_script_ref(&csl::ScriptRef::new_plutus_script(
                        &csl::PlutusScript::from_hex_with_version(&script.script_cbor, &version)
                            .map_err(WError::from_err(
                                "get_min_utxo_value - invalid provided script hex",
                            ))?,
                    ));
            }
        }
    }
    let multi_asset = match to_value(&output.amount)?.multiasset() {
        Some(multi_asset) => multi_asset,
        None => csl::MultiAsset::new(),
    };
    let final_output = tx_output_builder
        .next()
        .map_err(WError::from_err(
            "get_min_utxo_value - invalid next output builder",
        ))?
        .with_asset_and_min_required_coin_by_utxo_cost(
            &multi_asset,
            &csl::DataCost::new_coins_per_byte(&to_bignum(*coins_per_utxo_size).map_err(
                WError::add_err_trace("get_min_utxo_value - invalid coins per utxo size"),
            )?),
        )
        .map_err(WError::from_err(
            "get_min_utxo_value - invalid min required coin by utxo cost",
        ))?
        .build()
        .map_err(WError::from_err(
            "get_min_utxo_value - invalid build tx output",
        ))?;
    Ok(final_output.amount().coin().to_str())
}