Skip to content
Open
Changes from all commits
Commits
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
41 changes: 18 additions & 23 deletions crates/l2/monitor/widget/l1_to_l2_messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,19 +41,14 @@ pub enum L1ToL2MessageStatus {
}

impl L1ToL2MessageStatus {
pub async fn for_tx(
pub async fn for_tx_with_pending(
l2_tx_hash: H256,
common_bridge_address: Address,
eth_client: &EthClient,
pending_l1_messages: &[H256],
store: &Store,
) -> Result<Self, MonitorError> {
if let Ok(Some(_tx)) = store.get_transaction_by_hash(l2_tx_hash).await {
Ok(Self::ProcessedOnL2)
} else if get_pending_l1_messages(eth_client, common_bridge_address)
.await
.map_err(|_| MonitorError::GetPendingPrivilegedTx)?
.contains(&l2_tx_hash)
{
} else if pending_l1_messages.contains(&l2_tx_hash) {
Ok(Self::Pending)
} else {
Ok(Self::Unknown)
Expand Down Expand Up @@ -111,36 +106,37 @@ impl L1ToL2MessagesTable {
eth_client: &EthClient,
store: &Store,
) -> Result<(), MonitorError> {
let pending_l1_messages = get_pending_l1_messages(eth_client, self.common_bridge_address)
.await
.map_err(|_| MonitorError::GetPendingPrivilegedTx)?;

let mut new_l1_to_l2_messages = Self::fetch_new_items(
&mut self.last_l1_block_fetched,
self.common_bridge_address,
eth_client,
store,
&pending_l1_messages,
)
.await?;
new_l1_to_l2_messages.truncate(50);

let n_new_latest_batches = new_l1_to_l2_messages.len();
self.items.truncate(50 - n_new_latest_batches);
self.refresh_items(eth_client, store).await?;
self.refresh_items(store, &pending_l1_messages).await?;
self.items.extend_from_slice(&new_l1_to_l2_messages);
self.items.rotate_right(n_new_latest_batches);
Ok(())
}

async fn refresh_items(
&mut self,
eth_client: &EthClient,
store: &Store,
pending_l1_messages: &[H256],
) -> Result<(), MonitorError> {
for (_kind, status, _l1_tx_hash, l2_tx_hash, ..) in self.items.iter_mut() {
*status = L1ToL2MessageStatus::for_tx(
*l2_tx_hash,
self.common_bridge_address,
eth_client,
store,
)
.await?;
*status =
L1ToL2MessageStatus::for_tx_with_pending(*l2_tx_hash, pending_l1_messages, store)
.await?;
}
Ok(())
}
Expand All @@ -150,6 +146,7 @@ impl L1ToL2MessagesTable {
common_bridge_address: Address,
eth_client: &EthClient,
store: &Store,
pending_l1_messages: &[H256],
) -> Result<Vec<L1ToL2MessagesRow>, MonitorError> {
let logs = monitor::utils::get_logs(
last_l1_block_fetched,
Expand All @@ -158,14 +155,13 @@ impl L1ToL2MessagesTable {
eth_client,
)
.await?;
Self::process_logs(&logs, common_bridge_address, eth_client, store).await
Self::process_logs(&logs, store, pending_l1_messages).await
}

async fn process_logs(
logs: &[RpcLog],
common_bridge_address: Address,
eth_client: &EthClient,
store: &Store,
pending_l1_messages: &[H256],
) -> Result<Vec<L1ToL2MessagesRow>, MonitorError> {
let mut processed_logs = Vec::new();

Expand All @@ -187,10 +183,9 @@ impl L1ToL2MessagesTable {

processed_logs.push((
L1ToL2MessageKind::from(&l1_to_l2_message),
L1ToL2MessageStatus::for_tx(
L1ToL2MessageStatus::for_tx_with_pending(
l1_to_l2_message_hash,
common_bridge_address,
eth_client,
pending_l1_messages,
store,
)
.await?,
Expand Down
Loading