@@ -360,5 +360,56 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
360360 ctx. execute_tx_expect_error ( remove_owner_tx) ?;
361361 println ! ( "✅ Admin Removing Owner Rejected." ) ;
362362
363+ // Scenario 6: Wallet Discriminator Check (Issue #7)
364+ // Attempt to use an Authority PDA (owned by program, but wrong discriminator) as the Wallet PDA
365+ println ! ( "\n [6/6] Testing Wallet Discriminator Validation..." ) ;
366+
367+ // We will try to call CreateSession using the Owner Authority PDA as the "Wallet PDA"
368+ // The Owner Authority PDA is owned by the program, so it passes the owner check.
369+ // However, it has Discriminator::Authority (2), not Wallet (1), so it should fail the new check.
370+
371+ let fake_wallet_pda = owner_auth_pda; // This is actually an Authority account
372+
373+ let bad_session_keypair = Keypair :: new ( ) ;
374+ let ( bad_session_pda, _) = Pubkey :: find_program_address (
375+ & [
376+ b"session" ,
377+ fake_wallet_pda. as_ref ( ) , // Derived from the "fake" wallet
378+ bad_session_keypair. pubkey ( ) . as_ref ( ) ,
379+ ] ,
380+ & ctx. program_id ,
381+ ) ;
382+
383+ let mut bad_session_data = Vec :: new ( ) ;
384+ bad_session_data. push ( 5 ) ; // CreateSession
385+ bad_session_data. extend_from_slice ( bad_session_keypair. pubkey ( ) . as_ref ( ) ) ;
386+ bad_session_data. extend_from_slice ( & ( current_slot + 100 ) . to_le_bytes ( ) ) ;
387+
388+ let bad_discriminator_ix = Instruction {
389+ program_id : ctx. program_id . to_address ( ) ,
390+ accounts : vec ! [
391+ AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) ,
392+ AccountMeta :: new_readonly( fake_wallet_pda. to_address( ) , false ) , // FAKE WALLET (Authority Account)
393+ AccountMeta :: new_readonly( owner_auth_pda. to_address( ) , false ) , // Authorizer (Using same account as auth is technically weird but valid for this test)
394+ AccountMeta :: new( bad_session_pda. to_address( ) , false ) ,
395+ AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) ,
396+ AccountMeta :: new_readonly( solana_sysvar:: rent:: ID . to_address( ) , false ) ,
397+ AccountMeta :: new_readonly( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) ,
398+ ] ,
399+ data : bad_session_data,
400+ } ;
401+
402+ let message = Message :: new (
403+ & [ bad_discriminator_ix] ,
404+ Some ( & Signer :: pubkey ( & ctx. payer ) . to_address ( ) ) ,
405+ ) ;
406+ let mut bad_disc_tx = Transaction :: new_unsigned ( message) ;
407+ bad_disc_tx. sign ( & [ & ctx. payer , & owner_keypair] , ctx. svm . latest_blockhash ( ) ) ;
408+
409+ // Expect InvalidAccountData (which is often generic error or custom depending on implementation)
410+ // Our fix returns InvalidAccountData
411+ ctx. execute_tx_expect_error ( bad_disc_tx) ?;
412+ println ! ( "✅ Invalid Wallet Discriminator Rejected." ) ;
413+
363414 Ok ( ( ) )
364415}
0 commit comments