use crate::{
types::block::{
address::Address,
output::{AliasTransition, Output},
},
wallet::account::types::{AddressWithUnspentOutputs, OutputData},
};
pub(crate) fn can_output_be_unlocked_now(
account_addresses: &[AddressWithUnspentOutputs],
alias_and_nft_addresses: &[Address],
output_data: &OutputData,
current_time: u32,
alias_transition: Option<AliasTransition>,
) -> crate::wallet::Result<bool> {
if let Some(unlock_conditions) = output_data.output.unlock_conditions() {
if unlock_conditions.is_time_locked(current_time) {
return Ok(false);
}
}
let (required_unlock_address, _unlocked_alias_or_nft_address) =
output_data
.output
.required_and_unlocked_address(current_time, &output_data.output_id, alias_transition)?;
Ok(account_addresses
.iter()
.any(|a| a.address.inner == required_unlock_address)
|| alias_and_nft_addresses.iter().any(|a| *a == required_unlock_address))
}
pub(crate) fn can_output_be_unlocked_forever_from_now_on(
account_addresses: &[AddressWithUnspentOutputs],
output: &Output,
current_time: u32,
) -> bool {
if let Some(unlock_conditions) = output.unlock_conditions() {
if unlock_conditions.is_time_locked(current_time) {
return false;
}
if let Some(expiration) = unlock_conditions.expiration() {
if let Some(return_address) = expiration.return_address_expired(current_time) {
if !account_addresses.iter().any(|a| a.address.inner == *return_address) {
return false;
};
} else {
return false;
}
}
true
} else {
false
}
}