whisky_csl/utils/
ungroup.rs

1use cardano_serialization_lib::{self as csl};
2use hex::FromHex;
3use whisky_common::*;
4
5pub fn to_bignum(val: u64) -> Result<csl::BigNum, WError> {
6    csl::BigNum::from_str(&val.to_string()).map_err(WError::from_err("to_bignum - invalid value"))
7}
8
9pub fn build_tx_builder(params: Option<Protocol>) -> Result<csl::TransactionBuilder, WError> {
10    let protocol_params = params.unwrap_or_default();
11
12    let cfg =
13        csl::TransactionBuilderConfigBuilder::new()
14            .fee_algo(&csl::LinearFee::new(
15                &to_bignum(protocol_params.min_fee_a).map_err(WError::add_err_trace(
16                    "build_tx_builder - invalid min fee a",
17                ))?,
18                &to_bignum(protocol_params.min_fee_b).map_err(WError::add_err_trace(
19                    "build_tx_builder - invalid min fee b",
20                ))?,
21            ))
22            .pool_deposit(&to_bignum(protocol_params.pool_deposit).map_err(
23                WError::add_err_trace("build_tx_builder - invalid pool deposit"),
24            )?)
25            .key_deposit(
26                &to_bignum(protocol_params.key_deposit).map_err(WError::add_err_trace(
27                    "build_tx_builder - invalid key deposit",
28                ))?,
29            )
30            .max_value_size(protocol_params.max_val_size)
31            .max_tx_size(protocol_params.max_tx_size)
32            .coins_per_utxo_byte(&to_bignum(protocol_params.coins_per_utxo_size).map_err(
33                WError::add_err_trace("build_tx_builder - invalid coins per utxo byte"),
34            )?)
35            .ex_unit_prices(&csl::ExUnitPrices::new(
36                &csl::UnitInterval::new(
37                    &to_bignum((protocol_params.price_mem * 10000.0) as u64).map_err(
38                        WError::add_err_trace("build_tx_builder - invalid price mem"),
39                    )?,
40                    &to_bignum(10000).unwrap(),
41                ),
42                &csl::UnitInterval::new(
43                    &to_bignum((protocol_params.price_step * 10000000.0) as u64).map_err(
44                        WError::add_err_trace("build_tx_builder - invalid price step"),
45                    )?,
46                    &to_bignum(10000000).unwrap(),
47                ),
48            ))
49            .ref_script_coins_per_byte(&csl::UnitInterval::new(
50                &to_bignum(protocol_params.min_fee_ref_script_cost_per_byte).map_err(
51                    WError::add_err_trace(
52                        "build_tx_builder - invalid min fee ref script cost per byte",
53                    ),
54                )?,
55                &to_bignum(1).map_err(WError::add_err_trace(
56                    "build_tx_builder - invalid min fee ref script cost per byte",
57                ))?,
58            ))
59            .deduplicate_explicit_ref_inputs_with_regular_inputs(true)
60            .build()
61            .unwrap();
62    Ok(csl::TransactionBuilder::new(&cfg))
63}
64
65pub fn to_value(assets: &Vec<Asset>) -> Result<csl::Value, WError> {
66    let lovelace = assets.iter().find(|asset| asset.unit() == "lovelace");
67    let mut multi_asset = csl::MultiAsset::new();
68
69    for asset in assets {
70        if asset.unit() == "lovelace" {
71            continue;
72        }
73        let name_bytes = Vec::<u8>::from_hex(&asset.unit()[56..])
74            .map_err(WError::from_err("to_value - invalid asset name hex"))?;
75        multi_asset.set_asset(
76            &csl::ScriptHash::from_hex(&asset.unit()[0..56])
77                .map_err(WError::from_err("to_value - invalid asset script hash"))?,
78            &csl::AssetName::new(name_bytes)
79                .map_err(WError::from_err("to_value - invalid asset name hex"))?,
80            &csl::BigNum::from_str(&asset.quantity().to_string())
81                .map_err(WError::from_err("to_value - invalid asset quantity"))?,
82        );
83    }
84
85    let lovelace_asset = match lovelace {
86        Some(asset) => csl::BigNum::from_str(&asset.quantity()).map_err(WError::from_err(
87            "to_value - invalid lovelace asset quantity",
88        ))?,
89        None => csl::BigNum::from_str("0").unwrap(),
90    };
91
92    let mut value = csl::Value::new(&lovelace_asset);
93
94    if assets.len() > 1 || lovelace.is_none() {
95        value.set_multiasset(&multi_asset);
96    }
97    Ok(value)
98}