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 osaka: BlobParams,
27 pub scheduled: Vec<(u64, BlobParams)>,
31}
32
33impl BlobScheduleBlobParams {
34 pub fn mainnet() -> Self {
36 Self {
37 cancun: BlobParams::cancun(),
38 prague: BlobParams::prague(),
39 osaka: BlobParams::osaka(),
40 scheduled: Default::default(),
41 }
42 }
43
44 pub fn active_scheduled_params_at_timestamp(&self, timestamp: u64) -> Option<&BlobParams> {
48 self.scheduled.iter().rev().find(|(ts, _)| timestamp >= *ts).map(|(_, params)| params)
49 }
50
51 pub const fn cancun(&self) -> &BlobParams {
53 &self.cancun
54 }
55
56 pub const fn prague(&self) -> &BlobParams {
58 &self.prague
59 }
60
61 pub const fn osaka(&self) -> &BlobParams {
63 &self.osaka
64 }
65
66 pub fn from_schedule(schedule: &BTreeMap<String, BlobParams>) -> Self {
68 let mut cancun = None;
69 let mut prague = None;
70 let mut osaka = None;
71 let mut scheduled = Vec::new();
72
73 for (key, params) in schedule {
74 match key.as_str() {
75 "cancun" => cancun = Some(*params),
76 "prague" => prague = Some(*params),
77 "osaka" => osaka = Some(*params),
78 _ => {
79 if let Ok(timestamp) = key.parse::<u64>() {
80 scheduled.push((timestamp, *params));
81 }
82 }
83 }
84 }
85
86 scheduled.sort_by_key(|(timestamp, _)| *timestamp);
87
88 Self {
89 cancun: cancun.unwrap_or_else(BlobParams::cancun),
90 prague: prague.unwrap_or_else(BlobParams::prague),
91 osaka: osaka.unwrap_or_else(BlobParams::osaka),
92 scheduled,
93 }
94 }
95}
96
97impl Default for BlobScheduleBlobParams {
98 fn default() -> Self {
99 Self::mainnet()
100 }
101}