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