Skip to content

Commit

Permalink
fix(test/relayer): missing consensus state in light_client (#256)
Browse files Browse the repository at this point in the history
* add sleeps to progress chains

* debug full heights

* wait in a loop to progress block

* dbgs

* ci debug with tmate

* wait for 5 starknet height

* more dbg

* revert dbgs

* debug starknet client on cosmos

* impl convert from CometClientState to IbcCometClientState

* rm update_client_payload from cosmos

* update CanUse chain trait check

* impl convert IbcTmHeader to CometUpdateHeader

* impl build_update_client_message for starknet

* rm waiting to progress block

* updated info logs

* optimize impl
  • Loading branch information
rnbguy authored Feb 6, 2025
1 parent bb16917 commit bfe0184
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,8 @@ use crate::impls::starknet_to_cosmos::create_client_message::BuildStarknetCreate
use crate::impls::starknet_to_cosmos::packet_fields::ReadPacketDstStarknetFields;
use crate::impls::starknet_to_cosmos::query_consensus_state_height::QueryStarknetConsensusStateHeightsFromGrpc;
use crate::impls::starknet_to_cosmos::update_client_message::BuildStarknetUpdateClientMessage;
use crate::impls::starknet_to_cosmos::update_client_payload::BuildUpdateCometClientPayload;
use crate::types::cosmos::client_state::UseCometClientState;
use crate::types::cosmos::consensus_state::CometConsensusState;
use crate::types::cosmos::update::CometUpdateHeader;

cgp_preset! {
StarknetToCosmosComponents {
Expand All @@ -45,9 +43,11 @@ cgp_preset! {
ConsensusStateQuerierComponent,
ConsensusStateWithProofsQuerierComponent,
CreateClientPayloadTypeComponent,
UpdateClientPayloadTypeComponent,
CreateClientMessageOptionsTypeComponent,
CreateClientPayloadOptionsTypeComponent,
CreateClientPayloadBuilderComponent,
UpdateClientPayloadBuilderComponent,
ChannelOpenInitMessageBuilderComponent,
]:
CosmosToCosmosComponents,
Expand All @@ -60,10 +60,6 @@ cgp_preset! {
UseCometClientState,
ConsensusStateTypeComponent:
WithType<CometConsensusState>,
UpdateClientPayloadTypeComponent:
WithType<CometUpdateHeader>,
UpdateClientPayloadBuilderComponent:
BuildUpdateCometClientPayload,
UpdateClientMessageBuilderComponent:
BuildStarknetUpdateClientMessage,
ConsensusStateHeightsQuerierComponent:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use hermes_chain_components::traits::types::ibc::HasClientIdType;
use hermes_chain_components::traits::types::message::HasMessageType;
use hermes_chain_components::traits::types::update_client::HasUpdateClientPayloadType;
use hermes_chain_type_components::traits::types::address::HasAddressType;
use hermes_cosmos_chain_components::types::payloads::client::CosmosUpdateClientPayload;
use hermes_encoding_components::traits::encode::CanEncode;
use hermes_encoding_components::traits::has_encoding::HasEncoding;
use hermes_encoding_components::traits::types::encoded::HasEncodedType;
Expand All @@ -33,36 +34,45 @@ where
+ HasEncoding<AsFelt, Encoding = Encoding>
+ CanQueryContractAddress<symbol!("ibc_core_contract_address")>
+ CanRaiseAsyncError<Encoding::Error>,
Counterparty: HasUpdateClientPayloadType<Chain, UpdateClientPayload = CometUpdateHeader>,
Counterparty:
HasUpdateClientPayloadType<Chain, UpdateClientPayload = CosmosUpdateClientPayload>,
Encoding: HasEncodedType<Encoded = Vec<Felt>>
+ CanEncode<ViaCairo, CometUpdateHeader>
+ CanEncode<ViaCairo, (ClientId, Vec<Felt>)>,
{
async fn build_update_client_message(
chain: &Chain,
client_id: &ClientId,
update_header: CometUpdateHeader,
counterparty_payload: CosmosUpdateClientPayload,
) -> Result<Vec<Chain::Message>, Chain::Error> {
let encoding = chain.encoding();
let mut messages = Vec::with_capacity(counterparty_payload.headers.len());

let contract_address = chain.query_contract_address(PhantomData).await?;
for header in counterparty_payload.headers {
let update_header = CometUpdateHeader::from(header);

let raw_header = encoding
.encode(&update_header)
.map_err(Chain::raise_error)?;
let encoding = chain.encoding();

let calldata = encoding
.encode(&(client_id.clone(), raw_header))
.map_err(Chain::raise_error)?;
let contract_address = chain.query_contract_address(PhantomData).await?;

let call = Call {
to: contract_address,
selector: selector!("update_client"),
calldata,
};
let raw_header = encoding
.encode(&update_header)
.map_err(Chain::raise_error)?;

let message = StarknetMessage::new(call);
let calldata = encoding
.encode(&(client_id.clone(), raw_header))
.map_err(Chain::raise_error)?;

Ok(vec![message])
let call = Call {
to: contract_address,
selector: selector!("update_client"),
calldata,
};

let message = StarknetMessage::new(call);

messages.push(message);
}

Ok(messages)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,3 @@ pub mod create_client_message;
pub mod packet_fields;
pub mod query_consensus_state_height;
pub mod update_client_message;
pub mod update_client_payload;

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ impl Transformer for EncodeClientStatus {
}
}

impl From<CometClientState> for Any {
impl From<CometClientState> for IbcCometClientState {
fn from(client_state: CometClientState) -> Self {
IbcCometClientState::new(
client_state.chain_id,
Expand All @@ -178,7 +178,12 @@ impl From<CometClientState> for Any {
},
)
.expect("no error")
.into()
}
}

impl From<CometClientState> for Any {
fn from(client_state: CometClientState) -> Self {
IbcCometClientState::from(client_state).into()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ use cgp::prelude::*;
use hermes_encoding_components::impls::encode_mut::combine::CombineEncoders;
use hermes_encoding_components::impls::encode_mut::field::EncodeField;
use hermes_wasm_encoding_components::components::MutEncoderComponent;
use ibc::clients::tendermint::types::{
ConsensusState as TendermintConsensusState, Header as TendermintHeader,
};

use crate::types::cosmos::height::Height;

Expand All @@ -28,3 +31,32 @@ delegate_components! {
>,
}
}

impl From<TendermintHeader> for CometUpdateHeader {
fn from(header: TendermintHeader) -> Self {
let trusted_height = Height {
revision_number: header.trusted_height.revision_number(),
revision_height: header.trusted_height.revision_height(),
};

let target_height = {
let header_height = header.height();

Height {
revision_number: header_height.revision_number(),
revision_height: header_height.revision_height(),
}
};

let time = header.timestamp().expect("valid timestamp").nanoseconds() / 1_000_000_000;

let root = TendermintConsensusState::from(header).root.into_vec();

Self {
trusted_height,
target_height,
time,
root,
}
}
}
11 changes: 6 additions & 5 deletions relayer/crates/starknet-chain-context/src/contexts/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use hermes_chain_type_components::traits::types::message_response::HasMessageRes
use hermes_cosmos_chain_components::components::delegate::DelegateCosmosChainComponents;
use hermes_cosmos_chain_components::types::connection::CosmosInitConnectionOptions;
use hermes_cosmos_chain_components::types::key_types::secp256k1::Secp256k1KeyPair;
use hermes_cosmos_chain_components::types::payloads::client::CosmosUpdateClientPayload;
use hermes_cosmos_relayer::contexts::chain::CosmosChain;
use hermes_encoding_components::traits::has_encoding::{
DefaultEncodingGetter, EncodingGetter, HasDefaultEncoding, ProvideEncodingType,
Expand Down Expand Up @@ -164,11 +165,12 @@ use hermes_starknet_chain_components::types::connection_id::{ConnectionEnd, Conn
use hermes_starknet_chain_components::types::consensus_state::WasmStarknetConsensusState;
use hermes_starknet_chain_components::types::cosmos::client_state::CometClientState;
use hermes_starknet_chain_components::types::cosmos::consensus_state::CometConsensusState;
use hermes_starknet_chain_components::types::cosmos::update::CometUpdateHeader;
use hermes_starknet_chain_components::types::event::StarknetEvent;
use hermes_starknet_chain_components::types::events::packet::WriteAcknowledgementEvent;
use hermes_starknet_chain_components::types::message_response::StarknetMessageResponse;
use hermes_starknet_chain_components::types::payloads::client::StarknetCreateClientPayloadOptions;
use hermes_starknet_chain_components::types::payloads::client::{
StarknetCreateClientPayloadOptions, StarknetUpdateClientPayload,
};
use hermes_starknet_test_components::impls::types::wallet::ProvideStarknetWalletType;
use hermes_test_components::chain::traits::assert::eventual_amount::CanAssertEventualAmount;
use hermes_test_components::chain::traits::messages::ibc_transfer::CanBuildIbcTokenTransferMessage;
Expand Down Expand Up @@ -375,7 +377,7 @@ pub trait CanUseStarknetChain:
CreateClientPayloadOptions = StarknetCreateClientPayloadOptions,
> + CanBuildCreateClientPayload<CosmosChain>
+ CanBuildCreateClientMessage<CosmosChain>
+ CanBuildUpdateClientPayload<CosmosChain>
+ CanBuildUpdateClientPayload<CosmosChain, UpdateClientPayload = StarknetUpdateClientPayload>
+ CanBuildUpdateClientMessage<CosmosChain>
+ CanQueryClientState<CosmosChain>
+ CanQueryClientStateWithProofs<CosmosChain>
Expand Down Expand Up @@ -450,15 +452,14 @@ impl CanUseStarknetChain for StarknetChain {}

pub trait CanUseCosmosChainWithStarknet: HasClientStateType<StarknetChain, ClientState = CometClientState>
+ HasConsensusStateType<StarknetChain, ConsensusState = CometConsensusState>
+ HasUpdateClientPayloadType<StarknetChain, UpdateClientPayload = CometUpdateHeader>
+ HasUpdateClientPayloadType<StarknetChain, UpdateClientPayload = CosmosUpdateClientPayload>
+ HasInitConnectionOptionsType<StarknetChain, InitConnectionOptions = CosmosInitConnectionOptions>
+ HasChainId<ChainId = ChainId>
+ HasCounterpartyMessageHeight<StarknetChain>
+ HasClientStateFields<StarknetChain>
+ CanQueryClientState<StarknetChain>
+ CanQueryConsensusState<StarknetChain>
+ CanBuildCreateClientMessage<StarknetChain>
+ CanBuildUpdateClientPayload<StarknetChain>
+ CanBuildUpdateClientMessage<StarknetChain>
+ CanQueryConsensusStateHeight<StarknetChain>
+ CanBuildCreateClientPayload<StarknetChain>
Expand Down
Loading

0 comments on commit bfe0184

Please sign in to comment.