diff --git a/runtime/src/rent_collector.rs b/runtime/src/rent_collector.rs index dbf7eda3a61623..5e69b28102634f 100644 --- a/runtime/src/rent_collector.rs +++ b/runtime/src/rent_collector.rs @@ -83,19 +83,26 @@ impl RentCollector { /// given an account that 'should_collect_rent' /// returns (amount rent due, is_exempt_from_rent) pub fn get_rent_due(&self, account: &impl ReadableAccount) -> RentDue { - let slots_elapsed: u64 = (account.rent_epoch()..=self.epoch) - .map(|epoch| self.epoch_schedule.get_slots_in_epoch(epoch + 1)) - .sum(); - - // avoid infinite rent in rust 1.45 - let years_elapsed = if self.slots_per_year != 0.0 { - slots_elapsed as f64 / self.slots_per_year + if self + .rent + .is_exempt(account.lamports(), account.data().len()) + { + RentDue::Exempt } else { - 0.0 - }; - - self.rent - .due(account.lamports(), account.data().len(), years_elapsed) + let slots_elapsed: u64 = (account.rent_epoch()..=self.epoch) + .map(|epoch| self.epoch_schedule.get_slots_in_epoch(epoch + 1)) + .sum(); + + // avoid infinite rent in rust 1.45 + let years_elapsed = if self.slots_per_year != 0.0 { + slots_elapsed as f64 / self.slots_per_year + } else { + 0.0 + }; + + // we know this account is not exempt + RentDue::Paying(self.rent.due_amount(account.data().len(), years_elapsed)) + } } // Updates the account's lamports and status, and returns the amount of rent collected, if any. diff --git a/sdk/program/src/rent.rs b/sdk/program/src/rent.rs index 88f6aeb8d4fa77..86f71693925bff 100644 --- a/sdk/program/src/rent.rs +++ b/sdk/program/src/rent.rs @@ -68,12 +68,17 @@ impl Rent { if self.is_exempt(balance, data_len) { RentDue::Exempt } else { - let actual_data_len = data_len as u64 + ACCOUNT_STORAGE_OVERHEAD; - let lamports_per_year = self.lamports_per_byte_year * actual_data_len; - RentDue::Paying((lamports_per_year as f64 * years_elapsed) as u64) + RentDue::Paying(self.due_amount(data_len, years_elapsed)) } } + /// rent due for account that is known to be not exempt + pub fn due_amount(&self, data_len: usize, years_elapsed: f64) -> u64 { + let actual_data_len = data_len as u64 + ACCOUNT_STORAGE_OVERHEAD; + let lamports_per_year = self.lamports_per_byte_year * actual_data_len; + (lamports_per_year as f64 * years_elapsed) as u64 + } + pub fn free() -> Self { Self { lamports_per_byte_year: 0,