Problem
No standalone helper exists to check whether a subscription has expired. Expiry logic is duplicated across multiple call sites in the contract layer, making it prone to inconsistency.
Proposed Solution
Create contracts/cntr/subscription_expiry.rs implementing two pure functions: pub fn is_subscription_expired(expiry_timestamp: u64, current_timestamp: u64) -> bool and pub fn days_until_expiry(expiry_timestamp: u64, current_timestamp: u64) -> i64 (negative value means expired). No Soroban SDK dependency — pure Rust only. All implementation must live inside contracts/cntr/.
Acceptance Criteria
Problem
No standalone helper exists to check whether a subscription has expired. Expiry logic is duplicated across multiple call sites in the contract layer, making it prone to inconsistency.
Proposed Solution
Create
contracts/cntr/subscription_expiry.rsimplementing two pure functions:pub fn is_subscription_expired(expiry_timestamp: u64, current_timestamp: u64) -> boolandpub fn days_until_expiry(expiry_timestamp: u64, current_timestamp: u64) -> i64(negative value means expired). No Soroban SDK dependency — pure Rust only. All implementation must live insidecontracts/cntr/.Acceptance Criteria
contracts/cntr/subscription_expiry.rsis_subscription_expired(100, 200)returnstrueis_subscription_expired(200, 100)returnsfalseis_subscription_expired(100, 100)returnstrue(expired at boundary)days_until_expiryreturns negative integers for expired subscriptions#[cfg(test)]blockcargo testfrom thecontracts/cntr/directory