From df38b63aef553e5d5dd36ace05ca04738728eb0f Mon Sep 17 00:00:00 2001 From: febo Date: Wed, 27 Aug 2025 21:48:01 +0100 Subject: [PATCH 1/4] Simplify math --- p-token/src/processor/close_account.rs | 5 +---- p-token/src/processor/shared/burn.rs | 3 +-- p-token/src/processor/withdraw_excess_lamports.rs | 7 +++---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/p-token/src/processor/close_account.rs b/p-token/src/processor/close_account.rs index 2156a6c5..ef6e04f4 100644 --- a/p-token/src/processor/close_account.rs +++ b/p-token/src/processor/close_account.rs @@ -44,14 +44,11 @@ pub fn process_close_account(accounts: &[AccountInfo]) -> ProgramResult { } } - let destination_starting_lamports = destination_account_info.lamports(); // SAFETY: single mutable borrow to `destination_account_info` lamports and // there are no "active" borrows of `source_account_info` account data. unsafe { // Moves the lamports to the destination account. - *destination_account_info.borrow_mut_lamports_unchecked() = destination_starting_lamports - .checked_add(source_account_info.lamports()) - .ok_or(TokenError::Overflow)?; + *destination_account_info.borrow_mut_lamports_unchecked() += source_account_info.lamports(); // Closes the source account. source_account_info.close_unchecked(); } diff --git a/p-token/src/processor/shared/burn.rs b/p-token/src/processor/shared/burn.rs index b4375ec6..811682bc 100644 --- a/p-token/src/processor/shared/burn.rs +++ b/p-token/src/processor/shared/burn.rs @@ -83,8 +83,7 @@ pub fn process_burn( source_account.set_amount(updated_source_amount); // Note: The amount of a token account is always within the range of the // mint supply (`u64`). - let mint_supply = mint.supply().checked_sub(amount).unwrap(); - mint.set_supply(mint_supply); + mint.set_supply(mint.supply() - amount); } Ok(()) diff --git a/p-token/src/processor/withdraw_excess_lamports.rs b/p-token/src/processor/withdraw_excess_lamports.rs index 0ee7dfc3..014ea273 100644 --- a/p-token/src/processor/withdraw_excess_lamports.rs +++ b/p-token/src/processor/withdraw_excess_lamports.rs @@ -86,13 +86,12 @@ pub fn process_withdraw_excess_lamports(accounts: &[AccountInfo]) -> ProgramResu source_starting_lamports - transfer_amount; } - let destination_starting_lamports = destination_info.lamports(); // SAFETY: single mutable borrow to `destination_info` lamports. unsafe { // Moves the lamports to the destination account. - *destination_info.borrow_mut_lamports_unchecked() = destination_starting_lamports - .checked_add(transfer_amount) - .ok_or(TokenError::Overflow)?; + // + // Note: The total lamports supply is bound to `u64::MAX`. + *destination_info.borrow_mut_lamports_unchecked() += transfer_amount; } Ok(()) From dd866674a4b1e44a879227e9d2e310a401a5b419 Mon Sep 17 00:00:00 2001 From: febo Date: Wed, 27 Aug 2025 22:01:39 +0100 Subject: [PATCH 2/4] Lint --- p-token/src/processor/close_account.rs | 1 + p-token/src/processor/shared/burn.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/p-token/src/processor/close_account.rs b/p-token/src/processor/close_account.rs index ef6e04f4..184ee4ca 100644 --- a/p-token/src/processor/close_account.rs +++ b/p-token/src/processor/close_account.rs @@ -11,6 +11,7 @@ use { }; #[inline(always)] +#[allow(clippy::arithmetic_side_effects)] pub fn process_close_account(accounts: &[AccountInfo]) -> ProgramResult { let [source_account_info, destination_account_info, authority_info, remaining @ ..] = accounts else { diff --git a/p-token/src/processor/shared/burn.rs b/p-token/src/processor/shared/burn.rs index 811682bc..bf25f2ba 100644 --- a/p-token/src/processor/shared/burn.rs +++ b/p-token/src/processor/shared/burn.rs @@ -8,6 +8,7 @@ use { }; #[inline(always)] +#[allow(clippy::arithmetic_side_effects)] pub fn process_burn( accounts: &[AccountInfo], amount: u64, From 9e62a06035edcb87b06b22b4b808c9465b967ef1 Mon Sep 17 00:00:00 2001 From: febo Date: Thu, 28 Aug 2025 00:46:50 +0100 Subject: [PATCH 3/4] Add note --- p-token/src/processor/close_account.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/p-token/src/processor/close_account.rs b/p-token/src/processor/close_account.rs index 184ee4ca..00f5e5a3 100644 --- a/p-token/src/processor/close_account.rs +++ b/p-token/src/processor/close_account.rs @@ -49,6 +49,8 @@ pub fn process_close_account(accounts: &[AccountInfo]) -> ProgramResult { // there are no "active" borrows of `source_account_info` account data. unsafe { // Moves the lamports to the destination account. + // + // Note: The total lamports supply is bound to `u64::MAX`. *destination_account_info.borrow_mut_lamports_unchecked() += source_account_info.lamports(); // Closes the source account. source_account_info.close_unchecked(); From 3405adb0cdcd31580599c6ffd060da1c6f653f1c Mon Sep 17 00:00:00 2001 From: febo Date: Sat, 13 Sep 2025 00:50:32 +0100 Subject: [PATCH 4/4] Update note --- p-token/src/processor/close_account.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/p-token/src/processor/close_account.rs b/p-token/src/processor/close_account.rs index 00f5e5a3..4e3c3512 100644 --- a/p-token/src/processor/close_account.rs +++ b/p-token/src/processor/close_account.rs @@ -50,7 +50,9 @@ pub fn process_close_account(accounts: &[AccountInfo]) -> ProgramResult { unsafe { // Moves the lamports to the destination account. // - // Note: The total lamports supply is bound to `u64::MAX`. + // Note: This is safe since the runtime checks for balanced instructions + // before and after each CPI and instruction, and the total lamports + // supply is bound to `u64::MAX`. *destination_account_info.borrow_mut_lamports_unchecked() += source_account_info.lamports(); // Closes the source account. source_account_info.close_unchecked();