1use crate::eip7840::BlobParams;
4use alloc::{collections::BTreeMap, string::String, vec::Vec};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub enum BlobScheduleEntry {
10 Cancun(BlobParams),
12 Prague(BlobParams),
14 TimestampUpdate(u64, BlobParams),
16}
17
18#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct BlobScheduleBlobParams {
21 pub cancun: BlobParams,
23 pub prague: BlobParams,
25 pub scheduled: Vec<(u64, BlobParams)>,
29}
30
31impl BlobScheduleBlobParams {
32 pub fn mainnet() -> Self {
34 Self {
35 cancun: BlobParams::cancun(),
36 prague: BlobParams::prague(),
37 scheduled: Default::default(),
38 }
39 }
40
41 pub fn active_scheduled_params_at_timestamp(&self, timestamp: u64) -> Option<&BlobParams> {
45 self.scheduled.iter().rev().find(|(ts, _)| timestamp >= *ts).map(|(_, params)| params)
46 }
47
48 pub const fn cancun(&self) -> &BlobParams {
50 &self.cancun
51 }
52
53 pub const fn prague(&self) -> &BlobParams {
55 &self.prague
56 }
57
58 pub fn from_schedule(schedule: &BTreeMap<String, BlobParams>) -> Self {
60 let mut cancun = None;
61 let mut prague = None;
62 let mut scheduled = Vec::new();
63
64 for (key, params) in schedule {
65 match key.as_str() {
66 "cancun" => cancun = Some(*params),
67 "prague" => prague = Some(*params),
68 _ => {
69 if let Ok(timestamp) = key.parse::<u64>() {
70 scheduled.push((timestamp, *params));
71 }
72 }
73 }
74 }
75
76 scheduled.sort_by_key(|(timestamp, _)| *timestamp);
77
78 Self {
79 cancun: cancun.unwrap_or_else(BlobParams::cancun),
80 prague: prague.unwrap_or_else(BlobParams::prague),
81 scheduled,
82 }
83 }
84}
85
86impl Default for BlobScheduleBlobParams {
87 fn default() -> Self {
88 Self::mainnet()
89 }
90}