@@ -54,6 +54,13 @@ impl<const L1_SYNC_COMMITTEE_SIZE: usize> LightClient
5454 let height = client_state. latest_height ;
5555 let timestamp = consensus_state. timestamp ;
5656
57+ if client_state. frozen {
58+ return Err ( Error :: CannotInitializeFrozenClient . into ( ) ) ;
59+ }
60+ if client_state. latest_height . revision_height ( ) == 0 {
61+ return Err ( Error :: UnexpectedLatestHeight ( client_state. latest_height ) . into ( ) ) ;
62+ }
63+
5764 Ok ( CreateClientResult {
5865 height,
5966 message : UpdateStateProxyMessage {
@@ -289,6 +296,7 @@ mod test {
289296 use prost:: Message ;
290297 extern crate std;
291298
299+ #[ derive( Default ) ]
292300 struct MockClientReader {
293301 client_state : Option < ClientState > ,
294302 consensus_state : BTreeMap < Height , ConsensusState > ,
@@ -406,11 +414,7 @@ mod test {
406414 let any_cs = Any :: try_from ( cs. clone ( ) ) . unwrap ( ) ;
407415 let result = client
408416 . create_client (
409- & MockClientReader {
410- client_state : None ,
411- consensus_state : BTreeMap :: new ( ) ,
412- time : None ,
413- } ,
417+ & MockClientReader :: default ( ) ,
414418 any_cs. clone ( ) ,
415419 Any :: try_from ( cons_state. clone ( ) ) . unwrap ( ) ,
416420 )
@@ -438,6 +442,51 @@ mod test {
438442 }
439443 }
440444
445+ #[ test]
446+ fn test_create_client_error_frozen ( ) {
447+ let client = OptimismLightClient :: <
448+ { ethereum_consensus:: preset:: minimal:: PRESET . SYNC_COMMITTEE_SIZE } ,
449+ > ;
450+ let ( mut cs, cons_state) = get_initial_state ( ) ;
451+ cs. frozen = true ;
452+ let any_cs = Any :: try_from ( cs. clone ( ) ) . unwrap ( ) ;
453+ let err = client
454+ . create_client (
455+ & MockClientReader :: default ( ) ,
456+ any_cs. clone ( ) ,
457+ Any :: try_from ( cons_state. clone ( ) ) . unwrap ( ) ,
458+ )
459+ . unwrap_err ( ) ;
460+ assert ! (
461+ err. to_string( ) . contains( "CannotInitializeFrozenClient" ) ,
462+ "{:?}" ,
463+ err
464+ ) ;
465+ }
466+
467+ #[ test]
468+ fn test_create_client_error_invalid_height ( ) {
469+ let client = OptimismLightClient :: <
470+ { ethereum_consensus:: preset:: minimal:: PRESET . SYNC_COMMITTEE_SIZE } ,
471+ > ;
472+ let ( mut cs, cons_state) = get_initial_state ( ) ;
473+ cs. latest_height = Height :: new ( 0 , 0 ) ;
474+
475+ let any_cs = Any :: try_from ( cs. clone ( ) ) . unwrap ( ) ;
476+ let err = client
477+ . create_client (
478+ & MockClientReader :: default ( ) ,
479+ any_cs. clone ( ) ,
480+ Any :: try_from ( cons_state. clone ( ) ) . unwrap ( ) ,
481+ )
482+ . unwrap_err ( ) ;
483+ assert ! (
484+ err. to_string( ) . contains( "UnexpectedLatestHeight" ) ,
485+ "{:?}" ,
486+ err
487+ ) ;
488+ }
489+
441490 #[ test]
442491 fn test_update_client ( ) {
443492 let client = OptimismLightClient :: <
0 commit comments