From 77af662ac656f0ddb9114a525f8b693a04476d61 Mon Sep 17 00:00:00 2001 From: jonesmarvin8 <83104039+jonesmarvin8@users.noreply.github.com> Date: Wed, 24 Jun 2026 13:33:51 -0400 Subject: [PATCH] fix: reject public transactions with empty account_ids (#552) Closes #513 --- .../src/public_transaction/transaction.rs | 15 +++++++++++++++ lee/state_machine/src/validated_state_diff.rs | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/lee/state_machine/src/public_transaction/transaction.rs b/lee/state_machine/src/public_transaction/transaction.rs index 1d1fee0d..d382d458 100644 --- a/lee/state_machine/src/public_transaction/transaction.rs +++ b/lee/state_machine/src/public_transaction/transaction.rs @@ -242,6 +242,21 @@ pub mod tests { assert!(matches!(result, Err(LeeError::InvalidInput(_)))); } + #[test] + fn empty_transaction_is_rejected() { + let state = state_for_tests(); + let message = Message::new_preserialized( + Program::authenticated_transfer_program().id(), + vec![], + vec![], + vec![0; 4], + ); + let witness_set = WitnessSet::from_raw_parts(vec![]); + let tx = PublicTransaction::new(message, witness_set); + let result = ValidatedStateDiff::from_public_transaction(&tx, &state, 1, 0); + assert!(matches!(result, Err(LeeError::InvalidInput(_)))); + } + #[test] fn program_id_must_belong_to_bulitin_program_ids() { let (key1, key2, addr1, addr2) = keys_for_tests(); diff --git a/lee/state_machine/src/validated_state_diff.rs b/lee/state_machine/src/validated_state_diff.rs index 0d71d485..3a3ff760 100644 --- a/lee/state_machine/src/validated_state_diff.rs +++ b/lee/state_machine/src/validated_state_diff.rs @@ -49,6 +49,11 @@ impl ValidatedStateDiff { let message = tx.message(); let witness_set = tx.witness_set(); + ensure!( + !message.account_ids.is_empty(), + LeeError::InvalidInput("Public transaction must have at least one account".into()) + ); + // All account_ids must be different ensure!( message.account_ids.iter().collect::>().len() == message.account_ids.len(),