Skip to main content

pallas_validate/utils/
environment.rs

1//! Types used for representing the environment required for validation in each
2//! era.
3use pallas_primitives::{
4    alonzo::{
5        Coin, CostModels, ExUnitPrices, ExUnits, Nonce, ProtocolVersion, RationalNumber,
6        UnitInterval,
7    },
8    babbage::CostModels as BabbageCostModels,
9    conway::{CostModels as ConwayCostModels, Epoch},
10};
11
12#[allow(clippy::large_enum_variant)]
13#[derive(Debug, Clone)]
14#[non_exhaustive]
15pub enum MultiEraProtocolParameters {
16    Byron(ByronProtParams),
17    Shelley(ShelleyProtParams),
18    Alonzo(AlonzoProtParams),
19    Babbage(BabbageProtParams),
20    Conway(ConwayProtParams),
21}
22
23impl MultiEraProtocolParameters {
24    pub fn system_start(&self) -> chrono::DateTime<chrono::FixedOffset> {
25        match self {
26            MultiEraProtocolParameters::Byron(ByronProtParams { start_time, .. }) => {
27                chrono::DateTime::from_timestamp(*start_time as i64, 0)
28                    .expect("valid timestamp")
29                    .fixed_offset()
30            }
31            MultiEraProtocolParameters::Shelley(ShelleyProtParams { system_start, .. }) => {
32                *system_start
33            }
34            MultiEraProtocolParameters::Alonzo(AlonzoProtParams { system_start, .. }) => {
35                *system_start
36            }
37            MultiEraProtocolParameters::Babbage(BabbageProtParams { system_start, .. }) => {
38                *system_start
39            }
40            MultiEraProtocolParameters::Conway(ConwayProtParams { system_start, .. }) => {
41                *system_start
42            }
43        }
44    }
45
46    pub fn protocol_version(&self) -> usize {
47        match self {
48            MultiEraProtocolParameters::Byron(ByronProtParams {
49                block_version: (x, ..),
50                ..
51            }) => *x as usize,
52            MultiEraProtocolParameters::Shelley(ShelleyProtParams {
53                protocol_version: (x, ..),
54                ..
55            }) => *x as usize,
56            MultiEraProtocolParameters::Alonzo(AlonzoProtParams {
57                protocol_version: (x, ..),
58                ..
59            }) => *x as usize,
60            MultiEraProtocolParameters::Babbage(BabbageProtParams {
61                protocol_version: (x, ..),
62                ..
63            }) => *x as usize,
64            MultiEraProtocolParameters::Conway(ConwayProtParams {
65                protocol_version: (x, ..),
66                ..
67            }) => *x as usize,
68        }
69    }
70
71    const FIVE_DAYS_IN_SECONDS: u64 = 5 * 24 * 60 * 60;
72
73    pub fn epoch_length(&self) -> u64 {
74        match self {
75            MultiEraProtocolParameters::Byron(ByronProtParams { slot_duration, .. }) => {
76                // TODO: research if Byron epoch length is actually hardcoded or if you can get
77                // it from genesis files somehow
78                Self::FIVE_DAYS_IN_SECONDS / (*slot_duration / 1000)
79            }
80            MultiEraProtocolParameters::Shelley(ShelleyProtParams { epoch_length, .. }) => {
81                *epoch_length
82            }
83            MultiEraProtocolParameters::Alonzo(AlonzoProtParams { epoch_length, .. }) => {
84                *epoch_length
85            }
86            MultiEraProtocolParameters::Babbage(BabbageProtParams { epoch_length, .. }) => {
87                *epoch_length
88            }
89            MultiEraProtocolParameters::Conway(ConwayProtParams { epoch_length, .. }) => {
90                *epoch_length
91            }
92        }
93    }
94
95    pub fn slot_length(&self) -> u64 {
96        match self {
97            MultiEraProtocolParameters::Byron(ByronProtParams { slot_duration, .. }) => {
98                *slot_duration / 1000
99            }
100            MultiEraProtocolParameters::Shelley(ShelleyProtParams { slot_length, .. }) => {
101                *slot_length
102            }
103            MultiEraProtocolParameters::Alonzo(AlonzoProtParams { slot_length, .. }) => {
104                *slot_length
105            }
106            MultiEraProtocolParameters::Babbage(BabbageProtParams { slot_length, .. }) => {
107                *slot_length
108            }
109            MultiEraProtocolParameters::Conway(ConwayProtParams { slot_length, .. }) => {
110                *slot_length
111            }
112        }
113    }
114}
115
116#[derive(Debug, Clone)]
117pub struct ByronProtParams {
118    pub block_version: (u16, u16, u8),
119    pub start_time: u64,
120    pub script_version: u16,
121    pub slot_duration: u64,
122    pub max_block_size: u64,
123    pub max_header_size: u64,
124    pub max_tx_size: u64,
125    pub max_proposal_size: u64,
126    pub mpc_thd: u64,
127    pub heavy_del_thd: u64,
128    pub update_vote_thd: u64,
129    pub update_proposal_thd: u64,
130    pub update_implicit: u64,
131    pub soft_fork_rule: (u64, u64, u64),
132    pub summand: u64,
133    pub multiplier: u64,
134    pub unlock_stake_epoch: u64,
135}
136
137#[derive(Debug, Clone)]
138pub struct ShelleyProtParams {
139    pub system_start: chrono::DateTime<chrono::FixedOffset>,
140    pub epoch_length: u64,
141    pub slot_length: u64,
142    pub minfee_a: u32,
143    pub minfee_b: u32,
144    pub max_block_body_size: u32,
145    pub max_transaction_size: u32,
146    pub max_block_header_size: u32,
147    pub key_deposit: Coin,
148    pub pool_deposit: Coin,
149    pub desired_number_of_stake_pools: u32,
150    pub protocol_version: ProtocolVersion,
151    pub min_utxo_value: Coin,
152    pub min_pool_cost: Coin,
153    pub expansion_rate: UnitInterval,
154    pub treasury_growth_rate: UnitInterval,
155    pub maximum_epoch: Epoch,
156    pub pool_pledge_influence: RationalNumber,
157    pub decentralization_constant: UnitInterval,
158    pub extra_entropy: Nonce,
159}
160
161#[derive(Debug, Clone)]
162pub struct AlonzoProtParams {
163    pub system_start: chrono::DateTime<chrono::FixedOffset>,
164    pub epoch_length: u64,
165    pub slot_length: u64,
166    pub minfee_a: u32,
167    pub minfee_b: u32,
168    pub max_block_body_size: u32,
169    pub max_transaction_size: u32,
170    pub max_block_header_size: u32,
171    pub key_deposit: Coin,
172    pub pool_deposit: Coin,
173    pub desired_number_of_stake_pools: u32,
174    pub protocol_version: ProtocolVersion,
175    pub min_pool_cost: Coin,
176    pub ada_per_utxo_byte: Coin,
177    pub cost_models_for_script_languages: CostModels,
178    pub execution_costs: ExUnitPrices,
179    pub max_tx_ex_units: ExUnits,
180    pub max_block_ex_units: ExUnits,
181    pub max_value_size: u32,
182    pub collateral_percentage: u32,
183    pub max_collateral_inputs: u32,
184    pub expansion_rate: UnitInterval,
185    pub treasury_growth_rate: UnitInterval,
186    pub maximum_epoch: Epoch,
187    pub pool_pledge_influence: RationalNumber,
188    pub decentralization_constant: UnitInterval,
189    pub extra_entropy: Nonce,
190}
191
192#[derive(Debug, Clone)]
193pub struct BabbageProtParams {
194    pub system_start: chrono::DateTime<chrono::FixedOffset>,
195    pub epoch_length: u64,
196    pub slot_length: u64,
197    pub minfee_a: u32,
198    pub minfee_b: u32,
199    pub max_block_body_size: u32,
200    pub max_transaction_size: u32,
201    pub max_block_header_size: u32,
202    pub key_deposit: Coin,
203    pub pool_deposit: Coin,
204    pub desired_number_of_stake_pools: u32,
205    pub protocol_version: ProtocolVersion,
206    pub min_pool_cost: Coin,
207    pub ada_per_utxo_byte: Coin,
208    pub cost_models_for_script_languages: BabbageCostModels,
209    pub execution_costs: ExUnitPrices,
210    pub max_tx_ex_units: ExUnits,
211    pub max_block_ex_units: ExUnits,
212    pub max_value_size: u32,
213    pub collateral_percentage: u32,
214    pub max_collateral_inputs: u32,
215    pub expansion_rate: UnitInterval,
216    pub treasury_growth_rate: UnitInterval,
217    pub maximum_epoch: Epoch,
218    pub pool_pledge_influence: RationalNumber,
219    pub decentralization_constant: UnitInterval,
220    pub extra_entropy: Nonce,
221}
222
223#[derive(Debug, Clone)]
224pub struct ConwayProtParams {
225    pub system_start: chrono::DateTime<chrono::FixedOffset>,
226    pub epoch_length: u64,
227    pub slot_length: u64,
228    pub minfee_a: u32,
229    pub minfee_b: u32,
230    pub max_block_body_size: u32,
231    pub max_transaction_size: u32,
232    pub max_block_header_size: u32,
233    pub key_deposit: Coin,
234    pub pool_deposit: Coin,
235    pub desired_number_of_stake_pools: u32,
236    pub protocol_version: ProtocolVersion,
237    pub min_pool_cost: Coin,
238    pub ada_per_utxo_byte: Coin,
239    pub cost_models_for_script_languages: ConwayCostModels,
240    pub execution_costs: ExUnitPrices,
241    pub max_tx_ex_units: ExUnits,
242    pub max_block_ex_units: ExUnits,
243    pub max_value_size: u32,
244    pub collateral_percentage: u32,
245    pub max_collateral_inputs: u32,
246    pub expansion_rate: UnitInterval,
247    pub treasury_growth_rate: UnitInterval,
248    pub maximum_epoch: Epoch,
249    pub pool_pledge_influence: RationalNumber,
250    pub pool_voting_thresholds: pallas_primitives::conway::PoolVotingThresholds,
251    pub drep_voting_thresholds: pallas_primitives::conway::DRepVotingThresholds,
252    pub min_committee_size: u64,
253    pub committee_term_limit: Epoch,
254    pub governance_action_validity_period: Epoch,
255    pub governance_action_deposit: Coin,
256    pub drep_deposit: Coin,
257    pub drep_inactivity_period: Epoch,
258    pub minfee_refscript_cost_per_byte: UnitInterval,
259}
260
261#[derive(Default, Debug)]
262pub struct AccountState {
263    pub treasury: Coin,
264    pub reserves: Coin,
265}
266
267#[derive(Debug)]
268pub struct Environment {
269    pub prot_params: MultiEraProtocolParameters,
270    pub prot_magic: u32,
271    pub block_slot: u64,
272    pub network_id: u8,
273    pub acnt: Option<AccountState>,
274}
275
276impl Environment {
277    pub fn prot_params(&self) -> &MultiEraProtocolParameters {
278        &self.prot_params
279    }
280
281    pub fn prot_magic(&self) -> &u32 {
282        &self.prot_magic
283    }
284
285    pub fn block_slot(&self) -> &u64 {
286        &self.block_slot
287    }
288
289    pub fn network_id(&self) -> &u8 {
290        &self.network_id
291    }
292
293    pub fn acnt(&self) -> &Option<AccountState> {
294        &self.acnt
295    }
296}