ibc_core_connection/
delay.rs1use ibc_core_client::context::ClientValidationContext;
2use ibc_core_client::types::Height;
3use ibc_core_connection_types::error::ConnectionError;
4use ibc_core_connection_types::ConnectionEnd;
5use ibc_core_host::ValidationContext;
6
7pub fn verify_conn_delay_passed<Ctx>(
8 ctx: &Ctx,
9 packet_proof_height: Height,
10 connection_end: &ConnectionEnd,
11) -> Result<(), ConnectionError>
12where
13 Ctx: ValidationContext,
14{
15 let current_host_time = ctx.host_timestamp()?;
17 let current_host_height = ctx.host_height()?;
18
19 let client_id = connection_end.client_id();
21 let last_client_update = ctx
22 .get_client_validation_context()
23 .client_update_meta(client_id, &packet_proof_height)?;
24
25 let conn_delay_time_period = connection_end.delay_period();
27 let conn_delay_height_period = ctx.block_delay(&conn_delay_time_period);
28
29 let earliest_valid_time = (last_client_update.0 + conn_delay_time_period)?;
31 if current_host_time < earliest_valid_time {
32 return Err(ConnectionError::InsufficientTimeElapsed {
33 current_host_time,
34 earliest_valid_time,
35 });
36 }
37
38 let earliest_valid_height = last_client_update.1.add(conn_delay_height_period);
40 if current_host_height < earliest_valid_height {
41 return Err(ConnectionError::InsufficientBlocksElapsed {
42 current_host_height,
43 earliest_valid_height,
44 });
45 };
46
47 Ok(())
48}