@@ -40,8 +40,8 @@ use parachains_relay::parachains_loop::{
4040 AvailableHeader , ParachainSyncParams , SourceClient , TargetClient ,
4141} ;
4242use relay_substrate_client:: {
43- AccountIdOf , AccountKeyPairOf , BlockNumberOf , CallOf , Chain , Client , Error as SubstrateError ,
44- HashOf , HeaderIdOf , ParachainBase , ANCIENT_BLOCK_THRESHOLD ,
43+ is_ancient_block , AccountIdOf , AccountKeyPairOf , BlockNumberOf , CallOf , Chain , Client ,
44+ Error as SubstrateError , HashOf , HeaderIdOf , ParachainBase ,
4545} ;
4646use relay_utils:: {
4747 metrics:: MetricsParams , relay_loop:: Client as RelayClient , BlockNumberBase , FailedClient ,
@@ -501,10 +501,18 @@ where
501501 . await
502502 . map_err ( map_target_err) ?;
503503
504- let para_header_at_relay_header_at_target = source
505- . on_chain_para_head_id ( relay_header_at_target, P :: SourceParachain :: PARACHAIN_ID . into ( ) )
506- . await
507- . map_err ( map_source_err) ?;
504+ // if relay header at target is too old, then its state may already be discarded at the source
505+ // => just use `None` in this case
506+ let is_relay_header_at_target_ancient =
507+ is_ancient_block ( relay_header_at_target. number ( ) , relay_header_at_source) ;
508+ let para_header_at_relay_header_at_target = if is_relay_header_at_target_ancient {
509+ None
510+ } else {
511+ source
512+ . on_chain_para_head_id ( relay_header_at_target, P :: SourceParachain :: PARACHAIN_ID . into ( ) )
513+ . await
514+ . map_err ( map_source_err) ?
515+ } ;
508516
509517 Ok ( RelayData {
510518 required_para_header : required_header_number,
@@ -677,11 +685,10 @@ where
677685 // we don't require source node to be archive, so we can't craft storage proofs using
678686 // ancient headers. So if the `best_finalized_relay_block_at_target` is too ancient, we
679687 // can't craft storage proofs using it
680- let may_use_state_at_best_finalized_relay_block_at_target =
681- best_finalized_relay_block_at_source
682- . number ( )
683- . saturating_sub ( best_finalized_relay_block_at_target. number ( ) ) <=
684- RBN :: from ( ANCIENT_BLOCK_THRESHOLD ) ;
688+ let may_use_state_at_best_finalized_relay_block_at_target = !is_ancient_block (
689+ best_finalized_relay_block_at_target. number ( ) ,
690+ best_finalized_relay_block_at_source. number ( ) ,
691+ ) ;
685692
686693 // now let's check if `required_header` may be proved using
687694 // `best_finalized_relay_block_at_target`
0 commit comments