From e529d255964c84709ef673caa26b128a2f5e1570 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Wed, 29 Nov 2023 15:42:39 +0100 Subject: [PATCH] Release Hermes v1.7.3 (#3715) * evidence: More reliable evidence reporting + couple of bug fixes (#3702) * evidence: Only fetch counterparty clients of chains present in the config * Harden the evidence reporting code in the face of runtime errors * Fix bug where the counterparty client id returned was actually the original client id * Bump version to v1.7.3 * Release changelog --- .../ibc-relayer-cli/3702-evidence-patch.md | 3 + .changelog/v1.7.3/summary.md | 5 + CHANGELOG.md | 15 + Cargo.lock | 16 +- crates/chain-registry/Cargo.toml | 4 +- crates/relayer-cli/Cargo.toml | 12 +- crates/relayer-cli/src/commands/evidence.rs | 334 +++++++++++------- crates/relayer-rest/Cargo.toml | 6 +- crates/relayer-rest/tests/mock.rs | 2 +- crates/relayer-types/Cargo.toml | 2 +- crates/relayer/Cargo.toml | 8 +- crates/telemetry/Cargo.toml | 4 +- guide/README.md | 2 +- guide/src/SUMMARY.md | 2 +- guide/src/templates/hermes-version.md | 2 +- tools/integration-test/Cargo.toml | 2 +- tools/test-framework/Cargo.toml | 8 +- 17 files changed, 263 insertions(+), 164 deletions(-) create mode 100644 .changelog/v1.7.3/bug-fixes/ibc-relayer-cli/3702-evidence-patch.md create mode 100644 .changelog/v1.7.3/summary.md diff --git a/.changelog/v1.7.3/bug-fixes/ibc-relayer-cli/3702-evidence-patch.md b/.changelog/v1.7.3/bug-fixes/ibc-relayer-cli/3702-evidence-patch.md new file mode 100644 index 0000000000..e927fce303 --- /dev/null +++ b/.changelog/v1.7.3/bug-fixes/ibc-relayer-cli/3702-evidence-patch.md @@ -0,0 +1,3 @@ +- Improve reliability of `evidence` command and fix a bug that was + preventing evidence to be reported, as seen on the Gaia RS testnet + ([\#3702](https://github.com/informalsystems/hermes/pull/3702)) \ No newline at end of file diff --git a/.changelog/v1.7.3/summary.md b/.changelog/v1.7.3/summary.md new file mode 100644 index 0000000000..bbd4ee5bb1 --- /dev/null +++ b/.changelog/v1.7.3/summary.md @@ -0,0 +1,5 @@ +*November 29th, 2023* + +This release improves the reliability of the `evidence` command and +fixes a bug that was preventing evidence to be reported, +as seen on the Gaia RS testnet. diff --git a/CHANGELOG.md b/CHANGELOG.md index 27ebf30bee..4a4c21d3bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # CHANGELOG +## v1.7.3 + +*November 29th, 2023* + +This release improves the reliability of the `evidence` command and +fixes a bug that was preventing evidence to be reported, +as seen on the Gaia RS testnet. + +### BUG FIXES + +- [Relayer CLI](relayer-cli) + - Improve reliability of `evidence` command and fix a bug that was + preventing evidence to be reported, as seen on the Gaia RS testnet + ([\#3702](https://github.com/informalsystems/hermes/pull/3702)) + ## v1.7.2 *November 28th, 2023* diff --git a/Cargo.lock b/Cargo.lock index 4c1fd97055..9804d7c8d7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1323,7 +1323,7 @@ dependencies = [ [[package]] name = "ibc-chain-registry" -version = "0.26.2" +version = "0.26.3" dependencies = [ "async-trait", "flex-error", @@ -1342,7 +1342,7 @@ dependencies = [ [[package]] name = "ibc-integration-test" -version = "0.26.2" +version = "0.26.3" dependencies = [ "http", "ibc-relayer", @@ -1376,7 +1376,7 @@ dependencies = [ [[package]] name = "ibc-relayer" -version = "0.26.2" +version = "0.26.3" dependencies = [ "anyhow", "async-stream", @@ -1443,7 +1443,7 @@ dependencies = [ [[package]] name = "ibc-relayer-cli" -version = "1.7.2" +version = "1.7.3" dependencies = [ "abscissa_core", "clap", @@ -1484,7 +1484,7 @@ dependencies = [ [[package]] name = "ibc-relayer-rest" -version = "0.26.2" +version = "0.26.3" dependencies = [ "axum", "crossbeam-channel 0.5.8", @@ -1499,7 +1499,7 @@ dependencies = [ [[package]] name = "ibc-relayer-types" -version = "0.26.2" +version = "0.26.3" dependencies = [ "bytes", "derive_more", @@ -1530,7 +1530,7 @@ dependencies = [ [[package]] name = "ibc-telemetry" -version = "0.26.2" +version = "0.26.3" dependencies = [ "axum", "dashmap", @@ -1549,7 +1549,7 @@ dependencies = [ [[package]] name = "ibc-test-framework" -version = "0.26.2" +version = "0.26.3" dependencies = [ "color-eyre", "crossbeam-channel 0.5.8", diff --git a/crates/chain-registry/Cargo.toml b/crates/chain-registry/Cargo.toml index 921f2902b1..1d8a714993 100644 --- a/crates/chain-registry/Cargo.toml +++ b/crates/chain-registry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-chain-registry" -version = "0.26.2" +version = "0.26.3" edition = "2021" license = "Apache-2.0" keywords = ["cosmos", "ibc", "relayer", "chain", "registry"] @@ -12,7 +12,7 @@ description = """ """ [dependencies] -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types" } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types" } ibc-proto = { version = "0.38.0", features = ["serde"] } tendermint-rpc = { version = "0.34.0", features = ["http-client", "websocket-client"] } diff --git a/crates/relayer-cli/Cargo.toml b/crates/relayer-cli/Cargo.toml index 495058a949..98c3272e84 100644 --- a/crates/relayer-cli/Cargo.toml +++ b/crates/relayer-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-relayer-cli" -version = "1.7.2" +version = "1.7.3" edition = "2021" license = "Apache-2.0" readme = "README.md" @@ -25,11 +25,11 @@ telemetry = ["ibc-relayer/telemetry", "ibc-telemetry"] rest-server = ["ibc-relayer-rest"] [dependencies] -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types" } -ibc-relayer = { version = "0.26.2", path = "../relayer" } -ibc-telemetry = { version = "0.26.2", path = "../telemetry", optional = true } -ibc-relayer-rest = { version = "0.26.2", path = "../relayer-rest", optional = true } -ibc-chain-registry = { version = "0.26.2" , path = "../chain-registry" } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types" } +ibc-relayer = { version = "0.26.3", path = "../relayer" } +ibc-telemetry = { version = "0.26.3", path = "../telemetry", optional = true } +ibc-relayer-rest = { version = "0.26.3", path = "../relayer-rest", optional = true } +ibc-chain-registry = { version = "0.26.3" , path = "../chain-registry" } clap = { version = "3.2", features = ["cargo"] } clap_complete = "3.2" diff --git a/crates/relayer-cli/src/commands/evidence.rs b/crates/relayer-cli/src/commands/evidence.rs index 2dd786380e..8e8791cc0f 100644 --- a/crates/relayer-cli/src/commands/evidence.rs +++ b/crates/relayer-cli/src/commands/evidence.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::ops::Deref; +use std::ops::{ControlFlow, Deref}; use std::sync::Arc; use std::thread::sleep; use std::time::Duration; @@ -19,6 +19,7 @@ use ibc_relayer::chain::handle::{BaseChainHandle, ChainHandle}; use ibc_relayer::chain::requests::{IncludeProof, PageRequest, QueryHeight}; use ibc_relayer::chain::tracking::TrackedMsgs; use ibc_relayer::chain::ChainType; +use ibc_relayer::config::Config; use ibc_relayer::foreign_client::ForeignClient; use ibc_relayer::spawn::spawn_chain_runtime_with_modified_config; use ibc_relayer_types::applications::ics28_ccv::msgs::ccv_double_voting::MsgSubmitIcsConsumerDoubleVoting; @@ -96,7 +97,13 @@ impl Runnable for EvidenceCmd { ); let chain = CosmosSdkChain::bootstrap(chain_config, rt.clone()).unwrap(); - let res = monitor_misbehaviours(rt, chain, self.key_name.as_ref(), self.check_past_blocks); + let res = monitor_misbehaviours( + rt, + &config, + chain, + self.key_name.as_ref(), + self.check_past_blocks, + ); match res { Ok(()) => Output::success(()).exit(), @@ -107,6 +114,7 @@ impl Runnable for EvidenceCmd { fn monitor_misbehaviours( rt: Arc, + config: &Config, mut chain: CosmosSdkChain, key_name: Option<&String>, check_past_blocks: u64, @@ -136,7 +144,7 @@ fn monitor_misbehaviours( while height >= target_height { debug!("checking for evidence at height {height}"); - if let Err(e) = check_misbehaviour_at(rt.clone(), &chain, key_name, height) { + if let Err(e) = check_misbehaviour_at(rt.clone(), config, &chain, key_name, height) { warn!("error while checking for misbehaviour at height {height}: {e}"); } @@ -159,9 +167,13 @@ fn monitor_misbehaviours( if let IbcEvent::NewBlock(new_block) = &event_with_height.event { info!("checking for evidence at height {}", new_block.height); - if let Err(e) = - check_misbehaviour_at(rt.clone(), &chain, key_name, new_block.height) - { + if let Err(e) = check_misbehaviour_at( + rt.clone(), + config, + &chain, + key_name, + new_block.height, + ) { error!( "error while checking for misbehaviour at height {}: {e}", new_block.height @@ -184,6 +196,7 @@ fn monitor_misbehaviours( /// clients of the chain, freezing them. fn check_misbehaviour_at( rt: Arc, + config: &Config, chain: &CosmosSdkChain, key_name: Option<&String>, height: Height, @@ -198,13 +211,13 @@ fn check_misbehaviour_at( warn!("found duplicate vote evidence"); trace!("{dv:#?}"); - handle_duplicate_vote(rt.clone(), chain, key_name, *dv)?; + handle_duplicate_vote(rt.clone(), config, chain, key_name, *dv)?; } tendermint::evidence::Evidence::LightClientAttack(lc) => { warn!("found light client attack evidence"); trace!("{lc:#?}"); - handle_light_client_attack(rt.clone(), chain, key_name, *lc)?; + handle_light_client_attack(rt.clone(), config, chain, key_name, *lc)?; } } } @@ -212,114 +225,167 @@ fn check_misbehaviour_at( Ok(()) } +fn spawn_runtime( + rt: Arc, + config: &Config, + cache: &mut HashMap, + chain_id: &ChainId, + key_name: Option<&String>, +) -> eyre::Result { + if !cache.contains_key(chain_id) { + let chain_handle = spawn_chain_runtime_with_modified_config::( + config, + chain_id, + rt, + |chain_config| { + if let Some(key_name) = key_name { + chain_config.key_name = key_name.to_string(); + } + }, + )?; + + cache.insert(chain_id.clone(), chain_handle); + } + + Ok(cache + .get(chain_id) + .expect("chain handle was either already there or we just inserted it") + .clone()) +} + fn handle_duplicate_vote( rt: Arc, + config: &Config, chain: &CosmosSdkChain, key_name: Option<&String>, - dv: DuplicateVoteEvidence, + evidence: DuplicateVoteEvidence, ) -> eyre::Result<()> { - use ibc_relayer::chain::requests::QueryConsensusStateHeightsRequest; - - let config = app_config(); - // Fetch all the counterparty clients of this chain. - let counterparty_clients = fetch_all_counterparty_clients(chain)?; + let counterparty_clients = fetch_all_counterparty_clients(config, chain)?; + // Cache for the chain handles let mut chains = HashMap::new(); // For each counterparty client, build the double voting evidence and submit it to the chain, // freezing that client. for (counterparty_chain_id, counterparty_client_id) in counterparty_clients { - if !chains.contains_key(&counterparty_chain_id) { - let chain_handle = spawn_chain_runtime_with_modified_config::( - &config, - &counterparty_chain_id, - rt.clone(), - |chain_config| { - if let Some(key_name) = key_name { - chain_config.key_name = key_name.to_string(); - } - }, - )?; - - chains.insert(counterparty_chain_id.clone(), chain_handle); + let counterparty_chain_handle = match spawn_runtime( + rt.clone(), + config, + &mut chains, + &counterparty_chain_id, + key_name, + ) { + Ok(chain_handle) => chain_handle, + Err(e) => { + error!("failed to spawn runtime for chain `{counterparty_chain_id}`: {e}"); + continue; + } }; - let counterparty_chain_handle = chains.get(&counterparty_chain_id).unwrap(); + let next = submit_duplicate_vote_evidence( + &rt, + chain, + &counterparty_chain_handle, + &counterparty_chain_id, + &counterparty_client_id, + &evidence, + ); - let signer = counterparty_chain_handle.get_signer()?; + match next { + Ok(ControlFlow::Continue(())) => continue, + Ok(ControlFlow::Break(())) => break, + Err(e) => { + error!( + "failed to report double voting evidence to chain `{counterparty_chain_id}`: {e}" + ); - if !is_counterparty_provider(chain, counterparty_chain_handle, &counterparty_client_id) { - debug!("counterparty client `{counterparty_client_id}` on chain `{counterparty_chain_id}` is not a CCV client, skipping..."); - continue; + continue; + } } + } - let infraction_height = dv.vote_a.height; - - // Get the trusted height in the same way we do for client updates, - // ie. retrieve the consensus state at the highest height smaller than the infraction height. - // - // Note: The consensus state heights are sorted in increasing order. - let consensus_state_heights = - chain.query_consensus_state_heights(QueryConsensusStateHeightsRequest { - client_id: counterparty_client_id.clone(), - pagination: Some(PageRequest::all()), - })?; - - // Retrieve the consensus state at the highest height smaller than the infraction height. - let consensus_state_height_before_infraction_height = consensus_state_heights - .into_iter() - .filter(|height| height.revision_height() < infraction_height.value()) - .last(); - - let Some(trusted_height) = consensus_state_height_before_infraction_height else { - error!( - "cannot build infraction block header for client `{counterparty_client_id}` on chain `{counterparty_chain_id}`,\ - reason: could not find consensus state at highest height smaller than infraction height {infraction_height}" - ); + Ok(()) +} - continue; - }; +fn submit_duplicate_vote_evidence( + rt: &TokioRuntime, + chain: &CosmosSdkChain, + counterparty_chain_handle: &BaseChainHandle, + counterparty_chain_id: &ChainId, + counterparty_client_id: &ClientId, + evidence: &DuplicateVoteEvidence, +) -> eyre::Result> { + use ibc_relayer::chain::requests::QueryConsensusStateHeightsRequest; - // Construct the light client block header for the consumer chain at the infraction height - let infraction_block_header = - fetch_infraction_block_header(&rt, chain, infraction_height, trusted_height)?; + let signer = counterparty_chain_handle.get_signer()?; - let submit_msg = MsgSubmitIcsConsumerDoubleVoting { - submitter: signer.clone(), - duplicate_vote_evidence: dv.clone(), - infraction_block_header, - } - .to_any(); + if !is_counterparty_provider(chain, counterparty_chain_handle, counterparty_client_id) { + debug!("counterparty client `{counterparty_client_id}` on chain `{counterparty_chain_id}` is not a CCV client, skipping..."); + return Ok(ControlFlow::Continue(())); + } - info!( - "submitting consumer double voting evidence to provider chain `{counterparty_chain_id}`" + let infraction_height = evidence.vote_a.height; + + // Get the trusted height in the same way we do for client updates, + // ie. retrieve the consensus state at the highest height smaller than the infraction height. + // + // Note: The consensus state heights are sorted in increasing order. + let consensus_state_heights = + chain.query_consensus_state_heights(QueryConsensusStateHeightsRequest { + client_id: counterparty_client_id.clone(), + pagination: Some(PageRequest::all()), + })?; + + // Retrieve the consensus state at the highest height smaller than the infraction height. + let consensus_state_height_before_infraction_height = consensus_state_heights + .into_iter() + .filter(|height| height.revision_height() < infraction_height.value()) + .last(); + + let Some(trusted_height) = consensus_state_height_before_infraction_height else { + error!( + "cannot build infraction block header for client `{counterparty_client_id}` on chain `{counterparty_chain_id}`,\ + reason: could not find consensus state at highest height smaller than infraction height {infraction_height}" ); - let tracked_msgs = TrackedMsgs::new_static(vec![submit_msg], "double_voting_evidence"); - let responses = counterparty_chain_handle.send_messages_and_wait_check_tx(tracked_msgs)?; + return Ok(ControlFlow::Continue(())); + }; - for response in responses { - if response.code.is_ok() { - info!("successfully submitted double voting evidence to chain `{counterparty_chain_id}`, tx hash: {}", response.hash); - } else { - error!( - "failed to submit double voting evidence to chain `{counterparty_chain_id}`: {response:?}" - ); - } - } + // Construct the light client block header for the consumer chain at the infraction height + let infraction_block_header = + fetch_infraction_block_header(rt, chain, infraction_height, trusted_height)?; - // We have submitted the evidence to the provider, and because there can only be a single - // provider for a consumer chain, we can stop now. No need to check all the other - // counteparties. - break; + let submit_msg = MsgSubmitIcsConsumerDoubleVoting { + submitter: signer.clone(), + duplicate_vote_evidence: evidence.clone(), + infraction_block_header, } + .to_any(); - Ok(()) + info!("submitting consumer double voting evidence to provider chain `{counterparty_chain_id}`"); + + let tracked_msgs = TrackedMsgs::new_static(vec![submit_msg], "double_voting_evidence"); + let responses = counterparty_chain_handle.send_messages_and_wait_check_tx(tracked_msgs)?; + + for response in responses { + if response.code.is_ok() { + info!("successfully submitted double voting evidence to chain `{counterparty_chain_id}`, tx hash: {}", response.hash); + } else { + error!( + "failed to submit double voting evidence to chain `{counterparty_chain_id}`: {response:?}" + ); + } + } + + // We have submitted the evidence to the provider, and because there can only be a single + // provider for a consumer chain, we can stop now. No need to check all the other + // counteparties. + Ok(ControlFlow::Break(())) } fn fetch_infraction_block_header( - rt: &Arc, + rt: &TokioRuntime, chain: &CosmosSdkChain, infraction_height: TendermintHeight, trusted_height: Height, @@ -356,62 +422,55 @@ fn fetch_infraction_block_header( fn handle_light_client_attack( rt: Arc, + config: &Config, chain: &CosmosSdkChain, key_name: Option<&String>, evidence: LightClientAttackEvidence, ) -> eyre::Result<()> { - let config = app_config(); - // Build the two headers to submit as part of the `MsgSubmitMisbehaviour` message. let (header1, header2) = build_evidence_headers(rt.clone(), chain, evidence.clone())?; // Fetch all the counterparty clients of this chain. - let counterparty_clients = fetch_all_counterparty_clients(chain)?; + let counterparty_clients = fetch_all_counterparty_clients(config, chain)?; + // Cache for the chain handles let mut chains = HashMap::new(); + let chain_handle = spawn_runtime(rt.clone(), config, &mut chains, chain.id(), key_name) + .map_err(|e| { + eyre::eyre!( + "failed to spawn chain runtime for chain `{chain_id}`: {e}", + chain_id = chain.id() + ) + })?; + // For each counterparty client, build the misbehaviour evidence and submit it to the chain, // freezing that client. for (counterparty_chain_id, counterparty_client_id) in counterparty_clients { + let counterparty_chain_handle = match spawn_runtime( + rt.clone(), + config, + &mut chains, + &counterparty_chain_id, + key_name, + ) { + Ok(chain_handle) => chain_handle, + Err(e) => { + error!( + "failed to spawn chain runtime for chain `{counterparty_chain_id}`: {e}", + counterparty_chain_id = counterparty_chain_id + ); + + continue; + } + }; + let misbehaviour = TendermintMisbehaviour { client_id: counterparty_client_id.clone(), header1: header1.clone(), header2: header2.clone(), }; - if !chains.contains_key(chain.id()) { - let chain_handle = spawn_chain_runtime_with_modified_config::( - &config, - chain.id(), - rt.clone(), - |chain_config| { - if let Some(key_name) = key_name { - chain_config.key_name = key_name.to_string(); - } - }, - )?; - - chains.insert(chain.id().clone(), chain_handle); - } - - if !chains.contains_key(&counterparty_chain_id) { - let chain_handle = spawn_chain_runtime_with_modified_config::( - &config, - &counterparty_chain_id, - rt.clone(), - |chain_config| { - if let Some(key_name) = key_name { - chain_config.key_name = key_name.to_string(); - } - }, - )?; - - chains.insert(counterparty_chain_id.clone(), chain_handle); - }; - - let chain_handle = chains.get(chain.id()).unwrap(); - let counterparty_chain_handle = chains.get(&counterparty_chain_id).unwrap(); - let counterparty_client = ForeignClient::restore( counterparty_client_id.clone(), counterparty_chain_handle.clone(), @@ -423,7 +482,7 @@ fn handle_light_client_attack( chain, counterparty_client, counterparty_client_id, - counterparty_chain_handle, + &counterparty_chain_handle, misbehaviour, ); @@ -636,6 +695,7 @@ fn is_counterparty_provider( /// 2.2. From the client state, extract the chain id of the counterparty chain. /// 4. Return a list of all counterparty chains and counterparty clients. fn fetch_all_counterparty_clients( + config: &Config, chain: &CosmosSdkChain, ) -> eyre::Result> { use ibc_relayer::chain::requests::{QueryClientStateRequest, QueryConnectionsRequest}; @@ -649,12 +709,18 @@ fn fetch_all_counterparty_clients( let mut counterparty_clients = vec![]; for connection in connections { + let client_id = connection.connection_end.client_id(); + let counterparty_client_id = connection.connection_end.counterparty().client_id(); + debug!( - "fetching counterparty client state for connection `{}`", + "found connection `{}` with client `{client_id}` and counterparty client `{counterparty_client_id}`", connection.connection_id ); - let client_id = connection.connection_end.client_id(); + debug!( + "fetching client state for client `{client_id}` on connection `{}`", + connection.connection_id + ); let client_state = chain.query_client_state( QueryClientStateRequest { @@ -667,9 +733,7 @@ fn fetch_all_counterparty_clients( let client_state = match client_state { Ok((client_state, _)) => client_state, Err(e) => { - error!( - "failed to fetch client state for counterparty client `{client_id}`, skipping..." - ); + error!("failed to fetch client state for client `{client_id}`, skipping..."); error!("reason: {e}"); continue; @@ -677,11 +741,23 @@ fn fetch_all_counterparty_clients( }; let counterparty_chain_id = client_state.chain_id(); - info!("found counterparty client with id `{client_id}` on counterparty chain `{counterparty_chain_id}`"); - counterparty_clients.push((counterparty_chain_id, client_id.clone())); + if config.find_chain(&counterparty_chain_id).is_some() { + info!("found counterparty client `{counterparty_client_id}` which lives on counterparty chain `{counterparty_chain_id}`"); + + counterparty_clients.push((counterparty_chain_id, counterparty_client_id.clone())); + } else { + debug!( + "skipping counterparty client `{client_id}` on counterparty \ + chain `{counterparty_chain_id}` which is not present in the config..." + ); + } } + // Remove duplicates + counterparty_clients.sort(); + counterparty_clients.dedup(); + Ok(counterparty_clients) } diff --git a/crates/relayer-rest/Cargo.toml b/crates/relayer-rest/Cargo.toml index 26d9de93a6..5edaaa07c8 100644 --- a/crates/relayer-rest/Cargo.toml +++ b/crates/relayer-rest/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-relayer-rest" -version = "0.26.2" +version = "0.26.3" authors = ["Informal Systems "] edition = "2021" license = "Apache-2.0" @@ -14,8 +14,8 @@ description = """ """ [dependencies] -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types" } -ibc-relayer = { version = "0.26.2", path = "../relayer" } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types" } +ibc-relayer = { version = "0.26.3", path = "../relayer" } crossbeam-channel = "0.5" serde = "1.0" diff --git a/crates/relayer-rest/tests/mock.rs b/crates/relayer-rest/tests/mock.rs index 65c1e4959d..fdcc710e37 100644 --- a/crates/relayer-rest/tests/mock.rs +++ b/crates/relayer-rest/tests/mock.rs @@ -64,7 +64,7 @@ async fn version() { let rest_api_version = VersionInfo { name: "ibc-relayer-rest".to_string(), - version: "0.26.2".to_string(), + version: "0.26.3".to_string(), }; let result: JsonResult<_, ()> = JsonResult::Success(vec![version.clone(), rest_api_version]); diff --git a/crates/relayer-types/Cargo.toml b/crates/relayer-types/Cargo.toml index ec180ed2fa..6092d7041a 100644 --- a/crates/relayer-types/Cargo.toml +++ b/crates/relayer-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-relayer-types" -version = "0.26.2" +version = "0.26.3" edition = "2021" license = "Apache-2.0" readme = "README.md" diff --git a/crates/relayer/Cargo.toml b/crates/relayer/Cargo.toml index d3f2a45e2a..37f16f3add 100644 --- a/crates/relayer/Cargo.toml +++ b/crates/relayer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-relayer" -version = "0.26.2" +version = "0.26.3" edition = "2021" license = "Apache-2.0" readme = "README.md" @@ -21,8 +21,8 @@ telemetry = ["ibc-telemetry"] [dependencies] ibc-proto = { version = "0.38.0", features = ["serde"] } -ibc-telemetry = { version = "0.26.2", path = "../telemetry", optional = true } -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types", features = ["mocks"] } +ibc-telemetry = { version = "0.26.3", path = "../telemetry", optional = true } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types", features = ["mocks"] } subtle-encoding = "0.5" humantime-serde = "1.1.1" @@ -104,7 +104,7 @@ version = "0.34.0" default-features = false [dev-dependencies] -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types", features = ["mocks"] } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types", features = ["mocks"] } serial_test = "2.0.0" env_logger = "0.10.0" tracing-subscriber = { version = "0.3.14", features = ["fmt", "env-filter", "json"] } diff --git a/crates/telemetry/Cargo.toml b/crates/telemetry/Cargo.toml index 7783ae1dd5..43fe2f4304 100644 --- a/crates/telemetry/Cargo.toml +++ b/crates/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-telemetry" -version = "0.26.2" +version = "0.26.3" edition = "2021" license = "Apache-2.0" readme = "README.md" @@ -13,7 +13,7 @@ description = """ """ [dependencies] -ibc-relayer-types = { version = "0.26.2", path = "../relayer-types" } +ibc-relayer-types = { version = "0.26.3", path = "../relayer-types" } once_cell = "1.17.0" opentelemetry = { version = "0.19.0", features = ["metrics"] } diff --git a/guide/README.md b/guide/README.md index 421f7a1afa..fa91a9112b 100644 --- a/guide/README.md +++ b/guide/README.md @@ -10,7 +10,7 @@ mdBook is a utility to create modern online books from Markdown files. This guide should be permanently deployed at its latest stable version at [hermes.informal.systems](https://hermes.informal.systems). -Current version: `v1.7.2`. +Current version: `v1.7.3`. The version of this guide is aligned with the [versioning of the ibc crates](../README.md). diff --git a/guide/src/SUMMARY.md b/guide/src/SUMMARY.md index 8b8abe50f0..b7340998c1 100644 --- a/guide/src/SUMMARY.md +++ b/guide/src/SUMMARY.md @@ -1,6 +1,6 @@ # Summary -# Hermes v1.7.2 +# Hermes v1.7.3 --- - [Introduction](./index.md) diff --git a/guide/src/templates/hermes-version.md b/guide/src/templates/hermes-version.md index 3b34d22941..5f152d81a5 100644 --- a/guide/src/templates/hermes-version.md +++ b/guide/src/templates/hermes-version.md @@ -1 +1 @@ -v1.7.2 +v1.7.3 diff --git a/tools/integration-test/Cargo.toml b/tools/integration-test/Cargo.toml index ba2fc667e3..b5a570bc4e 100644 --- a/tools/integration-test/Cargo.toml +++ b/tools/integration-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-integration-test" -version = "0.26.2" +version = "0.26.3" edition = "2021" rust-version = "1.70" license = "Apache-2.0" diff --git a/tools/test-framework/Cargo.toml b/tools/test-framework/Cargo.toml index 9945ce501e..9c8b96877a 100644 --- a/tools/test-framework/Cargo.toml +++ b/tools/test-framework/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ibc-test-framework" -version = "0.26.2" +version = "0.26.3" edition = "2021" license = "Apache-2.0" readme = "README.md" @@ -14,9 +14,9 @@ description = """ """ [dependencies] -ibc-relayer-types = { version = "=0.26.2", path = "../../crates/relayer-types" } -ibc-relayer = { version = "=0.26.2", path = "../../crates/relayer" } -ibc-relayer-cli = { version = "=1.7.2", path = "../../crates/relayer-cli" } +ibc-relayer-types = { version = "=0.26.3", path = "../../crates/relayer-types" } +ibc-relayer = { version = "=0.26.3", path = "../../crates/relayer" } +ibc-relayer-cli = { version = "=1.7.3", path = "../../crates/relayer-cli" } ibc-proto = { version = "0.38.0", features = ["serde"] } tendermint-rpc = { version = "0.34.0", features = ["http-client", "websocket-client"] }