diff --git a/magicblock-aperture/src/requests/http/simulate_transaction.rs b/magicblock-aperture/src/requests/http/simulate_transaction.rs index c5fdf9b28..c797a3772 100644 --- a/magicblock-aperture/src/requests/http/simulate_transaction.rs +++ b/magicblock-aperture/src/requests/http/simulate_transaction.rs @@ -70,20 +70,24 @@ impl HttpDispatcher { } .into() }; - let result = RpcSimulateTransactionResult { - err: result.result.err(), - logs: result.logs, - accounts: None, - units_consumed: Some(result.units_consumed), - return_data: result.return_data.map(Into::into), - inner_instructions: result + + let inner_instructions = config.inner_instructions.then(|| { + result .inner_instructions .into_iter() .flatten() .enumerate() .map(converter) .collect::>() - .into(), + }); + + let result = RpcSimulateTransactionResult { + err: result.result.err(), + logs: result.logs, + accounts: None, + units_consumed: Some(result.units_consumed), + return_data: result.return_data.map(Into::into), + inner_instructions, replacement_blockhash, }; diff --git a/magicblock-api/src/magic_validator.rs b/magicblock-api/src/magic_validator.rs index f418dd405..4cc41fa63 100644 --- a/magicblock-api/src/magic_validator.rs +++ b/magicblock-api/src/magic_validator.rs @@ -283,6 +283,11 @@ impl MagicValidator { account_update_tx: validator_channels.account_update, environment: build_svm_env(&accountsdb, latest_block.blockhash, 0), tasks_tx: validator_channels.tasks_service, + is_auto_airdrop_lamports_enabled: config + .accounts + .clone + .auto_airdrop_lamports + > 0, }; txn_scheduler_state .load_upgradeable_programs(&programs_to_load(&config.programs)) diff --git a/magicblock-processor/src/executor/mod.rs b/magicblock-processor/src/executor/mod.rs index 3aa47ef1b..e8e511c17 100644 --- a/magicblock-processor/src/executor/mod.rs +++ b/magicblock-processor/src/executor/mod.rs @@ -57,6 +57,8 @@ pub(super) struct TransactionExecutor { /// A read lock held during a slot's processing to synchronize with critical global /// operations like `AccountsDb` snapshots. sync: StWLock, + /// True when auto airdrop for fee payers is enabled (auto_airdrop_lamports > 0). + pub is_auto_airdrop_lamports_enabled: bool, } impl TransactionExecutor { @@ -103,6 +105,8 @@ impl TransactionExecutor { accounts_tx: state.account_update_tx.clone(), transaction_tx: state.transaction_status_tx.clone(), tasks_tx: state.tasks_tx.clone(), + is_auto_airdrop_lamports_enabled: state + .is_auto_airdrop_lamports_enabled, }; this.processor.fill_missing_sysvar_cache_entries(&this); diff --git a/magicblock-processor/src/executor/processing.rs b/magicblock-processor/src/executor/processing.rs index c1e6a9ce2..0be6a6040 100644 --- a/magicblock-processor/src/executor/processing.rs +++ b/magicblock-processor/src/executor/processing.rs @@ -198,8 +198,15 @@ impl super::TransactionExecutor { }) .unwrap_or(false); - if undelegated_feepayer_was_modified { - result = Err(TransactionError::InvalidAccountForFee); + if undelegated_feepayer_was_modified + && !self.is_auto_airdrop_lamports_enabled + { + if let Ok(ProcessedTransaction::Executed(ref mut executed)) = + &mut result + { + executed.execution_details.status = + Err(TransactionError::InvalidAccountForFee) + } } } (result, output.balances) diff --git a/magicblock-processor/src/scheduler/state.rs b/magicblock-processor/src/scheduler/state.rs index bed813087..dc58f20bf 100644 --- a/magicblock-processor/src/scheduler/state.rs +++ b/magicblock-processor/src/scheduler/state.rs @@ -44,6 +44,8 @@ pub struct TransactionSchedulerState { pub transaction_status_tx: TransactionStatusTx, /// A channel to send scheduled (crank) tasks created by transactions. pub tasks_tx: ScheduledTasksTx, + /// True when auto airdrop for fee payers is enabled. + pub is_auto_airdrop_lamports_enabled: bool, } impl TransactionSchedulerState { diff --git a/test-kit/src/lib.rs b/test-kit/src/lib.rs index d9dbd1d81..e7057feee 100644 --- a/test-kit/src/lib.rs +++ b/test-kit/src/lib.rs @@ -132,6 +132,7 @@ impl ExecutionTestEnv { txn_to_process_rx: validator_channels.transaction_to_process, tasks_tx: validator_channels.tasks_service, environment, + is_auto_airdrop_lamports_enabled: false, }; // Load test program