@@ -143,14 +143,6 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
143143 ] ,
144144 & ctx. program_id ,
145145 ) ;
146- let ( spender_b_auth_pda, _) = Pubkey :: find_program_address (
147- & [
148- b"authority" ,
149- wallet_pda. as_ref ( ) ,
150- Signer :: pubkey ( & spender_keypair) . as_ref ( ) ,
151- ] ,
152- & ctx. program_id ,
153- ) ;
154146
155147 // Add Spender (by Owner)
156148 let mut add_spender_data = vec ! [ 1 ] ; // AddAuthority
@@ -163,14 +155,14 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
163155 let add_spender_ix = Instruction {
164156 program_id : ctx. program_id . to_address ( ) ,
165157 accounts : vec ! [
166- AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
167- AccountMeta :: new( owner_auth_pda. to_address( ) , false ) , // auth
168- AccountMeta :: new( spender_b_auth_pda. to_address( ) , false ) , // target
169- AccountMeta :: new( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) , // signer
170158 AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) ,
159+ AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
160+ AccountMeta :: new_readonly( owner_auth_pda. to_address( ) , false ) , // auth
161+ AccountMeta :: new( spender_auth_pda. to_address( ) , false ) , // target
171162 AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) ,
163+ AccountMeta :: new_readonly( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) , // signer
172164 ] ,
173- data : vec ! [ 1 , 2 ] , // AddAuthority(Spender)
165+ data : add_spender_data ,
174166 } ;
175167
176168 let message = Message :: new (
@@ -204,14 +196,14 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
204196 let malicious_ix = Instruction {
205197 program_id : ctx. program_id . to_address ( ) ,
206198 accounts : vec ! [
207- AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
208- AccountMeta :: new( spender_b_auth_pda. to_address( ) , false ) , // Spender auth
209- AccountMeta :: new( owner_auth_pda. to_address( ) , false ) , // Target (Owner)
210- AccountMeta :: new( Signer :: pubkey( & spender_keypair) . to_address( ) , true ) , // Signer
211199 AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) ,
200+ AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
201+ AccountMeta :: new_readonly( spender_auth_pda. to_address( ) , false ) , // Spender auth
202+ AccountMeta :: new( bad_admin_pda. to_address( ) , false ) , // Target (Bad admin)
212203 AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) ,
204+ AccountMeta :: new_readonly( Signer :: pubkey( & spender_keypair) . to_address( ) , true ) , // Signer
213205 ] ,
214- data : vec ! [ 1 , 2 ] , // Try to add Spender (doesn't matter, auth check fails first)
206+ data : malicious_add ,
215207 } ;
216208
217209 let message = Message :: new (
@@ -236,40 +228,28 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
236228 ] ,
237229 & ctx. program_id ,
238230 ) ;
239- let ( session_auth_pda, _) = Pubkey :: find_program_address (
240- & [
241- b"authority" ,
242- wallet_pda. as_ref ( ) ,
243- session_keypair. pubkey ( ) . as_ref ( ) ,
244- ] ,
245- & ctx. program_id ,
246- ) ;
247- // Use previously initialized clock
248- // let clock: solana_clock::Clock = ctx.svm.get_sysvar(); // Already initialized
249- // Re-get it to be safe if svm advanced
231+ // Use slot-based expiry
250232 let clock: solana_clock:: Clock = ctx. svm . get_sysvar ( ) ;
251- let now = clock. unix_timestamp as u64 ;
233+ let current_slot = clock. slot ;
234+ let expires_at = current_slot + 50 ; // Expires in 50 slots
252235
253- let mut session_create_data = vec ! [ 5 ] ; // CreateSession
254- session_create_data. extend_from_slice ( session_keypair. pubkey ( ) . as_ref ( ) ) ;
255- session_create_data. extend_from_slice ( & 0u64 . to_le_bytes ( ) ) ; // Expires at 0 (Genesis)
236+ let mut session_data = Vec :: new ( ) ;
237+ session_data. push ( 5 ) ; // CreateSession
238+ session_data. extend_from_slice ( session_keypair. pubkey ( ) . as_ref ( ) ) ;
239+ session_data. extend_from_slice ( & expires_at. to_le_bytes ( ) ) ;
256240
257241 let create_session_ix = Instruction {
258242 program_id : ctx. program_id . to_address ( ) ,
259243 accounts : vec ! [
260- AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
261- AccountMeta :: new( owner_auth_pda. to_address( ) , false ) ,
262- AccountMeta :: new( session_auth_pda. to_address( ) , false ) ,
263- AccountMeta :: new( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) ,
264244 AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) ,
245+ AccountMeta :: new_readonly( wallet_pda. to_address( ) , false ) ,
246+ AccountMeta :: new_readonly( owner_auth_pda. to_address( ) , false ) ,
247+ AccountMeta :: new( session_pda. to_address( ) , false ) ,
265248 AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) ,
266249 AccountMeta :: new_readonly( solana_sysvar:: rent:: ID . to_address( ) , false ) ,
250+ AccountMeta :: new_readonly( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) ,
267251 ] ,
268- data : [
269- vec ! [ 1 , 3 ] , // AddAuthority(Session)
270- ( now - 100 ) . to_le_bytes ( ) . to_vec ( ) , // Expires in past
271- ]
272- . concat ( ) ,
252+ data : session_data,
273253 } ;
274254
275255 let message = Message :: new (
@@ -281,16 +261,22 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
281261
282262 ctx. execute_tx ( create_session_tx) ?;
283263
264+ // Warp to future slot to expire session
265+ ctx. warp_to_slot ( current_slot + 100 ) ;
266+
284267 // Try to Execute with Expired Session
268+ let mut exec_payload = vec ! [ 4 ] ; // Execute
269+ exec_payload. push ( 0 ) ; // Empty compact instructions
285270 let exec_expired_ix = Instruction {
286271 program_id : ctx. program_id . to_address ( ) ,
287272 accounts : vec ! [
288- AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
289- AccountMeta :: new( session_auth_pda. to_address( ) , false ) ,
290- AccountMeta :: new( Signer :: pubkey( & session_keypair) . to_address( ) , true ) ,
291- AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) , // target to invoke (system)
273+ AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) , // Payer
274+ AccountMeta :: new( wallet_pda. to_address( ) , false ) , // Wallet
275+ AccountMeta :: new( session_pda. to_address( ) , false ) , // Authority (Session PDA)
276+ AccountMeta :: new( vault_pda. to_address( ) , false ) , // Vault
277+ AccountMeta :: new_readonly( Signer :: pubkey( & session_keypair) . to_address( ) , true ) , // Session Signer
292278 ] ,
293- data : vec ! [ 3 , 0 ] , // Execute payload (empty for test)
279+ data : exec_payload ,
294280 } ;
295281
296282 let message = Message :: new (
@@ -327,14 +313,14 @@ pub fn run(ctx: &mut TestContext) -> Result<()> {
327313 let add_admin_ix = Instruction {
328314 program_id : ctx. program_id . to_address ( ) ,
329315 accounts : vec ! [
330- AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
331- AccountMeta :: new( owner_auth_pda. to_address( ) , false ) , // auth
332- AccountMeta :: new( admin_auth_pda. to_address( ) , false ) , // target
333- AccountMeta :: new( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) , // signer
334316 AccountMeta :: new( Signer :: pubkey( & ctx. payer) . to_address( ) , true ) ,
317+ AccountMeta :: new( wallet_pda. to_address( ) , false ) ,
318+ AccountMeta :: new_readonly( owner_auth_pda. to_address( ) , false ) , // auth
319+ AccountMeta :: new( admin_auth_pda. to_address( ) , false ) , // target
335320 AccountMeta :: new_readonly( solana_system_program:: id( ) . to_address( ) , false ) ,
321+ AccountMeta :: new_readonly( Signer :: pubkey( & owner_keypair) . to_address( ) , true ) , // signer
336322 ] ,
337- data : vec ! [ 1 , 1 ] , // AddAuthority(Admin)
323+ data : add_admin_data ,
338324 } ;
339325
340326 let message = Message :: new (
0 commit comments