use ibc_core_client::context::ClientValidationContext;
use ibc_core_client::types::Height;
use ibc_core_connection_types::error::ConnectionError;
use ibc_core_connection_types::ConnectionEnd;
use ibc_core_host::ValidationContext;
pub fn verify_conn_delay_passed<Ctx>(
ctx: &Ctx,
packet_proof_height: Height,
connection_end: &ConnectionEnd,
) -> Result<(), ConnectionError>
where
Ctx: ValidationContext,
{
let current_host_time = ctx.host_timestamp()?;
let current_host_height = ctx.host_height()?;
let client_id = connection_end.client_id();
let last_client_update = ctx
.get_client_validation_context()
.client_update_meta(client_id, &packet_proof_height)?;
let conn_delay_time_period = connection_end.delay_period();
let conn_delay_height_period = ctx.block_delay(&conn_delay_time_period);
let earliest_valid_time = (last_client_update.0 + conn_delay_time_period)?;
if current_host_time < earliest_valid_time {
return Err(ConnectionError::InsufficientTimeElapsed {
current_host_time,
earliest_valid_time,
});
}
let earliest_valid_height = last_client_update.1.add(conn_delay_height_period);
if current_host_height < earliest_valid_height {
return Err(ConnectionError::InsufficientBlocksElapsed {
current_host_height,
earliest_valid_height,
});
};
Ok(())
}