|
4 | 4 | use { |
5 | 5 | crate::get_account, |
6 | 6 | bincode::deserialize, |
| 7 | + solana_account::AccountSharedData, |
7 | 8 | solana_hash::Hash, |
8 | 9 | solana_keypair::Keypair, |
9 | 10 | solana_native_token::LAMPORTS_PER_SOL, |
10 | 11 | solana_program_test::BanksClient, |
| 12 | + solana_program_test::ProgramTestContext, |
11 | 13 | solana_pubkey::Pubkey, |
12 | 14 | solana_signer::Signer, |
13 | 15 | solana_stake_interface::{ |
14 | 16 | instruction as stake_instruction, program as stake_program, |
15 | | - state::{Authorized, Lockup, Meta, Stake, StakeStateV2}, |
| 17 | + stake_flags::StakeFlags, |
| 18 | + state::{Authorized, Delegation, Lockup, Meta, Stake, StakeStateV2}, |
16 | 19 | }, |
17 | 20 | solana_system_interface::instruction as system_instruction, |
18 | 21 | solana_transaction::Transaction, |
19 | 22 | std::convert::TryInto, |
20 | 23 | }; |
21 | 24 |
|
22 | 25 | pub const TEST_STAKE_AMOUNT: u64 = 10_000_000_000; // 10 sol |
| 26 | +pub const MANGLED_DELEGATION: u64 = 12345; |
23 | 27 |
|
24 | 28 | pub async fn get_stake_account( |
25 | 29 | banks_client: &mut BanksClient, |
@@ -145,3 +149,31 @@ pub async fn delegate_stake_account( |
145 | 149 | transaction.sign(&[payer, authorized], *recent_blockhash); |
146 | 150 | banks_client.process_transaction(transaction).await.unwrap(); |
147 | 151 | } |
| 152 | + |
| 153 | +pub async fn force_deactivate_stake_account(context: &mut ProgramTestContext, pubkey: &Pubkey) { |
| 154 | + let (meta, stake, _) = get_stake_account(&mut context.banks_client, pubkey).await; |
| 155 | + let delegation = Delegation { |
| 156 | + activation_epoch: 0, |
| 157 | + deactivation_epoch: 0, |
| 158 | + // break anything which erroneously uses this in calculations without redelegating |
| 159 | + stake: MANGLED_DELEGATION, |
| 160 | + ..stake.unwrap().delegation |
| 161 | + }; |
| 162 | + let mut account_data = vec![0; std::mem::size_of::<StakeStateV2>()]; |
| 163 | + bincode::serialize_into( |
| 164 | + &mut account_data[..], |
| 165 | + &StakeStateV2::Stake( |
| 166 | + meta, |
| 167 | + Stake { |
| 168 | + delegation, |
| 169 | + ..stake.unwrap() |
| 170 | + }, |
| 171 | + StakeFlags::empty(), |
| 172 | + ), |
| 173 | + ) |
| 174 | + .unwrap(); |
| 175 | + |
| 176 | + let mut stake_account = get_account(&mut context.banks_client, pubkey).await; |
| 177 | + stake_account.data = account_data; |
| 178 | + context.set_account(pubkey, &AccountSharedData::from(stake_account)); |
| 179 | +} |
0 commit comments