1010 VersionedMessage ,
1111 } ,
1212 solana_pubkey:: Pubkey ,
13- solana_sdk_ids:: system_program,
13+ solana_sdk_ids:: { bpf_loader_upgradeable , system_program} ,
1414 solana_system_interface:: instruction:: SystemInstruction ,
1515 std:: collections:: HashSet ,
1616} ;
@@ -23,6 +23,24 @@ fn test_get_durable_nonce() {
2323 account_keys : Vec < Pubkey > ,
2424 instructions : Vec < CompiledInstruction > ,
2525 loaded_addresses : Option < LoadedAddresses > ,
26+ ) -> SanitizedMessage {
27+ create_message_for_test_with_reserved_keys (
28+ num_signers,
29+ num_writable,
30+ account_keys,
31+ instructions,
32+ loaded_addresses,
33+ & HashSet :: new ( ) ,
34+ )
35+ }
36+
37+ fn create_message_for_test_with_reserved_keys (
38+ num_signers : u8 ,
39+ num_writable : u8 ,
40+ account_keys : Vec < Pubkey > ,
41+ instructions : Vec < CompiledInstruction > ,
42+ loaded_addresses : Option < LoadedAddresses > ,
43+ reserved_account_keys : & HashSet < Pubkey > ,
2644 ) -> SanitizedMessage {
2745 let header = MessageHeader {
2846 num_required_signatures : num_signers,
@@ -64,7 +82,7 @@ fn test_get_durable_nonce() {
6482 SanitizedMessage :: try_new (
6583 SanitizedVersionedMessage :: try_new ( versioned_message) . unwrap ( ) ,
6684 loader,
67- & HashSet :: new ( ) ,
85+ reserved_account_keys ,
6886 )
6987 . unwrap ( )
7088 }
@@ -73,6 +91,7 @@ fn test_get_durable_nonce() {
7391 {
7492 let message = create_message_for_test ( 1 , 1 , vec ! [ Pubkey :: new_unique( ) ] , vec ! [ ] , None ) ;
7593 assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
94+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
7695 }
7796
7897 // system program id instruction - invalid
@@ -85,6 +104,7 @@ fn test_get_durable_nonce() {
85104 None ,
86105 ) ;
87106 assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
107+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
88108 }
89109
90110 // system program id instruction - not nonce
@@ -101,6 +121,7 @@ fn test_get_durable_nonce() {
101121 None ,
102122 ) ;
103123 assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
124+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
104125 }
105126
106127 // system program id - nonce instruction (no accounts)
@@ -117,6 +138,7 @@ fn test_get_durable_nonce() {
117138 None ,
118139 ) ;
119140 assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
141+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
120142 }
121143
122144 // system program id - nonce instruction (non-fee-payer, non-writable)
@@ -135,6 +157,7 @@ fn test_get_durable_nonce() {
135157 None ,
136158 ) ;
137159 assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
160+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
138161 }
139162
140163 // system program id - nonce instruction fee-payer
@@ -152,6 +175,10 @@ fn test_get_durable_nonce() {
152175 None ,
153176 ) ;
154177 assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , Some ( & payer_nonce) ) ;
178+ assert_eq ! (
179+ SVMStaticMessage :: get_durable_nonce_simd602( & message) ,
180+ Some ( & payer_nonce)
181+ ) ;
155182 }
156183
157184 // system program id - nonce instruction w/ trailing bytes fee-payer
@@ -171,6 +198,10 @@ fn test_get_durable_nonce() {
171198 None ,
172199 ) ;
173200 assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , Some ( & payer_nonce) ) ;
201+ assert_eq ! (
202+ SVMStaticMessage :: get_durable_nonce_simd602( & message) ,
203+ Some ( & payer_nonce)
204+ ) ;
174205 }
175206
176207 // system program id - nonce instruction (non-fee-payer)
@@ -189,6 +220,10 @@ fn test_get_durable_nonce() {
189220 None ,
190221 ) ;
191222 assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , Some ( & nonce) ) ;
223+ assert_eq ! (
224+ SVMStaticMessage :: get_durable_nonce_simd602( & message) ,
225+ Some ( & nonce)
226+ ) ;
192227 }
193228
194229 // system program id - nonce instruction (non-fee-payer, multiple accounts)
@@ -208,6 +243,10 @@ fn test_get_durable_nonce() {
208243 None ,
209244 ) ;
210245 assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , Some ( & nonce) ) ;
246+ assert_eq ! (
247+ SVMStaticMessage :: get_durable_nonce_simd602( & message) ,
248+ Some ( & nonce)
249+ ) ;
211250 }
212251
213252 // system program id - nonce instruction (non-fee-payer, loaded account)
@@ -229,6 +268,73 @@ fn test_get_durable_nonce() {
229268 } ) ,
230269 ) ;
231270 assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , None ) ;
271+ assert_eq ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) , None ) ;
272+ }
273+
274+ // system program id - nonce instruction (nonce is program id, write-demoted)
275+ {
276+ let payer = Pubkey :: new_unique ( ) ;
277+ let nonce = Pubkey :: new_unique ( ) ;
278+ let message = create_message_for_test (
279+ 1 ,
280+ 2 ,
281+ vec ! [ payer, nonce, system_program:: id( ) ] ,
282+ vec ! [
283+ CompiledInstruction :: new( 2 , & SystemInstruction :: AdvanceNonceAccount , vec![ 1 ] ) ,
284+ CompiledInstruction :: new_from_raw_parts( 1 , vec![ ] , vec![ ] ) ,
285+ ] ,
286+ None ,
287+ ) ;
288+ assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
289+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
290+ }
291+
292+ // system program id - nonce instruction (nonce is program id, upgradeable loader present)
293+ // pre-simd602 relies on write demotion, which the loader disables; simd602 rejects outright
294+ {
295+ let payer = Pubkey :: new_unique ( ) ;
296+ let nonce = Pubkey :: new_unique ( ) ;
297+ let message = create_message_for_test (
298+ 1 ,
299+ 2 ,
300+ vec ! [
301+ payer,
302+ nonce,
303+ system_program:: id( ) ,
304+ bpf_loader_upgradeable:: id( ) ,
305+ ] ,
306+ vec ! [
307+ CompiledInstruction :: new( 2 , & SystemInstruction :: AdvanceNonceAccount , vec![ 1 ] ) ,
308+ CompiledInstruction :: new_from_raw_parts( 1 , vec![ ] , vec![ ] ) ,
309+ ] ,
310+ None ,
311+ ) ;
312+ assert_eq ! ( SVMMessage :: get_durable_nonce( & message) , Some ( & nonce) ) ;
313+ assert ! ( SVMStaticMessage :: get_durable_nonce_simd602( & message) . is_none( ) ) ;
314+ }
315+
316+ // system program id - nonce instruction (nonce is reserved key)
317+ // pre-simd602 applies reserved key demotion; simd602 does not
318+ {
319+ let payer = Pubkey :: new_unique ( ) ;
320+ let nonce = Pubkey :: new_unique ( ) ;
321+ let message = create_message_for_test_with_reserved_keys (
322+ 1 ,
323+ 2 ,
324+ vec ! [ payer, nonce, system_program:: id( ) ] ,
325+ vec ! [ CompiledInstruction :: new(
326+ 2 ,
327+ & SystemInstruction :: AdvanceNonceAccount ,
328+ vec![ 1 ] ,
329+ ) ] ,
330+ None ,
331+ & HashSet :: from ( [ nonce] ) ,
332+ ) ;
333+ assert ! ( SVMMessage :: get_durable_nonce( & message) . is_none( ) ) ;
334+ assert_eq ! (
335+ SVMStaticMessage :: get_durable_nonce_simd602( & message) ,
336+ Some ( & nonce)
337+ ) ;
232338 }
233339}
234340
0 commit comments