@@ -361,6 +361,27 @@ impl ETHHeader {
361361 }
362362 }
363363
364+ pub fn verify_epoch_info ( & self ) -> Result < ( ) , Error > {
365+ let be = self
366+ . boundary_epochs
367+ . as_ref ( )
368+ . ok_or ( Error :: MissingBoundaryEpochs ( self . number ) ) ?;
369+ if self . number == be. current_epoch_block_number ( self . number ) {
370+ if !self . is_epoch ( ) {
371+ return Err ( Error :: MustBeEpoch (
372+ self . number ,
373+ be. current_fork_spec ( ) . clone ( ) ,
374+ ) ) ;
375+ }
376+ } else if self . is_epoch ( ) {
377+ return Err ( Error :: MustNotBeEpoch (
378+ self . number ,
379+ be. current_fork_spec ( ) . clone ( ) ,
380+ ) ) ;
381+ }
382+ Ok ( ( ) )
383+ }
384+
364385 // https://github.com/bnb-chain/BEPs/blob/master/BEPs/BEP-520.md#411-millisecond-representation-in-block-header
365386 pub fn milli_timestamp ( & self ) -> u64 {
366387 let mut milliseconds: u64 = 0 ;
@@ -999,4 +1020,29 @@ pub(crate) mod test {
9991020 _ => unreachable ! ( "invalid error {:?}" , err) ,
10001021 }
10011022 }
1023+
1024+ #[ rstest]
1025+ #[ case:: localnet( localnet( ) ) ]
1026+ fn test_error_verify_epoch_info ( #[ case] hp : Box < dyn Network > ) {
1027+ let mut header = hp. epoch_header ( ) ;
1028+ header. epoch = None ;
1029+ let err = header. verify_epoch_info ( ) . unwrap_err ( ) ;
1030+ match err {
1031+ Error :: MustBeEpoch ( number, _fs) => {
1032+ assert_eq ! ( number, header. number) ;
1033+ }
1034+ _ => unreachable ! ( "invalid error {:?}" , err) ,
1035+ }
1036+
1037+ let mut header = hp. epoch_header ( ) ;
1038+ header. epoch = Some ( Epoch :: new ( vec ! [ ] . into ( ) , 1 ) ) ;
1039+ header. number += 1 ;
1040+ let err = header. verify_epoch_info ( ) . unwrap_err ( ) ;
1041+ match err {
1042+ Error :: MustNotBeEpoch ( number, _fs) => {
1043+ assert_eq ! ( number, header. number) ;
1044+ }
1045+ _ => unreachable ! ( "invalid error {:?}" , err) ,
1046+ }
1047+ }
10021048}
0 commit comments