use std::collections::HashSet; use solana_sanitize::Sanitize; use solana_instruction::{AccountMeta, Instruction}; use solana_pubkey::Pubkey; use solana_transaction::{sanitized::SanitizedTransaction, Transaction}; fn sanitize_ixs(ixs: &[Instruction], payer: Option, label: &str) -> Transaction { let tx = Transaction::new_with_payer(ixs, payer.as_ref()); let res = tx.sanitize(); eprintln!("{label:18}: {res:?}"); tx } fn main() { let program = Pubkey::default(); let payer = Pubkey::new_unique(); // No accounts let ix = Instruction::new_with_bytes(program, &[], vec![]); sanitize_ixs(&[ix], None, "Empty Accounts"); // Readonly Payer let payer_meta = AccountMeta::new_readonly(payer, false); let ix = Instruction::new_with_bytes(program, &[], vec![payer_meta]); sanitize_ixs(&[ix], None, "Readonly"); // Readonly signing payer let payer_meta = AccountMeta::new_readonly(payer, true); let ix = Instruction::new_with_bytes(program, &[], vec![payer_meta]); sanitize_ixs(&[ix], None, "Readonly signing"); // Writable Payer let payer_meta = AccountMeta::new(payer, false); let ix = Instruction::new_with_bytes(program, &[], vec![payer_meta]); sanitize_ixs(&[ix], None, "Writable"); // Writable signing payer let payer_meta = AccountMeta::new(payer, true); let ix = Instruction::new_with_bytes(program, &[], vec![payer_meta]); let tx = sanitize_ixs(&[ix], None, "Writable signing"); let sanitized = SanitizedTransaction::try_from_legacy_transaction(tx.clone(), &HashSet::new()); eprintln!(" : {sanitized:#?}"); // Explicit payer let ix = Instruction::new_with_bytes(program, &[], vec![]); let tx = sanitize_ixs(&[ix], Some(payer), "Explicit payer"); let sanitized = SanitizedTransaction::try_from_legacy_transaction(tx.clone(), &HashSet::new()); eprintln!(" : {sanitized:#?}"); // Explicit payer used as readonly in ix let payer_meta = AccountMeta::new_readonly(payer, false); let ix = Instruction::new_with_bytes(program, &[], vec![payer_meta]); let tx = sanitize_ixs( &[ix], Some(payer), "Explicit payer included as readonly not signing", ); let sanitized = SanitizedTransaction::try_from_legacy_transaction(tx.clone(), &HashSet::new()); eprintln!(" : {sanitized:#?}"); }