whisky_provider/maestro/utils/
protocol_utils.rs

1use maestro_rust_sdk::models::epochs::Epoch;
2use whisky_common::{models::Protocol, WError};
3
4use crate::maestro::models::protocol_parameters::ProtocolParametersData;
5
6pub fn protocol_paras_data_to_protocol(
7    protocol_paras_data: ProtocolParametersData,
8    epoch: Epoch,
9) -> Result<Protocol, WError> {
10    let protocol = Protocol {
11        epoch: epoch.epoch_no,
12        min_fee_a: protocol_paras_data.min_fee_coefficient,
13        min_fee_b: protocol_paras_data.min_fee_constant["ada"]["lovelace"]
14            .as_u64()
15            .ok_or_else(WError::from_opt(
16                "protocol_paras_data_to_protocol",
17                "min_fee_constant",
18            ))?,
19        max_block_size: protocol_paras_data.max_block_body_size.bytes as i32,
20        max_tx_size: protocol_paras_data.max_transaction_size.bytes as u32,
21        max_block_header_size: protocol_paras_data.max_block_header_size.bytes as i32,
22        key_deposit: protocol_paras_data.stake_credential_deposit["ada"]["lovelace"]
23            .as_u64()
24            .ok_or_else(WError::from_opt(
25                "protocol_paras_data_to_protocol",
26                "stake_credential_deposit",
27            ))?,
28        pool_deposit: protocol_paras_data.stake_pool_deposit["ada"]["lovelace"]
29            .as_u64()
30            .ok_or_else(WError::from_opt(
31                "protocol_paras_data_to_protocol",
32                "stake_pool_deposit",
33            ))?,
34        decentralisation: 0.0,
35        min_pool_cost: protocol_paras_data.min_stake_pool_cost["ada"]["lovelace"]
36            .as_u64()
37            .ok_or_else(WError::from_opt(
38                "protocol_paras_data_to_protocol",
39                "min_stake_pool_cost",
40            ))?
41            .to_string(),
42        price_mem: parse_fraction(&protocol_paras_data.script_execution_prices.memory).map_err(
43            WError::from_err("protocol_paras_data_to_protocol - price_mem"),
44        )?,
45        price_step: parse_fraction(&protocol_paras_data.script_execution_prices.cpu).map_err(
46            WError::from_err("protocol_paras_data_to_protocol - price_step"),
47        )?,
48        max_tx_ex_mem: protocol_paras_data
49            .max_execution_units_per_transaction
50            .memory
51            .to_string(),
52        max_tx_ex_steps: protocol_paras_data
53            .max_execution_units_per_transaction
54            .memory
55            .to_string(),
56        max_block_ex_mem: protocol_paras_data
57            .max_execution_units_per_block
58            .memory
59            .to_string(),
60        max_block_ex_steps: protocol_paras_data
61            .max_execution_units_per_block
62            .memory
63            .to_string(),
64        max_val_size: protocol_paras_data.max_value_size.bytes as u32,
65        collateral_percent: protocol_paras_data.collateral_percentage as f64,
66        max_collateral_inputs: protocol_paras_data.max_collateral_inputs as i32,
67        coins_per_utxo_size: protocol_paras_data.min_utxo_deposit_constant["ada"]["lovelace"]
68            .as_u64()
69            .ok_or_else(WError::from_opt(
70                "protocol_paras_data_to_protocol",
71                "min_utxo_deposit_constant",
72            ))?,
73        min_fee_ref_script_cost_per_byte: protocol_paras_data.desired_number_of_stake_pools,
74    };
75    Ok(protocol)
76}
77
78fn parse_fraction(input: &str) -> Result<f64, WError> {
79    let parts: Vec<&str> = input.split('/').collect();
80
81    if parts.len() != 2 {
82        return Err(WError::new("parse_fraction", "Invalid input format"));
83    }
84
85    let numerator: f64 = parts[0]
86        .trim()
87        .parse()
88        .map_err(WError::from_err("parse_fraction - numerator"))?;
89    let denominator: f64 = parts[1]
90        .trim()
91        .parse()
92        .map_err(WError::from_err("parse_fraction - denominator"))?;
93
94    Ok(numerator / denominator)
95}