Skip to content

Commit 1a844ef

Browse files
committed
fix: allow not delegated fee_payer if fees = 0
1 parent 33af2bb commit 1a844ef

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

src/transaction_processor.rs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::account_loader::AccountsBalances;
1+
use crate::account_loader::{AccountsBalances, LoadedTransactionAccount};
22
use crate::escrow::ephemeral_balance_pda_from_payer;
33
#[cfg(feature = "dev-context-only-utils")]
44
use qualifier_attr::{field_qualifiers, qualifiers};
@@ -608,27 +608,32 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> {
608608

609609
let mut fee_payer_address = *message.fee_payer();
610610

611-
let mut loaded_fee_payer = {
612-
// Load an account only if it exists *and* is delegated or privileged.
613-
let mut load_if_delegated_or_privileged = |addr: &Pubkey| {
614-
account_loader
615-
.load_account(addr, true)
616-
.filter(|acc| acc.account.delegated() || acc.account.privileged())
617-
};
611+
let initial_loaded = account_loader.load_account(&fee_payer_address, true);
618612

619-
// 1) Prefer the fee payer if delegated
620-
if let Some(acc) = load_if_delegated_or_privileged(&fee_payer_address) {
613+
// zero-fee: short-circuit with an empty account, no delegation required, only if the account doesn't exist
614+
let mut loaded_fee_payer = if fee_lamports_per_signature == 0 && initial_loaded.is_none() {
615+
LoadedTransactionAccount {
616+
account: AccountSharedData::default(),
617+
loaded_size: 0,
618+
rent_collected: 0,
619+
}
620+
} else if let Some(acc) =
621+
initial_loaded.filter(|acc| acc.account.delegated() || acc.account.privileged())
622+
{
623+
// prefer the fee payer if delegated/privileged
624+
acc
625+
} else {
626+
// otherwise require escrow to exist and be delegated/privileged
627+
let escrow_address = ephemeral_balance_pda_from_payer(&fee_payer_address);
628+
if let Some(acc) = account_loader
629+
.load_account(&escrow_address, true)
630+
.filter(|acc| acc.account.delegated() || acc.account.privileged())
631+
{
632+
fee_payer_address = escrow_address;
621633
acc
622634
} else {
623-
// 2) Otherwise require escrow to exist and be delegated
624-
let escrow_address = ephemeral_balance_pda_from_payer(&fee_payer_address);
625-
if let Some(acc) = load_if_delegated_or_privileged(&escrow_address) {
626-
fee_payer_address = escrow_address;
627-
acc
628-
} else {
629-
error_counters.invalid_account_for_fee += 1;
630-
return Err(TransactionError::InvalidAccountForFee);
631-
}
635+
error_counters.invalid_account_for_fee += 1;
636+
return Err(TransactionError::InvalidAccountForFee);
632637
}
633638
};
634639

0 commit comments

Comments
 (0)