use miden_node_proto::domain::note::SingleTargetNetworkNote;
use miden_protocol::block::BlockNumber;
use miden_protocol::note::Note;
use crate::actor::has_backoff_passed;
#[derive(Debug, Clone)]
pub struct InflightNetworkNote {
note: SingleTargetNetworkNote,
attempt_count: usize,
last_attempt: Option<BlockNumber>,
}
impl InflightNetworkNote {
pub fn new(note: SingleTargetNetworkNote) -> Self {
Self {
note,
attempt_count: 0,
last_attempt: None,
}
}
pub fn into_inner(self) -> SingleTargetNetworkNote {
self.note
}
pub fn to_inner(&self) -> &SingleTargetNetworkNote {
&self.note
}
pub fn attempt_count(&self) -> usize {
self.attempt_count
}
pub fn is_available(&self, block_num: BlockNumber) -> bool {
self.note.can_be_consumed(block_num).unwrap_or(true)
&& has_backoff_passed(block_num, self.last_attempt, self.attempt_count)
}
pub fn fail(&mut self, block_num: BlockNumber) {
self.last_attempt = Some(block_num);
self.attempt_count += 1;
}
}
impl From<InflightNetworkNote> for Note {
fn from(value: InflightNetworkNote) -> Self {
value.into_inner().into()
}
}