Skip to content

Commit

Permalink
refactor rent_due for normal case of exempt (#23350)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffwashington authored Feb 28, 2022
1 parent ee3fc39 commit 611d745
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 15 deletions.
31 changes: 19 additions & 12 deletions runtime/src/rent_collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
11 changes: 8 additions & 3 deletions sdk/program/src/rent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 611d745

Please sign in to comment.