From 64a2e5c5cbc2afd483d055537c44009447b47ffa Mon Sep 17 00:00:00 2001 From: Daniil Polyakov Date: Thu, 21 May 2026 15:19:15 +0300 Subject: [PATCH] fix: dedup Deposit events --- sequencer/service/src/lib.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sequencer/service/src/lib.rs b/sequencer/service/src/lib.rs index 9311f1de..cb3208fe 100644 --- a/sequencer/service/src/lib.rs +++ b/sequencer/service/src/lib.rs @@ -1,3 +1,5 @@ +#[cfg(not(feature = "standalone"))] +use std::collections::HashSet; use std::{net::SocketAddr, sync::Arc, time::Duration}; use anyhow::{Context as _, Result, anyhow}; @@ -260,6 +262,21 @@ async fn bedrock_deposit_loop( let mut cursor: Option<(MsgId, Slot)> = None; let poll_interval = Duration::from_secs(1); + /// Mirrors [`logos_blockchain_zone_sdk::Deposit`] but can be stored in a [`HashSet`]. + #[derive(Debug, PartialEq, Eq, Hash)] + struct HashableDeposit { + inputs: logos_blockchain_core::mantle::ledger::Inputs, + metadata: Vec, + } + impl From for HashableDeposit { + fn from(deposit: logos_blockchain_zone_sdk::Deposit) -> Self { + let logos_blockchain_zone_sdk::Deposit { inputs, metadata } = deposit; + Self { inputs, metadata } + } + } + // TODO: We should probably store this in DB. + let mut seen_deposits = HashSet::new(); + loop { let stream = match zone_indexer.next_messages(cursor).await { Ok(stream) => stream, @@ -278,6 +295,10 @@ async fn bedrock_deposit_loop( info!("Observed Bedrock channel block id {:?}", block.id); } ZoneMessage::Deposit(deposit) => { + let hashable_deposit = HashableDeposit::from(deposit.clone()); + if !seen_deposits.insert(hashable_deposit) { + continue; + } let metadata = match DepositMetadata::decode(&deposit.metadata) { Ok(metadata) => metadata, Err(err) => {