Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

imp: eth light client and relayer sepolia support #394

Merged
merged 69 commits into from
Mar 13, 2025
Merged
Changes from 1 commit
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
aeaabf7
start add back rust-fixtures
gjermundgaraba Mar 4, 2025
1fba026
feat: electra support in eth lc
gjermundgaraba Mar 7, 2025
c592721
Merge branch 'gjermund/rust-fixtures' into gjermund/electra
gjermundgaraba Mar 7, 2025
266bf5f
imp: electra support
gjermundgaraba Mar 7, 2025
e36d100
Merge remote-tracking branch 'origin/main' into gjermund/electra
gjermundgaraba Mar 7, 2025
5ab4608
update lc
gjermundgaraba Mar 7, 2025
9840fcb
add back rust tests
gjermundgaraba Mar 8, 2025
bfb5d1a
fixes
gjermundgaraba Mar 8, 2025
157bb85
fix nil pointer for multichain tests
gjermundgaraba Mar 8, 2025
f6d3d99
mainnet config wtf
gjermundgaraba Mar 8, 2025
a212a5c
relayer and lc fixes
gjermundgaraba Mar 9, 2025
25be894
more fixes
gjermundgaraba Mar 9, 2025
79a430f
add genesis script
gjermundgaraba Mar 9, 2025
cabe9c1
insert anakin it's working meme here
gjermundgaraba Mar 10, 2025
9ccebc0
cleanup
gjermundgaraba Mar 10, 2025
5a3d2a2
remove ethgenesis script (moved to other branch)
gjermundgaraba Mar 10, 2025
69fce2b
added some more logs
gjermundgaraba Mar 10, 2025
2a3031d
add back ethgenesis script
gjermundgaraba Mar 10, 2025
92ea58c
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 10, 2025
e332e75
did I just make it?
gjermundgaraba Mar 11, 2025
5cc573a
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 11, 2025
4eebcb0
working commit
gjermundgaraba Mar 11, 2025
d6916cb
fix justfile
gjermundgaraba Mar 11, 2025
c0fcc87
update checksum in ethgenesis
gjermundgaraba Mar 11, 2025
6fff846
fix eth genesis script
gjermundgaraba Mar 11, 2025
3863218
fix build error
gjermundgaraba Mar 11, 2025
bba13d1
fix the ethgenesis script again
gjermundgaraba Mar 11, 2025
8e2221e
fix justfile
gjermundgaraba Mar 11, 2025
406429c
wasm fixtures
gjermundgaraba Mar 11, 2025
13baa30
update checksum
gjermundgaraba Mar 11, 2025
081dd30
try something real quick
gjermundgaraba Mar 11, 2025
b2efafd
test1
gjermundgaraba Mar 11, 2025
a91eaee
test1.2
gjermundgaraba Mar 11, 2025
081c684
test2
gjermundgaraba Mar 11, 2025
697c1e2
test3
gjermundgaraba Mar 11, 2025
75e8983
test4
gjermundgaraba Mar 11, 2025
41f8364
test5
gjermundgaraba Mar 11, 2025
b52d8d8
crazy test
gjermundgaraba Mar 11, 2025
6d2ebf4
fix build
gjermundgaraba Mar 11, 2025
59c738e
try something
gjermundgaraba Mar 11, 2025
7ac23ca
new client to test
gjermundgaraba Mar 11, 2025
f1a6129
event type
gjermundgaraba Mar 11, 2025
3ebbe0c
remove debug file
gjermundgaraba Mar 11, 2025
41c4f36
lint
gjermundgaraba Mar 12, 2025
ca74884
Merge remote-tracking branch 'origin/main' into gjermund/sepolia
gjermundgaraba Mar 12, 2025
558b3ef
add heights from tm events
gjermundgaraba Mar 12, 2025
fa290de
code review fixes
gjermundgaraba Mar 12, 2025
7bf8b9d
use trait in TxBuilder
gjermundgaraba Mar 12, 2025
639d73c
code review fixes
gjermundgaraba Mar 12, 2025
abfaae5
clean up wait for finality
gjermundgaraba Mar 13, 2025
682f3c6
fix minimum block number
gjermundgaraba Mar 13, 2025
aac305c
code review fixes
gjermundgaraba Mar 13, 2025
b4a8353
rebuild light client
gjermundgaraba Mar 13, 2025
89d7af3
docs: fix error string
srdtrk Mar 13, 2025
1143687
fix: clippy complaint
srdtrk Mar 13, 2025
dceab5d
style
srdtrk Mar 13, 2025
2976eaa
style
srdtrk Mar 13, 2025
7fccf8d
code review fixes + fixtures
gjermundgaraba Mar 13, 2025
61efb1c
style: imp
srdtrk Mar 13, 2025
12c7ba3
fix fetch events
gjermundgaraba Mar 13, 2025
d938e07
code review fixes
gjermundgaraba Mar 13, 2025
18340b5
more code review fixes
gjermundgaraba Mar 13, 2025
a735559
imp: more additions
srdtrk Mar 13, 2025
44d7ad2
lint
gjermundgaraba Mar 13, 2025
fd4aabc
Merge remote-tracking branch 'origin/gjermund/sepolia' into gjermund/…
srdtrk Mar 13, 2025
9e4b8f9
imp
srdtrk Mar 13, 2025
b5813f1
Merge remote-tracking branch 'origin/gjermund/sepolia' into gjermund/…
srdtrk Mar 13, 2025
ff030c2
add wasm fixture for multi period update client
gjermundgaraba Mar 13, 2025
4552820
imp: remove unneeded clone
srdtrk Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
clean up wait for finality
gjermundgaraba committed Mar 13, 2025

Verified

This commit was signed with the committer’s verified signature.
gjermundgaraba Gjermund Garaba
commit abfaae5f7d89147c158216cd4c4ef3f229b6015f
57 changes: 20 additions & 37 deletions packages/relayer-lib/src/tx_builder/eth_to_cosmos.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
//! This module defines [`TxBuilder`] which is responsible for building transactions to be sent to
//! the Cosmos SDK chain from events received from Ethereum.
use std::sync::{Arc, Mutex};
use std::time::Duration;

use alloy::{primitives::Address, providers::Provider};
@@ -34,7 +33,7 @@ use prost::Message;
use sp1_ics07_tendermint_utils::rpc::TendermintRpcExt;
use tendermint_rpc::Client;

use crate::utils::{cosmos, wait_for_condition};
use crate::utils::{cosmos, wait_for_condition, wait_for_condition_with_capture};
use crate::{
chain::{CosmosSdk, EthEureka},
events::EurekaEventWithHeight,
@@ -179,48 +178,32 @@ where
&self,
target_block_number: u64,
) -> Result<LightClientFinalityUpdate> {
// Shared mutable variable to store the latest update.
let latest_update: Arc<Mutex<Option<LightClientFinalityUpdate>>> =
Arc::new(Mutex::new(None));

// Clone the Arc so the closure can access it.
let latest_update_clone = latest_update.clone();
wait_for_condition(
// Wait until we find a finality update that meets our criteria and capture it
// This way we avoid making an extra call at the end
wait_for_condition_with_capture(
Duration::from_secs(45 * 60),
Duration::from_secs(10),
|| {
// Clone again for the async move closure.
let latest_update_inner = latest_update_clone.clone();
async move {
tracing::debug!(
"Waiting for finality beyond target block number: {}",
|| async {
tracing::debug!(
"Waiting for finality beyond target block number: {}",
target_block_number
);

let finality_update = self.beacon_api_client.finality_update().await?.data;
if finality_update.finalized_header.execution.block_number < target_block_number {
tracing::info!(
"Finality not found: current finality execution block number: {}, Target execution block number: {}",
finality_update.finalized_header.execution.block_number,
target_block_number
);

let finality_update = self.beacon_api_client.finality_update().await?.data;
if finality_update.finalized_header.execution.block_number < target_block_number
{
tracing::info!(
"Finality not found: current finality execution block number: {}, Target execution block number: {}",
finality_update.finalized_header.execution.block_number,
target_block_number
);
return Ok(false);
}

// Store the current update.
*latest_update_inner.lock().unwrap() = Some(finality_update);
Ok(true)
return Ok(None);
}

// Return the update itself when the condition is met
Ok(Some(finality_update))
},
)
.await?;

// Retrieve the stored update.
let stored_update = latest_update.lock().unwrap().take().ok_or_else(|| {
anyhow::anyhow!("Finality update was not stored even though condition was met")
})?;
Ok(stored_update)
.await
}

async fn light_client_update_to_header(
29 changes: 29 additions & 0 deletions packages/relayer-lib/src/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -5,6 +5,8 @@ use std::future::Future;
use std::time::{Duration, Instant};

/// Retries an operation until the condition is met or a timeout occurs.
///
/// The basic version just checks for a boolean condition.
pub async fn wait_for_condition<F, Fut>(
timeout: Duration,
interval: Duration,
@@ -29,5 +31,32 @@ where
anyhow::bail!("Timeout exceeded")
}

/// Retries an operation until the condition is met or a timeout occurs, with a value capture.
/// Returns the value that was captured when the condition was met.
pub async fn wait_for_condition_with_capture<F, Fut, T>(
timeout: Duration,
interval: Duration,
mut condition: F,
) -> anyhow::Result<T>
where
F: FnMut() -> Fut + Send,
Fut: Future<Output = anyhow::Result<Option<T>>> + Send,
T: Send + 'static,
{
let start = Instant::now();
while start.elapsed() < timeout {
if let Some(value) = condition().await? {
return Ok(value);
}

tracing::debug!(
"Condition not met. Waiting for {} seconds before retrying",
interval.as_secs()
);
Delay::new(interval).await;
}
anyhow::bail!("Timeout exceeded")
}

pub mod cosmos;
pub mod eth_eureka;
47 changes: 40 additions & 7 deletions programs/relayer/src/modules/eth_to_cosmos.rs
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ use alloy::{
providers::{Provider, RootProvider},
};
use ibc_eureka_relayer_lib::{
events::EurekaEvent,
events::{EurekaEvent, EurekaEventWithHeight},
listener::{cosmos_sdk, eth_eureka, ChainListenerService},
tx_builder::{eth_to_cosmos, TxBuilderService},
};
@@ -36,7 +36,7 @@ struct EthToCosmosRelayerModuleService {
}

enum EthToCosmosTxBuilder {
Real(eth_to_cosmos::TxBuilder<RootProvider>),
Real(eth_to_cosmos::TxBuilder<RootProvider, HttpClient>),
Mock(eth_to_cosmos::MockTxBuilder<RootProvider>),
}

@@ -178,9 +178,17 @@ impl RelayerService for EthToCosmosRelayerModuleService {
cosmos_events.len()
);

// Extract the inner events from the EurekaEventWithHeight, as our relay_events takes Vec<EurekaEvent>
let eth_events_inner = eth_events.into_iter().map(|e| e.event).collect();
let cosmos_events_inner = cosmos_events.into_iter().map(|e| e.event).collect();

let tx = self
.tx_builder
.relay_events(eth_events, cosmos_events, inner_req.target_client_id)
.relay_events(
eth_events_inner,
cosmos_events_inner,
inner_req.target_client_id,
)
.await
.map_err(|e| tonic::Status::from_error(e.to_string().into()))?;

@@ -219,14 +227,39 @@ impl EthToCosmosTxBuilder {
target_events: Vec<EurekaEvent>,
target_client_id: String,
) -> anyhow::Result<Vec<u8>> {
// Convert EurekaEvent to EurekaEventWithHeight
let src_events_with_height = src_events
.into_iter()
.map(|event| EurekaEventWithHeight {
event,
block_number: None,
})
.collect();

let target_events_with_height = target_events
.into_iter()
.map(|event| EurekaEventWithHeight {
event,
block_number: None,
})
.collect();

match self {
Self::Real(tb) => {
tb.relay_events(src_events, target_events, target_client_id)
.await
tb.relay_events(
src_events_with_height,
target_events_with_height,
target_client_id,
)
.await
}
Self::Mock(tb) => {
tb.relay_events(src_events, target_events, target_client_id)
.await
tb.relay_events(
src_events_with_height,
target_events_with_height,
target_client_id,
)
.await
}
}
}