@@ -85,13 +85,31 @@ impl TryFrom<&Path> for Genesis {
8585            warn ! ( "Invalid fork, only post-merge networks are supported." ) ; 
8686        } 
8787
88+         if  genesis. config . bpo1_time . is_some ( )  && genesis. config . blob_schedule . bpo1 . is_none ( ) 
89+             || genesis. config . bpo2_time . is_some ( )  && genesis. config . blob_schedule . bpo2 . is_none ( ) 
90+             || genesis. config . bpo3_time . is_some ( )  && genesis. config . blob_schedule . bpo3 . is_none ( ) 
91+             || genesis. config . bpo4_time . is_some ( )  && genesis. config . blob_schedule . bpo4 . is_none ( ) 
92+             || genesis. config . bpo5_time . is_some ( )  && genesis. config . blob_schedule . bpo5 . is_none ( ) 
93+         { 
94+             warn ! ( "BPO time set but no BPO BlobSchedule found in ChainConfig" ) 
95+         } 
96+ 
8897        Ok ( genesis) 
8998    } 
9099} 
91100
92101#[ allow( unused) ]  
93102#[ derive(  
94-     Clone ,  Copy ,  Debug ,  Serialize ,  Deserialize ,  PartialEq ,  RSerialize ,  RDeserialize ,  Archive ,  
103+     Clone ,  
104+     Copy ,  
105+     Debug ,  
106+     Serialize ,  
107+     Deserialize ,  
108+     PartialEq ,  
109+     RSerialize ,  
110+     RDeserialize ,  
111+     Archive ,  
112+     Default ,  
95113) ] 
96114#[ serde( rename_all = "camelCase" ) ]  
97115pub  struct  ForkBlobSchedule  { 
@@ -110,13 +128,31 @@ pub struct BlobSchedule {
110128    pub  cancun :  ForkBlobSchedule , 
111129    #[ serde( default  = "default_prague_schedule" ) ]  
112130    pub  prague :  ForkBlobSchedule , 
131+     #[ serde( default  = "default_osaka_schedule" ) ]  
132+     pub  osaka :  ForkBlobSchedule , 
133+     #[ serde( default ,  skip_serializing_if = "Option::is_none" ) ]  
134+     pub  bpo1 :  Option < ForkBlobSchedule > , 
135+     #[ serde( default ,  skip_serializing_if = "Option::is_none" ) ]  
136+     pub  bpo2 :  Option < ForkBlobSchedule > , 
137+     #[ serde( default ,  skip_serializing_if = "Option::is_none" ) ]  
138+     pub  bpo3 :  Option < ForkBlobSchedule > , 
139+     #[ serde( default ,  skip_serializing_if = "Option::is_none" ) ]  
140+     pub  bpo4 :  Option < ForkBlobSchedule > , 
141+     #[ serde( default ,  skip_serializing_if = "Option::is_none" ) ]  
142+     pub  bpo5 :  Option < ForkBlobSchedule > , 
113143} 
114144
115145impl  Default  for  BlobSchedule  { 
116146    fn  default ( )  -> Self  { 
117147        BlobSchedule  { 
118148            cancun :  default_cancun_schedule ( ) , 
119149            prague :  default_prague_schedule ( ) , 
150+             osaka :  default_osaka_schedule ( ) , 
151+             bpo1 :  None , 
152+             bpo2 :  None , 
153+             bpo3 :  None , 
154+             bpo4 :  None , 
155+             bpo5 :  None , 
120156        } 
121157    } 
122158} 
@@ -137,6 +173,14 @@ fn default_prague_schedule() -> ForkBlobSchedule {
137173    } 
138174} 
139175
176+ fn  default_osaka_schedule ( )  -> ForkBlobSchedule  { 
177+     ForkBlobSchedule  { 
178+         target :  6 , 
179+         max :  9 , 
180+         base_fee_update_fraction :  5007716 , 
181+     } 
182+ } 
183+ 
140184/// Blockchain settings defined per block 
141185#[ allow( unused) ]  
142186#[ derive(  
@@ -276,6 +320,26 @@ impl From<Fork> for &str {
276320} 
277321
278322impl  ChainConfig  { 
323+     pub  fn  is_bpo1_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
324+         self . bpo1_time . is_some_and ( |time| time <= block_timestamp) 
325+     } 
326+ 
327+     pub  fn  is_bpo2_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
328+         self . bpo2_time . is_some_and ( |time| time <= block_timestamp) 
329+     } 
330+ 
331+     pub  fn  is_bpo3_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
332+         self . bpo3_time . is_some_and ( |time| time <= block_timestamp) 
333+     } 
334+ 
335+     pub  fn  is_bpo4_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
336+         self . bpo4_time . is_some_and ( |time| time <= block_timestamp) 
337+     } 
338+ 
339+     pub  fn  is_bpo5_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
340+         self . bpo5_time . is_some_and ( |time| time <= block_timestamp) 
341+     } 
342+ 
279343    pub  fn  is_osaka_activated ( & self ,  block_timestamp :  u64 )  -> bool  { 
280344        self . osaka_time . is_some_and ( |time| time <= block_timestamp) 
281345    } 
@@ -348,7 +412,19 @@ impl ChainConfig {
348412    } 
349413
350414    pub  fn  get_fork_blob_schedule ( & self ,  block_timestamp :  u64 )  -> Option < ForkBlobSchedule >  { 
351-         if  self . is_prague_activated ( block_timestamp)  { 
415+         if  self . is_bpo5_activated ( block_timestamp)  { 
416+             Some ( self . blob_schedule . bpo5 . unwrap_or_default ( ) ) 
417+         }  else  if  self . is_bpo4_activated ( block_timestamp)  { 
418+             Some ( self . blob_schedule . bpo4 . unwrap_or_default ( ) ) 
419+         }  else  if  self . is_bpo3_activated ( block_timestamp)  { 
420+             Some ( self . blob_schedule . bpo3 . unwrap_or_default ( ) ) 
421+         }  else  if  self . is_bpo2_activated ( block_timestamp)  { 
422+             Some ( self . blob_schedule . bpo2 . unwrap_or_default ( ) ) 
423+         }  else  if  self . is_bpo1_activated ( block_timestamp)  { 
424+             Some ( self . blob_schedule . bpo1 . unwrap_or_default ( ) ) 
425+         }  else  if  self . is_osaka_activated ( block_timestamp)  { 
426+             Some ( self . blob_schedule . osaka ) 
427+         }  else  if  self . is_prague_activated ( block_timestamp)  { 
352428            Some ( self . blob_schedule . prague ) 
353429        }  else  if  self . is_cancun_activated ( block_timestamp)  { 
354430            Some ( self . blob_schedule . cancun ) 
@@ -559,6 +635,7 @@ mod tests {
559635                    max :  4 , 
560636                    base_fee_update_fraction :  13353908 , 
561637                } , 
638+                 ..Default :: default ( ) 
562639            } , 
563640            ..Default :: default ( ) 
564641        } ; 
@@ -734,6 +811,7 @@ mod tests {
734811                    max :  4 , 
735812                    base_fee_update_fraction :  20000 , 
736813                } , 
814+                 ..Default :: default ( ) 
737815            } , 
738816            deposit_contract_address :  H160 :: from_str ( "0x4242424242424242424242424242424242424242" ) 
739817                . unwrap ( ) , 
@@ -766,6 +844,7 @@ mod tests {
766844                    max :  9 , 
767845                    base_fee_update_fraction :  5007716 , 
768846                } , 
847+                 ..Default :: default ( ) 
769848            } , 
770849            deposit_contract_address :  H160 :: from_str ( "0x4242424242424242424242424242424242424242" ) 
771850                . unwrap ( ) , 
@@ -805,6 +884,7 @@ mod tests {
805884                    max :  4 , 
806885                    base_fee_update_fraction :  20000 , 
807886                } , 
887+                 ..Default :: default ( ) 
808888            } , 
809889            deposit_contract_address :  H160 :: from_str ( "0x4242424242424242424242424242424242424242" ) 
810890                . unwrap ( ) , 
@@ -844,6 +924,7 @@ mod tests {
844924                    max :  9 , 
845925                    base_fee_update_fraction :  5007716 , 
846926                } , 
927+                 ..Default :: default ( ) 
847928            } , 
848929            deposit_contract_address :  H160 :: from_str ( "0x4242424242424242424242424242424242424242" ) 
849930                . unwrap ( ) , 
0 commit comments