use core::num::NonZeroU16;
use miden_protocol::assembly::Path;
use miden_protocol::transaction::{TransactionScript, TransactionScriptRoot};
use miden_protocol::utils::sync::LazyLock;
use miden_protocol::{Felt, Word};
use crate::StandardsLib;
const EXPIRATION_TX_SCRIPT_PATH: &str = "::miden::standards::tx_scripts::expiration::main";
static EXPIRATION_TX_SCRIPT: LazyLock<TransactionScript> = LazyLock::new(|| {
let standards_lib = StandardsLib::default();
let path = Path::new(EXPIRATION_TX_SCRIPT_PATH);
TransactionScript::from_library_reference(standards_lib.as_ref(), path)
.expect("standards library should contain the expiration tx script procedure")
});
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ExpirationTransactionScript {
delta: NonZeroU16,
}
impl ExpirationTransactionScript {
pub fn new(delta: NonZeroU16) -> Self {
Self { delta }
}
pub fn tx_script_args(&self) -> Word {
Word::from([Felt::from(self.delta.get()), Felt::ZERO, Felt::ZERO, Felt::ZERO])
}
pub fn script_root() -> TransactionScriptRoot {
EXPIRATION_TX_SCRIPT.root()
}
}
impl From<ExpirationTransactionScript> for TransactionScript {
fn from(_script: ExpirationTransactionScript) -> Self {
EXPIRATION_TX_SCRIPT.clone()
}
}