|
1 | | -use crate::account_loader::AccountsBalances; |
| 1 | +use crate::account_loader::{AccountsBalances, LoadedTransactionAccount}; |
2 | 2 | use crate::escrow::ephemeral_balance_pda_from_payer; |
3 | 3 | #[cfg(feature = "dev-context-only-utils")] |
4 | 4 | use qualifier_attr::{field_qualifiers, qualifiers}; |
@@ -608,27 +608,32 @@ impl<FG: ForkGraph> TransactionBatchProcessor<FG> { |
608 | 608 |
|
609 | 609 | let mut fee_payer_address = *message.fee_payer(); |
610 | 610 |
|
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); |
618 | 612 |
|
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; |
621 | 633 | acc |
622 | 634 | } 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); |
632 | 637 | } |
633 | 638 | }; |
634 | 639 |
|
|
0 commit comments