{ pub fn new() -> Self { Self { pending_reports: vec![] } } /// Submit a `report_equivocation()` transaction to the source chain. /// /// We store the transaction tracker for future monitoring. pub async fn submit_report( &mut self, source_client: &SC, at: P::Hash, equivocation: P::EquivocationProof, ) -> Result<(), SC::Error> { let pending_report = source_client.report_equivocation(at, equivocation).await?; self.pending_reports.push(pending_report.wait()); Ok(()) } fn do_process_pending_reports(&mut self, cx: &mut Context<'_>) -> Poll<()> { self.pending_reports.retain_mut(|pending_report| { match pending_report.poll_unpin(cx) { Poll::Ready(tx_status) => { match tx_status { TrackedTransactionStatus::Lost => { log::error!(target: "bridge", "Equivocation report tx was lost"); }, TrackedTransactionStatus::Finalized(id) => { log::error!(target: "bridge", "Equivocation report tx was finalized in source block {id:?}"); }, } // The future was processed. Drop it. false }, Poll::Pending => { // The future is still pending. Retain it. true }, } }); Poll::Ready(()) } /// Iterate through all the pending `report_equivocation()` transactions /// and log the ones that finished. pub async fn process_pending_reports(&mut self) { poll_fn(|cx| self.do_process_pending_reports(cx)).await } }