1use 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 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}