whisky_provider/maestro/utils/
protocol_utils.rs1use 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}