Skip to content

Commit c6d916b

Browse files
committed
provide counterparty msg
1 parent b9bfec1 commit c6d916b

File tree

10 files changed

+117
-10
lines changed

10 files changed

+117
-10
lines changed

ibc-eureka-core/ics02-client/context/src/context.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub trait ClientValidationContext: Sized {
4545
fn counterparty_meta(
4646
&self,
4747
client_id: &ClientId,
48-
) -> Result<(ClientId, CommitmentPrefix), HostError>;
48+
) -> Result<Option<(ClientId, CommitmentPrefix)>, HostError>;
4949
}
5050

5151
/// Defines the methods that all client `ExecutionContext`s (precisely the
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! This module implements the processing logic for ICS2 (client abstractions and functions) msgs.
22
33
pub mod create_client;
4+
pub mod provide_counterparty;
45
pub mod recover_client;
56
pub mod update_client;
67
pub mod upgrade_client;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//! Protocol logic specific to processing ICS2 messages of type `MsgProvideCouterparty`.
2+
3+
use ibc_eureka_core_client_context::prelude::*;
4+
use ibc_eureka_core_client_types::error::ClientError;
5+
use ibc_eureka_core_client_types::msgs::MsgProvideCouterparty;
6+
use ibc_eureka_core_host::{ExecutionContext, ValidationContext};
7+
use ibc_primitives::prelude::*;
8+
9+
pub fn validate<Ctx>(ctx: &Ctx, msg: MsgProvideCouterparty) -> Result<(), ClientError>
10+
where
11+
Ctx: ValidationContext,
12+
{
13+
let MsgProvideCouterparty {
14+
client_id, signer, ..
15+
} = &msg;
16+
17+
ctx.validate_message_signer(signer)?;
18+
19+
let client_val_ctx = ctx.get_client_validation_context();
20+
21+
// Read client state from the host chain store. The client should already exist.
22+
let client_state = client_val_ctx.client_state(client_id)?;
23+
24+
client_state
25+
.status(client_val_ctx, client_id)?
26+
.verify_is_active()?;
27+
28+
if client_val_ctx.counterparty_meta(client_id)?.is_some() {
29+
return Err(ClientError::ClientSpecific {
30+
description: "counterparty is already provided".into(),
31+
});
32+
}
33+
34+
Ok(())
35+
}
36+
37+
pub fn execute<Ctx>(ctx: &mut Ctx, msg: MsgProvideCouterparty) -> Result<(), ClientError>
38+
where
39+
Ctx: ExecutionContext,
40+
{
41+
let MsgProvideCouterparty {
42+
client_id,
43+
counterparty_client_id,
44+
counterparty_commitment_prefix,
45+
..
46+
} = &msg;
47+
48+
let client_exec_ctx = ctx.get_client_execution_context();
49+
50+
client_exec_ctx.store_counterparty_meta(
51+
client_id,
52+
counterparty_client_id,
53+
counterparty_commitment_prefix,
54+
)?;
55+
56+
Ok(())
57+
}

ibc-eureka-core/ics02-client/types/src/msgs/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ use ibc_proto::google::protobuf::Any;
99

1010
mod create_client;
1111
mod misbehaviour;
12+
mod provide_counterparty;
1213
mod recover_client;
1314
mod update_client;
1415
mod upgrade_client;
1516

1617
pub use create_client::*;
1718
pub use misbehaviour::*;
19+
pub use provide_counterparty::*;
1820
pub use recover_client::*;
1921
pub use update_client::*;
2022
pub use upgrade_client::*;
@@ -33,6 +35,7 @@ pub enum ClientMsg {
3335
Misbehaviour(MsgSubmitMisbehaviour),
3436
UpgradeClient(MsgUpgradeClient),
3537
RecoverClient(MsgRecoverClient),
38+
ProvideCounterparty(MsgProvideCouterparty),
3639
}
3740

3841
pub enum MsgUpdateOrMisbehaviour {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//! Definition of domain type message `MsgProvideCouterparty`.
2+
3+
use ibc_eureka_core_commitment_types::commitment::CommitmentPrefix;
4+
use ibc_eureka_core_host_types::identifiers::ClientId;
5+
use ibc_primitives::prelude::*;
6+
use ibc_primitives::Signer;
7+
8+
pub const _PROVIDE_COUNTERPARTY_TYPE_URL: &str = "/ibc.core.client.v1.MsgProvideCouterparty";
9+
10+
/// A type of message that links an on-chain (IBC) client to its counterparty.
11+
#[cfg_attr(
12+
feature = "borsh",
13+
derive(borsh::BorshSerialize, borsh::BorshDeserialize)
14+
)]
15+
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
16+
#[derive(Clone, Debug, PartialEq, Eq)]
17+
pub struct MsgProvideCouterparty {
18+
pub client_id: ClientId,
19+
pub counterparty_client_id: ClientId,
20+
pub counterparty_commitment_prefix: CommitmentPrefix,
21+
pub signer: Signer,
22+
}
23+
24+
impl MsgProvideCouterparty {
25+
pub fn new(
26+
client_id: ClientId,
27+
counterparty_client_id: ClientId,
28+
counterparty_commitment_prefix: CommitmentPrefix,
29+
signer: Signer,
30+
) -> Self {
31+
MsgProvideCouterparty {
32+
client_id,
33+
counterparty_client_id,
34+
counterparty_commitment_prefix,
35+
signer,
36+
}
37+
}
38+
}

ibc-eureka-core/ics04-channel/src/handler/acknowledgement.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,9 @@ where
139139

140140
let client_val_ctx_a = ctx_a.get_client_validation_context();
141141

142-
let (stored_id_source_client_on_target, target_prefix) =
143-
client_val_ctx_a.counterparty_meta(id_target_client_on_source)?;
142+
let (stored_id_source_client_on_target, target_prefix) = client_val_ctx_a
143+
.counterparty_meta(id_target_client_on_source)?
144+
.ok_or(ChannelError::MissingCounterparty)?;
144145

145146
if &stored_id_source_client_on_target != id_source_client_on_target {
146147
return Err(ChannelError::MismatchCounterparty {

ibc-eureka-core/ics04-channel/src/handler/recv_packet.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,9 @@ where
145145

146146
let client_val_ctx_b = ctx_b.get_client_validation_context();
147147

148-
let (stored_id_target_client_on_source, source_prefix) =
149-
client_val_ctx_b.counterparty_meta(id_source_client_on_target)?;
148+
let (stored_id_target_client_on_source, source_prefix) = client_val_ctx_b
149+
.counterparty_meta(id_source_client_on_target)?
150+
.ok_or(ChannelError::MissingCounterparty)?;
150151

151152
if &stored_id_target_client_on_source != id_target_client_on_source {
152153
return Err(ChannelError::MismatchCounterparty {

ibc-eureka-core/ics04-channel/src/handler/send_packet.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ pub fn send_packet_validate(
4242
let id_target_client_on_source = channel_target_client_on_source.as_ref();
4343
let id_source_client_on_target: &ClientId = channel_source_client_on_target.as_ref();
4444

45-
let (stored_id_source_client_on_target, _) =
46-
client_val_ctx_a.counterparty_meta(id_target_client_on_source)?;
45+
let (stored_id_source_client_on_target, _) = client_val_ctx_a
46+
.counterparty_meta(id_target_client_on_source)?
47+
.ok_or(ChannelError::MissingCounterparty)?;
4748

4849
if &stored_id_source_client_on_target != id_source_client_on_target {
4950
return Err(ChannelError::MismatchCounterparty {

ibc-eureka-core/ics04-channel/src/handler/timeout.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,9 @@ where
130130

131131
let client_val_ctx_a = ctx_a.get_client_validation_context();
132132

133-
let (stored_id_source_client_on_target, target_prefix) =
134-
client_val_ctx_a.counterparty_meta(id_target_client_on_source)?;
133+
let (stored_id_source_client_on_target, target_prefix) = client_val_ctx_a
134+
.counterparty_meta(id_target_client_on_source)?
135+
.ok_or(ChannelError::MissingCounterparty)?;
135136

136137
if &stored_id_source_client_on_target != id_source_client_on_target {
137138
return Err(ChannelError::MismatchCounterparty {

ibc-eureka-core/ics25-handler/src/entrypoint.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use ibc_eureka_core_channel::handler::{
44
};
55
use ibc_eureka_core_channel::types::msgs::{packet_msg_to_port_id, PacketMsg};
66
use ibc_eureka_core_client::context::{ClientExecutionContext, ClientValidationContext};
7-
use ibc_eureka_core_client::handler::{create_client, update_client, upgrade_client};
7+
use ibc_eureka_core_client::handler::{
8+
create_client, provide_counterparty, update_client, upgrade_client,
9+
};
810
use ibc_eureka_core_client::types::error::ClientError;
911
use ibc_eureka_core_client::types::msgs::{ClientMsg, MsgUpdateOrMisbehaviour};
1012
use ibc_eureka_core_handler_types::error::HandlerError;
@@ -60,6 +62,7 @@ where
6062
// Recover client messages are not dispatched by ibc-rs as they can only be
6163
// authorized via a passing governance proposal
6264
}
65+
ClientMsg::ProvideCounterparty(msg) => provide_counterparty::validate(ctx, msg)?,
6366
},
6467
MsgEnvelope::Packet(msg) => {
6568
let port_id = packet_msg_to_port_id(&msg);
@@ -105,6 +108,7 @@ where
105108
// Recover client messages are not dispatched by ibc-rs as they can only be
106109
// authorized via a passing governance proposal
107110
}
111+
ClientMsg::ProvideCounterparty(msg) => provide_counterparty::execute(ctx, msg)?,
108112
},
109113
MsgEnvelope::Packet(msg) => {
110114
let port_id = packet_msg_to_port_id(&msg);

0 commit comments

Comments
 (0)