Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor rent_due for normal case of exempt #23350

Merged
merged 1 commit into from
Feb 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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