: FinalitySourceClient,
P: FinalitySyncPipeline,
{
finality_source
.on_chain_best_finalized_block_number()
.await
.map_err(|error| {
log::error!(
target: "bridge",
"Failed to read best finalized source header from source in {} relay: {:?}",
relay_task_name,
error,
);
error
})
}
/// Read best finalized source block number from target client.
///
/// Returns `None` if we have failed to read the number.
async fn best_finalized_source_header_at_target(
finality_target: &SubstrateFinalityTarget,
relay_task_name: &str,
) -> Result as RelayClient>::Error>
where
SubstrateFinalityTarget: FinalityTargetClient,
P: FinalitySyncPipeline,
{
finality_target
.best_finalized_source_block_number()
.await
.map_err(|error| {
log::error!(
target: "bridge",
"Failed to read best finalized source header from target in {} relay: {:?}",
relay_task_name,
error,
);
error
})
}
/// On-demand headers relay task name.
fn on_demand_headers_relay_name() -> String {
format!("on-demand-{}-to-{}", SourceChain::NAME, TargetChain::NAME)
}
#[cfg(test)]
mod tests {
use super::*;
type TestChain = relay_millau_client::Millau;
const AT_SOURCE: Option = Some(10);
const AT_TARGET: Option = Some(1);
#[async_std::test]
async fn updates_required_header_when_too_many_headers_missing() {
let required_header_number = Arc::new(Mutex::new(0));
update_required_header_number_if_too_many_are_missing::(
AT_SOURCE,
AT_TARGET,
5,
&required_header_number,
"test",
)
.await;
assert_eq!(*required_header_number.lock().await, AT_SOURCE.unwrap());
}
}