fix: dedup Deposit events

This commit is contained in:
Daniil Polyakov 2026-05-21 15:19:15 +03:00
parent 10ded0dc23
commit 64a2e5c5cb

View File

@ -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<u8>,
}
impl From<logos_blockchain_zone_sdk::Deposit> 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) => {