use anyhow::Result;
use miden_agglayer::{ExitRoot, UpdateGerNote};
use miden_client::transaction::TransactionRequestBuilder;
use super::{AgglayerConfig, create_agglayer_clients, setup_core_accounts};
use crate::ClientConfig;
pub async fn test_agglayer_note_reader_reads_consumed_notes(
client_config: ClientConfig,
) -> Result<()> {
let agglayer_config = AgglayerConfig::from_env()?;
let _agglayer_accounts = agglayer_config.claim()?;
let (mut bridge_admin, mut ger_manager, mut user) =
create_agglayer_clients(&client_config).await?;
let (_bridge_admin_id, ger_manager_id, bridge_id) =
setup_core_accounts(&agglayer_config, &mut bridge_admin, &mut ger_manager, &mut user)
.await?;
const NOTE_COUNT: usize = 3;
const MAX_POLL_BLOCKS: usize = 60;
let mut expected = Vec::with_capacity(NOTE_COUNT);
for _ in 0..NOTE_COUNT {
let ger = ExitRoot::from(rand::random::<[u8; 32]>());
let note = UpdateGerNote::create(ger, ger_manager_id, bridge_id, ger_manager.rng())?;
expected.push(note.details_commitment());
let tx = TransactionRequestBuilder::new().own_output_notes(vec![note]).build()?;
let tx_id = ger_manager.submit_new_transaction(ger_manager_id, tx).await?;
ger_manager.wait_for_tx(tx_id).await?;
let mut consumed = Vec::new();
for _ in 0..MAX_POLL_BLOCKS {
ger_manager.sync_state().await?;
consumed.clear();
let mut reader = ger_manager.input_note_reader(bridge_id);
while let Some(note) = reader.next().await? {
consumed.push(note.details_commitment());
}
consumed.retain(|c| expected.contains(c));
if consumed.len() == expected.len() {
break;
}
ger_manager.wait_for_blocks(1).await?;
}
assert_eq!(
consumed, expected,
"InputNoteReader should return the bridge's consumed UPDATE_GER notes in consumption order"
);
}
Ok(())
}