use std::collections::HashSet;
use crate::{
types::block::{address::Address, output::Output, protocol::CommittableAgeRange, slot::SlotIndex},
wallet::{types::OutputData, WalletError},
};
pub(crate) fn can_output_be_unlocked_now(
controlled_addresses: &HashSet<Address>,
output_data: &OutputData,
commitment_slot_index: impl Into<SlotIndex> + Copy,
committable_age_range: CommittableAgeRange,
) -> Result<bool, WalletError> {
if output_data
.output
.unlock_conditions()
.is_timelocked(commitment_slot_index, committable_age_range.min)
{
return Ok(false);
}
let required_address = output_data
.output
.required_address(commitment_slot_index.into(), committable_age_range)?;
Ok(required_address.map_or_else(
|| false,
|required_address| controlled_addresses.contains(&required_address),
))
}
pub(crate) fn can_output_be_unlocked_from_now_on(
controlled_addresses: &HashSet<Address>,
output: &Output,
slot_index: impl Into<SlotIndex> + Copy,
committable_age_range: CommittableAgeRange,
) -> bool {
if output
.unlock_conditions()
.is_timelocked(slot_index, committable_age_range.min)
{
return false;
}
if let Some(expiration) = output.unlock_conditions().expiration() {
if let Some(address) = expiration.return_address_expired(
output.unlock_conditions().address().unwrap().address(),
slot_index,
committable_age_range,
) {
if address != expiration.return_address() || !controlled_addresses.contains(address) {
return false;
}
} else {
return false;
}
}
true
}