7
7
solana_program:: { borsh:: try_from_slice_unchecked, program_pack:: Pack , pubkey:: Pubkey , stake} ,
8
8
solana_program_test:: * ,
9
9
solana_sdk:: {
10
+ stake:: state:: { Authorized , Lockup , StakeState } ,
10
11
signature:: { Keypair , Signer } ,
11
12
system_instruction,
12
13
transaction:: Transaction ,
13
14
} ,
14
15
spl_stake_pool:: {
15
- find_transient_stake_program_address, id, instruction,
16
+ find_withdraw_authority_program_address , find_transient_stake_program_address, id, instruction,
16
17
state:: { StakePool , StakeStatus , ValidatorList } ,
17
18
MAX_VALIDATORS_TO_UPDATE , MINIMUM_ACTIVE_STAKE , MINIMUM_RESERVE_LAMPORTS ,
18
19
} ,
@@ -163,7 +164,7 @@ async fn success() {
163
164
164
165
// Check current balance in the list
165
166
let rent = context. banks_client . get_rent ( ) . await . unwrap ( ) ;
166
- let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < stake :: state :: StakeState > ( ) ) ;
167
+ let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < StakeState > ( ) ) ;
167
168
// initially, have all of the deposits plus their rent, and the reserve stake
168
169
let initial_lamports =
169
170
( validator_lamports + stake_rent) * num_validators as u64 + reserve_lamports;
@@ -436,7 +437,7 @@ async fn merge_into_validator_stake() {
436
437
437
438
// Check validator stake accounts have the expected balance now:
438
439
// validator stake account minimum + deposited lamports + rents + increased lamports
439
- let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < stake :: state :: StakeState > ( ) ) ;
440
+ let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < StakeState > ( ) ) ;
440
441
let expected_lamports = MINIMUM_ACTIVE_STAKE
441
442
+ lamports
442
443
+ reserve_lamports / stake_accounts. len ( ) as u64
@@ -466,7 +467,7 @@ async fn merge_transient_stake_after_remove() {
466
467
setup ( 1 ) . await ;
467
468
468
469
let rent = context. banks_client . get_rent ( ) . await . unwrap ( ) ;
469
- let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < stake :: state :: StakeState > ( ) ) ;
470
+ let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < StakeState > ( ) ) ;
470
471
let deactivated_lamports = lamports;
471
472
let new_authority = Pubkey :: new_unique ( ) ;
472
473
let destination_stake = Keypair :: new ( ) ;
@@ -677,20 +678,33 @@ async fn success_with_burned_tokens() {
677
678
}
678
679
679
680
#[ tokio:: test]
680
- async fn success_ignoring_hijacked_transient_stake ( ) {
681
+ async fn success_ignoring_hijacked_transient_stake_with_authorized ( ) {
682
+ let hijacker = Pubkey :: new_unique ( ) ;
683
+ check_ignored_hijacked_transient_stake ( Some ( & Authorized :: auto ( & hijacker) ) , None ) . await ;
684
+ }
685
+
686
+ #[ tokio:: test]
687
+ async fn success_ignoring_hijacked_transient_stake_with_lockup ( ) {
688
+ let hijacker = Pubkey :: new_unique ( ) ;
689
+ check_ignored_hijacked_transient_stake ( None , Some ( & Lockup { custodian : hijacker, ..Lockup :: default ( ) } ) ) . await ;
690
+ }
691
+
692
+ async fn check_ignored_hijacked_transient_stake ( hijack_authorized : Option < & Authorized > , hijack_lockup : Option < & Lockup > ) {
681
693
let num_validators = 1 ;
682
694
let ( mut context, stake_pool_accounts, stake_accounts, _, lamports, _, mut slot) =
683
695
setup ( num_validators) . await ;
684
696
685
697
let rent = context. banks_client . get_rent ( ) . await . unwrap ( ) ;
686
- let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < stake :: state :: StakeState > ( ) ) ;
698
+ let stake_rent = rent. minimum_balance ( std:: mem:: size_of :: < StakeState > ( ) ) ;
687
699
688
700
let pre_lamports = get_validator_list_sum (
689
701
& mut context. banks_client ,
690
702
& stake_pool_accounts. reserve_stake . pubkey ( ) ,
691
703
& stake_pool_accounts. validator_list . pubkey ( ) ,
692
704
)
693
705
. await ;
706
+ let ( withdraw_authority, _) =
707
+ find_withdraw_authority_program_address ( & id ( ) , & stake_pool_accounts. stake_pool . pubkey ( ) ) ;
694
708
695
709
println ! ( "Decrease from all validators" ) ;
696
710
let stake_account = & stake_accounts[ 0 ] ;
@@ -716,7 +730,6 @@ async fn success_ignoring_hijacked_transient_stake() {
716
730
let validator_list = stake_pool_accounts
717
731
. get_validator_list ( & mut context. banks_client )
718
732
. await ;
719
- let hijacker = Pubkey :: new_unique ( ) ;
720
733
let transient_stake_address = find_transient_stake_program_address (
721
734
& id ( ) ,
722
735
& stake_account. vote . pubkey ( ) ,
@@ -744,11 +757,8 @@ async fn success_ignoring_hijacked_transient_stake() {
744
757
) ,
745
758
stake:: instruction:: initialize (
746
759
& transient_stake_address,
747
- & stake:: state:: Authorized {
748
- staker : hijacker,
749
- withdrawer : hijacker,
750
- } ,
751
- & stake:: state:: Lockup :: default ( ) ,
760
+ & hijack_authorized. unwrap_or ( & Authorized :: auto ( & withdraw_authority) ) ,
761
+ & hijack_lockup. unwrap_or ( & Lockup :: default ( ) ) ,
752
762
) ,
753
763
instruction:: update_stake_pool_balance (
754
764
& id ( ) ,
0 commit comments